<?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'><id>tag:blogger.com,1999:blog-16853210481690002</id><updated>2009-06-18T07:01:51.695-07:00</updated><title type='text'>An Opinion? Well, if you ask...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default?start-index=26&amp;max-results=25'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-8544671436937184396</id><published>2009-06-18T06:34:00.000-07:00</published><updated>2009-06-18T07:01:51.800-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><title type='text'>Criteria for Innovative Success</title><content type='html'>I've got this in my head and want to write it down. I'm still tweaking it, and would like feedback.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Criteria for Innovative Success:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1a) A Shared Vision of Success&lt;/li&gt;&lt;li&gt;1b) Willingness to drive towards that Vision&lt;/li&gt;&lt;li&gt;2) Reflective Problem Solving Staff&lt;/li&gt;&lt;/ul&gt;A Shared Vision is, well, shared. Everyone involved should be able to articulate it, write/draw it on a single white board.&lt;br /&gt;&lt;br /&gt;I split 1) into two parts, or more specifically added the second part. I think that just having a vision isn't sufficient, the will to see it through and cut away what's not helpful is critical. I suppose the metaphor for 1b) would be chipping marble away to make a sculpture.&lt;br /&gt;&lt;br /&gt;"Reflective Problem Solving" is a phrase I got from &lt;a href="http://www.lean.org/Bookstore/ProductDetails.cfm?SelectedProductID=246"&gt;"Managing to Learn"&lt;/a&gt; by John Shook. I've got more to say about this book and will review it when I can, but having a team of people who refectively problem solve is very different than a team that does what it's told.&lt;br /&gt;&lt;br /&gt;In my experience at the &lt;a href="http://leankanbanconference.com/"&gt;Lean Kanban conference&lt;/a&gt; I concluded that a Kanban board with WIP limits is a "concrete reflective tool". I'm now on the hunt for "concrete reflective" tools and ideas, with a strong belief that such tools will be adopted by more teams than abstract or prescriptive tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-8544671436937184396?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/8544671436937184396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=8544671436937184396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8544671436937184396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8544671436937184396'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2009/06/criteria-for-innovative-success.html' title='Criteria for Innovative Success'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-5237555819714856758</id><published>2009-05-26T13:54:00.000-07:00</published><updated>2009-05-27T14:57:48.361-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><title type='text'>Presenting at Austin JUG tonight, Kanban</title><content type='html'>Update: The presentation went well, lots of good questions and conversation.&lt;br /&gt;&lt;br /&gt;Link to the slides: &lt;a href="http://gistlabs.com/john/pubs/2009/05/AJUG/"&gt;http://gistlabs.com/john/pubs/2009/05/AJUG/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm presenting at the &lt;a href="http://www.austinjug.org/"&gt;Austin Java Users Group&lt;/a&gt; tonight, on Kanban.&lt;br /&gt;&lt;br /&gt;The slides will get posted there and on my company website, &lt;a href="http://gistlabs.com/"&gt;http://gistlabs.com&lt;/a&gt;, shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-5237555819714856758?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/5237555819714856758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=5237555819714856758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5237555819714856758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5237555819714856758'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2009/05/presenting-at-austin-jug-tonight-kanban.html' title='Presenting at Austin JUG tonight, Kanban'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-659251749567237283</id><published>2009-05-19T08:35:00.000-07:00</published><updated>2009-05-19T09:54:51.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><title type='text'>Setting up our Kanban board</title><content type='html'>Last week one of my clients and I set up a Kanban board for the team. We did it as a physical board, and we're backing each card with an issue in a tracker.&lt;br /&gt;&lt;br /&gt;We plan to use the issue tracker for these purposes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;generate a Cumulative Flow Diagram (perhaps scripting an export to CSV or Excel)&lt;/li&gt;&lt;li&gt;searchable index of activity&lt;/li&gt;&lt;li&gt;release management tracking&lt;/li&gt;&lt;li&gt;conversation (comments, emails, checkins) for details larger than a notecard&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here's what the board looks like:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6OgRCj2Oqo8/ShLgusUdXJI/AAAAAAAAAEk/Ge2M_4rLhr0/s1600-h/IMG_0339.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_6OgRCj2Oqo8/ShLgusUdXJI/AAAAAAAAAEk/Ge2M_4rLhr0/s320/IMG_0339.JPG" alt="" id="BLOGGER_PHOTO_ID_5337575601163033746" border="0" /&gt;&lt;/a&gt;Some details (that are hard to read):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A Prioritized Queue on the left, highest priority on top&lt;/li&gt;&lt;li&gt;Three workflow/VSM steps: InProgress, Review, Deployment&lt;/li&gt;&lt;li&gt;Review is for developer peer review, and Staging (on QA for general review)&lt;/li&gt;&lt;li&gt;Deployment Ready is available for production deployment, Deployed is recently deployed.&lt;/li&gt;&lt;li&gt;Three swimlanes: two for development activities, one for IT operations support.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This is the current prototype for the cards:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6OgRCj2Oqo8/ShLiijkksrI/AAAAAAAAAEs/Q1HkfXzYY0I/s1600-h/IMG_0337.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_6OgRCj2Oqo8/ShLiijkksrI/AAAAAAAAAEs/Q1HkfXzYY0I/s320/IMG_0337.JPG" alt="" id="BLOGGER_PHOTO_ID_5337577591679529650" border="0" /&gt;&lt;/a&gt;Some of the tools that we use include sticky post-it notes and Stikky Clips. (Note: We found the Stikky Clips at a teacher supply store, not a big office supply store.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6OgRCj2Oqo8/ShLjtxP9rAI/AAAAAAAAAE8/jAKiaK3YXzw/s1600-h/IMG_0338.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 320px;" src="http://1.bp.blogspot.com/_6OgRCj2Oqo8/ShLjtxP9rAI/AAAAAAAAAE8/jAKiaK3YXzw/s320/IMG_0338.JPG" alt="" id="BLOGGER_PHOTO_ID_5337578883841371138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6OgRCj2Oqo8/ShLjnk3N9iI/AAAAAAAAAE0/eQOtAovu2UI/s1600-h/IMG_0334.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_6OgRCj2Oqo8/ShLjnk3N9iI/AAAAAAAAAE0/eQOtAovu2UI/s320/IMG_0334.png" alt="" id="BLOGGER_PHOTO_ID_5337578777437140514" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-659251749567237283?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/659251749567237283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=659251749567237283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/659251749567237283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/659251749567237283'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2009/05/setting-up-our-kanban-board.html' title='Setting up our Kanban board'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6OgRCj2Oqo8/ShLgusUdXJI/AAAAAAAAAEk/Ge2M_4rLhr0/s72-c/IMG_0339.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-8076205430646395247</id><published>2009-05-11T14:21:00.000-07:00</published><updated>2009-05-11T14:22:56.928-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><title type='text'>My Lean Kanban trip report is...</title><content type='html'>Posted up on the Agile Executive Blog.&lt;br /&gt;&lt;br /&gt;See the whole post here: &lt;a href="http://theagileexecutive.com/2009/05/11/john-heintz-on-the-lean-kanban-2009-conference/"&gt;http://theagileexecutive.com/2009/05/11/john-heintz-on-the-lean-kanban-2009-conference/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-8076205430646395247?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/8076205430646395247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=8076205430646395247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8076205430646395247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8076205430646395247'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2009/05/my-lean-kanban-trip-report-is.html' title='My Lean Kanban trip report is...'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-1534390501961553322</id><published>2009-05-11T12:07:00.000-07:00</published><updated>2009-05-11T13:25:44.325-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><title type='text'>Back from the Lean Kanban Conference</title><content type='html'>I'm back and planning on posting to my blog more. I've been posting on Twitter (&lt;a href="http://twitter.com/jheintz"&gt;http://twitter.com/jheintz&lt;/a&gt;) fairly regularly now. Some stuff just doesn't fit within 140 characters...&lt;br /&gt;&lt;br /&gt;The Lean and Kanban conference was awesome: both humbling and inspiring. My trip report will show up on The Agile Executive blog (&lt;a href="http://theagileexecutive.com/"&gt;http://theagileexecutive.com/&lt;/a&gt;) soon... I'll post a direct link.&lt;br /&gt;&lt;br /&gt;Below is a summary of my twitter activity, just to get warmed up.&lt;br /&gt;&lt;br /&gt;&lt;ol class="statuses" id="timeline"&gt;&lt;li class="hentry status u-jheintz mine" id="status_1748671255"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;@&lt;a href="http://twitter.com/TheOtherAlistai"&gt;TheOtherAlistai&lt;/a&gt; @&lt;a href="http://twitter.com/RonJeffries"&gt;RonJeffries&lt;/a&gt; Iteration is like metronome, Kanban is like multiple rhythms, from #lk2009 (must find who said that...)&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1748671255" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;2:42 PM May 9th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1748671255" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1743080684"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;RT have a YouTube link for this eating style ;) -- @&lt;a href="http://twitter.com/jeremiahakin"&gt;jeremiahakin&lt;/a&gt;: Langston eats apples like mr peepers from Saturday Night Live&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1743080684" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;9:36 PM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1743080684" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1740840052"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;#lk2009 So long, Miami, and thanks for all the fish!&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1740840052" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;3:02 PM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1740840052" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1739871281"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;@&lt;a href="http://twitter.com/agile_exec"&gt;agile_exec&lt;/a&gt; Picked up a Lean Kanban Conference preceesings book for Israel... Who really should have been here! #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1739871281" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;1:10 PM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1739871281" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1739580693"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;@&lt;a href="http://twitter.com/alshalloway"&gt;alshalloway&lt;/a&gt; great conversation about how/why Kanban removes fear/impedemnts to individual learning, must blog! #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1739580693" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;12:37 PM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1739580693" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1737465750"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;@&lt;a href="http://twitter.com/agilemanager"&gt;agilemanager&lt;/a&gt; why is introducing Kanban easier than Scrum? I'm suggesting Kanban provides concrete reflection tools, lowers barrier #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1737465750" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;8:36 AM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;a href="http://twitter.com/agilemanager/status/1737408315"&gt;in reply to agilemanager&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1737465750" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1737388795"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Err, I meant tuning WIP and workflow is easy for people that wouldn't normally contribute to retrospective #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1737388795" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;8:26 AM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1737388795" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1737371086"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Tuning WIP limits and workflow on the board is low resistance, even fir people that normally would say a think in a retrospective #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1737371086" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;8:24 AM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1737371086" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1737360669"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;I said concrete introspection is maybe the reason kanban is different. Just telling people to reflect doesn't just work. #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1737360669" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;8:22 AM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1737360669" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1737348083"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;I said concrete introspection, I mean that most people won't retrospect. Getting more people thinking in the biz is the real win. (hypothes)&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1737348083" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;8:21 AM May 8th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1737348083" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1731280363"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Laribee just compared Kanban boards to the RESTful web metaphor... #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1731280363" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;4:40 PM May 7th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1731280363" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1728458170"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Any good survey of online kanban tools? #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1728458170" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;11:20 AM May 7th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1728458170" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1728305634"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Any good summary of online kanban tools? #lk209&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1728305634" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;11:03 AM May 7th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1728305634" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1728290820"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Alisson Vale contract agreements: problem solving, support, improvements for sustainability, new value #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1728290820" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;11:02 AM May 7th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1728290820" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1728271721"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Alisson Vale defined four (social?) contracts with customers #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1728271721" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;11:00 AM May 7th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1728271721" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1728256852"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Alisson Vale "long term relationships require long term contracts" #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1728256852" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;10:58 AM May 7th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1728256852" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1723900757"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;@&lt;a href="http://twitter.com/carlacorkern"&gt;carlacorkern&lt;/a&gt; Chaka what? :) I'm at the learning gemba, not vegetarian.&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1723900757" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;10:42 PM May 6th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;a href="http://twitter.com/carlacorkern/status/1713700638"&gt;in reply to carlacorkern&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1723900757" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1720629615"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;@&lt;a href="http://twitter.com/dennisstevens"&gt;dennisstevens&lt;/a&gt; I'm not sure TWI is right either, but I have a strong hunch that is has wisdom for teaching knowledge workers. #lk2009&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1720629615" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;4:12 PM May 6th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;a href="http://twitter.com/dennisstevens/status/1720555304"&gt;in reply to dennisstevens&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="actions"&gt;&lt;div&gt;&lt;a class="fav-action non-fav" id="status_star_1720629615" title="favorite this update"&gt;  &lt;/a&gt;&lt;a class="del" title="delete this update"&gt;  &lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="hentry status u-jheintz mine" id="status_1720562294"&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;#lk2009 link to TWI resource: &lt;a href="http://delicious.com/jheintz/twi" rel="nofollow" target="_blank"&gt;http://delicious.com/jheint...&lt;/a&gt; training within industry is a WWII management system that influenced Lean.&lt;/span&gt;&lt;span class="meta entry-meta"&gt;&lt;a href="http://twitter.com/jheintz/status/1720562294" class="entry-date" rel="bookmark"&gt;&lt;span class="published"&gt;4:05 PM May 6th&lt;/span&gt;&lt;/a&gt; &lt;span&gt;from &lt;a href="http://www.atebits.com/"&gt;Tweetie&lt;/a&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-1534390501961553322?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/1534390501961553322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=1534390501961553322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/1534390501961553322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/1534390501961553322'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2009/05/back-from-lean-kanban-conference.html' title='Back from the Lean Kanban Conference'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-4316922848882704873</id><published>2009-01-06T10:58:00.000-08:00</published><updated>2009-01-06T11:04:05.681-08:00</updated><title type='text'>Hotkeys for Omnifocus/Firefox</title><content type='html'>Until I get a chance to try out this integration for Firefox and Omnifocus (&lt;a href="http://forums.omnigroup.com/archive/index.php/t-4510.html"&gt;http://forums.omnigroup.com/archive/index.php/t-4510.html&lt;/a&gt;) I wanted to make a record of the hot keys I'm using right now.&lt;br /&gt;&lt;br /&gt;Goal: Get a link to the current page I'm viewing in Firefox into a new task in Omnifocus.&lt;br /&gt;&lt;br /&gt;Steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Command-L to get the browser location URL highlighted.&lt;/li&gt;&lt;li&gt;Command-C to copy that location.&lt;/li&gt;&lt;li&gt;Control-Alt-Space to open a new Omnifocus inbox item.&lt;/li&gt;&lt;li&gt;Type a short description of the new task.&lt;/li&gt;&lt;li&gt;Command-' to open the entry field for the notes. (This is single quote, not back tic.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Command-V to paste the previously copied URL.&lt;/li&gt;&lt;/ol&gt;It works, avoids using the mouse, but that is too many steps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-4316922848882704873?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/4316922848882704873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=4316922848882704873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4316922848882704873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4316922848882704873'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2009/01/hotkeys-for-omnifocusfirefox.html' title='Hotkeys for Omnifocus/Firefox'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-6674480120973223363</id><published>2008-12-05T19:11:00.000-08:00</published><updated>2008-12-05T19:43:17.793-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><title type='text'>My best code review</title><content type='html'>In 1998 (or maybe 1999?) I was a fairly junior developer, but fortunate to be working under a really smart mentor (Aamod Sane).&lt;br /&gt;&lt;br /&gt;Among many things that I'm grateful for was his relatively constant practice of helping me through constructive code reviews.&lt;br /&gt;&lt;br /&gt;The one that sticks out, the one that changed my view of how to write my own code, started out with me excited with finishing the code and a few tests for some now forgotten task.&lt;br /&gt;&lt;br /&gt;After reading through it myself to hopefully avoid really stupid mistakes ;) I kind of ran down the hall to get the attention of my supervisor/mentor.&lt;br /&gt;&lt;br /&gt;Once he finished what he was doing we started walking back towards my workstation.&lt;br /&gt;&lt;br /&gt;[...this is where it starts to get interesting...]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On the walk back towards my machine I was nervously and rapidly telling him what, why, and how the code does what it's supposed to.&lt;br /&gt;&lt;br /&gt;[Me doing all this quick overview talking was important actually...]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We sit down at my machine, swivel the monitor over, and he start reading.&lt;br /&gt;&lt;br /&gt;He....&lt;br /&gt;                sighs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then....      &lt;br /&gt;                shakes his head.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Really. That's what happened.&lt;br /&gt;Yes, you know what I felt like. ;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If it had just ended there it would have been like any other awful code review (see &lt;a href="http://www.osnews.com/story/19266/WTFs_m"&gt;http://www.osnews.com/story/19266/WTFs_m&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, finally, the really good conclusion.&lt;br /&gt;&lt;br /&gt;Before he left he said this to me:&lt;br /&gt;&lt;blockquote&gt;Just make the code look like what you just told me.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That walk between machines earlier when I rambled my way through telling him what the code did was actually a fairly clear description of things. The code I had actually written was really detailed, messy, and all together just "code".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After the advice of my mentor, I looked at the code with fresh eyes and I could see better method names, better looping patterns, and just better ways to "tell the story" of what I was trying to do.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, I try to write my code so that it "reads" like a good story. Sometimes I do a really good job, and other times not so much, but I have a clear goal that I'm shooting for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-6674480120973223363?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/6674480120973223363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=6674480120973223363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/6674480120973223363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/6674480120973223363'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2008/12/my-best-code-review.html' title='My best code review'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-4655263793187657458</id><published>2008-08-27T12:23:00.000-07:00</published><updated>2008-08-27T12:39:13.878-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thoughts'/><title type='text'>My Favorite Inverview Question</title><content type='html'>In a recent discussion interview questions came up, here's my favorite one.&lt;br /&gt;&lt;br /&gt;To set some context this question is designed to gauge the abstract and critical thinking of a generally inexperienced developer. I don't usually use this for very experienced developers, but may if I think I'm getting shallow or suspicious answers.&lt;br /&gt;&lt;br /&gt;Here's what I start with:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6OgRCj2Oqo8/SLWrHRB2iuI/AAAAAAAAACs/ifPXdaaRjEg/s1600-h/vague1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_6OgRCj2Oqo8/SLWrHRB2iuI/AAAAAAAAACs/ifPXdaaRjEg/s320/vague1.jpg" alt="" id="BLOGGER_PHOTO_ID_5239281882834045666" border="0" /&gt;&lt;/a&gt;I'm friendly but not at all helpful while I do this.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I draw it out by hand on a whiteboard or on paper&lt;/li&gt;&lt;li&gt;I verbalize the relationships&lt;/li&gt;&lt;li&gt;I offer to explain the notation and meaning of "is-a"&lt;/li&gt;&lt;li&gt;I ask them to think out-loud&lt;/li&gt;&lt;li&gt;I hand them the writing instrument&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Then I just ask the candidate for their impressions of the model.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What's good? What's bad? What would you change?&lt;/li&gt;&lt;/ul&gt;A few obvious things that the candidate should work their way around to:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A "Deer" is an animal also.&lt;/li&gt;&lt;li&gt;A "Cow" could be "Food" for a "Tiger".&lt;/li&gt;&lt;/ol&gt;After watching them squirm for a while, I then make one addition to the original model. I add a single method/operation to the "Animal" class.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6OgRCj2Oqo8/SLWsc2E_H4I/AAAAAAAAAC0/Tq2FAlT7xf0/s1600-h/vague2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_6OgRCj2Oqo8/SLWsc2E_H4I/AAAAAAAAAC0/Tq2FAlT7xf0/s320/vague2.jpg" alt="" id="BLOGGER_PHOTO_ID_5239283353068183426" border="0" /&gt;&lt;/a&gt;Again, I ask them for their impressions.&lt;br /&gt;&lt;br /&gt;If they don't get to it themselves I make sure to ask the following questions:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;What happens if a "Deer" is passed to the eat method of a "Cow"?&lt;/li&gt;&lt;li&gt;How would you change the model to handle or avoid that problem?&lt;/li&gt;&lt;/ol&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-4655263793187657458?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/4655263793187657458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=4655263793187657458' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4655263793187657458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4655263793187657458'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2008/08/my-favorite-inverview-question.html' title='My Favorite Inverview Question'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6OgRCj2Oqo8/SLWrHRB2iuI/AAAAAAAAACs/ifPXdaaRjEg/s72-c/vague1.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-5620700057766898203</id><published>2008-01-16T12:23:00.000-08:00</published><updated>2008-01-16T14:01:56.844-08:00</updated><title type='text'>Comments, REST, Interactions, and Extensible Hypermedia</title><content type='html'>This post is to mostly keep track of the numerous blog threads going on about IDLs and schemas for REST. I find myself with more to say that wit to organize it... :(&lt;br /&gt;&lt;br /&gt;First my summaries of opinions, then links to my comments here and there.&lt;br /&gt;&lt;br /&gt;Some of my opinions on a RESTful Client Engine, and what types of server-side changes would NOT break a client:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;URIs are discovered (except the first)&lt;/li&gt;&lt;li&gt;Server-provided data extensions (hidden fields with defaults in a form) are treated like "does not understand" but still submitted properly&lt;/li&gt;&lt;li&gt;Changes to which HTTP verb are used. The server can swap PUT for POST without issue (verb is discovered in form not spec'ed in a schema)&lt;/li&gt;&lt;li&gt;Changes in state path. "checkout" could directly be a single form with POST, a GET link to a single for with POST, a POST to a form with reliable PUT semantics, .......&lt;br /&gt; &lt;/li&gt;&lt;/ul&gt; Links,opinions on the changing landscape of content (and predictions of the future of hypermedia content):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sam Ruby's suggestions for &lt;a href="http://intertwingly.net/blog/2007/08/02/HTML5-and-Distributed-Extensibility"&gt;HTML5 Distributed Extensibility&lt;/a&gt; is a fabulous starting point.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bitworking.org/news/URI_Templates"&gt;URI Templates&lt;/a&gt;, HTML Forms, &lt;a href="http://www.w3.org/MarkUp/Forms/"&gt;XForms,&lt;/a&gt; &lt;a href="http://www.whatwg.org/specs/web-forms/current-work/"&gt;Web Forms&lt;/a&gt;, &lt;a href="http://weblogs.java.net/blog/mhadley/archive/2006/10/uri_templating.html"&gt;WADL&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;XSD is being extended to &lt;a href="http://www.infoq.com/news/2007/08/guide-to-versioning-xml-schema"&gt;better support versioning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Data schemas designed for extensibility should allow everything possible to be optional&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Microformats enable opportunistic clients to machine process&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.w3.org/TR/grddl/"&gt;GRDDL&lt;/a&gt; leaps from &lt;a href="http://microformats.org/wiki/grddl"&gt;microformats,&lt;/a&gt; xml, some json up to RDF&lt;/li&gt;&lt;li&gt;HTML+Microformats  can do a ton of this already, but with no machine processable anything&lt;/li&gt;&lt;li&gt;Prediction: in 10 years all of this this will have exploded/merged into one or a few really cool and evolvable data/interaction schema systems&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  References to programming and type systems that address these issues more appropriately than any IDL (as far as I can get into them so far... :)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;from &lt;a href="http://www.stucharlton.com/blog/archives/000179.html"&gt;Stu Charlton&lt;/a&gt; comes a reference to &lt;a href="http://www.cl.cam.ac.uk/%7Erm135/turing.pdf"&gt;interaction machines&lt;/a&gt;&lt;/li&gt;&lt;li&gt;from &lt;a href="http://highscalability.com/how-can-i-learn-scale-my-project"&gt;Todd Hoff&lt;/a&gt; comes a reference to two NASA reference on &lt;a href="http://www-aig.jpl.nasa.gov/public/planning/papers/barrett_iwpss2004_missionplanning.pdf"&gt;Mision Planning&lt;/a&gt; and &lt;a href="http://www-aig.jpl.nasa.gov/public/planning/papers/fy01_clear_demo_handout-short_version.pdf"&gt;Closed Loop Execution and Recovery&lt;/a&gt;&lt;/li&gt;&lt;li&gt;papers from &lt;a href="http://ctp.di.fct.unl.pt/%7Elcaires/papers/"&gt;Luis Caires&lt;/a&gt;, for example &lt;a href="http://ctp.di.fct.unl.pt/%7Elcaires/papers/SBTypesCaires06.pdf"&gt;&lt;em&gt;Spatial-Behavioral Types, Distributed Services, and Resources&lt;br /&gt;&lt;/em&gt;&lt;/a&gt; (forget where I found this material from... can't understand it yet...)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The following is a guide to my recent comments on these threads from around the web:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.subbu.org/weblogs/main/2007/12/on_hypermedia.html"&gt;Subbu says&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Should this idea be extended to the rest of non-user facing resource-oriented applications? I don't think so. Here is why.&lt;/p&gt;  The idea of hypermedia embedding all the action controls necessary to interact with the server works well for an arbitrary number of universal clients interacting with &lt;em&gt;a&lt;/em&gt; given server. In this case, the server offering a set of resources specifies all the ordering/interaction rules within the representation. Most application clients, on the other hand, interact with more than one server, and the ordering constraints can not be set by any given server. The clients know how to compose applications out of resources offered by various servers, and each client needs to be able to exercise control over composition. To be able to exercise such a control, client applications can not be universal, and the benefits that John lists above cannot be completely realized.&lt;/blockquote&gt;My comments is that clients should be opportunistic: if they understand some shared semantic (like a RESTful shopping API or task manager) then they can automate some interactions.&lt;br /&gt;&lt;br /&gt;On &lt;a href="http://www.ebpml.org/BLOG"&gt;JJ Dubray's blog&lt;/a&gt; I make several comments.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.haloscan.com/comments/jjdubray/40_htm/#9152"&gt;In response to "REST creates strong coupling"&lt;/a&gt;, I say:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JJ is ignoring the shared definitions of MIME types&lt;/li&gt;&lt;li&gt;The globally shared "Provider external" (Pe) semantics in REST are (URI, GET representation, hyperlinks)&lt;/li&gt;&lt;li&gt;in WS-* the Pe globally is 0 (zero), only particular shared uses have a shared semantic.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.haloscan.com/comments/jjdubray/41_htm/#9271"&gt;In response to "REST and inter-actions"&lt;/a&gt;, I say (and &lt;a href="http://www.haloscan.com/comments/jjdubray/41_htm/#9272"&gt;say&lt;/a&gt; and &lt;a href="http://www.haloscan.com/comments/jjdubray/41_htm/#9273"&gt;say&lt;/a&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For me REST in the enterprise isn't about scalability, but rather independent evolution and support for partial failure.&lt;/li&gt;&lt;li&gt;In maybe 10 years there will be an XML schema language that properly supports versioning and extensibility&lt;/li&gt;&lt;/ul&gt;In Steve Vinoski's blog on "IDLs vs Human Documentation" &lt;a href="http://steve.vinoski.net/blog/2008/01/16/idls-vs-human-documentation/#comment-468"&gt;I comment&lt;/a&gt; that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I side with &lt;a href="http://pmuellr.blogspot.com/2008/01/steve-vinoski-on-schema.html"&gt;Patrick Mueller&lt;/a&gt;: there is something of value in more than just prose to document RESTful systems&lt;/li&gt;&lt;li&gt;Hypermedia MIME types are _more_ than just a data schema (embedded forms to signify actions)&lt;/li&gt;&lt;li&gt;A list of RESTful interactions that _shouldn't_ break a programmed client (listed below)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-5620700057766898203?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/5620700057766898203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=5620700057766898203' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5620700057766898203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5620700057766898203'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2008/01/comments-rest-interactions-and.html' title='Comments, REST, Interactions, and Extensible Hypermedia'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-7643468596697186925</id><published>2007-12-17T20:52:00.000-08:00</published><updated>2007-12-17T22:46:43.067-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>Premature Conclusions with Services and REST</title><content type='html'>Damn, I wish we were at a white board. Oh well.&lt;br /&gt;&lt;br /&gt;JJ, you've &lt;a href="http://www.ebpml.org/blog/39.htm"&gt;drawn a lot of conclusions&lt;/a&gt; from talking with a few people in the REST community. I think you've gotten ahead of yourself.&lt;br /&gt;&lt;br /&gt;To defend the "REST community": What we are talking about isn't where most of the value is. Not yet anyway. Maybe someday this issue will really be an issue, but right now just GETing info with declarative representation data is so unusual that we're on the fringe.&lt;br /&gt;&lt;br /&gt;Really, I believe this on the internet at large and in many organizations as well (enterprisey doesn't even get funny when sharing a database is so common.) . How much value does a definition language really have? Well, some. Just like I appreciate static languages for documentation and _some_ checking, having a WSDL or something is useful. None of the things being thrown around for "interface definition language" are much more useful than being able to organize documentation, generate code (a bad idea), and create pictures (sometimes useful for humans). That last point, the human part, is where you started this conversation... Let's not pretend that WSDL allows machines to process things for us.&lt;br /&gt;&lt;br /&gt;To your recent post. I don't have much time tonight, but hear is my reaction.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Shared Understanding.&lt;/span&gt;&lt;br /&gt;This isn't actually denied by the REST. It's just relegated to the media type.&lt;br /&gt;&lt;br /&gt;The "contract" that is specific to a particular domain in a RESTful system is buried in the Representation. That means a) we all collectively don't know much about it,  b) every system can use the standard VERBS to explore and partially integrate. The first point means we need to have this very conversation, but the value of that struggle is more common ground between all services.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Result Sets aren't Resources&lt;br /&gt;&lt;/span&gt;Huh? Why not? I'll need to read up on the posts, but everything interesting is a resource. I don't understand why you conclude this.&lt;br /&gt;&lt;br /&gt;Some of your recent posts have indicated what I think may be a confusion regarding the "uniform interface" and resources. Not every resource must support and expose each method. Part of the discovery of REST is learning (at runtime) what methods are available for each resources. Results sets don't need to expose PUT.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How many people are in this discussion?&lt;/span&gt;&lt;br /&gt;Not many, I'm afraid. You're assuming that people won't discuss these issues with you, but it's probably that it doesn't matter to most of the RESTful systems out there.&lt;br /&gt;&lt;br /&gt;As an example: the Amazon service exposed this weekend. It is people (not machine processes) that are writing the wrapper layers around the new API. It almost doesn't matter what they had exposed it in, people need to spend thought understanding it and wrapping it. Then, other people, need to consume the wrappers to write applications.&lt;br /&gt;&lt;br /&gt;Had Amazon used some magically fantastic definition language it wouldn't change but a part of the total human/computer processing cost and value proposition. Again, I think there is value in understanding and exposing that fantastic definition language. I'm not assuming it will magically compose my systems. (I'm not necessarily claiming you make that declaration either, but the value you place on the formality seems too strong. I will read your book on composition to really understand what you are saying.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;REST and actions&lt;/span&gt;&lt;br /&gt;There is something critically important about the distinction between "action interfaces" and "document exchange". You took Subbu to task for trying to remove actions, but I think there is a truly subtle reason that REST motivates that thinking.&lt;br /&gt;&lt;br /&gt;I'm not sure I can express it well, but this is my intuitive view:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;contract negotiation is an (endless?) cycle of document exchange&lt;/li&gt;&lt;li&gt;reserving a _good_ hotel room is an cycle of question/answer...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;bartering is a cycle of bid exchange&lt;/li&gt;&lt;li&gt;resolving a speeding ticket is ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;what these real ways of getting things done tell me is that an interface contract doesn't model the real world.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;REST models "action" as one or more transfer of document representation. That is more like the world than interface actions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;REST and versioning.&lt;/span&gt;&lt;br /&gt;Really bad at versioning? Seriously? If you'd said "efficiency", or "tool support", or "machine clients" I'd be right there saying "Yeah, maybe this would improve that..."&lt;br /&gt;&lt;br /&gt;Versioning is hard because something wants to change - and the rest of the system isn't yet ready to change as well. REST has from the beginning been about supporting that change (across organizations, and between the client and server). The very reason that interface definition languages are so hard to reconcile with REST is because of the radically different view on how to support evolution.&lt;br /&gt;&lt;br /&gt;(I'm posting this without all the links...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-7643468596697186925?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/7643468596697186925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=7643468596697186925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/7643468596697186925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/7643468596697186925'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/12/premature-conclusions-with-services-and.html' title='Premature Conclusions with Services and REST'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-8115619065851527158</id><published>2007-12-12T09:42:00.000-08:00</published><updated>2007-12-12T12:26:34.091-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>Shared Understanding and/or Evolvability</title><content type='html'>(This is belated and too short. All you fast-typing bloggers out there can just be patient :)  Sorry for the delay!)&lt;br /&gt;&lt;br /&gt;How do distributed systems both cooperate and evolve?&lt;br /&gt;&lt;br /&gt;That is a subtly different question than&lt;a href="http://www.ebpml.org/blog/34.htm"&gt; JJ asks&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;when    no human is in the loop, you need a shared understanding between the    resource consumer and the resource (provider)&lt;/blockquote&gt;The only viable choices JJ then describes (WSDL or WADL) do indeed provide a partial solution to coding shared understanding, but not evolution.&lt;br /&gt;&lt;br /&gt;The short (flip?) answer to my leading question is to create a new media type that describes the semantics necessary for both consumers and providers to communicate.&lt;br /&gt;&lt;br /&gt;In the case of exposing a Job Application Service as a RESTful provider that could mean the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;for a human provide an HTML response representation with forms for review, cancel, submit interview.&lt;/li&gt;&lt;li&gt;for a machine provide an XML or RDF (or something) response representation.&lt;/li&gt;&lt;/ul&gt;That machine representation must have a lot of things going for it. It must provide just enough shared information to do useful things, but not prevent service evolution. In particular, the response must:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;provide links/conformance to some shared schema type(s) (to share semantics)&lt;/li&gt;&lt;li&gt;be extensible (in the &lt;a href="http://www.w3.org/2001/tag/doc/versioning-strategies"&gt;"does not understand"&lt;/a&gt; sense)&lt;/li&gt;&lt;li&gt;the shared schema can't pre-define URIs&lt;/li&gt;&lt;li&gt;the shared schema can't pre-constrain all of the transition paths&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That last one is really fuzzy, but I'm trying to express the idea with my &lt;a href="http://johnheintz.blogspot.com/2007/05/does-rest-need-dl.html"&gt;"signposts" metaphor&lt;/a&gt;. Getting something done (i.e. changing the state of something) isn't alway a single step, and how many steps have to be followed isn't a very stable property. In the case of job applications, getting from "offered" to "accepted" might take a few loops in the 1.1 release of the service, or maybe the "review" state gets split into 2 steps, what happens then?&lt;br /&gt;&lt;br /&gt;The current conception of "shared understanding" is "shared interface". In the Job Application example that means the client service is encoded to expect after "Submit Review" that the service moved the job app to "reviewed". If the client service instead was coded to have a pair of (current job app data, desired state) when the service changed to a 2-stage review process the clients would likely continue to work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Client: Get job app 123&lt;/li&gt;&lt;li&gt;Service: job app 123, submitted, "Submit Review", "Cancel"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Client: "Submit Review" for job app 123&lt;/li&gt;&lt;li&gt;Service: job app 123, review1, "Submit Review", "Cancel", "Reject"&lt;/li&gt;&lt;li&gt;Client: "Submit Review" for job app 123&lt;/li&gt;&lt;li&gt;Service: job app 123, reviewed, "Submit Interview", "Cancel", "Reject"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; Understanding how to encode an imperative SOA static model to a conversational document interchange is not really that well understood yet (certainly to me). I think someday it will be, but right now there is just the quotes from the REST thesis &lt;a href="http://johnheintz.blogspot.com/2007/11/just-in-rest-cant-handle-state.html"&gt;I commented on&lt;/a&gt; and a reference to &lt;a href="http://article.gmane.org/gmane.comp.web.services.rest/6874"&gt;"data reactive programming" from Roy Fielding&lt;/a&gt;, and I just found &lt;a href="http://www-sop.inria.fr/mimosa/index.html#g1427"&gt;Mimosa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Just need to make sure of something about the Job Application Service example: is this service the provider or consumer of the lifecycle of a job app? It clearly has an internal state machine for job apps, but what other machine process does that get shared with?&lt;br /&gt;&lt;br /&gt;[1] Some discussion (still searching for link...) hinted that WADL could be simply returned like an HTML Form, and not used to statically generate code. I think avoids the coupling of code-gen, but I'm not sure how it solves the problem of shared understanding either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-8115619065851527158?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/8115619065851527158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=8115619065851527158' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8115619065851527158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8115619065851527158'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/12/shared-understanding-andor-evolvability.html' title='Shared Understanding and/or Evolvability'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-4020146112670303835</id><published>2007-11-29T14:38:00.000-08:00</published><updated>2007-12-18T13:46:57.621-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Passing and Returning Nulls</title><content type='html'>Several blog posts about handling null values caught my attention.&lt;br /&gt;&lt;br /&gt;The pair of posts from Marty Alchin on "&lt;a href="http://gulopine.gamemusic.org/2007/11/returning-none-is-evil.html"&gt;Returning None is Evil&lt;/a&gt;" and "&lt;a href="http://gulopine.gamemusic.org/2007/11/except-unexpected.html"&gt;Except the Unexpected&lt;/a&gt;" offer these opinions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;most methods can return null&lt;/li&gt;&lt;li&gt;Java has lots of APIs that silently return null (java.util.Map.get(Object key))&lt;/li&gt;&lt;li&gt;returned nulls are annoying and hard to debug&lt;/li&gt;&lt;li&gt;exceptions should be preferred when a non-null value isn't available&lt;/li&gt;&lt;li&gt;always consider when/how nulls should(n't) be used&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Cedric Otaku in "&lt;a href="http://beust.com/weblog/archives/000470.html"&gt;It's okay to return null&lt;/a&gt;" chimes in with these valid points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;don't return exceptions unless something really is exceptional&lt;/li&gt;&lt;li&gt;use the Null Object pattern if you need it&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Neither of those suggestions (exceptions or Null Object) really work out well for my taste. I really don't like these bad choices:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Write clear and direct code -- that neither shows where nulls could be hiding nor handles them well when they occur&lt;/li&gt;&lt;li&gt;Write lots of verbose if/then/else and try/catch blocks to deal with nulls everywhere&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;So what to do? Borrow a construct from somewhere else of course!&lt;br /&gt;&lt;br /&gt;In the &lt;a href="http://www.scala-lang.org/"&gt;Scala programming language&lt;/a&gt; I was introduced to the &lt;a href="http://www.scala-lang.org/docu/files/api/scala/Option.html"&gt;Option class&lt;/a&gt;. I'm pretty sure that is comes from Haskell and other places, but I'm not really researching it.&lt;br /&gt;&lt;br /&gt;An Option&lt;t&gt; is like a list of zero or one elements; either a Some&lt;t&gt; with a value, or a None.&lt;br /&gt;&lt;br /&gt;Functions that return or receive "optional" things use an Option wrapper to both document that fact and promote cleaner code constructs. Here is an example.&lt;br /&gt;&lt;br /&gt;Normal Java code with an override variable:&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;pre&gt;&lt;br /&gt;String overrideMessage;&lt;br /&gt;final String defaultMessage="Howdy";&lt;br /&gt;&lt;br /&gt;public String sayHello(String name) {&lt;br /&gt;  String s=null;&lt;br /&gt;  if (overrideMessage!=null)&lt;br /&gt;      s = overrideMessage;&lt;br /&gt;  else&lt;br /&gt;      s = defaultMessage;&lt;br /&gt;&lt;br /&gt;  return s+" "+name;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yuck! Now let's uses Option&lt;string&gt; to clean up that method:&lt;br /&gt;&lt;/string&gt;&lt;pre&gt;&lt;br /&gt;Option&amp;lt;String&amp;gt; overrideMessage=none();&lt;br /&gt;final String defaultMessage="Howdy";&lt;br /&gt;&lt;br /&gt;public String sayHello(String name) {&lt;br /&gt;  return overrideMessage.or(defaultMessage)+" "+name;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Much nicer. The Java version can accept alternate values (with the or() method) but not code blocks to execute like the Scala version can (unless Java gets closures...). The Scala version can participate in list comprehensions and all sorts of other things, but I'm not not talking about those things now.&lt;br /&gt;&lt;br /&gt;Here is the full version of my Option port to Java:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class Options {&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * An Option can be either full (Some&amp;lt;T&amp;gt;) or empty (None).&lt;br /&gt;   * Instead of passing/returning nulls use an Option&lt;br /&gt;   */&lt;br /&gt;  public abstract static class Option&amp;lt;T&amp;gt; {&lt;br /&gt;      public final boolean some;&lt;br /&gt;      public final boolean none;&lt;br /&gt;   &lt;br /&gt;      private Option(boolean some) {&lt;br /&gt;          this.some = some;&lt;br /&gt;          this.none = !some;&lt;br /&gt;      }&lt;br /&gt;   &lt;br /&gt;      abstract public T val();&lt;br /&gt;   &lt;br /&gt;      public T or(T defaultResult) {&lt;br /&gt;          if (some)&lt;br /&gt;              return val();&lt;br /&gt;          else&lt;br /&gt;              return defaultResult;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Placeholder for empty&lt;br /&gt;   */&lt;br /&gt;  public static class None&amp;lt;T&amp;gt; extends Option&lt;t&gt; {&lt;br /&gt;      private None() {&lt;br /&gt;          super(false);&lt;br /&gt;      }&lt;br /&gt;      public T val() {&lt;br /&gt;          throw new NullPointerException("Can't dereference a None&lt;t&gt; value");&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * A Holder for some value (never null)&lt;br /&gt;   */&lt;br /&gt;  public static class Some&amp;lt;T&amp;gt; extends Option&lt;t&gt; {&lt;br /&gt;      private final T val;&lt;br /&gt;      private Some(T val) {&lt;br /&gt;          super(true);&lt;br /&gt;          this.val = val;&lt;br /&gt;      }&lt;br /&gt;      public T val() {&lt;br /&gt;          return val;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Use this when not sure if value is present or null&lt;br /&gt;   */&lt;br /&gt;  public static &amp;lt;T&amp;gt; Option&amp;lt;T&amp;gt; option(T value) {&lt;br /&gt;      if (value==null)&lt;br /&gt;          return none();&lt;br /&gt;      else&lt;br /&gt;          return some(value);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Use this to wrap a non-null value&lt;br /&gt;   */&lt;br /&gt;  public static &amp;lt;T&amp;gt; Some&amp;lt;T&amp;gt; some(T value) {&lt;br /&gt;      return new Some&amp;lt;T&amp;gt;(value);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @SuppressWarnings("unchecked")&lt;br /&gt;  private final static None NONE=new None();&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Use this when you don't have a value&lt;br /&gt;   */&lt;br /&gt;  @SuppressWarnings("unchecked")&lt;br /&gt;  public static &amp;lt;T&amp;gt; Option&amp;lt;T&amp;gt; none() {&lt;br /&gt;      return NONE;&lt;br /&gt;  } &lt;br /&gt;}&lt;br /&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-4020146112670303835?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/4020146112670303835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=4020146112670303835' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4020146112670303835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4020146112670303835'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/11/passing-and-returning-nulls.html' title='Passing and Returning Nulls'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-7906119859809093542</id><published>2007-11-27T11:58:00.000-08:00</published><updated>2007-11-27T12:31:38.635-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Using a lazy proxy to avoid Spring dependency cycles</title><content type='html'>Ever gotten a dependency cycle in your Spring configuration?&lt;br /&gt;&lt;br /&gt;How about using the Hibernate Annotations and @Configurable together?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hibernate will instantiate a single instance of each Entity class and ask for the default key value.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;But when the first instance is instantiated @Configurable will try to Spring configure that instance.&lt;/li&gt;&lt;li&gt;It that Entity depends on anything that leads back to Hibernate... Bang!&lt;/li&gt;&lt;/ol&gt;I like this quote from &lt;a href="http://forum.springframework.org/showpost.php?p=46051&amp;amp;postcount=4"&gt;Rod Johnson: "Ouch: this &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; nastier."&lt;/a&gt;  That about sums it up. Oh, and that quote is from 2004.&lt;br /&gt;&lt;br /&gt;I created a LazyProxyFactoryBean to allow me the chance to not break the cycle, but at least lazy resolve it.  Combining a Spring FactoryBean with a dynamic proxy does the trick. Hope this can help someone else out there.&lt;br /&gt;&lt;br /&gt;Here is a failing example with cycles:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;bean id="serviceA" class="com.ServiceA"&amp;gt;&lt;br /&gt;&amp;lt;property name="serviceB" ref="serviceB"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="serviceB" class="com.ServiceB"&amp;gt;&lt;br /&gt;&amp;lt;property name="serviceA" ref="serviceA"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is a modified version with a lazy proxy inserted (notice that proxy property is a value, not a ref):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;bean id="serviceA" class="com.ServiceA"&amp;gt;&lt;br /&gt;&amp;lt;property name="serviceB" ref="serviceB"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="serviceB" class="com.ServiceB"&amp;gt;&lt;br /&gt;&amp;lt;property name="serviceA" ref="serviceAProxy"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="serviceAProxy" class="com.LazyProxyFactoryBean"&amp;gt;&lt;br /&gt;&amp;lt;property name="serviceA" value="serviceA"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finally, here is the source code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.lang.reflect.InvocationHandler;&lt;br /&gt;import java.lang.reflect.InvocationTargetException;&lt;br /&gt;import java.lang.reflect.Method;&lt;br /&gt;import java.lang.reflect.Proxy;&lt;br /&gt;&lt;br /&gt;import org.springframework.beans.BeansException;&lt;br /&gt;import org.springframework.beans.factory.BeanFactory;&lt;br /&gt;import org.springframework.beans.factory.BeanFactoryAware;&lt;br /&gt;import org.springframework.beans.factory.FactoryBean;&lt;br /&gt;import org.springframework.beans.factory.FactoryBeanNotInitializedException;&lt;br /&gt;&lt;br /&gt;public class LazyProxyFactoryBean implements FactoryBean, BeanFactoryAware {&lt;br /&gt;&lt;br /&gt;private String beanName;&lt;br /&gt;private BeanFactory beanFactory;&lt;br /&gt;private Object proxyObject;&lt;br /&gt;private Object realObject;&lt;br /&gt;&lt;br /&gt;public LazyProxyFactoryBean() {&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Object getRealObject() throws Exception {&lt;br /&gt; if (this.realObject == null)&lt;br /&gt;  this.realObject = this.beanFactory.getBean(this.beanName);&lt;br /&gt;&lt;br /&gt; return this.realObject;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Object getObject() throws Exception {&lt;br /&gt; Class[] ifcs = getProxyInterfaces();&lt;br /&gt; if (ifcs == null) {&lt;br /&gt;  throw new FactoryBeanNotInitializedException(&lt;br /&gt;    getClass().getName() + " does not support circular references");&lt;br /&gt; }&lt;br /&gt; if (this.proxyObject == null) {&lt;br /&gt;  this.proxyObject = Proxy.newProxyInstance(getClass().getClassLoader(), ifcs,&lt;br /&gt;   new InvocationHandler() {&lt;br /&gt;    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {&lt;br /&gt;     try {&lt;br /&gt;      return method.invoke(getRealObject(), args);&lt;br /&gt;     }&lt;br /&gt;     catch (InvocationTargetException ex) {&lt;br /&gt;      throw ex.getTargetException();&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   });&lt;br /&gt; }&lt;br /&gt; return this.proxyObject;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Class getObjectType() {&lt;br /&gt; return beanFactory.getType(beanName);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public boolean isSingleton() {&lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setBeanFactory(BeanFactory beanFactory) throws BeansException {&lt;br /&gt; this.beanFactory = beanFactory;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected Class[] getProxyInterfaces() {&lt;br /&gt; Class type = getObjectType();&lt;br /&gt;&lt;br /&gt; if (type != null &amp;amp;&amp;amp; type.isInterface()) {&lt;br /&gt;  return new Class[] {type};&lt;br /&gt; } else if (type != null) {&lt;br /&gt;  return type.getInterfaces();&lt;br /&gt; } else {&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setBeanName(String beanName) {&lt;br /&gt; this.beanName = beanName;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-7906119859809093542?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/7906119859809093542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=7906119859809093542' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/7906119859809093542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/7906119859809093542'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/11/using-lazy-proxy-to-avoid-spring.html' title='Using a lazy proxy to avoid Spring dependency cycles'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-1403904249936225721</id><published>2007-11-27T11:04:00.000-08:00</published><updated>2007-11-27T12:31:13.504-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><title type='text'>Notes from NetObjectives Lean Webinar</title><content type='html'>These are notes from a &lt;a href="http://www.netobjectives.com/webinars/AligningWithLean/AligningWithLean.html"&gt;NetObjectives Webinar on "Using Lean Thinking to Align People, Process and Practices"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This was a really succinct presentation that still covered a lot of ground. If you register it is still available for free viewing!&lt;br /&gt;&lt;br /&gt;Lean Software Development:&lt;br /&gt;&lt;blockquote&gt;Focuses on the ability to add value quickly now, while improving the ability to add value quickly in the future.&lt;br /&gt;&lt;/blockquote&gt;Edwards Deming:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Plan-Do-Check-Act (PDSA)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;System of Profound Knowledge&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Gary Hamel. "Management Innovation" in &lt;span style="font-weight: bold;"&gt;Harvard Business Review&lt;/span&gt;. Feb 2006&lt;br /&gt;&lt;blockquote&gt;Only after American carmakers had exhausted every other explanation for Toyota's success - an undervalued yen, a docile workforce, Japanese culture, superior automation - were they finally able to admit that Toyota's real advantage was its ability to harness the intellect of 'ordinary' employees.&lt;br /&gt;&lt;/blockquote&gt;Lean - A New Paradigm&lt;br /&gt;&lt;blockquote&gt;Engaged, thinking people&lt;/blockquote&gt;Referenced "Software by Numbers" (better graphics...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-1403904249936225721?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/1403904249936225721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=1403904249936225721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/1403904249936225721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/1403904249936225721'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/11/notes-from-netobjectives-lean-webinar.html' title='Notes from NetObjectives Lean Webinar'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-6543377341920188818</id><published>2007-11-20T07:47:00.000-08:00</published><updated>2007-11-20T14:56:22.518-08:00</updated><title type='text'>Just In: REST can't handle state!!</title><content type='html'>Or, maybe Jean-Jacques Dubray, Ph.D. doesn't understand hypermedia. :(&lt;br /&gt;&lt;br /&gt;In his &lt;a href="http://www.ebpml.org/blog/28.htm"&gt;post on the states and transitions &lt;/a&gt;of a resource he claims that REST has no way to let a client know what state transitions are available for a given resource....&lt;br /&gt;&lt;br /&gt;Um, what is &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/introduction.htm"&gt;hypermedia&lt;/a&gt;?&lt;br /&gt;&lt;blockquote&gt;Distributed hypermedia provides a uniform means of accessing services through the embedding of action controls within the presentation of information retrieved from remote sites.&lt;br /&gt;&lt;/blockquote&gt;This quote is just the introduction to hypermedia and REST, but we already have an answer.&lt;br /&gt;&lt;br /&gt;Action controls are embedded. &lt;span style="font-style: italic; font-weight: bold;"&gt;Action controls are embedded.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Embedding the action controls means&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The client doesn't need to have generated (and hard-coded) client stubs.&lt;/li&gt;&lt;li&gt;The server can change it's rules and expand available states as needed.&lt;/li&gt;&lt;li&gt;The client does need to process a generically extensible content type.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;/span&gt;That last point isn't free or trivial, but it enable the first two.&lt;br /&gt;&lt;br /&gt;Perhaps more directly on point is &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/rest_arch_style.htm#sec_5_3_3"&gt;this quote from 5.3.3 Data View&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;The model application is therefore an engine that moves from one state to the next by examining and choosing from among the alternative state transitions in the current set of representations.&lt;br /&gt;&lt;/blockquote&gt;Jean-Jacques' answer to how to share types, constraints, correct states, and transitions is not suprisingly: &lt;span style="font-style: italic;"&gt;a schema and a    business interface&lt;/span&gt;. Let's take those four goals one at a time:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Types: definitely covered by IDL (until the systems changes then you need to tell everyone to re-compile...)&lt;/li&gt;&lt;li&gt;Constraints: Not even covered a little by todays SOA technologies. Until there is an &lt;a href="http://www.klasse.nl/ocl/index.html"&gt;OCL &lt;/a&gt;or &lt;a href="http://catalysis.org"&gt;Catalyis &lt;/a&gt;(or Z or ...) model that get's compiled with WSDL the best a schema and business interface will have for constraints is a few lines of prose... (in &amp;lt;!-- XML comments no less!! --&amp;gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;States: WSDL is not much help, maybe you can infer the states from the operation names? &lt;a href="http://www.ssdl.org/"&gt;SSDL &lt;/a&gt;I think actually does cover this...&lt;/li&gt;&lt;li&gt;Transitions: Same as states; how do we deduce which operations are transitions?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I really can understand the challenge and barrier to hypermedia state control with generic clients. Machine processing and interoperability in this context is unfamiliar: an "engine ... choosing from among the alternate state transitions" is very declarative and make a historically imperative programmer (me!) feels out of control.&lt;br /&gt;&lt;br /&gt;Static class diagrams (WSDL) and code-generation are so much more in my control and experience. If only they worked for &lt;a href="http://research.sun.com/techrep/1994/abstract-29.html"&gt;distributed systems&lt;/a&gt; without &lt;a href="http://steve.vinoski.net/pdf/IEEE-RPC_Under_Fire.pdf"&gt;so many negatives...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The complete ignorance of hypermedia and FUD in the blog posting compelled me to respond and put my $.02 in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-6543377341920188818?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/6543377341920188818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=6543377341920188818' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/6543377341920188818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/6543377341920188818'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/11/just-in-rest-cant-handle-state.html' title='Just In: REST can&apos;t handle state!!'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-2706356196130753665</id><published>2007-11-19T08:41:00.000-08:00</published><updated>2007-11-19T09:17:27.735-08:00</updated><title type='text'>Glassbox 2.0 RC1 is available!</title><content type='html'>The 2.0 release candidate for &lt;a href="http://www.glassbox.com"&gt;Glassbox Troubleshooter&lt;/a&gt; has been released!&lt;br /&gt;&lt;br /&gt;Glassbox is an open source Java monitor and troubleshooting application:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Easy to deploy to many app servers (deploy the war, click "Install", restart server)&lt;/li&gt;&lt;li&gt;Lightweight monitoring: only instruments key layers for efficiency&lt;/li&gt;&lt;li&gt;Extensible monitors (in XML or code) to domain-specific operations for better reporting&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;For more information I would recommend browsing the &lt;a href="http://javamug.org/mainpages/2007Meetings.html#Sep"&gt;slides I presented at the Dallas JUG,&lt;/a&gt; or watching &lt;a href="http://video.google.co.uk/videoplay?docid=6266063760641634345"&gt;Ron Bodkin Google Tech Talk on Glassbox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;How am I related to this? I'm a committer for the project and have been most responsible for the automated installation support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-2706356196130753665?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/2706356196130753665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=2706356196130753665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/2706356196130753665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/2706356196130753665'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/11/glassbox-20-rc1-is-available.html' title='Glassbox 2.0 RC1 is available!'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-5032695353345974639</id><published>2007-09-13T15:43:00.000-07:00</published><updated>2007-09-13T15:47:08.993-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gigs'/><title type='text'>Presenting at New England Software Symposium</title><content type='html'>I'll be in Boston this weekend presenting at the &lt;a href="http://www.nofluffjuststuff.com/speaker/speaker_sessions.jsp?speakerId=6032&amp;amp;showId=99"&gt;NFJS New England Software Symposium&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm presenting on&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://glassbox.com"&gt;Glassbox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Adding Behavior to Java Annotations&lt;/li&gt;&lt;li&gt;REST: The basics, and not so basic&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-5032695353345974639?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/5032695353345974639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=5032695353345974639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5032695353345974639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5032695353345974639'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/09/presenting-at-new-england-software.html' title='Presenting at New England Software Symposium'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-4339733284870849502</id><published>2007-09-13T15:37:00.000-07:00</published><updated>2007-09-13T15:47:17.742-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gigs'/><title type='text'>Glassbox Presentation at Dallas JUG (yesterday)</title><content type='html'>I gave a presentation on &lt;a href="http://glassbox.com/"&gt;Glassbox &lt;/a&gt;yesterday at the Dallas Java users group (&lt;a href="http://javamug.org/"&gt;JavaMUG&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Here's a link directly to the presentation entry: &lt;a href="http://javamug.org/mainpages/2007Meetings.html#Sep"&gt;Dallas JUG Glassbox presentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At some point a PDF of the slides will be posted there. These slides are a reconsolidated and personalized version of what Ron Bodkin gave in the &lt;a href="http://video.google.co.uk/videoplay?docid=6266063760641634345"&gt;Google Video Glassbox presentation.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Glassbox is an Open-Source Automated Java Troubleshooter and Monitor. I'll post a link to the slides when it's available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-4339733284870849502?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/4339733284870849502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=4339733284870849502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4339733284870849502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4339733284870849502'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/09/glassbox-presentation-at-dallas-jug.html' title='Glassbox Presentation at Dallas JUG (yesterday)'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-8646935510877610692</id><published>2007-08-12T14:49:00.000-07:00</published><updated>2007-08-12T15:02:16.052-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><title type='text'>Train-Wreck Management</title><content type='html'>Wow, this is a well organized essay by Mary &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Poppendieck&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.poppendieck.com/blame.htm"&gt;Train-Wreck Management&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The essay explains a bit about how a train accident in 1841 leads to the Prussian army becoming a model for today's organization chart!&lt;br /&gt;&lt;br /&gt;Here's a quote that might make you look around your environment and feel an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;eary&lt;/span&gt; sense of historical dread...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana, Arial, Helvetica;"&gt;&lt;span style="font-family:Times New Roman;"&gt;&lt;blockquote&gt;Problems are caused by people who don't         do their job well, so finding someone to blame is         the first step to correcting problems.&lt;br /&gt;&lt;/blockquote&gt;I recommend anything on the website, and the books they've authored as well.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-8646935510877610692?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/8646935510877610692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=8646935510877610692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8646935510877610692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/8646935510877610692'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/08/train-wreck-management.html' title='Train-Wreck Management'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-2244809735720450055</id><published>2007-08-10T11:46:00.001-07:00</published><updated>2007-08-12T14:38:35.356-07:00</updated><title type='text'>What I'm Reading</title><content type='html'>I try not to post my own blog entries that just point to other blog entries - unless I have something to say that adds to the original.&lt;br /&gt;&lt;br /&gt;On my blog page I have a readling list widget, but here is a link in case anyone is interested and hadn't noticed it before:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/reader/shared/user/05292559726844431106/state/com.google/broadcast"&gt;What I'm Reading&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-2244809735720450055?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/2244809735720450055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=2244809735720450055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/2244809735720450055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/2244809735720450055'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/08/what-im-reading.html' title='What I&apos;m Reading'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-4989321409692134911</id><published>2007-08-03T13:10:00.000-07:00</published><updated>2007-08-09T20:01:35.088-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>SOA Integration: RPC and Constraints</title><content type='html'>DevHawk &lt;a href="http://devhawk.net/2007/08/02/Where+Have+All+The+SOA+Mashups+Gone.aspx"&gt;responded&lt;/a&gt; to my &lt;a href="http://johnheintz.blogspot.com/2007/08/rest-serendipity-and-hard-work.html"&gt;hard work&lt;/a&gt; post. Most important responses first.&lt;br /&gt;&lt;br /&gt;Beer.&lt;br /&gt;&lt;br /&gt;Let's have a beer together someday and you can make up your own mind! I try to have formed my own opinion on some topic, but don't take my view so imortantly that other people are wrong. The back-and-forth of ideas during a technical discussion is a fun way to spend a few hours.&lt;br /&gt;&lt;br /&gt;DevHawk said:&lt;br /&gt;&lt;blockquote&gt;I might be going out on a limb here, I'll bet the core of John's problem with SOA is how toolkits like WCF all but force you to build RPC style services that can easily be modeled as &lt;a href="http://devhawk.net/ct.ashx?id=328fb172-dc3a-4fc4-84a8-0ad8634e71ed&amp;url=http%3a%2f%2fmsdn2.microsoft.com%2fen-us%2flibrary%2fsystem.servicemodel.operationcontractattribute.aspx"&gt;method calls&lt;/a&gt;. That's certainly one of &lt;em&gt;my&lt;/em&gt; problems with SOA.&lt;/blockquote&gt;You're right, that is something that causes me grief. When I see a WSDL with endless request/response operations I first think:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;That's going to cause some scalability/extensibility/versioning problems.&lt;/li&gt;&lt;li&gt;It would be easier to build this design in CORBA[1]&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Also, your &lt;a href="http://devhawk.net/ct.ashx?id=328fb172-dc3a-4fc4-84a8-0ad8634e71ed&amp;amp;url=http%3a%2f%2fpluralsight.com%2fblogs%2ftewald%2farchive%2f2007%2f04%2f26%2f46984.aspx"&gt;quoting from Tim Ewald&lt;/a&gt; was spot on. 10 years of SOAP and most systems just are just strongly coupled RPC.&lt;br /&gt;&lt;br /&gt;Also, I agree that all the tools (and examples and sample code and ...) nearly universally pushes a view of Web Services that is really just RPC.&lt;br /&gt;&lt;br /&gt;[Note: I just switched from SOA to SOAP to WS. I'm trying to formulate another post that will articulate what I think distinguishes those from each other. Right now I'm just rambling...]&lt;br /&gt;&lt;br /&gt;There is one other thing about SOA that drives me bonkers. I'm hooked on architecture by constraint - limit the system in certain key areas to promote certain use and benefits. The four tenets of SOA don't do it to me at all.&lt;br /&gt;&lt;br /&gt;Tenet 1: Boundaries are Explicit&lt;br /&gt;(Sure, but isn't everything? Ok, so SQL based integration strategies don't fall into this category. How do I build a good boundary? What will version better? What has a lower barrier to mashup/integration?)&lt;br /&gt;&lt;br /&gt;Tenet 2: Services are Autonomous&lt;br /&gt;(Right. This is a great goal, but provides no guidance or boundaries to achieve it.)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;Tenet 3: Services share schema and contract, not class&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;(So do all of my OO programs with interface and classes. What is different from OO design that makes SOA something else?)&lt;br /&gt;&lt;br /&gt;Tenet 4: Service compatibility is based upon policy&lt;br /&gt;(This is a good start: the types and scope of policy can shape an architecture. The policies are the constraints in a system. There not really defined though, just a statement that they should be there.)&lt;br /&gt;&lt;br /&gt;Ah, I feel better getting that out.&lt;br /&gt;&lt;br /&gt;I asked "Where are the SOA Mashups?" and DevHawk responded:&lt;br /&gt;&lt;blockquote&gt;That's easy! They're inside the firewall where you can't see them! ;)&lt;/blockquote&gt;I'm so glad I procrastinated writing this because now I can just refer to this &lt;a href="http://www.infoq.com/news/2007/08/mashups-eai-2"&gt;InfoQ article&lt;/a&gt;. Gregor Hohpe's &lt;a href="http://www.infoq.com/news/2007/08/mashups-eai-2#view_9253"&gt;comment&lt;/a&gt; is pretty much my definition of mashup.&lt;br /&gt;The project you describe is an integration, but multi-schema, star-integration with a huge effort doesn't fit my definition of mashup.&lt;br /&gt;&lt;br /&gt;[1] Yes, I'm serious! I used &lt;a href="http://omniorb.sourceforge.net/"&gt;OmniORB&lt;/a&gt; with Python to build systems for about 2 years. I think CORBA with C++ might be more work than most WSDL based systems, but this was a very efficient development environment for strongly typed interfaces.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-4989321409692134911?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/4989321409692134911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=4989321409692134911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4989321409692134911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/4989321409692134911'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/08/soa-integration-rpc-and-constraints.html' title='SOA Integration: RPC and Constraints'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-482321580363324986</id><published>2007-08-01T18:48:00.000-07:00</published><updated>2007-08-01T20:12:50.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>REST, Serendipity, and Hard Work</title><content type='html'>&lt;a href="http://devhawk.net/"&gt;DevHawk&lt;/a&gt; found &lt;a href="http://johnheintz.blogspot.com/2007/07/integration-forethought-over.html"&gt;my comment&lt;/a&gt; on the "&lt;a href="http://blogs.msdn.com/jevdemon/archive/2007/07/20/soa-in-the-real-world-now-available.aspx"&gt;SOA in the Real World&lt;/a&gt;" book. DevHawk writes:&lt;br /&gt;&lt;blockquote&gt;Yeah, I'd rather not have to think about integration before hand either. On the other hand, I want integration that actually works. It sounds like John H. is suggesting here that REST somehow eliminates the need to consider integration up front. It doesn't.&lt;/blockquote&gt;I didn't mean to imply that building RESTful system would lead to magical integration without any hard work. I can see how that came across in my post, and I guess I got the reaction I asked for ;)&lt;br /&gt;&lt;br /&gt;Let me try again...&lt;br /&gt;&lt;br /&gt;I want to build systems using tools, techniques, designs, and architectures that maximize my investment in effort and work to produce value. If I put one unit of effort into building something, and I get more (or many more) than one unit of value for my effort, then I'm working in a high-leverage environment.&lt;br /&gt;&lt;br /&gt;REST uses constraints to encourage integration. If I pay the cost of building a RESTful system (uniform interface, single naming system, resource-based design, representation transfer, ...) then any other system can leverage my system - for at least some minimum degree of use. That is serendipity. This is the fundamental reason that mashups on the web can exist.&lt;br /&gt;&lt;br /&gt;Where are the SOA mashups?&lt;br /&gt;&lt;br /&gt;I think related to that question, DevHawk further says:&lt;br /&gt;&lt;blockquote&gt;...enterprises aren't interested in unexpected or serendipitous reuse. They want their reuse to be systematic and predictable.&lt;/blockquote&gt;I think we disagree here. Enterprises &lt;span style="font-weight: bold;"&gt;think&lt;/span&gt; they want systematic and predictable systems, but I suspect this is the equivalent of developers wishing distributed object systems worked despite latency and partial failures. I'm not suggesting enterprise  systems should set "not predictable" as a goal, but I do think that trying to make things too predictable often leads to fragile systems.&lt;br /&gt;&lt;br /&gt;Disclaimer: I've only read the first chapter of the book.&lt;br /&gt;&lt;br /&gt;Here are some more quotes.&lt;br /&gt;&lt;br /&gt;This one leads into the first chapter:&lt;br /&gt;&lt;blockquote&gt;“SOAs are like snowflakes – no two are alike.”&lt;br /&gt;- David Linthicum&lt;br /&gt;Consultant&lt;/blockquote&gt;I'm assuming it's included not as a supporting opinion, but the first chapter doesn't do much to disprove it! Obviously if this is true then every bit of integration will have to be fought for, bit by little tiny bit. When everything is different there are no high-leverage environments for integration.&lt;br /&gt;&lt;br /&gt;This next quote is why I don't feel (at least the first chapter) does much to discount the previous quote:&lt;br /&gt;&lt;blockquote&gt;For the purposes of this book, we will define SOA as:&lt;br /&gt;A loosely-coupled architecture designed to meet the business needs of the organization.&lt;/blockquote&gt;That loosely-coupled looks good. Loosely-coupled systems should be easier to integrate (as opposed to highly-coupled systems anyway).&lt;br /&gt;&lt;br /&gt;How does an SOA become loosely-coupled? The four tenets of services or the summarized SOA process (expose, compose, consume) listed in the first chapter don't tell me anything yet.&lt;br /&gt;&lt;br /&gt;Building systems is hard, building RESTful systems is also hard. The question of serendipity is this: &lt;blockquote&gt;If I build an application with constraint A instead of constrain B, will I get more integration and value elsewhere the total system?&lt;/blockquote&gt;The constraints that define REST, and inspire the Web, have a significant track record for enabling integration. Are they the only constraints that can lead to value? No, absolutely not.&lt;br /&gt;&lt;br /&gt;Can some of the constraints of REST be applied to SOA? Absolutely. I think an asynchronous, message-passing architecture with a uniform interface would be astoundingly interesting! I'm not the only one: see &lt;a href="http://savas.parastatidis.name/2005/01/29/544a6902-40e1-47e8-a51c-18776f3dd036.aspx"&gt;MEST&lt;/a&gt;, &lt;a href="http://www.ampq.com/"&gt;AMPQ&lt;/a&gt;, and &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-482321580363324986?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/482321580363324986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=482321580363324986' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/482321580363324986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/482321580363324986'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/08/rest-serendipity-and-hard-work.html' title='REST, Serendipity, and Hard Work'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-5274696070003835402</id><published>2007-07-26T14:21:00.000-07:00</published><updated>2007-07-26T14:24:07.387-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>SlideShare slides on Web App Scalability</title><content type='html'>These look very interesting, enjoy: &lt;a href="http://www.slideshare.net/group/webapps-scalability/slideshows"&gt;Web App Scalability Slides&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL, Digg, Twitter, Vox, LiveJournal, ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-5274696070003835402?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/5274696070003835402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=5274696070003835402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5274696070003835402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5274696070003835402'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/07/slideshare-slides-on-web-app.html' title='SlideShare slides on Web App Scalability'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-7098368345375236702</id><published>2007-07-25T18:49:00.000-07:00</published><updated>2007-07-25T19:11:49.537-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>Integration Forethought over Afterthought?</title><content type='html'>&lt;a href="http://devhawk.net/2007/07/25/Early+Afternoon+Coffee+105.aspx"&gt;DevHawk&lt;/a&gt; linked to a post by &lt;a href="http://blogs.msdn.com/jevdemon/archive/2007/07/20/soa-in-the-real-world-now-available.aspx"&gt;John Evdemon announcing an e-book&lt;/a&gt; from Microsoft on SOA.&lt;br /&gt;&lt;br /&gt;From the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=cb2a8e49-bb3b-49b6-b296-a2dfbbe042d8&amp;displaylang=en"&gt;SOA in the Real World &lt;/a&gt;book page:&lt;br /&gt;&lt;blockquote&gt;&lt;span&gt;SOA is an architectural approach to creating systems built from autonomous services. With SOA, integration becomes forethought rather than afterthought.This book introduces a set of architectural capabilities, and explores them in subsequent chapters.&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;&lt;/span&gt;Now, I haven't read the book, so take this with appropriate disclaimers of ignorance.&lt;br /&gt;&lt;br /&gt;I, for one, would rather build on an architecture that promotes integration as an &lt;span style="font-weight: bold;"&gt;afterthought&lt;/span&gt;, so I don't have to think about it before hand!!!&lt;br /&gt;&lt;br /&gt;This &lt;a href="http://tech.groups.yahoo.com/group/rest-discuss/message/8873"&gt;post to rest-discuss by Nick Gall&lt;/a&gt; quotes some important thinkers. Here is the relevant section:&lt;br /&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;span style="font-family:arial;"&gt;Unexpected reuse is the value of the web&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Tim Berners-Lee &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;i&gt;&lt;span style="font-family:arial;"&gt;Two of the goals of REST: independent evolvability and design-for-serendipity&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Roy T. Fielding&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;i&gt;&lt;span style="font-family:arial;"&gt;Engineer for serendipity&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Roy T. Fielding&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-7098368345375236702?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/7098368345375236702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=7098368345375236702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/7098368345375236702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/7098368345375236702'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/07/integration-forethought-over.html' title='Integration Forethought over Afterthought?'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16853210481690002.post-5287636013458660397</id><published>2007-07-10T11:49:00.000-07:00</published><updated>2007-07-11T09:59:16.755-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>Writings on Scalability Topics</title><content type='html'>I suggest reading these blogs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pl.atyp.us/"&gt;Jeff Darcy (Canned Platypus)&lt;/a&gt; has an great blog, and also this article on &lt;a href="http://pl.atyp.us/content/tech/servers.html"&gt;High Performance Server Architecture&lt;/a&gt;. The article talks about the performance and scalability implications of&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Data copies&lt;/li&gt;&lt;li&gt;Context switches&lt;/li&gt;&lt;li&gt;Memory allocation&lt;/li&gt;&lt;li&gt;Lock contention&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://www.dancres.org/blitzblog/"&gt; Dan Creswell &lt;/a&gt;(author of &lt;a href="http://www.dancres.org/blitz/index.html"&gt;Blitz JavaSpaces&lt;/a&gt;) has collected a &lt;a href="http://www.dancres.org/reading_list.html"&gt;Distributed Systems Reading List&lt;/a&gt;.  The list include references to key papers from Google, MySpace, eBay, Amazon, and also some distributed theory papers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16853210481690002-5287636013458660397?l=johnheintz.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnheintz.blogspot.com/feeds/5287636013458660397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=16853210481690002&amp;postID=5287636013458660397' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5287636013458660397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16853210481690002/posts/default/5287636013458660397'/><link rel='alternate' type='text/html' href='http://johnheintz.blogspot.com/2007/07/writings-on-scalability-topics.html' title='Writings on Scalability Topics'/><author><name>John Heintz, President Gist Labs</name><uri>http://www.blogger.com/profile/03499967007542752897</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05728062383374302290'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry></feed>