<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8123542</id><updated>2012-02-16T10:23:18.789-07:00</updated><title type='text'>Ted O'Grady on Agile Development</title><subtitle type='html'>The diary of an Agile team lead. Thoughts I have had about and around my projects that I need to ruminate on.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default?start-index=101&amp;max-results=100'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>231</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8123542.post-3876641775441189836</id><published>2007-08-27T10:21:00.001-06:00</published><updated>2007-08-27T10:21:32.587-06:00</updated><title type='text'>Serendipitous</title><content type='html'>&lt;a href="http://www.flickr.com/photos/ogradyt/1085358535/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1282/1085358535_83f15355d9.jpg" width="334" height="500" alt="Kyra Canoe" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-3876641775441189836?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/3876641775441189836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=3876641775441189836' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/3876641775441189836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/3876641775441189836'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/08/serendipitous.html' title='Serendipitous'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1282/1085358535_83f15355d9_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-7708919301954984690</id><published>2007-08-27T10:07:00.002-06:00</published><updated>2007-08-27T10:08:18.294-06:00</updated><title type='text'>Barn Shadows</title><content type='html'>&lt;a href="http://www.flickr.com/photos/ogradyt/1205186287/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1124/1205186287_e7c6eda3a0.jpg" width="334" height="500" alt="Shadows on the way out" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-7708919301954984690?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/7708919301954984690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=7708919301954984690' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/7708919301954984690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/7708919301954984690'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/08/barn-shadows.html' title='Barn Shadows'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1124/1205186287_e7c6eda3a0_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-2840443450985523572</id><published>2007-08-27T10:07:00.001-06:00</published><updated>2007-08-27T10:09:29.702-06:00</updated><title type='text'>Ghosts in the wood</title><content type='html'>&lt;a href="http://www.flickr.com/photos/ogradyt/1206034366/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1003/1206034366_07809e4acd.jpg" width="372" height="500" alt="Ghosts in the wood" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-2840443450985523572?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/2840443450985523572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=2840443450985523572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/2840443450985523572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/2840443450985523572'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/08/ghosts-in-wood.html' title='Ghosts in the wood'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1003/1206034366_07809e4acd_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-7882507277965421950</id><published>2007-07-27T11:52:00.000-06:00</published><updated>2007-07-27T11:54:12.370-06:00</updated><title type='text'>Art in Calgary Alley</title><content type='html'>&lt;a href="http://www.flickr.com/photos/ogradyt/892620724/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1180/892620724_47135408e3.jpg" width="334" height="500" alt="Purple Head" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-7882507277965421950?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/7882507277965421950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=7882507277965421950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/7882507277965421950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/7882507277965421950'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/07/art-in-calgary-ally.html' title='Art in Calgary Alley'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1180/892620724_47135408e3_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-8108136289371131887</id><published>2007-07-27T11:48:00.000-06:00</published><updated>2007-07-27T11:50:09.917-06:00</updated><title type='text'>Reflected Wealth</title><content type='html'>&lt;a title="Photo Sharing" href="http://www.flickr.com/photos/ogradyt/892020477/"&gt;&lt;img height="500" alt="Reflecting Wealth" src="http://farm2.static.flickr.com/1191/892020477_0b2068ee28.jpg" width="334" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Taken from the south side of the tracks in Calgary&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-8108136289371131887?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/8108136289371131887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=8108136289371131887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/8108136289371131887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/8108136289371131887'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/07/reflected-wealth.html' title='Reflected Wealth'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1191/892020477_0b2068ee28_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-1327312405367611256</id><published>2007-07-10T23:39:00.001-06:00</published><updated>2007-07-10T23:39:34.011-06:00</updated><title type='text'>Relax</title><content type='html'>&lt;a href="http://www.flickr.com/photos/ogradyt/773925891/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1267/773925891_2492a3fdbe.jpg" width="500" height="334" alt="The Guitar Player" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-1327312405367611256?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/1327312405367611256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=1327312405367611256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/1327312405367611256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/1327312405367611256'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/07/relax.html' title='Relax'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1267/773925891_2492a3fdbe_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-6805518939345896336</id><published>2007-07-10T23:36:00.000-06:00</published><updated>2007-07-10T23:37:37.657-06:00</updated><title type='text'>Holidays</title><content type='html'>&lt;a href="http://www.flickr.com/photos/ogradyt/773897641/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1275/773897641_3c414d09f8.jpg" width="500" height="334" alt="Electra" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-6805518939345896336?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/6805518939345896336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=6805518939345896336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/6805518939345896336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/6805518939345896336'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/07/holidays.html' title='Holidays'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1275/773897641_3c414d09f8_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-5412650652165728620</id><published>2007-05-30T21:58:00.001-06:00</published><updated>2007-05-30T22:07:32.186-06:00</updated><title type='text'>Fixing one of the things that bugs me...</title><content type='html'>One of the things that bugs me is how long it can take to set up the infrastructure for a small project. Purchase hardware, install OS, configure OS, CVS, bugzilla, webserver, cruise control, and, oh yeah, backups. Oh crap don't forget security.&lt;br /&gt;&lt;br /&gt;Why do I need to do all this work everytime? True, it's kind of fun to configure this stuff and tweak it to your hearts content, but the installation and setup of it I could really care less about. On alot of small projects I have just seen people go without. "Do we really need cruise control?" "Do we have a security expert?" "Ralph will do it on top of his day job."&lt;br /&gt;&lt;br /&gt;It is simple stuff that shouldn't be a burden on a project. It bugged me.&lt;br /&gt;&lt;br /&gt;Now my partner and I have created &lt;a href="http://itfordevelopers.com"&gt;ITForDevelopers&lt;/a&gt;. You can purchase a virtual server, preconfigured for development. Root access to a full system. Start developing the day your project starts rather than setting up infrastructure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-5412650652165728620?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/5412650652165728620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=5412650652165728620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/5412650652165728620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/5412650652165728620'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/05/fixing-one-of-things-that-bugs-me.html' title='Fixing one of the things that bugs me...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-5170131193491311462</id><published>2007-05-30T21:49:00.001-06:00</published><updated>2007-05-30T21:57:22.727-06:00</updated><title type='text'>Where have I been?</title><content type='html'>Doing too many things.&lt;br /&gt;&lt;br /&gt;I'm PM'ing one project, leading a team on another, and then starting a new product. Learning, Learning and Learning.&lt;br /&gt;&lt;br /&gt;Most importantly, I am heading toward a summer where I have two months off. Not something I've done since high school. I'll be spending it with my family and enjoying the sun and warmth which lasts far too briefly here in the Northern climate. We'll be returning to Ottawa to visit relatives and do some car camping around Alberta.&lt;br /&gt;&lt;br /&gt;No big trip. Just my family. Nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-5170131193491311462?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/5170131193491311462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=5170131193491311462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/5170131193491311462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/5170131193491311462'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2007/05/where-have-i-been.html' title='Where have I been?'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-116206423562700379</id><published>2006-10-28T12:19:00.000-06:00</published><updated>2006-10-28T13:44:21.073-06:00</updated><title type='text'>Which Profiler?</title><content type='html'>Jamie asks:&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;"Ted,What are you guys using for a Profiler? If you have any advice on a profiler&lt;br /&gt;or, more importantly, common areas a profiler flags, I'd love to hear them."&lt;/em&gt;&lt;/blockquote&gt;&lt;br /&gt;Well we use:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;JProfiler &lt;/strong&gt;- for exploratory work (has the problem of dilation)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;com.tedogrady.profiler&lt;/strong&gt; - for precise timings (basically println)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The toplink profiler&lt;/strong&gt; - for understanding the cache and gross database numbers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;tkprof /explain plan&lt;/strong&gt;- for understanding how queries are working in the database&lt;/li&gt;&lt;li&gt;&lt;strong&gt;math and common sense&lt;/strong&gt; - for figuring out how to solve the problem&lt;/li&gt;&lt;/ul&gt;Performancing tuning is a highly empirical thing.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Establish a target time.&lt;/li&gt;&lt;li&gt;Make sure you have a test showing the slowness. Automate it.&lt;/li&gt;&lt;li&gt;Develop Causal Theory&lt;/li&gt;&lt;li&gt;Test Causal Theory&lt;/li&gt;&lt;li&gt;Develop Potential Solution&lt;/li&gt;&lt;li&gt;Experiment with Potential Solution&lt;/li&gt;&lt;li&gt;If 4 doesn't help, go back to 3&lt;/li&gt;&lt;li&gt;Implement Solution&lt;/li&gt;&lt;/ol&gt;&lt;em&gt;JProfiler helps alot with the Causal theory&lt;/em&gt;. You can use it to explore your code as a whole looking for problem areas, testing out theories you may have developed about the code. But, if you are working in a database application, DO NOT BELIEVE EVERYTHING IT TELLS YOU.&lt;br /&gt;&lt;br /&gt;It's lying to you. Remember it slows down your application, but not the database. So, hot spots and the relative timings it tells you are lies where concerned with the database. For example, the current piece I am profiling is spending half the time in the database dealing with foreign keys. The profiler told me my problem was in navigating some hierarchy.&lt;br /&gt;&lt;br /&gt;I use Jprofiler for the following features:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Execution stack trace - shows the order in which things were called&lt;/li&gt;&lt;li&gt;Number of Invocations of a method - really useful (do quick math to see if the numbers make sense)&lt;/li&gt;&lt;li&gt;Percentage time in a method - also really useful&lt;/li&gt;&lt;li&gt;Hot spots - (rank methods by amount of CPU time/calls)&lt;/li&gt;&lt;li&gt;Memory profiler - which objects are sucking back the memory&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I tried the eclipse one about 6 months ago (TpTp) but it choked on simple stuff. Haven't tried it since.&lt;/p&gt;&lt;em&gt;com.tedogrady.profiler implements println with extra special fancy do-dad stuff.&lt;/em&gt; It allows you to verify what your profiler is doing. It lies to you a lot less frequently than JProfiler. It's about 40 lines of source code that I got tired of writing on every project, so its now open source. It is in with my &lt;a href="http://sourceforge.net/projects/toplink-in-mem/"&gt;toplink in memory &lt;/a&gt;stuff, or just email me if you want a copy. Basically, it has a really small overhead to verify what you learned in JProfiler, or if Jprofiler is really lying to you then you can use it as a more painful exploration tool.&lt;br /&gt;&lt;br /&gt;To profile a suspicious method you can do the following:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;Profiler.start("Profiling myMethod()");&lt;br /&gt;this.myMethod()&lt;br /&gt;Profiler.stop("Profiling myMethod()");&lt;br /&gt;Profiler.dump();&lt;/span&gt;&lt;/blockquote&gt;You can put as many starts and stops (each with unique tags) in your code as you want. It'll tell you nice things like the average time, cumulative time, invocation order, blah blah blah. Many of you are thinking map. You'd be right.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;TopLink probably comes with a profiler because of all the people that complain that toplink is slow. &lt;/em&gt;Very smart of them to give you the tools to see where the slowness/idiocy is. The tool usually tells me again how stupid I really am. As an idiot, I frequently forget I'm an idiot. It's part of the condition.&lt;br /&gt;&lt;br /&gt;The command that lets you show sql in toplink is also very useful. Dario has been using it to fine tune the SQL we're throwing at Oracle. It lets you configure all those wacky options in toplink and see what they do to the SQL (just what does batch write or batch read do? Gee, they make things a lot faster).&lt;br /&gt;&lt;br /&gt;&lt;em&gt;tkprof, explain plan, and oracle analyzer are useful when you have to think about the database.&lt;/em&gt; They tell you what the database is doing, like how long a query is taking, or the strategy that the optimizer is using to evluate your query. (Sadly, you do need to understand &lt;em&gt;how &lt;/em&gt;oracle implements things if you want to tune it). asktom.oracle.com has all your answers pre-packaged.&lt;br /&gt;&lt;br /&gt;I haven't gone looking for Oracle analyzer in Oracle 10g, but I've used it in 9i. Basically, it is a way for you to ask the Oracle optimizer what will work best. Rather than you analyzing (guessing) what the best index are for a query, oracle will recommend some. 90% of them are optimal, and some recommendations slow things down. Remember that whole test thingamy.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;math and common sense are the best tools of all. &lt;/em&gt;This would be why you went to school. When you look at the number of invocations, and the time, does it make sense to you? What do the numbers mean? A scrap of paper, a pencil, and some simple multiplication and division can tell you a lot more about what your program is doing than any profiler.&lt;br /&gt;&lt;br /&gt;Just as a side note, I learned most my techniques sitting across the hall from Steve Northover at OTI when he was writing the profiler for OTI/Smalltalk. Thanks Steve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-116206423562700379?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/116206423562700379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=116206423562700379' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/116206423562700379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/116206423562700379'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/10/which-profiler.html' title='Which Profiler?'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-116183339530378233</id><published>2006-10-25T20:58:00.000-06:00</published><updated>2006-10-25T21:37:02.840-06:00</updated><title type='text'>Performance tuning in ernest</title><content type='html'>Up until this point we have been performance tuning for testing. Our users have been testing the application all along, and our goal has been to keep them happy with the performance of the system (not ecstatic).&lt;br /&gt;&lt;br /&gt;Now we are nearing the end of our mamoth, huge, horrifically large project (why did I agree to help run this?) and things are starting to stabilize. We're five months away and seriously testing our system. Data structures and core internal pieces are pretty clear and we can optimize the living crap out of them. And optimize we shall.&lt;br /&gt;&lt;br /&gt;Production accounting has a few unique attributes to it:&lt;br /&gt;&lt;br /&gt;First: If you give us 7 numbers, we can very quickly turn those into 7,000. For example, processing 20 wells results in 72,000 numbers (or allocations) being created. Our biggest customer has 40,000 wells. (144,000,000 allocations per month in the work case - note this is the upper bound). Huh.&lt;br /&gt;&lt;br /&gt;Second: Accountants have four (important) deadlines a month. For one of those deadlines (Oil/NGL Splits) we need to generate all of the data. Best of all the data for all their systems will probably only be available the day before the deadline. Don't ask, the production accounting business is wacky. We will have to be able to do all our allocations in about 12 hours.&lt;br /&gt;&lt;br /&gt;We need to write 3400 numbers (allocations) a second.&lt;br /&gt;&lt;br /&gt;We're out by about a factor of 10 (we do around 300-400/sec on a single Intel CPU box). That is not very far, especially as we are just beginning optimization. Better yet, we can expect between 8 and 32 cores doing the work on the boxes.&lt;br /&gt;&lt;br /&gt;So what did I miss on my envelope?&lt;br /&gt;&lt;br /&gt;We'll have fun, fun, fun 'til daddy takes our profiler away....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-116183339530378233?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/116183339530378233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=116183339530378233' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/116183339530378233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/116183339530378233'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/10/performance-tuning-in-ernest.html' title='Performance tuning in ernest'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115852427371674656</id><published>2006-09-17T14:08:00.000-06:00</published><updated>2006-09-17T14:17:53.726-06:00</updated><title type='text'>Something to try...</title><content type='html'>When I read a book that I think is good, I like to try a few things out of it that you normally wouldn't (Why did you read the book if not to learn something new?)&lt;br /&gt;&lt;br /&gt;I've been reading Peopleware by Demarco &amp; Lister and really enjoying it (it lines up with a lot of the things I've been taught and try to practice). I'd like to try the "Power of Veto". Allowing our teams (development and customer) to state when their portion of the product is ready.&lt;br /&gt;&lt;br /&gt;I think the question to ask is "When will x be ready for production?" where x is contracts, volumetrics or allocations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115852427371674656?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115852427371674656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115852427371674656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115852427371674656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115852427371674656'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/09/something-to-try.html' title='Something to try...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115756401855947292</id><published>2006-09-06T10:46:00.000-06:00</published><updated>2006-09-06T11:33:38.616-06:00</updated><title type='text'>Discovery phase timing</title><content type='html'>&lt;blockquote&gt;"Ted,How soon before production do you think a team should go into a 'discovery'&lt;br /&gt;phase?" - Jamie&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;As soon as possible, preferably at the start of the project. You want to make sure that your product is "production ready" from the day you start.&lt;br /&gt;&lt;br /&gt;The later you wait to start the larger your backlog of bugs and missing features.&lt;br /&gt;&lt;br /&gt;However, my reality has not always allowed discovery to commence with the project. Generally, customers do not want to explore a partially built system, they don't mind testing pieces of it, but have trouble seeing if all the pieces will hang/operate together. Often customers are shared between your project and another, their time constraints do not permit them to explore the application. Quality assurance people are really good at uncovering bugs, but it requires a real user to understand how the application hangs together in their environment.&lt;br /&gt;&lt;br /&gt;There are many mitigation strategies I have used in the past:&lt;br /&gt;&lt;br /&gt;1) &lt;em&gt;Get it into production. &lt;/em&gt;If you have a truly green field application (no predecessor) you might be able to get it into production really early. The bare minimum of function can be useful to the end user. (Teamwave was good at this)&lt;br /&gt;&lt;br /&gt;More often than not, there is an existing application, that does at least some of the same work that the new one will. In this case I try to duplicate the old application and put it into production once it has the same functionality as the old app. The second release is then the new enhancements.&lt;br /&gt;&lt;br /&gt;Arguments I haved faced include: You will not be able to add new functionality as it will be just as brittle as the old app. It is too expensive for us to put it into production so we must add all the new features first. There are not enough features to be useful to a customer.&lt;br /&gt;&lt;br /&gt;2) &lt;em&gt;Get real data into the system early. &lt;/em&gt;As a substitute (or when getting into production is a long way away) this can work really well. Users get to see their data in the system and see what works and what doesn't. The data is meaningful, and having the users work with real life examples brings out all the complexity of real data. (Inform Alberta did this)&lt;br /&gt;&lt;br /&gt;On a previous project we started migration a few months into the project so that data was readily available to the users to test with.  They had lots of complaints, but also lots of learnings about how things worked. We got really good at migration, and did it multiple times over the remainder of the project as new functionality was added.&lt;br /&gt;&lt;br /&gt;Arguments I have faced include: The data is too complex to migrate. We will oversimplify the problem, because the real data doesn't reveal all cases.&lt;br /&gt;&lt;br /&gt;3) &lt;em&gt;Eat your own dogfood&lt;/em&gt;. If you are really lucky, you can use the product as you produce it. Basically, you use your own product as you develop it. (Teamwave and OTI did this). OTI was actually a master of this, we built the Smalltalk language in Smalltalk, using our latest builds. You bet the code became production quality quickly. (I managed to screw up the AIX Smalltalk VM causing it to hang every couple of hours, no one was impressed).&lt;br /&gt;&lt;br /&gt;Arguments I have faced include: We can't use our own product.&lt;br /&gt;&lt;br /&gt;4) &lt;em&gt;Simulated data.&lt;/em&gt; Make up data that you believe demonstrates that the system can handle all of your actual data. The idea is that the business changes rapidly, and meeting only the needs of current production data is not enough, you need to show that the system can handle more general cases.&lt;br /&gt;&lt;br /&gt;This is what we are trying on our current project. It's later that I would like, but the business people are ready.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115756401855947292?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115756401855947292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115756401855947292' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115756401855947292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115756401855947292'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/09/discovery-phase-timing.html' title='Discovery phase timing'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115756089988754881</id><published>2006-09-06T10:36:00.000-06:00</published><updated>2006-09-06T10:41:39.900-06:00</updated><title type='text'>The Mythical Man Month</title><content type='html'>Just reading this classic (far to late in my career). Excellent writing, wish I could write this clearly. He does an excellent job of describing the problems faced on a large project, and then addresses how those problems are solved by a practical waterfall approach, really how all the pieces fit together.&lt;br /&gt;&lt;br /&gt;It would be really interesting to take his book and overlay it with an Agile approach.&lt;br /&gt;&lt;br /&gt;One of the great quotes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"On another project the best engineering manager I ever saw served often as&lt;br /&gt;a giant flywheel, his inertia damping the fluctuations that came from market and&lt;br /&gt;management people"&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115756089988754881?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115756089988754881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115756089988754881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115756089988754881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115756089988754881'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/09/mythical-man-month.html' title='The Mythical Man Month'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115749655019188864</id><published>2006-09-05T16:45:00.000-06:00</published><updated>2006-09-05T16:51:19.253-06:00</updated><title type='text'>Discussion on coupling...</title><content type='html'>This categorized how I try to work:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codebetter.com/blogs/david.hayden/archive/2006/08/26/Over_2D00_Architecting-Via-Pure-Fabrication-and-Indirection-to-Reduce-Coupling.aspx"&gt;http://codebetter.com/blogs/david.hayden/archive/2006/08/26/Over_2D00_Architecting-Via-Pure-Fabrication-and-Indirection-to-Reduce-Coupling.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically, decoupling is important when you need it. If you write objects well (single responsibility, encapsulation) you can decouple quickly through refactoring when demanded by the business or implementation.&lt;br /&gt;&lt;br /&gt;Decoupling has a cost associated with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115749655019188864?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115749655019188864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115749655019188864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115749655019188864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115749655019188864'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/09/discussion-on-coupling.html' title='Discussion on coupling...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115698977001571486</id><published>2006-08-30T20:01:00.000-06:00</published><updated>2006-08-30T20:02:50.030-06:00</updated><title type='text'>Teamwave review?</title><content type='html'>A few years ago I helped write the conference manager portion of this product with a company called teamwave. Interesting to see the review. Happy to see the word robust.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eweek.com/article2/0,1895,2005008,00.asp"&gt;http://www.eweek.com/article2/0,1895,2005008,00.asp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115698977001571486?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115698977001571486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115698977001571486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115698977001571486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115698977001571486'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/08/teamwave-review.html' title='Teamwave review?'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115682117791913460</id><published>2006-08-28T20:55:00.000-06:00</published><updated>2006-08-28T21:12:58.026-06:00</updated><title type='text'>Stepping up to the plate</title><content type='html'>Our teams are redefining the way we work together. As we enter a discovery phase in our project (what bugs remain?, what stories did we miss?) we're asking our teams to adapt and innovate.&lt;br /&gt;&lt;br /&gt;Our goal is simple: Become production ready.&lt;br /&gt;&lt;br /&gt;Our task is hard. We have a large complex system, and our customers need to see just how great the system is, and how quickly we can resolve problems. Our customers need to explore and discover the functionality available in the (huge) application they have been developing with us. We need to support their efforts. There are no simple processes to tell us what to do.&lt;br /&gt;&lt;br /&gt;It will be interesting to see who on our development team steps up to the plate and changes our processes to help evaluate and stabilize the system. It is never easy to change the direction of a team, it is always interesting to watch those who lead the charge and see them flourish.&lt;br /&gt;&lt;br /&gt;Is it you?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115682117791913460?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115682117791913460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115682117791913460' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115682117791913460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115682117791913460'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/08/stepping-up-to-plate.html' title='Stepping up to the plate'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115405144118555985</id><published>2006-07-27T19:47:00.000-06:00</published><updated>2006-07-27T19:51:25.090-06:00</updated><title type='text'>Great people and Great tools</title><content type='html'>I've been working with Lu and John on our help system. It's been amazing to see what people can do when they discover a new tool to help them solve a problem and they are empowered to solve that problem.&lt;br /&gt;&lt;br /&gt;A good (great) Alistair Cockburn article: (Courtesy of Joseph King)&lt;br /&gt;&lt;br /&gt;&lt;a title="http://alistair.cockburn.us/index.php/Characterizing_people_as_non-linear,_first-order_components_in_software_development" href="http://alistair.cockburn.us/index.php/Characterizing_people_as_non-linear,_first-order_components_in_software_development"&gt;http://alistair.cockburn.us/index.php/Characterizing_people_as_non-linear,_first-order_components_in_software_development&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115405144118555985?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115405144118555985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115405144118555985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115405144118555985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115405144118555985'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/07/great-people-and-great-tools.html' title='Great people and Great tools'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115396612005215523</id><published>2006-07-26T20:02:00.000-06:00</published><updated>2006-07-26T20:08:40.053-06:00</updated><title type='text'>Usability Cobwebs</title><content type='html'>Having fun with Lu and John on the project sorting out how to make our help more usable. Building paper mock ups, figuring out our users, identifying core tasks and generally having lots o fun.&lt;br /&gt;&lt;br /&gt;Having done usability 20 years ago (Psych degree as well as Comp Sci degree) there a quite a few cob webs in my brain. Oh well, just figure it out as we go along.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115396612005215523?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115396612005215523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115396612005215523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115396612005215523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115396612005215523'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/07/usability-cobwebs.html' title='Usability Cobwebs'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115396573767458970</id><published>2006-07-26T19:54:00.000-06:00</published><updated>2006-07-26T20:02:17.706-06:00</updated><title type='text'>Smalltalkers</title><content type='html'>&lt;p&gt;Having been reminded that I'm an old dude&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.josephmoore.net/2006/05/visual-studio-ruby-on-rails-and-old.html"&gt;http://www.josephmoore.net/2006/05/visual-studio-ruby-on-rails-and-old.html&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;Courtesy John Duimovichs Blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115396573767458970?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115396573767458970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115396573767458970' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115396573767458970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115396573767458970'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/07/smalltalkers.html' title='Smalltalkers'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115319049359633151</id><published>2006-07-17T20:34:00.000-06:00</published><updated>2006-07-17T20:41:33.610-06:00</updated><title type='text'>It's a different safety net...</title><content type='html'>&lt;p&gt;XP has a different safety net than traditional approaches.&lt;/p&gt;&lt;p&gt;Written spec -&gt; functional tests&lt;br /&gt;Written Design &amp; Architecture -&gt; refactoring &amp;amp; mentoring&lt;br /&gt;Change Control -&gt; Malleable code &amp; visibility&lt;br /&gt;Detailed writing -&gt;oral communication&lt;br /&gt;Everything thought out -&gt; just in time&lt;br /&gt;Look to the future and prepare -&gt; look to the past and improve&lt;/p&gt;&lt;p&gt;Is this why combining Agile and Waterfall methods is the worst of all possible worlds? In both cases the safety nets are tightly woven (coupled?), one piece depends on all the others. Mixing and matching from both sides looses that "weaving". &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115319049359633151?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115319049359633151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115319049359633151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115319049359633151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115319049359633151'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/07/its-different-safety-net.html' title='It&apos;s a different safety net...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115173633316906452</id><published>2006-07-01T00:43:00.000-06:00</published><updated>2006-07-01T00:45:33.180-06:00</updated><title type='text'>Mistakes</title><content type='html'>If you aren't making mistakes you aren't trying hard enough.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115173633316906452?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115173633316906452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115173633316906452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115173633316906452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115173633316906452'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/07/mistakes.html' title='Mistakes'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115154264791145113</id><published>2006-06-28T18:50:00.000-06:00</published><updated>2006-06-28T18:57:27.950-06:00</updated><title type='text'>Speculative Solutions</title><content type='html'>are good. Unfortunately they are not the end point.&lt;br /&gt;&lt;br /&gt;There are two primary reasons I come up with a speculative solution to a problem:&lt;br /&gt;&lt;br /&gt;1) I haven't encountered it before&lt;br /&gt;2) I think we could be doing better than our current solution&lt;br /&gt;&lt;br /&gt;I often need to remind myself that the speculative solution is not the answer, it it the starting point. It is a chance for me to learn and figure out if this is right. If it is the wrong answer I have two options:&lt;br /&gt;&lt;br /&gt;1) Modify what I'm doing&lt;br /&gt;2) Try something else&lt;br /&gt;&lt;br /&gt;To do this I need to be in a position where I can change. If beginning my solution requires me to go to the end before I can evaluate whether or not it worked, I'm in big trouble.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115154264791145113?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115154264791145113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115154264791145113' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115154264791145113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115154264791145113'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/speculative-solutions.html' title='Speculative Solutions'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115112114696704076</id><published>2006-06-23T21:50:00.000-06:00</published><updated>2006-06-23T21:52:26.976-06:00</updated><title type='text'>Holidays</title><content type='html'>Looking forward to some holidays. First couple of weeks in July I'll be in Ottawa. Some time at the inlaws farm, rent a cottage with my family and of course a little talk on Agile development at CGI Ottawa for my brothers group.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115112114696704076?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115112114696704076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115112114696704076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115112114696704076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115112114696704076'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/holidays.html' title='Holidays'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115112010562917698</id><published>2006-06-23T21:24:00.000-06:00</published><updated>2006-06-23T21:35:05.643-06:00</updated><title type='text'>John Duimovich</title><content type='html'>I worked for John back when computers were made of stone with little hampsters used to power them. He was one of the key people at OTI and really, really smart. I was one of the junior developers and really, really dumb.&lt;br /&gt;&lt;br /&gt;John is one of the brains behind the IBMs (e.g. OTI) Smalltalk and Java VMs. He groks computers like no one I've ever met. His insight into how people program and how programs work is amazing. He's fun to be around as his mind works in weird and wonderful ways that make you "Wish I had said that".&lt;br /&gt;&lt;br /&gt;Take for example his blog on "Visible ink"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://duimovich.blogspot.com/"&gt;http://duimovich.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nice to find his blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115112010562917698?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115112010562917698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115112010562917698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115112010562917698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115112010562917698'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/john-duimovich.html' title='John Duimovich'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115006917471099288</id><published>2006-06-11T17:36:00.001-06:00</published><updated>2006-06-11T17:39:34.826-06:00</updated><title type='text'>Blogger is pissing me off...</title><content type='html'>Blogger has identified my blog as SPAM. Which probably isn't far from the truth, however...&lt;br /&gt;&lt;br /&gt;It's really annoying that I have to enter some word verification everytime I want to post. I've asked them to turn it off, it's been more than a week (took me a while to figure out what had happened). It's annoying.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115006917471099288?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115006917471099288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115006917471099288' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115006917471099288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115006917471099288'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/blogger-is-pissing-me-off.html' title='Blogger is pissing me off...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-115006899485872797</id><published>2006-06-11T17:36:00.000-06:00</published><updated>2006-06-11T17:36:35.320-06:00</updated><title type='text'>Vlad: On risk and performance</title><content type='html'>&lt;em&gt;Vlad (or Vald:) :&lt;/em&gt;&lt;br /&gt;&lt;em&gt;"Say there's a 99% chance that performance problems can be dealt with effectively late in a project, but there is 1% chance that performance problems can't be dealt with effectively. Is it worth risking an entire project on faith that one will find ways to fix the problems?"&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;Yes, on some projects performance is a severe risk. For example, my brother in Palo Alto needs to grab data from the partical accelerator as fast as possible and store it in a database (vast oversimplification). He worries about performance every second he programs. He writes custom ethernet drivers, uses customized hardware, reprograms switches and even writes in line assembly language in his C code. They spent 3 years making sure the software would be fast enough. Their risk was being able to do it fast enough, not whether or not they could store data in a database.&lt;br /&gt;&lt;br /&gt;What is the risk on our project? Are we going to have to rewrite switches and introduce specialized hardware? Or just write clever java code? Our team is full of people who can write clever java code, it's not really a risk. I don't think it's even 999 to 1. Especially, when our code is trying make the business rules clear, and our tests form a living specification of the application. Acutally, I don't see a scenario where the talent on our team couldn't make our app performant, it's what we do and do really well. It is a technical problem, and we're really really really good at technical problems.&lt;br /&gt;&lt;br /&gt;Our risk is the business and understanding how to make it work. Codifying the rules of production accounting is really really hard. Getting the specification right (the tests) and making it work correctly (the implementation) is a huge risk. How do we take a complicated body of (and not necessarily consistent) rules and make them into a reliable program? What are we missing that will make it hard to run properties? How does our model fail to meet the needs of our production accountants? We mitigate these risks by having production accountants test the application everyday. We write tests to create a living specification of what we've learned. We focus on these things, because if we get them wrong, we're in big trouble.&lt;br /&gt;&lt;br /&gt;Incidentally, we have done back of the envelope calcs and shooting tracer bullets through the application to see where we need to be and actually are in terms of performance. In our heavy processing areas, our early calcs show we need to get 2-10x faster, depending on the area. Assuming, that is, we don't turn this into a batch process system, which would make us about 3x slower in the worst case. We can deal with that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-115006899485872797?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/115006899485872797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=115006899485872797' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115006899485872797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/115006899485872797'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/vlad-on-risk-and-performance.html' title='Vlad: On risk and performance'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114997632564864855</id><published>2006-06-10T15:36:00.000-06:00</published><updated>2006-06-11T17:46:28.103-06:00</updated><title type='text'>Vlad points out my oversimplification</title><content type='html'>&lt;em&gt;"Does everyone really say that performance tuning should be saved for last?&lt;/em&gt; "&lt;br /&gt;&lt;br /&gt;Well ok, I meant deferred as long as possible, not dead last. People advocating this strategy include: Kent Beck, Martin Fowler, and I believe Ward Cunningham.&lt;br /&gt;&lt;br /&gt;Martin Fowlers discussion&lt;br /&gt;&lt;a href="http://www.artima.com/intv/tunable.html"&gt;http://www.artima.com/intv/tunable.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kent Becks discussion&lt;br /&gt;&lt;a href="http://www.rolemodelsoftware.com/moreAboutUs/publications/articles/lazyopt.php"&gt;http://www.rolemodelsoftware.com/moreAboutUs/publications/articles/lazyopt.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My experience:&lt;br /&gt;&lt;br /&gt;On my last application we spent the majority of our time implementing the system and deferring performance. It took three developers six months to build. It was 10x too slow. It took 1 developer 3 weeks to rip out the guts of well factored code and put it back together fast enough.&lt;br /&gt;&lt;br /&gt;Near the dawn of time, when I worked at OTI, there was a huge panic after IBM built Visual Age on top of OTI/Smalltalk because it was *WAY* too slow for them. One (Senior) developer, Steve, with the right tools(profiler and an open mind) went and assessed the situation. In a few hours things were all tickety boo. It was simply the way they were initializing their objects.&lt;br /&gt;&lt;br /&gt;In my experience, with the code teams I've worked with, deferring performance saved time and money. It's the old 80/20 rule (80% of the time is spent in 20% of the code). In my experience, I think this is way closer to a 95/5 rule.&lt;br /&gt;&lt;br /&gt;If you change (refactor) your code alot, that 5% will change alot too (it will be the heart of your system). How easy would allocation be to change if it had to meet performance criteria as well? How could we experiment?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114997632564864855?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114997632564864855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114997632564864855' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114997632564864855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114997632564864855'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/vlad-points-out-my-oversimplification.html' title='Vlad points out my oversimplification'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114997481280402080</id><published>2006-06-10T15:20:00.000-06:00</published><updated>2006-06-10T15:26:53.396-06:00</updated><title type='text'>Garbage Collection</title><content type='html'>It's been close to 15 years since I worked with the garbage collector in OTIs Smalltalk. I was tasked with experimenting with parallelization for SMP boxes in OTI/Smalltalk. At the time, people were struggling with parallelizing garbage collections. The train algorithm was an interesting paper, suggesting better ways of parallelization.&lt;br /&gt;&lt;br /&gt;I was simply curious to see if from a 50,000 foot view garbage collection has changed much in the last couple of decades. Apparently not.&lt;br /&gt;&lt;br /&gt;This was a really good overview for me.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/java/library/j-jtp11253/"&gt;http://www-128.ibm.com/developerworks/java/library/j-jtp11253/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114997481280402080?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114997481280402080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114997481280402080' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114997481280402080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114997481280402080'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/garbage-collection.html' title='Garbage Collection'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114995626072089028</id><published>2006-06-10T10:17:00.000-06:00</published><updated>2006-06-10T10:24:10.126-06:00</updated><title type='text'>Empirical Performance</title><content type='html'>Everyone tells you to do performance tuning last. Why?&lt;br /&gt;&lt;br /&gt;Because you can make performance tuning empirical. If you've done your tests first you'll be able to change the code to be performant, without breaking it.&lt;br /&gt;&lt;br /&gt;The following process works for me as follows:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;0) Prioritize and Instrument&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Record how long things take in your app. This can be as simple as paper and pencil, or as sophisticated as automated performance tests suites.&lt;br /&gt;&lt;br /&gt;Look at what is slow. Where would you get your biggest bang for the buck? What would make your users the happiest? Where will the load be in your system (back of envelope math works well here)?&lt;br /&gt;&lt;br /&gt;Are they having trouble with the GUI, or the calculations taking to long? Which page? Help them.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;1) Investigation and Hypothesis&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;You need to understand what the application is doing and how it does it. Use a profiler such as JProfiler. Eclipse has a free but slow one (tptp).&lt;br /&gt;&lt;br /&gt;Look at time spent in methods - can you reduce the time?&lt;br /&gt;Look at who is allocating objects - can you reduce the number of objects?&lt;br /&gt;Look at number of calls to a method - does it make sense?&lt;br /&gt;&lt;br /&gt;Hypothesize where you can save time, have rough guess of proportion of time it will save.&lt;br /&gt;&lt;br /&gt;Example: Alan and I found a method was called 20x more often than we expected. It was a bug in the code that was doing unnecessary calculations.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;2) Experiment&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Do actual timings on the code you are running (I use println like utilities). Youcan't use a profiler for this because of dialation effects (e.g. the OS and Database are not being slowed down, only your java code - the profiler may be lying to you).&lt;br /&gt;&lt;br /&gt;Do back of envelope calculations to see if what you're doing makes sense.&lt;br /&gt;&lt;br /&gt;Calculate: Theoretical maximum you can save, and likely amount you can save.&lt;br /&gt;&lt;br /&gt;For example: assume you find a method you can double in speed. Wow that seems like alot of savings. So lets say this method is taking 10 seconds out of a 100 second process.&lt;br /&gt;&lt;br /&gt;Now lets assume you speed it up so it takes zero time:&lt;br /&gt;&lt;br /&gt;Theoretical maximum: 10/100 = 10%. Will that satisfy your users?&lt;br /&gt;Likely savings (Double speed of method) = 5/100 = 5%. Will your users notice?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;3) Conclusion&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Is it worth doing?&lt;br /&gt;&lt;br /&gt;If you know your users need a lot more speed 5% won't cut it, you'll have to go back to investigating and finding where to improve.&lt;br /&gt;&lt;br /&gt;Otherwise implement the change and then measure your actual speed gain.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Empirical Performance improvements. I find them worth the wait.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114995626072089028?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114995626072089028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114995626072089028' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114995626072089028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114995626072089028'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/empirical-performance.html' title='Empirical Performance'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114995453398951691</id><published>2006-06-10T09:48:00.000-06:00</published><updated>2006-06-10T09:49:08.626-06:00</updated><title type='text'>Useful little tool</title><content type='html'>For those of you who are part-time SQLers and need to format stuff occasionally.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wangz.net/cgi-bin/pp/gsqlparser/sqlpp/sqlformat.tpl"&gt;http://www.wangz.net/cgi-bin/pp/gsqlparser/sqlpp/sqlformat.tpl&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114995453398951691?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114995453398951691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114995453398951691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114995453398951691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114995453398951691'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/useful-little-tool.html' title='Useful little tool'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114995439239597880</id><published>2006-06-10T09:42:00.000-06:00</published><updated>2006-06-10T09:46:32.813-06:00</updated><title type='text'>Service what you build</title><content type='html'>I always try to help service what I build.&lt;br /&gt;&lt;br /&gt;If you were to buy a car from toyota - you expect to be able to service it there. Same with a toaster.&lt;br /&gt;&lt;br /&gt;This analogy only goes so far, because when someone builds a toaster, they usually build 1,000's (or millions). Servicing can be done by specially trained servicing staff.&lt;br /&gt;&lt;br /&gt;When I develop software, my customers will need service. I provide that service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114995439239597880?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114995439239597880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114995439239597880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114995439239597880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114995439239597880'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/service-what-you-build.html' title='Service what you build'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114965528358001229</id><published>2006-06-06T22:37:00.000-06:00</published><updated>2006-06-06T22:42:14.973-06:00</updated><title type='text'>Specification Based Factory</title><content type='html'>Cool stuff today.&lt;br /&gt;&lt;br /&gt;Simon and James came up with a new use for the Specification pattern. They combined it with the Factory pattern.&lt;br /&gt;&lt;br /&gt;Basically, we need to find a class under some pretty heavy conditions (OK maybe we need a strategy pattern). They look up the class in a Map, indexed by a Specification object. They iterate over the map evaluating the specification, when one return trues they poof up a new instance of the class contained in the value.&lt;br /&gt;&lt;br /&gt;Nice explicit code, with each rule contained in its own specification object.&lt;br /&gt;&lt;br /&gt;I love simple stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114965528358001229?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114965528358001229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114965528358001229' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114965528358001229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114965528358001229'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/specification-based-factory.html' title='Specification Based Factory'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114944048759104375</id><published>2006-06-04T10:54:00.000-06:00</published><updated>2006-06-04T11:01:27.900-06:00</updated><title type='text'>Process and people</title><content type='html'>Had an interesting discussion with Rado the other day. We were discussing process.&lt;br /&gt;&lt;br /&gt;Just reinforced the notion that process is there for the people, not the people for the process. As such the process should accommodate all people and their working styles, not the other way around. When running a project I must try and make the process we have chosen work for all the people on the team. The inability of a process to adapt to an individuals working style is a failure of the process.&lt;br /&gt;&lt;br /&gt;In general I try to adapt the process to the people. In reality, at times I am not able to adapt the process to meet the needs of all the people. This is a failing of the process and myself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114944048759104375?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114944048759104375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114944048759104375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114944048759104375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114944048759104375'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/process-and-people.html' title='Process and people'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114936905920932376</id><published>2006-06-03T15:10:00.000-06:00</published><updated>2006-06-03T15:10:59.433-06:00</updated><title type='text'>Performance techniques</title><content type='html'>Techniques we are using to improve performance:&lt;br /&gt;&lt;br /&gt;1) Do more at once in a transaction.&lt;br /&gt;&lt;br /&gt;With coarser grained transactions, we spend less time looking up stuff in caches and merging changes and more time actually doing the important work.&lt;br /&gt;&lt;br /&gt;For example: Our importer was importing 1 measurement at a time. By grouping the measurements together on a per facility basis and updating them in a single transaction we reduced the time by 50%. DEspite caching&lt;br /&gt;&lt;br /&gt;2) Cache.&lt;br /&gt;&lt;br /&gt;Yep. It works. In our case we cache our snapshots (&lt;a href="http://www.martinfowler.com/ap2/snapshot.html"&gt;www.martinfowler.com/ap2/snapshot.html&lt;/a&gt;) which are constructed frequently in our networks of facilities.&lt;br /&gt;&lt;br /&gt;For Example: Had one process come down from an hour to process to mere minutes.&lt;br /&gt;&lt;br /&gt;3) Convert dynamically calculated results to stored results.&lt;br /&gt;&lt;br /&gt;For example: Our statuses were being calculated all the time for complex large networks. Made the GUI slow. Store the results and poof things sped up by a factor of 5.&lt;br /&gt;&lt;br /&gt;4) Convert stored information to dynamically calculated.&lt;br /&gt;&lt;br /&gt;For example: We currently store some summary numbers for one of our facilities. Everytime something changes we redo our calculations. They end up being done over and over.&lt;br /&gt;&lt;br /&gt;Instead, we make it an on demand calculation and our performance goes way up.&lt;br /&gt;&lt;br /&gt;Many times we are pushing the time around, from a place where it hurts to one where it is OK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114936905920932376?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114936905920932376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114936905920932376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114936905920932376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114936905920932376'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/performance-techniques.html' title='Performance techniques'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114936806349814938</id><published>2006-06-03T14:37:00.000-06:00</published><updated>2006-06-03T14:54:23.986-06:00</updated><title type='text'>Performance tuning in an agile world...</title><content type='html'>I have taken over the lead on the performance tuning of our application. &lt;br /&gt;&lt;br /&gt;A few interesting notes on performance tuning:&lt;br /&gt;&lt;br /&gt;1) We do performance tuning test first.&lt;br /&gt;&lt;br /&gt;We use Watir to drive our performance tests - because they reflect the experience of the user. We can measure the responsiveness of the app. Also we get to show the users what we are measureing and see if it matches their workflow in a month&lt;br /&gt;&lt;br /&gt;On our project, we have moved away from the traditional pass/fail test for performance. We have red, yellow and green. Green means we're with in our target, yellow indicates we're within about 50% and red, well, we're in trouble. It helps prioritize our work. &lt;br /&gt;&lt;br /&gt;As always we're running these tests a few time a day in a cruise-control like process.&lt;br /&gt;&lt;br /&gt;2) There are different areas of performance tuning. &lt;br /&gt;&lt;br /&gt;We have GUI response time, processing time and import/export time (our application has a large component of reporting and third party application interaction in it).&lt;br /&gt;&lt;br /&gt;We concentrate on each one, writing tests and getting feedback from our testers on how the system is doing.&lt;br /&gt;&lt;br /&gt;3) Break down the problem. Tackle one thing at a time to make it managable.&lt;br /&gt;&lt;br /&gt;Performance, Load, Concurrency are all heavily interrealted problems. The nice thing is that we can takle them individually, we don't have to deal with them all at once.&lt;br /&gt;&lt;br /&gt;We use both real and imaginary data to drive our performance tests (Actually, we use real data that are part of our regression suite).&lt;br /&gt;&lt;br /&gt;4) Thank god that your developers have been refactoring code. You'll notice when you have some "original" design code, versus stuff that has been worked over. It is way easier to tune the latter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114936806349814938?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114936806349814938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114936806349814938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114936806349814938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114936806349814938'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/06/performance-tuning-in-agile-world.html' title='Performance tuning in an agile world...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114783918168736177</id><published>2006-05-16T21:52:00.000-06:00</published><updated>2006-05-16T22:13:55.063-06:00</updated><title type='text'>Prescriptive vs. Descriptive</title><content type='html'>I like descriptive writing. (e.g. Ron Jeffries/Martin Fowler)&lt;br /&gt;&lt;br /&gt;Basically, they describe what they've done and the outcome.&lt;br /&gt;&lt;br /&gt;I dislike prescriptive writing. (e.g. Scott Ambler).&lt;br /&gt;&lt;br /&gt;They describe what you should do to be successful.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I read a bunch of my previous blogs. The ones I like are descriptive, the ones I dislike are prescriptive. I'll try to be more descriptive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114783918168736177?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114783918168736177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114783918168736177' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114783918168736177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114783918168736177'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/05/prescriptive-vs-descriptive.html' title='Prescriptive vs. Descriptive'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114783394419515004</id><published>2006-05-16T20:45:00.000-06:00</published><updated>2006-05-16T22:19:40.116-06:00</updated><title type='text'>Help with problems not with solutions</title><content type='html'>Are you leading an agile team?&lt;br /&gt;&lt;br /&gt;One of my big (and hard) learnings has been that one of the key ingredients to a high performance team is how the leadership delegates responsibility.&lt;br /&gt;&lt;br /&gt;I have found that helping people identify problems, and brainstorming with them (rather than for them) creates a great enabled team. It also creates a great relationship.&lt;br /&gt;&lt;br /&gt;I have found that leadership for me, means letting the people I work for (my team) do what they think is best. They make great decisions. Any mistakes they make, they recover from. I like to help with advice, if they ask for it.&lt;br /&gt;&lt;br /&gt;Here's a great article from the globe and mail on the subject: (sorry, you'll have to purchase it)&lt;br /&gt;&lt;a href="http://www.theglobeandmail.com/servlet/Page/document/v4/sub/MarketingPage?user_URL=http://www.theglobeandmail.com%2Fservlet%2Fstory%2FLAC.20060505.CAQUIE05%2FTPStory%2F%3Fquery%3Dleadership&amp;ord=31436400&amp;amp;brand=theglobeandmail&amp;redirect_reason=2&amp;amp;denial_reasons=none&amp;force_login=false"&gt;Caution: thinking encouraged here&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114783394419515004?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114783394419515004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114783394419515004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114783394419515004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114783394419515004'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/05/help-with-problems-not-with-solutions.html' title='Help with problems not with solutions'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114693972432613859</id><published>2006-05-06T12:18:00.000-06:00</published><updated>2006-05-06T12:22:04.336-06:00</updated><title type='text'>Enthusiasm in an Interview</title><content type='html'>Remember that enthusiasm is important for an interview. Why are you doing this job? Do you like building software? Are you learning new techniques? Are you going to excel on my team? Are you going to grow on my team?&lt;br /&gt;&lt;br /&gt;These are all questions I'm trying to answer for myself during that 30 minutes I have to decide whether or not you'll work out on our team.&lt;br /&gt;&lt;br /&gt;A big factor is how enthusiatic you are. I know if you love what you're doing, you'll be working at being better everyday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114693972432613859?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114693972432613859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114693972432613859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114693972432613859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114693972432613859'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/05/enthusiasm-in-interview.html' title='Enthusiasm in an Interview'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114672503537254295</id><published>2006-05-04T00:37:00.000-06:00</published><updated>2006-05-04T00:46:07.603-06:00</updated><title type='text'>For those of you that are counting...</title><content type='html'>Our project has blown through 10,000 automated functional tests. Still another year to go.&lt;br /&gt;&lt;br /&gt;170,000 lines of business code&lt;br /&gt;230,000 lines of test code&lt;br /&gt;&lt;br /&gt;Average # of lines per method: 5&lt;br /&gt;&lt;br /&gt;# of great people working on the project: 62&lt;br /&gt;# of customers 12&lt;br /&gt;# of developers ~ 32&lt;br /&gt;# of qa 5&lt;br /&gt;# of teams 5&lt;br /&gt;&lt;br /&gt;# of sprints: 24&lt;br /&gt;&lt;br /&gt;Time to run 10,000 tests: 380 secs. TOO LONG.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114672503537254295?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114672503537254295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114672503537254295' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114672503537254295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114672503537254295'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/05/for-those-of-you-that-are-counting.html' title='For those of you that are counting...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114645714037652231</id><published>2006-04-30T21:58:00.000-06:00</published><updated>2006-04-30T22:19:00.433-06:00</updated><title type='text'>On Performance</title><content type='html'>Vlad commented:&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;You mentioned that performance could be improved with this approach, but I'm not&lt;br /&gt;sure how - since this approach involves asking the database for all the records&lt;br /&gt;and then filtering them usig the specs. Using toplink expressions, one can take&lt;br /&gt;advantage of indexes on the database tables and the syntax is quite similar to&lt;br /&gt;specs, so one gets the same kinds of benefits in terms of code duplication. I'd&lt;br /&gt;love to see a posting about performance tuning these spec objects. &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Performance for us was not over the database, but the number of times we were looping over the MeasurementPointCollection. Many of our common calls would loop over the measurement point collections two to three times. We saw about a 5% speed up in the tests using the Specification. Not a lot, but something.&lt;br /&gt;&lt;br /&gt;Earlier in the project we used Home (&lt;em&gt;Repository Pattern&lt;/em&gt;) calls to load the measurement points from the database. We found loading them once and reusing them much faster than using the database. (I think we halved the time the tests took). This is fairly common. (See Fowler PoEAA p.40, Toplink performance &lt;a href="http://www.javaperformancetuning.com/news/interview030.shtml"&gt;http://www.javaperformancetuning.com/news/interview030.shtml&lt;/a&gt;. In particular, read the question: What are the most common performance related mistakes that you have seen projects make when developing TopLink applications?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114645714037652231?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114645714037652231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114645714037652231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114645714037652231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114645714037652231'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/04/on-performance.html' title='On Performance'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114642119675101322</id><published>2006-04-30T11:52:00.000-06:00</published><updated>2006-04-30T12:19:56.806-06:00</updated><title type='text'>Specification Objects</title><content type='html'>Domain Driven Design by Eric Evans has several patterns mixed in it, among the ideas about how to leverage the domain in development.&lt;br /&gt;&lt;br /&gt;One of the patterns is the Specification pattern. For me, it's primary benefit has been to reduce code duplication when you're using collections, and need to find subsets of the objects in those collections, depending on various Criteria.&lt;br /&gt;&lt;br /&gt;For our project we have this problem in spades, with contracts and measurement points.&lt;br /&gt;&lt;br /&gt;Sometimes we want to find all Sales contracts. Sometime we want to find an Oil Contract. Sometimes we want to find Oil contracts that are also Sales contracts. We have many many dimension on our contracts, and need to slice and dice them many different ways.&lt;br /&gt;&lt;br /&gt;Our original implementation looked like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;findAllSalesContracts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;List results = new List&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;foreach contract in getContracts()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;   if contract.isSales&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;     results.add(contract)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;return results&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;strong&gt;findAllOilContracts&lt;/strong&gt;&lt;br /&gt;List results = new List&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;foreach contract in getContracts()&lt;br /&gt;   if contract.isOil&lt;br /&gt;     results.add(contract)&lt;br /&gt;return results&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;findAllOilSalesContracts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;List results = new List&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;foreach contract in findAllOilContracts()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;   if contract.isOil     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;      results.add(contract)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;return results&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;See the duplication, the repeated code? Imagine 4 or 5 conditions. This gets unmanagable.&lt;br /&gt;&lt;br /&gt;Now here's a Specification Implementation:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;class OilSpecification&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;isSatisfiedBy aContract&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;return aContract.isOil&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;em&gt;class SalesSpecification&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;isSatisfiedBy aContract&lt;/strong&gt;&lt;br /&gt;return aContract.isSales&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;em&gt;class ContractFinder&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;strong&gt;findAll(Collection, Specification)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;List results = new List&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;foreach element in collection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;  if Specification.isSatisfiedBy(element)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;     results.add(element)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;return results&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;strong&gt;findAllSalesContracts&lt;/strong&gt;&lt;br /&gt;return ContractFinder.findAll(getContracts, SalesSpecification)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;strong&gt;findAllOilContractsList &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;return ContractFinder.findAll(getContracts, OilSpecification)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;strong&gt;findAllOilSalesContracts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;return ContractFinder.findAll(getContracts, SalesSpecification.and(OilSpecification))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;Removed several hundred lines of code from our application.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114642119675101322?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114642119675101322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114642119675101322' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114642119675101322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114642119675101322'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/04/specification-objects.html' title='Specification Objects'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114635236917697804</id><published>2006-04-29T17:04:00.000-06:00</published><updated>2006-04-29T17:12:49.186-06:00</updated><title type='text'>Denis and ClearStream</title><content type='html'>ClearStream was one of the companies I have seen where the words the "we're a family" was true.&lt;br /&gt;&lt;br /&gt;Denis has taken care of his employees through thick and thin, and they have been good friends to him. When he spoke of them to me it was always with fondness and pride. Those who had left he always appeared to have hope they might return, while proud of their current successes.&lt;br /&gt;&lt;br /&gt;My sympathies go out to Greg, Gerard, Jennitta, Ralph and Shaun who all form part of the ClearStream family.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114635236917697804?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114635236917697804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114635236917697804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114635236917697804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114635236917697804'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/04/denis-and-clearstream.html' title='Denis and ClearStream'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114632817036900875</id><published>2006-04-29T10:20:00.000-06:00</published><updated>2006-04-29T10:29:32.003-06:00</updated><title type='text'>Denis and Calgary</title><content type='html'>A few years ago Tom and Mary Poppendick came to Calgary and in one of my conversations with them, they marvelled at what an agile community we had. It was unusual.&lt;br /&gt;&lt;br /&gt;One of the reasons for that community is Denis. Denis created a business in new ideas and new ways of doing things. ClearStream is not a body shop, it is more. Denis' business sense made it possible to assemble some of the best people in the city and introduce innovative ways of developing on many different projects.&lt;br /&gt;&lt;br /&gt;In the past he has helped his company introduce Smalltalk, Objective-C, object oriented development and now Agile development to the community. He brought the people together with the ability and turned it into a viable business. His companies innovation has pushed other bigger companies like IBM, Telus, CGI to adopt new techniques and practices faster than they normally would.&lt;br /&gt;&lt;br /&gt;Denis helped form our agile community. Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114632817036900875?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114632817036900875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114632817036900875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114632817036900875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114632817036900875'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/04/denis-and-calgary.html' title='Denis and Calgary'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-114628123505426737</id><published>2006-04-28T21:13:00.000-06:00</published><updated>2006-04-28T21:27:15.113-06:00</updated><title type='text'>Denis Clelland</title><content type='html'>Denis was a great friend. If you knew him you very quickly thought the same thing.&lt;br /&gt;&lt;br /&gt;My own relationship with Denis began as a business relationship. It very quickly became warm and friendly. Denis was genuinely interested in me personally. He did that with many people.&lt;br /&gt;&lt;br /&gt;Denis was easy to trust. I could tell him lots and bounce ideas off him. He'd tell you about his experiences. Not "condescending" or "teaching", sharing. He was interested in my ideas, thoughts, family. He shared his with me. It was a friendship.&lt;br /&gt;&lt;br /&gt;Friendship and business went hand in hand with Denis I don't think he could have one without the other.&lt;br /&gt;&lt;br /&gt;I miss my friend deeply.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-114628123505426737?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/114628123505426737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=114628123505426737' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114628123505426737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/114628123505426737'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/04/denis-clelland.html' title='Denis Clelland'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113936707300860420</id><published>2006-02-07T19:50:00.000-07:00</published><updated>2006-02-07T19:51:13.020-07:00</updated><title type='text'>Drywalling...</title><content type='html'>I've been drywalling for the last few months. I have lots of tips on how to mud, soon I'll be back to my normal posting schedule.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113936707300860420?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113936707300860420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113936707300860420' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113936707300860420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113936707300860420'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/02/drywalling.html' title='Drywalling...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113614155139304494</id><published>2006-01-01T11:45:00.000-07:00</published><updated>2006-01-01T11:52:31.403-07:00</updated><title type='text'>Verify imported data</title><content type='html'>Just used Watir to verify some imported data.&lt;br /&gt;&lt;br /&gt;The problem: We had business logic in java. It was much easier to do our imports in SQL. Our new logic had stricter controls than the old application in some areas.&lt;br /&gt;&lt;br /&gt;How do we verify that our imported data is editable in the new system?&lt;br /&gt;&lt;br /&gt;We wrote a simple script in watir to try editing every single piece of data. Nothing fancy, just open and save. The big trick is that you need a simple way to bring in the data easily. Our app allowed us to specify the surrogate key as a parameter to the editing webpage. From there watir hit the save button and then loaded the next piece of data.&lt;br /&gt;&lt;br /&gt;Less than 50 lines of code. More than 24 hours to run. Found problems in .5% of the data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113614155139304494?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113614155139304494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113614155139304494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113614155139304494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113614155139304494'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2006/01/verify-imported-data.html' title='Verify imported data'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113537269532531993</id><published>2005-12-23T14:15:00.000-07:00</published><updated>2005-12-23T14:18:15.336-07:00</updated><title type='text'>Silly extremes...</title><content type='html'>My last couple of posts have been about extremes. Rules that should be applied with a pound of salt.&lt;br /&gt;&lt;br /&gt;Interestingly, they have had two interesting side effects. One, they make me think more about one aspect of how I'm coding. Two, they create interesting discussions with other people on my team about what the rule really means and how it has been applied.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113537269532531993?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113537269532531993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113537269532531993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113537269532531993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113537269532531993'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/12/silly-extremes.html' title='Silly extremes...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113530671570963413</id><published>2005-12-22T19:54:00.000-07:00</published><updated>2005-12-22T19:58:35.720-07:00</updated><title type='text'>Another piece of the "deeply nested if" smell...</title><content type='html'>I was doing a little refactoring with Srini today and made a mental note of something to look for. When I see multiple nested ifs in a method, it seems to indicate a problem with responsibility. Usually, you are asking one object one thing, another object another thing, then even another object a third thing and then finally you operated on that third thing.&lt;br /&gt;&lt;br /&gt;In this code it looked like you were reaching into the guts of other objects and playing with them. Once you reorganized the method, it was easy to move the ifs and their actions into different objects and the code began to make sense.&lt;br /&gt;&lt;br /&gt;I'm going to play with a rule that says "I can only perform ifs on the results local methods/variables".&lt;br /&gt;&lt;br /&gt;Lets see what happens. Anyone want to play with me?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113530671570963413?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113530671570963413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113530671570963413' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113530671570963413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113530671570963413'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/12/another-piece-of-deeply-nested-if.html' title='Another piece of the &quot;deeply nested if&quot; smell...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113251126759200847</id><published>2005-11-20T11:21:00.000-07:00</published><updated>2005-11-20T11:30:54.996-07:00</updated><title type='text'>From medium to fine grained...</title><content type='html'>I'm trying to make the step from medium to fine grained objects.&lt;br /&gt;&lt;br /&gt;1) Try to create an object with everything it needs at constructor time.&lt;br /&gt;2) Try to have at most one public method to do the work in the class.&lt;br /&gt;3) All other methods are simply for inspecting the state of the object.&lt;br /&gt;&lt;br /&gt;I shouldn't have to call a setter on an object once I've built it. Otherwise I've introduced coupling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113251126759200847?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113251126759200847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113251126759200847' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113251126759200847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113251126759200847'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/11/from-medium-to-fine-grained.html' title='From medium to fine grained...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113251035003054696</id><published>2005-11-20T10:47:00.000-07:00</published><updated>2005-11-20T11:21:02.260-07:00</updated><title type='text'>What is your object level</title><content type='html'>In the OO world there is much complaining about how everybody else is a bad OO developer. I'm beginning to understand how lacking my own skills are and am working on improving. However, I believe the vast majority of developers have not evolved their skills enough.&lt;br /&gt;&lt;br /&gt;Working with a large team I get to see many of the different skill levels in OO that exist.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1 Modular developer&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Most of the code is organized along similarity lines. This is actually not bad. It can often be refactored into a set of parameter objects, method objects and data objects and which can then be reconstructed as first class objects.&lt;br /&gt;&lt;br /&gt;Some smells are: Lots of static methods, Difficulty applying Gang of four patterns, Lots of parameters being passed to methods. Lots of ifs. Some apps look like PLSQL rather than OO.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2 Coarse Grained Object developer&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There are a few key objects in the system. Often you'll see deep hierarchy trees with few branches. When you ask yourself the responsibility of an object you can come up with a list, or it is not clear.&lt;br /&gt;&lt;br /&gt;Some smells are: it's a little harder to figure out where the behaviour for an object is. Often you'll find more coupling as two object call one another, this is due to the fact that they both have lots of responsibility. Lots of ifs.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3 Medium Grained Object developer&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There are a large number of objects in the system, but it is still difficult to make changes sometimes. Each class has a few responsibilities. Not always alot of subclassing. Subclassing tends to override large portions of the super class.&lt;br /&gt;&lt;br /&gt;Some smells are: incremental behaviour is hard to add and requires more work than you would think. Things feel good though.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4 Fine Grained Object developer&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;At most objects have two responsibilities, maybe one. You find that incremental change is really easy, adding a new way of doing something is straight forward.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our code lives in all four levels. We have some modular code (Look at our test helpers) as well as some really clean objects (look at our allocation results). Most of our code varies between coarse grained objects and medium grained objects.&lt;br /&gt;&lt;br /&gt;I think my skill level right now is certainly at the medium grained objects and I'm pushing myself to fine grained objects. It's fun and I'm learning stuff.&lt;br /&gt;&lt;br /&gt;An important thing to remember for the OO community is that you can't go from modular to fine grained in a day. It takes years (decades?). YOu need to figure out how to make those steps incrementally.&lt;br /&gt;&lt;br /&gt;I'm trying to apply patterns from Ken Becks &lt;a href="http://www.amazon.com/gp/product/013476904X/104-0961590-1894355?v=glance&amp;n=283155&amp;amp;v=glance"&gt;Smalltalk Best Practice Patterns&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113251035003054696?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113251035003054696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113251035003054696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113251035003054696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113251035003054696'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/11/what-is-your-object-level.html' title='What is your object level'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113228520938049483</id><published>2005-11-17T20:36:00.000-07:00</published><updated>2005-11-17T20:40:09.390-07:00</updated><title type='text'>Embarrassing</title><content type='html'>&lt;a href="http://www.cbc.ca/calgary/story/ca-homeless-shelter20051117.html"&gt;Homeless shelters over capacity &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cbc.ca/story/business/national/2005/11/16/albertasurplus-051116.html"&gt;Alberta's surplus projected to climb to $8.7 billion&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Make sure you give a lot more to charity this year. This is really stupid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113228520938049483?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113228520938049483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113228520938049483' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113228520938049483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113228520938049483'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/11/embarrassing.html' title='Embarrassing'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113107843765099947</id><published>2005-11-03T20:57:00.000-07:00</published><updated>2005-11-03T21:27:17.696-07:00</updated><title type='text'>Requirements gatherer</title><content type='html'>I think on my next project I'll endeavour to find a requirements gatherer. This is something that has worked out interestingly in our project and I think it is one of the missing pieces in XP.&lt;br /&gt;&lt;br /&gt;When you have a customer they often lack the ability to express and prioritize their needs sprint by sprint. They need a grasp of the whole product. They need a grasp of what is important. They need to be able to help the customer prioritize to build a better product.&lt;br /&gt;&lt;br /&gt;This is the person that needs to understand the big picture as well as the small. They also need to understand in their bones that development won't be able to build everything the customer believes is essential.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113107843765099947?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113107843765099947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113107843765099947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113107843765099947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113107843765099947'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/11/requirements-gatherer.html' title='Requirements gatherer'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113098784104543398</id><published>2005-11-02T20:11:00.000-07:00</published><updated>2005-11-02T20:17:21.056-07:00</updated><title type='text'>Watir</title><content type='html'>We've been using watir on the project for a couple of weeks now. It is far superior to JWebUnit which we used previously. Great for testing your GUI througha browser. Ruby makes a good scripting language (I guess that's what it is supposed to be) and using the IE Ole Control as the browser engine for the testing harness is a stroke of brilliant simplicity. Stuff like JWebUnit tries to simulate browsers. Makes all those nasty "doesn't run the javascript right" problems go away.&lt;br /&gt;&lt;br /&gt;You can find it here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wtr.rubyforge.org/"&gt;http://wtr.rubyforge.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113098784104543398?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113098784104543398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113098784104543398' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113098784104543398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113098784104543398'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/11/watir.html' title='Watir'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113098395940632640</id><published>2005-11-02T19:09:00.000-07:00</published><updated>2005-11-02T19:12:39.416-07:00</updated><title type='text'>Hah...</title><content type='html'>Just spent some time explaining blocks to people who are writing tests in Ruby. To me, it is thank god their back (I started using then 15 years ago with Big Dave Thomas), but there is a whole generation who have never played with Smalltalk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113098395940632640?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113098395940632640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113098395940632640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113098395940632640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113098395940632640'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/11/hah.html' title='Hah...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113038182693001861</id><published>2005-10-26T20:45:00.000-06:00</published><updated>2005-10-26T20:57:36.046-06:00</updated><title type='text'>First thoughts on Ruby...</title><content type='html'>Thank god blocks are back.&lt;br /&gt;&lt;br /&gt;What the hell is up with all the special characters and weird syntaxes? Feels like C's question mark colon is coming back.&lt;br /&gt;Why do people always think having multiple ways to do the same thing is a good idea?&lt;br /&gt;Mixins are good because ...&lt;br /&gt;Parser errors remind me of the LValue errors I used to get out of Microsoft C compiler.&lt;br /&gt;&lt;br /&gt;Maybe static typing is good for code generation as it allows code completion and easier refactoring. (Did Ted really say that???)&lt;br /&gt;&lt;br /&gt;Ruby on rails looks more like a steam train than a modern locomotive. Better than what we have, but not environmentally friendly.&lt;br /&gt;&lt;br /&gt;Most importantly:&lt;br /&gt;&lt;br /&gt;I've only used it for a couple of days. Ask me in a week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113038182693001861?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113038182693001861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113038182693001861' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113038182693001861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113038182693001861'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/10/first-thoughts-on-ruby.html' title='First thoughts on Ruby...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-113038115310319765</id><published>2005-10-26T20:44:00.000-06:00</published><updated>2005-10-26T20:45:53.116-06:00</updated><title type='text'>A cripple without a cane...</title><content type='html'>I'm doing a little work in Ruby. There are no refactoring tools or code completion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-113038115310319765?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/113038115310319765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=113038115310319765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113038115310319765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/113038115310319765'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/10/cripple-without-cane.html' title='A cripple without a cane...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112864736602132253</id><published>2005-10-06T19:06:00.000-06:00</published><updated>2005-10-06T19:34:08.690-06:00</updated><title type='text'>The burn down to zero</title><content type='html'>One of the things our project is missing is the excitement of completing what we think we can complete. Our executive team has declared that 60 stories a sprint is the goal for the team. Currently we're running at about 42.&lt;br /&gt;&lt;br /&gt;Unfortunately, this means that the teams always feel that they are behind. There is no victory in completing all your stories, or even better if we did 50, we would still be behind. I think tomorrow we should pull 18 low priority stories off the wall. We can give our team a victory. They are a great team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112864736602132253?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112864736602132253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112864736602132253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112864736602132253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112864736602132253'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/10/burn-down-to-zero.html' title='The burn down to zero'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112864675936818031</id><published>2005-10-06T18:57:00.000-06:00</published><updated>2005-10-06T19:34:26.883-06:00</updated><title type='text'>Dammit a good article...</title><content type='html'>.. by Alistair Cockburn. When this guy is on, he writes really, really well.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alistair.cockburn.us/crystal/articles/aih/areiterationshazardous.htm"&gt;http://alistair.cockburn.us/crystal/articles/aih/areiterationshazardous.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Good example of not getting caught up in the hype of XP. Remain focused on the end goal and make your development process work around that. Don't make the process the end goal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112864675936818031?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112864675936818031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112864675936818031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112864675936818031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112864675936818031'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/10/dammit-good-article.html' title='Dammit a good article...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112864508844969747</id><published>2005-10-06T18:21:00.000-06:00</published><updated>2005-10-06T19:32:53.636-06:00</updated><title type='text'>Some problem solving strategies...</title><content type='html'>When I'm trying to solve a hard problem, refactoring or otherwise I employ some strategies to help me get a better understanding and arrive at a good solution.&lt;br /&gt;&lt;br /&gt;First I come up with a number of ideas. Very explicit different approaches to the problem. Stupid ideas are as welcome as ones I think are excellent. They make you think about the problem in different ways. I then cross ideas off the list that clearly are way too much work or won't work at all.&lt;br /&gt;&lt;br /&gt;Of the ones that remain I'll choose two that look promising. If there is one that looks promising, but I don't like, I'll often try that one first. It might lead to new understanding. A spike of 1 - 2 hours will lead to new learnings and new strategies.&lt;br /&gt;&lt;br /&gt;Sometimes, when I grow too attached to an idea, I'll hand the problem to someone else. I get enamoured with my own ideas, and this is a bad thing. By passing control to someone else I can be assured additional ideas will be generated and heard by the person working on the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112864508844969747?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112864508844969747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112864508844969747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112864508844969747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112864508844969747'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/10/some-problem-solving-strategies.html' title='Some problem solving strategies...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112856649785005554</id><published>2005-10-05T20:40:00.000-06:00</published><updated>2005-10-05T20:42:33.536-06:00</updated><title type='text'>Is this double speak?</title><content type='html'>&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0596008740/002-0408435-3356841"&gt;http://www.amazon.com/exec/obidos/tg/detail/-/0596008740/002-0408435-3356841&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112856649785005554?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112856649785005554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112856649785005554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112856649785005554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112856649785005554'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/10/is-this-double-speak.html' title='Is this double speak?'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112818507425737033</id><published>2005-10-01T10:28:00.000-06:00</published><updated>2005-10-01T10:44:34.306-06:00</updated><title type='text'>A leadership role for software team leads</title><content type='html'>On software development projects there can be lots of turmoil. We live in a time where programs can be extremely complex and difficult to estimate. This creates stress for business people who are trying to evaluate return on investment. Unfortunately, we cannot give guarantees - the technology doesn't allow it yet. This creates justifiable stress among the business people and turmoil on the team.&lt;br /&gt;&lt;br /&gt;Software leaders have a different role to play than most other leaders. Yes, you're responsible for encouraging innovation, encouraging thinking about the problem differently to find newer and better ways to build things. The different thing in software development is that you're reponsible for protecting your team.&lt;br /&gt;&lt;br /&gt;This means, you have to ride out turmoil and explain (not hide) it to your team members. Unreasonable demands from the business group must be tempered by your explanations and reasonable expectations. Unreasonable expectations from the business group must be fought visibly by you.&lt;br /&gt;&lt;br /&gt;Above all you must be honest and not play games. Your integrity will serve you well.&lt;br /&gt;&lt;br /&gt;Leadership is hard work everyday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112818507425737033?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112818507425737033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112818507425737033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112818507425737033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112818507425737033'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/10/leadership-role-for-software-team.html' title='A leadership role for software team leads'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112814644940650846</id><published>2005-09-30T23:58:00.000-06:00</published><updated>2005-10-01T00:04:19.700-06:00</updated><title type='text'>Innovations on an Agile Team</title><content type='html'>Here are some of the innovations I've seen on our team: (Every time I think for 5 minutes I find 5 more - I apologize to all of you who have contributed more that I haven't listed)&lt;br /&gt;&lt;br /&gt;Production Accounting Test Fixtures&lt;br /&gt;Large FIT testing (3x)&lt;br /&gt;In Memory testing&lt;br /&gt;GUI Cruise tests&lt;br /&gt;Distributed Cruise&lt;br /&gt;Condor Tests&lt;br /&gt;Opteron Tests&lt;br /&gt;Java/Ruby-Watir Gui tests&lt;br /&gt;Toplink prebuilt expressions&lt;br /&gt;Separation of Master tests&lt;br /&gt;Toplink mapping of Views&lt;br /&gt;Automatic Db Validation&lt;br /&gt;Pluggable Java Royalties calculations&lt;br /&gt;Single GUI Dtos&lt;br /&gt;Self calculating allocations&lt;br /&gt;MyTestSuite automated generation&lt;br /&gt;Date Effective Snapshot&lt;br /&gt;MultiRow Importer for Excel&lt;br /&gt;Value Objects&lt;br /&gt;Monthly Measurements&lt;br /&gt;Homes&lt;br /&gt;Balancers&lt;br /&gt;Initializers&lt;br /&gt;Allocation Visitors&lt;br /&gt;Xml Beans&lt;br /&gt;Profiler&lt;br /&gt;Database Façade&lt;br /&gt;Form Helpers&lt;br /&gt;Warning Handlers&lt;br /&gt;Automatic Error Handling &amp;amp; Display&lt;br /&gt;HSSQL for database tests&lt;br /&gt;1 click Db generation&lt;br /&gt;Test Profiling&lt;br /&gt;GUI Profiling&lt;br /&gt;5 ideas&lt;br /&gt;Strategic Pairing&lt;br /&gt;Team/Spoc Planning&lt;br /&gt;Team Pods&lt;br /&gt;Bug fix race chart&lt;br /&gt;Burn up/down chart&lt;br /&gt;Bug categorization chart&lt;br /&gt;Refactoring Criteria&lt;br /&gt;Macker&lt;br /&gt;&lt;br /&gt;Be proud.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112814644940650846?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112814644940650846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112814644940650846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112814644940650846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112814644940650846'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/innovations-on-agile-team.html' title='Innovations on an Agile Team'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112753751981148542</id><published>2005-09-23T22:45:00.000-06:00</published><updated>2005-09-23T22:51:59.813-06:00</updated><title type='text'>Colin Cassie</title><content type='html'>A big thanks to Colin Cassie - our soon to be ex-project manager. He's on his way to retirement now, after giving a great boost to our project. His patience and experience were greatly appreciated by all. The way in which he allowed all those under him to work has made the project as great as it is.&lt;br /&gt;&lt;br /&gt;The biggest lessons I've learned from Cassie (we all call him Caesar) is 1) to let those who work for you do what they do best, and 2) to stop those you work for from interfering with those who work for you.&lt;br /&gt;&lt;br /&gt;Thanks Colin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112753751981148542?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112753751981148542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112753751981148542' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112753751981148542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112753751981148542'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/colin-cassie.html' title='Colin Cassie'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112753712946522886</id><published>2005-09-23T22:26:00.000-06:00</published><updated>2005-09-23T22:55:47.940-06:00</updated><title type='text'>Individual Training</title><content type='html'>&lt;p&gt;How do you get people up to speed really quickly on a project? We have 26 developers on our project 8 of whom are absolutely new. How do we train them?&lt;br /&gt;&lt;br /&gt;We offered our people (new and old) a range of training opportunities. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;A couple of courses on the business&lt;/li&gt;&lt;li&gt;A bunch of courses on the app&lt;/li&gt;&lt;li&gt;Browsing Code Alone&lt;/li&gt;&lt;li&gt;Fixing bugs Alone&lt;/li&gt;&lt;li&gt;Pairing with a Newbie on a story&lt;/li&gt;&lt;li&gt;Pairing with a Senior on a Story&lt;/li&gt;&lt;li&gt;Pairing with a Senior on a refactoring&lt;/li&gt;&lt;li&gt;Pairing with Newbie on bugs&lt;/li&gt;&lt;li&gt;Working in a larger group to implement a story with Senior direction.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Which one got chosen? Well everyone had a different answer. Each chose a different combination. The best choice for training is to let the trainee tell you what they need.&lt;br /&gt;&lt;br /&gt;Interestingly they all accepted the courses designed to describe the business and the implementations. There were 6 of them (1-2 hours each, 2/day).&lt;br /&gt;&lt;br /&gt;Thanks to Colin Cassie for encouraging this direction.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112753712946522886?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112753712946522886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112753712946522886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112753712946522886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112753712946522886'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/individual-training.html' title='Individual Training'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112744957020835081</id><published>2005-09-22T22:24:00.000-06:00</published><updated>2005-09-22T22:28:13.550-06:00</updated><title type='text'>Stupid Ideas that help me.</title><content type='html'>&lt;p&gt;&lt;a href="http://savemyass.com/home"&gt;This &lt;/a&gt;is funny. Having forgot my wifes birthday once, I might sign up. Oddly appealing.&lt;/p&gt;&lt;p&gt;Thanks Jeff.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112744957020835081?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112744957020835081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112744957020835081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112744957020835081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112744957020835081'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/stupid-ideas-that-help-me.html' title='Stupid Ideas that help me.'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112736053342944715</id><published>2005-09-21T21:06:00.000-06:00</published><updated>2005-09-21T22:03:22.946-06:00</updated><title type='text'>Get it in production...</title><content type='html'>Mostly when you're implementing a software system, you're replacing existing software. Be it a COBOL application, a pen and paper process, something people do on a calculator, or in a spreadsheet. Software usually isn't doing something new. Just replacing the old. This helps you prioritize.&lt;br /&gt;&lt;br /&gt;Your goal is to be in production. Yesterday. On the first day of the project you should be PANICKING that you aren't in production yet. You're losing money everyday. Software in development has a present value of exactly $0.&lt;br /&gt;&lt;br /&gt;This means really hard decisions when prioritizing stories. Here's some rules:&lt;br /&gt;&lt;br /&gt;1) If you're rewriting a system - &lt;em&gt;your new system shouldn't be able to do as much as your old system before going into production&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Your old system has a bunch of unused features. Ditch those. If you only use a feature in a couple of places, consider a work-around.&lt;br /&gt;&lt;br /&gt;2) &lt;em&gt;Your new system doesn't need to do anything new&lt;/em&gt;. Unless you're about to be sued, there are no risks in putting in a system that does exactly the same thing. And if you're about to be sued it has nothing to do with the software.&lt;br /&gt;&lt;br /&gt;You're rewriting because the technology is outdated: meaning hard to update and buggy. See if the new system solves that problem first, before slapping all sorts of new features in it.&lt;br /&gt;&lt;br /&gt;3) If you have a work-around OUTSIDE the system, keep it outside the system. You will lose almost nothing adding it to the system afterwards, if it holds up production - you're losing money.&lt;br /&gt;&lt;br /&gt;4) Now look at what you've asked for. Find a way to just replace a piece of the system at a time. If you can break it into 3 or six months bits, you'll be a lot better off. Don't screw yourself.&lt;br /&gt;&lt;br /&gt;Continue to panic about getting into production. If you ever stop panicking, you are screwed.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NOW YOU'RE IN PRODUCTION. You know a lot more. &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;You can evaluate whether or not you were successful in replacing your old system. Was it easier to get into production? Was it less buggy? Make your decision about whether or not to proceed.&lt;br /&gt;&lt;br /&gt;WHEN you do go into production as a customer: INSIST INSIST INSIST that you see all the automated tests that cover the bugs you discover in acceptance testing. At least you won't have to worry about these during your next acceptance test.&lt;br /&gt;&lt;br /&gt;If it's not less buggy and harder to get into production - decide whether to improve it or ditch it. Thank god you didn't waste a pile of money implementing all those new features.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;NOW YOU'RE READY TO ADD A NEW FEATURE.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Start implementing the rest of the features. Make sure your next release is no more than six months away. Create as many of them as you can handle.&lt;br /&gt;&lt;br /&gt;1) Implement all the things you are missing and everyone is bitching about.&lt;br /&gt;&lt;br /&gt;Wow Feedback. Get it into production. If it's more than 6 months get it into multiple releases.&lt;br /&gt;&lt;br /&gt;2) Implement your workarounds that you are currently using. You'll be solving real problems. Multiple frequency x average length of task. The higher the number the higher the priority.&lt;br /&gt;&lt;br /&gt;Easy equation for prioritization. Only six months of features. No more. Get it into production.&lt;br /&gt;&lt;br /&gt;3) Implement the new cool stuff.&lt;br /&gt;&lt;br /&gt;You are now free to prioritize anyway you like, remember though you'll have some more of #2's popping up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112736053342944715?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112736053342944715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112736053342944715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112736053342944715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112736053342944715'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/get-it-in-production.html' title='Get it in production...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112735826785267153</id><published>2005-09-21T20:38:00.000-06:00</published><updated>2005-09-21T21:06:45.356-06:00</updated><title type='text'>I won't lie, I won't lie, I won't lie, I won't lie, I won't lie, I won't lie</title><content type='html'>One of the problems with Agile is the fact that :&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Everyone likes a fixed-price, fixed-scope contract.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, as pointed out by anyone worth their salt in our field:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;THIS IS NOT POSSIBLE on any project of significant size.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;(Martin Fowler, Eric Evans, Kent Beck, Ron Jeffries, Mary and Tom Poppendieck etc...). You can try and wrap the package up anyway you like...list of features, fixed number of stories, written specifications. It will defy all attempts to put scope and features in the same box. Our field has not matured enough yet. It will probably be at least a hundred years, yet.&lt;br /&gt;&lt;br /&gt;The huge downfall of Agile, is that it constantly tells the user, "no, we're not on the fixed priced/fixed scope schedule, we're behind". Our profession is full of people willing to say I can do X for Y dollars. Generally, they believe they are telling the truth. They aren't. On some projects the customer doesn't find out until the end. Predicting a software project scope and schedule is like trying to know the speed and location of an electron: physicists have proved it impossible.&lt;br /&gt;&lt;br /&gt;I never want to lie to my customer. I want my customer as informed as I am. I tell them each and every month where I am. If they're disappointed, that is unfortunate, but at least they have the truth. The decisions they have to make EVERY ITERATION about scope and time ARE HARD. If you don't want to make those decisions, leave it to me and I'll make the best ones I can.&lt;br /&gt;&lt;br /&gt;I promise you a couple of things people who say we can do it on schedule and on budget won't: I'll show you every iteration how much we got working and I won't lie to you, ever - even when it's painful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112735826785267153?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112735826785267153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112735826785267153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112735826785267153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112735826785267153'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/i-wont-lie-i-wont-lie-i-wont-lie-i.html' title='I won&apos;t lie, I won&apos;t lie, I won&apos;t lie, I won&apos;t lie, I won&apos;t lie, I won&apos;t lie'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112698008134756661</id><published>2005-09-17T11:51:00.000-06:00</published><updated>2005-09-17T12:01:21.353-06:00</updated><title type='text'>Remember your needs</title><content type='html'>Sometimes, things change in our life. Along the way we discover we need to make accomodation for new events, crisis, or on going things in our life. We are never the same person and we need to change our habits to accomodate these things.&lt;br /&gt;&lt;br /&gt;How do we deal with this? The same way we deal with everything else. Try something. It may not work, it may require modification, but you'll learn something and probably come up with another better idea.&lt;br /&gt;&lt;br /&gt;Even more important, is to communicate. Joe lost his dog a few weeks ago. It was painful and difficult for him to deal with. He discussed it with us and we were able to accomodate his needs.&lt;br /&gt;&lt;br /&gt;Funny, the proudest moments of a leader are when they can accomodate someones needs. It means that what they do is about the people as well as the work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112698008134756661?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112698008134756661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112698008134756661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112698008134756661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112698008134756661'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/remember-your-needs.html' title='Remember your needs'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112675393279584879</id><published>2005-09-14T20:57:00.000-06:00</published><updated>2005-09-14T21:22:08.863-06:00</updated><title type='text'>Trout Fishing in America in Calgary</title><content type='html'>&lt;a href="http://www.troutmusic.com/"&gt;Trout Fishing in America&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you have kids who are between the ages of 4 and 10, you'll love these guys. They are funny for adults and kids. Make sure you go to the Childrens concert on September 25th (NOT the adult one on the 24th).&lt;br /&gt;&lt;br /&gt;Sunday 09/25 2005&lt;br /&gt;&lt;br /&gt;You can get tickets at:&lt;br /&gt;&lt;br /&gt;(403)288-2616 -  &lt;a href="http://www.calgaryarea.ca/bulletin/view_bbb.asp?MessageID=8464&amp;Community=ss"&gt;http://www.calgaryarea.ca/bulletin/view_bbb.asp?MessageID=8464&amp;amp;Community=ss&lt;/a&gt; - All profits to be donated to the Alberta Children's Hospital.&lt;br /&gt;&lt;br /&gt;You can find some of their music on the trout fishing in america radio. Click on&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.k-ampplayer.com/kampplayers/run_kamp.php?cID=1c2c82dd3c0a3ab"&gt;http://www.k-ampplayer.com/kampplayers/run_kamp.php?cID=1c2c82dd3c0a3ab&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Look for the songs "18 wheels on a big rig" and "mine". Lots of fun. Lots of energy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112675393279584879?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112675393279584879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112675393279584879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112675393279584879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112675393279584879'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/trout-fishing-in-america-in-calgary.html' title='Trout Fishing in America in Calgary'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112667103931157517</id><published>2005-09-13T22:08:00.000-06:00</published><updated>2005-09-13T22:10:39.316-06:00</updated><title type='text'>Letter to Culligan</title><content type='html'>To Whom It May Concern,&lt;br /&gt;&lt;br /&gt;Just thought you should know we have cancelled our service contract with Culligan. We signed up for the service where for $49 we would get a water cooler rental free and 4 water bottles to start.&lt;br /&gt;&lt;br /&gt;We were assured that we would use three bottles a month for 22.95. Okay, sounds reasonable, as I've never used water bottles before.&lt;br /&gt;&lt;br /&gt;We used two. We received three.&lt;br /&gt;&lt;br /&gt;We used two. We received three. Kids are wondering why we need so much water.&lt;br /&gt;&lt;br /&gt;We called and asked for two. Okay we were told. We received three. Kids are now walking around water bottles in our house.&lt;br /&gt;&lt;br /&gt;We called and asked for two. No, we were told the contract says three. Great, that helps. We received three. Kids are now tripping over water bottles.&lt;br /&gt;&lt;br /&gt;We called and said stop delivering water please. Apparently, now, we need to pay rent ($15) on the water cooler because we have no water. Right, what's in all these bottles? Kids agree it is water.&lt;br /&gt;&lt;br /&gt;In fear of being forced out of the house by the ever accumulating water bottles, we called on August 30th and cancelled service. Cooler was picked up along with (full) bottles. Kids were relieved that we chose them over the water.&lt;br /&gt;&lt;br /&gt;Received a bill Sept 1st for September rental of water cooler. I am unlikely to pay it. My account number is ...&lt;br /&gt;&lt;br /&gt;Please, please, please deal with it.&lt;br /&gt;&lt;br /&gt;Your perplexed, water logged ex-customer,&lt;br /&gt;&lt;br /&gt;Ted O'Grady&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112667103931157517?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112667103931157517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112667103931157517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112667103931157517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112667103931157517'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/letter-to-culligan.html' title='Letter to Culligan'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112657538654167277</id><published>2005-09-12T19:31:00.000-06:00</published><updated>2005-09-12T19:36:26.546-06:00</updated><title type='text'>Pushing the limits</title><content type='html'>We're hitting the limits of patience, and really interruptability. Our tests despite the in memory stuff are now 10 minutes. (5400 tests). They do lots of stuff.&lt;br /&gt;&lt;br /&gt;One of our guys is implementing Grid unit. Fortunately, developers spend lots of time thinking leaving lots of spare CPU cycles lying around. Combined with a dual cored - dual Opteron box we expect our test time to go sub 1 minute.&lt;br /&gt;&lt;br /&gt;Long tests have many bad impacts:&lt;br /&gt;1) Long queues to check in (large team)&lt;br /&gt;2) Disruption in thought process&lt;br /&gt;3) Disruption in momentum&lt;br /&gt;&lt;br /&gt;Thanks to Vlad, Zach and Alex and all the others that have provided different seeds on the team to thinking about how to speed up the tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112657538654167277?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112657538654167277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112657538654167277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112657538654167277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112657538654167277'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/pushing-limits.html' title='Pushing the limits'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112622719572479914</id><published>2005-09-08T18:51:00.000-06:00</published><updated>2005-09-08T18:54:27.776-06:00</updated><title type='text'>Working with India</title><content type='html'>Going to be working with an Indian team on our project. Should be interesting. Need to figure out all sorts of stuff. Need to email Jane, get the in the trenches view of things. She is doing it with thoughtworks. If there is anyone who can figure this sort of stuff out and make it work, it is Jane.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112622719572479914?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112622719572479914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112622719572479914' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112622719572479914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112622719572479914'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/working-with-india.html' title='Working with India'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112622707200675648</id><published>2005-09-08T18:36:00.000-06:00</published><updated>2005-09-08T18:51:12.010-06:00</updated><title type='text'>How do we measure progress?</title><content type='html'>One of the things waterfall projects have over XP projects is Gantt charts. In the middle of the project they give your customer confidence that you are proceeding according to schedule. they put off the pain until the end when the charts need to be extended by testing and such.&lt;br /&gt;&lt;br /&gt;In XP we can only tell them what we did. Customers want a measure that tells them you did as much this month as you did last month and how much is left and how long it will take. Velocity measures yesterdays weather. On other projects we have capped the budget, and report what we think the last story will be.&lt;br /&gt;&lt;br /&gt;On this project we want to cap the time, complete a specified number of stories (2400), and budget is less of an issue. We don't do design up front - we do incremental requirements (stories). The last couple of sprints, our velcoity has decreased. In our estimation the stories have gotten bigger (have more pieces to them). What can we use to be honest with ourselves? Have our stories gotten bigger? Or has our code become more complex and we've slowed down? How do we measure this so we don't lie to ourselves? How do we measure this so we can explain to the customer?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112622707200675648?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112622707200675648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112622707200675648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112622707200675648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112622707200675648'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/how-do-we-measure-progress.html' title='How do we measure progress?'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112622568976862822</id><published>2005-09-08T18:23:00.000-06:00</published><updated>2005-09-08T18:28:09.773-06:00</updated><title type='text'>Where do I sort?</title><content type='html'>Sometimes there are questions about where sorting should occur.&lt;br /&gt;&lt;br /&gt;1) Should I sort in the database?&lt;br /&gt;2) Should I sort in the business layer?&lt;br /&gt;3) Should I sort in the display layer?&lt;br /&gt;&lt;br /&gt;The time you need to sort - is when you need a sorted collection. You cannot rely on someone else having given you a collection in the correct order, thsi tends to make thing hard to understand and refactor.&lt;br /&gt;&lt;br /&gt;For example, if you sort in the database - how does your display layer have any knowledge of how things are sorted? How does it know the sort order won't change? The safest thing to do is sort at the point where it is obvious you need to sort. Sometimes that will be in the business logic, other times in teh database, and other times in the display layer.&lt;br /&gt;&lt;br /&gt;But, you say, I might create a performance problem if I sort too often!&lt;br /&gt;&lt;br /&gt;Wait until it's a problem - it probably won't matter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112622568976862822?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112622568976862822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112622568976862822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112622568976862822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112622568976862822'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/where-do-i-sort.html' title='Where do I sort?'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112570468197618913</id><published>2005-09-02T17:28:00.000-06:00</published><updated>2005-09-02T17:44:41.983-06:00</updated><title type='text'>We are connected</title><content type='html'>I live in Calgary, Alberta, Canada. It's a city of a million people. I purchase my domain hosting from directnic. I used to have no idea where they were located. They have provided excellent service, and I have never needed to actually talk to them.&lt;br /&gt;&lt;br /&gt;Now I know they are located in New Orleans. I hope they and their families have escaped the carnage and thank them for their service. The best thing I can do to help is be a patient customer. I will be there when they're ready. We're all connected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112570468197618913?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112570468197618913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112570468197618913' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112570468197618913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112570468197618913'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/09/we-are-connected.html' title='We are connected'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112511627854412882</id><published>2005-08-26T22:16:00.000-06:00</published><updated>2005-08-26T22:17:58.553-06:00</updated><title type='text'>Sonexis Raises Money</title><content type='html'>&lt;a href="http://boston.bizjournals.com/boston/stories/2005/08/01/daily10.html"&gt;http://boston.bizjournals.com/boston/stories/2005/08/01/daily10.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Interesting. Software I helped build a few years ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112511627854412882?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112511627854412882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112511627854412882' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112511627854412882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112511627854412882'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/08/sonexis-raises-money.html' title='Sonexis Raises Money'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112247326877362969</id><published>2005-07-27T08:03:00.000-06:00</published><updated>2005-07-27T08:07:48.780-06:00</updated><title type='text'>Developing software is a force of will...</title><content type='html'>Software gets complex whether you want it to or not. There are no magic bullets when it comes to developing software, following the right process or doing the right steps guarantees you nothing.&lt;br /&gt;&lt;br /&gt;There are a couple of things that I've seen on all my successful software projects:&lt;br /&gt;&lt;br /&gt;1) Force of will - willingness to do what it takes to make stuff work&lt;br /&gt;2) Self discipline - trying to keep yourself from making the problem more complex than it is&lt;br /&gt;&lt;br /&gt;These are things that come for free with good people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112247326877362969?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112247326877362969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112247326877362969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112247326877362969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112247326877362969'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/developing-software-is-force-of-will.html' title='Developing software is a force of will...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112234683912032237</id><published>2005-07-25T20:58:00.000-06:00</published><updated>2005-07-25T21:00:39.120-06:00</updated><title type='text'>Holidays!</title><content type='html'>I'll be in Ontario/Quebec in August. Three weeks. Looking forward to spinning down, maybe do a little exploratory coding. Should see what Mark is up to...find some place in the middle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112234683912032237?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112234683912032237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112234683912032237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112234683912032237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112234683912032237'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/holidays.html' title='Holidays!'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112234671408224312</id><published>2005-07-25T20:57:00.000-06:00</published><updated>2005-07-25T20:58:34.090-06:00</updated><title type='text'>More Developers</title><content type='html'>We're hiring again. Another team, more developers.&lt;br /&gt;&lt;br /&gt;Interviewing is keeping me busy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112234671408224312?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112234671408224312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112234671408224312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112234671408224312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112234671408224312'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/more-developers.html' title='More Developers'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112191792174206428</id><published>2005-07-20T21:43:00.000-06:00</published><updated>2005-07-20T21:52:28.316-06:00</updated><title type='text'>The Power of 5 Ideas</title><content type='html'>We have asked our developers to come up with multiple ideas for each problem they're trying to solve. (One of Eric Evans recommendations). We were having the problem where we found one solution and made that work, rather than finding multiple solutions and selecting the best. To start we've asked for five. Bad ideas are as welcome as good ideas. It has had some interesting side effects.&lt;br /&gt;&lt;br /&gt;Some observations of Zachs team:&lt;br /&gt;&lt;br /&gt;1) Coming up with five ideas requires both partners in a pair to work together to come up with ideas. This leads to cooperation when creating ideas, more willingness to listen to other peoples ideas.&lt;br /&gt;&lt;br /&gt;2) When coding, the idea seems to belong to both of you. It is no longer one persons idea, the act of writing them down together makes them everyones ideas. Coding can become more cooperative.&lt;br /&gt;&lt;br /&gt;3) Just generating ideas makes you more open to change, and less tied to any single idea.&lt;br /&gt;&lt;br /&gt;Nice unexpected benefits of introducing another good habit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112191792174206428?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112191792174206428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112191792174206428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112191792174206428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112191792174206428'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/power-of-5-ideas.html' title='The Power of 5 Ideas'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112173763870795788</id><published>2005-07-18T19:28:00.000-06:00</published><updated>2005-07-18T19:47:18.713-06:00</updated><title type='text'>Behaviour or test driven development?</title><content type='html'>Dave Astels thinks it is important to change our idea of test driven to behaviour driven development. &lt;a href="http://daveastels.com/index.php?p=5"&gt;http://daveastels.com/index.php?p=5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Brian Marick thinks we should ask users to provide examples rather than tests.&lt;br /&gt;&lt;br /&gt;Gerard Meszaros writes Unit tests to reveal object behaviour.&lt;br /&gt;&lt;br /&gt;We write Functional tests rather than Design tests. It makes refactoring easier.&lt;br /&gt;&lt;br /&gt;Which is right?&lt;br /&gt;&lt;br /&gt;Well all of them provide focus on different aspects of the testing/behaviour of the system. They are all revealing the importance of different aspects of test driven development. Why do we need to choose one? Really, we don't. At different times each of them will become important.&lt;br /&gt;&lt;br /&gt;Sometimes I want to describe the behaiour of the system. Sometime I want an seminal example of the system. Sometimes I want to drive my implementation. Sometimes I want a regression suite. They are all important at different times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112173763870795788?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112173763870795788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112173763870795788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112173763870795788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112173763870795788'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/behaviour-or-test-driven-development.html' title='Behaviour or test driven development?'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112173649570628634</id><published>2005-07-18T19:19:00.000-06:00</published><updated>2005-07-18T19:28:15.706-06:00</updated><title type='text'>Found Dave Astels again...</title><content type='html'>Added his latest blog to my blog roll.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112173649570628634?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112173649570628634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112173649570628634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112173649570628634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112173649570628634'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/found-dave-astels-again.html' title='Found Dave Astels again...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112061718269110849</id><published>2005-07-05T20:31:00.000-06:00</published><updated>2005-07-05T20:33:02.690-06:00</updated><title type='text'>Mentoring</title><content type='html'>Mentoring is always a fun mix of:&lt;br /&gt;&lt;br /&gt;1) Explaining&lt;br /&gt;2) Letting someone do on their own&lt;br /&gt;3) Demonstrating&lt;br /&gt;&lt;br /&gt;It's especially fun to mentor someone whose bright.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112061718269110849?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112061718269110849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112061718269110849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112061718269110849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112061718269110849'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/mentoring.html' title='Mentoring'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112061705557396247</id><published>2005-07-05T20:27:00.000-06:00</published><updated>2005-07-05T20:34:21.546-06:00</updated><title type='text'>Theories and Experimentation are like ...</title><content type='html'>Models and Coding.&lt;br /&gt;&lt;br /&gt;Many models are good, they let you think of thing in different ways. They don't have any answers - only questions.&lt;br /&gt;&lt;br /&gt;Coding is an experiment to see if a model works out. Some are right and some are wrong. And some are good enough for our current understanding.&lt;br /&gt;&lt;br /&gt;Don't get hung up on your model (theory) or your code (experiment).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112061705557396247?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112061705557396247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112061705557396247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112061705557396247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112061705557396247'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/theories-and-experimentation-are-like.html' title='Theories and Experimentation are like ...'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112044647844374105</id><published>2005-07-03T20:57:00.000-06:00</published><updated>2005-07-03T21:07:58.443-06:00</updated><title type='text'>A Productive Team</title><content type='html'>The team I'm currently working on is highly productive. They motor through stories on a regular basis, there is little waste. They have a lot to be proud of. It makes my job easy.&lt;br /&gt;&lt;br /&gt;On the other side the lack of waste also means a lack of slack - time to think and reflect on what you are doing. In the last week we allowed the team to "innovate" - take four days and do anything but stories. After being heads down for so long this week was a welcome relief, but also a huge learning experience for them. The payoffs for the project will be huge. People refactored, explored new ideas, and learned on their own for over 4 days.&lt;br /&gt;&lt;br /&gt;In the past we have said to the team that they have at least four hours a week to innovate, that they should apply that however they can. The decision to defer a story for learning time is a hard one for a hard driving team and they haven't been able to make use of that time.&lt;br /&gt;&lt;br /&gt;We will now be asking them to figure out how "innovate" like we did this week. They'll need to figure out strategies to be able to do it while developing stories. And I know we'll only gain productivity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112044647844374105?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112044647844374105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112044647844374105' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112044647844374105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112044647844374105'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/productive-team.html' title='A Productive Team'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-112044585277008031</id><published>2005-07-03T20:56:00.000-06:00</published><updated>2005-07-03T20:57:32.776-06:00</updated><title type='text'>Tests</title><content type='html'>For those who are counting we now have 4700 tests running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-112044585277008031?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/112044585277008031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=112044585277008031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112044585277008031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/112044585277008031'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/07/tests.html' title='Tests'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111993159999573840</id><published>2005-06-27T21:59:00.000-06:00</published><updated>2005-06-27T22:06:40.003-06:00</updated><title type='text'>Problems and Solutions</title><content type='html'>Problems finding solutions.&lt;br /&gt;Solutions finding problems.&lt;br /&gt;&lt;br /&gt;Both are valid ways to uncover new ground. But remember which you are doing. If you have a problem and are looking for a solution - explore many solutions. You want to understand the best fit for this problem.&lt;br /&gt;&lt;br /&gt;If you are a solution looking for a problem - explore many problems. You are looking to see if this solution solves any of the problems you currently have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111993159999573840?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111993159999573840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111993159999573840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111993159999573840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111993159999573840'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/problems-and-solutions.html' title='Problems and Solutions'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111971191557080980</id><published>2005-06-25T08:55:00.000-06:00</published><updated>2005-06-25T09:05:16.003-06:00</updated><title type='text'>Business is Personal</title><content type='html'>I often hear the expression "It's nothing personal it's just business".&lt;br /&gt;&lt;br /&gt;Really? In our culture we tie our jobs very closely with our personal life.&lt;br /&gt;&lt;br /&gt;Our business relationships are built on &lt;strong&gt;trust&lt;/strong&gt;. We are &lt;strong&gt;dedicated &lt;/strong&gt;to our work. We work well in evironments that are &lt;strong&gt;fun &lt;/strong&gt;and &lt;strong&gt;friendly&lt;/strong&gt;. When work goes badly we are &lt;strong&gt;stressed.&lt;/strong&gt; Most people I know think about work in their spare time, trying to make it &lt;strong&gt;better.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;We &lt;strong&gt;live&lt;/strong&gt;, and expect people to move, close to work. We expect people to spend 40 hours a week with their coworkers. Many companies try to create an atmosphere where work is another &lt;strong&gt;family. &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Business is personal. People who are laid off (for financial reasons) take it &lt;strong&gt;personally&lt;/strong&gt;. Why did you choose me instead of them?&lt;br /&gt;&lt;br /&gt;As a leader you must understand business is personal. The decisions you make affect people personally. Although you must make them for business reasons, you must realize the personal impact.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111971191557080980?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111971191557080980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111971191557080980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111971191557080980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111971191557080980'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/business-is-personal.html' title='Business is Personal'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111906795702750030</id><published>2005-06-17T22:08:00.000-06:00</published><updated>2005-06-17T22:12:37.033-06:00</updated><title type='text'>Refinement</title><content type='html'>Courtesy Colin Cassies and Colin Jones:&lt;br /&gt;&lt;br /&gt;The reason we revisit code is to refine it.&lt;br /&gt;&lt;br /&gt;This is the same you would do with a word document, or a powerpoint presentation. The first time you write your words on a page, they lack form and often substance. They do not flow together well. You write and rewrite until the points you make are clear, concise and meaningful.&lt;br /&gt;&lt;br /&gt;Welcome to refactoring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111906795702750030?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111906795702750030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111906795702750030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111906795702750030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111906795702750030'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/refinement.html' title='Refinement'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111818187862115434</id><published>2005-06-07T16:01:00.000-06:00</published><updated>2005-06-07T16:04:38.630-06:00</updated><title type='text'>Strategy 8 - can't move anything</title><content type='html'>You don't like how the code looks. Your methods are eight lines long, but they only call methods in your current object. Moving those methods is not easy because they reference the current object.&lt;br /&gt;&lt;br /&gt;Refactor by Inlining. You need to find different ways to break up the methods, so that dependency on the current object is broken. Once you've inlined everything, try moving stuff around grouping it different ways. Then extract methods and see if you can move them elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111818187862115434?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111818187862115434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111818187862115434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111818187862115434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111818187862115434'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-8-cant-move-anything.html' title='Strategy 8 - can&apos;t move anything'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111817664849418265</id><published>2005-06-07T14:35:00.000-06:00</published><updated>2005-06-07T14:37:28.500-06:00</updated><title type='text'>Strategy 7 - Method longer than 10 lines</title><content type='html'>If your method is longer than 10 lines you might be on the verge of being procedural.&lt;br /&gt;&lt;br /&gt;Try using the extract/compose method refactoring (basically your method indentation should be a most one deep). Then look to see if those pieces you removed could be moved elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111817664849418265?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111817664849418265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111817664849418265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111817664849418265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111817664849418265'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-7-method-longer-than-10-lines.html' title='Strategy 7 - Method longer than 10 lines'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111811187245754253</id><published>2005-06-06T20:36:00.000-06:00</published><updated>2005-06-06T20:37:52.463-06:00</updated><title type='text'>Strategy 6 - Still too many ifs</title><content type='html'>You tried moving stuff around and still ended up with ifs.&lt;br /&gt;&lt;br /&gt;Refactor the ifs into the setup - you may find a factory allows you to create the appropriate object for the appropriate if.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111811187245754253?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111811187245754253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111811187245754253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111811187245754253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111811187245754253'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-6-still-too-many-ifs.html' title='Strategy 6 - Still too many ifs'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111810911115386322</id><published>2005-06-06T19:51:00.000-06:00</published><updated>2005-06-06T19:54:48.776-06:00</updated><title type='text'>Strategy 5. Make your code sound like the business</title><content type='html'>If your code sounds nothing like the business problem you're implementing you're going to have trouble refactoring. You have implementation concepts mixed with business concepts.&lt;br /&gt;&lt;br /&gt;Convert your code to sound like the business and your changes will be a little bit easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111810911115386322?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111810911115386322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111810911115386322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810911115386322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810911115386322'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-5-make-your-code-sound-like.html' title='Strategy 5. Make your code sound like the business'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111810203010394611</id><published>2005-06-06T17:53:00.000-06:00</published><updated>2005-06-06T19:05:08.860-06:00</updated><title type='text'>Strategy 4 - Too many loops</title><content type='html'>If there are too many loops in your code the responsibility is in the wrong place.&lt;br /&gt;&lt;br /&gt;Refactor. Each method should have about 1 loop. I find drawing a sequence diagram here quite useful. Usually you need to inject another object or push the inner loops elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111810203010394611?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111810203010394611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111810203010394611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810203010394611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810203010394611'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-4-too-many-loops.html' title='Strategy 4 - Too many loops'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111810198032003770</id><published>2005-06-06T17:51:00.000-06:00</published><updated>2005-06-06T19:03:55.503-06:00</updated><title type='text'>Strategy 3 - A bunch of Ifs</title><content type='html'>If you see too many ifs in your code and if you can't understand it and if the ifs are used all the time (you get my point)...&lt;br /&gt;&lt;br /&gt;Refactor. Maybe subclassing or delegation will help. Look at what the ifs are operating on - if they are on another object you probably need to move responsibility to another object.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111810198032003770?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111810198032003770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111810198032003770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810198032003770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810198032003770'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-3-bunch-of-ifs.html' title='Strategy 3 - A bunch of Ifs'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111810190161431375</id><published>2005-06-06T17:50:00.000-06:00</published><updated>2005-06-06T19:02:45.390-06:00</updated><title type='text'>Strategy 2 - Code doesn't reflect conversations</title><content type='html'>If your code and your conversation about how things work are different...&lt;br /&gt;&lt;br /&gt;Refactor. The code is trying to do stuff in a different way. Probably it has evolved from a point where it described exactly what the user specified. Along the way special cases were added and more functionality. Now that your understanding has evolved so can your code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111810190161431375?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111810190161431375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111810190161431375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810190161431375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810190161431375'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-2-code-doesnt-reflect.html' title='Strategy 2 - Code doesn&apos;t reflect conversations'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111810184806284195</id><published>2005-06-06T17:49:00.000-06:00</published><updated>2005-06-06T19:00:40.056-06:00</updated><title type='text'>Strategy 1 - Lots of bugs</title><content type='html'>Testing finding lots of bugs in your code?&lt;br /&gt;&lt;br /&gt;Refactor for clarity. Look at the method names. Look for ifs and loops as places to refactor. Look at responsibility - is the guy with the data doing the work, or is someone else?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111810184806284195?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111810184806284195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111810184806284195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810184806284195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810184806284195'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/strategy-1-lots-of-bugs.html' title='Strategy 1 - Lots of bugs'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111810175505356649</id><published>2005-06-06T17:26:00.000-06:00</published><updated>2005-06-06T17:49:15.060-06:00</updated><title type='text'>Sophisticated Software Development</title><content type='html'>When I'm out, it is nice to be sophisticated every once in a while. However, in general I'm an ordinary guy with a wife, two kids and a dog who enjoys some terrible TV shows.&lt;br /&gt;&lt;br /&gt;My coding is about the same. Sometimes I can write really, really nice code. Small, tight and sophisticated.  A bunch of the time I'm just an ordinary guy. Being sophisticated is work, and really, like most people I can't (No matter how much I try) pull it off all the time. Yes, duplicate code is bad. But I think 2 duplications is better than 3 duplications. I'll try harder on the third duplication to make them all the same than the second.&lt;br /&gt;&lt;br /&gt;Sophistication is a sign of maturity. Most of the code I write is new and hot off the press. Making it sophisticated is really hard when it's new. My code will get more sophisticated (read less duplication, more intention revealing) as it gets older and more experienced (ok, more used, refactored).&lt;br /&gt;&lt;br /&gt;Sometimes I think the XP community is just trying to move the problem around from: "you need to be really smart to design" (waterfall) to "you need to be really smart to code" (XP - no duplication, write intention revealing code). Agile will fail if all the projects need the top 10% of developers. Agile must work for ordinary development teams.&lt;br /&gt;&lt;br /&gt;I think we need to stop telling ordinary developers they need to get smarter about writing code  and start showing them how to help their code get sophisticated as it gets older. Strategies for figuring out how and when to refactor AND redesign AND where to move the responsibility will help a lot more than asking them to get it "right".&lt;br /&gt;&lt;br /&gt;Your code should mature as it ages. Maybe I'll write down my strategies...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111810175505356649?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111810175505356649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111810175505356649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810175505356649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111810175505356649'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/sophisticated-software-development.html' title='Sophisticated Software Development'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8123542.post-111799878709641825</id><published>2005-06-05T13:07:00.000-06:00</published><updated>2005-06-05T13:13:07.103-06:00</updated><title type='text'>Smaller objects</title><content type='html'>We're getting rid of a bunch of the visitors in one part of our code. It is interesting to see how a pattern that is extremely useful and concise in an early stage of a project can become a lead weight around your neck later in the project.&lt;br /&gt;&lt;br /&gt;Additionally, the FIT test are also coming into play as we make these deeper refactorings. They point out change that our functional test are missing. The integration of FIT throws up automated warning bells as our refactoring has unexpected side effects. Generally, fixing these mistakes are relatively easy, since our functional tests catch the big errors.&lt;br /&gt;&lt;br /&gt;Finally, the code is becoming more distributed among the object, responsibilities shifted to the people who control the data. All in all, its fun to do and eliminates hundresd of lines of complex code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8123542-111799878709641825?l=tedogrady.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tedogrady.blogspot.com/feeds/111799878709641825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8123542&amp;postID=111799878709641825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111799878709641825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8123542/posts/default/111799878709641825'/><link rel='alternate' type='text/html' href='http://tedogrady.blogspot.com/2005/06/smaller-objects.html' title='Smaller objects'/><author><name>Ted O'Grady</name><uri>http://www.blogger.com/profile/15597547927772779542</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
