151
Becoming a Better Developer

Becoming a Better Developer. Things I have learned

Embed Size (px)

Citation preview

Page 1: Becoming a Better Developer. Things I have learned

Becoming a Better

Developer

Page 2: Becoming a Better Developer. Things I have learned

Things I have learned...

Page 3: Becoming a Better Developer. Things I have learned

... that has made me to a better developer ...

Page 4: Becoming a Better Developer. Things I have learned

... than I was before I learned them

Page 5: Becoming a Better Developer. Things I have learned

Johannes Brodwall

Page 6: Becoming a Better Developer. Things I have learned

Lead Software Architect, BBS

Page 7: Becoming a Better Developer. Things I have learned

Organizer, Oslo XP Meetup

Page 8: Becoming a Better Developer. Things I have learned

Board-member, Oslo Agile UG

Page 9: Becoming a Better Developer. Things I have learned

Committee member, ROOTS conference

Page 11: Becoming a Better Developer. Things I have learned

Experience Report

Page 12: Becoming a Better Developer. Things I have learned

Things I have learned...

Page 13: Becoming a Better Developer. Things I have learned

... that has made me to a better developer ...

Page 14: Becoming a Better Developer. Things I have learned

... than I was before I learned them

Page 15: Becoming a Better Developer. Things I have learned

(2)

Page 16: Becoming a Better Developer. Things I have learned

Be brief

Page 17: Becoming a Better Developer. Things I have learned

"I would have written a shorter letter but I didn't have the time.“- Mark Twain

Page 18: Becoming a Better Developer. Things I have learned

(1)

Page 19: Becoming a Better Developer. Things I have learned

Accept failure

Page 20: Becoming a Better Developer. Things I have learned

(But only settle for perfection)

Page 21: Becoming a Better Developer. Things I have learned

Developer or coder?

Page 22: Becoming a Better Developer. Things I have learned

Coder: A good coder writes good code

Page 23: Becoming a Better Developer. Things I have learned

Programmer: A good programmer is a good coder who thinks well

Page 24: Becoming a Better Developer. Things I have learned

Developer: A good developer is a good

programmer who communicates well

Page 25: Becoming a Better Developer. Things I have learned

The Word: Versatility

Page 26: Becoming a Better Developer. Things I have learned

Define: Versatility

”having a wide variety of skills”

Page 27: Becoming a Better Developer. Things I have learned

Know a lot about somethingAnd something about a lot

Page 28: Becoming a Better Developer. Things I have learned

(3)

Page 29: Becoming a Better Developer. Things I have learned

In-depth knowledge

Page 30: Becoming a Better Developer. Things I have learned

Code:

Page 31: Becoming a Better Developer. Things I have learned

public void testFoo() { try { int result = bar.doBar(); assertEquals("should be 0", 0, result);

} catch (BarException e) { fail("illegal exception caught");

} }

Page 32: Becoming a Better Developer. Things I have learned

public void testFoo() throws BarException { int result = bar.doBar(); assertEquals("result", 0, result); }

Page 33: Becoming a Better Developer. Things I have learned

Socket s = null;try { s = new Socket(”server”, 12345);} catch (IOException e) { log.error(”An exception occurred”, e);}

InputStream in = s.getInputStream();

Page 34: Becoming a Better Developer. Things I have learned

Exception Handling

Page 35: Becoming a Better Developer. Things I have learned

Socket s = null;try { s = new Socket("server", 12345);} catch (IOException e) { log.error("An exception occurred", e); throw new CustomException(e);}

InputStream in = s.getInputStream();

Page 36: Becoming a Better Developer. Things I have learned

try { Socket s = new Socket("server", 12345); InputStream in = s.getInputStream();} catch (IOException e) { throw new CustomException(e);}

Page 37: Becoming a Better Developer. Things I have learned

Catch block? Probably bug

Page 38: Becoming a Better Developer. Things I have learned

Johannes’ first rule of exceptions

Page 39: Becoming a Better Developer. Things I have learned

”There is usually nothing you can do”

Page 40: Becoming a Better Developer. Things I have learned

Source controlUnit testing

Continuous Integration

Page 41: Becoming a Better Developer. Things I have learned

What is a task?

Page 42: Becoming a Better Developer. Things I have learned

What is a good task?

Page 43: Becoming a Better Developer. Things I have learned

”How will I know when it is done?”

Page 44: Becoming a Better Developer. Things I have learned

(How about: The tests passes)

Page 45: Becoming a Better Developer. Things I have learned

public void testProcessFile() throws IOException { processor.process(file); assertEquals(StatusCode.PROCESSED,

file.getCurrentStatusCode()); assertEquals("transmissions", 1,

file.getTransmissions().size());

Transmission transmission = file.getTransmissions().iterator().next(); assertEquals(3,

transmission.getTransactions().size()); assertEquals("transactionSum", new Money(7000, Currency.getInstance("NOK")), transmission.getTransactionSum());

Page 46: Becoming a Better Developer. Things I have learned

Code perfection

• From: http://today.java.net/pub/a/today/2006/07/13/lazy-loading-is-easy.html

Page 47: Becoming a Better Developer. Things I have learned

Category category = dao.get(1);Category parent = dao.get(category.getParentId());List children = new ArrayList();for (Long childId : parent.getSubcategoryIds()) { children.add(dao.get(childId));}System.out.println(children);

Page 48: Becoming a Better Developer. Things I have learned

Category category = dao.get(1);System.out.println(category.getParent().getSubcategories());

Page 49: Becoming a Better Developer. Things I have learned

Exploit Defaults

Page 50: Becoming a Better Developer. Things I have learned

<class name="BookCategory" table="book_category"> <id name="id" column="id" access="property"

type="long"> <generator class="native" /> </id>

<property name="name" column="name” insert="true" update="true” access="property" />

<property name="creationYear" column="craton_year" insert="true" update="true" access="property" />

Page 51: Becoming a Better Developer. Things I have learned

No: You are not special

Page 52: Becoming a Better Developer. Things I have learned

<class name="BookCategory" > <id name="id"> <generator class="native"/>

</id>

<property name="name"/> <property name="creationYear"/>

Page 53: Becoming a Better Developer. Things I have learned

No: You are not special

Page 54: Becoming a Better Developer. Things I have learned

This gives tablename: bookcategory

But we wanted:book_category

Page 55: Becoming a Better Developer. Things I have learned

No: You are not special(except when you are)

Page 56: Becoming a Better Developer. Things I have learned

<bean id="hibernateSessionFactory”class=”...LocalSessionFactoryBean">

<...> <property name="namingStrategy” ref="hibernateNamingStrategy"/>

</bean>

<bean id="hibernateNamingStrategy”class=”...ImprovedNamingStrategy"/>

Page 57: Becoming a Better Developer. Things I have learned

No: You are not special

• Sun/Apache/Rod Johnson/DHH/Gavin King is probably smarter than you

Page 58: Becoming a Better Developer. Things I have learned

(4)

Page 59: Becoming a Better Developer. Things I have learned

Don’t overspecialize

Page 60: Becoming a Better Developer. Things I have learned

Specialization is for insects!

Page 61: Becoming a Better Developer. Things I have learned

Learn a different programming language

• Javascript example: http://joelonsoftware.com/

Page 62: Becoming a Better Developer. Things I have learned

function sum(array){ return reduce(array, 0, function(a, b){ return a + b; });

}

Page 63: Becoming a Better Developer. Things I have learned

function sum(array){ return reduce(array, 0, function(a, b){ return a + b; }); }

sum([1, 2, 3, 4, 5]); => 15

Page 64: Becoming a Better Developer. Things I have learned

function sum(array){ return reduce(array, 0, function(a, b){ return a + b; });

}

Page 65: Becoming a Better Developer. Things I have learned

function reduce(array, initial_value, fn) { var result = init; for (i = 0; i < array.length; i++) result = fn( result, array[i] ); return result;}

function sum(array){ return reduce(array, 0, function(a, b){ return a + b; });}

Page 66: Becoming a Better Developer. Things I have learned

Object sum(Collection collection) { return reduce(collection, 0, new BinaryFunction() { public Object doIt(Object a, Object b) {

return (Integer) a + (Integer) b;

} });}

Page 67: Becoming a Better Developer. Things I have learned

Practical use in Java

• Lazy Loading Example: http://today.java.net/pub/a/today/2006/07/13/lazy-loading-is-easy.html

Page 68: Becoming a Better Developer. Things I have learned

Parent getById(final long parentId) { ResultSet rs = ....; Parent parent = transformFromRs(rs); parent.setKids( (Collection)lazyLoad(new LazyLoader() { public Object loadObject() { return kidsByParentId(parentId) } }); return parent;}

Page 69: Becoming a Better Developer. Things I have learned

function getById(parentId) { var rs = ....; var parent = transformFromRs(rs); parent.kids = lazyLoad( function() { return kidsByParent(parentId); }); return parent;}

Page 70: Becoming a Better Developer. Things I have learned

JavaScriptScheme

Ruby

Page 71: Becoming a Better Developer. Things I have learned

Developer or coder?

Page 72: Becoming a Better Developer. Things I have learned

Coder: A good coder writes good code

Page 73: Becoming a Better Developer. Things I have learned

Programmer: A good programmer is a good

coder who thinks

Page 74: Becoming a Better Developer. Things I have learned

(5)

Page 75: Becoming a Better Developer. Things I have learned

See the bigger box

Page 76: Becoming a Better Developer. Things I have learned

”There is no use in trying,” said Alice. ”One cannot

believe impossible things”

Page 77: Becoming a Better Developer. Things I have learned

”I daresay you haven’t had much practice,” said the

queen.

Page 78: Becoming a Better Developer. Things I have learned

”When I was you age, I always did it for half an hour

a day. Why, sometimes, I believed as many as six impossible things before

breakfast”• Lewis Carroll: Through the looking glass

Page 80: Becoming a Better Developer. Things I have learned

Disclaimer: Riddle-solving doesn’t measure

intelligence

Page 81: Becoming a Better Developer. Things I have learned

(My wife solved this one faster than me)

Page 82: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

Page 83: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

• Answer: 10 petals around the rose

Page 84: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

Page 85: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

• Answer: 6 petals around the rose

Page 86: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

                                       

Page 87: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

                                       

• Answer: 0 petals around the rose

Page 88: Becoming a Better Developer. Things I have learned

“The most profound discoveries never begin

with EUREKA!

Usually they start with the words "now that's odd..."

Page 89: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

                                       

Page 90: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

                                       

• Answer: 6 petals around the rose

Page 91: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

                                       

Page 92: Becoming a Better Developer. Things I have learned

How many Petals Around the Rose

                                       

• Answer: 2 petals around the rose

Page 94: Becoming a Better Developer. Things I have learned

Ask ”why”

Page 95: Becoming a Better Developer. Things I have learned

Why are we doing this?

Page 96: Becoming a Better Developer. Things I have learned

• Why are you writing ”pay for order” functionality?– Because it is needed for the user to pay for the ticket

order service

• Why are we writing the ticket order service?– Because it is our project mandate to deliver an online

ticket system

• Why is an online ticket system our mandate?– Because we believe that with our expertice in

interactive web solutions, we can offer a really good service

Page 97: Becoming a Better Developer. Things I have learned

”Why am I writing this”

Page 98: Becoming a Better Developer. Things I have learned

From: JohannesTo: BjørnSubject: Build server is down

Hi, BjørnThe build server is down.

~Johannes

Page 99: Becoming a Better Developer. Things I have learned

What do you expect the recipient to do?

Page 100: Becoming a Better Developer. Things I have learned

From: JohannesTo: BjørnSubject: FYI: Build server is down

Hi, BjørnFor your info: The build server is down. I am currently investigating and will let you know as soon as I know more.

~Johannes

Page 101: Becoming a Better Developer. Things I have learned

From: JohannesTo: BjørnSubject: Please get the build server up again

Hi, BjørnThe build server is down. Can you get it fixed?

~Johannes

Page 102: Becoming a Better Developer. Things I have learned

Communications is

Page 103: Becoming a Better Developer. Things I have learned

Communications is not explaining

Page 104: Becoming a Better Developer. Things I have learned

Communication is creating a shared

understanding

Page 105: Becoming a Better Developer. Things I have learned

(6)

Page 106: Becoming a Better Developer. Things I have learned

Coupling

Page 107: Becoming a Better Developer. Things I have learned

Secret to good design:Avoid bad coupling

Exploit good coupling

Page 108: Becoming a Better Developer. Things I have learned

”Two things are coupled if change to one requires

change to the other”

Page 109: Becoming a Better Developer. Things I have learned

Avoiding bad coupling

Page 110: Becoming a Better Developer. Things I have learned

Programming by intention

Page 111: Becoming a Better Developer. Things I have learned

public void testCategoryIsStoredCorrectly() { Category category = new Category("category

name", 1999); category.addSubcategory(new Category("foo")); category.addSubcategory(new Category("bar"));

Object id = dao.save(category); dao.flushCache();

Category copy = dao.get(id); assertNotSame(copy, category); assertAllFieldsEquals(copy, category);}

Page 112: Becoming a Better Developer. Things I have learned

(Hiding details)

Page 113: Becoming a Better Developer. Things I have learned

public void testSearchForNameAndCreationYear() { Collection expected = new HashSet();

storeMatching(new Category("magic 1",1999), expected, dao);

storeNonMatching(new Category(”non-magic 2",2000), dao);

CategorySpecification specification = ...;

Collection actual = dao.find(specification); assertCollectionHasSameElements(”find " +

specification, expected, actual);}

Page 114: Becoming a Better Developer. Things I have learned

Avoiding repetition

Page 115: Becoming a Better Developer. Things I have learned

Comments repeating codeCode duplication

Duplicated decisions

Page 116: Becoming a Better Developer. Things I have learned

<class name="BookCategory" table="book_category">

<id name="id" column="id"> <generator class="native" /> </id>

<property name="name” column=”name" /> <property name="creationYear" column="creation_year" />

Page 117: Becoming a Better Developer. Things I have learned

(7)

Page 118: Becoming a Better Developer. Things I have learned

Haste != Productivity

Page 119: Becoming a Better Developer. Things I have learned

Johannes’ only rule for crisis management

Page 120: Becoming a Better Developer. Things I have learned

Don’t just do something

Stand there!

Page 121: Becoming a Better Developer. Things I have learned

Productivity = Getting Things Done

Page 122: Becoming a Better Developer. Things I have learned

What is a good task?

Page 123: Becoming a Better Developer. Things I have learned

”How will I know when it is done?”

Page 124: Becoming a Better Developer. Things I have learned

”How will someone else know when it is done?”

Page 125: Becoming a Better Developer. Things I have learned

Tip: Offload your task list from your brain

Page 126: Becoming a Better Developer. Things I have learned

Yellow notesOutlook: Flags and Tasks

Gmail: Inbox

Page 127: Becoming a Better Developer. Things I have learned

Tip: Do it now, Do it soon,

Defer it, Delegate it, or Drop it

Page 128: Becoming a Better Developer. Things I have learned

The Art of the Two-Minute Email

Page 129: Becoming a Better Developer. Things I have learned

Follow up on what you defer and delegate

Page 130: Becoming a Better Developer. Things I have learned

(8)

Page 131: Becoming a Better Developer. Things I have learned

Myopia (nearsightedness):the inability to see distant objects

as clearly as near objects.

Page 132: Becoming a Better Developer. Things I have learned

Myopia is good for your health

Page 133: Becoming a Better Developer. Things I have learned

Implement for today

Page 134: Becoming a Better Developer. Things I have learned

Not for tomorrow

Page 135: Becoming a Better Developer. Things I have learned

”We have to write this as a web service in case

someone someday want to integrate with us”

Page 136: Becoming a Better Developer. Things I have learned

Enterprisey!

Page 137: Becoming a Better Developer. Things I have learned

Not for yesterday

Page 139: Becoming a Better Developer. Things I have learned

” This class was written by some earlier (Alex?) to manage the indexing of something (maybe). It is probably

important. Don't delete. I don't think it's used anywhere - at least not in the new

MacroINdexer module which may actually replace what it was used for.”

• Credit: AntiPatterns

Page 140: Becoming a Better Developer. Things I have learned

(9)

Page 141: Becoming a Better Developer. Things I have learned

Leave proud

Page 142: Becoming a Better Developer. Things I have learned

/** TODO: Write a better comment. * @param foo * @return */ public boolean checkIt(String foo) { StringBuffer buffer = new StringBuffer(); buffer.append(foo); buffer.append("@"); if (getStuff().startsWith(buffer.toString())) { return true; } else if (!getStuff().startsWith(buffer.toString())) { return false; } else { return false; } } }

Page 143: Becoming a Better Developer. Things I have learned

/** TODO: Write a better comment. * @param foo * @return */ public boolean checkIt(String foo) { StringBuffer buffer = new StringBuffer(); buffer.append(foo); buffer.append("@"); if (getStuff().startsWith(buffer.toString())) { return true; } else if (!getStuff().startsWith(buffer.toString())) { return false; } else { return false; } } }

TODO comments

Skeleton javadoc

Premature (and unneeded)

optimization

Very common verbositis

Common unthinking

Page 144: Becoming a Better Developer. Things I have learned

public boolean isUsernameEqual( String username) { return getEmailAddress(). startsWith(username + "@");}

Page 145: Becoming a Better Developer. Things I have learned

(2)

Page 146: Becoming a Better Developer. Things I have learned

Be brief

Page 147: Becoming a Better Developer. Things I have learned

”Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.”(Antoine de Saint-Exupery)

Page 148: Becoming a Better Developer. Things I have learned

(1)

Page 149: Becoming a Better Developer. Things I have learned

Accept failure

Page 150: Becoming a Better Developer. Things I have learned

"Knowing the pathis not the same as walking

the path”- Tao te Ching

Page 151: Becoming a Better Developer. Things I have learned

Summary

1. Accept failure2. Be brief3. In-depth knowledge4. Don’t overspecialize5. See the bigger box6. Eliminate bad coupling7. Don’t just do something, stand there8. Work for today9. Leave proud