productive programmer tutorial(neal ford)

209
ThoughtWorks ThoughtWorks NEAL FORD software architect / meme wrangler ThoughtWorks [email protected] 3003 Summit Boulevard, Atlanta, GA 30319 www.nealford.com www.thoughtworks.com memeagora.blogspot.com the productive programmer

Upload: muhammadammar

Post on 07-Apr-2015

132 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Productive Programmer Tutorial(Neal Ford)

ThoughtWorksThoughtWorks

NEAL FORD software architect / meme wrangler

ThoughtWorks

[email protected] 3003 Summit Boulevard, Atlanta, GA 30319

www.nealford.com

www.thoughtworks.com

memeagora.blogspot.com

the productive programmer

Page 2: Productive Programmer Tutorial(Neal Ford)

where did this topic come from?

?

Page 3: Productive Programmer Tutorial(Neal Ford)

where did this topic come from?

Page 4: Productive Programmer Tutorial(Neal Ford)

where did this topic come from?

Page 5: Productive Programmer Tutorial(Neal Ford)

automationkilling distractions

canonicalityapplying the dry principle

getting your computer to work harder

focusdoing stuff faster

acceleration

part 1: mechanics

Page 6: Productive Programmer Tutorial(Neal Ford)

acceleration

Page 7: Productive Programmer Tutorial(Neal Ford)

typing is faster than navigation

Page 8: Productive Programmer Tutorial(Neal Ford)

firefox

windows explorer address bar (alt-d)

finder (apple-shift-g)

number-fox plugin

/ searching

o/s accelerators

Page 9: Productive Programmer Tutorial(Neal Ford)

leopard smart help X

Page 10: Productive Programmer Tutorial(Neal Ford)

iClip ($$)

why do operating systems have only 1 clipboard with 1 entry????

clcl

jump cut

clipboards

X

Page 11: Productive Programmer Tutorial(Neal Ford)

mac os x : jumpcut demo

Page 12: Productive Programmer Tutorial(Neal Ford)

context switching eats time

Page 13: Productive Programmer Tutorial(Neal Ford)

pushd pushes a directory on the stack

popd pops it back off

there and back

C:\temp>pushd \MyDocuments\Documents\dev\haskell

C:\MyDocuments\Documents\dev\haskell>dir02/13/2006 12:12 AM <DIR> .02/13/2006 12:12 AM <DIR> ..02/13/2006 12:12 AM <DIR> nfjs_functionallangs_haskell 0 File(s) 0 bytes 3 Dir(s) 11,743,178,752 bytes free

C:\MyDocuments\Documents\dev\haskell>popd

Page 14: Productive Programmer Tutorial(Neal Ford)

pushd/popd

Page 15: Productive Programmer Tutorial(Neal Ford)

command prompt here power toy

graphical explorers better for some things....

...command line better for others

bash here (cygwin)

command prompts

Page 16: Productive Programmer Tutorial(Neal Ford)

cmd prompt explorer bar

Page 17: Productive Programmer Tutorial(Neal Ford)

path finder X

Page 18: Productive Programmer Tutorial(Neal Ford)

how many of you have written an application for heads-down data entry

personnel?

Page 19: Productive Programmer Tutorial(Neal Ford)

when coding, always prefer keyboard to mouse

Page 20: Productive Programmer Tutorial(Neal Ford)

pair programmer

make yourself use the shortcut even if you’ve gotten there another way

have someone/something pester you about it

mousefeed for eclipse

key promoter plug-in for intellij

learning shortcuts

Page 21: Productive Programmer Tutorial(Neal Ford)
Page 22: Productive Programmer Tutorial(Neal Ford)

repeat them to yourself

flash cards

learning shortcuts

create a “cheat sheet”

Page 23: Productive Programmer Tutorial(Neal Ford)

all our hierarchies are too deep: file system packages

Page 24: Productive Programmer Tutorial(Neal Ford)

goto class

Page 25: Productive Programmer Tutorial(Neal Ford)

goto class: pattern of capital letters

Page 26: Productive Programmer Tutorial(Neal Ford)

goto symbol

Page 27: Productive Programmer Tutorial(Neal Ford)

introduce variable

Page 28: Productive Programmer Tutorial(Neal Ford)

introduce variable redux

Page 29: Productive Programmer Tutorial(Neal Ford)

escalating selection

Page 30: Productive Programmer Tutorial(Neal Ford)

some choice shortcuts

intelliJ eclipse

goto class ctrl-n ctrl-shift-t

introduce variable ctrl-alt-v alt-shift-lescalating selection ctrl-w alt-shift-uprecently edited files ctrl-e n/a (ctrl-e)symbol list alt-ctrl-shift-n ctrl-oincremental search alt-f3 ctrl-j

Page 31: Productive Programmer Tutorial(Neal Ford)

learn the language of your template engine

all major ide’s and coding text editors

parameter substitution, default values, repeating values

bash for textmate/e editor

velocity in intellij

live templates

Page 32: Productive Programmer Tutorial(Neal Ford)

intellij

templates

Page 33: Productive Programmer Tutorial(Neal Ford)

every time you type something for the 3rd time,

templatize it

Page 34: Productive Programmer Tutorial(Neal Ford)

textexpander

live templates at the o/s level

auto-hot key

typinator

key macro tools

X

Page 35: Productive Programmer Tutorial(Neal Ford)

textexpander

Page 36: Productive Programmer Tutorial(Neal Ford)

don’t type the same commands over and over

Page 37: Productive Programmer Tutorial(Neal Ford)

focus

Page 38: Productive Programmer Tutorial(Neal Ford)

...sitting immediately in front of you

get a comfortable chair!

dual monitors...

good keyboard

administrator privilege for the o/s

simple stuff

Page 39: Productive Programmer Tutorial(Neal Ford)

how many people here work in cube land?

modern office environments are terrible for knowledge workers

too much out of context noise

insidious distractions

Page 40: Productive Programmer Tutorial(Neal Ford)

war rooms

Page 41: Productive Programmer Tutorial(Neal Ford)

in flow, michael csikszentmihalyi describes flow state

in the humane interface, jef raskin describes locus of attention

anything that happens outside your locus of attention breaks flow

time disappears

total concentration

locus of attention

Page 42: Productive Programmer Tutorial(Neal Ford)
Page 43: Productive Programmer Tutorial(Neal Ford)

killing balloon tips

Page 44: Productive Programmer Tutorial(Neal Ford)

automatically makes your background dark after a set time

jedi concentrate

doodim

screen dimmers

X

Page 45: Productive Programmer Tutorial(Neal Ford)

internet blockers

http://getconcentrating.com/X

http://www.gyrolabs.com/2006/09/25/jediconcentrate-mod/

Page 46: Productive Programmer Tutorial(Neal Ford)

the higher the level of concentration, the denser

the ideas

Page 47: Productive Programmer Tutorial(Neal Ford)

turn off instant messaging

turn off notifications

don’t keep email open

create office “quiet time”

put on headphones

the easy stuff

Page 48: Productive Programmer Tutorial(Neal Ford)

this is not the solution!Puma Productivity

Pants™

Page 49: Productive Programmer Tutorial(Neal Ford)

focus techniques

Page 50: Productive Programmer Tutorial(Neal Ford)

package/namespace

all developer hierarchies are too deep

file system

what worked well with 20 mb hard drives fails with 200 gb

documentation

search > navigation

Page 51: Productive Programmer Tutorial(Neal Ford)

google desktop search

built into modern operating systems

retro-fittable in older ones

larry’s “any text file” indexer

desktop search

Page 52: Productive Programmer Tutorial(Neal Ford)
Page 53: Productive Programmer Tutorial(Neal Ford)

replace file hierarchy navigation with search

Page 54: Productive Programmer Tutorial(Neal Ford)

rooted view == project explorer

specialized explorer view

especially good for directory-based version control

C:\WINDOWS\explorer.exe /e,/root,c:\work\project

create a shortcut:

rooted views

Page 55: Productive Programmer Tutorial(Neal Ford)
Page 56: Productive Programmer Tutorial(Neal Ford)
Page 57: Productive Programmer Tutorial(Neal Ford)

virtual desktop manager power toy

spaces (in leopard)

use virtual desktops

X

http://virtuawin.sourceforge.net/

Page 58: Productive Programmer Tutorial(Neal Ford)
Page 59: Productive Programmer Tutorial(Neal Ford)

canonicality

Page 60: Productive Programmer Tutorial(Neal Ford)

DRY says that every piece of system knowledge should have one authoritative, unambiguous representation. Every piece of knowledge in the development of something should have a

single representation. A system's knowledge is far broader than just its code. It refers to database schemas, test plans, the build

system, even documentation. the pragmatic programmer - andy hunt, dave thomas

Page 61: Productive Programmer Tutorial(Neal Ford)

decide on the canonical representation

object-relational mapping is one of the most common dry violations

database schema + xml configuration + pojo > 1

generate the others

dry o/r

Page 62: Productive Programmer Tutorial(Neal Ford)

the scenario

DDL

<xml>

<entity>

...

</entity>

</xml>

class Person {

int id;

double salary;

. . .

}

where’s the information?

Page 63: Productive Programmer Tutorial(Neal Ford)

canonical representation

DDL

<xml>

<entity>

...

</entity>

</xml>

class Person {

int id;

double salary;

. . .

}

Page 64: Productive Programmer Tutorial(Neal Ford)

the target

Page 65: Productive Programmer Tutorial(Neal Ford)

build event sql map

Page 66: Productive Programmer Tutorial(Neal Ford)
Page 67: Productive Programmer Tutorial(Neal Ford)
Page 68: Productive Programmer Tutorial(Neal Ford)

generated sql map

Page 69: Productive Programmer Tutorial(Neal Ford)

step 2: class builder

Page 70: Productive Programmer Tutorial(Neal Ford)
Page 71: Productive Programmer Tutorial(Neal Ford)
Page 72: Productive Programmer Tutorial(Neal Ford)
Page 73: Productive Programmer Tutorial(Neal Ford)
Page 74: Productive Programmer Tutorial(Neal Ford)

canonical representation

DDL

<xml>

<entity>

...

</entity>

</xml>

class Person {

int id;

double salary;

. . .

}

Page 75: Productive Programmer Tutorial(Neal Ford)

dry documentation

Page 76: Productive Programmer Tutorial(Neal Ford)

dry diagrams

Page 77: Productive Programmer Tutorial(Neal Ford)

open source schema diagrammer

the requirement: entity-relationship diagrams for each iteration

schemaspy

generates acceptable html

written in java

dry schemas

Page 78: Productive Programmer Tutorial(Neal Ford)

dry schemas

Page 79: Productive Programmer Tutorial(Neal Ford)

automation

Page 80: Productive Programmer Tutorial(Neal Ford)

version control (!)

one-command build

continuous integration

documentation

obvious automatables

Page 81: Productive Programmer Tutorial(Neal Ford)

subverting other tools

Page 82: Productive Programmer Tutorial(Neal Ford)

allows you to automate debugging “wizard”-style web applications

open source tool for user acceptance testing of web applications

includes a side-project called selenium ide

...but it never is!

you always think “this is the last time”...

selenium

Page 83: Productive Programmer Tutorial(Neal Ford)
Page 84: Productive Programmer Tutorial(Neal Ford)
Page 85: Productive Programmer Tutorial(Neal Ford)
Page 86: Productive Programmer Tutorial(Neal Ford)
Page 87: Productive Programmer Tutorial(Neal Ford)
Page 88: Productive Programmer Tutorial(Neal Ford)

selenium defines an interaction api for web applications

record your interaction the 1st time you walk through the page

literally cuts hours off debugging time

have your q/a department record bug discoveries

automated interaction

Page 89: Productive Programmer Tutorial(Neal Ford)

don’t spend time doing by hand what you can automate

Page 90: Productive Programmer Tutorial(Neal Ford)

build your own tools

Page 91: Productive Programmer Tutorial(Neal Ford)

build shims & jigs

you almost never do anything just once

work like a craftsman, not a laborer

...but you build assets

building a tool takes a little longer than brute force...

Page 92: Productive Programmer Tutorial(Neal Ford)

adding new files to subversion repository

tortoise (on windows), but with limits

bash-fu

Page 93: Productive Programmer Tutorial(Neal Ford)

svnAddNewsvn st | grep '^\?' | tr '^\?' ' ' | sed 's/ [ ]*//' | sed 's/[ ]/\\ /g' | xargs svn add

svn st get svn status (new files start with “?”)

grep '^\?' find all new files

tr '^\?' ' ' translate the “?” into a space

sed 's/[ ]*//' substitute spaces to nothing

sed 's/[ ]/\\ /g' escape embedded spaces

xargs svn add pipe the improved arguments into svn

Page 94: Productive Programmer Tutorial(Neal Ford)

by hand?!?

the problem: 2 gb of log files / week

need to know the count of each exception type

automate with a bash script

more bash-fu

Page 95: Productive Programmer Tutorial(Neal Ford)

get counts of each exception

get all exception types from log file sort them

get unique list

Page 96: Productive Programmer Tutorial(Neal Ford)

automating com

Page 97: Productive Programmer Tutorial(Neal Ford)

use a real language for scripting

examples in lots of different languages/tools

which one do I use for this problem?

scripting rationale

Page 98: Productive Programmer Tutorial(Neal Ford)

“we can do it by hand in 10 minutes...”

the problem: split a 38,000 line sql file into 1000 line chunks

each chunk must be syntactically correct

after 50 minutes:

automate instead

sql splitter

Page 99: Productive Programmer Tutorial(Neal Ford)
Page 100: Productive Programmer Tutorial(Neal Ford)

it “accidentally” became an important part of our project

it took us 5 times longer to automate it

we’ve had to do it numerous times since

...so that we could write unit tests

using a real language allowed us to refactor it...

time spent automating

Page 101: Productive Programmer Tutorial(Neal Ford)
Page 102: Productive Programmer Tutorial(Neal Ford)

if you start by treating it as a 1st class problem, you’ll build better solutions

allow throw-aways to grow into assets

allows unit testing, refactoring, ide support

using real languages

Page 103: Productive Programmer Tutorial(Neal Ford)

squanders focus

solving problems by hand makes you dumber

steals concentration

figure out clever ways to solve problems

automating makes you smarter

time savings

Page 104: Productive Programmer Tutorial(Neal Ford)

justifying automation

Page 105: Productive Programmer Tutorial(Neal Ford)

decide if you want to go forward

set a reasonable time to see if it’s possible

evaluate at the end of the box

or abandon the effort

or create another time box

timebox

Page 106: Productive Programmer Tutorial(Neal Ford)

automation is about

how long does it take now X # of times we must do it?

what are the consequences of doing it wrong 1 time?

risk mitigation

time savings

analyze the r.o.i.

Page 107: Productive Programmer Tutorial(Neal Ford)

don’t shave yaks!

Page 108: Productive Programmer Tutorial(Neal Ford)

end of part 1:mechanics

next: practice

NEAL FORD software architect / meme wrangler

ThoughtWorks

[email protected] 3003 Summit Boulevard, Atlanta, GA 30319

www.nealford.com

www.thoughtworks.com

memeagora.blogspot.com

Page 109: Productive Programmer Tutorial(Neal Ford)

ThoughtWorks

NEAL FORD software architect / meme wrangler

ThoughtWorks

[email protected] 3003 Summit Boulevard, Atlanta, GA 30319

www.nealford.com

www.thoughtworks.com

memeagora.blogspot.com

10 ways to improve your code

Page 110: Productive Programmer Tutorial(Neal Ford)

composed method

1

Page 111: Productive Programmer Tutorial(Neal Ford)
Page 112: Productive Programmer Tutorial(Neal Ford)

Keep all of the operations in a method at the same level of abstraction.

Divide your program into methods that perform one identifiable task.

This will naturally result in programs with many small methods, each a few lines long.

composed method

Page 113: Productive Programmer Tutorial(Neal Ford)

refactoring to composed method

Page 114: Productive Programmer Tutorial(Neal Ford)
Page 115: Productive Programmer Tutorial(Neal Ford)
Page 116: Productive Programmer Tutorial(Neal Ford)

populate()

getDatabaseConnection()

createResultSet()

addPartToListFromResultSet()

PartDb

populate()

getDatabaseConnection()

createResultSet()

addPartToListFromResultSet()

PartDb

getDatabaseConnection()

BoundaryBase

populate()

createResultSet()

addPartToListFromResultSet()

PartDb

Page 117: Productive Programmer Tutorial(Neal Ford)

populate()

createResultSet()

addPartToListFromResultSet()

PartDb

getDatabaseConnection()

BoundaryBase

populate()

createResultSet()

addPartToListFromResultSet()

PartDb

Page 118: Productive Programmer Tutorial(Neal Ford)

BoundaryBase

PartDb

Page 119: Productive Programmer Tutorial(Neal Ford)

populate()

getSqlForEntity()addPartToListFromResultSet()

PartDb

getDatabaseConnection()

getSqlForEntity()

createResultSet()

BoundaryBase

Page 120: Productive Programmer Tutorial(Neal Ford)
Page 121: Productive Programmer Tutorial(Neal Ford)
Page 122: Productive Programmer Tutorial(Neal Ford)

addEntityToListFromResultSet()

getSqlForEntity()addPartToListFromResultSet()

PartDb

getDatabaseConnection()

getSqlForEntity()

createResultSet()

addEntityToListFromResultSet()

populate()

BoundaryBase

populate()

getSqlForEntity()addPartToListFromResultSet()

PartDb

getDatabaseConnection()

getSqlForEntity()

createResultSet()

BoundaryBase

Page 123: Productive Programmer Tutorial(Neal Ford)

BoundaryBase

Page 124: Productive Programmer Tutorial(Neal Ford)

PartDb

Page 125: Productive Programmer Tutorial(Neal Ford)

large number of very cohesive methods

shorter methods easier to test

method names become documentation

discover reusable assets that you didn’t know were there

benefits of composed method

Page 126: Productive Programmer Tutorial(Neal Ford)

test-driven development

test-driven design2

Page 127: Productive Programmer Tutorial(Neal Ford)

creates consumption awareness

first consumer

think about how the rest of the world uses this class

design benefits of tdd

Page 128: Productive Programmer Tutorial(Neal Ford)

cleaner metrics

forces mocking of dependent objects

naturally creates composed method

design benefits of tdd

Page 129: Productive Programmer Tutorial(Neal Ford)

CustomerCustomer

addOrder()

extroverted object

Order

Page 130: Productive Programmer Tutorial(Neal Ford)

Customer

addOrder(Order o)

Order

introverted object

Page 131: Productive Programmer Tutorial(Neal Ford)

extroverted objects introverted objects

“reach out” to create objects

ad hoc creation

cleaner dependencies

moves object construction to a few simple places

Page 132: Productive Programmer Tutorial(Neal Ford)

static analysis

3

Page 133: Productive Programmer Tutorial(Neal Ford)

byte-code analysis: findbugs

Page 134: Productive Programmer Tutorial(Neal Ford)

bad practiceviolation of recommended & essential coding practice

correctnessprobable bug

dodgyconfusing, anomalous, written poorly

bug categories

Page 135: Productive Programmer Tutorial(Neal Ford)
Page 136: Productive Programmer Tutorial(Neal Ford)
Page 137: Productive Programmer Tutorial(Neal Ford)

source analysis & pmd

Page 138: Productive Programmer Tutorial(Neal Ford)

suboptimal code

possible bugs

dead code

overcomplicated expressions

pmd targets

empty try/catch blocks

unused local variablesparameters

private variables

wasteful string usage

Page 139: Productive Programmer Tutorial(Neal Ford)

running pmd on hibernate (unused

ruleset)

Page 140: Productive Programmer Tutorial(Neal Ford)

cpd

Page 141: Productive Programmer Tutorial(Neal Ford)

good citizenship

4

Page 142: Productive Programmer Tutorial(Neal Ford)

getters & setters != encapsulation

Page 143: Productive Programmer Tutorial(Neal Ford)

“should I unit test my getters & setters?”

knee-jerk creating getters/setters voids encapsulation

create atomic mutators for dependent fields

accessors/mutators

Page 144: Productive Programmer Tutorial(Neal Ford)

shouldn’t have to tdd them

only create getters & setters when you need them for other methods

testing:

as easy upon use as upon creation

they will get code coverage automatically

the new strategy

Page 145: Productive Programmer Tutorial(Neal Ford)

never!

specific contract for how to create valid objects

how often is a blank object valid?

push back on frameworks that require this

don’t provide default constructors for domain objects

constructors

Page 146: Productive Programmer Tutorial(Neal Ford)

static methods

Math.sqrt(25)

Math.sqrt()

Page 147: Productive Programmer Tutorial(Neal Ford)

mixes responsibilities

singleton is bad because:

the object version of global variables

untestable

mixing static + state

singleton

Page 148: Productive Programmer Tutorial(Neal Ford)

testable!

1. create a pojo for the business behavior

simple

also testable

2. create a factory to create the pojo

avoiding singletons

Page 149: Productive Programmer Tutorial(Neal Ford)
Page 150: Productive Programmer Tutorial(Neal Ford)
Page 151: Productive Programmer Tutorial(Neal Ford)
Page 152: Productive Programmer Tutorial(Neal Ford)
Page 153: Productive Programmer Tutorial(Neal Ford)

the worst citizen in the java world...

java.util.Calendar

Page 154: Productive Programmer Tutorial(Neal Ford)

yagni

you ain’t gonna need it5

Page 155: Productive Programmer Tutorial(Neal Ford)

increases software entropy

build the simplest thing that we need right now

don’t indulge in speculative development

leads to frameworks

only saves time if you can guarantee you won’t have to change it later

discourages gold plating

Page 156: Productive Programmer Tutorial(Neal Ford)

a public plea to the java community:

please stop building frameworks!

Page 157: Productive Programmer Tutorial(Neal Ford)
Page 158: Productive Programmer Tutorial(Neal Ford)

This is just what they need!

Page 159: Productive Programmer Tutorial(Neal Ford)
Page 160: Productive Programmer Tutorial(Neal Ford)

a cautionary tale

building a simple framework

Page 161: Productive Programmer Tutorial(Neal Ford)

changeability

anticipatory design

refactorable

rate of change

higherlower

Page 162: Productive Programmer Tutorial(Neal Ford)

corporate code smells

Page 163: Productive Programmer Tutorial(Neal Ford)

6. We have an Architect who reviews all code pre-checkin and decides whether or not to allow it into version control.

7. We can’t use any open source code because our lawyers say we can’t.

8. We use WebSphere because...(I always stop listening at this point)

10. We invented our own web/persistence/messaging/caching framework because none of the existing ones was good enough.

9. We bought the entire tool suite (even though we only needed about 10% of it) because it was cheaper than buying the individual tools.

Page 164: Productive Programmer Tutorial(Neal Ford)

1. There is a reason that WSAD isn’t called WHAPPY.2. The initial estimate must be within 15% of the final cost, the post-analysis estimate must be within 10%, and the post-design estimate must be with 5%3. We don’t have time to write unit tests (we’re spending too much time debugging)

5. The only JavaDoc is the Eclipse message explaining how to change your default JavaDoc template.

4. We keep all of our business logic in stored procedures...for performance reasons.

Page 165: Productive Programmer Tutorial(Neal Ford)

question authority6

Page 166: Productive Programmer Tutorial(Neal Ford)
Page 167: Productive Programmer Tutorial(Neal Ford)

angry monkeys & christmas roasts

Page 168: Productive Programmer Tutorial(Neal Ford)

test namestestUpdateCacheAndVerifyThatItemExists() {

}

test_Update_cache_and_verify_that_item_exists() {

}

Page 169: Productive Programmer Tutorial(Neal Ford)

api’s

Page 170: Productive Programmer Tutorial(Neal Ford)

fluent interfaces

Page 171: Productive Programmer Tutorial(Neal Ford)

what stands in the way?

the javabean specification!

Page 172: Productive Programmer Tutorial(Neal Ford)

harms constructor as specification

forces you to create default constructors

creates bad citizens

can’t use beans for fluent interfaces

setXXX() methods return void

what’s bad about beans?

Page 173: Productive Programmer Tutorial(Neal Ford)

non-intuitive

Page 174: Productive Programmer Tutorial(Neal Ford)
Page 175: Productive Programmer Tutorial(Neal Ford)

pair programming studies

after adjusting, pairs produced code 15% more slowly than individuals...

Page 176: Productive Programmer Tutorial(Neal Ford)

pair programming studies

...with 15% fewer defects

Page 177: Productive Programmer Tutorial(Neal Ford)

slap

7 single level of abstraction principle

Page 178: Productive Programmer Tutorial(Neal Ford)

composed method => slap

keep all lines of code in a method at the same level of abstraction

jumping abstraction layers makes code hard to understand

even if it means single-line methods

refactor to slap

s l a p

Page 179: Productive Programmer Tutorial(Neal Ford)
Page 180: Productive Programmer Tutorial(Neal Ford)
Page 181: Productive Programmer Tutorial(Neal Ford)

polyglot

programming

8

Page 182: Productive Programmer Tutorial(Neal Ford)

leveraging existing platforms with languages

targeted at specific problems and applications

Page 183: Productive Programmer Tutorial(Neal Ford)

why do this?

Page 184: Productive Programmer Tutorial(Neal Ford)

schedule pressure

massively parallel threading

use a functional language: jaskell, scala

jruby on rails, grails

looming problems/opportunities

Page 185: Productive Programmer Tutorial(Neal Ford)

stop banging rocks together & get some work done!

everyday coding

groovy, ruby

face it:

looming problems/opportunities

groovy EBXL™

Page 186: Productive Programmer Tutorial(Neal Ford)

writing more declarative code via dsls

build fluent interfaces

looming problems/opportunities

Page 187: Productive Programmer Tutorial(Neal Ford)

now, language != platform

doesn’t polyglot programming add complexity?

In the past, language == platform

complexity

Page 188: Productive Programmer Tutorial(Neal Ford)
Page 189: Productive Programmer Tutorial(Neal Ford)
Page 190: Productive Programmer Tutorial(Neal Ford)
Page 191: Productive Programmer Tutorial(Neal Ford)

J

Page 192: Productive Programmer Tutorial(Neal Ford)
Page 193: Productive Programmer Tutorial(Neal Ford)

every nuance

9

Page 194: Productive Programmer Tutorial(Neal Ford)

no longer true

reflection

“reflection is slow”

elegant solutions to problems

java’s back alleys

Page 195: Productive Programmer Tutorial(Neal Ford)
Page 196: Productive Programmer Tutorial(Neal Ford)
Page 197: Productive Programmer Tutorial(Neal Ford)
Page 198: Productive Programmer Tutorial(Neal Ford)

regular expressions &

Page 199: Productive Programmer Tutorial(Neal Ford)
Page 200: Productive Programmer Tutorial(Neal Ford)

learn the nuances of java...

...then tell the other people on your project

Page 201: Productive Programmer Tutorial(Neal Ford)

anti-objects

10

Page 202: Productive Programmer Tutorial(Neal Ford)

“The metaphor of objects can go too far by making us try to create objects that are too much inspired by the real world. “

“...an antiobject is a kind of object that appears to essentially do the opposite of what we generally think the object should be doing.”

collaborative diffusion

Page 203: Productive Programmer Tutorial(Neal Ford)
Page 204: Productive Programmer Tutorial(Neal Ford)
Page 205: Productive Programmer Tutorial(Neal Ford)

ThoughtWorks

This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 2.5 License.

http://creativecommons.org/licenses/by-nc-sa/2.5/

questions?

please fill out the session evaluationsslides & samples available at nealford.com

NEAL FORD software architect / meme wrangler

ThoughtWorks

[email protected] 3003 Summit Boulevard, Atlanta, GA 30319

www.nealford.com

www.thoughtworks.com

memeagora.blogspot.com

Page 206: Productive Programmer Tutorial(Neal Ford)

An Initial Investigation of Test Driven Development in Industry - Laurie Williams, Boby Georgehttp://collaboration.csc.ncsu.edu/laurie/Papers/TDDpaperv8.pdf

AntiPatterns Cataloghttp://c2.com/cgi/wiki?AntiPatternsCatalog

The legend of the leaning towerhttp://physicsworld.com/cws/article/print/16806

findbugshttp://findbugs.sourceforge.net/

pmd/cpdhttp://pmd.sourceforge.net/

resources

Page 207: Productive Programmer Tutorial(Neal Ford)

resourcesSmalltalk Best Practice Patterns Kent BeckPrentice Hall PTR (October 13, 1996)ISBN-10: 013476904X

Polyglot Programminghttp://memeagora.blogspot.com/2006/12/polyglot-programming.html

Optical Illusions http://en.wikipedia.org/wiki/Optical_illusion

Collaborative Diffusion: Programming Anti-objects - A Repenninghttp://www.cs.colorado.edu/~ralex/papers/PDF/OOPSLA06antiobjects.pdf

Page 208: Productive Programmer Tutorial(Neal Ford)

resources

http://www.cs.utah.edu/~lwilliam/Papers/ieeeSoftware.PDF

http://collaboration.csc.ncsu.edu/laurie/Papers/XPSardinia.PDF

http://www.xprogramming.com/Practices/PracPairs.html

http://c2.com/cgi/wiki?PairProgramming

pair programming

Page 209: Productive Programmer Tutorial(Neal Ford)

resources

ThoughtWorks

© 2008, Neal Ford

Published by O’Reilly Media

The Productive Programmer

Photos by Candy Ford

ISBN: 978-0-596-51978-0