<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-28150884</id><updated>2009-12-03T13:32:12.025-05:00</updated><title type='text'>The Art and Craft of Great Software Architecture and Development</title><subtitle type='html'>My thoughts on best practices in software architecture and development as a whole (with an emphasis on Java/J2EE).</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default?start-index=26&amp;max-results=25'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>77</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-7900019294427574447?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/7900019294427574447'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/12/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-8507499506738918915?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/8507499506738918915'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/12/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><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><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-3931679271275044053?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/3931679271275044053'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/11/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-8550842802014971640?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/8550842802014971640'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/08/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></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 xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><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><title type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-8369215021211162674?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/8369215021211162674'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/07/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-3896554525527608056?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/3896554525527608056'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/06/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-5797751823502466694?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/5797751823502466694'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/03/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-6164026269193910739?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/6164026269193910739'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/03/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><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><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><title type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-7974980921007532843?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/7974980921007532843'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/02/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>10</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-1442874613395537871?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=1442874613395537871' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/1442874613395537871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/1442874613395537871'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2008/02/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><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><title type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-2712446503800831949?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/2712446503800831949'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/11/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-3117888585712621999?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/3117888585712621999'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/08/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-6895287021652367208?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=6895287021652367208' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/6895287021652367208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/6895287021652367208'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/08/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>11</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-4573612917311138305?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/4573612917311138305'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/07/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-2500271356810896867?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/2500271356810896867'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/07/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><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><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 type='text'>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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-8833316466016613718?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&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='https://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'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/8833316466016613718'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/07/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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-9137289588942564256</id><published>2007-07-13T18:01:00.000-04:00</published><updated>2008-12-12T02:45:20.729-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>A little Java puzzler</title><content type='html'>Alright here's a little Java puzzler - not on the order of Josh Bloch but still I'm surprised how such a simple problem can give me such a headache . . . . .&lt;br /&gt;&lt;br /&gt;I know several ways to solve it (probably those that are the most obvious ones) but I'm hoping others can see a more elegant / less hacky solution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Perhaps there's a really embarrassingly obvious answer but after several interrupted nights of sleep due to our newborn I'm just not seeing it)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The issue at hand is we want to perform a business operation and keep track (in memory) of the job's state. It's not critical that the job succeed but it is &lt;span style="font-weight: bold; font-style: italic;"&gt;ABSOLUTELY &lt;/span&gt;critical that we record the state of the Job correctly.&lt;br /&gt;&lt;br /&gt;So first off here is some pseudocode:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;Set Job Status to "New"&lt;/span&gt;  &lt;span style="font-family:courier new,monospace;"&gt;&lt;br /&gt;Start Job&lt;/span&gt; &lt;span style="font-family:courier new,monospace;"&gt;&lt;br /&gt;If job fails set status to "Failed"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;If job succeeds set status to "Success"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Simple right? Well the problem comes in when you have exception handling so here's a quick first cut of the code that I wrote&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Version #1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_GSG-oO6BfdY/Rpp1V3JuA1I/AAAAAAAAAAM/zMXzbj5ZWEE/s1600-h/version1.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_GSG-oO6BfdY/Rpp1V3JuA1I/AAAAAAAAAAM/zMXzbj5ZWEE/s320/version1.JPG" alt="" id="BLOGGER_PHOTO_ID_5087507747510813522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Clearly I'd want to store / log why things failed but let's not worry about that for the moment.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Anyway so that's pretty simple, and looks correct, but wait - what if an &lt;span style="font-weight: bold;"&gt;un&lt;/span&gt;checked exception is thrown. I really don't want to catch &lt;span style="font-family:courier new;"&gt;RuntimeException &lt;/span&gt;(let's not even thing about catching an Error / &lt;span style="font-family:courier new;"&gt;Throwable&lt;/span&gt;) .&lt;br /&gt;&lt;br /&gt;So perhaps I add a finally block - so that if the status is still "NEW" then clearly an exception was thrown that was not the Checked exception.&lt;br /&gt;&lt;br /&gt;So here's &lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Version #2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_GSG-oO6BfdY/Rpp2CXJuA2I/AAAAAAAAAAU/BXVk3het_4Y/s1600-h/version2.JPG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_GSG-oO6BfdY/Rpp2CXJuA2I/AAAAAAAAAAU/BXVk3het_4Y/s400/version2.JPG" alt="" id="BLOGGER_PHOTO_ID_5087508512014992226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But that looks so hacky and also someone reading the code is really going to have to think about it to see if all paths are appropriate (as compared to the pseudocode which is "obviously" right).&lt;br /&gt;&lt;br /&gt;True I could mimic the pseudocode outlined above and catch any exceptions in the &lt;span style="font-family: courier new;"&gt;launchJob()&lt;/span&gt; method (including RuntimeException?) to get code as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Version #3&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GSG-oO6BfdY/Rpp2eHJuA3I/AAAAAAAAAAc/1unGvp6iffw/s1600-h/version3.JPG"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_GSG-oO6BfdY/Rpp2eHJuA3I/AAAAAAAAAAc/1unGvp6iffw/s400/version3.JPG" alt="" id="BLOGGER_PHOTO_ID_5087508988756362098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;but perhaps as the caller of &lt;span style="font-family: courier new;"&gt;launchJob()&lt;/span&gt; I am not aware of the catching of all those Exceptions (including Runtime?) in the method (say it's some vendor / 3rd party / external API) and so I go back to wrapping again but this time without the catch block&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Version #4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_GSG-oO6BfdY/Rpp21HJuA4I/AAAAAAAAAAk/M7FNM_3qgJw/s1600-h/version4.JPG"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_GSG-oO6BfdY/Rpp21HJuA4I/AAAAAAAAAAk/M7FNM_3qgJw/s400/version4.JPG" alt="" id="BLOGGER_PHOTO_ID_5087509383893353346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A little cleaner but still - the pseudocode is the cleanest of all - why can't I map it to Java more easily and not worry about possible Exceptions and the resulting ugly code?&lt;br /&gt;&lt;br /&gt;Thoughts? Suggestions?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(p.s. this problem highlights for me one of the key issues developers must face that isn't talked about much - not just solving the abstract problem - for me the solution to that is the pseudocode - but here the hard issue is mapping the solution to a language and understanding the behavior of that language - exception handling, how unchecked exception work etc.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-9137289588942564256?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/9137289588942564256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=9137289588942564256' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/9137289588942564256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/9137289588942564256'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/07/little-java-puzzler.html' title='A little Java puzzler'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_GSG-oO6BfdY/Rpp1V3JuA1I/AAAAAAAAAAM/zMXzbj5ZWEE/s72-c/version1.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-2204199869178862424</id><published>2007-07-04T11:02:00.000-04:00</published><updated>2007-07-06T14:41:59.242-04:00</updated><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='code quality'/><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='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Java Worst Practices</title><content type='html'>We've all read those "&lt;a href="http://www.javapractices.com/index.cjp"&gt;best practices&lt;/a&gt;" articles which are great and useful.  But after the good reaction to my "&lt;a href="http://softarc.blogspot.com/2007/06/exception-handling-anti-patterns.html"&gt;Java Exception Handling Anti-Patterns&lt;/a&gt;" article I thought I'd continue on in the same vein - things NOT to do.&lt;br /&gt;&lt;br /&gt;So here's a list of "worst" practices - the things I see many-a-day that are particular pet peeves of mine. Frankly I've made these mistakes myself quite often when I was less experienced so they've become a kind of personal checklist for my own code as well as for that of others. I've touched on some of these issues &lt;a href="http://softarc.blogspot.com/2006/11/structural-anti-patterns-in-code.html"&gt;before&lt;/a&gt; but have added some more and drilled-in a little more.&lt;br /&gt;&lt;br /&gt;Of course these days I use my code checking tool trifecta (&lt;a href="http://checkstyle.sourceforge.net/"&gt;Checkstyle&lt;/a&gt;/&lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;/&lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt;) to do it faster and more reliably but still it's good to stay sharp and do it manually every so often.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Exception Handling I: poor catch blocks&lt;/span&gt;&lt;br /&gt;See the blog entry "&lt;a href="http://softarc.blogspot.com/2007/06/exception-handling-anti-patterns.html"&gt;Java Exception Handling Anti-Patterns&lt;/a&gt;"  for a number of such anti-patterns. How to handle errors correctly is critical and not altogether that easy in Java (thus the whole checked vs. unchecked exceptions debate IMHO)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Exception Handling II: missing or bad finally blocks&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If a finally block is absent in a try{}catch{} combo, is one needed to release resources?&lt;/li&gt;&lt;li&gt;Is there an exception thrown in the finally block that bubbles out? Talk about cause for confusion when reading the code!&lt;/li&gt;&lt;li&gt;Is there a return inside a finally block? Talk about &lt;span style="font-weight: bold;"&gt;even more&lt;/span&gt; cause for confusion!&lt;/li&gt;&lt;li&gt;Do you have returns &lt;span style="font-weight: bold;"&gt;*AND* &lt;/span&gt;uncaught exceptions in your finally block? Check &lt;a href="http://weblogs.java.net/blog/staufferjames/archive/2007/06/_dont_return_in.html"&gt;this link out&lt;/a&gt;.  Exceptions that just disappear into the aether?  Yikes! I'd guess 90% of developers (including myself) got that wrong.&lt;/li&gt;&lt;li&gt;If there are multiple methods called in a finally block, and any of them can throw an exception, will the other methods get called e.g.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;finally{&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;try{ &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;  if(obj1!=null) obj1.close(); &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;  if(obj2!=null) obj2.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;   catch(SomeException ignored) {&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this case if an exception was thrown when closing obj1, then obj2 would not be closed creating some problem such as a memory leak.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Logging&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Too little? App crashes and there's nothing in the log file.&lt;/li&gt;&lt;li&gt;Too much? App crashes and you need to plow through a 5 GB log file (just for that day!)&lt;/li&gt;&lt;li&gt;Wrong level - debug vs. info vs. warn vs. fatal?&lt;/li&gt;&lt;li&gt;Same log entry repeated many times&lt;/li&gt;&lt;li&gt; Using Exception p&lt;span style="font-family:courier new;"&gt;rintStackTrace()&lt;/span&gt; - Do not use printStackTrace except for the simplest programs - use you logger and   &lt;span style="font-family:courier new;"&gt;log.error("Some Text Here",e);&lt;/span&gt; to log that important and all-too-helpful stack trace information information to your log file for posterity.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Classes / Methods too big&lt;/span&gt;&lt;br /&gt;Big classes and big methods become inevitable complexity sinks - the code becomes very very hard to maintain. Create utility classes, break-up the functionality - do some refactoring to make it easier to use, extend, adapt and especially debug!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5)  Comments in code&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Too little?&lt;/li&gt;&lt;li&gt;Too much?&lt;/li&gt;&lt;li&gt;Comments which are no longer relevant or are out-of-date with respect to the code&lt;/li&gt;&lt;li&gt;Comments which are useless/redundant e.g.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;     //set number of accounts to zero&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt; numAccounts=0;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;FYI some best practices in this area are listed &lt;a href="http://en.wikipedia.org/wiki/Comment_%28computer_programming%29#Code_description"&gt;here on Wikipedia&lt;/a&gt;. Most notably:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Comment why not what - make your intent clear.&lt;/li&gt;&lt;li&gt;Make your comments the code - if your comments are clearer than your code make your code look like the comments.&lt;/li&gt;&lt;/ul&gt;For example here's a pattern typical of code I often find in a review (even of my own code)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;//check system Ok for startup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(switch1 &amp;&amp;amp; switch2 &amp;&amp;amp; (switch3 || switch4))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;now replace that but  as follows and drop the comment&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(isSystemOkForStartup(switch1,switch2,switch3,switch4))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;n&lt;span style="font-family:georgia;"&gt;ow you've got a nice utility method that you can re-use plus one less comment which means one less place where you have to keep the comments in synch with the code&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;6) Switch Statements&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Missing &lt;span style="font-family:courier new;"&gt;default: &lt;span style="font-family:georgia;"&gt; - just put something in there even if it's a &lt;span style="font-family:courier new;"&gt;log.warn("This should never happen");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Missing &lt;span style="font-family:courier new;"&gt;break;&lt;/span&gt;  and the resulting "fall through". God those bugs can be nasty to track down.&lt;/li&gt;&lt;/ul&gt;I usually write the "default" first to make sure it gets in there and try to give visual cues to highlight missing breaks like trying to line them all up vertically.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) catching &lt;span style="font-family:courier new;"&gt;java.lang.Throwable&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There's a few cases where I think this is OK . . . .  okay just one . . .  wrapping a complete application with this so you can &lt;span style="font-family:courier new;"&gt;log.error()&lt;/span&gt; / &lt;span style="font-family:courier new;"&gt;System.out.println()&lt;/span&gt; if something bad happened that for some reason wasn't handled.&lt;br /&gt;&lt;br /&gt;But apart from that,  exactly what do you plan to do with &lt;span style="font-family:courier new;"&gt;VirtualMachineError &lt;/span&gt;or &lt;span style="font-family:courier new;"&gt;OutOfMemoryError&lt;/span&gt;? Just carry on?!?!?!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8) Using exceptions as flow control&lt;/span&gt;&lt;br /&gt;Sigh! It still happens every so often.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9) Not removing commented out code or unused classes&lt;/span&gt;&lt;br /&gt;I've done it myself but usually I open a bug report to myself to take it out (eventually). Sometimes it's hard - you've written some good code that you might use some day just not now and you want it in there - but hey that's what Source Code Control is for.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10) Complex code with no unit tests&lt;/span&gt;&lt;br /&gt;Don't even get me started!  Yeah yeah I know the refrain - we don't have time but come on - a few unit tests? Please!?!?!? Just some happy-path cases?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;11) Duplicate Code&lt;/span&gt;&lt;br /&gt;We've all done it - we just need to make sure we undo it - refactor!  If you've got production code and 1 or 2 dupes  I can make an exception. 44 not so much (trust me I've seen it!). Oh and the excuse here - "Well we've got 44 separate JSP files" - turns out it was really one JSP file with some parameterized pieces of code. About 5000 lines suddenly became 250.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;12) In multi-threaded code, using &lt;span style="font-family:courier new;"&gt;Object.wait()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;That is the call to wait with no timeout - so the user or calling application can just wait forever eh?  Oh and the bugs it causes - your code just sits there "dead", there's nothing whatsoever in the log file and then you've got to find the one thread in your 500 with the endless wait.&lt;br /&gt;&lt;br /&gt;Every time I get one of these I cringe, cancel family vacations, hunker down and get stuck in.&lt;br /&gt;&lt;br /&gt;By using a timeout you force yourself to think about what is a reasonable thing in most cases - what if that shared resource is simply not available? If you don't do this, effectively you just expect "the other guy" to worry about giving it back and abdicate your own responsibility.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;13) Coding Standards that are directly in contradiction to accepted and known Java  standards.&lt;/span&gt;&lt;br /&gt;For example - not only &lt;span style="font-weight: bold; font-style: italic;"&gt;allowing &lt;/span&gt;class names to start with lower case letters but &lt;span style="font-weight: bold; font-style: italic;"&gt;ENFORCING&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;it (yup - been there)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;14) Enforcement of Coding Standards that is overly picky&lt;/span&gt;&lt;br /&gt;I could pick an example (e.g. placement of braces, tabs vs. spaces) but I'd probably evoke a bazillion flames!  Oh and best of all - often these rules are enforced before important things like unit tests, code coverage - those things related to code that works!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;15)  Overuse of XML&lt;/span&gt;&lt;br /&gt;For example - storing XML in a database and then wondering why indexing on the contents is slow?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;16) Wrapping Java platform APIs&lt;/span&gt;&lt;br /&gt;For example - wrapping JDBC with your own API. Now I'm not talking a DAO or some abstraction layer - I'm talking about a class-for-class, method-for-method wrapping!&lt;br /&gt;&lt;br /&gt;Oh I'm sure there are others but these are the ones I look for during a human-based code scan. I can't scan my own code because I'm terrible at it (and lazy whenever I spot anything - just too easy to look at the other 10 things pressing on my To-do list). The best thing to do here is use Checkstyle/PMD/FindBugs and have someone else prod me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-2204199869178862424?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/2204199869178862424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=2204199869178862424' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/2204199869178862424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/2204199869178862424'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/07/java-worst-practices.html' title='Java Worst Practices'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-5683955560624745851</id><published>2007-06-29T20:42:00.000-04:00</published><updated>2007-06-29T21:24:26.111-04:00</updated><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='trends'/><category scheme='http://www.blogger.com/atom/ns#' term='software development process'/><title type='text'>Wanted: CTO to bang out some code</title><content type='html'>Recently I've been surprised at job postings for Architects that also expect the person hired to double as Project managers or Product managers (or both) in addition to their architectural duties as well as being a developer for a chunk of time too.  I hope the pay is good for your 90 hour work week!&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;And then I saw this ad - the emphasis is my own&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt; &lt;/b&gt;(here is the original &lt;a href="http://www.gojobs.com/seeker/jobdetail.asp?jobnum=2812003&amp;jbid=1318"&gt;link &lt;/a&gt;- but as with most job sites it won't stay active for long)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-weight: bold; font-style: italic;font-family:times new roman;font-size:100%;"  &gt;Chief Architect (CTO role) - Agile, SOA&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;&lt;span style="font-family:times new roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:100%;"  &gt; .  .&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:100%;"  &gt;IMPORTANT: Strong preference given to &lt;span style="font-weight: bold;"&gt;candidates from eBay, Amazon, Microsoft, MSN, Google, Yahoo, Netflix&lt;/span&gt;, other large ecommerce or software product companies . . . . . &lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:100%;"  &gt; Must not be too high-level and &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:times new roman;font-size:100%;"  &gt;still able to code&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:100%;"  &gt; and mentor Engineers. Will also have led large teams, and influenced/impacted even more people through their thought leadership. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:100%;"  &gt;This is a &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:times new roman;font-size:100%;"  &gt;Chief Architect role that is at a CTO level&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:100%;"  &gt;! In this role, you will lead a team of hands-on architects in envisioning, building, and &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:times new roman;font-size:100%;"  &gt;evangelizing the companys IT technology strategy&lt;/span&gt;&lt;span style="font-style: italic;font-family:times new roman;font-size:100%;"  &gt;. Their greatest challenge will be to harness the creativity of their agile development team and direct it in the disciplined pursuit of their aggressive business objectives. With the goal of meeting their business objectives, you will create and lead the execution of a multi-year architectural roadmap for their growing portfolio of software and hardware.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;I don't know about you but if I was a CTO / Chief Architect / Enterprise Architect at eBay/ Amazon etc. I'd stay a million miles away from this company - IMNSHO they're really not sure what they want. I mean this is a CxO position - and they want the person to lead architects, mentor engineers and still code. Wow!  Perhaps they should look for one who can also be administrative assistant and janitor too?&lt;br /&gt;&lt;br /&gt;What do you think? Is this a reasonable request?  This is a bad smell to me - someone high-up in the food chain either doesn't really know how software teams work or is unaware of the expectations for what a CTO does at any company bigger than 50 people.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-5683955560624745851?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/5683955560624745851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=5683955560624745851' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/5683955560624745851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/5683955560624745851'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/06/wanted-cto-to-bang-out-some-code.html' title='Wanted: CTO to bang out some code'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-7485332063261859032</id><published>2007-06-29T20:09:00.000-04:00</published><updated>2007-07-19T22:09:59.351-04:00</updated><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='design'/><category scheme='http://www.blogger.com/atom/ns#' term='Career'/><title type='text'>How to spot the dreaded non-coding architect</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span&gt;(Could this be flamebait - probably! But here goes anyway)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By Architect here I'm not talking Enterprise level folk who pretty much don't code much anyway - they're really IT strategists and don't need to apologize. I'm talking about the Architect for a small division or one team or a small number of teams not entire divisions of people with over 500+ developers.&lt;br /&gt;&lt;br /&gt;Non-Coding Architects (NCAs) are also known as "&lt;a href="http://www.agilemodeling.com/essays/agileArchitecture.htm"&gt;Ivory Tower Architects&lt;/a&gt;" or "&lt;a href="http://www.joelonsoftware.com/articles/fog0000000018.html"&gt;Astronaut Architects&lt;/a&gt;" or "&lt;a href="http://www.simongbrown.com/blog/2005/09/28/should_architects_code.html"&gt;Powerpoint Architects&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;These NCA folks can be really quite dangerous and give dev teams a bad name - pretty much as any leader who really doesn't have the ability would hurt his organizaton.  In addition, one general trait of NCAs that I've observed is their tendency to criticize the work of others to ensure the spotlight of accountability is off them.  Either that or they can spew so many technical and complex terms that you're not really sure what they said - but the sounded smart so you're happy to have them on the team. Right?&lt;br /&gt;&lt;br /&gt;The developers know these guys (or gals?) couldn't code their way out of a wet brown paper bag - the problem is no-one else can see this so typically the developers have to suffer through the bad design decisions that inevitably result.&lt;br /&gt;&lt;br /&gt;But how can you spot one? For most developers it's pretty easy but just in case you can't I've compiled a list of example scenarios that should help - comparing the often dogmatic attitude of the NCA with the pragmatism of the experienced Coding Architect (CA).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario: Need to map an object data model to the database&lt;/span&gt;&lt;br /&gt;NCA:  According to the J2EE spec we should be using Entity Beans.&lt;br /&gt;CA: Entity beans are terrible - let's write our own DAOs or use Hibernate/iBatis/Toplink. Why do we need an App Server for this? Let's try to stay with J2SE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The essential issue&lt;/span&gt;: J2EE Entity / Session beans were too slow and cumbersome for too long - you also need an app server (which cost mucho $$$$ if you go IBM/BEA). Why not use lighter frameworks such as Spring which will work pretty much anywhere? The NCA wants to adhere to the "spec" from Sun. The CA has been burned before and knows better.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario: We need only one instance of an Class per JVM  &lt;/span&gt;&lt;br /&gt;NCA: Hey design patterns are cool - let's use a Singleton!&lt;br /&gt;CA: How do I code thread-safe singletons in Java? How do I unit-test a Singleton? Let's try to avoid this if we can?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The essential issue:&lt;/span&gt; Design patterns are great - but sometimes the pattern is more trouble than it's worth. It's hard to code singletons right, especially for thread-safety. Also they're hard to unit test because singletons are stateful classes whereas unit tests should be as state&lt;span style="font-style: italic;"&gt;less&lt;/span&gt; as possible&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario: Users say our app is too slow&lt;/span&gt;&lt;br /&gt;NCA: We need to create and perform a performance test suite across all our supported operating systems, and supported database platforms. We need to buy (insert your favorite expensive and unwieldy toolset here) and test all user workflows.&lt;br /&gt;CA: I know where the bottleneck is because I live with the code daily - we keep loading the same static data over and over again. We'll do some analysis but at least this will get us most of the way.&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The essential issue:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;These days you don't have the time! The first few performance improvements in a new application are usually easy to spot (if you work with the code daily). Some analysis though to verify your hypothesis is required though. Do those initial improvements first and then you can perform the full-blown analysis.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario: Our CIO says we need to use SOA / Web Services now!&lt;/span&gt;&lt;br /&gt;NCA: We should use the WS-* specifications&lt;br /&gt;CA: You know the WS-* specs are still in development and somehow apps with Web Services and SOA  are proceeding along fine - let's be careful about which standards we adopt and have a plan in place in case they change. Hey what's this REST thing? That's pretty simple!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;The essential issue&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;:&lt;/span&gt; Simplify, simplify, simplify! WS-* specs are just getting too heavyweight and are getting bogged down by vendors. Don't get locked in analysis paralysis or worse adopting so many WS-* standards your dev team needs 6 months of training before writing a line of code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario: We need logging in our application&lt;/span&gt;&lt;br /&gt;NCA: We should use Commons Logger as our default logger&lt;br /&gt;CA: Log4j gives you so much more useful functionality that gets abstracted away by Commons Logger - let's use that instead. Log4j's appenders are just soooo cool!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The essential issue:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;You log file is a very important artifact and you'll want to do different things with different parts of it (e.g. send emails on errors, log some stuff to the database, send something to a message queue etc.). Log4j lets you do that - but in most cases you need to use the XML configuration. Commons wrapper let's you use Log4J underneath but only with the log4j.properties files - you lose access to many of the cool appenders with pattern matching capabilities.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario: Our J2EE vendor provides a useful non-standard set of functions - should we use them or write our own? &lt;/span&gt;&lt;br /&gt;NCA: Let's make sure to write all our EJB code without hooking in to specific WebSphere/WebLogic etc. extensions. Let's stay vendor neutral. So let's write it ourselves!&lt;br /&gt;CA: It would take us longer to write our own code to do this - so why not use the extensions and just ensure we wrap them in some facade / abstraction that doesn't leak anything container-specific.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The essential issue&lt;/span&gt;: Save time! Anyway, what are the odds you will switch J2EE app server vendors?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario:We've got lots of code duplication&lt;/span&gt;&lt;br /&gt;NCA: We need an AOP solution&lt;br /&gt;CA: Just refactor!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The essential issue&lt;/span&gt;: AOP is cool - but do you have the time for your developers to learn about point-cuts etc.  Anyway the problem isn't lacking AOP it's often laziness (or the absence of support for closures!)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Scenario: Architect is asked to speak to software developers&lt;/span&gt;&lt;br /&gt;NCA: Use words such as "alignment", "leverage", "synergy", "the long tail", "thought leadership" and the latest buzzwords (SOA, Web 2.0, ESB).&lt;br /&gt;CA: Use words such as "regression tests", "refactor", "reuse", "Keep it simple", "usability and easy of use"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;The essential issue: &lt;/span&gt;Are you a managing up or managing down? Are you trying to be  a Servant Leader and help your team whilst also helping management (they don't need that buzzword soup either)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software Lifecycle phase - Requirements &lt;/span&gt;&lt;br /&gt;Guess who is who here&lt;br /&gt;&lt;br /&gt;"We need a full month of off-site JAD sessions to gather requirements" vs. "We need a paper/HTML prototype"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software Lifecycle phase - Architecture &lt;/span&gt;&lt;br /&gt;"We need UML diagrams for each class and interaction with Rational Rose" vs. "We just need to document key classes and flows - let's use Visio or StarUML"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software Lifecycle phase - Design&lt;/span&gt;&lt;br /&gt;"Let's do it this way" vs. "How should we do this?"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software Lifecycle phase - Coding&lt;/span&gt;&lt;br /&gt;"JDepend says your code needs to be more adaptable" vs. "JUnit says we need to fix some unit tests!"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software Lifecycle phase - Testing &lt;/span&gt;&lt;br /&gt;"Why did you do it that way?" vs. "How can I help?"&lt;br /&gt;"Why is that broken?" vs. "You've got plenty of bugs on your plate. Let me fix that!"&lt;br /&gt;"That keeps breaking? Why?" vs. "Yeah that's a troublesome piece of code - can we do any refactoring  and perhaps add more unit tests"&lt;br /&gt;&lt;br /&gt;I look forward to your comments and stories.  I especially love the stories of Architects who really don't understand the technology and come up with the craziest ideas and the developers who save their asses (or not!).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://atomiq.org/archives/2006/08/web_20_tops_the_gartner_hype_cycle.html" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-7485332063261859032?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/7485332063261859032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=7485332063261859032' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/7485332063261859032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/7485332063261859032'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/06/how-to-spot-dreaded-non-coding.html' title='How to spot the dreaded non-coding architect'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-3654219234866794482</id><published>2007-06-28T06:44:00.000-04:00</published><updated>2007-07-04T21:23:33.715-04:00</updated><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'/><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='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Finally I have had it with Microsoft</title><content type='html'>&lt;span style="font-weight: bold;"&gt;How web apps and OSS can help you kick the habit too&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So last weekend I bought a new laptop on sale at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;CompUSA&lt;/span&gt;. It was a really great deal - powerful or so I thought until I took a look at Vista installed on it. It can't go back to Windows XP / 2000 as there are no OEM drivers for those OSs.&lt;br /&gt;&lt;br /&gt;But, I thought, what the heck it's just for some basic "around the house" work - web and document editing.&lt;br /&gt;&lt;br /&gt;But after a weekend of playing with it I've realized - finally - after 12 years (since Windows 95)  that the Windows OS is not just failing to get better it's getting worse - "Do you wish to open this application" - "Of course I do I clicked the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;freakin&lt;/span&gt;' button didn't I".&lt;br /&gt;&lt;br /&gt;It takes forever to shut-down and start-up - despite &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;uninstalling&lt;/span&gt; the bloat-ware. Windows Media Player is almost useless for playing DVDs (missing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;codecs&lt;/span&gt; etc.)&lt;br /&gt;&lt;br /&gt;Anyway I've been using Google Docs, Google reader etc. for some time so I'm not installing MS Office despite having access to an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;MSDN&lt;/span&gt; license and I'm ditching IE for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Firefox (so many great tools for it)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I'll stick with Vista cos the Laptop is jointly being used by "civilians" who understandably don't want to be learning a new OS when Windows took them a decade to figure out.  Anyway there's something to be said for knowing how to work around Window's quirks (or are they features?)&lt;br /&gt;&lt;br /&gt;I've configured Vista to look more like Windows "Classic" as the Vista look-and-feel is just too busy - flashy - looks great - but I just want to find a file dammit!&lt;br /&gt;And where has the "Open with . . . " right click option gone?!?!?!&lt;br /&gt;&lt;br /&gt;AAAAGGGHHHHH&lt;br /&gt;&lt;br /&gt;So it was fortunate timing that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Lifehack&lt;/span&gt; had a recent blog entry citing a  great &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Mashable&lt;/span&gt;.com resource&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lifehack.org/articles/technology/replacing-microsoft-with-web-apps.html"&gt;Replacing Microsoft Apps with Web Apps&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Here's the direct &lt;a href="http://mashable.com/2007/06/22/no-download-required/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Mashable&lt;/span&gt; link&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a nice follow-on to another blog entry they had entitled&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lifehack.org/articles/technology/top-10-microsoft-alternatives.html"&gt;Top 10 Microsoft Alternatives&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now if only I could get a desktop widget to remind me of my Google Calendar entries I'd be all set.&lt;br /&gt;&lt;br /&gt;Oh and BTW if you are not subscribed to &lt;a href="http://www.lifehack.org/feed/"&gt;Lifehack.org's RSS&lt;/a&gt; - do so now - it's got an incredibly wide array of productivity tips and advice every day - certainly the most useful blog I subscribe to and the one I read first (if pressed for time) and last (if I have lots of time and want to savor the anticipation of what they will teach me next).&lt;br /&gt;&lt;br /&gt;Some people I'm sure are way ahead of me on this (switching to Mac OS/X and Ubuntu and totally have kicked the M$ habit) but I tend to one of the &lt;a href="http://www.valuebasedmanagement.net/methods_rogers_innovation_adoption_curve.html"&gt;early majority&lt;/a&gt; when it comes to adoption of new technologies (sometimes I'm an early adopter if I can quickly see the benefit - typically via a good blog review from someone I respect).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-3654219234866794482?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/3654219234866794482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=3654219234866794482' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/3654219234866794482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/3654219234866794482'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/06/finally-ive-had-it-with-microsoft.html' title='Finally I have had it with Microsoft'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-6127654465716833074</id><published>2007-06-21T21:07:00.001-04:00</published><updated>2007-07-04T09:12:10.527-04:00</updated><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='database'/><title type='text'>10 Computing Questions I would love to know the answers to</title><content type='html'>&lt;div&gt; &lt;/div&gt;&lt;strong&gt;1) For Java/J2EE what's the most scalable server hardware platform?&lt;/strong&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;OK, "scalable" is a pretty subjective word (and by scalable I guess I mean "scale up" not out) but say I have this incoming message stream (say JMS) of many tens of thousands of small messages every second (stock ticks for example) and have a single-thread (for arguments sake) and just want to read as many of them as I can.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Which server platform in its default configuration will handle the highest number per second?&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;In my experience the Sun server (Solaris) platform is the most scalable, linux (on x86) second and Windows (x86) third but with the recent advances in hardware how is that holding up?&lt;br /&gt;I don't trust any vendor benchmarks (something about foxes and hen houses) or reputedly independent analysts who just happened to get a lot of money from the winning vendor.&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;strong&gt;2) Which Database does Google use to store data?&lt;/strong&gt;&lt;br /&gt;&lt;div&gt;If it's a commercial RDBMS then how can they cram so much data volume as a whole into them, plus it's coming in like a fire-hose. In my experience modern RDBMS can handle at most thousands of transactions per second. But Google has to be many orders of magnitudes beyond that. We can talk grids, sharding etc. up the ying-yang but at some point it all has to come back together in some data store (or does it?).&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;3) When will Sun go belly-up?&lt;/strong&gt;&lt;/div&gt;Don't get me wrong, Sun have done a &lt;strong&gt;&lt;em&gt;lot&lt;/em&gt;&lt;/strong&gt; of great things - Java, Solaris, J2EE (OK skip that one), but they've never really made any money off of Java (like, say, IBM did), they still focus on hardware solutions over a decade after Lou Gerstner of IBM saw the money in services, never mind packaged software.&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;I guess they're the Xerox Parc of the 1990s / early 2000s - lots of great seminal ideas and too far ahead of their time - but just can't make any real money.&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;4) Feature-for-feature how does Oracle / MS Sql Server / DB2  stack up against MySQL / Derby / PostgresSQL etc.?&lt;/strong&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;Is it worth it to make the switch, if not now when? Which of the open source versions will survive an eventual shake-out?&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) How come no-one bought Sybase?&lt;/span&gt;&lt;br /&gt;There are really only three big players left - Oracle, IBM and Microsoft. A few years ago IBM bought Informix leaving Sybase as the outlier? Sybase still has quite a lot of deployments especially in the finance industry. But almost every such company is switching away since Sybase really hasn't had a good regular release schedule for the past few years.&lt;br /&gt;&lt;br /&gt;If someone would just come up with a great tool to automate conversion from Sybase-to-XYZ (with minimal hand-coding for extended SPs etc.) they'd make a mint!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;6) What will replace the RDBMS?&lt;/strong&gt;&lt;/div&gt;I don't know about you but there seems to be something in the air, the Object-relational impedance mismatch seems to be hitting a threshold, is the end of the RDBMS in our future (say 20 years?).  Will it be the &lt;a href="http://en.wikipedia.org/wiki/Object_database"&gt;ODBMS&lt;/a&gt;? I doubt it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) How come everyone talks about coordinating DB transactions - &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/X/Open_XA"&gt;XA&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; and &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://en.wikipedia.org/wiki/Two-phase_commit"&gt;2PC&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; and the like but I've *never* needed it in practice?&lt;/span&gt;&lt;br /&gt;Maybe I just lack experience - but not ever in over a decade have I seen an unequivocal requirement to implement transaction coordination.&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8) How come software vendors have such terrible software and no accountability?&lt;/span&gt;&lt;br /&gt;I've been working with this JMS implementation for the past year (not IBM, nor Tibco - rhymes with "chronic achoo"). It crashes all the time and can't handle heavy load gracefully! I mean it's a *MESSAGING* server - it's *GOT* to be able to handle a heavy load&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;9) When will I be able to do more than three things at once with Windows desktop?&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Sometimes I click on a URL in Firefox, while waiting to open iTunes and while waiting on that I try to open my email and my whole Windows UI starts to freeze up - the mouse won't even move. OK Unix / Linux aren't very user friendly but the good old ampersand (&amp;amp;) for background tasks does fabulously well in the command line world keeping your interface quite responsive.&lt;br /&gt;&lt;br /&gt;Now we're talking just three things at once - relative to the 1980s I've got a frigging supercomputer on my desk - Microsoft come on already! This has been true regardless of how much CPU / memory I have or which Windows version (currently XP Professional).&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;strong&gt;10) Why is Google apparently trying to buy it's own Spectrum?&lt;/strong&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;See &lt;a href="http://weblog.infoworld.com/realitycheck/archives/2007/05/google_owning_s.html"&gt;Link #1&lt;/a&gt; or &lt;a href="http://www.mediachannel.org/wordpress/2007/05/29/here-we-come-to-save-the-spectrum/"&gt;Link#2&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Intriguing eh?&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;And two bonus questions . . . &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;11) What is the air-speed velocity of an unladen swallow?&lt;/strong&gt;&lt;/div&gt;"What?  I don't know that!  Auuuuuuuugh!". The answer is out there - actually it's &lt;a href="http://www.style.org/unladenswallow/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;12) Why do us Programming / Computer Geeks love &lt;a href="http://en.wikipedia.org/wiki/Monty_Python"&gt;Monty Python&lt;/a&gt;?&lt;/strong&gt;&lt;/div&gt;Now that's one for the ages!&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-6127654465716833074?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/6127654465716833074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=6127654465716833074' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/6127654465716833074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/6127654465716833074'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/06/10-computing-questions-i-would-love-to.html' title='10 Computing Questions I would love to know the answers to'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-4849557591230429094</id><published>2007-06-12T13:05:00.000-04:00</published><updated>2007-06-12T13:22:24.979-04:00</updated><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='code quality'/><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='programming'/><title type='text'>Java Exception Handling Anti-Patterns</title><content type='html'>The following article addresses one of the hardest things for new java programmers to get right - how to handle exceptions - or more accurately the article talks to how *NOT* to handle exceptions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://today.java.net/pub/a/today/2006/04/06/exception-handling-antipatterns.html"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was published in 2006 and I'm surprised I haven't seen it before now as it's really quite awesome (I came across it using &lt;a href="http://del.icio.us/"&gt;Del.icio.us&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Anti-patterns they describe include&lt;br /&gt;&lt;br /&gt;1) Log and rethrow&lt;br /&gt;2) Throw the plain old generic java.lang.Exception&lt;br /&gt;3) Throwing the Kitchen Sink&lt;br /&gt;4) Catching java.lang.Exception&lt;br /&gt;5) Destructive Wrapping&lt;br /&gt;6) Log and Return Null&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Side note: I firmly believe you should NEVER return null from a method unless you really enjoy debugging NullPointerExceptions or giving them to other people's code - yah I know the Sun spec has several such cases in the core API but still . . . . .)&lt;/span&gt;&lt;br /&gt;7) Catch and Ignore&lt;br /&gt;8) Throw from Within Finally&lt;br /&gt;9) Multi-Line Log Messages&lt;br /&gt;10) Unsupported Operation Returning Null&lt;br /&gt;11) Ignoring InterruptedException&lt;br /&gt;12) Relying on getCause()&lt;br /&gt;&lt;br /&gt;Two other great Exception handling articles (more from the POV of what to do than what *not* to do) are&lt;br /&gt;&lt;br /&gt;a) &lt;a href="http://www.google.com/url?sa=t&amp;ct=res&amp;amp;cd=1&amp;url=http%3A%2F%2Fwww.blueskyline.com%2FErrorPatterns%2FA2-LongshawWoods6.pdf&amp;amp;ei=3dNuRr2SNY7swQLot6jDBA&amp;usg=AFQjCNEBhltCk-UU4zODyJtXdXnOdbjXIQ&amp;amp;sig2=-Eq_Ps-gQlVEmeivWkfpOQ"&gt;Patterns for Generation, Handling and Management of Errors&lt;/a&gt; by Andy Longshaw and Eoin Woods&lt;br /&gt;b) &lt;a href="http://www.ibm.com/developerworks/library/j-ejbexcept.html"&gt;Best practices in EJB exception handling&lt;/a&gt; by Srikanth Shenoy&lt;br /&gt;&lt;br /&gt;I particularly liked the Longshaw/Woods ideas of "Log at Distribution Boundaries" and "Split Domain and Technical Errors"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-4849557591230429094?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://today.java.net/pub/a/today/2006/04/06/exception-handling-antipatterns.html' title='Java Exception Handling Anti-Patterns'/><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/4849557591230429094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=4849557591230429094' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/4849557591230429094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/4849557591230429094'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/06/exception-handling-anti-patterns.html' title='Java Exception Handling Anti-Patterns'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-5416772357889076143</id><published>2007-06-08T13:24:00.000-04:00</published><updated>2007-06-13T21:32:38.757-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='J2ee'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Links to some Good Free Java/J2EE Books</title><content type='html'>&lt;div&gt;Most of these are available at &lt;a href="http://www.theserverside.com/"&gt;The Server Side&lt;/a&gt; but I'm very often surprised how few people are aware of these . . . .&lt;br /&gt;&lt;br /&gt;There's a number of other free Java/J2EE books out there too but they really didn't pass muster.&lt;br /&gt;&lt;br /&gt;I've tried to group them according to how good I felt the quality was - "Fair to middling" means the content probably should be free (or already is free elsewhere) whereas "Great" means it's a really nice little freebie for us developers who spend so many $ each year on tech books.&lt;br /&gt;Some of them are pretty old (circa '00-'02) but still pretty good nonetheless.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;FAIR to MIDDLING&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Designing Enterprise Applications with J2EE Platform&lt;/strong&gt;&lt;br /&gt;by Inderjeet Singh, Beth Stearns, Mark Johnson and the Enterprise Team&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/book.pdf"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Designing Web Services with the J2EE 1.4 Platform: JAX-RPC, SOAP, and XML Technologies&lt;/strong&gt;&lt;br /&gt;by Inderjeet Singh, Sean Brydon, Greg Murray, Vijay Ramachandran, Thierry Violleau, Beth Stearns&lt;br /&gt;&lt;a href="https://blueprints.dev.java.net/books.html"&gt;Link &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;GOOD&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;The J2EE Architect's Handbook&lt;/strong&gt;&lt;br /&gt;by Derek C Ashmore&lt;br /&gt;&lt;a href="http://www.theserverside.com/tt/books/DVTPress/J2EEArchitectsHandbook/index.tss"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mastering Enterprise JavaBeans 3.0&lt;/strong&gt;&lt;br /&gt;by Rima Patel Sriganesh, Gerald Brose and Micah Silverman&lt;br /&gt;&lt;a href="http://www.theserverside.com/tt/books/wiley/masteringEJB3/index.tss"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Jakarta Struts Live&lt;/strong&gt;&lt;br /&gt;by Rick Hightower&lt;br /&gt;&lt;a href="http://www.theserverside.com/tt/books/sourcebeat/JakartaStrutsLive/index.tss"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Servlets and JavaServer Pages&lt;/strong&gt;&lt;br /&gt;by Jayson Falkner and Kevin Jones&lt;br /&gt;&lt;a href="http://www.theserverside.com/tt/books/addisonwesley/ServletsJSP/index.tss"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;GREAT&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;Swing&lt;/strong&gt;&lt;br /&gt;by Matthew Robinson and Pavel Vorobiev (1st Edition)&lt;br /&gt;&lt;a href="http://www.manning.com/robinson2/"&gt;Link (see about half-way down the page)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bitter Java&lt;br /&gt;&lt;/strong&gt;by Bruce Tate&lt;br /&gt;&lt;a href="http://transfer.kg/users/coder/docs/programming/java/books/BitterJava.pdf"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Thinking in Java&lt;/strong&gt;&lt;br /&gt;by Bruce Eckel (3rd Edition)&lt;br /&gt;&lt;a href="http://www.planetpdf.com/developer/article.asp?ContentID=6632"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Core Servlets and JavaServer Pages&lt;/strong&gt;&lt;br /&gt;by Marty Hall (1st Edition)&lt;br /&gt;&lt;a href="http://pdf.coreservlets.com/"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;More Servlets and JavaServer Pages&lt;/strong&gt;&lt;br /&gt;by Marty Hall (1st Edition)&lt;br /&gt;&lt;a href="http://pdf.moreservlets.com/"&gt;Link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;p.s. if for any reason any of these links violate any author's rights (I certainly hope they don't) please let me know. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-5416772357889076143?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/5416772357889076143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=5416772357889076143' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/5416772357889076143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/5416772357889076143'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/06/links-to-some-good-free-javaj2ee-books.html' title='Links to some Good Free Java/J2EE Books'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28150884.post-8832514494550170645</id><published>2007-06-08T08:35:00.000-04:00</published><updated>2007-06-09T13:24:04.190-04:00</updated><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='users'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Another fine mess you got me into - Why BDUF should work but . . . .</title><content type='html'>I think most people agree that BDUF is fading against the assault of, if not agile methods, then at least iterative ones.&lt;br /&gt;&lt;br /&gt;What's the reason? Despite claims to the contrary I do not believe it stems from incomplete, vague or ever-changing requirements although that plays a factor. I think the issue is that frankly, we mere humans (!) are just not smart enough to build complex systems that require so many interacting and moving parts, and to do so in one fell swoop - that is with a Big Design Up Front (&lt;a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front"&gt;BDUF&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Other factors include the benefits to being first to market even if it's with a lot of bugs! Sadly people's expectations for software are quite low)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Alternatively you could say that the technologies we use are still too complex . . . .&lt;br /&gt;&lt;br /&gt;Take for example a sample 3-tier Java/J2EE application - on the Presentation Tier you have&lt;br /&gt;&lt;br /&gt;- JSP pages (probably tens to hundreds or more pages each with a myriad links or buttons and inter- and intra-page flows)&lt;br /&gt;- plus associated Javascript&lt;br /&gt;- Now add Ajax (it makes the user's experience better but the work as a whole got harder)&lt;br /&gt;- Struts / Servlets&lt;br /&gt;&lt;br /&gt;On the middle tier you have&lt;br /&gt;- Facades / Business Delegates&lt;br /&gt;- Session Beans, Entity Beans, Message Beans&lt;br /&gt;- Probably a great deal more: JMX, logging, multi-threading, JMS messaging, Enterprise Service Buses&lt;br /&gt;- Web Services&lt;br /&gt;&lt;br /&gt;On the data tier&lt;br /&gt;- DAOs, ORM mapping (and all that this involves)&lt;br /&gt;- Transactional behavior&lt;br /&gt;&lt;br /&gt;This is not to slam Java/J2EE - the same problems must be solved in .Net, Ruby and C# - presentation tier (and it's concerns such as usability, flow, chattiness of requests etc.), middle tier (concerns include scalability, threading, caching, user sessions, fail-over, security etc), data tier (look for data model extensibility, transactions etc.)&lt;br /&gt;&lt;br /&gt;Think about it a little more - BDUF worked great in the 60s and 70s where most applications were written with just one language - entirely COBOL, entirely Fortran etc. and it was for a small number of users (tens, hundreds). Now we need to know JSPs, HTML, CSS, Javascript, XML, Java and it's myriad APIs, SQL and DDL and our user-base is the world (millions, billions)!&lt;br /&gt;&lt;br /&gt;And we wonder why BDUF doesn't work!?!?! It's like trying to hire someone who can speak 9 world languages fluently and being surprised by a lack of resumes!&lt;br /&gt;&lt;br /&gt;Can it be any surprise then that BDUF doesn't work? Due to complexity of the technology space, half the time we're not aware of a problem until we hit it. As a CS geek with a streak of "true" engineer I find this embarassing.&lt;br /&gt;&lt;br /&gt;BDUF is not inherently the problem - *WE* are the problem - we're either not smart enough (not sure we can fix that) or we've made the tools too complex and hard to use (we can address this).&lt;br /&gt;&lt;br /&gt;We end up having to write code to help solve issues related to things like Cross Site Scripting (&lt;a href="http://en.wikipedia.org/wiki/Cross-site_scripting"&gt;XSS&lt;/a&gt;) and database table indexes etc. which are so far removed from the actual problem we are trying to solve - building applications for some end-user need.&lt;br /&gt;&lt;br /&gt;As Einstein said:&lt;br /&gt;&lt;p&gt;"&lt;em&gt;We can't solve problems by using the same kind of thinking we used when we created them&lt;/em&gt;"&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;In the same way that Java removed the need for us to handle memory management ourselves, we need something (not *just* a language) to solve the "junky" problems - yeah they're fun problems to solve but it's not what our customers, clients or bosses are really paying us for! What's needed is a paradigm shift . . . . 4GLs, MDA etc. all fail because they seek to make abstract or automate what's inherently a very complex space.&lt;br /&gt;&lt;br /&gt;As any 6 year old can tell you, automating an error-prone process means you just make more errors in less time!&lt;br /&gt;&lt;br /&gt;And as any mathematician would tell you, if you can control the problem space then do so! Why make a problem harder than it needs to be? &lt;span style="font-size:78%;"&gt;(Job Security?) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How do we get there? Well if I knew I'd be a millionaire - but I think it has to be a solution which focuses on the data - how it's represented, displayed and persisted - if we can radically simplify that, then we're on our way.&lt;br /&gt;&lt;br /&gt;Perhaps even our day-to-day IT language itself - about "data", "code", "interface" is part of the problem - it's all so very Turing/Shannon/Von Neumann - so dry, so linear, so artificial. True paradigm shifts occur when we look outside - FAR outside!&lt;br /&gt;&lt;br /&gt;The downside? Probably massive layoffs in the IT industry - the same way mass production and industrialization spelled the death knell for the livelihood of many skilled individual artisans.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28150884-8832514494550170645?l=softarc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://softarc.blogspot.com/feeds/8832514494550170645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=28150884&amp;postID=8832514494550170645' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/8832514494550170645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28150884/posts/default/8832514494550170645'/><link rel='alternate' type='text/html' href='http://softarc.blogspot.com/2007/06/another-fine-mess-you-got-me-into-why.html' title='Another fine mess you got me into - Why BDUF should work but . . . .'/><author><name>Frank Kelly</name><uri>http://www.blogger.com/profile/12627636738029844584</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='18171409535979293463'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry></feed>