<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkENSHg9eip7ImA9WhBbFUQ.&quot;"><id>tag:blogger.com,1999:blog-28150884</id><updated>2013-05-15T02:18:19.662-04:00</updated><category term="ruby" /><category term="users" /><category term="wiki" /><category term="tools" /><category term="software development process" /><category term="jdbc" /><category term="javascript" /><category term="documentation" /><category term="funny" /><category term="messaging" /><category term="SOA" /><category term="J2ee" /><category term="RIA" /><category term="trends" /><category term="agile" /><category term="opensource" /><category term="spring" /><category term="Apache Ant" /><category term="Career" /><category term="Software" /><category term="productivity" /><category term="JUnit" /><category term="closures" /><category term="usability" /><category term="Grady Booch" /><category term="database" /><category term="Silver Bullet" /><category term="dependency injection" /><category term="scalability" /><category term="java" /><category term="cloud computing" /><category term="Certification" /><category term="silverlight" /><category term="Bob Lee" /><category term="ajax" /><category term="security" /><category term="smalltalk" /><category term="programming" /><category term="XML" /><category term="Web 2.0" /><category term="interview" /><category term="software architecture" /><category term="scrum" /><category term="sql" /><category term="Maven" /><category term="javaFX" /><category term="code quality" /><category term="ssl" /><category term="jboss" /><category term="design" /><category term="standards" /><category term="project management" /><category term="testing" /><category term="jms" /><category term="Software Architect" /><category term="deadlock" /><category term="google" /><title>The Art and Craft of Great Software Development</title><subtitle type="html">My thoughts on best practices in software architecture and development as a whole (with an emphasis on the Java stack).</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://softarc.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>86</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment" /><feedburner:info uri="theartandcraftofgreatsoftwarearchitectureanddevelopment" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-nd/2.5/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DUYHQHwzcSp7ImA9WhNaFUg.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-691739803751074085</id><published>2013-01-30T09:39:00.000-05:00</published><updated>2013-01-30T09:45:31.289-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-30T09:45:31.289-05:00</app:edited><title>My Ideal Greenfield Development Platform: Now vs. 5 Years ago</title><content type="html">&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
As I've grown as a developer (sometimes two steps forward and one step back - ha ha!) I've had the privilege to work with some very smart people - not just "IQ" intelligent but "savvy" people who saw where things were going technology wise. So I've learned a lot in the last five years about my technology preferences - sometimes by choice, sometimes by necessity - in some cases just playing catch up (e.g. JavaEE vs. Spring) and bleeding edge in others (e.g. Memcached, JBehave).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
As a result of that experience, every so often I dream of starting a project from scratch and imagine what technologies I would choose to use for my Java stack based on what I know now.&amp;nbsp;Admittedly what's below is a very Java centric stack and I need to work on looking into Ruby on Rails / Python &amp;amp; Django to broaden my skill set too etc. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
Anyway I hope you find the following table an interesting comparison of technology choices now vs. 5 years ago. In many cases the "Then" technology is still around and still viable. Typically what makes the "Now" technology more attractive is a fantastic combination of lower price and better / faster (and free) support - after that features and speed of execution are winning attributes.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;table border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div style="text-align: center;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Component&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td&gt;&lt;div style="text-align: center;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Then&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;(5 Years Ago)&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td&gt;&lt;div style="text-align: center;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Now&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;(2013)&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td&gt;&lt;div style="text-align: center;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Why?&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Middle-Tier Framework&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;JavaEE (JBoss)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Spring&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;In 2005-2006 I went from WebSphere to preferring JBoss because IBM could not move fast and the App Serve was slow. Then I found JBoss also had some issues - less of them - but enough. Just figuring out which JMS messaging solution they would implement in a release was a chore (JBossMQ? JBoss Messaging? HornetQ?). Spring is so much faster in terms of performance, has fewer issues and has faster release schedules and no "two tier" system GA vs. supported&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Deployment Environment&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Your Environment / Your Data Center&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The Cloud (AWS)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;You need to scale on demand these days and pay only for what you need - and that includes Ops folks, DBAs etc. And why AWS as opposed to someone else - simple - maturity of their offering.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Build Tool&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Ant&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Maven&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Why? "Convention over configuration" although I have found Maven and its plugins a bit more buggy than those for Ant. So its not clear cut.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Build Environment&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Local Builds&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Jenkins&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;What do you live under a rock? If you aren't doing continuous builds with all your tests automated and hooked in (unit, integration, acceptance, performance) you're crazy! :-)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Relational Database&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Oracle&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;MySQL&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;There's no reason to pay for a database anymore - Facebook runs on MySQL for crying out loud - InnoDB too!&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Key-Value Store / NoSQL &lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;None&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;MySQL or DynamoDB (or Couchbase)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Sometimes you need a Relational DB and sometimes you just need a KV Store. Well since I'm all about AWS you gotta start with DynamoDB. But with AWS you gotta implement your inter-region replication yourself - however a up and comer that impressed me and one to look at is Couchbase.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Caching Tier&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Roll your own / Terracotta&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Memcached&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Fast, cheap and great support on the web.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Web Container&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Tomcat&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Tomcat or NGINX&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Tomcat still rocks and I haven't built an app yet where Tomcat was the bottleneck but NGINX is getting some play and is worth a look&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Unit Testing&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Junit&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;JUnit&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;JUnit always rocks! Always will!&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Functional Testing&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;WinRunner/LoadRunner etc.&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;JBehave&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Again in the spirit of "Fast, Cheap" and hooks into JUnit JBehave is emerging as a great BDD tool. Hopefully it will keep emerging and develop some snazzy reports.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Bug Tracking&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Roll Your Own / ClearQuest&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;JIRA&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;JIRA just works . . . very well. I wish the Scrum interactions were a bit better (Grasshopper I find non-intuitive at times).&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Source Code Control&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Perforce&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Git&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Git is free, fast and branches are easy. It's a bit hard to get used to but once you do you'll never look back. Oh and GitHub.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;IDE&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Eclipse&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Eclipse&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;As much as I'd love to switch to IntelliJ the plugins and support just don't match Eclipse (esp. for AWS)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;UI&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Web (HTML/Javascript/CSS)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Web AND&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Native Mobile&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I still love the web and Javascript but HTML5 is still in its infancy. With Mobile web and app usage skyrocketing the best way to get good performance is (for now) to go Native. Still perhaps in 3 or 4 years HTML5 support will be better.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Messaging Platform&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;JMS&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;SQS&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Again since I love AWS I gotta go with SQS but what I really love with it is it's failover capabilities (backed by 3 copies in S3) and it's separation of read vs. delete. Brilliant. Their Pub-Sub solution (SNS) is equally great.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Testing&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;50% Manual, 50% Automated&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;100% Automated&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Speed matters - automation + continuous integration (and ideally continuous release) is critical to that end.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
I could go into more stuff like Team communication / projects (e.g. Sharepoint vs. Wikis vs. SaaS providers) but I haven't seen anything that makes me go "Wow" - although after my experience with JIRA I'd probably start with Atlassian stuff.&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I'm sure in 5 years time I will be making newer and more informed choices. The great thing about Software is all parts of it are always on the move. The hard thing about Software is trying to keep up with the same! :-)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;I'd like to hear people's thoughts on the above, their own personal experiences, preferences and if they are aware of anything I've forgotten or if they have questions about technology X?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=YGvBZRMLnhg:dUwqRcEZaow:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=YGvBZRMLnhg:dUwqRcEZaow:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=YGvBZRMLnhg:dUwqRcEZaow:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=YGvBZRMLnhg:dUwqRcEZaow:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=YGvBZRMLnhg:dUwqRcEZaow:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/YGvBZRMLnhg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/691739803751074085/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=691739803751074085" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/691739803751074085?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/691739803751074085?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/YGvBZRMLnhg/my-ideal-greenfield-development.html" title="My Ideal Greenfield Development Platform: Now vs. 5 Years ago" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://softarc.blogspot.com/2013/01/my-ideal-greenfield-development.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUHSXs5cSp7ImA9WhJUGEU.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-3029422827314787460</id><published>2012-09-16T16:42:00.001-04:00</published><updated>2012-09-17T09:23:58.529-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-17T09:23:58.529-04:00</app:edited><title>I wish Steve McConnell was on Twitter . . . . Book review of "Software Estimation"</title><content type="html">Published over 6 years ago "&lt;a href="http://www.amazon.com/Software-Estimation-Demystifying-Practices-Microsoft/dp/0735605351/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1347828095&amp;amp;sr=1-1&amp;amp;keywords=software+estimation"&gt;Software Estimation&lt;/a&gt;" by Steve McConnell is a great read.&lt;br /&gt;
As a practitioner of the agile arts I must say in reading it now this book seems like the last great attempt to "fix" waterfall and "big design up front" (BDUF) methodologies which were known for their very distinct big phases of requirements, design, development, testing and release. The kicker for these techniques was often that the development and testing estimates were VERY far off. If they followed McConnell's advice as he laid out in this book they'd have had more success.&lt;br /&gt;
&lt;br /&gt;
Agile basically works around many of the problems McConnell tries to solve by focusing on short iterations (of &amp;lt; 4 weeks) with new releasable and functional software produced at the end. Basically it avoids many of the risks inherent in Waterfall/BDUF by making the software cycle "too small to fail".&lt;br /&gt;
&lt;br /&gt;
That said there are a great many things still to be learned from Steve's great book. Waterfall and BDUF are by no means dead and even so there are some lessons here about the inherent nature of (errors in) estimations by developers. &amp;nbsp;Even in agile I have experienced serious under-estimation (by a factor of 2x or 3x) by developers - where a story that should have taken 1 sprint takes 3 or more. &amp;nbsp;So we still have much to learn. &amp;nbsp;However the key theme this book drove home to me was pretty much that "Software estimation is so hard that we pretty much gave up and are doing short iterations because that's the most we can estimate". I am sure that wasn't Steve's point but that was my inference because since the book's &amp;nbsp;release estimation has taken the back-burner to story points, burn down charts, stand-ups and sprints.&lt;br /&gt;
More people are becoming Scrum masters and fewer are taking PMP&lt;br /&gt;
&lt;div style="width: 540px;"&gt;
&lt;a href="http://www.indeed.com/jobtrends?q=Agile%2C+PMP" title="Agile, PMP Job Trends"&gt;
&lt;img alt="Agile, PMP Job Trends graph" border="0" height="300" src="http://www.indeed.com/trendgraph/jobgraph.png?q=Agile%2C+PMP" width="540" /&gt;
&lt;/a&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="6" cellspacing="0" style="font-size: 80%; width: 100%px;"&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://www.indeed.com/jobtrends?q=Agile%2C+PMP"&gt;Agile, PMP Job Trends&lt;/a&gt;&lt;/td&gt;
&lt;td align="right"&gt;&lt;a href="http://www.indeed.com/jobs?q=Agile"&gt;Agile jobs&lt;/a&gt; - &lt;a href="http://www.indeed.com/jobs?q=PMP"&gt;PMP jobs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
In this long blog article I try to capture some of the key learnings I made from this book&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Part 1: Critical estimation concepts&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CHAPTER 1: What Is an "Estimate"?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Tip #1: Distinguish between Estimates, Targets and Commitments&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;When business people are asking for an "estimate", they're really often asking for a commitment or a plan to meet a target&lt;/li&gt;
&lt;li&gt;Estimation is not planning&lt;/li&gt;
&lt;li&gt;When you see a "single point estimate" ask whether the number is an estimate or whether its really a target&lt;/li&gt;
&lt;li&gt;A common assumption is that the distribution of software project outcomes follows a bell curve. The reality is much more skewed.&lt;/li&gt;
&lt;li&gt;What is a good estimate?&lt;/li&gt;
&lt;li&gt;The approach should provide estimates that are withing 25% of the actual results 75% of the time&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Events that happen during the project always invalidate the assumptions that were used in the estimate.&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;The primary purpose of software estimation is to determine whether a project's targets are realistic enough to allow the project to be controlled to meet them. &amp;nbsp;The executives want a plan to deliver as many features as possible by a certain date.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;"A good estimate is an estimate that provides a clear enough view of the project reality to allow the project leadership to make good decisions about how to control the project to hit its targets"&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 2: How Good an Estimator are you?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Studies have confirmed that most people's intuitive sense of "90% confident" is really comparable to something closer to "30% confident"&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Where does the pressure to use narrow ranges come from? You or an external source?&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 3: Value of Accurate Estimates?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Is it better to overestimate or underestimate?&lt;/li&gt;
&lt;li&gt;If a project is overestimated, stakeholders fear that Parkinson's law will kick in - work will expand to fill the time allotted.&lt;/li&gt;
&lt;li&gt;Another concern is given too much time, developers will procrastinate until late in the project.&lt;/li&gt;
&lt;li&gt;A related motivation for underestimating is the desire to instill a sense or urgency&lt;/li&gt;
&lt;li&gt;Figure 3.1: The penalties for underestimation are more severe than the penalties for overestimation&lt;/li&gt;
&lt;li&gt;The Software Industry's Estimation Track Record&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Failure rates&lt;/li&gt;
&lt;li&gt;1000 LOC &amp;nbsp; 2%&lt;/li&gt;
&lt;li&gt;10,000 LOC &amp;nbsp; 7%&lt;/li&gt;
&lt;li&gt;100,000 LOC 20%&lt;/li&gt;
&lt;li&gt;1,000,000 LOC 48%&lt;/li&gt;
&lt;li&gt;10,000,000 LOC 65%&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;The Software industry has an underestimation problem.&lt;/li&gt;
&lt;li&gt;What top executives value most is predictability - business need to make commitments to customers, investors, suppliers, the marketplace and other stakeholders&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 4: Where Does Estimation Error Come From&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Four Generic sources&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Inaccurate information about the project being estimate&lt;/li&gt;
&lt;li&gt;Inaccurate information about the capabilities of the organization that will perform the project&lt;/li&gt;
&lt;li&gt;Too much chaos IN the project to support accurate estimation (i.e. try to estimate a moving target)&lt;/li&gt;
&lt;li&gt;Inaccuracies arising from the estimation process itself&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Simple example of a Telephone Number checker and the requirements questions / uncertainties that could result in very different design approaches.&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #93c47d;"&gt;The cone of uncertainty&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: #93c47d;"&gt;Initial Concept &amp;nbsp;0.25x to 4x &amp;nbsp;(Range = 16x)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #93c47d;"&gt;Approved Product Definition &amp;nbsp;0.5x to 2x (Range = 4x)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #93c47d;"&gt;Requirements Complete 0.67x to 1.5x&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #93c47d;"&gt;UI Design Complete 0.8x to 1.25x&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #93c47d;"&gt;Detailed Design Complete 0.9x to 1.1x&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;The cone of uncertainty is the BEST-case accuracy possible to have. It isn't possible to be more accurate - it's only possible to be more lucky.&lt;/li&gt;
&lt;li&gt;The cone does not narrow itself - if a project is not well controlled you can end up with a cloud of uncertainty that contains even more estimation error.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;"What you give up with approaches that leave requirements undefined until the beginning of each iteration if long-range predictability"&lt;/li&gt;
&lt;li&gt;Sources of project chaos&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Requirements that were not investigated very well&lt;/li&gt;
&lt;li&gt;Poor designs leading to lots of code rewrite&lt;/li&gt;
&lt;li&gt;Poor coding practices leading to extensive bug fixing&lt;/li&gt;
&lt;li&gt;Inexperienced personnel&lt;/li&gt;
&lt;li&gt;Incomplete or unskilled project planning&lt;/li&gt;
&lt;li&gt;Prima Donna team members&lt;/li&gt;
&lt;li&gt;Abandoning planning under pressure&lt;/li&gt;
&lt;li&gt;Developer gold-plating&lt;/li&gt;
&lt;li&gt;Lack of source code control software&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;In practice, project managers often neglect to update their cost and schedule assumptions as requirements change.&lt;/li&gt;
&lt;li&gt;Omitted Activities (pp.44)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Missing Requirements&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Non functional requirements: Accuracy, modifiability, Performance, Scalability, Security, Usability etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Missing software-development activities&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Ramp-up time for team members&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Mentoring&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Build &amp;amp; Smoke Test support&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Requirements clarification&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Creating test data&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Beta program management&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Technical reviews&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Integration work&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Attendance at meetings&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Performance tuning&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Learning new tools&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Answering questions&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Reviewing technical documentation etc.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;M&lt;/span&gt;issing non-software-development activities&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Vacations, Holidays, Sick days, Training, Weekends(!?!?)&lt;/li&gt;
&lt;li&gt;Company meetings, department meetings, setting up new workstations&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Developer estimates tend to contain an optimism factor of 20 to 30%. Although managers complain that developers sandbag their estimates - the reverse is true. &amp;nbsp;Boehm also found a "fantasy factor" of 1.33&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;CHAPTER 5: Estimate Influences&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The obvious one: Project Size&lt;/li&gt;
&lt;li&gt;Diseconomies of scale a 1M LOC project takes more than 10x the effort of a 100k LOC project.&lt;/li&gt;
&lt;li&gt;The basic issues is that in larger projects coordination among larger groups of people requires more communication. As Project size increases, the number of communication paths among people increases as a SQUARED function of the number of people on the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Lines of code per staff per year&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;10k LOC project --&amp;gt; 2k to 25k&lt;/li&gt;
&lt;li&gt;100k LOC project --&amp;gt; 1k to 20k&lt;/li&gt;
&lt;li&gt;1M LOC project --&amp;gt; 700 to 10k&lt;/li&gt;
&lt;li&gt;10M LOC project --&amp;gt; 350 to 5k&lt;/li&gt;
&lt;li&gt;Other influences: The kind of software being developed&lt;/li&gt;
&lt;li&gt;Personnel factors&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;According to Cocomo II on a 100k LOC project the combined effect of personnel factors can swing a project estimate by as much as a factor of 22!&lt;/li&gt;
&lt;li&gt;The KEY personnel decision: Requirements Analyst Capability and only THEN the programmer&lt;/li&gt;
&lt;li&gt;The magnitude of these factors has been confirmed in numerous other studies&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Other influences: Programming Language&lt;/li&gt;
&lt;li&gt;Lots of other adjustment factors: See table 5-4 on page 66&lt;/li&gt;
&lt;li&gt;Key Learning: Small and Medium-sized projects can succeed largely on the basis of strong individuals. Large projects however still need strong individuals but project management, organizational maturity and how well the team coalesces are just as significant.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;PART II: Fundamental Estimation Techniques&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CHAPTER 6: Introduction to Estimation Techniques&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
Considerations in choosing estimation techniques&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;What's being estimated - features, schedule, effort&lt;/li&gt;
&lt;li&gt;Project Size&amp;nbsp;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Small: &amp;lt; 5 total technical staff. Best estimates are usually "botom-up" techniques created by individuals who will do the actual work&lt;/li&gt;
&lt;li&gt;Large: 25+ people that lasts 6 to 12 months or more. For these teams the best estimation approaches tend to be "top-down" approaches in the early stages. As the project progresses more bottom-up techniques are introduced and the projects own historical data will provide more accurate estimates.&lt;/li&gt;
&lt;li&gt;Medium: 5 to 25 people lasting 3 to 12 months. Can use any of the techniques above.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Software Development Style: Iterative vs. Sequential&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Evolutionary Prototyping&lt;/li&gt;
&lt;li&gt;Extreme Programming&lt;/li&gt;
&lt;li&gt;Evolutionary Delivery&lt;/li&gt;
&lt;li&gt;Staged Delivery&lt;/li&gt;
&lt;li&gt;RUP&lt;/li&gt;
&lt;li&gt;Scrum&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 7: Count, Compute, Judge&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Count first&lt;/li&gt;
&lt;li&gt;Count if at all possible, compute when you can't cout. Use judgement alone ONLY as a last resort&lt;/li&gt;
&lt;li&gt;What to count? Find something to count that's highly correlated with the size of the software you are estimating. And find something to count that is available sooner rather than later in the development.&lt;/li&gt;
&lt;li&gt;Historical data&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Average effort hours per requirement for development&lt;/li&gt;
&lt;li&gt;Average total effort hours per use case / story&lt;/li&gt;
&lt;li&gt;Average dev/test/doc effort per change request&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 8: Calibration and Historical Data&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Used to convert counts to estimates - lines of code to effort, user stories to calendar time, requirements to number of test cases&lt;/li&gt;
&lt;li&gt;Your estimates can be calibrated using any of three kinds of data&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Industry data&lt;/li&gt;
&lt;li&gt;Historical data&lt;/li&gt;
&lt;li&gt;Project data&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Using data helps avoid subjectivity, unfounded optimism and some biases.&lt;/li&gt;
&lt;li&gt;It also helps reduce estimation politics&lt;/li&gt;
&lt;li&gt;Start with a small set of data&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Size (LOC)&lt;/li&gt;
&lt;li&gt;Effort (Staff months)&lt;/li&gt;
&lt;li&gt;Time (Calendar months)&lt;/li&gt;
&lt;li&gt;Defects (classified by severity)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Be careful how you measure e.g. 8 hour work days? How about vacations? Overtime?&lt;/li&gt;
&lt;li&gt;It is surprisingly difficult in many organizations to determine how long a particular project lasted&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 9: Individual Expert Judgment&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;To create the task-level estimates, have the people who will actually do the work create the estimates&lt;/li&gt;
&lt;li&gt;When estimating at the task level decompose estimates that will require no more than about 2 days of effort. Tasks larger than that will contain too many places that unexpected work can hide. Ending up with estimates that are 0.25 to 0.5d of granularity is appropriate.&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Use Ranges to help identify risks and where things can (and often do) go wrong&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Best Case&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Most Likely Case&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Worst Case&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Expected Case&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Estimate Checklist&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Is what's being estimated clearly defined?&lt;/li&gt;
&lt;li&gt;Does the estimate include all the KINDS of work needed to complete the task?&lt;/li&gt;
&lt;li&gt;Does the estimate include all the FUNCTIONALITY AREAS needed to complete the task?&lt;/li&gt;
&lt;li&gt;Is the estimate broken down into enough detail to expose hidden work?&lt;/li&gt;
&lt;li&gt;Have you looked at notes from past work rather than estimating from pure memory?&lt;/li&gt;
&lt;li&gt;Is the estimate approved by the person who will actually do the work?&lt;/li&gt;
&lt;li&gt;Is the productivity assumed in the estimate similar to what has been achieved on similar assignments in the past&lt;/li&gt;
&lt;li&gt;Does the estimate include a Best Case, Worst Case and Expected Case?&lt;/li&gt;
&lt;li&gt;Have the assumptions in the estimate been documented?&lt;/li&gt;
&lt;li&gt;Has the situation changed since the estimate was prepared?&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Compare actual performance to estimated performance so that you can improve estimates over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 10: Decomposition and Recomposition&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;The key is if you create several smaller estimates some of the estimation errors will be on the high side and some will be on the low side. The errors will tend to cancel each other out to some extent. Research has found that summing task durations was negatively correlated with cost and schedule overruns.&lt;/li&gt;
&lt;li&gt;Since developers tend to give near-Best case estimates, schedule overruns often compound on one another since the chance of each of the estimates coming in as scheduled is so very low.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 11: Estimation by Analogy&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Get detailed size, effort and cost results for a similar previous project&lt;/li&gt;
&lt;li&gt;Compare the size of the new project to a similar past project&lt;/li&gt;
&lt;li&gt;Build up the estimate for the new project's size as a percentage of the old project's size&lt;/li&gt;
&lt;li&gt;Create an effort estimate based on the size of the new project compared to the previous project&lt;/li&gt;
&lt;li&gt;Check for consistent assumptions across the old and new projects&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 12: Proxy-based Estimates&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Fuzzy Logic&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Very Small&lt;/li&gt;
&lt;li&gt;Small&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;Large&lt;/li&gt;
&lt;li&gt;Very Large&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;As a rule of thumb the differences in size between adjacent categories should be at least a factor of 2&lt;/li&gt;
&lt;li&gt;Story Points e.g. Fibonacci sequence.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: red;"&gt;&lt;b&gt;Cautions about rating scales - the use of a numeric scale implies that you can perform numeric options on the numbers: multiplication, addition, subtraction and so on. But if the underlying relationships aren't valid - that is a story worth 13 points doesn't really require 13/3 as much effort as a story worth 3 points - then performing numeric operations on the 13 isn't any more valid than performing numeric operations on "Large" or "Very Large"&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;T-Shirt Sizing&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Remember that the goal of software estimation is not pinpoint accuracy but estimates that are accurate enough to support effective project control&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;In this approach developers classify each feature's size relative to other features as Small, Medium, Large, XL etc.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;This allows the business to trade-off and look for features with the most business value and lowest development cost.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 13: Expert Judgment in Groups&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Group Reviews&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Have each team member estimate pieces of the project individually, and then meet to compare estimates&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Don't just average estimates - discuss the differences&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Arrive at a consensus estimate that the whole group accepts&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Individual estimates have a Magnitude of Relative Error (MRE) of 55%.&lt;/li&gt;
&lt;li&gt;Group-reviewed estimates average an error of only 30%&lt;/li&gt;
&lt;li&gt;Studies have found that the use of 3 to 5 experts with different backgrounds seems to be sufficient.&lt;/li&gt;
&lt;li&gt;Wideband-Delphi Technique&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 14: Software Estimation Tools&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Allows you to simulate different project outcomes&lt;/li&gt;
&lt;li&gt;Data you'll need to calibrate tools&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Effort in staff months&lt;/li&gt;
&lt;li&gt;Schedule, in elapsed months&lt;/li&gt;
&lt;li&gt;Size, in lines of code&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Summary of available tools - see pp.163 (valid as of 2006)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 15: Use of Multiple Approaches&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Use multiple estimation techniques and look for convergence or spread among the results&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 16: Flow of Software Estimates on a Well-Estimated Project&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;When you reestimate in response to a missed deadline base the new estimate on the project's ACTUAL progress not on the project's planned progress.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 17: Standardized Estimation Procedures&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Estimation should be fit into a Stage-Gate process&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Discovery&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Approved preliminary business case&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Scoping&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Approved product vision&lt;/li&gt;
&lt;li&gt;Approved marketing requirements&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Planning&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Approved software development plans&lt;/li&gt;
&lt;li&gt;Approved budget&lt;/li&gt;
&lt;li&gt;Approved final business case&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Development&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Approved software release plan&lt;/li&gt;
&lt;li&gt;Approved marketing launch plan and operations plan&lt;/li&gt;
&lt;li&gt;Approved software test plan&lt;/li&gt;
&lt;li&gt;Pass release criteria&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Testing and Validation&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Pass release criteria&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Launch&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The process should&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Emphasize counting and computing rather than use of judgement&lt;/li&gt;
&lt;li&gt;Calls for the use of multiple estimation approaches&lt;/li&gt;
&lt;li&gt;Communicates a plan at predefined points&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Contains a clear description of an estimate's inaccuracy&lt;/li&gt;
&lt;li&gt;Defines when an estimate can be used as the basis for a project budget&lt;/li&gt;
&lt;li&gt;Defined when as estimate can be used as the basis for internal or external commitments.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;PART III: Specific Estimation Challenges&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 18: Special Issues in Estimating Size&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Using Lines of Code in Size estimation (data is easily collected but translation into "staff months" of effort is error prone)&lt;/li&gt;
&lt;li&gt;Function-Point Estimation&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;The number of function points in a program is based on the number and complexity of&lt;/li&gt;
&lt;li&gt;External inputs (e.g. screens, forms, dialog boxes)&lt;/li&gt;
&lt;li&gt;External outputs (e.g. screens, reports, graphs etc)&lt;/li&gt;
&lt;li&gt;External queries&lt;/li&gt;
&lt;li&gt;Internal Logical files&lt;/li&gt;
&lt;li&gt;External interface files&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 19: Special Issues in Estimating Effort&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Productivity variations among different kinds of software projects can show very different effort estimates (per LOC) and cost (per LOC)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 20: Special Issues in Estimating Schedule&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Basic Schedule Equation&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: #b6d7a8;"&gt;Schedule In Months = 3.0 x cubeRoot(StaffMonths)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Schedules compress and the shorted schedule&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;If the feature set is not flexible, shortening the schedule depends on adding staff to do more &amp;nbsp;work in less time&lt;/li&gt;
&lt;li&gt;Numerous estimation researchers have investigated the effects of compressing a nominal schedule.&lt;/li&gt;
&lt;li&gt;All researchers have concluded that shortening the nominal schedule will increase total development effort.&lt;/li&gt;
&lt;li&gt;There is also an impossible zone and you can't beat it - the consensus of researchers is that schedule compression of more than 25% nominal is not possible&lt;/li&gt;
&lt;li&gt;Similarly you can reduce costs by lengthening the schedule and conducting the project with a smaller team&lt;/li&gt;
&lt;li&gt;Lawrence Putnam conducted fascinating research on the relationship between team size, schedule and productivity.&lt;/li&gt;
&lt;li&gt;Schedule decreases (and effort increases) as you add team members - until you hit 5-7 on a team. After &amp;nbsp;that the effort goes up very much more quickly and schedule ALSO starts to get longer.&lt;/li&gt;
&lt;li&gt;Thus a team size of 5 to 7 people appears to be economically optimal for medium-sized business system projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 21: Estimating Planning Parameters&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Estimating Architecture, Requirements, Management effort for projects of different sizes. The larger the project the more the architecture, test, requirements and management costs.&lt;/li&gt;
&lt;li&gt;Developer-to-test ratio is settled more by planning than by estimation - that is it is determined more by what you think you SHOULD do than by what you predict you will do.&lt;/li&gt;
&lt;li&gt;Good analogy about ideal time and planned time: football game - 60 minutes vs. 2 to 4 hours elapsed time.&lt;/li&gt;
&lt;li&gt;Defect Removal&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Formal Design Inspections: 55% rate of removal (mode)&lt;/li&gt;
&lt;li&gt;Informal design review: 35%&lt;/li&gt;
&lt;li&gt;Formal code inspection: 60%&lt;/li&gt;
&lt;li&gt;Informal code review: 25%&lt;/li&gt;
&lt;li&gt;Low Volume (&amp;lt; 10 sites) Beta Test: 35%&lt;/li&gt;
&lt;li&gt;High Volume (&amp;gt; 1,000 sites): 75%&lt;/li&gt;
&lt;li&gt;System Test: 40%&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Other rules of thumb&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;To go from one-company, one-campus development to multi-company, multi-cit: allow for 25% increase in effort.&lt;/li&gt;
&lt;li&gt;To go from one-company, one campus development to international outsource, allow for a 40% increase in effort.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 22: Estimate Presentation Style&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Communicating Estimate Assumptions&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Which features are in scope&lt;/li&gt;
&lt;li&gt;Which features are out of scope&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Availability of resources&lt;/li&gt;
&lt;li&gt;Dependencies on 3rd-parties (and their performance)&lt;/li&gt;
&lt;li&gt;Unknowns&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Expressing Uncertainty&lt;/li&gt;
&lt;li&gt;Try to present your estimate in units that are consisten with the estimate's underlying accuracy&lt;/li&gt;
&lt;li&gt;Ranges are the most accurate way to reflect the inherent uncertainty in estimates at various points in the Cone of uncertainty.&lt;/li&gt;
&lt;li&gt;Do not present a commitment as a range, a commitment needs to be specific&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;CHAPTER 23: Politics, Negotiation and Problem Solving&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Estimate negotiations tend to be between introverted and more junior technical staff and seasons professional negotiators.&lt;/li&gt;
&lt;li&gt;Understand that executives are assertive by nature and by job description and plan your&amp;nbsp;estimation&amp;nbsp;discussions accordingly.&lt;/li&gt;
&lt;li&gt;You can negotiate the commitment but do NOT negotiate the estimate&lt;/li&gt;
&lt;li&gt;Educate nontechnical stakeholders about effective software estimation practices&lt;/li&gt;
&lt;li&gt;Treat estimation discussions as problem solving, not negotiations. Recognize that all project stakeholders are on the same side of the table. Everyone wins, or everyone loses.&lt;/li&gt;
&lt;li&gt;Getting to Yes&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Separate the people from the problem&lt;/li&gt;
&lt;li&gt;Focus on interests, not positions&lt;/li&gt;
&lt;li&gt;Invent options for mutual gain&lt;/li&gt;
&lt;li&gt;Insist on using object criteria&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&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;div&gt;
&lt;b&gt;Frank's Summary&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
This is a great book I should have read a few years ago. Everyone should. Even if you are doing agile development there are tons of great tips and tricks (e.g. effectiveness of design &amp;amp; code inspections, using best/worst case estimates, negotiation techniques) that are useful regardless.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Like I said above I think the rise of agile techniques pretty much indicates, at least to me, that most software practitioners do not have the patience, determination and doggedness to follow the practices McConnell outlines above. &amp;nbsp;Because of that their estimates (and thus their perceived performance by their customers) is poor. &amp;nbsp;Agile methods especially Scrum and Kanban have achieved success by trying to limit the cognitive planning and estimating load - keeping the process simple and light and "result" focused (ship!). What I like to call "Too Small To Fail". Even so a lot of organizations have trouble adopting agile and need help. &amp;nbsp; There are various reasons for this but they are the same reasons their other processes were flawed - the problem is not in the process itself but how it is being executed and the ability of those trying to do the execution.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
I just wish Steve McConnell was on twitter though - I could do with a daily dose of the knowledge and wisdom he puts into &lt;a href="http://www.amazon.com/Steve-McConnell/e/B000APETRK/ref=sr_ntt_srch_lnk_1?qid=1347888207&amp;amp;sr=1-1" target="_blank"&gt;his books&lt;/a&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;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=RwkShUvrtLI:hyftAtFAjZY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=RwkShUvrtLI:hyftAtFAjZY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=RwkShUvrtLI:hyftAtFAjZY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=RwkShUvrtLI:hyftAtFAjZY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=RwkShUvrtLI:hyftAtFAjZY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/RwkShUvrtLI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/3029422827314787460/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=3029422827314787460" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3029422827314787460?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3029422827314787460?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/RwkShUvrtLI/i-wish-steve-mcconnell-was-on-twitter.html" title="I wish Steve McConnell was on Twitter . . . . Book review of &quot;Software Estimation&quot;" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2012/09/i-wish-steve-mcconnell-was-on-twitter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4MSHc-eip7ImA9WhJVFUw.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-493121313918803541</id><published>2012-09-01T10:47:00.000-04:00</published><updated>2012-09-01T10:49:49.952-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-01T10:49:49.952-04:00</app:edited><title>Securing your data in the cloud- key management hell</title><content type="html">Invariably when you start migrating to the cloud you'll find you need to encrypt some or all of your data that you store there. Apart from the performance hit this seems easy right?&lt;br /&gt;
Except when you start to think of how you are going to manage keys used to encrypt / decrypt.&lt;br /&gt;
Because your Data and your business logic (app servers) are no longer in your control you can't just leave your keys on your app server (EC2) instances. If a hacker compromises those data keys then they can access your data. The same is true in normal in-house environments but at least you can trust the folks who run your data center - or at least there is direct accountability - you can fire them or pursue them legally. &amp;nbsp;If an AWS person in Tokyo for example goes rogue what is your recourse?&lt;br /&gt;
&lt;br /&gt;
So your data encryption keys &lt;b&gt;&lt;i&gt;THEMSELVES &lt;/i&gt;&lt;/b&gt;need to be encrypted. OK not a big deal.&lt;br /&gt;
But now where do you store the "master" keys to decrypt the data keys . . . . and so on. Maybe you store the master keys in your non-cloud environment and call out from EC2 to get them (but now you could be subject to another type of attack). &amp;nbsp;So far I haven't heard a good architectural solution (barring something like human based Two factor authentication required when starting up an EC2 instance? But now your auto-scaling is hosed).&lt;br /&gt;
&lt;br /&gt;
Anyone have any ideas or see any workable reasonable solutions?&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=DgBtc0hL6Ls:8B_NUqaRIVs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=DgBtc0hL6Ls:8B_NUqaRIVs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=DgBtc0hL6Ls:8B_NUqaRIVs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=DgBtc0hL6Ls:8B_NUqaRIVs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=DgBtc0hL6Ls:8B_NUqaRIVs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/DgBtc0hL6Ls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/493121313918803541/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=493121313918803541" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/493121313918803541?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/493121313918803541?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/DgBtc0hL6Ls/securing-your-data-in-cloud-key.html" title="Securing your data in the cloud- key management hell" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://softarc.blogspot.com/2012/09/securing-your-data-in-cloud-key.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAMQX0zfCp7ImA9WhVREko.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-7049086513189281562</id><published>2012-03-20T16:03:00.000-04:00</published><updated>2012-03-20T16:03:00.384-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-20T16:03:00.384-04:00</app:edited><title>Architecting in the Cloud</title><content type="html">So I am starting to investigate architecting an app for AWS. I have the basics of EC2, S3, SQS, RDS, Simple DB (now replaced by DynamoDB). But I had some lingering questions about architecting solutions for the cloud as I am always a believer that "There ain't no such thing as a free lunch"&lt;br /&gt;
&lt;br /&gt;
So I came across the following wonderful talk on YouTube and the associated slides on Slideshare.&lt;br /&gt;
I figured I'd share all the links here for easy access. Enjoy!&lt;br /&gt;
&lt;br /&gt;








&lt;br /&gt;
&lt;div class="p1"&gt;
&lt;b&gt;Architecting in the Cloud by Simone Brunozzi&lt;/b&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
AWS Cloud Tour, July 2011&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Part 1&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;a href="http://www.youtube.com/watch?v=vJ6XvQ94UnM"&gt;http://www.youtube.com/watch?v=vJ6XvQ94UnM&lt;/a&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Part 2&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;a href="http://www.youtube.com/watch?NR=1&amp;amp;feature=endscreen&amp;amp;v=KL7KI1JQliY"&gt;http://www.youtube.com/watch?NR=1&amp;amp;feature=endscreen&amp;amp;v=KL7KI1JQliY&lt;/a&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Part 3&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;a href="http://www.youtube.com/watch?feature=endscreen&amp;amp;NR=1&amp;amp;v=5hXnoNGnlFQ"&gt;http://www.youtube.com/watch?feature=endscreen&amp;amp;NR=1&amp;amp;v=5hXnoNGnlFQ&lt;/a&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Part 4&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;a href="http://www.youtube.com/watch?NR=1&amp;amp;feature=endscreen&amp;amp;v=RHVFARV5mrc"&gt;http://www.youtube.com/watch?NR=1&amp;amp;feature=endscreen&amp;amp;v=RHVFARV5mrc&lt;/a&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Part 5&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;a href="http://www.youtube.com/watch?NR=1&amp;amp;feature=endscreen&amp;amp;v=k84spxyTQ_s"&gt;http://www.youtube.com/watch?NR=1&amp;amp;feature=endscreen&amp;amp;v=k84spxyTQ_s&lt;/a&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Slides on Slideshare&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;a href="http://www.slideshare.net/AmazonWebServices/2011-aws-tour-australia-architecting-for-the-cloud-demo-and-best-practices-by-simone-brunozzi"&gt;http://www.slideshare.net/AmazonWebServices/2011-aws-tour-australia-architecting-for-the-cloud-demo-and-best-practices-by-simone-brunozzi&lt;/a&gt;&lt;/div&gt;
&lt;div class="p2"&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=q-6LvHZSyM8:03_Y6C4Ricg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=q-6LvHZSyM8:03_Y6C4Ricg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=q-6LvHZSyM8:03_Y6C4Ricg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=q-6LvHZSyM8:03_Y6C4Ricg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=q-6LvHZSyM8:03_Y6C4Ricg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/q-6LvHZSyM8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/7049086513189281562/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=7049086513189281562" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/7049086513189281562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/7049086513189281562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/q-6LvHZSyM8/architecting-in-cloud.html" title="Architecting in the Cloud" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://softarc.blogspot.com/2012/03/architecting-in-cloud.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4ER3g8eSp7ImA9WhRUGEU.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-6368909304035536405</id><published>2012-01-29T17:01:00.005-05:00</published><updated>2012-01-29T19:55:06.671-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-29T19:55:06.671-05:00</app:edited><title>The Perils of Asynchrony</title><content type="html">&lt;div&gt;Every time you come across anything more than a rudimentary system that has some moderately serious performance needs, someone somewhere on the team considers using asynchronous processing to help reduce (perceived) response time. That person needs to be identified and quickly locked in a padded room . . . . Just kidding!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Often that person is me and often I end up writing the code and relearning why doing things in an asynchronous way (that also meets a certain "near guarantee" SLA including DR and HA needs) is very very hard.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So it was with some chagrin that I was tasked with coding some infrastructure components to implement a Task Queue for my current team. The goal was to satisfy a need to improve response time of the application when it was doing some back-end tasks that required 100ms or more. The tasks themselves aren't time critical but they are important e.g. replicating data to a remote site. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Fortunately this time I'm not writing financial systems software - there you typically need to guarantee that although a task is asynchronous that it will be done within some SLA (e.g. 2-3 seconds). So at least I didn't have that worry. That said, for most apps asynchronous doesn't mean performing the task "whenever" - it means a little bit later than now. In addition you still have to consider that your solution is Highly Available and has built in Disaster (or just plain VM crash) Recovery.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway the default solutions in Java for Asynchronous processing are&lt;/div&gt;&lt;div&gt;1) Threads (and &lt;a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html"&gt;java.util.concurrent&lt;/a&gt; - which is awesome)&lt;/div&gt;&lt;div&gt;2) JMS (Java Message Service)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Why Threads aren't the solution&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Java.util.concurrent is great - a really great step up from Threads and writing your own infrastructure to start, stop and generally manage and handle threads and thread pools. If you haven't dug into this package yet do so now. It's a life saver.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The downside to Threads / Java.util.concurrent is that when you launch a job to be executed in the same JVM and same VM slide then&lt;/div&gt;&lt;div&gt;1) If your JVM or your VM die without some persistence mechanism your job is lost forever.&lt;/div&gt;&lt;div&gt;2) You never have just &lt;b&gt;&lt;i&gt;one&lt;/i&gt;&lt;/b&gt; asynchronous job and you'd like to be able to balance the load&lt;/div&gt;&lt;div&gt;of asynchronous jobs across your entire farm of virtual machines and their JVMs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;JMS in a Nutshell&lt;/b&gt;&lt;/div&gt;&lt;div&gt;So that's where people start to invoke JMS (Java Message Service). JMS proposes two&lt;/div&gt;&lt;div&gt;core models of asynchronous communication.&lt;/div&gt;&lt;div&gt;1) Queues - which are a point-to-point communication system. VM #3 writes a message to a queue and some other thread in some other VM reads that message from the queue. Only one writer - one reader.&lt;/div&gt;&lt;div&gt;2) Topics - which are a "broadcast" communication system. VM #3 broadcasts a message to a topic and multiple threads on multiple VMs (each with potentially different processing goals) read the thread.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Here come the problems . . . .&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The key problem with Queues is ensuring that although there is only one reader that the job, once it is read from the queue, actually gets executed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The key problem with Topics is often ensuring that although there are multiple readers - every individual type of processing (e.g. store a record in a database table) happens only once - otherwise you are wasting resources.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are other problems too. JMS doesn't have any built-in specification for Disaster recovery or High availability. Therefore each JMS provider (and there are many e.g. MQSeries, Progress Sonic, Active MQ) provides their own mechanisms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Persistence&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The first other problem is ensuring that if a message is written (to a topic or queue) and one of the JMS processes (a broker) crashes or there's a network hiccup that the message is not lost. For that to occur you need a persistence mechanism.  The persistence mechanisms either use the local filesystem of the broker or a relational DB. Either way you are just pushing your DR problem a bit further away from your JMS broker to now worrying about the local disk or your database. IMO it's not exactly a solution to replace one DR nightmare with another one.  In addition to doing this another MAJOR downside to persistence is that it typically reduces throughput by an order of magnitude or more. See for example &lt;a href="http://www.mostly-useless.com/blog/2007/12/27/playing-with-activemq/"&gt;this link&lt;/a&gt; for Active MQ alone but &lt;a href="http://docs.jboss.org/jbossmessaging/docs/userguide-2.0.0.alpha1/html/performance.html"&gt;this link&lt;/a&gt; comparing ActiveMQ and JBoss MQ and JBoss Messaging..&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Guaranteed Messaging - who's guarantee?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The other problem is ensuring that once a message is read by a thread that it executes the task successfully. That guarantee is impossible - VMs crash, exceptions are thrown etc.  Ideally if the thread can't handle the task you would want to put it back on the queue for someone else to attempt to handle it.  This is hard with JMS although there is a way to "trick" JMS into supporting this that involves using &lt;a href="http://www2.sys-con.com/itsg/virtualcd/Java/archives/0604/chappell/index.html"&gt;message acknowledgement&lt;/a&gt;.  That is you do not use the AUTO_ACKNOWLEDGE default - only acknowledging receipt of the message to the broker after the message has been successfully process.  However please check how the Broker does this as there is &lt;a href="http://www.precisejava.com/javaperf/j2ee/JMS.htm"&gt;some evidence&lt;/a&gt; that doing this just blocks the broker - giving you more guaranteed message handling at a huge cost in scalability.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another problem with this approach is that you need to handle the possibility of messages being handled more than once. The reason for this is that the thread that originally picked up the message may have processed it successfully but failed JUST before it was going to acknowledge the message. Thus hopefully your message processing is either idempotent or can handle duplicate processing of messages without too much trouble.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;High Availability&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The other side of the coin for persistence is high availability. Although you want a broker storing data in a file system or to database for persistence, you need some number of other brokers (at least one) up and running and ready to take over.  Ideally they are on a different VM, a different blade and perhaps in a different data center. None of which is easy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just a side note real quick - one thing I really liked about Amazon's Simple Queue Service (SQS) is how it handles persistence. Unlike JMS which has simple "Send Message" and "Read Message" semantics. SQS has "Send Message" and "Read Message" and "Delete Message". Unlike in JMS, reading a message in SQS does not remove the message from the queue. It "locks" it temporarily and if the message consumer does not call to SQS to "delete" the message after a certain time (30 seconds is the default), SQS itself puts the message back on the queue and assumes the original consumer failed to process it.  So why not use SQS? Well frankly all my processing is local and I'd rather not take the Boston -&amp;gt; Virginia network hit (on the send and the receive). But it would make sense if my app was deployed entirely inside an EC2 instance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Another problem: message ordering&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Oh wait here's another Gem for you to wonder. Say your app has some basic CRUD features - Create, Read, Update, Delete. Now you start to put CRUD related activities on the queue. Queues do not implicitly guarantee ordering. So a thread may begin processing an Update event BEFORE the related Create event was finished. Awesome eh!!! So what do you do in this case?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sometimes you can detect that failure (you can't update something that wasn't created) and just put the message back on the queue or retry a small number of times before failing. Others make the choice to have a single reader for these critical cases to ensure proper ordering.&lt;/div&gt;&lt;div&gt;The downside to THAT of course is &lt;/div&gt;&lt;div&gt;1) Scalability sucks&lt;/div&gt;&lt;div&gt;2) How are you going to handle Disaster recovery / failover.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For #2 I've seen folks configure 1 thread in N separate JVMs across a linux VM farm.&lt;/div&gt;&lt;div&gt;Only one thread is truly active at a time - the others are on "hot standby" using some form of ping / heartbeat functionality to detect if the "one true" thread dies and then some mechanism for become the active thread and telling all the other threads.  MAN was that complicated and buggy code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Oh just one more problem - queue backups!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Even after solving all these problems&lt;/div&gt;&lt;div&gt;- Persistence&lt;/div&gt;&lt;div&gt;- High Availability&lt;/div&gt;&lt;div&gt;- Messages handled more than once&lt;/div&gt;&lt;div&gt;- Messages arrive out of order.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You get the problem of what if your asynchronous task processing slows down and your thread pool becomes maxed out and your queue starts to back up? In one case we have to replicate data from the Europe to Asia. Although it's over a high speed network, the latency is at LEAST 250 ms. And it could be worse. You can't just add threads - you might max out your JVM's memory. I don't live in an EC2 world (yet) where I can just spin up new Linux VMs - and &lt;/div&gt;&lt;div&gt;even if I did the cost might be prohibitive at some point.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I could start to persist some of the queue to somewhere - disk / DB but again I'm going to have to write code to handle all of this plus testing is going to be a bear and the edge cases are killer.&lt;/div&gt;&lt;div&gt;And have a thread read from that storage area at a later point and retry.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Asynchronous - don't unless you have to!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;So here's the problem with asynchronous solutions - they are powerful but introduce HUGE complexities in testing, scalability, disaster recovery, failover and high availability.&lt;/div&gt;&lt;div&gt;Even if you get the code right the first time - you better automate all your scenarios to ensure any future "fix" doesn't regress on your edge case handling.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In general my advice is avoid asynchronous solutions unless ABSOLUTELY necessary. And when you do watch for the "tail wagging the dog" - when you design and architect solutions to handle asynchronous processing cases that start to overwhelm your normal design/architecture.  Beware introducing unnecessary complexity - but with asynchronous processing much of this complexity is sadly necessary.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are reading this and are aware of any good solutions to these asynchronous problems please let me know. Thanks!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;References&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Some good references I use when designing asynchronous solutions (to make sure I'm not reinventing the wheel)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601"&gt;Java Concurrency in Practice&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.amazon.com/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683"&gt;Enterprise Integration Patterns&lt;/a&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;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=4_2uI6ojwTA:ZyIvrtELbSI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=4_2uI6ojwTA:ZyIvrtELbSI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=4_2uI6ojwTA:ZyIvrtELbSI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=4_2uI6ojwTA:ZyIvrtELbSI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=4_2uI6ojwTA:ZyIvrtELbSI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/4_2uI6ojwTA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/6368909304035536405/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=6368909304035536405" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/6368909304035536405?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/6368909304035536405?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/4_2uI6ojwTA/perils-of-asynchrony.html" title="The Perils of Asynchrony" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2012/01/perils-of-asynchrony.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMNSH84eCp7ImA9WhdSGEs.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-8375411166573939285</id><published>2011-07-28T09:54:00.006-04:00</published><updated>2011-07-28T10:31:39.130-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-28T10:31:39.130-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Architect" /><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="cloud computing" /><title>The Technology Hype Cycle and why you should bet your Software Career on the Cloud</title><content type="html">&lt;div&gt;You'd have to be living under a rock not to be well aware of the &lt;a href="http://en.wikipedia.org/wiki/Hype_cycle"&gt;hype cycle&lt;/a&gt; in technology. Here is a list of hype cycles I've personally lived through and been affected by. I've tried to identify the year where expectations were either rising the fastest or reached their peak&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1999 - Y2K&lt;/div&gt;&lt;div&gt;2000 - Y2K (Yes it was still pretty hot)&lt;/div&gt;&lt;div&gt;2001 - Java / J2EE&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;2002 - Linux (also Enterprise Application Integration was hot here too)&lt;/div&gt;&lt;div&gt;2003 - &lt;a href="http://en.wikipedia.org/wiki/.NET_Framework"&gt;.Net Framework&lt;/a&gt; &lt;/div&gt;&lt;div&gt;2004 - Open Source  &amp;amp; Web Services &amp;amp; BPEL &lt;/div&gt;&lt;div&gt;2005 - &lt;a href="http://en.wikipedia.org/wiki/Service-oriented_architecture"&gt;SOA (Service Oriented Architecture) &lt;/a&gt; &lt;/div&gt;&lt;div&gt;2006 - &lt;a href="http://en.wikipedia.org/wiki/Enterprise_service_bus"&gt;ESB (Enterprise Service Bus) &lt;/a&gt;&lt;/div&gt;&lt;div&gt;2007 - &lt;a href="http://en.wikipedia.org/wiki/Software_as_a_service"&gt;SaaS &lt;/a&gt; &lt;/div&gt;&lt;div&gt;2008 - &lt;a href="http://en.wikipedia.org/wiki/Web_2.0"&gt;Web 2.0&lt;/a&gt; and&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Mashup_(web_application_hybrid)"&gt;Mashups &lt;/a&gt;&lt;/div&gt;&lt;div&gt;2009 - &lt;a href="http://en.wikipedia.org/wiki/Virtualization"&gt;Virtualization &lt;/a&gt;&lt;/div&gt;&lt;div&gt;2010 - &lt;a href="http://en.wikipedia.org/wiki/Cloud_Computing"&gt;Cloud Computing&lt;/a&gt; &lt;/div&gt;&lt;div&gt;2011 - &lt;a href="http://en.wikipedia.org/wiki/Smartphone"&gt;SmartPhones&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm probably off by a year or two in some cases but as you can see each and every year has something new.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of all of those hyped technologies very few of them delivered on the (marketing) promise.  However I think some of them really were a net positive. On a scale of "mostly helpful" to "mostly hype" here are the highlights:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Open Source and Linux definitely helped reduced a small chunk of development costs. The problem is most of the costs in development are people - that said any reduction was useful. As a (Java) developer my first preference in most technology choices is Open Source because most of these products "just work" and there is enough documentation and forum help to dig you out of most holes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) Java was probably a net drag initially (especially J2EE in its first few incarnations) but after JavaEE 5 things are getting better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) SOA was a slight evolution (XML + HTTP?) however if not for the advent of REST, SOA would reside more towards hype than helpful as REST dispelled the myth (pushed by consultants and software firms)  that we needed a bunch of heavyweight &lt;a href="http://www.oreillymaker.com/link/2728/ws-deathstar/"&gt;WS-*&lt;/a&gt; protocols to make SOA viable.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Virtualization was definitely a net positive for IT organizations and data centers - definitely more helpful than hype saving organizations lots of money.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So what about the cloud, cloud is getting hyped a lot lately. A lot of people don't fully understand it so this may surprise people: the advent of the Cloud is, in my opinion, &lt;b&gt;&lt;i&gt;the biggest event in software development since Tim Berners-Lee proposed the world wide web&lt;/i&gt;&lt;/b&gt; .&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take that in for a minute. I am willing to bet my public reputation that the Cloud is going to be a HUGE sea change for IT organizations and for developers. Bigger than anything in the past 12+ years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a developer if you are not getting on board with this you are gonna be left behind. This is like being a N-Tier C++ programmer in 1994 as the web was starting to gain traction. Get in with the cloud NOW!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why? Cloud solutions (computing, storage etc.) allows companies (especially large ones) to reduce and perhaps eliminate many of their data centers and supporting IT staff. For smaller companies the "Pay as you go" model (converting &lt;a href="http://en.wikipedia.org/wiki/Capital_expenditure"&gt;CapEx &lt;/a&gt;costs to &lt;a href="http://en.wikipedia.org/wiki/OpEx"&gt;OpEx&lt;/a&gt;) and the "elasticity" support to allow you to scale-on-demand are exciting. Venture Capital companies are now &lt;b&gt;&lt;i&gt;demanding &lt;/i&gt;&lt;/b&gt;the companies they invest in to use the cloud - it helps to reduce costs now and scale more later without large outlays. So who is NOT going to get on board this trend?  I can't think of any organization that cares about costs / growth who will not ultimately want to adopt this model.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also as the number of devices per person (Tablets, laptops, smartphones) continues to accelerate the "elasticity" demands will become ever more prevalent for large enterprises as well as Web 2.0 companies.  True you can't use more than one device at a time but devices are getting smarter and creating work themselves (to keep your email, rss feeds, facebook status all up to date etc.).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is like when &lt;a href="http://en.wikipedia.org/wiki/Electricity_network"&gt;Electricity distribution&lt;/a&gt; took off with the advent of AC (alternating current) it was critical for economic growth.  True the Cloud may take 3 or 4 years to &lt;b&gt;&lt;i&gt;REALLY &lt;/i&gt;&lt;/b&gt;take off (1994 in the web wasn't nearly as exciting as 1999) but when it does . . . . &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And when stuff is hot (like cloud is, or is going to be) the pay goes up up up and the firms that drive value in this space are going to be worth billions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are a number of Cloud providers and it's growing almost daily - but if you want to get on board I suggest you start taking a look at &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; and Amazon's &lt;a href="http://aws.amazon.com/elasticbeanstalk/"&gt;Elastic Beanstalk&lt;/a&gt; (for Java folks). Back in the nineties they used to say "No one was ever fired for choosing IBM" - not that IBM was flawless but it was hard to argue they weren't top of their game for Enterprise software (back then). Today I think the same is true of Amazon -&lt;a href="http://broadcast.oreilly.com/2011/04/the-aws-outage-the-clouds-shining-moment.html"&gt; not perfect&lt;/a&gt; but compared to the other providers they are clearly on top of their game.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Getting knowledge of AWS and understanding the very different architecture, design and coding strategies (e.g.  security, privacy, failover concerns and NoSQL, Hadoop etc.)  will help you transfer more quickly over to whatever is "next" when invariably Amazon gets surpassed by someone with a better mousetrap.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I still have a few doubts. Invariably there will some mini-Bubble in cloud company valuations - in the hype cycle there will be a "Peak of expectations" and a "Trough of disillusionment", but in the end the "&lt;a href="http://en.wikipedia.org/wiki/Hype_cycle"&gt;Plateau of productivity&lt;/a&gt;" is going to be a very good (but very different) place to be. And when a large wave of change is coming - it's better to be ready with a surfboard and paddling ahead of the wave, than sitting on the beach waiting for it to come ashore.&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=k0JpiLOXkIs:gErOSnPRnOc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=k0JpiLOXkIs:gErOSnPRnOc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=k0JpiLOXkIs:gErOSnPRnOc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=k0JpiLOXkIs:gErOSnPRnOc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=k0JpiLOXkIs:gErOSnPRnOc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/k0JpiLOXkIs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/8375411166573939285/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=8375411166573939285" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8375411166573939285?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8375411166573939285?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/k0JpiLOXkIs/technology-hype-cycle-and-why-you.html" title="The Technology Hype Cycle and why you should bet your Software Career on the Cloud" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2011/07/technology-hype-cycle-and-why-you.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4ESX4zcCp7ImA9WhdTFko.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-171956481494628890</id><published>2011-07-13T13:56:00.007-04:00</published><updated>2011-07-14T15:48:28.088-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-14T15:48:28.088-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Scrum Purity Test</title><content type="html">&lt;div&gt;OK so just for fun (malicious fun!) I decided to create a &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/a&gt; purity test.  The reason is I am pretty sure a LOT of people out there SAY they are using Scrum but aren't really - or they aren't using all the tools and techniques involved.   Fair to say, I have never &lt;b&gt;&lt;i&gt;fully&lt;/i&gt;&lt;/b&gt; utilized Scrum in any place I have worked - mostly for political reasons - usually because of lack of buy-in from Senior Management. That said, we've made it work and I'm sure others have too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But let me say that I don't think you &lt;b&gt;&lt;i&gt;HAVE &lt;/i&gt;&lt;/b&gt;to adopt Scrum 100% to get value from it. Small iterations with defined deliverables and constant communication and accountability can go a long way regardless of what you call it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway here is my take on a "Scrum Purity Test".  There is another take &lt;a href="http://antoine.vernois.net/scrumbut/"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;FIRST AND FOREMOST&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Q: Do you have Sprints at the end of which you deliver (roughly!) shippable functionality?&lt;/div&gt;&lt;div&gt;- No - Then don't do this test - you've already lost. I don't think you can consider yourself agile without small iterations.&lt;/div&gt;&lt;div&gt;- Yes, but the Sprints are 4 weeks long and the code has lots of bugs - zero points&lt;/div&gt;&lt;div&gt;- Yes, the Sprints are under 3 weeks and the code has some bugs - 5 points&lt;/div&gt;&lt;div&gt;- Yes, the Sprints are under 2 weeks and the code is tested (but has some small issues) - 10 points&lt;/div&gt;&lt;div&gt;- Yes, the Sprints are under 2 weeks and we release to production - 20 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;MEETINGS&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Q: Do you have a Daily Scrum Standup meeting?&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes but it goes over 15 minutes - 5 points&lt;/div&gt;&lt;div&gt;- Yes, it's under 15 minutes and we answer the three questions - 10 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: Do you have a Sprint Planning meeting?&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes kind of, it's kind of ad hoc - 5 points&lt;/div&gt;&lt;div&gt;- Yes Ken Schwaber would be proud - 10 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: Do you have a Sprint review meeting&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;at the end of a Sprint?&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes - 5 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: Do you have a Sprint Retrospective to identify what can be improved?&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes - 5 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ARTIFACTS&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Q: Does your team maintain a Product backlog?&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes, kind of, it's ad hoc and it lacks priority- 5 points&lt;/div&gt;&lt;div&gt;- Yes its prioritized, updated regularly, visible to all  - 10 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: Does your team maintain a Sprint Backlog?&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes, but features aren't broken into tasks - 5 points&lt;/div&gt;&lt;div&gt;- Yes, features are broken down and well understood before beginning - 10 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: Does your team maintain a Burndown chart&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes, kind of, we track it roughly in an ad hoc fashion - 5 points&lt;/div&gt;&lt;div&gt;- Yes, we use some tools such as &lt;a href="http://www.atlassian.com/software/greenhopper/"&gt;Greenhopper &lt;/a&gt;or Excel and its visible to all 24 x 7 - 10 points&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;b&gt;ROLES&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Q: Does your team have a Scrummaster?&lt;/div&gt;&lt;div&gt;- No and we could use one - zero points&lt;/div&gt;&lt;div&gt;- No we don't need the protection / impediment removal (e.g. in a startup) - 5 points&lt;/div&gt;&lt;div&gt;- Yes we have one and we also report to her (e.g. a Project Manager) - 5 points&lt;/div&gt;&lt;div&gt;- Yes we have one and it's not a person we report to  - 10 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: Does your team have a Product Owner?&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes but they really don't understand the user - 5 points&lt;/div&gt;&lt;div&gt;- Yes and they know our user base inside and out - 10 points&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;b&gt;SCRUM-BUTS&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Q:  Does your team do Estimates?&lt;/div&gt;&lt;div&gt;- No - zero points&lt;/div&gt;&lt;div&gt;- Yes and we estimate using hours and days using MS Project - 1 point&lt;/div&gt;&lt;div&gt;- Yes and we use planning poker and our estimates are within 15-30% - 5 points&lt;/div&gt;&lt;div&gt;- Yes, we use planning poker and our estimates are within 10% - 10 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: What are your Specifications like?&lt;/div&gt;&lt;div&gt;- Big requirements docs - zero points&lt;/div&gt;&lt;div&gt;- Good user stories - 5 points&lt;/div&gt;&lt;div&gt;- Just in time requirements / stories - 10 points&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Q: How is testing performed?&lt;/div&gt;&lt;div&gt;&lt;div&gt;- We have No dedicated testers on team - zero points&lt;/div&gt;&lt;div&gt;- Developers Unit test only -  points&lt;/div&gt;&lt;div&gt;- The feature is tested soon after Sprint is complete - 3 points&lt;/div&gt;&lt;div&gt;-  Software passes acceptance testing as Sprint ends - 8 points&lt;/div&gt;&lt;div&gt;-  Software was tested and is deployed to Production - 10 points&lt;/div&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;Now what is your total - out of 130 points? What grade would you give yourself on the following scale?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;110 - 130: A - you are doing a great job following Scrum (just remember to make sure your users and stake holders are happy)&lt;/div&gt;&lt;div&gt;90 - 110: B&lt;/div&gt;&lt;div&gt;70 - 90 : C&lt;/div&gt;&lt;div&gt;50 - 70 : D&lt;/div&gt;&lt;div&gt;&amp;lt; 50: F&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have to say I thought we were doing pretty good but when I scored my team we got a 59 a D! Yeouch! That said we ship on time and everyone is pretty happy but clearly we are not doing great following Scrum.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What do you think? Are there any critical aspects of Scrum that I missed? Any items that deserve more points (or less)? I am being unfair? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;POSTSCRIPT&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Some folks have been kind enough to get me searching for "the Nokia test" which has thrown up the following&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href="http://jeffsutherland.com/nokiatest.pdf"&gt;Nokia Test&lt;/a&gt;  and its &lt;a href="http://jeffsutherland.com/BasVodde2006_nokia_agile.pdf"&gt;history&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=tCtfWxQf7t8:xaCdbhlu5bA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=tCtfWxQf7t8:xaCdbhlu5bA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=tCtfWxQf7t8:xaCdbhlu5bA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=tCtfWxQf7t8:xaCdbhlu5bA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=tCtfWxQf7t8:xaCdbhlu5bA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/tCtfWxQf7t8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/171956481494628890/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=171956481494628890" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/171956481494628890?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/171956481494628890?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/tCtfWxQf7t8/scrum-purity-test.html" title="Scrum Purity Test" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://softarc.blogspot.com/2011/07/scrum-purity-test.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08GRH0_cSp7ImA9Wx9aGEw.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-1433254885883992191</id><published>2011-03-10T20:46:00.013-05:00</published><updated>2011-03-10T21:50:25.349-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-10T21:50:25.349-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="ssl" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>2-Way SSL with Java: The Keystore Strikes Back - Part 1</title><content type="html">&lt;div style="text-align: left;"&gt;You'd think with how prevalent SSL/TLS on the web that SSL with Java is easy, well it's not. In addition to having to get to grips with understanding how private/public key, certificates work there's all the networking that goes on in Java.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;If you start off trying to get to grips with the in-built &lt;a href="http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html"&gt;Java Secure Sockets Extension&lt;/a&gt; you're gonna be stunned by the complexity of it all. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/classes1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/classes1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Clear as mud eh? The JSSE guide alone is 73 pages long - but I hate to say that its &lt;b&gt;&lt;i&gt;REALLY &lt;/i&gt;&lt;/b&gt;a must read. Print it out (double-sided to save some trees) grab a Venti decaff or two and wrestle the information into your brain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Thankfully &lt;a href="http://hc.apache.org/httpclient-legacy/sslguide.html"&gt;Jakarta Commons HTTP client&lt;/a&gt; makes it relatively easy code-wise (Side Note: Why the heck does HTTP Components v4.0 seem so much more complicated than v3.0? The v4 docs seems much less clear!). For example:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px; white-space: pre; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre; "&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;HttpClient httpclient = new HttpClient(); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;GetMethod httpget = new GetMethod("https://www.bob.com/");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;try {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;httpclient.executeMethod(httpget); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;System.out.println(httpget.getStatusLine()); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;} &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;finally { &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;httpget.releaseConnection(); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" &gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Helvetica, Arial, sans-serif; "&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In any event it's pretty straightforward code-wise with HTTP Client until you have to start to get to grips with three funky things - they are&lt;/div&gt;&lt;div&gt;1) the keystore&lt;/div&gt;&lt;div&gt;2) the truststore&lt;/div&gt;&lt;div&gt;3) keytool to access both&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Truststore&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Lets start off with a truststore. In a normal 1-Way SSL situation, say on a browser, you need your bank's server to authenticate itself to assure you that you are hitting the REAL bank server and not some spoofed site. So in the 1-Way SSL case the bank server sends your browser a certificate signed by a CA(Certificate Authority) then your browser compares that CA signature against an in-built list of CAs. In a similar way your truststore is your secure store of trusted CA entries or &lt;a href="http://en.wikipedia.org/wiki/Self-signed_certificate"&gt;self-signed certs&lt;/a&gt; provided from third parties you trust. So essentially the truststore contains the certificates you use to authenticate other servers / processes. Every Java install comes with it's own truststore located in &lt;span class="Apple-style-span"&gt;$JAVA_HOME/lib/security/cacerts&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Keystore&lt;/b&gt;&lt;/div&gt;&lt;div&gt;A keystore is, as you can imagine, is a secure store for keys used in the SSL protocol. Essentially it's where you will put private keys and their associated certificates used to authenticate YOU as client to a server. Typically in a normal web browser transaction you use 1-Way SSL to authenticate the server then you use a login/password combo to authenticate you. Well in B2B systems you can use 2-Way SSL where client and server authenticate each other - and this is where the keystore is critical to authenticate your Java program, the client, to the server.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Typically for client authenticate you create either a self-signed or you purchase a CA signed cert. You store your private key and public cert in the keystore and provide your B2B partner with the self-signed cert - or in the case of a CA-signed cert typically your partner's truststore will trust that CA and you are good to go.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;keytool &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://download.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html"&gt;keytool &lt;/a&gt;is the command line tool to maintain these two beasts.  And let's just say it's not easy to use keytool. It's like snowboarding - its good when you're used to it but getting started with keytool you're gonna spend a lot of time on your ass or face first!  If you're just getting started with keystores and truststores I strongly recommend using &lt;a href="http://portecle.sourceforge.net/"&gt;Portecle&lt;/a&gt; - an open source GUI tool which makes keytool obsolete and should really ship with Java someday.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then you have to tell java where they keystore and truststore are and the passwords to these stores. Well you can do that with System properties e.g.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: medium; "&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal; "&gt;&lt;pre&gt; -Djavax.net.ssl.keyStore=keystore&lt;br /&gt;-Djavax.net.ssl.keyStorePassword=password&lt;br /&gt;-Djavax.net.ssl.trustStore=truststore&lt;br /&gt;-Djavax.net.ssl.trustStorePassword=trustword&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;If standards are good, more is better right?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Getting tired yet? Well this is gonna put you over the edge . . . . when you get keys and certs from your B2B partners how many types of files do you think there are - two? three? four? Let's list the ones I've had to deal with lately.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;pfx&lt;/li&gt;&lt;li&gt;pem&lt;/li&gt;&lt;li&gt;p12&lt;/li&gt;&lt;li&gt;cer&lt;/li&gt;&lt;li&gt;crt&lt;/li&gt;&lt;li&gt;der&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;It's madness! If you want a good description overview of the file formats then &lt;a href="http://serverfault.com/questions/9708/what-is-a-pem-file-and-how-does-it-differ-from-other-openssl-generated-key-file-f"&gt;this link&lt;/a&gt; is a good place to start. This is when &lt;a href="http://www.sslshopper.com/article-most-common-openssl-commands.html"&gt;openssl&lt;/a&gt; becomes your friend when you need to convert from different file formats into formats compatible with keytool - oh and good luck finding documentation on which file formats keytool takes!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In any event so far things are tough but not insurmountable - well so I thought until two B2B partners decided to provide me each with a key for my keystore to authenticate me. A key of the same type (RSA), signed by the same CA. Then all hell broke loose - cos Java don't support that without some major surgery . . . . and that's the topic of Part II.&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=5R1-Eb8Rb5Q:YMt4HB7ZQe4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=5R1-Eb8Rb5Q:YMt4HB7ZQe4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=5R1-Eb8Rb5Q:YMt4HB7ZQe4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=5R1-Eb8Rb5Q:YMt4HB7ZQe4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=5R1-Eb8Rb5Q:YMt4HB7ZQe4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/5R1-Eb8Rb5Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/1433254885883992191/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=1433254885883992191" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/1433254885883992191?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/1433254885883992191?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/5R1-Eb8Rb5Q/2-way-ssl-with-java-keystore-strikes.html" title="2-Way SSL with Java: The Keystore Strikes Back - Part 1" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://softarc.blogspot.com/2011/03/2-way-ssl-with-java-keystore-strikes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcCQHw7eCp7ImA9Wx9XFE4.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-4583279425858626342</id><published>2011-01-07T15:37:00.004-05:00</published><updated>2011-01-07T16:01:01.200-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-07T16:01:01.200-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="jboss" /><title>Migrating from JBoss 4 to JBoss 5</title><content type="html">[ Yes I know it has been a while - two years, two very busy years  but hey I'm back - for now ]&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway I have been using JBoss 4.2.3 for over a year right now and really like it (although the clustering / JMS stuff seems WAY overcomplicated - and needing 80 config files - not fun!). But anyway it is time to upgrade to JBoss 5 and the path has been marred by many stops and starts and has been surprisingly difficult.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In any event I found the following links to be a life saver and thought I would share them&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://community.jboss.org/wiki/MigrationfromJBoss4.pdf"&gt;http://community.jboss.org/wiki/MigrationfromJBoss4.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://venugopaal.wordpress.com/2009/02/02/jboss405-to-jboss-5ga/"&gt;http://venugopaal.wordpress.com/2009/02/02/jboss405-to-jboss-5ga/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tikalk.com/java/migrating-your-application-jboss-4x-jboss-5x"&gt;http://www.tikalk.com/java/migrating-your-application-jboss-4x-jboss-5x&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The real kickers have to be&lt;/div&gt;&lt;div&gt;1) Increased adherence to the Java spec that cause WARs / JARs to no longer deploy&lt;/div&gt;&lt;div&gt;2) Changed location of XML files&lt;/div&gt;&lt;div&gt;3) Changed XML filenames&lt;/div&gt;&lt;div&gt;4) Changed XML file contents&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Man they don't make it easy do they?&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=Ysf-Qk0tU2M:I4jr3Hs8OBY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=Ysf-Qk0tU2M:I4jr3Hs8OBY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=Ysf-Qk0tU2M:I4jr3Hs8OBY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=Ysf-Qk0tU2M:I4jr3Hs8OBY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=Ysf-Qk0tU2M:I4jr3Hs8OBY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/Ysf-Qk0tU2M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/4583279425858626342/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=4583279425858626342" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/4583279425858626342?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/4583279425858626342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/Ysf-Qk0tU2M/migrating-from-jboss-4-to-jboss-5.html" title="Migrating from JBoss 4 to JBoss 5" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2011/01/migrating-from-jboss-4-to-jboss-5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8MSHw5fyp7ImA9WxRbGUw.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-7900019294427574447</id><published>2008-12-09T19:49:00.015-05:00</published><updated>2008-12-10T08:48:09.227-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T08:48:09.227-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="Career" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>How to Motivate Developers - A three step framework</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dilbert.com/blog/entry/my_views_on_the_dilbert_survey_of_economists/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 435px; height: 147px;" src="http://dilbert.com/dyn/tiny/File/Lehman%20Brothers%20.jpg" alt="" border="0" /&gt;&lt;/a&gt;No . . . . not THOSE three steps!&lt;br /&gt;&lt;br /&gt;Anyway, now that we're approaching the end of the calendar year, invariably many folks are filling out self-evaluations and managers are presiding over year-end reviews, and choosing raises and bonuses for their staff.&lt;br /&gt;&lt;br /&gt;Managers should also be considering the year ahead and one of the most important aspects - developer productivity. A key element of productivity is motivation and this article tries to answer the question "How to motivate developers".&lt;br /&gt;&lt;br /&gt;But first some comments on prior work . . . .&lt;br /&gt;&lt;br /&gt;There have been quite a few blog articles written by others on this topic (see some references below). They're pretty solid but they're mostly written from the perspective of&lt;br /&gt;1) Developers or&lt;br /&gt;2) Managers who don't have a major technical background.&lt;br /&gt;&lt;br /&gt;The problem with #1 is that self-reporting of what a person wants is &lt;a href="http://www.intropsych.com/ch01_psychology_and_science/self-report_measures.html"&gt;very unreliable&lt;/a&gt;. Often people don't really know what they want.  Or they know what they want but don't truly understand how it will make them feel or for how long (see &lt;a href="http://www.getrichslowly.org/blog/2008/08/25/the-psychology-of-happiness-13-steps-to-a-better-life/"&gt;this really great article on happiness&lt;/a&gt; for some more insights)&lt;br /&gt;&lt;br /&gt;The issue with #2 is that, without knowing the perspective of the other side (developers understanding what it means to be a manager and vice-versa) the full picture is often lacking.&lt;br /&gt;&lt;br /&gt;One thing I noticed in my research for this post is that many of the articles below try to ask "What do developer's want?".  That's important but a bit misleading.  For example take a more common situation - housework. I don't &lt;span style="font-weight: bold; font-style: italic;"&gt;want &lt;/span&gt;to do the dishes - I'd rather be playing &lt;a href="http://en.wikipedia.org/wiki/Call_of_Duty_4"&gt;Call of Duty 4&lt;/a&gt; - but I *have* to. For many reasons - the sanitary one is obvious - the not so obvious one . . . .  my wife will kill me otherwise :-) So what's my motivation - good health and staying alive :-)  What motivates me isn't what I want.&lt;br /&gt;&lt;br /&gt;There's also another aspect to this that I feel people haven't considered. I am going to venture (without citation . . . I couldn't find one) that the majority of a person's motivation is intrinsically determined. That is - their motivation level is largely driven by who they are, their personalities and things in their lives you have no control over.&lt;br /&gt;&lt;br /&gt;So please don't get the idea from this that I believe one can control 100% of a developer's motivation. You can influence it, but only so much.  In many respects motivation should be a key aspect when interviewing new team members - because once they're hired you can only impact a relatively small aspect of their motivational make-up. Again that's based on experience - I'm not aware of any scientific studies to confirm this hypothesis.&lt;br /&gt;&lt;br /&gt;To repeat, I feel that, to a large extent, people are already largely motivated or not.  You can improve things quite a bit though. Say you could make a developer 5-10% more effective - that's like having an extra 2 weeks to a month of their development time each year.&lt;br /&gt;&lt;br /&gt;That's a lot of extra bugs fixed or new features produced. Do that across a team of 6-8 developers and you can make a very noticeable improvement.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway after thinking about it - from both a managerial and developer perspective, here's what I've come up with for my framework.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;STEP 1) Compensate Well&lt;/span&gt;&lt;br /&gt;This is one of those "&lt;a href="http://en.wikipedia.org/wiki/Necessary_and_sufficient_conditions"&gt;necessary but not sufficient&lt;/a&gt;" conditions you often hear about. You can address every other motivational item but if you don't pay well and give good benefits you're shooting yourself in the foot and worst of all people are going to go elsewhere. Probably most of all you're just not going to be able to attract and retain really good (i.e. already motivated) developers.&lt;br /&gt;&lt;br /&gt;If you think of the famous &lt;a href="http://en.wikipedia.org/wiki/Maslow_hierarchy_of_needs"&gt;Maslow's Hierarchy of needs&lt;/a&gt;, this is one of those fundamental "lower" or more basic needs.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/1000/600/1663/1663.strip.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 429px; height: 133px;" src="http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/1000/600/1663/1663.strip.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;STEP 2) Remove or reduce demotivating aspects&lt;/span&gt;&lt;br /&gt;You can pay all the money in the world to people but if you have non-existent specs, unrealistic deadlines, micro-manage etc. people aren't going to be motivated for long and they will quickly become unmotivated or leave.&lt;br /&gt;&lt;br /&gt;As I just stated there are several things that many developers experience that drive them batty.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;i) Poor requirements&lt;/span&gt; - there's nothing worse than building junk but consequently (for me at least) there's nothing better than great (detailed, unambiguous) requirements and the resulting happy users.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ii) Unrealistic deadlines&lt;/span&gt; - whether this results in 90 hour+ weeks or buggy software - this is very much a drain on developers, their ego and sense of pride.  Developers want to be proud of their work and go home and see their families. Is that too much to ask?&lt;br /&gt;&lt;br /&gt;Yes everyone has crunch times and there's invariably some extra unforeseen work but hopefully it's infrequent and as a manager hopefully you don't have to "go to the bank" too often.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iii) Too many meetings&lt;/span&gt; - I've found that the more formal a place is (or the less friendly it is) the more meetings you need to just get people to talk to each other.  But many meetings are a bad sign - ideally developers would/should be able to talk to each other and meetings should be "organic" and not forced.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iv) Disrespectful or uncooperative colleagues&lt;/span&gt;. "Bad apples" can ruin a whole batch. The problem is exacerbated when management is unaware of them or worse, is aware, but refuses to do what it takes to remedy the situation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;v) Processes, Tools or Techniques that slow you down&lt;/span&gt; e.g. slow builds, slow unit tests, slow desktops etc. They suck productivity and reduce enthusiasm.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;vi) A poor work environment&lt;/span&gt; e.g. a place where it's too loud, there's no privacy, you get lots of interruptions etc.. A bad environment can destroy motivation or at the very least be a distraction. And distractions are TERRIBLE for a developer's focus on the problem at hand.&lt;br /&gt;&lt;br /&gt;Either way, my recommendation is that &lt;span style="font-weight: bold; font-style: italic;"&gt;before &lt;/span&gt;focusing on MOTIVATING factors, I would focus on removal or amelioration of demotivating factors. There's also &lt;a href="http://agilesoftwaredevelopment.com/blog/jurgenappelo/motivate-or-not-demotivate"&gt;some evidence&lt;/a&gt; that there is some psychological difference between demotivating aspects and motivational factors.&lt;br /&gt;&lt;br /&gt;The good thing is by focusing on these e.g. improving requirements, reducing unnecessary meetings, speeding up processes etc. you are also improving team productivity &lt;span style="font-weight: bold; font-style: italic;"&gt;even if there's no motivational boost&lt;/span&gt; to be had. But that's unlikely - removing some of those impediments should buy you some good will - but frequently that fades over time. Either way, for the productivity boost alone that's makes good business sense.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;STEP 3) Focus on positive motivational aspects.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here are the things that you really are hoping will translate into more motivated (and more productive and happy) developers&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;i) Support Developer Learning&lt;/span&gt;&lt;br /&gt;Developers love to learn - new languages, new tools, new frameworks. Spring, Ajax, Hibernate, Ruby - that gets their juices flowing.  Now the challenge is how do you direct that to produce the product you're paid to . . . . . the key here is to align the new item with key gaps needing filling. Need an Object-Relational Mapping system - Hibernate!  Need a rapid prototyping language - Ruby!  etc.  You also need to factor in the productivity dip as they learn.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ii) Provide Challenges &amp;amp; Problem Solving&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Opportunities&lt;/span&gt;&lt;br /&gt;Developers in general love to solve problems - whether it's how to integrate new features into a legacy system, how best to compare two lists of strings or how to make a system more scalable developers love such problems.&lt;br /&gt;&lt;br /&gt;In my experience however there are sub-types - different developers who prefer different kinds of challenges - ideally again you would align the challenge to the person who wants it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iii) Provide Feedback&lt;/span&gt;&lt;br /&gt;Developers want to learn and grow - beyond the technical learning / challenge they also need feedback in other ways to help them grow as individuals and adapt to their organization.  Often I find this is where management falls down.  Who could blame them / us - we often say we're open to hearing about areas needing improving but not so good in practice.  I've found the &lt;a href="http://www.rightattitudes.com/2008/02/20/sandwich-feedback-technique/"&gt;Sandwich Feedback Technique&lt;/a&gt; works quite well though.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iv) Other Ideas&lt;/span&gt;&lt;br /&gt;See the section below for other really good ideas from other articles&lt;br /&gt;&lt;br /&gt;These are all the things that "developers" want, in the sense of the higher "self actualizing" levels of Maslow's hierarchy. Again, these factors should not be detached from "conditions on the ground" as it were.&lt;br /&gt;&lt;br /&gt;For example I've known a few developer's whose idea of self-actualizing was deciding what to eat for lunch that day. They didn't want to learn ANYTHING new - no new languages, no new environments - they know what they have and don't want to change.  Their motivation isn't going to take a boost from being asked to learn something - on the contrary.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;STEP 4) The Secret Step&lt;/span&gt; - &lt;span style="font-weight: bold;"&gt;Fear as motivator&lt;/span&gt;&lt;br /&gt;OK I said there were three steps, but here's that "magic" 4th step. The "nuclear option". Go here only when you must e.g. you or someone on your team might be fired unless some action is taken, a client could lose a lot of money etc.&lt;br /&gt;&lt;br /&gt;As with the "doing the dishes" analogy, there comes a point when you have to do what you don't want to do. You do it because the ramifications of not doing it are worse - MUCH worse.&lt;br /&gt;&lt;br /&gt;Often if you're seen as the "good cop", you need a "bad cop" to make this work.  Sometimes you might need to be the "bad cop". Most folks know the analogy having seen it many times on the various CSI or Law &amp;amp; Order shows on TV.&lt;br /&gt;&lt;br /&gt;Basically the line here is "Do this or you'll lose your bonus /  won't get a raise / be fired".&lt;br /&gt;&lt;br /&gt;As I said you can't rely on using this too often, but you need to be sure also that people know the chance is there. Developers are smart people - if you don't follow through on what you promise you lose credibility. This lesson on follow-through was something that my two year old taught me. "If you don't get down from that chair, you'll get a timeout". Guess what, unless you start handing out "timeouts" they just will continue to stand on that chair.&lt;br /&gt;&lt;br /&gt;Again you don't want to do it too often and when you do you need to explain the reasons, it can't be seen to be arbitrary. For example - fire too many people, and people will start updating their resumes and looking elsewhere rather than live in fear.  Don't fire anybody and you send the message that there are no consequences and people want to leave because they tire of supporting the slackers.  It's a fine line but most of your strong developers already can identify who isn't pulling their weight and will thank you for pulling the trigger and finding someone better.&lt;br /&gt;&lt;br /&gt;Anyway there's my thoughts on developer motivation - I look forward to your comments.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;REFERENCES TO RELATED WORK&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;a href="http://www.softwarebyrob.com/2006/10/31/nine-things-developers-want-more-than-money/"&gt;Nine things developers want more than money&lt;/a&gt;&lt;br /&gt;1) Being Set up to Succeed&lt;br /&gt;- Good requirements&lt;br /&gt;- Realistic Deadlines&lt;br /&gt;"Being forced to build crap is one of the worst things you can do to a craftsman"&lt;br /&gt;2) Having Excellent Management&lt;br /&gt;3) Learning New Things&lt;br /&gt;4) Exercising Creativity and Solving the right kind of problems&lt;br /&gt;5) Having a voice&lt;br /&gt;"When a developer speaks, someone should listen. When several developers are saying the same thing, someone should listen and act . . .quickly"&lt;br /&gt;6) Being Recognized for Hard Work&lt;br /&gt;7) Building Something that Matters&lt;br /&gt;8) Building Software without an Act of Congress&lt;br /&gt;9) Having Few Legacy Constraints&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.retrospector.com/2006/06/21/top-10-ways-to-motivate-geeks/"&gt;Top 10 ways to motivate geeks&lt;br /&gt;&lt;/a&gt;1) Geeks are curious. Let them feed their desire to learn things&lt;br /&gt;2) Geeks like to be self-sustaining. Let them figure things out on their own.&lt;br /&gt;3) Geeks are creative even if they don't know it. Give them a chance.&lt;br /&gt;4) Geeks need tools, good ones. Give them more than they need.&lt;br /&gt;5) Private, yet collaborative. Geeks need to be left alone, but not too alone.&lt;br /&gt;6) Free stuff. T-shirts, food, desktop widgets, whatever.&lt;br /&gt;7) Control&lt;br /&gt;8) Geeks need recognition&lt;br /&gt;9) Freedom&lt;br /&gt;10) Compensation - Saved this for last, but geeks gotta live too&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bjornhaug.com/PermaLink,guid,9d9a7684-495b-4f84-b28d-ec1c65755ab7.aspx"&gt;Motivating Software Developers&lt;br /&gt;&lt;/a&gt;1) Allow me to focus&lt;br /&gt;2) Allow me to feel that I am making progress&lt;br /&gt;3) Allow me to make something I can take pride in&lt;br /&gt;4) Allow me to do it for me, not for the money&lt;br /&gt;5) Allow me to work on interesting problems&lt;br /&gt;6) Allow me to be part of a team&lt;br /&gt;7) Allow my ideas to be taken seriously&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/JCogley/archive/2006/05/15/446424.aspx"&gt;What motivates software developers?&lt;br /&gt;&lt;/a&gt;1) Introduce new technologies and techniques&lt;br /&gt;2) Practice pair programming to encourage communication, sharing of skills and team building&lt;br /&gt;3) Encourage participation in community developer events (user groups, code camps), blogs (share links across the team), books (monthly bookshelf anyone?) and conferences.&lt;br /&gt;4) Avoid generalized training - in my opinion this tends to serve the paycheck programmer more than the dedicated ones.&lt;br /&gt;5) Interesting projects&lt;br /&gt;6) Satisfy your customer&lt;br /&gt;&lt;a href="http://www.uio.no/studier/emner/matnat/ifi/INF5700/h08/undervisningsmateriale/Motivating%20software%20developers.ppt"&gt;&lt;br /&gt;Motivating Software Developers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.noop.nl/2008/10/to-motivate-or-not-to-demotivate.html"&gt;To Motivate or not to demotivate&lt;br /&gt;&lt;/a&gt;"Only taking away the things that make people dissatisfied, will simply result in people having neutral feelings towards their jobs."&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sei.cmu.edu/news-at-sei/columns/watts_new/2003/4q03/watts-new-4q03.htm"&gt;Some programming principles: People&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cio.com/article/409063/Managing_and_Motivating_Developers_Tips_for_Management_Cluefulness"&gt;Managing and Motivating Developers: Tips for Management Cluefulness&lt;/a&gt;&lt;br /&gt;&lt;a href="http://softwaresurvival.blogspot.com/2007/05/what-makes-people-tick-10-motivation.html"&gt;&lt;br /&gt;What makes people tick - 10 motivation factors in the workplace&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"The first thing to note here is that most people are motivated by:&lt;br /&gt;1. doing interesting stuff&lt;br /&gt;2. feeling recognized and appreciated&lt;br /&gt;3. making an impact"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nickhalstead.com/2007/07/11/what-motivates-programmers/"&gt;What motivates programmers?&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://articles.techrepublic.com.com/5100-22_11-6131634.html"&gt;11 ways to motivate geeks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.techrepublic.com.com/career/?p=454"&gt;Five things your manager could be doing better&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.despair.com/products/demotivators/motivation.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 402px; height: 337px;" src="http://images.despair.com/products/demotivators/motivation.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=_SqKLiTdP3k:PFIbBx9x7Aw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=_SqKLiTdP3k:PFIbBx9x7Aw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=_SqKLiTdP3k:PFIbBx9x7Aw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=_SqKLiTdP3k:PFIbBx9x7Aw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=_SqKLiTdP3k:PFIbBx9x7Aw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/_SqKLiTdP3k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/7900019294427574447/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=7900019294427574447" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/7900019294427574447?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/7900019294427574447?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/_SqKLiTdP3k/how-to-motivate-developers-three-step.html" title="How to Motivate Developers - A three step framework" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/12/how-to-motivate-developers-three-step.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cDRngzfSp7ImA9WxRbEUU.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-8507499506738918915</id><published>2008-12-01T19:34:00.008-05:00</published><updated>2008-12-01T20:24:37.685-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-01T20:24:37.685-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="usability" /><category scheme="http://www.blogger.com/atom/ns#" term="standards" /><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="trends" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>To Beta or not to Beta - That is the question</title><content type="html">"&lt;span style="font-style: italic;"&gt;Whether 'tis nobler in the mind to suffer the slings and arrows of outrageous bugs, Or to take arms against a sea of defects, And by opposing end them&lt;/span&gt;." (with props to &lt;a href="http://en.wikipedia.org/wiki/To_be,_or_not_to_be"&gt;Bill S.&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;In the past few years it's become more and more acceptable to release "Beta" software to the public - almost as if it was a production release.&lt;br /&gt;&lt;br /&gt;The reasons for that I believe are manifold but boil down to&lt;br /&gt;1) Gain user feedback&lt;br /&gt;2) Release early to gain "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;mindshare&lt;/span&gt;" and/or get first to market.&lt;br /&gt;3) Your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;QA&lt;/span&gt; process or team isn't that great (or your unwilling to spend money on them) and you'd rather have users do your testing for you.&lt;br /&gt;4) You need to gain the confidence of your customers / investors in what you're building.&lt;br /&gt;&lt;br /&gt;The number one proponent of the Beta, I must say is Google.  I've been a &lt;a href="http://docs.google.com/"&gt;Google Docs&lt;/a&gt; user for well over a year now and I love it - but it's still in Beta. The one thing I don't love is the &lt;span style="font-weight: bold; font-style: italic;"&gt;FREQUENT &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;UI&lt;/span&gt; changes in direction though - but hey it's a Beta and it hasn't lost a Document or Spreadsheet of mine yet.&lt;br /&gt;&lt;br /&gt;But it's clear from using what Google call a "Beta" that their goals are really predominantly #1 (user feedback) and probably to a lesser extent #2 (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;mindshare&lt;/span&gt;). It's been very well tested (internally) before it hits the public. You can read more of what Google think about Betas &lt;a href="http://royal.pingdom.com/2008/09/24/why-is-almost-half-of-google-in-beta/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So the quality of their Betas is  quite high (see also &lt;a href="http://mail.google.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;gmail&lt;/span&gt;&lt;/a&gt;) and a Beta for them is probably a production release for 90% of everyone else.&lt;br /&gt;&lt;br /&gt;Here's the problem though - in making Beta's "popular" I think they (and others) have lowered the bar at least insofar as management can now look at it and say "Well if Google did it - why can't we?". So there's a tendency now to ship lower quality software and at the last minute people decide to slap a "Beta" label on it if it's not up to snuff so that they can declare victory. Then they hope people will use it as if it was production quality.&lt;br /&gt;&lt;br /&gt;Personally I think software professionals should be using a public "Beta" ONLY as a last resort. If you need to gain user feedback - try not to be cheap about it. Get a bunch of potential users in a room and have them use your product - try not to prime them - just watch them. Video them. Understand what are they trying to do - how does that align with your product? Can you make your application so easy to use it doesn't need a manual?  That should be the goal (although that might be ultimately unattainable any progress in making your application easy to use is good).&lt;br /&gt;&lt;br /&gt;If the reason is #2 (to be first to market) then I think you don't understand technology trends. Neither Google or Internet Explorer (or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Firefox&lt;/span&gt;) were first to market - look where Yahoo! and Netscape are now.&lt;br /&gt;&lt;br /&gt;I guess I never really "got" the whole &lt;a href="http://en.wikipedia.org/wiki/First-mover_advantage"&gt;first-mover advantage&lt;/a&gt; thing. Think about it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apple vs. Windows (and back again)&lt;/li&gt;&lt;li&gt;Ford vs. Toyota&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Betamax"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Betamax&lt;/span&gt; vs. VHS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Atari vs. Nintendo&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;WordPerfect&lt;/span&gt; / &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;WordStar&lt;/span&gt; vs. Office&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Friendster&lt;/span&gt; vs. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Facebook&lt;/span&gt; vs. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;MySpace&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; The anecdotal lesson I got from these cases was to NOT be first mover and learn from the other guy and where he fails.&lt;br /&gt;&lt;br /&gt;Anyway if you're in the position of #3 (you're not investing in your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;QA&lt;/span&gt; team/process) then that's a sorry state of affairs.  Although we live in a world of finite resources - finite dollars and hard-to-find tech experts so I guess it can be excusable sometimes.  But if you just punted to force your users to do the bulk of your testing work then shame on you.&lt;br /&gt;&lt;br /&gt;If you're in position #4 - releasing a Beta to the public to gain confidence well it's hard to argue too much with that given the sorry state of "production" software these days (*cough* Vista *cough*) people's expectations are sadly low so its understandable people (especially investors, customers) want some reassurance.&lt;br /&gt;&lt;br /&gt;Don't get me wrong on this though - I'm not the type of guy to wait until the product is perfect. It's more a question of what are your motivations and are you being lazy in releasing a Beta? If you want user feedback - &lt;span style="font-weight: bold;"&gt;GET USERS&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;GET THEIR FEEDBACK&lt;/span&gt;! Don't ship junk!&lt;br /&gt;&lt;br /&gt;After doing some Googling I came across a blog article with similar sentiments&lt;br /&gt;&lt;a href="http://gizmodo.com/5083371/a-call-for-revolution-against-beta-culture"&gt;A call for revolution against Beta Culture&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;I'm mostly tired about the fact that it seems that we all have given up. Tired because  . . . .  in reality, it's laziness and a poor job on the manufacturer part that we have accepted without questioning. Instead of calling foul play and refusing to participate, we keep buying.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;That's the key: We have surrendered in the name of progress and marketing and product cycles and consumerism.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Right on man - it just doesn't &lt;span style="font-weight: bold; font-style: italic;"&gt;feel &lt;/span&gt;right. It feels lazy and short-sighted.&lt;br /&gt;&lt;br /&gt;Here are some other thoughts by other folks&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.techcrunch.com/2006/01/09/dont-blow-your-beta/"&gt;Don't Blow your Beta&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://enquiringmimes.com/wp/2008/09/25/does-beta-really-mean-beta-maybe-not-at-google/"&gt;Does Beta really mean Beta?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001159.html"&gt;Alpha, Beta and Sometimes Gamma&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://michael.hightechproductmanagement.com/2006/03/the_myth_of_firstmover_advanta.html"&gt;The myth of first-mover advantage&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So here's my question to you, dear reader, what is your opinion on Betas? Useful software engineering technique or cop-out?&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=6JrBvq_sRrY:F_mVQkBlfdQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=6JrBvq_sRrY:F_mVQkBlfdQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=6JrBvq_sRrY:F_mVQkBlfdQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=6JrBvq_sRrY:F_mVQkBlfdQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=6JrBvq_sRrY:F_mVQkBlfdQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/6JrBvq_sRrY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/8507499506738918915/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=8507499506738918915" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8507499506738918915?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8507499506738918915?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/6JrBvq_sRrY/to-beta-or-not-to-beta-that-is-question.html" title="To Beta or not to Beta - That is the question" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/12/to-beta-or-not-to-beta-that-is-question.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQCR3g4fSp7ImA9WxRVFk8.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-3931679271275044053</id><published>2008-11-13T21:03:00.003-05:00</published><updated>2008-11-13T21:06:06.635-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T21:06:06.635-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><title>JarFinder.com - Where have you been all my life?</title><content type="html">&lt;span style="font-family: arial;font-family:arial;font-size:100%;"  &gt;Ever have that moment where you discover a great little tool and you wonder "Where have you been all my life?"&lt;br /&gt;&lt;br /&gt;Well I had that moment today when I finally came across &lt;a href="http://www.jarfinder.com/" target="_blank"&gt;http://www.jarfinder.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;Ever have a hard time tracking down which Jar a class belongs to?&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;My bane is &lt;a href="http://xml.apache.org/xalan-j/apidocs/org/apache/xml/serializer/class-use/Serializer.html"&gt;org.apache.xml.serializer.&lt;/a&gt;&lt;wbr&gt;&lt;a href="http://xml.apache.org/xalan-j/apidocs/org/apache/xml/serializer/class-use/Serializer.html"&gt;Serializer&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="font-family: arial;font-family:arial;" &gt;&lt;span style="font-size:100%;"&gt;It turns out it's in Xalan of all places (and I can never seem to remember that).&lt;/span&gt;&lt;/p&gt;  &lt;span style="font-family: arial;font-family:arial;font-size:100%;"  &gt;&lt;br /&gt;Now with &lt;/span&gt;&lt;span style="font-family: arial;font-family:arial;font-size:100%;"  &gt;&lt;a href="http://www.jarfinder.com/" target="_blank"&gt;http://www.jarfinder.com/&lt;/a&gt; you don't have to struggle anymore to find the jar that contains that class file.&lt;br /&gt;&lt;br /&gt;Turns out this has been out there since at least early 2006 - wow.&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=fkdq04Q2Wu0:M86DQUNzuB0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=fkdq04Q2Wu0:M86DQUNzuB0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=fkdq04Q2Wu0:M86DQUNzuB0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=fkdq04Q2Wu0:M86DQUNzuB0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=fkdq04Q2Wu0:M86DQUNzuB0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/fkdq04Q2Wu0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/3931679271275044053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=3931679271275044053" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3931679271275044053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3931679271275044053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/fkdq04Q2Wu0/jarfindercom-where-have-you-been-all-my.html" title="JarFinder.com - Where have you been all my life?" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/11/jarfindercom-where-have-you-been-all-my.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MMQn06cSp7ImA9WxRTGEo.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-8550842802014971640</id><published>2008-08-25T08:55:00.021-04:00</published><updated>2008-09-08T09:11:23.319-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-08T09:11:23.319-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="j2ee" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="scalability" /><category scheme="http://www.blogger.com/atom/ns#" term="messaging" /><title>Book Review: The Definitive Guide to Terracotta</title><content type="html">&lt;span style="font-size:78%;"&gt;(&lt;span style="font-weight: bold;"&gt;Please Note:&lt;/span&gt; Apress, the publishers, kindy offered me a Java book to review for my blog. I accepted and out of &gt; 100 options I chose this one due to my love of all things scalability and because Terracotta seems to address a hard problem of distributed cooperation within clusters. Anyway I guess the point is, I got this book for free, some may consider this places me in a slight position of a conflict-of-interest, some may not care. I certainly don't believe it has colored my view of this book - but you, dear reader, should be aware nonetheless. In any event I am certainly appreciative to Apress.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Over the past few years as principal engineer / architect (and back again) I've faced a couple of hard problems which I'm sure many of you have too.  Once you get to an architecture where you have more than one JVM or server, how do you quickly and easily share information across them? Yes the database is one easy solution but the performance / scalability hit in "always going to the database" becomes quickly onerous.&lt;br /&gt;&lt;br /&gt;Then one decides to cache to reduce this load but now how to you keep caches in synch?&lt;br /&gt;&lt;br /&gt;Then one might go down the path of deciding to use some messaging system (e.g. JMS, Tibco, WebSphereMQ etc.) to ease intercommunication but there the amount of coding, testing and debugging needed due to the complexity of this roll-your-own solution becomes quite problematic.&lt;br /&gt;&lt;br /&gt;Another similar problem comes where you have a load balancer in front of your web / app servers for performance, DR and HA reasons and you have some stateful application (like most web sites are today). How can you share easily session information across servers to make for a seamless experience?&lt;br /&gt;&lt;br /&gt;So for all of these problems that's where something like Terracotta comes in. It basically sits between your application and the JVM and allows you to declaratively define what information is to be shared across JVMs. It promises to do so without any code changes (nice!).&lt;definition&gt;&lt;br /&gt;&lt;br /&gt;A compelling product to say the least.  Anyway, in a bid to learn more about this product I decided to review this book.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www3.addall.com/New/submitNew.cgi?query=978-1-59059-986-0&amp;amp;type=ISBN&amp;amp;location=10000&amp;amp;state=&amp;amp;dispCurr=USD"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_GSG-oO6BfdY/SLKt8u26ggI/AAAAAAAAABM/xYSEoRTDDME/s400/terracotta_book.gif" alt="" id="BLOGGER_PHOTO_ID_5238440575467422210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TITLE&lt;/span&gt;: The Definitive Guide to Terracotta: Cluster the JVM for Spring, Hibernate and POJO Scalability&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AUTHORS&lt;/span&gt;: Terracotta, Inc.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ADDALL&lt;/span&gt;: &lt;a href="http://www3.addall.com/New/submitNew.cgi?query=978-1-59059-986-0&amp;amp;type=ISBN&amp;amp;location=10000&amp;amp;state=&amp;amp;dispCurr=USD"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 1 Theory and Foundation: Forming a Common Understanding&lt;/span&gt;&lt;br /&gt;The first chapter starts by laying some foundation and defining terms - always a good start. &lt;span style="font-style: italic;"&gt;"Terracotta is a transparent clustering service for Java applications"&lt;/span&gt; is the mantra and they go on to explain what this term means. They proceed to talk about how the underlying memory model that Terracotta gives you&lt;/definition&gt; (across JVMs)&lt;definition&gt; is now transparent to the application.&lt;br /&gt;&lt;br /&gt;They discuss at a high level how the service provides you advantages such as high availability, scalability (scale-out) and improved performance (by not requiring a DB hit to share information).&lt;br /&gt;&lt;br /&gt;As examples, they cover the classic use-cases of Terracotta&lt;br /&gt;1) Distributed Caching&lt;br /&gt;2) Database Offload&lt;br /&gt;3) Session Replication&lt;br /&gt;4) Workload partitioning&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 2 History of Terracotta&lt;/span&gt;&lt;br /&gt;Chapter two discusses the forces that resulted in the creation of Terracotta - from the forces to scale out rather than scale-up (e.g., preference for loose coupling, availability of cheap commodity hardware, cheapness of linux etc.).&lt;br /&gt;&lt;br /&gt;But with scale-out comes the problem of keeping JVMs / Servers in synch. The solutions such as&lt;br /&gt;1) Scale the Database&lt;br /&gt;2) In-memory replication&lt;br /&gt;3) Partitioning the data&lt;br /&gt;&lt;br /&gt;each came with their own problems.&lt;br /&gt;&lt;br /&gt;And so Terracotta came into being. Whereas folks such as Amazon (and&lt;a href="http://www.infoq.com/articles/ebay-scalability-best-practices"&gt; eBay&lt;/a&gt;) took the approach of "eventual correctness" &lt;span style="font-size:78%;"&gt;(aka "eventual consistency") &lt;/span&gt;where each application instance could complete transactions to local disk and eventually flush to the database, Terracotta's founders chose another solution as their business folks were &lt;span style="font-style: italic;"&gt;"not prepared to discuss the ramifications of an eventually correct architecture, where users might be told that a previously confirmed purchase order could not be completed because of miscalculations in inventory long after checkout completed"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;And so they sought to effectively create a "General Purpose L2" cache. The original implementation was too intrusive where developers would often forget to serialize and replicate changes to L2-based objects to keep things in synch and this led to regressions and eventually to a significant slow down in the pace of development.&lt;br /&gt;&lt;br /&gt;With Scalability and Availability often becoming opposing forces it was refreshing that their solution aided both. The transparency of the solution also does not necessitate the need of one programming model over another e.g. EJB vs. Spring or JPA vs. Hibernate vs. iBatis.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 3 Jumping Into Terracotta&lt;/span&gt;&lt;br /&gt;Ah here we go - C O D E! They literally start off with a simple (clustered) "Hello World!" example and start to get into how to configure Terracotta. I wish they had spent some more time here, perhaps a whole chapter, helping someone set-up a REALLY good environment (say multi-machine, or at least an env for multiple programs operating simultaneously) - a lot of this is left up to the user to figure out, let alone perform.  That I think dilutes the message of Terracotta and doesn't give the reader a good "WOW" factor when they see this in operation.&lt;br /&gt;&lt;br /&gt;In any event we start to get into the "meat" here and discover how Terracotta ensures all changes to shared data have been applied before a read is performed. And just after a write, Terracotta ensures that all memory changes are made available to other Java processes that might need them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 4 POJO Clustering&lt;/span&gt;&lt;br /&gt;So having seen a quick example they correctly now need to dive in to expain how Terracotta handles Java objects and the virtual heap and secondly explain how Terracotta manages thread coordination between JVMs.&lt;br /&gt;&lt;br /&gt;They define a "root" - a field in any class that you declare as being clustered. Terracotta traverses the graph of object references from that root to cluster those objects too. Since these objects are clustered and durable beyond the scope of a single JVM they are sometimes referred to as "superstatic" - having the same lifecycle as the virtual heap.&lt;br /&gt;&lt;br /&gt;Typically data structures like Map, List and other Collection objects are chosen as root objects.&lt;br /&gt;&lt;br /&gt;Terracotta is pretty smart since not EVERY object on the virtual heap needs to be instantiated in every JVM. Terracotta can load an object as needed. Just like the virtual memory subsystem of a modern OS swaps contents to and from physical memory and disk, Terracotta lets your application behave as if there was an almost unlimited physical Java heap.&lt;br /&gt;&lt;br /&gt;Then comes information on such topics as Distributed Garbage Collection and how threads are coordinated - again the details are such that there are no real surprises or "tricks" here - the folks at Terracotta have really taken Transparency to heart. &lt;span style="font-style: italic;"&gt;"Terracotta provides exactly the same access serialization, coordination and visibility guarantees to threads in different JVMs as the JVM itself provides to threads within the same JVM"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Then we get into more meaty topics of locks in Terracotta and how Terracotta extends the concept of locking. Again by using declarative methods they help keep much of the messy coding inherent in locking out of the developers hands and keep it where it belongs - in the Terracotta infrastructure.&lt;br /&gt;&lt;br /&gt;From there we leap to Terracotta "transactions" wherein Terracotta batches changes made to objects into sets, helping to ensure that threads always see a consistent view of clustered objects.&lt;br /&gt;From there we delve into what kinds of objects are not "Portable" (cluster-able with Terracotta) e.g. file-system related classes such as &lt;span style="font-family:courier new;"&gt;java.io.FileDescriptor&lt;/span&gt; (host-machine specific) and instances of &lt;span style="font-family:courier new;"&gt;java.lang.Thread&lt;/span&gt; (JVM-specific) are some examples.&lt;br /&gt;&lt;br /&gt;Interestingly there is also the concept of "Physically vs. Logically managed objects" . The former are objects wherein their field data values are distributed to the Terracotta server and from there to the other cluster members. The later (Logically managed) are clustered by Terracotta by recording the method calls on those objects and their arguments and replaying them on the other members of the cluster.&lt;br /&gt;&lt;br /&gt;Examples of logically-managed objects are &lt;span style="font-family: courier new;"&gt;Hashtable&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;HashMap &lt;/span&gt;and &lt;span style="font-family: courier new;"&gt;HashSet &lt;/span&gt;(spot the common theme?) - yes that's because the Hashcodes used to create the internal structure of the object are JVM-specific.&lt;br /&gt;&lt;br /&gt;From there we get more into understanding Clustered POJOs but personally I felt much of this information was repeated either earlier or later in the book. But after that there's a more fully formed example used to elucidate much of what was discussed earlier in the chapter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 5 Caching&lt;/span&gt;&lt;br /&gt;We begin this chapter with a discussion of caching and the trade-offs and problems it incurs&lt;br /&gt;&lt;/definition&gt;&lt;ul&gt;&lt;li&gt;Space for time&lt;/li&gt;&lt;li&gt;Freshness&lt;/li&gt;&lt;li&gt;Complexity&lt;/li&gt;&lt;li&gt;Durability&lt;/li&gt;&lt;li&gt;Duplication of data across caches&lt;/li&gt;&lt;/ul&gt;Then a quick example shows how Terracotta can be used to quickly provide a distributed cache.&lt;br /&gt;From there we delve into which of the Map structures are best for such data structures within Terracotta. Interestingly &lt;span style="font-family:courier new;"&gt;ConcurrentHashMap&lt;/span&gt; is generally the best choice when sharing maps but sadly &lt;span style="font-family:courier new;"&gt;LinkedHashMap&lt;/span&gt; is not supported by Terracotta. Harumph!&lt;br /&gt;&lt;br /&gt;Then we get into some of the gory details of caching that we all need to know&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Eviction and Expiration policies&lt;/li&gt;&lt;li&gt;Persistence&lt;/li&gt;&lt;li&gt;Distributed Caching (again I felt this was repetitive)&lt;/li&gt;&lt;li&gt;Use of partitioned data&lt;/li&gt;&lt;/ul&gt;Interestingly they claim that it is largely by avoiding serialization (typical of transmitting updates through a cluster using more traditional methods) they gain a very significant part of the performance improvement of their product.&lt;br /&gt;&lt;br /&gt;From there we get a quick example with &lt;a href="http://ehcache.sourceforge.net/"&gt;Ehcache&lt;/a&gt; (Easy Hibernate cache) and then onto chapter 6.&lt;definition&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 6 Hibernate with Terracotta&lt;/span&gt;&lt;br /&gt;I found this to be my favorite chapter - quite a bit more details in it than other chapters, good solid examples, and the benefits of the product become abundantly clear.&lt;br /&gt;&lt;br /&gt;We start off with a great overview of Hibernate and how Terracotta can be used to improve it - by clustering the second-level Hibernate cache and also by using it to cluster Hibernate session objects.&lt;br /&gt;&lt;br /&gt;From there we get a good example of how Hibernate and Terracotta together can be used to save on DB hits.   Hibernate's cache runs the risk of staleness if another JVM updates data in the Db and so Terracotta helps fill this gap by preventing such staleness issues.&lt;br /&gt;&lt;br /&gt;Then we get some great stuff lacking in other books - HARD NUMBERS!&lt;br /&gt;Hibernate clustered with Terracotta gave a 4x boost over Hibernate with second-level cache alone when focused on DB updates. When focused on DB reads, we get a &gt; 250x boost.  Naturally your mileage may vary but at least we're getting some good ideas of what to expect.&lt;br /&gt;&lt;br /&gt;We now get into the details of configuring Hibernate to be aware of Terracotta and vice-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;versa&lt;/span&gt;. All straightforward and relatively simple stuff.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 7 Extending HTTP Sessions with Terracotta&lt;/span&gt;&lt;br /&gt;This was another good chapter on how to share HTTP Session information across &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;JVMs&lt;/span&gt;, servers using Terracotta. A very useful feature that helps avoid most of the problems associated with persisting HTTP session information to afford your cluster the ability to scale-out, be HA etc.&lt;br /&gt;&lt;br /&gt;Yet again we see the Transparency of Terracotta as it transparently (to your web app) hooks into the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;servlet&lt;/span&gt; container. From there we get a few nice examples to see all of this works with Tomcat. Fortunately Terracotta supports the following web / app servers&lt;br /&gt;&lt;/definition&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;WebLogic&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;WebSphere&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Jetty&lt;/li&gt;&lt;li&gt;Apache Geronimo&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;JBoss&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;and the following frameworks&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Struts 1.1&lt;/li&gt;&lt;li&gt;RIFE&lt;/li&gt;&lt;li&gt;Wicket&lt;/li&gt;&lt;/ul&gt;&lt;definition&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 8 Clustering Spring&lt;/span&gt;&lt;br /&gt;Here we get a pretty short chapter where basically the point is you can point Terracotta at Spring beans rather than declare each class / field yet again in your Terracotta &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;config&lt;/span&gt; file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 9 Integration Modules&lt;/span&gt;&lt;br /&gt;Terracotta supports the idea of external configuration for a component  you might be shipping that takes advantage of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Terracotta's&lt;/span&gt; features. This allows you to ship a Jar and the user of that jar then does not need to include Terracotta &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;config&lt;/span&gt; information for this component into their own Terracotta &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;config&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This feature is called a "Terracotta Integration Module" or TIM. It consists of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;config&lt;/span&gt; info and perhaps code that specifies how the component should be clustered, how locking is performed etc. They then go on to describe how &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;TIMs&lt;/span&gt; are created, used and configured.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 10 Thread Coordination&lt;/span&gt;&lt;br /&gt;This chapter seemed like it should have been more up front, also it's quite short and I thought there would be more here. They get into some of the details of thread coordination in relation to Terracotta. I got something out of this chapter - I'm just not sure exactly what it was.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 11 Grid Computing Using Terracotta&lt;/span&gt;&lt;br /&gt;Naturally Terracotta lends itself to Grid computing i.e. supporting the splitting of a workload across nodes. From there we get into the "Master/Worker" pattern and an implementation in Java and then into how to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;refactor&lt;/span&gt; the original example for improved performance / scalability by reducing contention, batching work, multiple work queues, addressing fault tolerance.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHAPTER 12 Visualizing Applications&lt;/span&gt;&lt;br /&gt;Finally in chapter 12 we learn about visualization techniques and tools to help you comprehend what a cluster is doing and why it is going slow or fast. They show many metrics the tools capture and what they reveal and how they can be used to tune your application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;REVIEW SUMMARY&lt;/span&gt;&lt;br /&gt;This is a rock-solid book with a solid introduction. I wouldn't agree that it's a "Definitive Guide" - but I guess that's just an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Apress&lt;/span&gt; standard naming convention (the same way Manning has the "In Action" series).&lt;br /&gt;&lt;br /&gt;I'd like to have seem more help up front in getting your environment set-up for the examples, some case-studies of how Terracotta has been used, more benchmarks, perhaps even benchmark code.  But given the fact that it's the ONLY book I can find on Terracotta it's fortunately pretty good and gets you "in the game".&lt;br /&gt;&lt;br /&gt;Clearly Terracotta can't have infinite scalability - Terracotta must communicate between &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;JVMs&lt;/span&gt; over the network so a guide of best practices, practical limits etc. would have been useful on things such as how to optimize network architecture, data structure design / optimization etc. would have been great.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PROS&lt;/span&gt;: Relatively Short and to-the-point. Examples are simple and straightforward.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CONS&lt;/span&gt;: Not enough examples. Not enough code. Would be nice to have them help you set up an environment. Would have been nice to see some more hard numbers of performance / scalability boost over other solutions. Quite a bit of repetition - typical of books written by teams without a clear "separation of concerns".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GRADE&lt;/span&gt;: B+&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BUY IT?&lt;/span&gt; If you're using starting to use Terracotta - absolutely. If you're interested in making your application faster or scaling-out in general - probably.&lt;br /&gt;&lt;br /&gt;&lt;/definition&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=v3KoeeEj27Y:KXbrGtdXEaQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=v3KoeeEj27Y:KXbrGtdXEaQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=v3KoeeEj27Y:KXbrGtdXEaQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=v3KoeeEj27Y:KXbrGtdXEaQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=v3KoeeEj27Y:KXbrGtdXEaQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/v3KoeeEj27Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/8550842802014971640/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=8550842802014971640" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8550842802014971640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8550842802014971640?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/v3KoeeEj27Y/book-review-definitive-guide-to.html" title="Book Review: The Definitive Guide to Terracotta" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_GSG-oO6BfdY/SLKt8u26ggI/AAAAAAAAABM/xYSEoRTDDME/s72-c/terracotta_book.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/08/book-review-definitive-guide-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8HQXkyeCp7ImA9WxdUEE8.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-8369215021211162674</id><published>2008-07-25T17:41:00.003-04:00</published><updated>2008-07-25T17:53:50.790-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-25T17:53:50.790-04:00</app:edited><title>A sad passing</title><content type="html">Randy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Pausch&lt;/span&gt; sadly lost his life to Pancreatic Cancer. He was 47.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://http://www.time.com/time/arts/article/0,8599,1826574,00.html?imw=Y"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;His life, his work and his brave struggle against indomitable odds (Pancreatic cancer has a 5% survival rate after 5 years) was an inspiration to many. He is survived by his wife and three young children - 6, 3 and 2.&lt;br /&gt;&lt;br /&gt;Wherever he is, his spirit I'm sure continues that quest for knowledge and to share that knowledge with others.&lt;br /&gt;&lt;br /&gt;To quote T. S. Eliot&lt;br /&gt;&lt;br /&gt;"&lt;span class="body"&gt;We shall not cease from exploration, and the end of all our exploring will be to arrive where we started and know the place for the first time.&lt;/span&gt; "&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=sWZR_u8wCqY:tRdmmESiS2k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=sWZR_u8wCqY:tRdmmESiS2k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=sWZR_u8wCqY:tRdmmESiS2k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=sWZR_u8wCqY:tRdmmESiS2k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=sWZR_u8wCqY:tRdmmESiS2k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/sWZR_u8wCqY" height="1" width="1"/&gt;</content><link rel="related" href="http://www.time.com/time/arts/article/0,8599,1826574,00.html?imw=Y" title="A sad passing" /><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/8369215021211162674/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=8369215021211162674" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8369215021211162674?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8369215021211162674?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/sWZR_u8wCqY/sad-passing.html" title="A sad passing" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/07/sad-passing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4ERXczeyp7ImA9WxdXEUg.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-3896554525527608056</id><published>2008-06-22T09:53:00.015-04:00</published><updated>2008-06-22T12:58:24.983-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-22T12:58:24.983-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="standards" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>Automated Regression Testing: Why, What and How</title><content type="html">Having to wear the hat of three different roles (Architect / Manager / Developer) you find there are few things in software development where there isn't a significant trade-off depending on your role and it's viewpoint.&lt;br /&gt;&lt;br /&gt;For example when I'm managing, things like refactoring take a back seat to rolling out new product - even though I'm aware of the positive impact of refactoring. When being an architect I'd rather minimize code duplication (or triplication) - a long-term gain to team productivity but  at the cost of product in the short-term. When developer I'd rather be focused on developing the cool new product than bug fixing. There's few things I can wholeheartedly stand behind when having to wear all three hats.&lt;br /&gt;&lt;br /&gt;However good automated regression testing is something that I'm pretty sure everyone can agree on. It's usually not a huge investment of time but the payoff is large and grows over time - like a savings account.&lt;br /&gt;&lt;br /&gt;From each point of view&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Developer --&gt; Less Time bug fixing. I can go home before 7pm. Yeah!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Manager --&gt; Better quality product, risks identified earlier. Less screaming customers! Yeah!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Architect --&gt; Great way to support refactoring with minimal product risk.&lt;/li&gt;&lt;li&gt;QA --&gt; Less manual drudge work.&lt;/li&gt;&lt;/ul&gt;Probably several of you are asking - "OK but what is a regression test?". Put simply it's testing that finds bugs in code that used to work in past versions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WHY&lt;/span&gt;&lt;br /&gt;As mentioned above, regression testing is first and foremost a "risk reduction" exercise - you want to find bugs in code as fast as possible with minimal effort (automated!).  This becomes more important the longer your product has been in production - no-one wants a release to be "three steps forward and two steps back". You want your product to always be increasing it's value to your user base.  Bugs will happen - you just want them to either be minor ones or stuff in your new code - not the old stuff that people rely on to get their job done.&lt;br /&gt;&lt;br /&gt;In any event, people's expectations for software these days are sadly low (Thanks Microsoft!) so delivering anything reasonably reliable gets noticed.&lt;br /&gt;&lt;br /&gt;It also acts to reduce the "drudge" work of manual testing. That work is also subject to human memory - unless you have all the test cases written somewhere - are they all up to date? You sure? For the most part the answer to that is no.&lt;br /&gt;&lt;br /&gt;Similarly automated regression tests also act to codify and formalize one's experience so, God forbid, you lose a QA person, a product manager, developer etc. You don't lose the entirety of their knowledge.&lt;br /&gt;&lt;br /&gt;Although some would argue this makes those roles more replaceable - in my experience it acts to free up QA, Developers, Product managers to do more valuable - and LESS replaceable work.&lt;br /&gt;&lt;br /&gt;It also helps your team be "more proactive and less reactive" (forgive the management speak). But as we all know - the more your team spends fighting fires the harder it is to have a truly enjoyable work place. Or at least that's my opinion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HOW&lt;/span&gt;&lt;br /&gt;So how do you "regression test"?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;0) Stop Here!&lt;/span&gt;&lt;br /&gt;First I'm going to assume some things - first and foremost that you have a source control system. If you don't then that's the first order of business - get one! SVN, CVS or whatever (personally I prefer Perforce - actually I love it).&lt;br /&gt;&lt;br /&gt;I'm also going to assume your team or organization cares about product quality - no problem right? Think about it though - think about your past work experiences. I've been in several situations where there was no will to do any regression testing of any real merit - I tried to fight the good fight but sooner or later you get labeled as obstructionist. True you can't spend all your time on this - but if you can't spend a few hours per week per developer you're in for trouble. I'm sure I'm not alone in this experience.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Unit Tests&lt;/span&gt;&lt;br /&gt;Well JUnit test cases are an obvious place to start. So obvious I won't spend time on them - the benefits and myriad and have been discussed ad infinitum (nauseum) here and elsewhere.&lt;br /&gt;&lt;br /&gt;The key though is to remember to also focus on unit testing from a product point of view as much as one can - not solely a code point of view. Although code coverage tools are helpful too - 100% code coverage doesn't really mean as much as one would hope (see &lt;a href="http://www.ibm.com/developerworks/java/library/j-cq01316/index.html"&gt;this great article&lt;/a&gt; by &lt;a href="http://thediscoblog.com/"&gt;Andy Glover&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Also remember you don't just want to test functionality (both positive and negative cases) but also, if you can, performance / scalability and security.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Automated GUI tools&lt;/span&gt;&lt;br /&gt;Assuming your product has a GUI you'll probably find yourself or your QA automation team writing scripts in some tool such as Segue Silk, HP/Mercury WinRunner, Quick Test etc.&lt;br /&gt;&lt;br /&gt;These tools are good because it's very hard to unit test a GUI. The number of paths through the GUI are myriad for anything more than the simplest UI.&lt;br /&gt;&lt;br /&gt;However these tests are often much slower than unit tests and require significant resources - both people and machine to run.&lt;br /&gt;&lt;br /&gt;Again don't just focus on tests for functionality but also look at testing performance/scalability and security (and I'm sure other things too)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Projects-specific ways&lt;/span&gt;&lt;br /&gt;Often you'll find ways that are specific to your software or project. Some examples are below&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EXAMPLES&lt;/span&gt;&lt;br /&gt;Two examples I'm very proud to have been a part of are described here.&lt;br /&gt;&lt;br /&gt;The first was a product where my firm transmitted data to another firm - financial information about products we had for sale. The products were then advertised on the other firm's web site.&lt;br /&gt;The key problem was that the data was constantly changing (think stock prices) so the information had to be pretty current (not totally real-time but a gap in minutes was about the worst we would tolerate).&lt;br /&gt;&lt;br /&gt;Fortunately this customer had a test system which we could attach to - upload data and verify that any changes we made would still would work. How to tell it all worked as it was supposed to? I wrote a Java program using HttpUnit that would login to their web site - find the appropriate product pages, parse the HTML and pull out the prices. Then it would compare that data against what was in my local DB (the data I was supposed to send them).&lt;br /&gt;&lt;br /&gt;Once I had run that for an entire day without issues I was extremely confident that all was right with the world.&lt;br /&gt;&lt;br /&gt;Also a nice upside was I could run that SAME program against our production system (it's read-only after all) to verify that production was fine.&lt;br /&gt;&lt;br /&gt;Now the REALLY cool thing was when something happened in production e.g. network outage or some remote problem typically I could inform my user base and my management very quickly. Often they would know before our business partners were aware that THEIR system was having problems.  It's really nice to be able to have that level of confidence in your product and your users and management notice too let me tell you.&lt;br /&gt;&lt;br /&gt;Another good example was more typical to software product firms where one has many customers running the product. Typically as we're solving problems with this product we would get copies of their databases to debug issues.  In turn we would take several of these customer databases and run them through nightly regression tests.&lt;br /&gt;&lt;br /&gt;The test would compare the current release vs. the last known release (considered the "gold copy"). Not only would we diff results but also we'd compare execution times. And although the environment was not totally locked down for a true performance comparison - a 20%+ discrepancy of performance for &gt; 1 day was typically a sign of a potential performance issue in something in our code or the data model, indexes etc.&lt;br /&gt;&lt;br /&gt;OK enough bragging . . . let's talk about some best practices.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;BEST PRACTICES&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#1) Find and Test the Gaps&lt;/span&gt;&lt;br /&gt;Testing is never done and neither will your regression testing. Naturally you will (or should) want to test the riskiest pieces first - places that have largest impact if they break and/or break frequently. Often too you should use customer feedback and bug reports to help guide your list of functionality to add to the test. Look for patterns - key areas of misunderstanding or bugs.  Code coverage tools can also be helpful but don't rely on them to tell you when you're done.&lt;br /&gt;&lt;br /&gt;Keep a prioritized list of areas to cover - start at the top and work your way down.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#2) If you're not finding bugs ask why?&lt;/span&gt;&lt;br /&gt;One way you're regression test can stop finding a lot of bugs is if it's out of date - if you haven't been spending time adding to your test suite (you're adding more functionality say?) then you're short-changing yourself. With every release of your code - your regression test should grow or improve.&lt;br /&gt;&lt;br /&gt;Another is if the tests being created aren't aligned with what's known for risky / bug-prone areas.&lt;br /&gt;&lt;br /&gt;Another is when your developers are so damn good they don't have bugs anymore - but we all know that's not all that common.  But often you'll find that's because they run the regression themselves when they realize how valuable it is.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#3) Have dedicated hardware&lt;/span&gt;&lt;br /&gt;You don't need the biggest, baddest machine - often a recent late-model desktop will suffice in most cases. But you need this to do #4&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#4) Run them all the time or at least nightly&lt;/span&gt;&lt;br /&gt;Your tests should be running all the time or at worst - once per night. Once your tests are big enough there may not be enough time in the day on on existing hardware - so you may wish to keep some long running lower priority tests for the weekend or alternate test suites every other day.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#5) When you max out - throw hardware at it&lt;/span&gt;&lt;br /&gt;Hardware is a commodity - it's cheaper to buy some high end Solaris hardware for $10k than it is to take two months of a developer who earns $100k per year plus benefits to speed things up.  So when you start to max out your current regression test machines throw hardware at it first - then improve the performance (unless there's some blindingly obvious quick fix in software).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;#6) Critical tests first&lt;/span&gt;&lt;br /&gt;In the spirit of "fail fast" and risk mitigation - you first want to perform the tests that will find the most critical items or test bug-prone pieces of code.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#7) Automate Result Interpretation&lt;/span&gt;&lt;br /&gt;Once the results from your regression test are ready it should email relevant people and provide a synopsis of the results. A daily regression isn't very useful if it takes an hour to figure out if you passed or not. Eventually no-one will read it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#8) Add tests continuously&lt;/span&gt;&lt;br /&gt;Don't wait for a particular "phase" of the project to add more tests - do so continuously otherwise you'll find that time suddenly disappears and then you're playing catch-up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#9) Don't reinvent the wheel - use tools&lt;/span&gt;&lt;br /&gt;If you're going to automate don't waste time - use the all the tools you can. There are so many great tools out there from open source to commercial (although I must say the commercial tools I find VERY expensive compared to their utility).&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://selenium.openqa.org/"&gt;Selenium&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webtest.canoo.com/webtest/manual/WebTestHome.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Canoo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;WebTest&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://clarkware.com/software/JUnitPerf.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;JUnitPerf&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jakarta.apache.org/jmeter/index.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;JMeter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://httpunit.sourceforge.net/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;HttpUnit&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.autohotkey.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;AutoHotKey&lt;/span&gt; &lt;/a&gt;-- if you don't know this already - check this out ASAP!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://poi.apache.org/"&gt;Apache POI&lt;/a&gt; especially if you produce reports in Word Doc / Excel format&lt;/li&gt;&lt;li&gt;Good ole &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;unix&lt;/span&gt; diff, pipe and sort (this reminds me why I dislike Windows as a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;dev&lt;/span&gt; platform - Unix tools rock so thank God for &lt;a href="http://www.cygwin.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;CygWin&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;And there's probably a half-dozen I'm not aware of that I hope you, dear reader, will tell me about.&lt;br /&gt;&lt;br /&gt;Don't forget static code analysis tools too (See "&lt;a href="http://softarc.blogspot.com/2006/12/analyze-this-put-your-code-on-couch.html"&gt;Analyze this - put your code on the couch!&lt;/a&gt;") to help find bugs (e.g. multi-threading) that your regression tests might miss.&lt;br /&gt;&lt;br /&gt;Having a great suite of regression tests brings great confidence for a team of developers - who are often frankly a pessimistic lot - that can mean you and your team will stand out in the crowd and separate the true engineers (who care about delivering a quality product) from the cowboys.&lt;br /&gt;&lt;br /&gt;(p.s. Thanks to Rick for the push!)&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=_gN-O1jTCwA:DGExFvBu8Q0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=_gN-O1jTCwA:DGExFvBu8Q0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=_gN-O1jTCwA:DGExFvBu8Q0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=_gN-O1jTCwA:DGExFvBu8Q0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=_gN-O1jTCwA:DGExFvBu8Q0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/_gN-O1jTCwA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/3896554525527608056/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=3896554525527608056" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3896554525527608056?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3896554525527608056?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/_gN-O1jTCwA/automated-regression-testing-why-what.html" title="Automated Regression Testing: Why, What and How" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/06/automated-regression-testing-why-what.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4CRXg7eip7ImA9WxZVGE0.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-5797751823502466694</id><published>2008-03-29T06:23:00.009-04:00</published><updated>2008-03-29T12:26:04.602-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-29T12:26:04.602-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="code quality" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>It does not take a Superstar - Developer types enumerated</title><content type="html">As someone who more recently has taken on more of team lead duties (*cough* project manager *cough*) I've had to reflect on how to dole out tasks and my success (and some failure) at this has really caused me to refine my understanding of different developer types I've known over the years.&lt;br /&gt;&lt;br /&gt;So I've tried to enumerate different types that probably many of you are familiar with. These types probably don't 100% encapsulate somebody - often you'll see a number of these types in one person, or one type might dominate at any one time.&lt;br /&gt;&lt;br /&gt;Also I'll try to give each type a rough score on a few dimensions. Dimensions that help me to assign tasks or pair people together.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Gets-it-done&lt;/span&gt;: Can be relied on to get the job done, fix the critical bug and will work with whoever it takes to do so.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Plays-well-with-others&lt;/span&gt;: the phrase "team player" is over used. I'm just talking about someone who gets along with others, who people like to work with.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Bugs&lt;/span&gt;: How many bugs in their code? How serious?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Code Quality&lt;/span&gt;: Is their code readable? Extensible? Good unit tests?&lt;br /&gt;&lt;br /&gt;and I'll rank each types on these dimensions as: fair, good or excellent&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Ok&lt;/span&gt; so here goes&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Type #1: The Communicator&lt;/span&gt;&lt;br /&gt;This is the developer that has great communication skills - speaks really well, listens and writes well.  They can communicate complex topics easily and also they're great to pair up with business analysts/product managers/business folks to help tease out requirements. Very valuable when you need to have someone work with other teams.  Good code but not the greatest but often it's readable and extensible and well thought through.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gets-it-done: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Plays-well-with-others: Good to Excellent&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugs: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code Quality: Good to Excellent&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Pairs well with "The Grouch" (see below).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#2 The Diva&lt;/span&gt;&lt;br /&gt;This is the person who can just blow you away with the amazing product they create but boy do you have to massage their egos and keep them happy. In a crunch when things *must* get done you're just not sure which side of them is going to show up.&lt;br /&gt;&lt;br /&gt;Very valuable often in the creative design or prototyping phase when they can come up with fabulous things no-one can think of or no-one thinks is possible.  On the downside, they often have a surprisingly high number of bugs often which they attribute to the (lack of) intelligence of the user.&lt;br /&gt;&lt;br /&gt;Not someone that works well with other teams!  And if they don't respect your technical acumen - BOY! will they try to run roughshod over you. And God forbid you give them a deadline or pressure - the moaning and complaining and drama! &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;AAGGHH&lt;/span&gt;!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gets-it-done: Fair-to-Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Plays-well-with-others: Fair&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugs: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code Quality: Good (not as good as they think though!)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Often Associated with: The Genius.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Side-Note:&lt;/span&gt; What's really funny is when you've got TWO divas on your team. They really tend not to like each other. Ironically because they think the other one's insufferable. Oh boy!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#3 The Genius&lt;/span&gt;&lt;br /&gt;This is the one that knows the technology platform inside and out. They can come up with great solutions. But too often they come up with great solutions that no-one needs and/or the solution just doesn't work well with other teams' work.&lt;br /&gt;&lt;br /&gt;They have great code - unit tests, readable, extensible, little duplication. Low numbers of bugs but when there are bugs it's usually a *huge* one that suggests they really didn't think through how their work would be used.&lt;br /&gt;&lt;br /&gt;Their throughput isn't great as they tend to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;overthink&lt;/span&gt; things - so those huge bugs might take a week to address even if it's blocking everyone. They're similar to the "Diva" just without the drama and they're pretty level headed. Also similar to the Diva they don't work well with deadlines.  They also have the nasty habit of checking in major things right before everyone &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;else's&lt;/span&gt; deadlines - and then the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;fire drill&lt;/span&gt; that ensues  . . . . . . .  sigh.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gets-it-done: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Plays-well-with-others: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugs: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code Quality: Excellent&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;#4 The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Fedex&lt;/span&gt;  Guy or Gal (a.k.a. "The Savior")&lt;/span&gt;&lt;br /&gt;When it "absolutely, positively has to be there overnight".  Reliable, solid people with good code, little drama.  Just gets it DONE. Period.  This person is the savior for the team lead or project managers worst moments.&lt;br /&gt;&lt;br /&gt;Often plays well with others, may not be the best communicator and has a fair few bugs but you don't really care because they fix them so fast. Also when it's fixed it's FIXED! May not be the smartest one or the most creative but they don't need to be - they lack the drama and often are good learners too.  Good to pair with a "Diva" or "Genius" as this person is often more practical and will fix critical bugs fast.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gets-it-done: Excellent&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Plays-well-with-others: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugs: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code Quality: Good&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;#5 The Grouch&lt;/span&gt;&lt;br /&gt;Entrenched in the organization often through many years experience. They have some knowledge or skill that you just don't think you can replace.  Not necessarily a bad or nasty person. It's just they're grouchy - you don't want to ask them a question or give them a task.&lt;br /&gt;&lt;br /&gt;They get the job done and don't cause too much hassle outside your team. They fix bugs reasonably fast but often the code is unmaintainable or unreadable (can you say "Job Security"?) and they don't want to listen to you about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;FindBugs&lt;/span&gt; or Unit Tests or things like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Refactoring&lt;/span&gt; - yeah that class with 40,000 lines of code looks GREAT!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gets-it-done: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Plays-well-with-others: Fair to Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugs: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code Quality: Fair to Good&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; Good to pair with "The Communicator" who might be able to help smooth out rough edges.&lt;br /&gt;&lt;br /&gt;And then there are a few types that we'd all wish we didn't have to talk about but often must deal with . . . . . .&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The not-so-smart one&lt;/span&gt;&lt;br /&gt;Ouch, you wouldn't have hired this person if you had interviewed them but often you inherited them. They don't want to learn. try-catch-finally blocks scare them. They use arrays because they learned them in C and learning about a Linked List seems unnecessary (and they just love fixing  &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ArrayIndexOutOfBoundsException.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;ArrayIndexOutOfBoundsException&lt;/span&gt;&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;They're just not interested in staying current or learning from others. Usually every problem is someone &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;else's&lt;/span&gt; fault or someone &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;else's&lt;/span&gt; responsibility. Their solutions lack any creativity or planning. They're just not cut out for this.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gets-it-done: Fair&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Plays-well-with-others: Fair&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugs: Good&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code Quality: Fair&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;The A-hole or The Bully&lt;/span&gt;&lt;br /&gt;Yes this happens. This is the developer that throws everyone else under the bus. Often associated with "The Genius" or "The Diva" this is the one to be &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; wary of. If you share a boss in common you're going to need to keep your ear to the ground to make sure they're not throwing &lt;span style="font-weight: bold;"&gt;YOU&lt;/span&gt; under the bus.&lt;br /&gt;&lt;br /&gt;They're often tolerated because they're really smart or they work in a culture of blame and backbiting where it's tolerated.  Often it's wise to have a network of friends in your workplace who look out for each other - usually this guy (and let's be honest it's usually a guy) can be sidelined if lots of folks stick together.  Another approach is to befriend this person. Really listen to them and try to bite your tongue. Get their opinion on things (as they're often high on themselves) and pretend like you care about it :-) Then they'll often go after someone else.&lt;br /&gt;&lt;br /&gt;Also don't email them anything - they'll twist it and use it against you.  However you *must* reply to them if they attack. Which they do.  The hard part is when they attack without you knowing.&lt;br /&gt;&lt;br /&gt;As the team lead I will go &lt;span style="font-weight: bold;"&gt;110%&lt;/span&gt; out of my way to defend myself and my team from these ones. Boy do they irk me.  Best of all they try to throw their intellectual weight around.  I *love* when they try to do it with me - try, just try!  Oh and when they screw up (no-one's perfect remember) the payback from all the other teams - WOW!&lt;br /&gt;&lt;br /&gt;When they leave or are fired there's a palpable sense of relief across the organization. Often your boss knows all this well enough - they're just looking for the right opportunity to replace or neuter this one.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gets-it-done: See Diva/Genius.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Plays-well-with-others: Awful&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugs: See Diva/Genius&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code Quality: See Diva/Genius&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Clearly this one generates a *lot* of emotion with me - people deserve to work in a respectful work environment.  It's hard to hire a good team and then people like this make developer's lives miserable and want to leave. That's bad for the team and bad for the organization as a whole.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Wrap-up&lt;/span&gt;&lt;br /&gt;The biggest conclusion I've taken - and a big surprise to me - it doesn't take a Superstar!  In fact I don't think such a person exists. You've got different people with different skills and personalities. No-one's got it all. Although you might think you do *cough* Diva *cough* :-)&lt;br /&gt;&lt;br /&gt;Often you get great productivity and great product by the right pairings - the Diva with the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Fedex&lt;/span&gt; guy/gal. The Grouch with the Communicator.  As long as they're WILLING to get along you can really pull together a great diverse team of people whom it becomes a pleasure to work alongside.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=n8EzBXtoFy0:gHAdAd9b_q4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=n8EzBXtoFy0:gHAdAd9b_q4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=n8EzBXtoFy0:gHAdAd9b_q4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=n8EzBXtoFy0:gHAdAd9b_q4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=n8EzBXtoFy0:gHAdAd9b_q4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/n8EzBXtoFy0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/5797751823502466694/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=5797751823502466694" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/5797751823502466694?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/5797751823502466694?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/n8EzBXtoFy0/it-does-not-take-superstar-developer.html" title="It does not take a Superstar - Developer types enumerated" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/03/it-does-not-take-superstar-developer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UGRHw-fip7ImA9WxZWFk0.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-6164026269193910739</id><published>2008-03-15T13:16:00.007-04:00</published><updated>2008-03-15T15:27:05.256-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-15T15:27:05.256-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="standards" /><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>How to file a good bug report</title><content type="html">One of the first lessons, hard lessons, you learn coming into the world of software development out of college is how hard it can be to understand bug reports.&lt;br /&gt;&lt;br /&gt;Variously they can be vague, misleading, inaccurate, confusing or best of all - misunderstanding a feature for a bug (the latter often points to usability issues).&lt;br /&gt;&lt;br /&gt;Having endured many of these and now doing a fair bit of testing of my current application, I try to "&lt;a href="http://thinkexist.com/quotation/be_the_change_you_want_to_see_in_the_world/148490.html"&gt;be the change I wish to see in the world&lt;/a&gt;". So I've come up with the following scheme for bug reports.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#1 Start with a good short bug summary&lt;/span&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;"Data Entry screen disappears after entering certain unusual keystrokes"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The good part of this is a manager / team lead gets a quick idea of how serious this issue is (screen disappearing - bad!) where it occurs (data entry screen) and what caused it (unusual keystrokes). Useful in understanding just how serious it is and how soon it should be reviewed and/or fixed.&lt;br /&gt;&lt;br /&gt;Next up you need to focus on the needs of the developer - basically instructions so the developer can reproduce the issue&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#2 The *exact* build you are using&lt;/span&gt;&lt;br /&gt;e.g.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;March 27th 18:05 PM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sometimes developers get dupe issues with related if not similar symptoms and having the exact build they can often realize "Hey that's that same issue I fixed yesterday" and they can then tell the tester - try the 28th build because it's related to issue X we resolved.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#3 Environmental Aspects&lt;/span&gt;&lt;br /&gt;Including&lt;br /&gt;- What machine the different parts of the system were running on e.g. web server, GUI etc.&lt;br /&gt;- What database you were pointing at and DB login if appropriate&lt;br /&gt;- How you installed the build e.g. options&lt;br /&gt;- Your GUI login if appropriate&lt;br /&gt;- If you can, it's really awesome to leave that build around and up-and-running so a developer can come over to your area and check it out for themselves. Not always possible but for those big critical issues it's a real time saver.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#4 Instructions to see the bug&lt;/span&gt;&lt;br /&gt;The steps need to be detailed, step-by-step.&lt;br /&gt;&lt;br /&gt;Often when I report a bug I spend a few minutes trying to get the least number of clear steps to reproduce an issue. This is important not only for the developer but for the person who subsequently tests the fix perhaps minutes, day or even months later.&lt;br /&gt;&lt;br /&gt;You don't want to be too detailed "point your mouse to the 'Send' button and left-click" or too vague "enter some data and hit 'Send'"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1) Login to the GUI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;2) Go to 'Tools &gt; Data Entry &gt; Advanced'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;3) Select the 'Schedule' tab&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;4) Enter '03/04/08' and then without saving try to tab off&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;5) You get a System error (see attached)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5 Supporting Documentation&lt;/span&gt;&lt;br /&gt;Screenshots are great 'proof' - especially for those developers you may know, who try to reproduce the issue for 5 seconds and then say "Unable to reproduce" and cancel your bug which you spent quite a bit of time entering. Very annoying!&lt;br /&gt;&lt;br /&gt;Some folks who have long complicated steps often choose to add video capture too which is great (but bulky).&lt;br /&gt;&lt;br /&gt;Logs are great too especially when they contain more useful errors related to things the developer can grasp e.g. &lt;span style="font-family:courier new;"&gt;Malformed &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SQL&lt;/span&gt; on line 223 of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;DataEntry&lt;/span&gt;.java.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Often these are attachments and as a technical lead I often trawl through the logs to find the most important lines e.g. often the first stack trace and then copy-and-paste that into the main bug description.&lt;br /&gt;&lt;br /&gt;Other things you need in a bug report&lt;br /&gt;- A unique identifier for this bug report&lt;br /&gt;- Priority - Stick to High, Medium and Low - beyond that lies madness! :-)&lt;br /&gt;- Severity is optional - often I find it confused with Priority for various reasons- again three levels should suffice - major, moderate and minor/cosmetic&lt;br /&gt;- Who created the issue and when?&lt;br /&gt;- Who is assigned the item?&lt;br /&gt;- Who is the tester going to be?&lt;br /&gt;&lt;br /&gt;Good bug reports take time. But it's worth it - I figure for every minute I put in to the report to make it clear and concise I'm probably saving 5 to 10 minutes of a developer's time and then more for the person who might have to test it (might be me 6 months from now).&lt;br /&gt;&lt;br /&gt;As a team lead also I'll reject reports that lack these details.  It's funny I've known some experienced &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;QA&lt;/span&gt; folks who just can't seem to get this right - it's very frustrating to start a back and forth - which builds is this - please add logs - can you add a screenshot?- and then there are some who write them so well it just becomes a slam-dunk for the developer.  Often they're the ones sitting right beside the developer - they've each learned how each other works - how to keep each other productive and keep frustrations to a minimum. That's good all around.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=nAa4XEubuiI:pnxn1PoC5Tg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=nAa4XEubuiI:pnxn1PoC5Tg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=nAa4XEubuiI:pnxn1PoC5Tg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=nAa4XEubuiI:pnxn1PoC5Tg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=nAa4XEubuiI:pnxn1PoC5Tg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/nAa4XEubuiI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/6164026269193910739/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=6164026269193910739" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/6164026269193910739?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/6164026269193910739?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/nAa4XEubuiI/how-to-file-good-bug-report.html" title="How to file a good bug report" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/03/how-to-file-good-bug-report.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUGRHs8fSp7ImA9WxZXEUQ.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-7974980921007532843</id><published>2008-02-27T19:59:00.006-05:00</published><updated>2008-02-28T06:13:45.575-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-28T06:13:45.575-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><title>No surprise here - offshoring losing popularity</title><content type="html">So the worm has turned eh? &lt;a href="http://www.wallstreetandtech.com/showArticle.jhtml?articleID=206800360&amp;amp;cid=nl_wallstreettech_week"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Offshoring&lt;/span&gt; of IT jobs is losing it's popularity&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;"Among respondents whose firms previously had ceased offshore operations (61 respondents), the most popular reason cited for doing so was that the operations required too much management and close oversight. Additionally, 30 percent of these &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;CIOs&lt;/span&gt; believed that they weren't realizing expected cost savings."&lt;br /&gt;&lt;br /&gt;I can certainly attest to that - software development is a very interactive profession - so much of what we communicate never gets written down, much is communicated informally at the water cooler etc. When a person is not "on site"- whether they're in Boise or Bangalore the job becomes more difficult.&lt;br /&gt;&lt;br /&gt;I've been on both sides of this - having a client in Ohio while my team and I worked in Boston was pretty tough - being in person was so much easier. Also I worked for a large mutual fund firm on a project where half the team was in India.  We did weekly video conferences and bi-weekly 6.30am phone calls.  It was hard!  With the shortage of IT workers now in India (since everyone pretty much outsourced there at the same time) we found it very hard to hire (and impossible to retain) senior developers. Being the architect I felt I had to step up and that was fine but the other local developers found it a burden.&lt;br /&gt;&lt;br /&gt;The really hard parts were cultural differences and inevitable misunderstandings but most of all the time difference was the most frustrating.  With almost 24 hours between responses (you write an email at 9am EST, they won't answer it until, say, 10pm but you won't read it until 9am the following day) it's hard to keep momentum especially on critical issues.&lt;br /&gt;&lt;br /&gt;More than ever these experiences taught me that keeping development teams close together - ideally customers with management with developers with architects helps get to success quickly.&lt;br /&gt;&lt;br /&gt;Offshoring won't go away and I don't feel it should - I really enjoyed the intercultural and travel opportunities - but this just points to those "bean counters" who think software development is like "brick laying" or something that scales well when you add people - you just need bodies in seats - the cheaper the better.&lt;br /&gt;&lt;br /&gt;It's NOT! Perhaps we should buy them copies of &lt;a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959"&gt;The Mythical Man-Month&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=xJY35z1zEl0:ro2Jn4G_kzE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=xJY35z1zEl0:ro2Jn4G_kzE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=xJY35z1zEl0:ro2Jn4G_kzE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=xJY35z1zEl0:ro2Jn4G_kzE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=xJY35z1zEl0:ro2Jn4G_kzE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/xJY35z1zEl0" height="1" width="1"/&gt;</content><link rel="related" href="http://www.wallstreetandtech.com/showArticle.jhtml?articleID=206800360&amp;cid=nl_wallstreettech_week" title="No surprise here - offshoring losing popularity" /><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/7974980921007532843/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=7974980921007532843" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/7974980921007532843?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/7974980921007532843?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/xJY35z1zEl0/no-surprise-here-offshoring-losing-its.html" title="No surprise here - offshoring losing popularity" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>10</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/02/no-surprise-here-offshoring-losing-its.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MGSHozfCp7ImA9WxZXEUs.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-1442874613395537871</id><published>2008-02-18T12:38:00.023-05:00</published><updated>2008-02-27T20:17:09.484-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-27T20:17:09.484-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Architect" /><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>10 things Project Managers wish Developers understood</title><content type="html">&lt;div id="1env" class="ArwC7c ckChnd"&gt;Well I've been very busy the past few months - most of it adapting to a new role as a Project Manager - technically I'm called a "team lead" or a "director" or a "senior manager" - depends who you ask, but when it comes down to it I manage the dev team to a project plan in cooperation with a product manager.&lt;br /&gt;&lt;br /&gt;Being on the "other side" now for a while it's been a real eye-opener. It's definitely true that it's hard to relate to someone until you've walked in their shoes for a good bit.  Having worked with project managers several times before, I've always wondered about why things were a certain way - ways I thought I would have done things differently.&lt;br /&gt;&lt;br /&gt;Well not anymore - now having "walked the walk" I thought I'd blog about the things that most developers on a team won't realize until they are the person in charge.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10) Information Overload: I wish I could focus on one thing at a time but I've got a million people coming at me&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; from all directions.&lt;/span&gt;&lt;br /&gt;There's product managers, support, management, customers with their needs, developers, other team's manager, architects and developers.  That's a lot of relationships and information to manage so don't be surprised when you encounter the following type of interaction.&lt;br /&gt;&lt;br /&gt;Developer: So, you remember that issue with the GUI last week?&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(subtext: that really critical issue I finally figured out the solution to?)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Manager: Which issue is this?&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(subtext: I just spent three hours replying to emails to 14 different people and I'm wiped)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9) Work Pressures: The Manager can get too excited or stressed by the pressures and try to "tell you the solution".  &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Push back (gently) if it doesn't make sense. &lt;/span&gt;&lt;br /&gt;When you're the manager and don't code - you get all the responsibility (worry) about meeting the deadlines but very little control over it.&lt;br /&gt;&lt;br /&gt;Those managers who have spent time as developers sometimes like to think we can just give other developers the answer. But that doesn't work - developers are a creative and (for better or worse) egotistical bunch (me included) and we want to impress our bosses rather than just take orders.&lt;br /&gt;&lt;br /&gt;I've learned to ask guiding and information-seeking questions rather than suggest solutions e.g.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"So how many files are impacted by this change?"&lt;/li&gt;&lt;li&gt;"How will this SQL change impact performance?"&lt;/li&gt;&lt;li&gt;"How will the GUI change impact our key user flows?"&lt;/li&gt;&lt;li&gt;"So if we fix this bug, what are the odds we might break something else?"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8) Project Risks: New technology = Risk&lt;/span&gt;&lt;br /&gt;Anytime you kick off a new big project, developers love to use new technology - but the effort can't all be about new technology - with new technologies come risks to the project. There may be efficiency gains but do they outweigh the risks?&lt;br /&gt;&lt;br /&gt;I've had managers who just said "No" to new technologies, but they didn't understand the desire of most developers to improve themselves and learn the hottest new technology (e.g. Ajax) / framework (e.g. Spring).  It was so demotivating.  Also there's often some productivity gains to be had from trying new technologies so it's a short-sighted idea to adopt a blanket "no".&lt;br /&gt;&lt;br /&gt;I've also had managers who only said "Yes" and then the project got bogged down in technical issue after technical issue and didn't deliver the functionality anywhere near on time as the developers had a large learning curve (or several curves) to overcome.&lt;br /&gt;&lt;br /&gt;As a developer I understand how developers love to learn - but as a manager I have to balance the motivation of my developers with the goal to deliver a functional product.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) Productivity: The best managers insulate developers from the craziness that goes on in middle management &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;- bad specs, crazy ideas, changes in priority, too many meetings.&lt;/span&gt;&lt;br /&gt;You think your pointy haired boss is nuts - you should see the people he/she works for! :-) The problem with modern day software is there's so many teams involved - the dev team, the QA team, support, client relationship, consulting and everyone's got their own viewpoint, their own goals etc.  They see either bigger pictures or completely different pictures entirely.&lt;br /&gt;&lt;br /&gt;Some developers have some idea that this goes on - if you do thank your boss - they're buying you time to be productive and do the things you love - Code!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6) Capitalism: The reason this company exists is to make money - sometimes you have to do some apparently silly things to get the money.&lt;/span&gt;&lt;br /&gt;Customer's aren't always logical, they have their own goals, their own viewpoints (seems to be a theme here). Sometimes the Sales folks have to commit to things to get the deal. They sound reasonable enough unless of course you have to implement them!&lt;br /&gt;&lt;br /&gt;Yes you have a right to be ticked off at folks who oversell - but then again the company you work for is (hopefully) there to make money. The Sales folks are the "rainmakers" so the best you can hope for is to build a constructive relationship whereby they consult with you about what's possible and what's a stretch.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) Doing the things we don't like: We have meetings because they're needed&lt;/span&gt;&lt;br /&gt;I know meetings interrupt your favorite activity - coding - but they really can't be helped in some cases. I need to know that you're aware of what's going on - frankly I have very little insight into how things are going until things are nearly done.&lt;br /&gt;&lt;br /&gt;Fortunately as a now sometimes-developer I use tools like FindBugs, PMD, Checkstyle etc. to check on the code and use Unit Tests and Code Coverage to see how's the quality roughly holding up. But all those are proxies for the real thing - the quality of the product from a user's perspective.&lt;br /&gt;&lt;br /&gt;So how else can I quickly get to know how things are going - meetings. Sorry!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Information Overload II: I can't be expected to remember EVERYTHING.&lt;/span&gt;&lt;br /&gt;I forgot we promised to meet to talk about "that" question. I wanted to put a reminder in Outlook but I got interrupted twice and then I was called to my boss's office - I forgot.  Be gentle on your manager - they're really trying (or should be)  - if I make a mistake let me know.  Keep us in the loop - just find the right moment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Information Overload III: Hold off on the details - First tell me why I should be concerned&lt;/span&gt;&lt;br /&gt;Developers come in all shapes and sizes - there are the ones who bottle up all information, stay heads down in the cube and only come out when they're done. The scary thing there is you don't know they're done until  . . . . well . . . they're done.  I can manage that one pretty easily - I try to "ping" people and check-in. Hopefully not too often.&lt;br /&gt;&lt;br /&gt;The other side are the developers who think you want to know every piece of minutiae and that you understand the impact - for example:&lt;br /&gt;&lt;br /&gt;Developer: "So you know that new Finder class team X implemented? Well they created a new Factory method which isn't thread-safe. I mean they're nuts don't they know that our thread pool will etc. etc. . "&lt;br /&gt;&lt;br /&gt;Manager (who was deep in figuring out critical dependencies in the project plan): (thinking)&lt;thinking&gt; is he gonna think I'm a moron if I say "Huh?"&lt;/thinking&gt;&lt;br /&gt;&lt;br /&gt;It's better to say what the impact is and hold off on the details e.g.&lt;br /&gt;"I think our new multi-user scenarios are going to have some problems with the new code from team X".&lt;br /&gt;&lt;br /&gt;That gets to the point (there's a problem) and stops me from having to think too hard (why should I care about thread safety in a particular class) - you should be able to tell from the smoke already coming out of my ears? :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) It's not all about you (the developer)&lt;/span&gt;&lt;br /&gt;I was guilty of this one for a while when I was just a devleoper. I really thought that of all the issues faced by the team mine were the most significant.  I'd get peeved when issues I felt were important were being ignored. But the reality was I wasn't aware of  many of the points listed above.  Wow, perspective is everything.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) It's good to be the King&lt;/span&gt;&lt;br /&gt;No it's REALLY good :-)   Previously as an Architect or lead software engineer I had a position of influence but little power. Now I have people reporting to directly to me. I control their reviews, their raises, how much they work and how late, which project is next.  I still consider myself an "Architect" at heart and I love being in the code - but it's nice; knowing the technology, how developers are often motivated etc. and now to finally REALLY have a big say in what gets done and how.&lt;br /&gt;&lt;br /&gt;For example, there's some really complex code we've written lately - quite fragile unfortunately due to it's (necessary?) complexity.  As the developer I probably would be too lazy to write the full set of unit tests or wouldn't have the time. As the architect I'd know that we need to do that but very often I could never convince the project manager to let the developer spend the time.  Now I'm project manager and can read the code coverage numbers as well as know many of the user scenarios.&lt;br /&gt;&lt;br /&gt;So I had the developer write about 40 unit tests covering a very comprehensive range of scenarios. It took about a month to get them all done (ouch!). But in the process we actually found three new bugs. Ultimately though we've mitigated a lot of risks that were in that component.&lt;br /&gt;&lt;br /&gt;Now when new bugs come in from the field or from QA, we fix them more quickly and then we can quickly re-run the unit test suite.  We also add unit tests for that new test case we just discovered. Now I as a manager I know when the unit tests run green - that despite the code complexity, we're in pretty good shape from a risk/quality point of view.&lt;br /&gt;&lt;br /&gt;It's a balance of course - we've discovered more unit tests we need to write for this component (based on how our users are using it in beta) but we're under the gun for the next few weeks in another area so we'll get to it - but not yet.&lt;br /&gt;&lt;br /&gt;It's also good when it comes to hiring time - too few managers know how to spot a good developer - having been a developer and spent a good deal of time on screening questions and interview techniques I feel that I and the team are pretty good at identifying strong folks.  I usually do the screening so that the developer's on my team only spend time interviewing really strong candidates who don't just "talk the talk" or have keyword-heavy resumes and don't really have the talent to back it up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Postscript:&lt;/span&gt; I'll also write an article coming from the other perspective - things that developers wish managers knew.&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=4EeWiw1ZEbQ:AxfFcS1Q3Ko:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=4EeWiw1ZEbQ:AxfFcS1Q3Ko:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=4EeWiw1ZEbQ:AxfFcS1Q3Ko:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=4EeWiw1ZEbQ:AxfFcS1Q3Ko:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=4EeWiw1ZEbQ:AxfFcS1Q3Ko:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/4EeWiw1ZEbQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/1442874613395537871/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=1442874613395537871" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/1442874613395537871?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/1442874613395537871?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/4EeWiw1ZEbQ/ten-things-developers-would-know-if.html" title="10 things Project Managers wish Developers understood" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>9</thr:total><feedburner:origLink>http://softarc.blogspot.com/2008/02/ten-things-developers-would-know-if.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQBSH0yeip7ImA9WB9VEkw.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-2712446503800831949</id><published>2007-11-27T19:37:00.000-05:00</published><updated>2007-11-27T19:39:19.392-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-27T19:39:19.392-05:00</app:edited><title>Agile Programming in a nutshell</title><content type="html">&lt;a href="http://www.dilbert.com/comics/dilbert/archive/dilbert-20071126.html"&gt;See this Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When Dilbert mocks you, you know you're mainstream! :-)&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=d8167OdZ6wg:ajH7KFrCb2I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=d8167OdZ6wg:ajH7KFrCb2I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=d8167OdZ6wg:ajH7KFrCb2I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=d8167OdZ6wg:ajH7KFrCb2I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=d8167OdZ6wg:ajH7KFrCb2I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/d8167OdZ6wg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/2712446503800831949/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=2712446503800831949" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/2712446503800831949?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/2712446503800831949?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/d8167OdZ6wg/agile-programming-in-nutshell.html" title="Agile Programming in a nutshell" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2007/11/agile-programming-in-nutshell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QMQ30_eSp7ImA9WB5bEE0.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-3117888585712621999</id><published>2007-08-24T22:26:00.001-04:00</published><updated>2007-08-24T22:36:22.341-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-24T22:36:22.341-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="J2ee" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="documentation" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Architect" /><category scheme="http://www.blogger.com/atom/ns#" term="XML" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>My Favorite Java and Software Engineering Articles</title><content type="html">Here they are - a collection of quite a number (250+) of the many online articles on Java, Software engineering (architecture, the development process), XML etc. that I've read over the last years - probably going back to 2001.  I've included a URL and a personal score (on a scale of 1 to 5 with 5 being awesome).&lt;br /&gt;&lt;br /&gt;I hope you'll find this useful - some of these articles took quite a bit of digging to find but were well worth the effort.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://spreadsheets.google.com/pub?key=prCSPRhj1PCGuYZvjEITgXw&amp;output=html"&gt;http://spreadsheets.google.com/pub?key=prCSPRhj1PCGuYZvjEITgXw&amp;amp;output=html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Please feel free to shoot any comments, edits, suggested additions (or deletions?).  Because the underlying spreadsheet is on Google Docs (love it!) it will get updated on a semi-regular basis as the reading list continues to expand.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=gbaTBWKZxWA:yG63O0pSnuI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=gbaTBWKZxWA:yG63O0pSnuI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=gbaTBWKZxWA:yG63O0pSnuI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=gbaTBWKZxWA:yG63O0pSnuI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=gbaTBWKZxWA:yG63O0pSnuI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/gbaTBWKZxWA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/3117888585712621999/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=3117888585712621999" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3117888585712621999?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/3117888585712621999?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/gbaTBWKZxWA/my-favorite-java-and-software.html" title="My Favorite Java and Software Engineering Articles" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://softarc.blogspot.com/2007/08/my-favorite-java-and-software.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IARHY8fCp7ImA9WB5VFEg.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-6895287021652367208</id><published>2007-08-06T20:46:00.000-04:00</published><updated>2007-08-06T21:52:25.874-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-06T21:52:25.874-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="standards" /><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>4 reasons it sucks to be in QA</title><content type="html">Well that's my take on it folks - of all the roles in the Software Development Life Cycle probably QA has it worst.  Managers, Architects, Developers, Business analysts - no-one takes as much BS or has such a thankless role as the valiant folks in your average QA team.&lt;br /&gt;&lt;br /&gt;Now I hope most of you reading this will disagree but I'm betting there's a lot of nodding heads out there (probably mostly from folks in QA).&lt;br /&gt;&lt;br /&gt;What are the main reasons for this you say? There are four as I see it:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Respect&lt;/span&gt;&lt;br /&gt;QA tends not to get respect from people in other roles - but most especially and most oddly the least respect (most disrespect) comes from software developers.  Personally I find this strange that developers have such disrespect (sometimes even open and outright disdain) for those tasked with ensuring the quality of the product being delivered.&lt;br /&gt;&lt;br /&gt;I think a lot of developer frustration comes from the questions and problems that arise out of the QA team/group.  Yes, often QA folks don't understand the ins and outs of an application.   If that's because someone in QA doesn't want to learn then that's a worthwhile beef but more often than not the QA team are &lt;span style="font-weight: bold; font-style: italic;"&gt;STARVING &lt;/span&gt;for information.&lt;br /&gt;&lt;br /&gt;Often they're brought in at the last minute, given a vague, incomplete and out-of-date spec and told "&lt;span style="font-style: italic;"&gt;Hey go test this!&lt;/span&gt;".  Yes the developers had the same spec and were told "&lt;span style="font-style: italic;"&gt;Hey go code this!&lt;/span&gt;" but they're finished building out the app so they've (hopefully)  fleshed it all out at least in their heads and in the software they've built.&lt;br /&gt;&lt;br /&gt;Developers deride the QA role - "&lt;span style="font-style: italic;"&gt;What do those guys know? They're just testers!&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;That's just the wrong attitude. These guys and gals are the ones who, at the least are helping to make the product (not code folks - product!) better, and at best saving your ass from being fired for shoddy work. You and they are on the same team though you may not realize it. Try to remember that.&lt;br /&gt;&lt;br /&gt;Another reason that I feel developers beat on QA is that the developers get beat on themselves (think Dilbert) and like some bullied kids they look to take it out on the only one's they can - someone weaker - not managers, not architects, not the business analysts, not other developers - who's left? QA!&lt;br /&gt;&lt;br /&gt;I've seen it many-a-day - the self-righteous attitude developers take in correcting QA or better yet informing them that their "bug" won't be fixed because it "works as designed" or they spent 5 seconds trying to reproduce the bug and could not.&lt;br /&gt;&lt;br /&gt;I'm not saying "works as designed" or "unable to reproduce" are a bad reason to kill a bug - just the attitude that goes with it.  Call the tester - explain why it works that way - should the docs be updated to make that clear? Possibly!  If you can't reproduce a bug maybe there's some context or other missing information - maybe it's particular to the tester's environment. Just blowing things like that off might make a developer feel good but it diminishes the overall product and the team too. Take the time to do it right - a phone-call or walk-by will take 5 minutes at most.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Responsibility vs. Power&lt;/span&gt;&lt;br /&gt;The QA team have a very important responsibility - they are the gatekeepers of product quality.  At least in theory anyway!  Also quality is a hard thing to identify or quantify.  Is it the overall user experience, the number of bugs, the number of critical bugs, how do you define "critical"?  Just too many subjective things. Oh and usually they're understaffed and/or under-tooled.&lt;br /&gt;&lt;br /&gt;However for all this responsibility they have the least power. In the hierarchy of management structures QA comes pretty much last.&lt;br /&gt;&lt;br /&gt;Everyone else thinks they can do the QA job - how hard can it be? But the reality is very few people can do QA right. And especially &lt;span style="font-weight: bold; font-style: italic;"&gt;not &lt;/span&gt;developers! We are our own worst enemies in this case - we use the application like we coded it not like it was meant to be used.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Last to be hired and First to be fired&lt;/span&gt;&lt;br /&gt;In the boom and bust cycle of software QA folks seem to be the last to be hired - usually towards the end of the boom when all your new customers start to complain about the bugs from all the newbies you hired at the start of the boom.  But then when the bust inevitably comes QA folks are first on the chopping block followed by middle managers. No wonder there aren't many experienced QA folks about - again it's a widespread lack of understanding of the importance of QA and testing in the software process.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Paradox of excellence&lt;/span&gt;&lt;br /&gt;The "Paradox of excellence" is something we're all familiar with but may not know it.  Since the art of software (it ain't engineering or science yet) is not well understood, few outside of software can understand how hard it is to do software "right" - with few bugs.  It takes a long time. Therefore when software is done right people don't perceive the absence of bugs - they just see that the process seemed to take forever to complete.&lt;br /&gt;&lt;br /&gt;Basically the "paradox of excellence" states that you don't get credit for problems that never happened.  Typically in the normal software shop when bugs happen and they are fixed fast by developers the developer gets kudos. Who gets kudos for the lack of bugs in a release? No-one.&lt;br /&gt;&lt;br /&gt;So if QA does their job right - no-one notices. The same is true for developers to an extent but they can usually redeem themselves if and when bugs do show up. QA have no such opportunity - if they *do* spot issues they becomes "spoilers" for the party giving the bad news no-one wants to hear.&lt;br /&gt;&lt;br /&gt;With those four issues facing you as a person in QA - lack of respect, little power, no praise, fear of being laid off,  how much motivation would you have every day?&lt;br /&gt;&lt;br /&gt;In my opinion a rock solid QA person is one of the most critical roles on a project. In fact in my experience the best QA people know the application better than the developers, the managers, the analysts and even the users. They know the ins and outs - breadth and depth and know where most of the bugs pop-up! I wish most developers were so aware.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solutions?&lt;/span&gt;&lt;br /&gt;How do we resolve this problem for folks in QA? There are two steps - the first easy and the second not so much:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Co-locate QA and Developers&lt;/span&gt;&lt;br /&gt;Have developers and QA sit side-by-side and work together closely throughout the entirety of the software lifecycle.   Make them truly part of the team!  Have lunch together!&lt;br /&gt;&lt;br /&gt;Physical separation of QA from the dev team is a bad idea.  Having separate reporting structures for Dev and QA might be good since having same reporting structure creates a little "conflict of interest" - management understandably want good news, QA are rarely bearers of good news - but it's news that needs to be heard!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Developers and management need to snap out of it!&lt;/span&gt;&lt;br /&gt;Frankly this treatment of folks in QA is one of those little "secrets" in software that we should be ashamed of if we consider ourselves to be "professionals" in the true sense of the word.&lt;br /&gt;&lt;br /&gt;Developers and management need to respect the critical role of QA, the complexity of their job and most of all to drop by their cubes and say thank you for all their hard work they do without much praise - day-in, day-out. Your product is better for it, the industry is better for it (and could do with much more of it) and thus the rest of us managers, architects and developers are better for it.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=OF79Fr2NGTI:al9rsXg970I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=OF79Fr2NGTI:al9rsXg970I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=OF79Fr2NGTI:al9rsXg970I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=OF79Fr2NGTI:al9rsXg970I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=OF79Fr2NGTI:al9rsXg970I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/OF79Fr2NGTI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/6895287021652367208/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=6895287021652367208" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/6895287021652367208?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/6895287021652367208?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/OF79Fr2NGTI/4-reasons-it-sucks-to-be-in-qa.html" title="4 reasons it sucks to be in QA" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>12</thr:total><feedburner:origLink>http://softarc.blogspot.com/2007/08/4-reasons-it-sucks-to-be-in-qa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQGQHY8fyp7ImA9WB5XGEQ.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-4573612917311138305</id><published>2007-07-19T21:39:00.000-04:00</published><updated>2007-07-19T21:52:01.877-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-19T21:52:01.877-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="trends" /><category scheme="http://www.blogger.com/atom/ns#" term="Career" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>Another Google first - missed estimates - hiring to slow - share price drops 7%</title><content type="html">Looks like Google just missed analysts estimates on EPS (see &lt;a href="http://www.marketwatch.com/news/story/google-earnings-jump-second-quarter/story.aspx?guid=%7B2252586E%2D8640%2D4076%2D8A9F%2D9E798C332FF2%7D"&gt;article here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Key Quote&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;In the conference call, CEO Eric Schmidt admitted that one area the company exceeded its expense plan was in hiring, which added more than 1,500 workers to the payroll during the quarter.&lt;/span&gt;  &lt;span style="font-style: italic;"&gt;"We are very pleased with the talent that we've brought on board, but going forward we will watch this area very closely," he said.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;This is one of the key downsides to being a public company it's very hard to "surge" and take some time to build now for the future by hiring as many great people as you can.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;That said with every other measure (revenue, operating income etc.) on the up-and-up Google is the still the one to beat.&lt;br /&gt;&lt;br /&gt;In other news it looks like Yahoo! is having &lt;a href="http://www.marketwatch.com/news/story/yahoo-shares-down-2-following/story.aspx?guid=%7BDC4DF226-0C6E-4558-BAA1-6B8992EC34B1%7D"&gt;a very tough time&lt;/a&gt; and &lt;a href="http://www.mercurynews.com/business/ci_6410761"&gt;now there is talk&lt;/a&gt; (again) of Microsoft buying them.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=b-2vTPLJkbE:6KP-b391YPM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=b-2vTPLJkbE:6KP-b391YPM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=b-2vTPLJkbE:6KP-b391YPM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=b-2vTPLJkbE:6KP-b391YPM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=b-2vTPLJkbE:6KP-b391YPM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/b-2vTPLJkbE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/4573612917311138305/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=4573612917311138305" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/4573612917311138305?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/4573612917311138305?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/b-2vTPLJkbE/another-google-first-missed-estimates.html" title="Another Google first - missed estimates - hiring to slow - share price drops 7%" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://softarc.blogspot.com/2007/07/another-google-first-missed-estimates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEGQHczfip7ImA9WB5WE0o.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-2500271356810896867</id><published>2007-07-19T21:11:00.000-04:00</published><updated>2007-07-25T10:27:01.986-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-25T10:27:01.986-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="users" /><category scheme="http://www.blogger.com/atom/ns#" term="usability" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Architect" /><category scheme="http://www.blogger.com/atom/ns#" term="trends" /><category scheme="http://www.blogger.com/atom/ns#" term="software architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="software development process" /><title>Are Agile methods detrimental to your design?</title><content type="html">InfoQ has an interesting article entitled &lt;a href="http://www.infoq.com/news/2007/07/AgileBadForDesign"&gt;Are Agile Development Practices Detrimental to Architecture and Design?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've said it before and will say it again &lt;a href="http://softarc.blogspot.com/2006/05/tanstaafl.html"&gt;TANSTAAFL&lt;/a&gt; - &lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;here &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;in't &lt;span style="font-weight: bold;"&gt;N&lt;/span&gt;o &lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;uch &lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;hing &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;s &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;F&lt;/span&gt;ree &lt;span style="font-weight: bold;"&gt;L&lt;/span&gt;unch (with thanks to &lt;a href="http://en.wikipedia.org/wiki/TANSTAAFL"&gt;Robert Heinlein&lt;/a&gt;).  You can't expect to suddenly change to run an Agile project (e.g. using Scrum / XP) and expect miracles - that is a gain to your project without any associated pain or cost.&lt;br /&gt;&lt;br /&gt;My feeling has always been that with Agile development you need quite senior people who can run the project fine without the heavier and better known "structure" of traditional processes. Also you'll hope that they'll pay attention to key architectural and design issues without a traditional BDUF architectural or design phase.&lt;br /&gt;&lt;br /&gt;But regardless of the type of process you choose (BDUF vs Agile) there are three people (or three roles) you need on your project for long-term success that is release-after-release year-after-year.&lt;br /&gt;&lt;br /&gt;You need&lt;br /&gt;1) &lt;span style="font-weight: bold;"&gt;Someone who knows either the vertical area&lt;/span&gt; (e.g. Financial Trading Systems or the Retail sector or Cell Phone advertising) and where that field of expertise is going (e.g. more analytics for trading systems, SaaS / ASP models for Retail).&lt;br /&gt;&lt;br /&gt;You also need&lt;br /&gt;2) &lt;span style="font-weight: bold;"&gt;Someone who knows the users&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;and their likes / dislikes &lt;/span&gt;( e.g. they like responsiveness and  dislike overly flashy apps but may be amenable to Web 2.0 technologies such as twitter more easily) also if there are any key users to watch for (e.g. head traders or your CEO's best friend!)&lt;br /&gt;&lt;br /&gt;And finally&lt;br /&gt;3) &lt;span style="font-weight: bold;"&gt;Someone who understands what all of that means for the Technical Architecture and Design&lt;/span&gt;&lt;br /&gt;and who can create a roadmap to get there . . . . .&lt;br /&gt;&lt;br /&gt;Where do you find such folks on your team?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;#1 and #2 are typically Product / Project Managers / Business Analysts&lt;/li&gt;&lt;li&gt;#3 is typically the "Architect" / Technical Team Lead for the project&lt;/li&gt;&lt;/ul&gt;The key value to Agile is getting to market quickly - combine that with talented senior people who are good at numbers 1,2 , and 3 and you've got this key architecture/design issue mitigated to a large degree. That said, it does depend on the little issue about predicting the future accurately! But so does all software architecture and design.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=VZo7qXplJ84:6NonDM0h8G0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=VZo7qXplJ84:6NonDM0h8G0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=VZo7qXplJ84:6NonDM0h8G0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=VZo7qXplJ84:6NonDM0h8G0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=VZo7qXplJ84:6NonDM0h8G0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/VZo7qXplJ84" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/2500271356810896867/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=2500271356810896867" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/2500271356810896867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/2500271356810896867?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/VZo7qXplJ84/are-agile-methods-detrimental-to-your.html" title="Are Agile methods detrimental to your design?" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://softarc.blogspot.com/2007/07/are-agile-methods-detrimental-to-your.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8BQHc8cSp7ImA9WB5XGEQ.&quot;"><id>tag:blogger.com,1999:blog-28150884.post-8833316466016613718</id><published>2007-07-19T21:06:00.000-04:00</published><updated>2007-07-19T21:10:51.979-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-19T21:10:51.979-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="SOA" /><category scheme="http://www.blogger.com/atom/ns#" term="ajax" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="Web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="code quality" /><category scheme="http://www.blogger.com/atom/ns#" term="RIA" /><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="XML" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="trends" /><category scheme="http://www.blogger.com/atom/ns#" term="messaging" /><title>Forget SQL Injection you need to watch for XML Injection</title><content type="html">With all the XML flying around these days (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SOA&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ESB&lt;/span&gt; and Ajax) you need to be ever more vigilant.&lt;br /&gt;&lt;br /&gt;Check out this article from &lt;a href="http://www.ibm.com/developerworks"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;DeveloperWorks&lt;/span&gt;&lt;/a&gt; entitled  &lt;a href="http://www.ibm.com/developerworks/xml/library/x-xpathinjection.html"&gt;Avoid the dangers of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;XPath&lt;/span&gt; Injection&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now more than ever validate your inputs!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=PVWYpMV_3ro:dr6V8lCq5Do:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=PVWYpMV_3ro:dr6V8lCq5Do:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=PVWYpMV_3ro:dr6V8lCq5Do:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?a=PVWYpMV_3ro:dr6V8lCq5Do:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment?i=PVWYpMV_3ro:dr6V8lCq5Do:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~4/PVWYpMV_3ro" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softarc.blogspot.com/feeds/8833316466016613718/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=28150884&amp;postID=8833316466016613718" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8833316466016613718?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28150884/posts/default/8833316466016613718?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheArtAndCraftOfGreatSoftwareArchitectureAndDevelopment/~3/PVWYpMV_3ro/forget-sql-injection-you-need-to-watch.html" title="Forget SQL Injection you need to watch for XML Injection" /><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://softarc.blogspot.com/2007/07/forget-sql-injection-you-need-to-watch.html</feedburner:origLink></entry></feed>
