<?xml version="1.0" encoding="UTF-8"?>
<rss version="0.91"><channel><title>RSSMix.com Mix ID 115244</title><generator>RSSMix</generator><link>http://www.rssmix.com/</link><description>This feed was created by mixing existing feeds from various sources.</description><language>en-gb</language>
<item><title type="text">What is Scrum?</title><description type="html">Recently, a friend of mine asked me &quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;What is Scrum?&lt;/span&gt;&quot; &lt;p&gt;I started thinking what is the best (and quickest) path to introduce a person to Scrum? So, I started my research for references; and here is a list of online resources that I feel can be used to get a quick familiarity with Scrum.&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dcmkvfrg_60st5vvxc8' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Here are some more online resources:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilechronicles.com/blog/2008/03/the-agile-eleva.html&quot;&gt;The Agile Elevator Speech&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/guest035e0d/learn-scrum-engineering-in-5-minutes&quot;&gt;Scrum in Five Minutes&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/ddebowczyk/an-introduction-to-scrum/&quot;&gt;An Introduction to Scrum&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.blogger.com/Scrum&quot; docid=&quot;'-7230144396191025011&quot;&gt;Scrum et al.&lt;/a&gt; - Ken Schwaber (who created Scrum) on Scrum at Google&lt;/li&gt;&lt;li&gt;And, of course, if you are (American) football fan, you can &lt;a href=&quot;http://www.scrumalliance.org/articles/83-delivering-the-w-one-game-at-a-time&quot;&gt;read my article&lt;/a&gt; that draws similarity between &lt;span class=&quot;Apple-style-span&quot; style=&quot;FONT-STYLE: italic&quot;&gt;The Partiots&lt;/span&gt; - a Football team and some of the Scrum practices. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-6457500399915108834?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2009/01/what-is-scrum.html</link><guid>307f1ebb30af74f78a9019a9aeffe76f</guid></item>
<item><title type="text">Product Backlog, Product Owner, and Business Value (BV)</title><description type="html">As we all know very well, the Product Backlog (PB) is very critical artifact in Scrum and Agile. PB should be the central repository of all the work that needs to be completed in a Project. We capture all the work (as we know as of Today) in the form of Epics, Features, and Stories. The Product Owner (PO) would then be responsible for providing the priorities on them. The PO may also decide to use the Business Value (BV) to help him/her prioritize the Product Backlog.&lt;p&gt;&lt;p&gt;While there is no explicit formula for Business Value, the Product Owner should be making implicit decisions based on his/her experiences. While assigning BV to Features and Epics, the Product Owner  may consider some of the following criteria:&lt;p&gt; *   What the team has accomplished so far?&lt;br&gt; *   What the team can complete within the Release Cycle?&lt;br&gt; *   Complexities&lt;br&gt; *   Dependencies&lt;br&gt; *   Impediments&lt;br&gt; *   Market Size&lt;br&gt; *   Market Timing&lt;br&gt; *   Opportunity Cost&lt;p&gt;If you &amp;#39;zoom&amp;#39; into these criteria and look at them closely, you will realize the first few criteria drive the Priority and Sequencing of the Feature and Epics. The last three, Market Size, Market Timing, and Opportunity Cost, are the ones that will drive the Business Value.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-7938323981441660050?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2008/11/product-backlog-product-owner-and.html</link><guid>f2697b789e07238ae67f1b66470ffe88</guid></item>
<item><title type="text">Harvard Business Publishing and Agile..</title><description type="html">I recently read an article from Harvard Business Publishing on &quot;&lt;a href=&quot;http://harvardbusinessonline.hbsp.harvard.edu/hbsp/hbo/articles/article.jsp?articleID=R0309H&amp;amp;ml_action=get-article&amp;amp;pageNumber=1&amp;amp;cm_mmc=npv-_-MGMT_TIP-_-MAR_2008-_-MTOD0326&quot;&gt;Why Good Projects Fail&lt;/a&gt;&quot;. As we all know, the failure rate for projects is very high; more than half of the projects fail! This is especially troublesome in Traditional Project Management as you would not know if the project is failing until it is too late (remember, one big bang delivery!) &lt;p&gt;&lt;p&gt;In this Harvard Business Publishing, the author suggests using rapid-results initiatives in order to minimize and mitigate the risks of failure. What he means by that is &quot;to use small projects designed to quickly delivery mini-versions of the big project's end results&quot;. Do you 'smell' Sprints here!? &lt;p&gt;&lt;p&gt;He goes on to list several defining characteristics of this rapid-results initiatives approach such as: &lt;p&gt;* Results oriented (As we know, with each sprint, our goal is to deliver value to the Product Owner.)&lt;br /&gt;* Vertical (Refers to Cross functional team)&lt;br /&gt;* Fast (Refers to Sprints and Releases) &lt;p&gt;There are many parallels in this article and what we do in Agile landscape. Check out the article &lt;a href=&quot;http://harvardbusinessonline.hbsp.harvard.edu/hbsp/hbo/articles/article.jsp?articleID=R0309H&amp;amp;ml_action=get-article&amp;amp;pageNumber=1&amp;amp;cm_mmc=npv-_-MGMT_TIP-_-MAR_2008-_-MTOD0326&quot;&gt;here&lt;/a&gt; to find out more details.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-3606026211050934235?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2008/12/harvard-business-publishing-and-agile.html</link><guid>9be2b29cde55e18bd82017e84aeae081</guid></item>
<item><title type="text">Reading List..</title><description type="html">I have been involved in transitioning two of the largest organizations (in the North America) to value driven project methodologies such as Agile, Scrum, and Lean. During these transitions, I have coached several teams, managers, and executives on Agile Practices and principles, and have often been asked for recommended reading list. I have accumulated a list of references that I often recommend my new teams read when starting their journey on Agile. Here is the list for your reference.&lt;br /&gt;&lt;h2&gt;Books&lt;/h2&gt;&lt;br /&gt;&lt;li&gt;Agile Project Management with Scrum (Schwaber)&lt;/li&gt;&lt;li&gt;User Stories Applied (Cohn)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Scrum and XP from the Trenches.pdf (Kniberg)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Scaling Software Agility (Leffingwell)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Agile Estimating and Planning (Cohn)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Implementing Lean Software Development: From Concept to Cash (Poppendieck)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Test Driven Development: By Example (Beck)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Agile Software Development with SCRUM (Schwaber)&lt;br /&gt;&lt;h2&gt;Online References&lt;/h2&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.scrumalliance.org/articles&quot;&gt;Scrum Alliance&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=ALWHCUNU8Nw&quot;&gt;Being Agile is our favourite thing &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilemanifesto.org/&quot;&gt;Agile Manifesto &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Agile_software_development&quot;&gt;Agile Wikipedia &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.mountaingoatsoftware.com/blogs&quot;&gt;Mountain Goat Software &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://agileconsortium.pbwiki.com/Presentations&quot;&gt;Jeff Sutherland NYC Spin&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.crisp.se/ScrumAndXpFromTheTrenches.html&quot;&gt;Scrum and XP from the Trenches&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.projectconnections.com/articles/021307-mcdonald.html&quot;&gt;Agile Project Leadership &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilemanagement.net/&quot;&gt;Agile Management&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=pqeJFYwnkjE&quot;&gt;Ward Cunningham on the origin of the term Technical Debt &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://agilethinking.net/blog/2007/02/21/when-is-scrum-not-scrum/&quot;&gt;Agile Thoughts &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.stickyminds.com/sitewide.asp?ObjectId=6851&amp;amp;Function=DETAILBROWSE&amp;amp;ObjectType=COL&quot;&gt;Testers Shine on Agile Projects &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilemodeling.com/essays/examiningBRUF.htm&quot;&gt;Requirements Up Front &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilemodeling.com/essays/agileRequirementsBestPractices.htm&quot;&gt;Agile Requirements &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilemodeling.com/essays/businessAnalysts.htm&quot;&gt;BSA Role &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://martinfowler.com/articles/itsNotJustStandingUp.html&quot;&gt;Its Not Just Standing Up &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.joelonsoftware.com/articles/fog0000000024.html&quot;&gt;Big Macs vs. The Naked Chef &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.ddj.com/architect/200001986?pgno=1&quot;&gt;Agile Has Crossed the Chasm &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.think-box.co.uk/blog/2006/11/constructive-disruption-and.html&quot;&gt;Constructive Disruption and Compromised Agility &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.availagility.wordpress.com/2008/10/28/kanban-flow-and-cadence/&quot;&gt;Kanban in a nutshell&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Learn from the experts: Blogs, RSS Feeds&lt;/h2&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.controlchaos.com/&quot;&gt;Schwaber on Scrum&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://feeds.feedburner.com/AgileAdvice&quot;&gt;Agile Advice &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilealliance.org/feed/rss2_all&quot;&gt;Agile Alliance   &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.agilemanagement.net/Articles/Weblog/rssagileman.xml&quot;&gt;Agile Management Blog &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://feeds.feedburner.com/ImplementingScrum&quot;&gt;Implementing Scrum &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://del.icio.us/rss/tag/agile&quot;&gt;Pages tagged with 'agile' on del.icio.us &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://steve-yegge.blogspot.com/feeds/posts/default&quot;&gt;Stevey's Blog Rants: Good Agile, Bad Agile &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://video.google.com/videoplay?docid=8795214308797356840&quot;&gt;agile at google&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.mountaingoatsoftware.com/system/presentation/file/51/bayXP_070320_PlanningAgileProjects.pdf&quot;&gt;The Planning Onion: Five Levels of Agile Planning&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Shameless post: link to my blog&lt;/h2&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.scrumalliance.org/articles/119-unlearn-what-you-have-learned&quot;&gt;Unlearn what you have learnt&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.scrumalliance.org/articles/83-delivering-the-w-one-game-at-a-time&quot;&gt;Delivering the W, One Game at a Time&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://everythingscrum.blogspot.com/2009/07/field-of-view.html&quot;&gt;Field of View &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://everythingscrum.blogspot.com/2009/01/what-is-scrum.html&quot;&gt;a quick introduction: What is Scrum? &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-1901593174856216821?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2009/08/reading-list.html</link><guid>1ea9bc3b5146409456e8ac62767f4f93</guid></item>
<item><title type="text">Star Wars and Agile..</title><description type="html">&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.agilex.fr/wp-content/uploads/2009/03/star-wars-statue-yoda.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 236px;&quot; src=&quot;http://www.agilex.fr/wp-content/uploads/2009/03/star-wars-statue-yoda.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align=&quot;left&quot;&gt;In the Star Wars movie The Empire Strikes Back, Luke tries unsuccessfully to rescue his X-wing fighter from the swamp. After some time, he gives up. He tells Jedi Master Yoda that lifting the fighter is impossible with the force, the new approach Yoda is trying to teach him. Yoda has these words of wisdom for him:&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;em&gt;&lt;span style=&quot;color:#3333ff;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color:#ffffff;&quot;&gt;&quot;You must unlearn what you have learned.&quot;&lt;/span&gt;&lt;/strong&gt; &lt;/span&gt;&lt;/em&gt;&lt;/div&gt;&lt;p&gt;Scrum is no different! Like the Jedi force, the Scrum framework is conceptually easy; it's putting Scrum into practice that is difficult. In order for a team to be successful, the team members must unlearn what they have learned so far in their careers. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Check out &lt;a href=&quot;http://www.scrumalliance.org/articles/119-unlearn-what-you-have-learned&quot;&gt;my recent article&lt;/a&gt; for more details on what habits must be broken to succeed in Agile Adoption.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-7897771432435669050?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2009/02/luke-star-wars-and-agile.html</link><guid>1d19ec3123c16184a1830e0b24d373fc</guid></item>
<item><title type="text">Google CEO on pair programming..</title><description type="html">Recently, I read an &lt;a href=&quot;http://www.businessweek.com/magazine/content/08_19/b4083054277984.htm?chan=innovation_innovation+%2B+design_top+stories&quot;&gt;article on Business Week&lt;/a&gt;. In this article Google CEO Eric Schmidt describes the simple principles that helps the company drive innovation.&lt;br /&gt;&lt;br /&gt;In this interview, he mentions that the best programming team is a &quot;&lt;b&gt;telephone call&lt;/b&gt;,&quot; which is two people, you and I, programming together. Sounds familiar! He is describing the pair programming.&lt;br /&gt;&lt;br /&gt;He goes on to mention that the second-best programming team is, everybody fits into a single room. All other variants are bad. Do I hear co-location here?&lt;br /&gt;&lt;br /&gt;There you have it! Even Google CEO is promoting pair programming and co-location.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-8712226787255218167?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2008/05/google-ceo-on-pair-programming.html</link><guid>8eac6d760d14b3625bf9a65d94a551e2</guid></item>
<item><title type="text">Lessons from the battle front..</title><description type="html">&lt;a href=&quot;http://www.scrumalliance.org/events/5--chicago-scrum-gathering&quot;&gt;&lt;img style=&quot;FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 167px; CURSOR: hand; HEIGHT: 207px&quot; height=&quot;266&quot; alt=&quot;&quot; src=&quot;https://app.e2ma.net/userdata/10370/images/medium/scaled_e1196096361.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;I recently presented at &lt;a href=&quot;http://www.scrumalliance.org/events/5--chicago-scrum-gathering&quot; target=&quot;_blank&quot;&gt;Annual Scrum gathering in Chicago, IL&lt;/a&gt; on April 14, 2008 on this topic. In this presentation we discussed opportunities and challenges of corporate roll out of Agile and Scrum. I am happy to inform that the presentation was a great success. There was lot of interaction from the participants during our presentation. This (participant interaction) is always a a good sign! I also got to meet well-known players in the Scrum landscape as well. All in all, it was very rewarding experience.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.scrumalliance.org/resource_download/342&quot;&gt;Click&lt;/a&gt; here to access our presentation material posted on Scrum Alliance website.&lt;br /&gt;&lt;br /&gt;Please don't hesitate to contact me if I can be of any further help.&lt;br /&gt;Thanks.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-4682632728377614973?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2008/04/lessons-from-battle-front.html</link><guid>d60c0d146ad6f521300db85ee9294f46</guid></item>
<item><title type="text">Field of View..</title><description type="html">&lt;div style=&quot;text-align: left;&quot;&gt;Field of View is defined as &lt;i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Field_of_view&quot;&gt;the angular extent of the observable world that isseen at any givenmoment.&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;As we all know, in Agile, planning is a continuous process. We do not believe in big planning upfront; rather planning is a continuous process and we do planning at different layers, at different stages in the life of a project. Mike Cohn refers to these multi-layer planning as &lt;a href=&quot;http://www.mountaingoatsoftware.com/system/presentation/file/51/bayXP_070320_PlanningAgileProjects.pdf&quot;&gt;Planning Onion&lt;/a&gt;.&lt;img src=&quot;http://3.bp.blogspot.com/_V7pvAtJd-34/Sk359XvSWRI/AAAAAAAABrI/CExu5x8-YbQ/s200/Planning+Onion.jpg&quot; style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 196px;&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5354210364753074450&quot; /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;At different layers of this Planning Onion, the project team focuses on varying level of details at different stages of project.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;At the inner most layer, the daily planning, team focuses on the particular day (What am I planning to do today? Are there any impediments?). So, at the inner most layer, we can say that our field of view is just that particular day, we focus on one day and thats about it.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next layer is Sprint planning, often refered to as Iteration planning. The team is now expanding the full of view and now focusing on one iteration. Team's field of view is expanding from one day to couple of weeks (depending upon the length of the iteration.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So as we move from the inner most layer to outer layers, the field of view is expanding. As you get to the inner layer the details become more and more clear. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If I put a flashlight in front of this planning onion, you will see that the light is brightest near the flash light at the inner most layers, and as we go the outer most layer the light becomes more and more dim, the details become hazy. So, with this flash light, you would still be able to see (kind of) the road map if you were looking far ahead but at the same time it would not give you lot of details.&lt;img src=&quot;http://2.bp.blogspot.com/_V7pvAtJd-34/Sk36FzjXMhI/AAAAAAAABrQ/mkmZxXC-PQk/s320/Field+of+View.jpg&quot; style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 275px; height: 320px;&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5354210509658206738&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6203713893180006180-1969986926386149340?l=everythingscrum.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://everythingscrum.blogspot.com/2009/07/field-of-view.html</link><guid>13f86c7278b75e7735c770c2418bb7e1</guid></item>
<item><title type="html">Migrating from Rails to Grails</title><link>http://dturanski.wordpress.com/2009/01/19/rails2grails/feed/atom/</link><description type="html" xml:base="http://dturanski.wordpress.com/2009/01/19/rails2grails/">&lt;br /&gt;&lt;p&gt;I have been developing with Java for over 10 years and over the last couple of years got interested in Ruby and Rails. I have developed a few Rails applications mostly for personal use and use Ruby extensively on the job for utilities that I used write in Perl. &lt;/p&gt;&lt;p&gt;So I am a huge fan of Ruby and Rails, and then along came Grails. Grails is an implementation of Rails written in Groovy. Derived from Java syntax, Groovy is easy for Java developers to pick up. In addition, Grails uses familiar Java frameworks under the covers, most notably Spring and Hibernate. Recently SpringSource acquired G2one, the company behind Grails and some interesting work has been happening to integrate &lt;a href=&quot;http://graemerocher.blogspot.com/2008/12/grails-spring-integration.html&quot;&gt;Grails and Spring integration&lt;/a&gt;.  Reading the Grails documents and various posts, it was clear to me that Grails down-plays its Rails heritage.  I expected some significant differences so I thought it would be interesting to port a Rails application to Grails. &lt;/p&gt;&lt;p&gt;I started with the &lt;a href=&quot;http://guides.rails.info/getting_started_with_rails.html&quot;&gt;Rails tutorial&lt;/a&gt; which guides you through a simple blog application. I used Mysql 5 for the database and got it up and running in no time. The application allows you to post blog entries and comments on the entries. Two tables are created, &lt;code&gt;posts&lt;/code&gt; and &lt;code&gt;comments&lt;/code&gt;. Of course there is a one-to-many relationship, so a post has many comments and a comment belongs to a post. &lt;/p&gt;&lt;p&gt;I basically wanted to retain the existing database tables and create the application with Grails. In the process, I discovered some of the key differences between these two frameworks. &lt;/p&gt;&lt;p&gt;The first step is to install Grails. It&amp;#8217;s best to stick with the stable release. Being adventurous, I decided to check out the latest code from the svn trunk and build it myself. This is currently version 1.0.5. The latest stable version is 1.0.4. There is also a 1.1 beta release. Version 1.0.5, and 1.1 beta are buggy and caused some problems with object relational mapping. I eventually resigned myself to using 1.0.4, and everything worked as expected. &lt;/p&gt;&lt;p&gt;To create the blog application, type&lt;br /&gt;&lt;code&gt;grails create-app blog&lt;/code&gt;&lt;br /&gt;This is analogous to the &lt;code&gt;rails&lt;/code&gt; command. It creates the directory structure for your application and sets up a default configuration.&lt;/p&gt;&lt;p&gt;Next, configure the data source for Mysql. Edit grails-app/conf/Datasource.groovy, so that it looks something like this (changes are bolded):&lt;/p&gt;&lt;div style=&quot;border:black solid 1px;background:#EEEEEE;&quot;&gt;&lt;code&gt;&lt;br /&gt;dataSource&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;pooled = true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;driverClassName = &quot;com.mysql.jdbc.Driver&quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;username = &quot;root&quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;password = &quot;mysql&quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;dialect = &quot;org.hibernate.dialect.MySQL5Dialect&quot;&lt;/b&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;hibernate {&lt;br /&gt;&amp;nbsp;&amp;nbsp;cache.use_second_level_cache=true&lt;br /&gt;&amp;nbsp;&amp;nbsp;cache.use_query_cache=true&lt;br /&gt;&amp;nbsp;&amp;nbsp;cache.provider_class=&lt;br /&gt;'com.opensymphony.oscache.hibernate.OSCacheProvider'&lt;br /&gt;}&lt;br /&gt;// environment specific settings&lt;br /&gt;environments {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;development {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataSource {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;//dbCreate = &quot;create-drop&quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;url = &quot;jdbc:mysql://localhost/blog_development&quot;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;test {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataSource {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//dbCreate = &quot;update&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url = &quot;jdbc:mysql://localhost/blog_test&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;production {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataSource {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//dbCreate = &quot;update&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url = &quot;jdbc:mysql://localhost/blog_production&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Note that like Rails, Grails provides development, test, and production environments. This configuration provides access to the Mysql database I created with Rails. Note the &lt;code&gt;&lt;b&gt;dbCreate&lt;/b&gt;&lt;/code&gt; property is commented out. The default behavior for the development environment is to drop and re-create the tables every time you run Grails. In this case, I want to retain the schema and the existing data. Removing this property prevents Grails from destroying the database. &lt;/p&gt;&lt;p&gt;Next, you need to provide the declared driver class. This is the standard JDBC driver for Mysql in this case and is provided in &lt;code&gt;&lt;b&gt;mysql-connector-java-5.0.8-bin.jar&lt;/b&gt;&lt;/code&gt;, for example.  Install this in the application &lt;code&gt;lib&lt;/code&gt; directory.&lt;/p&gt;&lt;p&gt;Now, create the domain classes. These are somewhat analogous to the Rails model (ActiveRecord) classes. Grails provides &lt;a href=&quot;http://grails.org/GORM&quot;&gt;Grails ORM (GORM)&lt;/a&gt; which uses Hibernate under the covers.  GORM provides some nice features, and a nice DSL, but is somewhat incompatible with Rails in its &amp;#8220;convention over configuration.&amp;#8221;  Key differences include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No pluralization of table names&lt;/li&gt;&lt;li&gt;Automatic record versioning for optimistic locking&lt;/li&gt;&lt;li&gt;No timestamping records by default. Timestamping uses different field names by default&lt;/li&gt;&lt;li&gt;DB column names with underscores are converted to camelCase field names by default&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So after some experimentation, the Rails compatible domain classes, providing the same features as in the &lt;a href=&quot;http://guides.rails.info/getting_started_with_rails.html&quot;&gt;Rails tutorial&lt;/a&gt; , are&lt;/p&gt;&lt;div style=&quot;border:black solid 1px;background:#EEEEEE;&quot;&gt;&lt;code&gt;&lt;br /&gt;class Post {&lt;br /&gt;&amp;nbsp;&amp;nbsp;String title&lt;br /&gt;&amp;nbsp;&amp;nbsp;String name&lt;br /&gt;&amp;nbsp;&amp;nbsp;String content&lt;br /&gt;&amp;nbsp;&amp;nbsp;Date lastUpdated&lt;br /&gt;&amp;nbsp;&amp;nbsp;Date dateCreated&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;static constraints = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title(minSize:5, blank:false)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name(blank:false)&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;static hasMany = [ comments : Comment]&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;static mapping  = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table  'posts'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columns {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content type : 'text'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastUpdated column:'updated_at'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateCreated column:'created_at'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;border:black solid 1px;background:#EEEEEE;&quot;&gt;&lt;code&gt;&lt;br /&gt;class Comment {&lt;br /&gt;&amp;nbsp;&amp;nbsp;String commenter&lt;br /&gt;&amp;nbsp;&amp;nbsp;String body&lt;br /&gt;&amp;nbsp;&amp;nbsp;Date lastUpdated&lt;br /&gt;&amp;nbsp;&amp;nbsp;Date dateCreated&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;static mapping  = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table   'comments'&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;columns {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body type: 'text'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastUpdated column:'updated_at'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateCreated column:'created_at'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;static belongsTo = [post: Post]&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Notice the boilerplate code required here. The timestamp fields are Grails defaults and will be automatically updated as appropriate. Unlike, Rails, they must be explicitly declared and mapped to the Rails conventional column names.&lt;/p&gt;&lt;p&gt;Versioning is turned off, as the tables do not include version columns. (I am a big fan of optimistic locking, but this is KISS). The &lt;code&gt;constraints&lt;/code&gt; closure in the &lt;code&gt;Post&lt;/code&gt; class demonstrates how field validation is done in Grails, similar to the Rails tutorial.&lt;/p&gt;&lt;p&gt;I struggled for a while attempting to refactor this code into a base class. I eventually gave up. GORM provides some conventions around mapping inherited domain classes. Also, I couldn&amp;#8217;t figure out how to get the &lt;code&gt;mapping&lt;/code&gt; closure to execute the base class mapping.  It is likely due to my lack of Groovy and GORM expertise, so I suspect there is an easy way to do this. &lt;/p&gt;&lt;p&gt;From this point, it is fairly straight forward. Execute the commands:&lt;br /&gt;&lt;code&gt;grails generate-all post&lt;/code&gt;&lt;br /&gt;&lt;code&gt;grails generate-all comment&lt;/code&gt;&lt;/p&gt;&lt;p&gt;to generate the controller and view scaffolding code. Then&lt;br /&gt;&lt;code&gt;grails run-app&lt;/code&gt;&lt;br /&gt;and you should be good to go. &lt;/p&gt;&lt;p&gt;As a final step, Grails scaffolding creates inputs for dateCreated and lastUpdated. This also behaves differently then Rails. So I went in and edited the view pages, e.g., &lt;code&gt;grails-app/views/post/create.gsp and removed the date fields. &lt;/p&gt;&lt;div id=&quot;attachment_18&quot; class=&quot;wp-caption alignnone&quot; style=&quot;width: 460px&quot;&gt;&lt;img src=&quot;http://dturanski.files.wordpress.com/2009/01/rails_blog.png?w=450&amp;#038;h=312&quot; alt=&quot;The blog application on Rails&quot; title=&quot;rails_blog&quot; width=&quot;450&quot; height=&quot;312&quot; class=&quot;size-full wp-image-18&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The blog application on Rails&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id=&quot;attachment_19&quot; class=&quot;wp-caption alignnone&quot; style=&quot;width: 460px&quot;&gt;&lt;img src=&quot;http://dturanski.files.wordpress.com/2009/01/blog_grails.png?w=450&amp;#038;h=312&quot; alt=&quot;The blog application on Grails&quot; title=&quot;blog_grails&quot; width=&quot;450&quot; height=&quot;312&quot; class=&quot;size-full wp-image-19&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The blog application on Grails&lt;/p&gt;&lt;/div&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/dturanski.wordpress.com/1/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/dturanski.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/dturanski.wordpress.com/1/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/dturanski.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/dturanski.wordpress.com/1/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/dturanski.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/dturanski.wordpress.com/1/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/dturanski.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/dturanski.wordpress.com/1/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/dturanski.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=dturanski.wordpress.com&amp;blog=6237458&amp;post=1&amp;subd=dturanski&amp;ref=&amp;feed=1&quot; /&gt;</description><guid>9890d04f36f3db45b66fc9e5d8ffbb03</guid></item>
<item><title type="html">The Return of Domain Specific Languages</title><link>http://dturanski.wordpress.com/2009/02/21/the-return-of-domain-specific-languages/feed/atom/</link><description type="html" xml:base="http://dturanski.wordpress.com/2009/02/21/the-return-of-domain-specific-languages/">&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Domain_Specific_Language&quot;&gt;Domain Specific Languages (DSL)&lt;/a&gt; are among the hottest new trends in computer science.  A DSL is a programming language designed for a specific problem domain.  This topic is getting a lot of attention these days because a DSL can greatly simplify programming by providing semantics that more naturally express automated solutions for the associated domain. A DSL can be thought of as a domain-specific 4GL, much easier to program in than a general purpose programming language, or 3GL, such as Java, C++, etc.   But is this really a new idea?&lt;/p&gt;&lt;p&gt;In the late 1950s, when computing was in its infancy, DSLs were actually state of the art. In 1957, my father, the late William Joseph Turanski and his colleage, Anatol W. Holt, were employed at the Univac Applications Research Center of the Remington Rand Univac division of the Sperry Rand Corporation (now Unisys).  Their primary focus was the development of a Generalized Programming (GP) system (renamed FLEXIMATIC by the marketing dudes).  This was basically the first general high level language compiler.  Being a completely new field, computer scientists were still trying to devise basic &amp;#8220;naming aids&amp;#8221; such as symbolic addressing, mnemonic devices, and convenient notations, that could be efficiently parsed by a computer and correctly mapped to computer instructions.  However, compilers for specific types of computing problems were commonplace.&lt;/p&gt;&lt;p&gt;Holt describes the situation in &lt;a href=&quot;http://portal.acm.org/citation.cfm?id=368851&amp;amp;dl=ACM&amp;amp;coll=ACM&quot;&gt;General Purpose Programming Systems&lt;/a&gt;, a technical report he authored, dated October 30, 1957, based on a talk given before the ACM in Houston, in June 1957 (I own a hard copy).  In reference to GP, he states:&lt;/p&gt;&lt;div id=&quot;attachment_36&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 295px&quot;&gt;&lt;img src=&quot;http://dturanski.files.wordpress.com/2009/02/holt_technical_report.jpg?w=285&amp;#038;h=300&quot; alt=&quot;General Purpose Programming Systems by Anatol W. Holt October 30, 1957&quot; title=&quot;holt_technical_report&quot; width=&quot;285&quot; height=&quot;300&quot; class=&quot;size-medium wp-image-36&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;General Purpose Programming Systems by Anatol W. Holt October 30, 1957&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;#8220;The system differs from other compilers,&amp;#8230;, in that it aims to provide the programmer with a set of services equally applicable to the solution of any problem &amp;#8211; services, in other words, which are claimed to be altogether &amp;#8220;general purpose&amp;#8221;.  Therefore the system contains no special design features which make it better adapted to one area of computation than another.&amp;#8221;&lt;/p&gt;&lt;p&gt;One can infer from this, that designing a general purpose language was a very challenging proposition.  Similar to developing a general solution in mathematics or science, you first start with specific working examples and try to determine what they have in common to arrive at a generalization.  Such was the state of computing in 1950s.  There were specific language compilers developed for commercial use in various mathematics and business domains, but the general solution was still being worked out.   Holt describes the state of the art:&lt;/p&gt;&lt;p&gt;&amp;#8220;In the development of most compiling systems, the designers begin with a special range of problems for which they intend their systems to be useful.  They invent special notations which they consider naturally adapted to the area of problems in question, and they construct a translating mechanism with just enough generality to cope with these notations.&amp;#8221;&lt;/p&gt;&lt;p&gt;This is a pretty fair description of a modern DSL.  But of course this model didn&amp;#8217;t scale very well.  As Holt observes,&lt;/p&gt;&lt;p&gt;&amp;#8220;While&amp;#8230;special notation for a given area of problems&amp;#8230; may be very useful and important&amp;#8230;, the ability to add arbitrary, new notation is even more important than any given set of special notations. &amp;#8230; we cannot even hope&amp;#8230;to subdivide the entire universe of problems into fixed areas, each with a well-adapted notation.  For example, if I have devised on notation satisfactory for business problems and another notation satisfactory for algebra,  I am still unable to write convenient coding for problems which&amp;#8230;involve a lot of data handling and algebraic computation.&amp;#8221;&lt;br /&gt;&lt;div id=&quot;attachment_32&quot; class=&quot;wp-caption aligncenter&quot; style=&quot;width: 310px&quot;&gt;&lt;img src=&quot;http://dturanski.files.wordpress.com/2009/02/turanski_holt.jpg?w=300&amp;#038;h=213&quot; alt=&quot;William Turanski and Anatol Holt at the Univac 1, circa 1957&quot; title=&quot;turanski_holt&quot; width=&quot;300&quot; height=&quot;213&quot; class=&quot;size-medium wp-image-32&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;William Turanski and Anatol Holt at the Univac 1, circa 1957&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;In the conclusion, Holt writes:&lt;/p&gt;&lt;p&gt;&amp;#8220;In summary, &amp;#8230;I claim that it is possible to construct a general purpose compiler&amp;#8230;The theoretical foundations for such compiling systems are now being developed at Remington Rand.  Early examples, such as GP for UNIVAC 1, demonstrate the practical utility of a system designed from this point of view.&amp;#8221;&lt;/p&gt;&lt;p&gt;The rest is history. Sadly my father died as a result of an automobile accident while en route to the Algol 60 conference in Paris.  Algol was of course a forerunner to modern languages such as C and Java.  I&amp;#8217;m sure, if alive today, he would have appreciated that the wheel has once again come full circle.&lt;/p&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/dturanski.wordpress.com/31/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/dturanski.wordpress.com/31/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/dturanski.wordpress.com/31/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/dturanski.wordpress.com/31/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/dturanski.wordpress.com/31/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/dturanski.wordpress.com/31/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/dturanski.wordpress.com/31/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/dturanski.wordpress.com/31/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/dturanski.wordpress.com/31/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/dturanski.wordpress.com/31/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=dturanski.wordpress.com&amp;blog=6237458&amp;post=31&amp;subd=dturanski&amp;ref=&amp;feed=1&quot; /&gt;</description><guid>d9ff4457e37b06c8ba43738afc5bef49</guid></item>
<item><title type="html">Dependency Injection Explained in 2 Minutes</title><link>http://gprussell.net/blog/2009/10/31/dependency-injection-explained-2-mins/feed/atom/</link><description type="html" xml:base="http://gprussell.net/blog/2009/10/31/dependency-injection-explained-2-mins/">&lt;p&gt;Bad - MyBar is tightly coupled to MyFoo&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public class MyFoo{    public void someMethod() {         ...    }}public class MyBar {    private MyFoo foo = new MyFoo;}&lt;/pre&gt;&lt;p&gt;Good - MyBar refers to the interface Foo; to change to a different implementation you only have to change where MyFoo is instantiated.&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public interface Foo{    public void someMethod();}public class MyFoo implements Foo{    public void someMethod() {         ...    }}public class MyBar {    private Foo foo = new MyFoo();}&lt;/pre&gt;&lt;p&gt;Better - MyBar refers to interface Foo and gets the implementation by calling a factory; the factory decides which implementation of Foo to return.&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public interface Foo{    public void someMethod();}public class MyFoo implements Foo{    public void someMethod() {         ...    }}public class MyFooFactory {    public static Foo getInstance() {        return new MyFoo();    }}public class MyBar {    private Foo foo = FooFactory.getInstance();}&lt;/pre&gt;&lt;p&gt;The getInstance() method can take, say, a Properties parameter so the client can supply attributes about what kind of Foo he wants.&lt;/p&gt;&lt;p&gt;Best - MyBar refers to interface Foo and has no direct involvement as to exactly which implementation of Foo is supplied; the instance is &amp;#8220;injected&amp;#8221; into MyBar; in this case, in the constructor.&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public interface Foo{    public void someMethod();}public class MyFoo implements Foo{    public void someMethod() {         ...    }}public class MyBar {    private Foo foo;    public MyBar(Foo foo) {        this.foo = foo;    }}&lt;/pre&gt;&lt;p&gt;I clearly have a bias, but the Spring Framework provides an excellent method for injecting dependencies.&lt;/p&gt;</description><guid>6e54bb3b5e9181900e980c36f69b3f59</guid></item>
<item><title type="html">MSI K9N2 SLI Platinum / AMD Phenom 9600 x4 0&amp;#215;0000007e Stop</title><link>http://gprussell.net/blog/2009/07/28/msi-k9n2-sli-platinum-amd-phenom-9600-x4-0x0000007e-stop/feed/atom/</link><description type="html" xml:base="http://gprussell.net/blog/2009/07/28/msi-k9n2-sli-platinum-amd-phenom-9600-x4-0x0000007e-stop/">&lt;p&gt;More details to follow, but here are the cliff notes&amp;#8230; &lt;/p&gt;&lt;p&gt;After moving WinXP disk to this platform, received the dreaded 0&amp;#215;7e stop on boot; google pointed me to a problem with intelpmp.dll, but this wasn&amp;#8217;t my (initial) problem; I couldn&amp;#8217;t even boot from the XP install disk which is not tailored for Intel.&lt;/p&gt;&lt;p&gt;Turned out a mobo bios flash (3.3 -&gt; 3.5) did the trick (also had to remove the intelpmp.dll because the install came from an Intel box).&lt;/p&gt;&lt;p&gt;Hope this helps someone.&lt;/p&gt;&lt;p&gt;Will fill in the details later.&lt;/p&gt;</description><guid>4df78051eb8c0925e2d51c8a19b99beb</guid></item>
<item><title type="html">The Customer Comes First (Back to the Future?)</title><link>http://gprussell.net/blog/2008/12/23/customer-comes-first/feed/atom/</link><description type="html" xml:base="http://gprussell.net/blog/2008/12/23/customer-comes-first/">&lt;p&gt;It is nearly 30 years since I graduated as an industrial engineer; back then, as the &amp;#8220;new kid on the block&amp;#8221;, I was given the assignment of being the liason to the IT (then called Data Processing) department. Yes, I&amp;#8217;m an old fart and, yes, we had punched cards back then.&lt;/p&gt;&lt;p&gt;I simply freaked when I found that even the simplest request (add a subtotal on a report, change a report sort etc) took 6 to 8 weeks to happen. So, I figured out on my own how to do ad-hoc reports; if folks in the IE dept. needed a new report, they had it on their desk in a couple of hours. I put a few noses out of joint but this was the start of my transition into IT.&lt;/p&gt;&lt;p&gt;Sure, more complex stuff takes a while but often something simple that can be implemented quickly can provide huge business impact.&lt;/p&gt;&lt;p&gt;Roll forward 30 years; after a short stint at that company and 25+ years in product development for one of the BUNCH, I have spent the last few years consulting in Java and related technologies.&lt;/p&gt;&lt;p&gt;My observation is that not a lot has changed; many IT departments are still considered to be laws unto themselves. With all our technology and cool stuff, we still need to understand that we are there to support the business. If one of our internal (or external) clients needs something that is easy to provide, just do it. It will pay off in spades; the next time something is hard to do, and will take time, they will understand; if it&amp;#8217;s easy and you take care of it quickly, the kudos will flow. Often times, something that is easy to us seems hugely complex to clients (of course, the opposite is the case too but, again, if you help them out most of the time, they&amp;#8217;ll believe you when you say something is hard to do).&lt;/p&gt;&lt;p&gt;This all might seem obvious, but I fear that too many lose sight. All I can say is that this philosophy has worked well for me over the years.&lt;/p&gt;&lt;p&gt;Moving forward&amp;#8230;&lt;/p&gt;&lt;p&gt;Satisfying the customer gives one a good feeling, but that alone is not enough. What gets me out of bed in the morning is the sure fact that I know I&amp;#8217;ll learn something more today.&lt;/p&gt;&lt;p&gt;As time goes by, I hope to use this blog to share some of the more interesting things that I learn.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;mailto:blog@gprussell.net&quot;&gt;Gary&lt;/a&gt;&lt;/p&gt;</description><guid>e3c853bbd740e1cc2230f7a179d79ab3</guid></item>
<item><title type="html">Proxying Your Stubs Can Save Space and Time</title><link>http://gprussell.net/blog/2008/12/25/proxying-your-stubs/feed/atom/</link><description type="html" xml:base="http://gprussell.net/blog/2008/12/25/proxying-your-stubs/">&lt;p&gt;Setting aside the discussion of stubs Vs. mocks in JUnit testing (that is covered more than adequately elsewhere), let&amp;#8217;s say you&amp;#8217;ve decided to use stubs, for whatever reason.&lt;/p&gt;&lt;blockquote style='background-color: #DDDDFF'&gt;&lt;p&gt;&lt;font size='-1'&gt;Please understand that the simple examples in this article may be more appropriately handled with mocks; they are for illustrative purposes only&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Now, let&amp;#8217;s say your class under test (CUT) uses a data access object (DAO) that has many methods, but it only needs one or two of those methods. The problem with a stubbed interface is you have to provide implementations of all the methods on the interface. Sure, modern IDEs such as eclipse can do the grunt work and generate all the method shells for you, with you being left to implement just the method(s) you need. However, especially with large stubbed interfaces, you can end up with a large amount of boilerplate code that can easily add up to 90%+ of the LoC in your test case.&lt;/p&gt;&lt;p&gt;This article discusses how to use dynamic proxies to eliminate this problem.&lt;/p&gt;&lt;p&gt;The technique allows you to create a class that implements just those methods you expect your CUT to use.&lt;/p&gt;&lt;p&gt;The examples below use JDK 1.4 syntax; at the end of the article, I provide the full project files in both JDK 5 and 1.4 versions, where the JDK 5 uses the strong typing provided by generics.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Onward&amp;#8230;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;First, declare the stub wrapper that creates the proxy; I prefer to make this a nested class within the test case so that I can invoke JUnit methods to make tests fail gracefully.&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public class MyTest extends TestCase {//...    private static class StubWrapper implements InvocationHandler {        private Object wrappedStub;        private Class clazz;        public StubWrapper(Object wrappedStub) {            super();            this.wrappedStub = wrappedStub;            this.clazz = wrappedStub.getClass();        }        public Object invoke(Object proxy, Method method, Object[] args)                throws Throwable {            try {                return clazz.getMethod(method.getName(),                        method.getParameterTypes()).invoke(wrappedStub, args);            } catch (Throwable t) {                t.printStackTrace();                fail(&amp;quot;Stub method invocation failed&amp;quot;);                return null;            }        }        public static Object wrap(Class type, Object stub) {            return Proxy.newProxyInstance(StubWrapper.class                    .getClassLoader(), new Class[] { type }, new StubWrapper(                    stub));        }    }}&lt;/pre&gt;&lt;p&gt;The static method at line 25 creates a new instance of our proxy; the caller passes the interface in the parameter &lt;i&gt;type&lt;/i&gt; and an instance of the class that implements the desired method(s) in parameter &lt;i&gt;stub&lt;/i&gt;; the method uses the JDK Proxy mechanism to create the proxied stub. Note that we pass in a new instance of the StubWrapper, which has a reference to user supplied implementation instance. &lt;/p&gt;&lt;p&gt;The &lt;i&gt;invoke&lt;/i&gt; method at line 13 is called when the CUT calls a method on the interface. This method is called by the proxy, passing in the proxy instance, the method that was invoked and a list of the arguments that were passed in. It simply delegates (via reflection) the method call to the wrapped stub, with an identical method name and parameter type list.&lt;/p&gt;&lt;blockquote style='background-color: #DDDDFF'&gt;&lt;p&gt;&lt;font size='-1'&gt;Note: if the method has not been implemented, we invoke the JUnit fail() method with an appropriate diagnostic.&lt;b&gt;This is an added benefit of the technique. WIth the classic stub technique, if another developer adds a call to another method (in the CUT) there is nothing to force him or her to fill out the stub and the test may continue to pass even though no such implementation is provided. With this technique, the JUnit is sure to fail in such a circumstance.&lt;br /&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Now we implement the stub itself&amp;#8230;&lt;/strong&gt;&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public class MyTest extends TestCase {//...    private boolean daoCalled;//...    // no need to implement the interface; we get here via a proxy    private class StubDAO{        public Collection findSomeStuff() {            daoCalled = true;            MyVO vo = new MyVO();            vo.setSomeAttribute(&amp;quot;someValue&amp;quot;);            ArrayList l = new ArrayList();            l.add(vo);            return l;        }    }//...}&lt;/pre&gt;&lt;p&gt;This is a simple test case that returns a list of value objects. Note that we set a boolean so we can assert later that the stub was called.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Instantiate the stub&amp;#8230;&lt;/strong&gt;&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public class MyTest extends TestCase {    private MyDAO stubDAO = (MyDAO) StubWrapper.wrap(MyDAO.class, new StubDAO());//...}&lt;/pre&gt;&lt;p&gt;See how we simply invoke the StubWrapper.wrap method to obtain our proxy that implements the MyDAO interface.&lt;/p&gt;&lt;blockquote style='background-color: #DDDDFF'&gt;&lt;p&gt;&lt;font size='-1'&gt;The cast to (MyDAO) is not needed in the JDK 5 version because the wrap method is strongly typed to return an instance of the class passed in as the &lt;i&gt;type&lt;/i&gt; parameter.&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Finally, we implement the test&amp;#8230;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public class MyTest extends TestCase {    private MyDAO stubDAO = (MyDAO) StubWrapper.wrap(MyDAO.class, new StubDAO());    private boolean daoCalled;    public void testMyClassUnderTest() {        CUT cut = new CUT();        cut.setDao(stubDAO);        cut.doSomething();        assertTrue(&amp;quot;Expected DAO call&amp;quot;, daoCalled);    }//..}&lt;/pre&gt;&lt;p&gt;We instantiate the CUT, inject the stub, call some method on the CUT (which calls the stub) and assert that the stub was called.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Putting it all together&amp;#8230;&lt;/strong&gt;&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package net.gprussell.test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;import junit.framework.TestCase;import net.gprussell.CUT;import net.gprussell.MyDAO;import net.gprussell.MyVO;public class MyTest extends TestCase {    private MyDAO stubDAO = (MyDAO) StubWrapper.wrap(MyDAO.class, new StubDAO());    private boolean daoCalled;    public void testMyClassUnderTest() {        CUT cut = new CUT();        cut.setDao(stubDAO);        cut.doSomething();        assertTrue(&amp;quot;Expected DAO call&amp;quot;, daoCalled);    }    // no need to implement the interface; we get here via a proxy    private class StubDAO{        public Collection findSomeStuff() {            daoCalled = true;            MyVO vo = new MyVO();            vo.setSomeAttribute(&amp;quot;someValue&amp;quot;);            ArrayList l = new ArrayList();            l.add(vo);            return l;        }    }    private static class StubWrapper implements InvocationHandler {        private Object wrappedStub;        private Class clazz;        public StubWrapper(Object wrappedStub) {            super();            this.wrappedStub = wrappedStub;            this.clazz = wrappedStub.getClass();        }        public Object invoke(Object proxy, Method method, Object[] args)                throws Throwable {            try {                return clazz.getMethod(method.getName(),                        method.getParameterTypes()).invoke(wrappedStub, args);            } catch (Throwable t) {                t.printStackTrace();                fail(&amp;quot;Stub method invocation failed&amp;quot;);                return null;            }        }        public static Object wrap(Class type, Object stub) {            return Proxy.newProxyInstance(StubWrapper.class                    .getClassLoader(), new Class[] { type }, new StubWrapper(                    stub));        }    }}&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://www.gprussell.net/blogstuff/ProxyStubs.zip&quot;&gt;&lt;br /&gt;This zip file&lt;/a&gt; contains the JDK 5 version of the above code (eclipse project).&lt;br /&gt;&lt;a href=&quot;http://www.gprussell.net/blogstuff/ProxyStubs14.zip&quot;&gt;This zip file&lt;/a&gt; contains the JDK1.4 version of the code (eclipse project).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;mailto:blog@gprussell.net&quot;&gt;Gary&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.gprussell.net/blog/about/&quot;&gt;about&lt;/a&gt;&lt;/p&gt;</description><guid>bb9ea41ae5a7e2b4f6775bc4f164daf2</guid></item>
<item><title type="html">Enhanced Code Coverage for Finite State Machines</title><link>http://gprussell.net/blog/2009/01/03/enhanced-code-coverage-for-finite-state-machines/feed/atom/</link><description type="html" xml:base="http://gprussell.net/blog/2009/01/03/enhanced-code-coverage-for-finite-state-machines/">&lt;p&gt;I was recently engaged to help debug and fix some code that was implemented as a Finite State Machine (FSM). There were no existing JUnit tests for the code, so I set about to write some. However, as one would expect with such an architecture, simple code coverage is not enough to verify that all the state transitions are exercised. Indeed, I had 100% code coverage with just a handful of tests, even though there were several hundred valid state transitions. (This was verified with the excellent EMMA based eclipse plugin - &lt;a href=&quot;http://www.eclemma.org/&quot;&gt;www.eclemma.org&lt;/a&gt;). &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;For those unfamiliar with this tool, it lights up your code in green and red showing executed/unexecuted lines; it also has some excellent reporting facilities.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I used a technique similar to the following to verify that I had covered all the allowable transitions.&lt;/p&gt;&lt;p&gt;In a future article (if there is sufficient interest), I will show how I used Apache POI to drive the JUnit from an Excel spreadsheet so I could solicit help from the user community to create all the test cases and their expected results. Please add a comment (or &lt;a href=&quot;mailto:blog@gprussell.net&quot;&gt;email me&lt;/a&gt;) if you would like to see an article on spreadsheet driven testing.&lt;/p&gt;&lt;p&gt;Using these two techniques, I quickly identified a number of issues which were corrected, resulting in another happy customer.&lt;/p&gt;&lt;p&gt;The following is a drastic simplification but, hopefully, it illustrates the technique.&lt;/p&gt;&lt;p&gt;Given the following simple state machine implementation&amp;#8230;&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package net.gprussell;import java.util.HashMap;import java.util.Map;public class State {public static String STATE1 = &amp;quot;S1&amp;quot;;public static String STATE2 = &amp;quot;S2&amp;quot;;public static String STATE3 = &amp;quot;S3&amp;quot;;public static String STATE4 = &amp;quot;S4&amp;quot;;public static String TRANSITION1 = &amp;quot;T1&amp;quot;;public static String TRANSITION2 = &amp;quot;T2&amp;quot;;public static String TRANSITION3 = &amp;quot;T3&amp;quot;;public static String TRANSITION4 = &amp;quot;T4&amp;quot;;/* * Valid transitions *       S1 -&amp;gt; S2 *       S1 -&amp;gt; S3 *       S2 -&amp;gt; S3 *       S3 -&amp;gt; S4 */static Map&amp;lt;String , String&amp;gt; allowed;static {allowed = new HashMap&amp;lt;String , String&amp;gt;();allowed.put(STATE1 + TRANSITION1, STATE2);allowed.put(STATE1 + TRANSITION2, STATE3);allowed.put(STATE2 + TRANSITION3, STATE3);allowed.put(STATE3 + TRANSITION4, STATE4);}private String currentState;public State() {this.currentState = STATE1;}public State transition(String transition) {String newState = allowed.get(this.getCurrentState() + transition);if (newState == null)throw new RuntimeException(&amp;quot;Invalid transition from &amp;quot; +this.getCurrentState() + &amp;quot; with transition &amp;quot; + transition);this.setCurrentState(newState);return this;}public String getCurrentState() {return currentState;}public void setCurrentState(String currentState) {this.currentState = currentState;}}&lt;/pre&gt;&lt;p&gt;It can be shown that the following test case executes 100% of the code.&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package net.gprussell;import junit.framework.TestCase;public class NotGoodEnoughTest extends TestCase {public void testGoodTransition() {State state = new State();assertEquals(State.STATE2, state.transition(State.TRANSITION1).getCurrentState());}public void testBadTransition() {State state = new State();try {state.transition(State.TRANSITION4).getCurrentState();fail(&amp;quot;Expected exception&amp;quot;);} catch (RuntimeException e) {assertTrue(e.getMessage().startsWith(&amp;quot;Invalid transition&amp;quot;));}}}&lt;/pre&gt;&lt;p&gt;Here is the &lt;a href=&quot;http://gprussell.net/eccffsm3.html&quot;&gt;EMMA report&lt;/a&gt; for this test. &lt;/p&gt;&lt;p&gt;However, we clearly have not exercised all the allowed state transitions.&lt;/p&gt;&lt;p&gt;The following test case ensures that all transitions are executed.&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package net.gprussell;import java.util.HashSet;import java.util.Set;import junit.framework.TestCase;public class FullCoverage extends TestCase {private static Set&amp;lt;String&amp;gt; coverage;protected void setUp() throws Exception {if (coverage == null) {coverage = new HashSet&amp;lt;String&amp;gt;();for (String s : State.allowed.keySet())coverage.add(s);}}private State testing(State state, String trans, String newState) {coverage.remove(state.getCurrentState() + trans);state = state.transition(trans);assertEquals(newState, state.getCurrentState());return state;}public void testGoodPath1() {State state = new State();state = testing(state, State.TRANSITION1, State.STATE2);state = testing(state, State.TRANSITION3, State.STATE3);state = testing(state, State.TRANSITION4, State.STATE4);}public void testGoodPath2() {State state = new State();state = testing(state, State.TRANSITION2, State.STATE3);state = testing(state, State.TRANSITION4, State.STATE4);}public void testBadTransition() {State state = new State();try {state.transition(State.TRANSITION4).getCurrentState();fail(&amp;quot;Expected exception&amp;quot;);} catch (RuntimeException e) {assertTrue(e.getMessage().startsWith(&amp;quot;Invalid transition&amp;quot;));}}// final test - ensure we covered all transitionspublic void testCoverage() {if (coverage.size() &amp;gt; 0) {for (String s : coverage) {System.out.println(s);}}assertEquals(&amp;quot;Not all transitions covered&amp;quot;, 0, coverage.size());}}&lt;/pre&gt;&lt;p&gt;First, before we execute any tests, we add all the allowable state transitions to a set. As each test is executed, it is removed from the set. At the end, we verify that the set is empty, ensuring that all allowable transitions have been exercised.&lt;/p&gt;&lt;p&gt;Simple, but effective.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;It is important to realize that simple code coverage verification is not sufficient in many cases. While it is good to strive for 100% coverage, sometimes even that is not enough and we need to go a step further.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;mailto:blog@gprussell.net&quot;&gt;Gary&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.gprussell.net/blog/about/&quot;&gt;about&lt;/a&gt;&lt;/p&gt;</description><guid>8c1bf47977eee5926a98dd84d1e528e1</guid></item>
<item><title>Hotfix Out For SharePoint 2010 On Windows 2008 Server R2</title><link>http://mukalian.com/blog/post/2009/11/20/Hotfix-Out-For-SharePoint-2010-On-Windows-2008-Server-R2.aspx#comment</link><guid>1b1df7135baf096f04da52ba09f15999</guid></item>
<item><title>Ringin' In The New Year, MVP Style</title><link>http://mukalian.com/blog/post/2010/01/04/Ringin-In-The-New-Year-MVP-Style.aspx#comment</link><guid>5473ebcbb6ff8b0fa1d4f4e157941a8c</guid></item>
<item><title>SharePoint 2010 Links Dropping, But...*UPDATE*</title><link>http://mukalian.com/blog/post/2009/11/16/SharePoint-2010-Links-Dropping-But.aspx#comment</link><guid>8b31b5042cba53c3102d2d334c471f1c</guid></item>
<item><title>SharePoint Geeks Descend On Las Vegas!</title><link>http://mukalian.com/blog/post/2009/10/18/SharePoint-Geeks-Decend-On-Las-Vegas!.aspx#comment</link><guid>1c1cf0faf2bb47f4fae94b5bd65ceccc</guid></item>
<item><title>SharePoint 2010 and PowerPoint Themes</title><link>http://mukalian.com/blog/post/2009/12/07/SharePoint-2010-and-PowerPoint-Themes.aspx#comment</link><guid>0e8b05728de705698d0d89cc65d077ec</guid></item>
<item><title>Speaking at SharePoint Saturday - Philly!</title><link>http://mukalian.com/blog/post/2009/10/09/Speaking-at-SharePoint-Saturday-Philly!.aspx#comment</link><guid>27ee3483f581a6beb4db0ea45ae86de2</guid></item>
<item><title>SPC09 Day 1 Highlights</title><link>http://mukalian.com/blog/post/2009/10/20/SPC09-Day-1-Highlights.aspx#comment</link><guid>012979f9a7a7554ee2711b7f4277ebd9</guid></item>
<item><title>SharePoint Server 2010 Beta Server Farm Installation: Go!</title><link>http://mukalian.com/blog/post/2009/11/21/SharePoint-Server-2010-Beta-Server-Farm-Installation-Go!.aspx#comment</link><guid>0e5e2d4e6ff9d0358e7134a1957635aa</guid></item>
<item><title>SharePoint Saturday - Philly Was a Huge Success!</title><link>http://mukalian.com/blog/post/2009/11/09/SharePoint-Saturday-Philly-Was-a-Huge-Success!.aspx#comment</link><guid>6751dcd83f6284edbdf9beebcdb655e1</guid></item>
<item><title>SPC09 Day 2 Highlights</title><link>http://mukalian.com/blog/post/2009/10/21/SPC09-Day-2-Highlights.aspx#comment</link><guid>06cc49a73337fce4e4d74eaebd71ba9f</guid></item>
<item><title type="text">Underdocumented SQL Server mail parameter</title><description type="html">Due to popular demand, Microsoft added the @query_result_no_padding to the sp_send_dbmail stored procedure.&lt;br /&gt;&lt;br /&gt;Sadly, you wont find this in the online help. It was added as part of a Service Pack.&lt;br /&gt;&lt;br /&gt;Use this parameter to trim excess spaces from the query results attached to the email. Otherwise, the column output pads out to the length of the char OR varchar field.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;declare @t TABLE (field varchar(10))&lt;br /&gt;&lt;br /&gt;insert into @t&lt;br /&gt;select 'hello'&lt;br /&gt;&lt;br /&gt;When sent with @query_result_no_padding = 1&lt;br /&gt;the result is:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;field&lt;br /&gt;-----&lt;br /&gt;hello&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;otherwise&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;field&lt;br /&gt;----------&lt;br /&gt;hello&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-1516932424251084198?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2008/09/underdocumented-sql-server-mail.html</link><guid>2bf39796e6a79feb940b4634abfd7850</guid></item>
<item><title type="text">Test Window</title><description type="html">&lt;div id=&quot;dvXML&quot;&gt;&amp;lt;root&amp;gt;&lt;br /&gt; &amp;lt;users&amp;gt;&lt;br /&gt;  &amp;lt;user&amp;gt;Joe&amp;lt;/user&amp;gt; &lt;br /&gt;  &amp;lt;user&amp;gt;Willie&amp;lt;/user&amp;gt;&lt;br /&gt; &amp;lt;/users&amp;gt; &lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;form&gt;&lt;br /&gt;&lt;textarea cols=&quot;60&quot; rows=&quot;5&quot; id=&quot;taQuery&quot;&gt;&lt;/textarea&gt;&lt;br /&gt;&lt;input type=&quot;button&quot; value=&quot;Click Me&quot; onclick=&quot;runXPath();&quot;&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;div id=&quot;dvOutput&quot;&gt;Results Here&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-7493598263636508528?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2007/07/test-window.html</link><guid>ef73ece5a9fff7b4439e356e8a4e6621</guid></item>
<item><title type="text">Selecting XPath Nodes</title><description type="html">To select a range of nodes based on their position, use the really cool &lt;em&gt;position()&lt;/em&gt; function.&lt;br /&gt;&lt;br /&gt;Using the code example below, this syntax will get the first two nodes:&lt;br /&gt;&lt;br /&gt;var nodeList = xmlDoc.selectNodes(&quot;/root/items/item[&lt;strong&gt;position()&lt;/strong&gt;&lt;3]&quot;);&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-8663526999211431798?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2007/01/selecting-xpath-nodes.html</link><guid>81ff4111d0da3b58c76829c6421d754c</guid></item>
<item><title type="text">XPath Basics</title><description type="html">When querying an XML Document with XPath syntax, there are two things you need to identify; the node(s) you want to return and the criteria that determines which nodes qualify.&lt;br /&gt;&lt;br /&gt;In this XML document:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt;   &amp;lt;items&amp;gt;&lt;br /&gt;      &amp;lt;item&amp;gt;One&amp;lt;/items&amp;gt;&lt;br /&gt;      &amp;lt;item&amp;gt;Two&amp;lt;/items&amp;gt;&lt;br /&gt;      &amp;lt;item&amp;gt;Three&amp;lt;/items&amp;gt;&lt;br /&gt;   &amp;lt;/items&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To get the &lt;em&gt;item&lt;/em&gt; nodes using MSXML&lt;br /&gt;var nodeList = xmlDoc.selectNodes(&quot;/root/items/item&quot;);&lt;br /&gt;&lt;br /&gt;To apply selection conditions, add brackets:&lt;br /&gt;var nodeList = xmlDoc.selectNodes(&quot;/root/items/item[.='One']&quot;);&lt;br /&gt;&lt;br /&gt;The &quot;.&quot; in the brackets means &quot;this node&quot;. So in plain English you're saying, &quot;Give me all the &lt;em&gt;item&lt;/em&gt; nodes where the value is &quot;One&quot;.&lt;br /&gt;&lt;br /&gt;You can also select nodes based on the values of child or parent nodes.&lt;br /&gt;&lt;br /&gt;Let's make the simple example above a little more complicated:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt;   &amp;lt;items&amp;gt;&lt;br /&gt;      &amp;lt;item&amp;gt;One&amp;lt;/item&amp;gt;&lt;br /&gt;         &amp;lt;type&amp;gt;Odd Number&amp;lt;/type&amp;gt;&lt;br /&gt;      &amp;lt;item&amp;gt;Two&amp;lt;/item&amp;gt;&lt;br /&gt;         &amp;lt;type&amp;gt;Even Number&amp;lt;/type&amp;gt;         &lt;br /&gt;      &amp;lt;item&amp;gt;Three&amp;lt;/item&amp;gt;&lt;br /&gt;         &amp;lt;type&amp;gt;Odd Number&amp;lt;/type&amp;gt;&lt;br /&gt;   &amp;lt;/items&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To get all the nodes which have a type value of &quot;Odd Number&quot; you would use this syntax:&lt;br /&gt;&lt;br /&gt;var nodeList = xmlDoc.selectNodes(&quot;/root/items/item[./type='Odd Number']&quot;);&lt;br /&gt;&lt;br /&gt;Notice here that the select path still goes to the &lt;em&gt;item&lt;/em&gt; level. However, the query references the &lt;em&gt;type&lt;/em&gt; node. The XPath path symbols are nearly identical to directory structure navigation syntax. &lt;br /&gt;&lt;br /&gt;/ = levels&lt;br /&gt;. = current node&lt;br /&gt;.. = parent node&lt;br /&gt;./ = child of the current node&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-8920326113595903039?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2006/12/xpath-basics.html</link><guid>f5f30e571cfd1992ba4c656949f8ad1b</guid></item>
<item><title type="text">Decode HTML Strings in SQL Server</title><description type="html">SET ANSI_NULLS ON&lt;br /&gt;GO&lt;br /&gt;SET QUOTED_IDENTIFIER ON&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;-- EXEC UrlDecode '%c3%a1'&lt;br /&gt;-- EXEC UrlDecode '\\Tul1ciprmw1\RichMediaAssets\Open\Telemundo\Al Rojo Vivo con Mar%c3%ada Celeste\_derived_jpg_q90_172x128_m1\3ARValx05Mar%c3%ada Celeste Arrar%c3%a1s.jpg'&lt;br /&gt;-- EXEC UrlDecode '%4D'&lt;br /&gt;&lt;br /&gt;ALTER PROCEDURE UrlDecode &lt;br /&gt; -- Add the parameters for the stored procedure here&lt;br /&gt; @URL varchar(2000)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; -- SET NOCOUNT ON added to prevent extra result sets from&lt;br /&gt; -- interfering with SELECT statements.&lt;br /&gt; SET NOCOUNT ON;&lt;br /&gt;&lt;br /&gt; DECLARE @Position INT,&lt;br /&gt;  @Base CHAR(16),&lt;br /&gt;  @High TINYINT,&lt;br /&gt;  @Low TINYINT,&lt;br /&gt;  @NewHigh INT,&lt;br /&gt;  @Pattern CHAR(21)&lt;br /&gt;&lt;br /&gt; SELECT @Base = '0123456789abcdef',&lt;br /&gt;  @Pattern = '%[%][0-9a-f][0-9a-f]%',&lt;br /&gt;  @Position = PATINDEX(@Pattern, @URL)&lt;br /&gt;&lt;br /&gt; SELECT @High = CHARINDEX(SUBSTRING(@URL, @Position + 1, 1), @Base) -1,&lt;br /&gt;   @Low = CHARINDEX(SUBSTRING(@URL, @Position + 2, 1), @Base) -1&lt;br /&gt;&lt;br /&gt; WHILE @Position &gt; 0&lt;br /&gt; BEGIN  &lt;br /&gt;&lt;br /&gt;   IF (@High &amp; 15) = 12 -- xC0 &lt;br /&gt;   BEGIN  &lt;br /&gt;    SELECT @NewHigh = @Low * POWER(2, 6) --Shift Low 6 bits&lt;br /&gt;    &lt;br /&gt;    SELECT @High = CHARINDEX(SUBSTRING(@URL, @Position + 4, 1), @Base) -1&lt;br /&gt;    SELECT @Low = CHARINDEX(SUBSTRING(@URL, @Position + 5, 1), @Base) -1&lt;br /&gt;&lt;br /&gt;    SELECT @URL = STUFF(@URL, @Position, 6, CHAR(@NewHigh | (16 * @High) | @Low))&lt;br /&gt;&lt;br /&gt;    SELECT @High = 0, @Low = 0, @NewHigh = 0  &lt;br /&gt;&lt;br /&gt;   END&lt;br /&gt;   ELSE&lt;br /&gt;   BEGIN &lt;br /&gt;    SELECT @URL = STUFF(@URL, @Position, 3, CHAR(16 * @High | @Low))&lt;br /&gt;&lt;br /&gt;   END      &lt;br /&gt;   &lt;br /&gt;   SELECT @Position = PATINDEX(@Pattern, @URL)&lt;br /&gt;   IF @Position &gt; 0&lt;br /&gt;   BEGIN&lt;br /&gt;    SELECT @High = CHARINDEX(SUBSTRING(@URL, @Position + 1, 1), @Base) -1,&lt;br /&gt;      @Low = CHARINDEX(SUBSTRING(@URL, @Position + 2, 1), @Base) -1&lt;br /&gt;   END&lt;br /&gt; END&lt;br /&gt;&lt;br /&gt; SELECT @URL&lt;br /&gt;&lt;br /&gt;END&lt;br /&gt;GO&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-2646479091920336103?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2008/06/decode-html-strings-in-sql-server.html</link><guid>61f4394257dec989ca7e6443fe3a19c3</guid></item>
<item><title type="text">ActionScript for .NET Programmers</title><description type="html">NOTE: These notes are based on my development efforts with Flash. If there are any incorrect statements, please let me know in the comments. Thank you.&lt;br /&gt;&lt;br /&gt;DEBUGGER&lt;br /&gt;&lt;br /&gt;The debugger is not tightly integrated into the IDE. It is a separate tool that you must invoke by selecting Control &gt; Debug.&lt;br /&gt;&lt;br /&gt;Once invoked, the project is in a paused state. Select Continue to debug.&lt;br /&gt;&lt;br /&gt;Breakpoints are only allowed in the Actions window of the .fla file. You cannot set breakpoints in classes you've created.&lt;br /&gt;&lt;br /&gt;The trace() method will become your best friend as the watches do not evaluate complex values like object.items[i]. Also, there is no Immediate window for interacting with the code.&lt;br /&gt;&lt;br /&gt;CLASSES&lt;br /&gt;&lt;br /&gt;ActionScript 2.0 supports classes in the traditional sense as objects with private and public members, inheritance and defined members. Earlier versions of ActionScript also support malleable objects similar to those defined in JavaScript. Those objects can have properties and methods stuck onto them at run time.&lt;br /&gt;&lt;br /&gt;MovieClips are the base object similar to WinForms. Flash supports a form-based model of programming using components derived from MovieClips. This component of this type: mx.screens.Form.&lt;br /&gt;&lt;br /&gt;Think of a form as a one frame movie clip.&lt;br /&gt;&lt;br /&gt;Note that the forms appear to be inaccessible from code stored in class modules (.as) files. I have found that passing in the form reference to a private member gets the trick done.&lt;br /&gt;&lt;br /&gt;PROGRAMMING MODEL&lt;br /&gt;&lt;br /&gt;All server interactions are handled asynchronously using callbacks similar to Delegates.&lt;br /&gt;&lt;br /&gt;XML&lt;br /&gt;&lt;br /&gt;The XML object in ActionScript 2.0 is far less rich than the XMLDOM COM object or the  .NET XmlDocument objects.&lt;br /&gt;&lt;br /&gt;There is no select nodes or XPATH support for the nodes. Rather, every element, including a node's text is considered a node.&lt;br /&gt;&lt;br /&gt;Iteration is done through arrays generated by the childNodes property.&lt;br /&gt;&lt;br /&gt;If a node is XML, its nodeType property is 1, and the available propery is nodeName. If the nodeType property is 3, then it is a text node and the nodeValue property is used. Note that the nodeValue is not available to nodes of type XML.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-2159002271934819335?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2008/11/actionscript-for-net-programmers.html</link><guid>5161af285e9b5501b442aa4231b96465</guid></item>
<item><title type="text">Querying Table Definitions</title><description type="html">A query to return metadata about a table. This is useful for dynamic query building like in a SqlAdapter, for example.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SELECT C.COLUMN_NAME,&lt;br /&gt;       C.DATA_TYPE,&lt;br /&gt;       C.CHARACTER_MAXIMUM_LENGTH,&lt;br /&gt;       CASE WHEN PK.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END IS_KEY,&lt;br /&gt;       CASE WHEN IC.object_id IS NULL THEN 0 ELSE 1 END IS_IDENTITY&lt;br /&gt;FROM INFORMATION_SCHEMA.COLUMNS C&lt;br /&gt;       LEFT OUTER JOIN&lt;br /&gt;INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK ON C.TABLE_NAME = PK.TABLE_NAME&lt;br /&gt;                                      AND C.COLUMN_NAME = PK.COLUMN_NAME&lt;br /&gt;       INNER JOIN&lt;br /&gt;sys.tables T ON C.TABLE_NAME = T.name&lt;br /&gt;            AND T.[type] = 'U'&lt;br /&gt;       LEFT OUTER JOIN&lt;br /&gt;sys.identity_columns IC ON T.object_id = IC.object_id&lt;br /&gt;                       AND IC.[name] = C.COLUMN_NAME&lt;br /&gt;WHERE C.TABLE_NAME = @TableName&lt;/pre&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-4937259985794666485?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2009/04/querying-table-definitions.html</link><guid>53acc6632786c20927155a4b3736faa1</guid></item>
<item><title type="text">Using CTE (Common Table Expression)</title><description type="html">To create a collection of rows without querying a table or a repeating series of INSERT statements.&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;&lt;br /&gt;declare @seed int&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;select @seed = 8;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;WITH RecurseTable(Id)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;    SELECT @seed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;    UNION ALL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;    SELECT R.Id -1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;    FROM RecurseTable R&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;    WHERE R.Id &gt; 1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;select * &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;from RecurseTable&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-1529316649185277390?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2009/06/using-cte-common-table-expression.html</link><guid>f820ebda46b7050807f739fb0210fc7e</guid></item>
<item><title type="text">Efficiently Rounding a SQL Server datetime</title><description type="html">Truncates hours, minutes and seconds without messy string manipulation:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;CAST(FLOOR(CAST(GETDATE() AS DECIMAL(8,2))) AS datetime)&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7390387165396694964-1171114685990128524?l=stupidcodetricks.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://stupidcodetricks.blogspot.com/2008/10/efficiently-rounding-sql-server.html</link><guid>c9e075640a8c879c0e94364190a76655</guid></item>
<item><title type="text">Revisiting Requirements Management</title><description type="html">The number one job of the Architect in an IT project is to manage requirements. The Architect is in the only position within the enterprise to look deep enough into the business and deep enough into the technology to understand the translation of the requirements between the two. It is the Architect who is on the front-lines of business-IT alignment, and people should look no further when IT seems &quot;out of touch&quot; with the business.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A requirement, in its simplest form is the codification of a business need. In this regard, requirements should trace naturally to the goals of a business and the metrics that the business uses to track their performance against those goals. Business goals and performance metrics should trace directly to the business plan - which is the embodiment of the business strategy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Requirements management, the domain of an Architect, is about managing the full life-cycle of a requirement; ensuring that the business value (goals &amp;amp; metrics) traced to that requirement is both:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;effectively captured during requirements analysis and&lt;/li&gt;&lt;li&gt;efficiently delivered by the technology traced to that requirement.&lt;/li&gt;&lt;/ol&gt;In this way, all technology and associated investment should trace naturally to business value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Therefore, the first half of an effective requirements analysis process is for the Architect to ensure that this traceability to the business plan is well-defined, and that the business context associated with the requirement is clear to IT. Architects are on the front-line of IT strategy and planning, and it is their responsibility to challenge and guide their business counterparts in applying the same rigor to the business strategy and planning process as they apply to the technology strategy and planning process.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second half of the requirements analysis process is for the Architect to ensure that the traceability to the technology plan is well defined, and that the IT context associated with the requirement is clear to the business. The IT context associated with a requirement can be broken down into three main areas:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;the expected impact of the requirement on the enterprise architecture,&lt;/li&gt;&lt;li&gt;the planning input for the project required to deliver it, and&lt;/li&gt;&lt;li&gt;the expected impact on IT operations to support it once it has been delivered.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;The impact of a requirement (or set of requirements) on the enterprise architecture should be captured across three main enterprise technology views: the software architecture, the server(or hardware) architecture, and the network architecture.In order to properly trace a requirement from business to one of these technology views, the original requirement needs to be &quot;refined&quot;. The process of requirements refinement is a meticulous one, that requires all of the skill of an experienced Architect. Refining requirements involves deriving new, more detailed requirements from the base requirement that are specific to the technology view being considered. This process should not add or remove from the scope of the original requirement nor otherwise alter the original requirement. The motivations, assumptions, and constraints considered while deriving a software, hardware, or network requirement from a business requirement should be well-documented by the Architect. This documentation serves as a feedback mechanism from the Architects to their business counterparts on their interpretation of the original requirement. Requirements refinement and associated documentation serves as the basis for involving the business in technology decisions by providing transparency to the IT strategy and planning process.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Planning input should include the basis of estimate that drives the variable costs, any required fixed costs, and any notable risks associated with delivering therequirement (or set of requirements). The first half of the basis of estimate should be a quantifiable metric (other than hours) that drives effort. Some examples of quantifiable metrics include the number of expected users, a number of screens to be developed, or the number of entities in the data model. The second half of the basis of estimate should bean estimate of hours, by resource type, associated with delivering the requirement across that metric. For example, it may be estimated that it will take 6 hours of a DBA, 1 hour of a business analyst, and 1 hour of a project manager to implement the necessary physical database objects associated with a single entity. This information can then be easily used to generate the necessary staffing plan for a project to deliver the set of requirements being planned, which would smooth the consolidated effort estimate for each resource type across a set of requirements over the full timeline of the project being planned to deliver those requirements and associate a cost per hour for that resource type to determine the cost for that effort within the scope of that project. Fixed costs from subcontractors or vendors that will be providing specific services and / or products needed in the delivery of a requirement should also be included in the planning input for each requirement. Finally, any risks known at the time of planning associated with delivering the requirement should be well-documented. Included in the risk documentation should be a probability that the risk will be realized and its potential impact on project cost, time, and / or quality.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lastly in the IT requirements analysis process should be the development or modification of a concept of operations for the requirement (or set of requirements) to be delivered. This concept of operations should include any on-going monitoring, management, or administrative activities required to operate the new software, hardware, and or network components delivered while fulfilling the requirement. Like project planning input, the concept of operations would document the basis of estimate for any ongoing variable costs, any regular fixed costs and their timing interval, and any risks associated with operations in support of the components being delivered to meet this requirement (or set of requirements).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once proper analysis has been done for a requirement, an Architect's job is not over. It is the responsibility of the Architect to monitor the delivery and ongoing operations of each requirement for variances to plan. Variances in cost and time (efficiency) during delivery or operations, including the realization of risk, should be analyzed by the Architect to determine if they are one-time or systemic in nature. Systemic variances in IT efficiency discovered over time should be re-factored back into the requirements analysis output with proper change management controls in place to notify interested business and IT stakeholders. Finally, it is the Architect's responsibility to periodically review the business goals and performance metrics that each requirement is tied to to ensure that expected business value has been delivered by IT. Variances in delivering expected business value (effectiveness) should also be analyzed by the Architect to determine if they are one-time or systemic in nature. Systemic variances in IT effectiveness discovered over time should be re-factored back into the IT strategy and planning process with proper change management controls in place to notify interested business and IT stakeholders.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Architecture today often has the misconception by business and IT stakeholders as being a project-based activity. However; true requirements management, which is at the heart of all modern architecture, involves the regular monitoring and course-correcting (governance) of the business-IT alignment. Requirements management defines architecture as an on-going relationship activity between business and IT; one that should not be confined to the delivery of specific IT projects.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8817108378149444131-4259540960309096582?l=tom-mccuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://tom-mccuch.blogspot.com/2008/06/revisiting-requirements-management.html</link><guid>c09b51b4562caee52122a288730f2fa5</guid></item>
<item><title type="text">ReFactoring Enterprise Architecture</title><description type="html">I was listening to David Linthicum's podcast from last week (&lt;a onclick=&quot;return top.js.OpenExtLink(window,event,this)&quot; href=&quot;http://akamai.infoworld.com/weblog/realworldsoa/archives/IFW_SOA_05-12-08.mp3&quot; target=&quot;_blank&quot;&gt;http://akamai.infoworld.com/weblog/realworldsoa/archives/IFW_SOA_05-12-08.mp3&lt;/a&gt;) and got to thinking more about the problem of Re-Factoring Enterprise Architecture. Re-Factoring your Enterprise Architecture is a variant on the Enterprise Modernization angle we have been pursuing within the technology industry for legacy platform customers. The reason Enterprise Modernization is not enough in my mind is that it is only really targeted at customers (like the government) who are still on homogeneous (albeit legacy) platforms and due to personnel training and retention issues want to stay that way [homogenous]. Most commercial customers likely have a highly heterogenous environment or want one to better keep up with the heightened competition within their industry.&lt;br /&gt;&lt;br /&gt;Most commercial enterprises would agree that their Enterprise Architecture has organically grown over the years in a similar way to how the Amish sew together a patch-work quilt. This is the problem of &quot;shopping for your EA solution&quot;.&lt;br /&gt;&lt;br /&gt;On the left-side of the &quot;shopping for an EA&quot; continuum, you have customers that consider themselves early adopters and are willing to try new things to &quot;get an edge&quot; on their competition. [insert your favorite market guru here] tells these customers that they should have a portal, and that Plumtree is one of the best point-solutions out there so they buy that. [insert your favorite market guru here] tells them they should have a framework, and that SilverStream is one of the best point-solutions out there so they buy that. [insert your favorite market guru here] tells them they need an ESB solution, and that Cape Clear is the one of the best point-solutions out there so they buy that. And so on. These folks may be fast out of the gate, but lose momentum over time, due to inefficiences caused by lack of integration along the way and the rapid turnover of products (and vendors) caused by the fickleness of the commodity software industry.&lt;br /&gt;&lt;br /&gt;On the right-side of the &quot;shopping for an EA&quot; contiuum, you have customers that consider themselves more conservative and place a high value on staying with a single vendor. These folks are still &quot;shopping for an EA&quot;, except that they wait to be told what to buy and when to buy it by IBM or Microsoft. These folks are always dealing with repressed feelings of frustration and doubt caused by their inability to keep up with software market innovation because their chosen vendor isn't getting them there fast enough.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;In my opinion, customers at either end of this continuum can be refactored toward a planned Enterprise Architecture, highly customized to their specific needs, that can deal with change in a &quot;systemic&quot; or &quot;repeatable&quot; fashion through the combination of:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;the strategic use of Open Source software to get at the core problems within the IT portfolio by either better glueing the pieces together or more rapidly extending the functionality of the monolith (with either approach based on open standards) - making the IT-side of these commercial customers more agile while also providing a forward-looking context for better supporting their engrained spending habits, and&lt;/li&gt;&lt;li&gt;the tactical use of Governance solutions to give the business-side of these commercial customers visibility into the measureable (metrics-driven) progress they are making towards the goals that define their reasons for investing in IT to begin with.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;To summarize, I like the &quot;ReFactoring your Enterprise Architecture&quot; angle because it deals with the heterogeneity (or lack thereof) that likely exists in most commercial enterprises while still sending the &quot;we aren't here to change you ... just make you better&quot; message that Enterprise Modernization sends.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8817108378149444131-7960512244410300813?l=tom-mccuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://tom-mccuch.blogspot.com/2008/05/refactoring-enterprise-architecture.html</link><guid>8fa8c4706cec37c48dbcacdd74e189da</guid></item>
<item><title type="text">Agile SOA - Part III</title><description type="html">&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;This is the third and final blog in this series. In &lt;/span&gt;&lt;a href=&quot;http://tom-mccuch.blogspot.com/2008/10/agile-soa-part-i.html&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;Part I&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;, I opened with the thought that the real challenge of SOA is changing the way you look at the IT investment of your business to be more from the perspective of software architecture. In &lt;/span&gt;&lt;a href=&quot;http://tom-mccuch.blogspot.com/2008/12/agile-soa-part-ii.html&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;Part II&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;, I discussed that the best approach to software architecture is Agile due to the evolutionary nature of software. In this final installment I'd like to close with how an Agile approach to software architecture - based on thinking of SOA in terms of composite design patterns implemented as part of your application architecture through the use of embedded frameworks will help you better realize the benefit of through an Agile approach.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;In the quest for enterprise architecture discipline, many of us are re-creating our futures out of our past by modeling it through a static, black-box approach. If your business' enterprise architecture can only be described in a power-point slide deck, using boxes and connecting lines - then you haven't taken the time to truly understand the collective learning from the previous generation of hardware-centric architects - and are doomed to make the same mistakes they made. SOA makes behavior a first-class design concern, and pushes static representations of architecture to a &quot;behind-the-scenes&quot; supportive role.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;A business' enterprise architecture is a &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;living organism&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;, much like the business it supports, and at it's core should be a software architecture - modeled through a dynamic, white-box approach. We should be striving to describe this software architecture through a means closer to a linear, episodic series of video clips. Each episode should demonstrate an encapsulated portion of the system in a white-box manner - demonstrating the scripted pattern in which these components interact (&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;think of a football play being viewed from an overhead camera with primary and optional flows for the different players on the field&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;). Episodes should be linked together in a linear-fashion through the use of rule-based pathing (&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;think of a football game as a composition of individual plays - where the individual plays are woven together with an over-arching strategy that capitalizes on both an individual team's strengths and an opposing team's weaknesses&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;). It is in this way that a business strategy can best be decomposed into a set of composite processes that capitalize on the competitive advantage of a business within an industry full of competitors.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;Many of you who are reading this may think that I am just another advocate of a Business Process Management (BPM) middleware-centric approach to SOA. In fact, I am not. Using my analogies above, I believe the Process Manager pattern is a good fit for demonstrating the scripted interaction of&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;local&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt; components. I emphasize the word local here because I do not believe Process Manager is a good architectural pattern for interactions of distributed components. Hohpe and Woolf describe the Process Manager pattern as follows in their Enterprise Integration Patterns book: &quot;Using a Process Manager results in a so-called &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;hub and spoke&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;pattern of message flow.&quot; Similar to database architecture, the hub and spoke architecture of a traditional process manager will not scale well horizontally. Horizontal scalability is key to distributed computing, especially within today's cloud hardware architectures.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;If you still think that the Process Manager pattern is best for managing the scripted behavior of local components, then you have to take a long, hard look at the BPM middleware at the core of most commercial-off-the-shelf (COTS) vendor SOA suites. BPM middleware today is built around the Web Services Business Process Execution Language (WS-BPEL) standard - which describes a standard way in which many, distributed Web Services can be orchestrated within the context of a single business process. If the Process Manager pattern should not be used for distributed components, then the link between Web Services and today's BPM middleware should come in to question. If the Web Services standard is removed from BPM middleware, then the whole WS-BPEL standard fails as a foundation for implementing the Process Manager pattern, and COTS BPM products in-turn fail as a foundational component of your SOA infrastructure.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;As an alternative to BPM middleware, I prefer a lightweight solution, such as the one described in the following InfoQ article by my colleague and friend, Oleg Zhurakousky: &lt;/span&gt;&lt;a href=&quot;http://www.infoq.com/articles/Orchestration-Oleg-Zhurakousky&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;Workflow Orchestration Using Spring AOP and AspectJ&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;. &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 16px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;This article demonstrates how to build and orchestrate highly configurable and extensible, yet light-weight &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;embedded&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt; process flows within your software architecture using Aspect Oriented Programming (AOP) techniques. Oleg's use of Spring AOP, a proxy-based AOP mechanism, to address functional concerns such as instrumenting a process with activities while using Aspect, a byte-code weaving AOP mechanism, to address non-functional concerns such as activity navigation and transition is, in my opinion, the perfect way to implement the&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: normal; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;scripted interaction of&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;local&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;business logiccomponents within the Process Manager pattern.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;So if the Process Manager pattern is not the right foundational pattern for your distributed SOA, then what is? I believe the right foundational pattern for your SOA is the Staged Event Driven Architecture (SEDA) patternfirst published by Matt Welsh, et. al., from the Computer Science Division of the University of California, Berkeley in 2001.In SEDA, applications consist of a network of event-driven stages connected by explicit queues. Using my previous football analogy, think of the network as the whole football game, composing a number of event-driven stages which represent the individual play. The network architecture underlying SEDA is intrinsically better at supporting the horizontal scalability demanded by distributed SOA computing.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;Within the context of SEDA, a stage is a self-contained application component consisting of an event handler, an incoming event queue, and a thread pool. As described above, that self-contained application component could itself be a compositescripted interaction of&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;local&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;application components.The introduction of a queue between stages decouples the execution of application components by introducing an explicit control boundary - which allows for their distribution. The SEDA model constrains the execution of a thread to a given stage, as a thread may only pass data across the control boundary by enqueuing an event. Introducing a queue between two modules of an application provides isolation, modularity, and independent load management. Because stages interact through an event-dispatch protocol instead of a traditional API, it is straightforward to interpose proxy stages between components for rules-based pathing, performance profiling, and/or testing &amp;amp; debugging.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;One of the best implementations of the SEDA pattern is Spring Integration, described in the following InfoQ article by Joshua Long: &lt;/span&gt;&lt;a href=&quot;http://www.infoq.com/articles/Spring-Integration-Joshua-Long&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;Getting Started with Spring Integration&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;. In an answer to the &quot;Why Spring Integration?&quot; question, Joshua says it best with the following quote: &quot;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;Because Spring Integration is so lightweight (you deploy the Spring Integration server with your application; you don't deploy your application to Spring Integration) and so focused on the development life cycle (XML schemas to facilitate configuration, POJO-friendly APIs, and strong integration with the Spring Framework and JEE), you'll find Spring Integration a better fit than a lot of other ESBs.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&quot; Spring Integration supports a pluggable transport layer, where a lightweight, highly scalable Message Broker, such as Apache ActiveMQ, can provide support for the network architecture that allows for the horizontal scalability of the Spring Integration solution.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;  line-height: 16px;font-family:Lucida;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 16px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;So why all of these tools from SpringSource (Spring Framework, Spring AOP, AspectJ, Spring Integration, and ActiveMQ)? Traditional Enterprise Integration products promote a proprietary development and deployment model that requires a steep, costly organizational learning curve to successfully adopt. In addition, the more successful you are at adopting these development tools and deployment models - the more locked in to those proprietary products you become. The SpringSource&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;border-collapse: collapse;   line-height: normal; font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;border-collapse: separate;   line-height: 16px; font-family:Georgia;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;mantra is Eliminating Enterprise Java Complexity. Using their standard Java development tools and deployment models, SOA can be incrementally adopted in a lower risk, more agile way - led by the Java developers and systems analysts you already have using the tools they already know (and love).&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;border-collapse: collapse;   line-height: normal; font-family:arial;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;border-collapse: separate;   line-height: 16px; font-family:Georgia;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;border-collapse: separate;   line-height: 16px; font-family:Georgia;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;The end-result of this incremental adoption is simply a re-factored version of your current Java and .NET business applications. Finally, the Spring Framework, which serves as the foundation for all of these tools, ensures both the tight integration and full portability you've come to expect from any SpringSource solution.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 16px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 16px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;As I stated in the very beginningof this series, SOA is an architectural pattern - not an expensive suite of software products. A pattern, by definition, is the encapsulation of a complex, dynamic system into a reusable component. Patterns are meant to describe, through a white-box approach, best practice ways for you to build YOUR solution - they are not meant to be solutions in of themselves. Patterns therefore lend themselves to be best implemented by lightweight, embeddable frameworks that&lt;/span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;serve to&lt;/span&gt;&lt;u&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;support&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;your solution,&lt;/span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;not&lt;/span&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;heavy, commercial-off-the shelf products that&lt;/span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;aim to&lt;/span&gt;&lt;u&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;control&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:small;&quot;&gt;it. The integrated Spring components, backed by the unwavering commitment to simplicity of the SpringSource company, provides you with the Agile SOA solution you need to support the evolutionary nature of your business.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8817108378149444131-639431294131711821?l=tom-mccuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://tom-mccuch.blogspot.com/2008/12/agile-soa-part-iii.html</link><guid>083cb299e05674733b0d4ebc7a8b72e2</guid></item>
<item><title type="text">Agile SOA - Part I</title><description type="html">Service Oriented Architecture is not an expensive suite of software products as the large software vendors would like to sell you. SOA is an architectural pattern. A pattern is a well-described, proven way of doing something that has evolved out of multiple attempts (successes and failures) across an entire community of professionals. SOA is a best-practice way of constructing an enterprise software architecture to better suit the evolving needs of your business.&lt;br /&gt;&lt;br /&gt;The real challenge of adopting SOA is to change the way you and your organization think about enterprise architecture, not to change your information technology infrastructure yet again to continue the cold war-like arm's race against your competitors the software vendors have sold you on (at a great profit to them, I might add).&lt;br /&gt;&lt;br /&gt;Why is SOA such a challenge? Simple, because it puts the focus of enterprise architecture on software architecture, not hardware and network architecture. The IT industry is in the midst of handoff between its first generation of infrastructure architects and a new generation of software architects. Businesses, who have come to rely heavily on their architects, are struggling to understand a new sofware-centric view of their technology portfolio. The old days were (somewhat) easy, let the IT guys handle the infrastructure, and we'll handle the business. Investments in technology were relatively simple and straightforward to both understand and manage - and the results were tangible assets that had an expected life and could be depreciated with comfortable precision.&lt;br /&gt;&lt;br /&gt;The first generation of architects are extremely good at what they were asked to do - connect hardware through ever-growing and ever-speedier networks. Software, at least the software they intended to run the mission-critical elements of the business on, was considered to be a commodity - just like the hardware and network components they were used to implementing. Their view of software from an enterprise perspective was through the hardware nodes that the software was to be deployed on (this box is for General Ledger, that box is for Accounts Payables, this box is for email, that box is for our website, and so on ...). Rack it, stack it, connect it up, and turn it on.&lt;br /&gt;&lt;br /&gt;The new generation of architects don't think of software only in terms of how it is deployed. Disrupting forces like the Internet, Mobile Computing, Virtualization, and Cloud Computing are making physical hardware and networks a ubiquitos (and somewhat abstract) concept. With the changes brought about by these forces, it is not likely that the IT group of the future will even continue to manage physical technology assets within business-owned data centers anymore.&lt;br /&gt;&lt;br /&gt;So if IT departments are no longer managing hardware and networks for the business, what will that leave them with? Will IT cease to exist as a business-critical function within the enterprise? The answer, of course, is no (or else I'd be learning a new trade instead of blogging about this one). The answer is that IT departments will &quot;move up the food-chain&quot; within the business - becoming newly responsible for managing and securing its intellectual property (IP).&lt;br /&gt;&lt;br /&gt;IP is the beating heart of today's business. It is composed of the knowledge and the processes that form the foundation of a business and give it its unique competitive differentiation within the marketplace. Knowledge and processes are modeled as software, not hardware - and those models can no longer be confined to the physical boundaries of hardware and networks. Look no further than Amazon, Google and other major internet-based companies that have survived the dot.com bubble to form the new guard of today's business for proof of this paradigm shift is real.&lt;br /&gt;&lt;br /&gt;So how does this all tie back to SOA? SOA is simply a better way of managing the knowledge and processes that form the IP of your business. SOA is a better way because it is a software architecture that, like the knowledge and processes it manages, is not confined to the physical boundaries of hardware and networks.&lt;br /&gt;&lt;br /&gt;So, if I shouldn't approach SOA the way I've approached technology investments in the past, by going out and buying some components from a vendor, connecting them up, and turning them on; how should I approach it? This will be the subject of my next blog - &lt;a href=&quot;http://tom-mccuch.blogspot.com/2008/12/agile-soa-part-ii.html&quot;&gt;Part II&lt;/a&gt; in this series.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8817108378149444131-981158388974085772?l=tom-mccuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://tom-mccuch.blogspot.com/2008/10/agile-soa-part-i.html</link><guid>64755008b830a355781d52be1274777d</guid></item>
<item><title type="text">Agile SOA - Part II</title><description type="html">After establishing the forces behind the paradigm shift of Service Oriented Architecture (SOA) in &lt;a href=&quot;http://tom-mccuch.blogspot.com/2008/10/agile-soa-part-i.html&quot;&gt;Part I&lt;/a&gt; of this series, I'd like to talk about how we should now be approaching enterprise architecture from the perspective of software architecture in this article. SOA is an architectural pattern for how to build software that better supports the evolutionary characteristics of your business. The emphasis within this discussion will be around the term &quot;evolutionary&quot;, and how agile methods best support the evolutionary development of software.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'll first start by contrasting the &quot;evolutionary&quot; aspect of modern software architecture against the &quot;predictable&quot; aspect of modern hardware architecture. Moore's law best describes the predictability of modern hardware architecture: that almost every aspect of digital electronic devices (processing speed, memory capacity, etc.) are all improving exponentially, doubling approximately every two years. The trend was first observed by Intel co-founder Gordon E. Moore in a 1965 paper, has continued for almost a half of a century, and is not expected to stop anytime soon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Modern software architecture has no such predictability. It is best described by the theory of evolution, well-known within the domain of biology. The primary reason for this is that software is used to model the knowledge and processes that form the foundation of a business. This intellectual property (IP) that gives a business its competitive differentiation comes from the coordinated effort of its people. In biology, evolution is change in the inherited traits of a population of organisms from one generation to the next. Evolution occurs naturally within any biological population, so it is natural to expect that that the knowledge and processes guarded by a group of people will evolve as well, and therefore that the software that models that IP must have the chief characteristic of &quot;evolvability&quot; in its design.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Whether you fall on the side of Evolution or Creation as it applies to the origins of humanity, no one can deny the fact that software is created. One could argue if all software was indeed created by an &quot;intelligent designer&quot;, but that is the subject of another blog. Designing software to best support its own evolution is by far the hardest thing a software architect must attempt to do. While evolution is a relatively simple thing to comprehend, it is not even remotely simple to design for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Service Oriented Architecture is the next step along the path our industry has taken since its inception to achieve &quot;evolvability&quot; in software design. At first we categorized and organized data &quot;in-situ&quot; with structured programming, then we began to add behavior and encapsulate both data and its behavior as objects with object-oriented design, and now we are making behavior a first-class design concern with SOA - pushing data to more of a &quot;behind-the-scenes&quot; supportive role. This is because the knowledge that forms the competitive advantage of a business is derived from the interpretation of data created and managed through the processes with which the business provides value to its customers. Data is only a means to an end, it is in the successful interpretation of data that a business lives or dies. That successful interpretation is inexorably linked to the evolving environment in which the business is competing. Safely and securely nurturing and advancing the IP of a business is indeed akin to &quot;survival of the fittest&quot; within the free market economy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So why is Agile the best method to use when approaching the evolutionary characteristic that is the chief concern of SOA? Simple, because while those of us who architect software may be intelligent - we are not omniscient, and cannot predict the ways in which our software and its use within the business context will evolve over time. Whenever I discuss Agile, I like to go back to the 4 basic values that were recognized by Kent Beck in &quot;Extreme Programming Explained: Embrace Change&quot;, Addison-Wesley, 1999. These values are Communication, Simplicity, Feedback, and Courage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Communication.&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&quot;The first value is communication. Problems with projects can invariably be traced back to somebody not talking to somebody else about something important.&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An Agile approach to SOA is all about establishing, and continually improving, the communication between business and IT. Architecture is the way in which those of us involved with software design communicate to our business counterparts. This communication is meant to be &quot;reflective&quot;, in that it should reflect the values, priorities, and requirements initially shared with us by the business. Perhaps the biggest way in which SOA improves the &quot;reflective&quot; property of IT to business communication around software design is that it de-couples the two concepts of business and application services. Business services are discovered in a top-down fashion from the activities that make up a business process. A business service delegates the automated work related to the activity it is modeling to application services. Application services are discovered in a bottom-up fashion from the existing systems and data that support the business. It is in the mapping of business services to application services that our business counter-parts can truly understand the value provided by their application portfolio, and that we in IT can rationalize the continuing investment from the business for maintaining it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Simplicity.&lt;/span&gt; &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&quot;The second value is simplicity. The [Agilepractitioner] continually asks the question: What is the simplest thing that could possibly work?&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An Agile approach to SOA is all about deriving simplicity from the seemingly complex. Legacy application services are complex, mainly because those who designed them just didn't expect the internals of these applications ever to see the light of day in the business world. Legacy Enterprise Resource Planning (ERP) applications were a commodity and so long as they functioned properly as a whole within acceptable service levels, it didn't really matter how they were designed internally. However, in SOA, these legacy application monoliths must be broken down into the specific services they provide in order toeffectively trace those application services to the business activities they support.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Simplicity in SOA comes down to reducing the &quot;surface area&quot; of the software we are integrating into our business. Legacy monolithic applications just have too much surface area to consider when attempting to integrate them within an evolving business process. The ERP days were also all about implementing these legacy monoliths &quot;vanilla&quot;, with as few customizations as possible - because customizations were hard and cost money. This led to the business being forced to conduct their processes the way the software dictated they be conducted. This rigidity, introduced by IT, led to many businesses falling behind in their ability to compete by successfully adapting to their continually evolving industries. This has left a very bad taste in their mouths about IT (not to mention the debacle of Y2K that yielded absolutely no business value).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With SOA, it is an absolute imperative that we find the simplest way to keep our respective businesses competitive. SOA promotes simplicity in its design through modularity and flexibility. By flexibly composing more complex business services from simple, modular application service building blocks - we are better preparing that software to evolve along with the business processes it supports. Kent Beck says it best: &quot;[Agile software development] is making a bet. It is betting that it is better to do a simple thing today and pay a little more tomorrow to change it if it needs it, than to do a more complicated thing today that may never be used anyway.&quot; Time is the enemy of complexity - only the simplest of solutions will endure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Feedback.&lt;/span&gt; &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&quot;The third value [of Agile] is feedback. Concrete feedback about the current state of the system is absolutely priceless. Optimism is an occupational hazard of [software architecture]. Feedback is the treatment.&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An Agile approach to SOA is all about promoting feedback at both design-time and run-time, creating a continual feedback loop between the changes in the processes that support the business and the responsiveness of IT to those changes. At design-time it does this by improving the testability of software while at run-time it does this by allowing real business results to be tracked and monitored in real time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In software, increased modularity leads to increased testability. Testability of software deals with the ability of software to hide errors from detection during testing. More complex software is more difficult to test because its complexity acts as a sort of camouflagefor latent bugs, allowing them to survive longer without detection. Many studies have shown that the longer it takes to detect a bug, the more costly it is to correct that bug. Simple, modular software architecture allows for more effective testing of smaller, and therefore more manageable, chunks of an application. Since this testing can be focused on the module and performed independently of the rest of the application, it is far less likely to conceal bugs further into the software lifecycle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SOA also promotes feedback at run-time by linking the work performed by application services to tangible business results. Business services represent activities that add value for the customer within the context of a business process. Run-time monitoring of these business services provides real-time feedback on how well the business is running. If a business service is not running within established service levels, it is also easy to &quot;click into&quot; a particular business service and see if the reliability, availability, scalability or performance of the supportive application services are the source of the problem. Finally, the real-time metrics collected by monitoring a business process can be used to simulate business process performance under load to better understand the impact of changes to that business process while those changes are still under test.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Courage.&lt;/span&gt; &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&quot;Within the context of the first three values - communication, simplicity, and feedback - it's time to go like hell. If you aren't going at absolutely your top speed, somebody else will be, and they will eat your lunch.&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An Agile approach to SOA is all about finding the courage to be wrong sometimes, while minimizing the impact of being wrong and optimizing the time to correct those mistakes as they are discovered. Due to the predictable nature of hardware architecture, it wasn't generally acceptable for the first generation of enterprise architects to be wrong. The new generation of architects must be capable of making educated decisions in the trade-off between &quot;perfect&quot; and &quot;fast&quot;. If software is going to successfully evolve at the speed of business, we software architects must learn how to facilitate, not impede, that evolutionary progress. We must trust that if we follow the other tenants of the agile approach, that our mistakes will be fewer, of smaller scope, and much easier to detect and correct. The business does not really care if you can unequivocally point the finger at a software vendor as the source of a problem - they only care how long it will take you to diagnose and correct that problem. If you are able to keep pace with the business, then small, quickly recoverable problems with the software will be tolerated by the business. It is only when you cannot keep pace with the business that the business begins to expect the impossible. Your customer's expectations for the software you deliver are directly proportional to the time it takes for you to deliver it -- the longer it takes for you to deliver software to your customer, the higher your customer's expectations for that software will be.SOA gives you the modular and flexible design you need to embrace business change while an Agile approach gives you the most rapid approach to keep pace with that business change.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So if I've convinced you that an Agile approach to SOA is the right approach, you may come to see the monolithic SOA Suites the large vendors sell as overly-complex and the cumbersome development methods and processes they dictate to you as overly-slow. This will be the subject of my next blog - part III in this series.&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8817108378149444131-4098530415760843365?l=tom-mccuch.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://tom-mccuch.blogspot.com/2008/12/agile-soa-part-ii.html</link><guid>11c6096a20d4ee8befa190db0097202f</guid></item>
<item><title>Hand to Hand Malware Combat</title><link>http://blogs.liquidhub.com/spage/2009/11/hand-to-hand-malware-combat/</link><pubDate>Mon, 02 Nov 2009 15:28:40 -0500</pubDate><description>Does anybody else like to battle viruses and malware by hand? I use the free AVG Anti Virus and highly recommend it. But my kids play a lot of flash games that invariably come from sites designed to infect with the latest malware.The free AutoRuns utility from Sys Internals (now Microsoft) is my chief weapon [...]</description><guid>c998551dcf33717eda7b0495a798ede0</guid></item>
<item><title>Software History Books</title><link>http://blogs.liquidhub.com/spage/2009/11/software-history-books/</link><pubDate>Mon, 02 Nov 2009 14:50:00 -0500</pubDate><description>It&amp;#8217;s valuable for programmers to know the history of computer programming. One reason&amp;#160;is to&amp;#160;observe how ordinary people accomplished extraordinary things&amp;#8230;creating software that&amp;#8217;s part of our everyday existence. Another is to gain insight into how software development got to its current state and where the future lies. I find the stories of Internet start-ups, success or [...]</description><guid>60e1832b3fc0ebb94e62150c599aa145</guid></item>
<item><title>The CIO is accountable for SOA</title><link>http://blogs.liquidhub.com/corporate/?p=143</link><pubDate>Fri, 30 Oct 2009 12:46:07 -0400</pubDate><description>Interesting question posed in the ebizq.net forum:In SOA Governance, Who Has the Authority?In my opinion, the short answer is the CIO is accountable for (service-oriented) architecture. The long answer involves first addressing 2 key buzzwords associated with the question: SOA and governance. I leverage MITs IT Governance model when defining SOA governance: SOA governance involves [...]</description><guid>9f06cdb908783822775409685ee1c87d</guid></item>
<item><title>Software Configuration Management Part II  Branching strategies</title><link>http://therealtim.wordpress.com/2009/10/29/software-configuration-management-part-ii-branching-strategies/</link><pubDate>Thu, 29 Oct 2009 14:30:57 -0400</pubDate><description>BRANCHING STRATEGIESA sophisticated branching strategy can yield significant improvementsThe function of a branching strategy has several functional goals : Create better software (fewer bugs); deliver software faster; allow for flexible (agile?) deployments, where an intelligent choice can be made as to which features are released, giving you the ability to do time-based releases with a [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=therealtim.wordpress.com&amp;blog=3059746&amp;post=42&amp;subd=therealtim&amp;ref=&amp;feed=1&quot; /&gt;</description><guid>cec5f17c80470da1332be2021d24b6e2</guid></item>
<item><title>Corporate IT Forecast: 100% cloudy with a chance of meaty cost savings</title><link>http://blogs.liquidhub.com/corporate/?p=141</link><pubDate>Tue, 13 Oct 2009 09:16:41 -0400</pubDate><description>As the adage goes, history is bound to repeat itself. In his book, The Big Switch, Nicholas Carr presents an insightful summary of the evolution of the power-generation industry and draws discerning parallels with that of the information technology industry. First, he summarizes how the industrial power-generation business transitioned from the brawn of men and [...]</description><guid>e7a9f1cd58c048796a3671008a5c3279</guid></item>
<item><title>The Adventures of a Not So Lucky Enterprise Cloud Pioneer</title><link>http://blogs.liquidhub.com/corporate/?p=140</link><pubDate>Fri, 02 Oct 2009 12:50:35 -0400</pubDate><description>Why cant every CIO be as lucky as Jim Barton? The mythical man, with not one iota of technology expertise, is thrown into a seemingly inescapable trap of leading fictional IVK Corporation through data security breaches, web site denial-of-attacks and other corporate information technology maladies. Yet, somehow he manages to escape them all with only [...]</description><guid>9ee1eec659a6a2cdf22fbf9dd6ce4059</guid></item>
<item><title>Integration Architecture Considerations: REST vs. SOAP</title><link>http://blogs.liquidhub.com/corporate/?p=134</link><pubDate>Thu, 10 Sep 2009 12:51:15 -0400</pubDate><description>Introduction of latest integartion archtecture trend called Service Oriented Architecture, or SOA for shot, has stirred up quite a debate on what types of service architectures are best suited for enterprise wide adoption. Should the services be based on:REST or SOAP ? Before casting the final vote, one must understand these types of services and [...]</description><guid>18201f925f3692739646234d72c939e0</guid></item>
<item><title>Application Portfolio Rationalization  Prioritize dont Architect!</title><link>http://blogs.liquidhub.com/corporate/?p=126</link><pubDate>Tue, 25 Aug 2009 10:51:07 -0400</pubDate><description>A common misconception is that application rationalization and optimization will somehow unlock the mysteries of your future IT architecture. Many believe that by analyzing the patterns in your technical architecture, assessing your teams skill-sets, and reading the tea leaves of future technology trends you can boldly stand up and say we will be an SOA [...]</description><guid>f13694a1918091073c070c3f94a9b360</guid></item>
<item><title>Startup Interest Group</title><link>http://blogs.liquidhub.com/spage/2009/08/startup-interest-group/</link><pubDate>Fri, 21 Aug 2009 11:38:56 -0400</pubDate><description>I&amp;#8217;ve been attending a technology startup interest group, the Philly Startup Hackathons, for about two years now. I&amp;#8217;ve met lots of interesting people, notably Gabriel Weinberg, the organizer. Gabriel&amp;#8217;s always got too many interesting projects underway! One of his latest is an internet search engine called DuckDuckGo. He&amp;#8217;s also well-connected in the area, and is [...]</description><guid>3327c5d140c9f1cef15edede3a952724</guid></item>
<item><title>Blog Comments</title><link>http://blogs.liquidhub.com/spage/2009/08/blog-comments/</link><pubDate>Tue, 18 Aug 2009 09:38:02 -0400</pubDate><description>Comment Spam, Serial Posts, Long GapsWow, 95% of the comments posted to the blog articles here are spam. Through the spam, I&amp;#8217;ve learned a lot about Pfizer&amp;#8217;s flagship product&amp;#8230;or is that flagstaff product? The comment spammers go to varying amusing lengths to make their posts look like legitimate comments, but they&amp;#8217;re effortless to spot, so [...]</description><guid>68e68c6c2b65549693e212a01bb21aea</guid></item>
<item><title>Introducing The Collaboration Center of Excellence</title><link>http://blogs.liquidhub.com/corporate/?p=125</link><pubDate>Mon, 17 Aug 2009 13:34:05 -0400</pubDate><description>Collaboration can be framed in terms of how it impacts People, Business Processes and Organizational Knowledge. Processes address the methods, applications and rules which define and govern how work gets done. For example, order fulfillment, new account development, employee on boarding, web site publishing, product development, etc. Knowledge and knowledge management refers to the development [...]</description><guid>b2318d52da6da49c9d3ad7c823321870</guid></item>
<item><title>Best Practices in The Real World: Square Peg/Round Hole?</title><link>http://blogs.liquidhub.com/corporate/?p=120</link><pubDate>Mon, 10 Aug 2009 09:45:24 -0400</pubDate><description>In any collaborative platform implementation, SharePoint notwithstanding, there are different approaches to do different things. How does one install the tool within the current Enterprises environment? How does one configure the tool to meet the business need? Questions like these can be answered in many different ways. It is from these different approaches that Best [...]</description><guid>77e676d3490e363e9b70de507714b900</guid></item>
<item><title>Web Architect?  Is there such a beast?</title><link>http://blogs.liquidhub.com/corporate/?p=116</link><pubDate>Tue, 26 May 2009 14:49:49 -0400</pubDate><description>Of course, there is no industry standard definition of a web architect.Below is how I view the role.A Web Architect is a specific type of application architect*. A web architect is expert re: web-specific scenarios and technologies applying best practices, patterns, and reference architectures around delivering web-native experiences in one or more of 3 types [...]</description><guid>a2071ea5fbadd222e17320af1c476b3a</guid></item>
<item><title>Twitter to blog script</title><link>http://brianlyttle.com/2009/05/twitter-to-blog-script/</link><pubDate>Sun, 24 May 2009 13:37:58 -0400</pubDate><description>Based on an example provided with the Twitter library for Python I cobbled together the following script to add my latest tweets to this site. It&amp;#8217;s called from a cron job that I run on an occasional basis. My script linkifies hashtags and @username tokens in tweets so that you can see search results or [...]</description><guid>87ab5a358ae60a53b17a39e8ed075e06</guid></item>
<item><title>Keeping files in sync with Dropbox</title><link>http://brianlyttle.com/2009/05/dropbox-review/</link><pubDate>Sat, 23 May 2009 18:25:49 -0400</pubDate><description>When you use more than one computer on a daily basis, keeping files in sync between them is a constant problem. I&amp;#8217;m familiar with tools like Subversion and Mercurial that make it relatively easy to keep code in sync between machines, but these require explicit actions that I often want to control. When it comes [...]</description><guid>1e1b6a180f92d02ea3f58241db37f2a6</guid></item>
<item><title>Ideal Transform Rule</title><link>http://blogs.liquidhub.com/spage/2009/05/ideal-transform-rule/</link><pubDate>Mon, 11 May 2009 16:19:31 -0400</pubDate><description>Always work from ideal input.Developers familiar with the power of pipeline operations central to the UNIX operating system know how simple, modular tools can be chained together to accomplish a wide variety of complex tasks. The small-scope and&amp;#160;single-purposed blocks of code that make up a pipeline maximize the ability to maintain the code. Even if [...]</description><guid>9d740a93150f188f9b51a5387f35c3fa</guid></item>
<item><title>Technology or marketing tool?</title><link>http://blogs.liquidhub.com/corporate/?p=119</link><pubDate>Thu, 07 May 2009 18:53:55 -0400</pubDate><description>On April 22ndNationwide Insurance released an &amp;#8220;Accident Toolkit&amp;#8221;on the iPhone Storedesigned to &amp;#8220;guide you through the steps to take after an accident.&amp;#8221; The services the app provides include:Calls emergency servicesHelps you collect and exchange accident infoStores your insurance and vehicle info for easy lookupLocates Nationwide agents near youTakes and stores accident photosConverts your iPhone into [...]</description><guid>ea741772c981fee35876f71452da9ec9</guid></item>
<item><title>What is the Meaning of Life?</title><link>http://blogs.liquidhub.com/corporate/?p=107</link><pubDate>Mon, 04 May 2009 12:18:08 -0400</pubDate><description>I thought it best to comeright out of the gate and try to tackle the big questions first.Get this one correctand future posts about thetechnology challenges faced by the insurance industry shouldseem trivial.Truthfully,my goalin writing this blog is notthatambitious, butthere are a lot of &amp;#8220;big questions&amp;#8221;for IT professionals serving the insurance industry to contemplate, such [...]</description><guid>f5fdb917a4ef152c0e132d84a6f0c9d5</guid></item>
<item><title>Unit Tests for FinQ</title><link>http://blogs.liquidhub.com/spage/2009/03/unit-tests-for-finq/</link><pubDate>Thu, 26 Mar 2009 00:08:31 -0400</pubDate><description>I&amp;#8217;ve setup the FinQ library solution to support the unit testing framework NUnit. Here are a few of the guidelines I&amp;#8217;ve used for setting up the project. Tests belong in a separate assembly.Place tests in the BaseName.UnitTests namespace.Break up tests into multiple classes and files by subject area.Tests should stand-alone and be single-purposed.Name tests clearly.Maximize [...]</description><guid>42f7ef7bcb1df3a1181018435887f2cf</guid></item>
<item><title>FinQ Stats</title><link>http://blogs.liquidhub.com/spage/2009/03/finq-stats/</link><pubDate>Fri, 13 Mar 2009 00:00:57 -0400</pubDate><description>I took too many statistics courses in college, or perhaps they took me. Hopefully I escaped with enough stats to implement the basics: mean, variance, and standard deviation for the FinQ library. LINQ stops with average, but standard deviation is etched into my mind as being genuinely useful&amp;#8230;so I&amp;#8217;ll go the extra few lines of [...]</description><guid>2f97cd99b1325b8e44fd3c14da2152a0</guid></item>
<item><title>Get fast computers for your developers</title><link>http://brianlyttle.com/2009/03/fast-computers/</link><pubDate>Sun, 08 Mar 2009 14:42:52 -0400</pubDate><description>I&amp;#8217;ve just been through an office move at a client site and packing it up got me thinking about the choices that companies make for their staff when it comes to computer hardware. Most users can benefit in some way from having faster computers, with bigger screens, and better input peripherals. Corporations have a tendency [...]</description><guid>a765156f62a7abac4d91a02b3cc3a498</guid></item>
<item><title>Reduce Redux</title><link>http://blogs.liquidhub.com/spage/2009/02/reduce-redux/</link><pubDate>Wed, 25 Feb 2009 15:29:47 -0500</pubDate><description>Reduce is a powerful function pattern. In fact, it can be used as the base implementation for both Filter and Map. That&amp;#8217;s what we&amp;#8217;ll do to take our functional library to the next level of functional goodness. We initially had Reduce take a list of many values and produce a single value, an aggregate, but [...]</description><guid>2e2d817ec94217f707295bf90481d4a7</guid></item>
<item><title>Lambda Functions</title><link>http://blogs.liquidhub.com/spage/2009/02/lambda-functions/</link><pubDate>Wed, 25 Feb 2009 15:20:47 -0500</pubDate><description>What about those predicate, conversion, and aggregation functions? Does this style of programming with higher order functions mean you have to write a bunch of tiny functions to pass around? Nope! We can use C# lambda functions. A lambda function is a function defined on-the-fly at the call site without a lot of declaration and [...]</description><guid>42dd69e43c46b69a94be25c72ac1b69d</guid></item>
<item><title>FinQ Reduce</title><link>http://blogs.liquidhub.com/spage/2009/02/finq-reduce/</link><pubDate>Wed, 25 Feb 2009 15:02:04 -0500</pubDate><description>The Reduce function uses an initial value and an aggregation function to build a result value from a sequence. Taking the sum of a set of numbers is a reduction, a reduction by addition.public static R Reduce&amp;#60;T, R&amp;#62;(this IEnumerable&amp;#60;t&amp;#62; list, R init, Agg&amp;#60;T, R&amp;#62; agg){    R result = init;    [...]</description><guid>d19d3fc5d674b36efc49f5d7801411f0</guid></item>
<item><title>Software Configuration Management, part I</title><link>http://therealtim.wordpress.com/2009/02/20/software-configuration-management-part-i/</link><pubDate>Fri, 20 Feb 2009 10:20:45 -0500</pubDate><description>OverviewSoftware Configuration Management (SCM) is the art of both controlling and tracking changes in a software project. If software engineering is fundamentally concerned with producing quality software in a known and repeatable fashion, then SCM is the fundamental tool that drives the operation of software engineering.Why is Software Configuration Management important?The formal goal of a [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=therealtim.wordpress.com&amp;blog=3059746&amp;post=32&amp;subd=therealtim&amp;ref=&amp;feed=1&quot; /&gt;</description><guid>bf15f740c0ca1a797a2bdbd4cf12b669</guid></item>
<item><title>Essential Utility: htop</title><link>http://brianlyttle.com/2009/02/essential-utility-htop/</link><pubDate>Sun, 08 Feb 2009 22:46:46 -0500</pubDate><description>I&amp;#8217;ve been rebuilding my Dell PowerEdge 830 server after a meltdown last week. This time I decided to go with Ubuntu Server 8.10 as the base operating system with Windows running under VMware Server 2.0.Since this is a pretty small server, I&amp;#8217;m always checking up on resource usage and top is a useful tool for [...]</description><guid>2310067358988b9090239b8f40cc7da9</guid></item>
<item><title>Weekly Links #2</title><link>http://brianlyttle.com/2009/01/weekly-links-2/</link><pubDate>Mon, 26 Jan 2009 23:18:12 -0500</pubDate><description>Microsoft InfoMesa Project Whiteboard for your dataFabric &amp;#8211; like Capistrano but written in PythonA Visual Introduction to Screenretlang &amp;#8211; Google CodeTim Sneath : The Bumper List of Windows 7 Secretsupdate-engine &amp;#8211; Google Code</description><guid>be20cb6ff7071027590d44a7761ea2bd</guid></item>
<item><title>PowerShell and svnadmin dump/load</title><link>http://brianlyttle.com/2009/01/powershell-and-svnadmin/</link><pubDate>Mon, 26 Jan 2009 23:10:31 -0500</pubDate><description>Recently I was migrating several Subversion repositories from a Windows server over to a Solaris one and ran into a rather frustrating issue. Actually it&amp;#8217;s quite an interesting problem, but was frustrating due to the size of the repositories involved, and my fear that repositories were borked.It all started with my decision to fire up [...]</description><guid>b3bd3d835b049199d7dd431738c2533f</guid></item>
<item><title>First impressions of Windows 7 Beta 1</title><link>http://brianlyttle.com/2009/01/first-impressions-of-windows-7-beta-1/</link><pubDate>Sun, 11 Jan 2009 15:52:33 -0500</pubDate><description>After a very quick install on a Dell XPS M1710 laptop, and a few hours of messing around, I have come to the conclusion that this is going to be the best release of Windows yet. At the same time, it&amp;#8217;s not very exciting for the alpha geek in me. Perhaps it is good to [...]</description><guid>19f712db343e277169257a980f33e9a7</guid></item>
<item><title>Weekly Links #1</title><link>http://brianlyttle.com/2009/01/weekly-links-1/</link><pubDate>Sun, 11 Jan 2009 14:36:35 -0500</pubDate><description>I manage my bookmarks using a Delicious Bookmarklet, and I&amp;#8217;ll post some of the best on my blog each week.Hiring for an Agile Team: Possible Questions FontExplorer X &amp;#8211; The new professional font management software TextMate Blog  Working With History in Bash Using MVC to Unit Test WPF Applications Mole v4.2 For Visual Studio [...]</description><guid>d6757a4ee8f367005b625815b945183f</guid></item>
<item><title>Return of the blog</title><link>http://brianlyttle.com/2009/01/return-of-the-blog/</link><pubDate>Sat, 03 Jan 2009 14:49:22 -0500</pubDate><description>Maybe this year will be the one where I get back on the path to regular blogging. Between 2002 and 2004 I was a fairly frequent blogger and then things got substantially busier when I moved to the US. The obligatory first post these days seems to be some background information on the blogger, but [...]</description><guid>0e0de974d386eedb49e0837751fc667b</guid></item>
<item><title>SOA Performance Metrics</title><link>http://therealtim.wordpress.com/2008/09/26/soa-perfromance-metrics/</link><pubDate>Fri, 26 Sep 2008 10:14:05 -0400</pubDate><description>SOA performance measurement is important for two main reasons &amp;#8212; requirements compliance and system planning.  The first reason, requirements compliance is obvious, where you must prove that your system meets the overall performance requirements of whatever process you are running.  The second reason, system planning, is necessary to get to a fully deployed [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=therealtim.wordpress.com&amp;blog=3059746&amp;post=29&amp;subd=therealtim&amp;ref=&amp;feed=1&quot; /&gt;</description><guid>e100b6379a8b2a7cfe26244113e65e70</guid></item>
<item><title>SOA performance part I : managed environments and garbage collection overhead</title><link>http://therealtim.wordpress.com/2008/08/05/soa-perforamnce-part-i/</link><pubDate>Tue, 05 Aug 2008 13:40:40 -0400</pubDate><description>Automatic garbage collection is simultaneously the best and worst part of implementing programs in managed code.  On the positive side, garbage collecting makes the writing of the program easier by freeing you from the need to explicitly manage memory and it thus makes the runtime more stable as it prevents most memory leaks (Self-referential [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=therealtim.wordpress.com&amp;blog=3059746&amp;post=19&amp;subd=therealtim&amp;ref=&amp;feed=1&quot; /&gt;</description><guid>08476fa6ac9b18092f207bb55b79543d</guid></item>
<item><title>Fixed Cost Software Development : Good for whom exactly?</title><link>http://therealtim.wordpress.com/2008/07/15/fixed-cost-software-development-good-for-whom-exactly/</link><pubDate>Tue, 15 Jul 2008 14:25:53 -0400</pubDate><description>So I was reading the latest issue of Dr Dobb&amp;#8217;s and got to the piece by Scott Ambler called &amp;#8220;Is Fixed-Price Software Development Unethical?.&amp;#8221;  Mr. Ambler, as you may know, is the Agile Methodology guy at ddj.  It is really a fascinating article, and something that I have been on about for some [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=therealtim.wordpress.com&amp;blog=3059746&amp;post=5&amp;subd=therealtim&amp;ref=&amp;feed=1&quot; /&gt;</description><guid>cb49a155ce999aa987199e84197d0abe</guid></item>
</channel></rss>