<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>effective software development</title>
    <link>http://dnicolet1.tripod.com/agile/</link>
    <description></description>
    <lastBuildDate>Sat, 21 Nov 2009 07:49:17 -0500</lastBuildDate>
    <language>en-us</language>
    <docs>http://backend.userland.com/rss</docs>
    
    <item>
      <title>Spoiler</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1965243</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1965243</guid>

      <description>&lt;br&gt;&lt;p&gt; A friend of mine tweeted the other day: &lt;/p&gt; &lt;p style=&quot;margin-left: 32px; margin-right: 32px&quot;&gt; So now that Java 7 is getting closures at the end of 2010, it&amp;#39;ll only be behind C# by what, 5 years? Better late than never. &lt;/p&gt; &lt;p&gt; To which I half-jokingly replied: &lt;/p&gt; &lt;p style=&quot;margin-left: 32px; margin-right: 32px&quot;&gt; So now that C# can run on more than one platform thanks to mono, it&amp;#39;s only behind Java by what, 5 years? &lt;/p&gt; &lt;p&gt; In 1986, I bought a Toyota MR-2, a small, lithe, mid-engine two-seater. It could take curves like a slot car. More fun to drive than any other car I&amp;#39;ve owned. It was red, and it had a rear spoiler. I liked the spoiler. It made me feel cool.  &lt;/p&gt; &lt;p&gt; The purpose of a rear spoiler is to hold the back end of the car down on the road when you&amp;#39;re driving really fast. The 1986 Toyota MR-2 could briefly flirt with 95 MPH, going downhill, with a tail-wind, and given five minutes to build up speed gradually, provided you had no passenger aboard and you removed everything heavy from the car, and while driving you wished with all your heart that the speedometer pointer would move just one more millimeter, oh please please please. In other words, the spoiler could never have any aerodynamic effect on the vehicle. It was only a decoration. Even so, I liked it. It made me feel cool.  &lt;/p&gt; &lt;p&gt; Support for closures in a programming language makes for clean, concise, readable code. All good.  &lt;/p&gt; &lt;p&gt; Consider two hypothetical programming languages such that: &lt;/p&gt; &lt;p&gt; Language A &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Supports closures, and&lt;/li&gt; &lt;li&gt;Can only run on one platform, so that customers who use the language for mission-critical apps are locked into a single operating system vendor.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; Language B &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Doesn&amp;#39;t support closures, and&lt;/li&gt; &lt;li&gt;Runs on all mainstream platforms, so that customers who use the language have flexibility to change their technical environment as their business needs change or as the relative cost of ownership of different platforms changes.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; Which of the two programming languages is &amp;quot;better?&amp;quot; &lt;/p&gt; &lt;p&gt; My friend might say that Language A is better than Language B. Language B is &amp;quot;behind&amp;quot; Language A because it doesn&amp;#39;t (yet?) support closures.  &lt;/p&gt; &lt;p&gt; I might say that closures are a great feature, or at least an &lt;em&gt;interesting&lt;/em&gt; feature, but since Language B offers greater flexibility to customers, it yields better business value overall than Language A.  &lt;/p&gt; &lt;p&gt; I&amp;#39;ve been playing with C# on Mono on a Linux system recently. C# is a cool language, if you consider programming languages outside of any business context, as if you were playing with toys in a toy shop. If a toy will only work in one section of the toy shop, who cares? It&amp;#39;s only a toy, after all. It isn&amp;#39;t as if the success of your business depended on it. Plus, it&amp;#39;s fun to argue with the other children about which toys are the most fun. I suspect a lot of people who choose software engineering as their profession choose it mainly for the opportunity to argue, and only secondarily for the opportunity to write code. The relative amount of time software developers spend arguing with one another about pleonastic niceties of programming style or compiler features seems to support that suspicion. &lt;/p&gt; &lt;p&gt; Mono doesn&amp;#39;t (yet?) support .NET completely seamlessly; a C# application has to be written specifically for Mono if you intend to run it on any platform other than Microsoft Windows. Your staff won&amp;#39;t be able to run their familiar Visual Studio tools on anything other than Microsoft Windows, even if your target platform is something else. So, we don&amp;#39;t quite have cross-platform support for C# that is ready for prime time. We will. Novell is behind Mono, and the product is maturing rapidly. If I had to make a prediction, it would be that Java will have support for closures long before C# becomes a truly viable cross-platform tool. Or maybe it will be the other way around. Eventually, both things will happen and the argument will settle itself. If you enjoy that sort of argument, take heart: There will be some other cool language feature to argue about. Before there were rear spoilers, I hear that people used to like fins on the back of their cars. &lt;/p&gt; &lt;p&gt; As a developer, I like closures. They make me feel cool. And, like any faithful Monty Python fan, I like a good argument. As an IT consultant with the responsibility to make well-considered recommendations to clients, I have to look at programming languages from another angle. The cost of change can be prohibitive when your organization is nailed to a single hardware or software vendor. Those of us who have earned a few gray hairs have been there and done that, probably more than once. Be careful about selecting programming languages or other software development tools that will lock you in, even if they have nifty features that make you feel cool. It&amp;#39;s more important to manage the total cost of ownership of your IT assets than to have the coolest programming language in town.  &lt;/p&gt; &lt;p&gt; P.S. &lt;/p&gt; &lt;p&gt; I&amp;#39;m talking about conventional business applications, BTW. Given the literal-mindedness of some of the people who have posted comments here, I guess I have to spell that out. Embedded apps, like flight control systems and toll plaza systems, and software that requires low-level access to devices, like video games, have to be closely tied to the hardware. That is not the context of this post. Nearly all conventional business apps are just CRUD apps. There is no valid reason to tie a CRUD app to any particular OS, or any particular desktop, or any particular back-end data store. Building a solution in that way only imposes a vendor-lock on your customers while providing no value-add in exchange. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1965243</comments>
	
      <pubDate>Sat, 21 Nov 2009 07:49:17 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>When success = failure</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1964378</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1964378</guid>

      <description>&lt;br&gt;&lt;p&gt; There&amp;#39;s a lot of buzz in the community about how to drive high productivity at the grassroots level, and how great it is when we can help develop a high-performing team. There are also those in the community who call for a heavy-handed approach to change; sometimes they use the term &amp;quot;shock therapy&amp;quot; to describe a process of instituting radical changes in team structure and organizational workflow in a short time. Some consultants speak of improvements in productivity in the range of 4x to 10x or greater. Although there has been recent movement away from the term, some consultants still seem to like the idea of &lt;em&gt;hyperproductive&lt;/em&gt; teams. People still talk about &amp;quot;spinning up&amp;quot; high-performing teams.  &lt;/p&gt; &lt;p&gt; In thinking back over a couple of experiences in team coaching and organizational change, I&amp;#39;ve begun to realize that there is more to success than just spinning up one or two &amp;quot;hyperproductive&amp;quot; teams. One experience was at the first company where I learned agile methods in 2002, and the other was earlier this year, 2009. In both cases, we achieved astonishing success in creating one team or a small group of teams that performed far outside the norm for their respective organizations.  &lt;/p&gt; &lt;p&gt; In each case, the teams in question pushed the envelope of state of the art agile practice. In 2002, that meant two-week iterations, relative story sizing in terms of abstract points, task decomposition, and a daily burndown of tasks. In 2009, it meant a one-week development cadence with an independent release cadence, stories split vertically into small enough chunks that no task decomposition was necessary, no daily burn tracking, &amp;quot;naked planning,&amp;quot; fully generalized skill sets, and self-management to the extent they screened and auditioned job candidates and handled their own personnel issues. In both cases, it meant a disciplined approach to Extreme Programming practices and an approach to development that today we could call &lt;em&gt;software craftsmanship&lt;/em&gt;. The point is, these teams rode the bleeding edge of whatever the state of the art was at the time. Indeed, one could justifiably say they &lt;em&gt;sharpened&lt;/em&gt; that edge. They definitely would have qualified for the label, &lt;em&gt;hyperproductive&lt;/em&gt;. &lt;/p&gt; &lt;p&gt; So, these were roaring successes, right?  &lt;/p&gt; &lt;p&gt; I used to think so. But I have to wonder: If they were successes, then why did &amp;quot;agile&amp;quot; peter out at the first company after an amazing three-year run of successful projects? Why are the people at the second company unhappy with the new way of working, despite the fact they deliver more business value than before and they can pump far more work through their process than they previously imagined possible?  &lt;/p&gt; &lt;p&gt; On reflection, I think the basic reasons are these: &lt;/p&gt;&lt;ol&gt; &lt;li&gt;Local process optimization&lt;/li&gt; &lt;li&gt;Insensitivity to emotional factors&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;Case 1&lt;/h3&gt; &lt;p&gt; In 2001 I joined a mid-sized financial services company with about 33,000 employees, operating in 6 US states, and with an IT department of about 1,300 people. It was a nightmare of waterfallish processes, crushing bureaucracy, cartoonish fake smiles, dehumanizing toadying, and walled-and-moated functional silos. Less than a year later I was fed up and ready to leave both the company and the IT field. At the urging of a colleague, I joined a small group of employees who wanted to analyze the business value the IT department added to the enterprise, and determine how to improve things. Along the way we discovered the Agile Manifesto. We enlisted help from ThoughtWorks to teach us agile methods. Long story short, in a few months we had built up an internal agile practice that could handle several projects at once, and we were delivering value regularly. The &amp;quot;business side of the house&amp;quot; loved our group. Line of business managers started to demand that the IT department carry out their initiatives using our methods. Things just got better and better... &lt;/p&gt; &lt;p&gt; ...for a while. There are many war stories to tell from this time period. For purposes of this post, let&amp;#39;s skip to the end of that three-year run. As soon as they could, IT management &amp;quot;took control&amp;quot; of the agile group. Within a week, they had (a) cancelled the practice of locating technical teams on-site with their internal customers; (b) scattered the agile practitioners around in the traditional organization, to dilute their influence; (c) conjured negative performance reviews of key agile proponents in the organization as a way to encourage them to leave the company; some were even put on probationary status, to pressure them to leave; (d) assigned some of the top performers to dead-end jobs babysitting relatively unimportant legacy apps; another tactic to encourage them to leave; and (e) re-established the waterfall process (decorated with a few agile buzzwords) as the sole way of delivering projects for internal customers. One year later, there was nothing left of &amp;quot;agile&amp;quot; but the word, much as the Cheshire Cat faded away and left only his smile behind.  &lt;/p&gt; &lt;p&gt; Why would people do this, to the detriment of their own company, the organization whose success fuelled their own bonus programs and retirement plans? At the time, the reasons were incomprehensible to me. I chalked it up to incompetence or, in some cases, maliciousness. In hindsight, the reasons are obvious: We had embarrassed IT management. Where they insisted something would be too costly, too time-consuming, or technically infeasible, we went ahead and did it at reasonable cost, in a short time, and with technical excellence. We demonstrated that everything the traditional IT managers believed to be true of software development was wrong. We went around them, and worked directly with the lines of business. We ignored their standards and procedures. We openly disrespected the chain of command, the org chart. We went around the HR department, as well, and recruited our own people to join the agile teams. This made HR feel disrespected, too, since our behavior demonstrated that we did not trust them to screen job candidates adequately. To add insult to injury, we did all that while wearing blue jeans and working four-day weeks...at a traditional financial institution with a very conservative organizational culture.  &lt;/p&gt; &lt;p&gt; It was all amazingly productive and added tremendous value to the enterprise. It was also absolutely intolerable. One year after IT management &amp;quot;took control&amp;quot; of agile, only 4 out of 60 agile practitioners were still employed there. Those four had settled back into quiet, secondary roles in the organization where they could accumulate long-term retirement benefits as long as they kept their mouths shut and didn&amp;#39;t make any waves. Everybody (who was anybody) was happy again. &lt;/p&gt; &lt;p&gt; &lt;em&gt;Local process optimization&lt;/em&gt;. Our group was physically and philosophically separate from the rest of the IT department. It grew up as a skunkworks operation and only survived as long as it did because our customers wouldn&amp;#39;t allow IT management to crush it openly, since they were realizing value from our work. We did not improve the company&amp;#39;s IT processes across the board. We only optimized our own work, in isolation from the other 1,300 IT professionals in the company. We were so fully isolated that most of those people probably never even realized anything unusual was going on. If you asked them about it today, I&amp;#39;ll bet they wouldn&amp;#39;t even know anything like this had happened in 2002-2006. The business managers who learned about the value of agile methods during that time moved on to other jobs, or retired. The organization itself has not gained or retained any deep tacit knowledge of agile practices or their value, and has not fundamentally changed its culture. &lt;/p&gt; &lt;p&gt; &lt;em&gt;Insensitivity to emotional factors&lt;/em&gt;. We simply ignored most of the individuals whose support we needed in order to achieve long-term process improvement. They responded in a perfectly normal human way: They bided their time until they could crush the agile initiative, and then they did so quickly and firmly. They &amp;quot;punished the innocent&amp;quot; and made sure anyone who had been part of the agile group either sat down and shut up, or left the company. It&amp;#39;s possible that those managers left the company eventually, too, and that a new crop of managers has experimented with agile or lean methods again since 2006. If so, they have not benefited from anything we did in 2002-2006, because internal history was rewritten to expunge all memory of it. This huge waste, this huge loss, is a direct result of our insensitivity to the emotional needs and politically-motivated fears of key management personnel. We succeeded and we failed with the same stroke. &lt;/p&gt; &lt;h3&gt;Case 2&lt;/h3&gt; &lt;p&gt; Early in 2009 I was engaged, along with another agile coach, to help a certain company improve its business processes and to help a couple of technical teams get up to speed with Extreme Programming practices. This is a smaller company than that in Case 1, with under 1,000 employees working in only two geographical locations. We were working with teams and stakeholders at one location, and most of the technical teams worked at the second location. There, they had been practicing Extreme Programming for five years already, under the guidance of an internal agile coach and with the support of their own management team.  &lt;/p&gt; &lt;p&gt; The two of us quickly determined that the main problem in the organization was not the technical teams&amp;#39; use of Extreme Programming, but rather backlog grooming upstream from the technical teams. We focused mainly on that, and did not pay any attention to the teams at the second location. In the meantime, I coached the technical teams at the first location in agile methods, which were new to them.  &lt;/p&gt; &lt;p&gt; Long story short, in about three months the teams that were new to agile methods were applying more-advanced techniques and delivering value better than the teams with five years of XP experience behind them. They were using methods I mentioned earlier, which represented state of the art practices circa 2009, and were functioning at a hyperproductive level as compared with the organization&amp;#39;s general IT performance. They were applying agile values and principles throughtfully and crafting their own practices accordingly, rather than following &amp;quot;rules&amp;quot; from a book by rote. After five or six months, however, they were floundering. The team was far out of sync with the pace of work the rest of the organization could sustain.  &lt;/p&gt; &lt;p&gt; Within their own workstream, they were able to pull work much faster than the stakeholders could keep the backlog up to date. This caused a lot of dissonance in customer collaboration. It also forced the team to revert to story sizing. Whereas relative sizing was a state of the art practice in 2002, as described in Case 1, in 2009 it is no longer a state of the art practice. Here, a team that was already skilled at commitment-based short-term planning without fine-grained estimation had to drop back a step and start sizing user stories, simply because the stories were not in appropriate shape for them to pull; they did not have any idea how big the stories might be or any inkling of potential technical risks until the very day they were expected to start working on them. This was a source of frustration for the team, and also a source of stress for stakeholders, who felt as if they were &amp;quot;failing&amp;quot; in some way although they really didn&amp;#39;t have time to do any more than they were already doing.  &lt;/p&gt; &lt;p&gt; &lt;em&gt;Local process optimization&lt;/em&gt;. We had a single team functioning at a level of performance that was out of sync with the rest of the organization. We introduced change too rapidly and in too localized a way, and caused friction in the organization. This particular team was capable of absorbing that much change that quickly, but because they were out of sync with the rest of the organization their very success created stress and frustration for them and their customers. When they had to back off from leading-edge practices, it made them feel as if they had &amp;quot;failed&amp;quot; with agile, in some sense. That is especially unfortunate in view of the fact that even after they slowed down they were operating at a level of agility beyond that of most agile teams in industry. &lt;/p&gt; &lt;p&gt; &lt;em&gt;Insensitivity to emotional factors&lt;/em&gt;. In hindsight, I think this was the area where we failed most spectacularly. We failed on two levels: First, we drove change forward as rapidly as possible and ignored the emotional impact of change on the team and their immediate collaborators; second, we ignored the people at the second location (at least, initially), who had built a sense of personal pride and an internal reputation in the company as agile experts in the course of five years of nurturing XP teams there.  &lt;/p&gt; &lt;p&gt; The team members could see that they were performing better than they had done previously, yet they were not happy about it. They didn&amp;#39;t have time to be happy about it. They had lost their individual cubicles in favor of a collaborative workspace geared for pairing; the Furniture Police did not consider all the aspects of an effective team work space when they set up the team area, and did not consult the team about their needs. As it turned out, this single factor had a significant impact on team morale. The last time I checked in with them, they had lost one senior team member and two others were emotionally &amp;quot;checked out,&amp;quot; showing up for work but not really feeling engaged. They are still delivering value at a higher rate than any other team in the company, but they are doing it mechanically, without a deep personal investment in the process. &lt;/p&gt; &lt;p&gt; The in-house agile experts felt threatened by the new ideas the consultants brought. We caused them to feel that way by failing to engage them properly from the beginning. With the consultants now gone, the in-house agile experts have reasserted themselves as the thought leaders for process improvement. They are imposing &amp;quot;rules&amp;quot; such as they use with their own teams, based on state of the art agile circa 2004. That is when they started to introduce XP, and it is the style of agile work they understand best. In hindsight, I think we should have approached change by engaging these individuals from the start and introducing change at a far more gradual pace. We didn&amp;#39;t help them understand how agile practices have evolved in the industry since 2004. As it is, the pattern that is emerging is similar to that at the company in Case 1: A brief flurry of localized extreme high performance followed by a breakdown and re-establishment of the organization&amp;#39;s previous equilibrium state. Cold comfort: At least in Case 2 the previous equilibrium state is superior to that in Case 1. &lt;/p&gt; &lt;hr /&gt; &lt;p&gt; Thinking back over these experiences leads me to another question: One year after the boastful consultants have left a client organization, what does the process look like at that organization? Did the changes &amp;quot;stick?&amp;quot; Consultants often quote client testimonials in their marketing material. What would the clients say one year, two years, or five years after they released those quotes? &lt;/p&gt; &lt;p&gt; The question reminds me of a conversation I had with the CEO of a previous employer, an agile services consultancy. There was one client in particular we used prominently in our marketing materials, who had given us a glowing recommendation. Two years after that successful project, we were reviewing the list of upcoming engagements and prospective engagements one day and I noticed we had never obtained any follow-on work from that particular happy client. I asked him why, if the client had been so happy with the results, they had never brought any more work to us. &lt;/p&gt; &lt;p&gt; His answer was along the same lines as this blog post. Our team had performed at a pace that was far out of sync with the client organization. Our customers could not keep the backlog up to date fast enough to feed our team meaningful work. They threw stories together helter-skelter just so they wouldn&amp;#39;t be paying us an hourly rate to have our people sit around and wait for something to do. The experience was so stressful for them that they decided they weren&amp;#39;t suited for agile work, and they reverted to traditional methods and traditional services firms.  &lt;/p&gt; &lt;p&gt; It occurs to me that we may have served our client better had we adjusted the pace of change and the demands for collaboration so that they were more closely aligned with the client&amp;#39;s ability to cope with change. The initial project may have taken a bit longer, but we probably would have won follow-on work from the client because they would have learned how to collaborate effectively with an agile services provider. Instead, they came away feeling as if this &amp;quot;agile&amp;quot; stuff can produce impressive results, but it just isn&amp;#39;t for them.  &lt;/p&gt; &lt;p&gt; Turning all the knobs up to eleven while ignoring the human costs of doing so may not be the definition of success, after all. Beware of consultants bearing gifts of hyperproductivity. &lt;/p&gt; &lt;p&gt; I recall a comment from Ron Jeffries on the Extreme Programming discussion list some time ago, to the effect that if you haven&amp;#39;t gone all the way with agile then you don&amp;#39;t have a frame of reference to understand when and how to back off from particular practices without losing the value of the agile approach. (Of course, his comment wasn&amp;#39;t as verbose as that. Verbosity is an affliction of mine.) Anyway, I&amp;#39;ve gone all the way more than once and in more than one context. I think I have a frame of reference to understand when and how to back off. I recently had an initial visit with a new client. Until I understand their organizational culture and their values pretty well, I won&amp;#39;t be turning those knobs anywhere near eleven.  &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1964378</comments>
	
      <pubDate>Wed, 18 Nov 2009 10:38:14 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>UMLet UML diagramming tool</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956439</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956439</guid>

      <description>&lt;br&gt;&lt;p&gt; I found a UML diagramming tool that I think is well suited to agile modeling. It&amp;#39;s called UMLet, and it runs either standalone or as an Eclipse plugin. The product home page is here: &lt;a href=&quot;http://www.umlet.com/&quot;&gt;http://www.umlet.com&lt;/a&gt;.  &lt;/p&gt; &lt;p&gt; The reason I say it&amp;#39;s suitable for agile modeling is that it works well, but it isn&amp;#39;t slick and it doesn&amp;#39;t have ten thousand options for making the diagrams look pretty. When a diagramming tool is too slick, it can be tempting to spend a lot of time fooling with it just because it&amp;#39;s fun, and to go into more detail in the diagrams than is appropriate for the agile style of development. &lt;/p&gt; &lt;p&gt; If you like making pretty pictures, or you think our job is to produce highly-polished diagrams rather than working software, or you&amp;#39;re a stickler for using the specific icons defined for a particular version of the UML, or if you enjoy playing with diagramming tools to the exclusion of pulling work items through to the &amp;quot;done&amp;quot; state, then you might not appreciate UMLet. If you&amp;#39;d like a simple tool to produce high-level UML diagrams easily, then you might like this tool. &lt;/p&gt; &lt;p&gt; Here are some of the reasons I like UMLet: &lt;/p&gt;&lt;ol&gt; &lt;li&gt;It&amp;#39;s Open Source software.&lt;/li&gt; &lt;li&gt;It runs on all mainstream platforms: Microsoft Windows, Apple OS X, and Linux.&lt;/li&gt; &lt;li&gt;It runs standalone or as an Eclipse plugin.&lt;/li&gt; &lt;li&gt;It&amp;#39;s simple enough to use that it doesn&amp;#39;t require a user&amp;#39;s manual or a training course.&lt;/li&gt; &lt;li&gt;It supports all the usual suspects - class diagrams, sequence diagrams, use case diagrams, etc. - and is good enough for high-level diagramming without falling in love with its own reflection. It&amp;#39;s just crude enough that you won&amp;#39;t be tempted to play with it all day long. One might say it&amp;#39;s perfect in its imperfection. &lt;/li&gt;&lt;li&gt;It&amp;#39;s easy to clip out a diagram and save it as a graphics file, to drop onto your project wiki or into a presentation or document.&lt;/li&gt; &lt;li&gt;It saves the data in XML, so if you have to rescue your diagrams at some future time when UMLet is no longer supported or goes commercial, you at least have some reasonable basis for doing so.&lt;/li&gt; &lt;li&gt;It&amp;#39;s easy to check the diagrams into and out of your version control system along with the production code and test suite. Easy to script all that, too.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; Here&amp;#39;s a crude class diagram I put together in a few minutes&amp;#39; time using UMLet. I&amp;#39;m sure it isn&amp;#39;t academically correct, and that&amp;#39;s okay with me. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/classes.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/classes.jpg&quot; alt=&quot;&quot; width=&quot;300px&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; The only problem I&amp;#39;ve seen with UMLet is that it throws NullPointerExceptions out of the AWT dispatch thread quite frequently. It doesn&amp;#39;t seem to do any harm, though.  &lt;/p&gt; &lt;p&gt; I&amp;#39;m using UMLet on Ubuntu Linux. &lt;a href=&quot;http://kotowanandesu.blogspot.com/2009/10/umlet-install.html&quot;&gt;Here&amp;#39;s how I installed it&lt;/a&gt;. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1956439</comments>
	
      <pubDate>Thu, 22 Oct 2009 13:21:26 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>Read It Later plugin for Firefox</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956421</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956421</guid>

      <description>&lt;br&gt;&lt;p&gt; When looking for information online, I often come across interesting articles or blogs that I want to read later. I had been bookmarking them in a folder created for the purpose. When I remembered to look there, the items may or may not still have been relevant and timely. In any case, I had to clean out that folder manually, since they weren&amp;#39;t really bookmarks I needed to keep for repeated reference. I recall a day when there were over a hundred items in that folder, and I didn&amp;#39;t even remember why I had tagged most of them. &lt;/p&gt; &lt;p&gt; One of the things I came across while looking for other information was a Firefox plugin called &lt;em&gt;Read It Later&lt;/em&gt;. Its purpose is to manage a special folder in your bookmarks file where you can stick URLs of sites you&amp;#39;d like to read later. This is for items you&amp;#39;d like to read on a one-time basis; it&amp;#39;s not a substitute for RSS feeds. It can also save the pages locally for offline reading. It&amp;#39;s easy to move items to your permanent bookmarks or delete them when you&amp;#39;ve read them. The plugin doesn&amp;#39;t actually do all that much work, but it&amp;#39;s a time-saver and it&amp;#39;s very well-behaved code.  &lt;/p&gt; &lt;p&gt; Here&amp;#39;s a screenshot of a Firefox window with the Read It Later homepage displayed, and showing the elements the plugin adds to the toolbar. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/readitlaterscreenshot.png&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/readitlaterscreenshot.png&quot; alt=&quot;&quot; width=&quot;300px&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; To add an item to the read it later folder, click on the checkmark near the right-hand side of the toolbar. On the right, the drop-down list of saved sites is open in the screenshot. Simple and useful. I&amp;#39;ve had no problems with it so far. The Read It Later homepage is here: &lt;a href=&quot;http://readitlaterlist.com/&quot;&gt;http://readitlaterlist.com/&lt;/a&gt;. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1956421</comments>
	
      <pubDate>Thu, 22 Oct 2009 12:20:59 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>Is this a process smell?</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956351</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956351</guid>

      <description>&lt;br&gt;&lt;p&gt; I was just scrolling back through old blog posts, trying to decide which ones to keep when I revamp the site, and I came across &lt;a href=&quot;http://www.davenicolette.net/index.blog/1887569/wordunit/&quot;&gt;a post from last February&lt;/a&gt; on the subject of tools that provide continuous feedback. I noticed a comment from &lt;a href=&quot;http://spreetree.net/blog/&quot;&gt;Lee Winder&lt;/a&gt; that I had overlooked until now. He writes, &lt;/p&gt; &lt;p style=&quot;margin-left: 32px; margin-right: 32px&quot;&gt; ...we have a system which alerts designers when a new build is ready on the CI machine. &lt;br /&gt;&lt;br /&gt; If we have  fast turn-around, they could be getting alerts every 10/15 minutes, which is certainly to much if they only update once or twice a day. &lt;br /&gt;&lt;br /&gt; Since the alerts are e-mails, I&amp;#39;ve recommended they filter them into a CI folder, only checking the alerts when they need a new build to see when the last one was generated. &lt;/p&gt; &lt;p&gt; I wish I had seen this earlier. It seems to me the statement, &amp;quot;they could be getting alerts every 10/15 minutes, which is certainly to much if they only update once or twice a day,&amp;quot; suggests a &lt;em&gt;process smell&lt;/em&gt;. It may or may not be a real problem, but it sounds questionable in the context of agile-style workflow. It may be worth finding out why (1) the team is only updating (checking in?) once or twice a day, and (2) why they think that is satisfactory.  &lt;/p&gt; &lt;p&gt; It isn&amp;#39;t &lt;em&gt;necessarily&lt;/em&gt; a problem. &amp;quot;Smell&amp;quot; doesn&amp;#39;t automatically mean &amp;quot;bad;&amp;quot; it just means, &amp;quot;Find out where the smell is coming from, &lt;em&gt;in case&lt;/em&gt; it&amp;#39;s a problem.&amp;quot; It might only be that you neighbor&amp;#39;s cooking smells funny. OTOH, it may be that your curtains are on fire. It doesn&amp;#39;t hurt to find out for sure. &lt;/p&gt; &lt;p&gt; If this team is updating only once or twice a day, then by implication they&amp;#39;re only running their own build once or twice a day. Lee&amp;#39;s company does video game development in C++, and the practical limit to the number of updates per day this team can make may be different than for typical business application development in languages like Java and C#. Game development involves several distinct types of programming, and the practical maximum builds per day may be different for this team than for other teams working on the same game. Even so, it might be good to understand exactly why they are limited to just one or two builds per day, just in case the curtains are on fire. Couldn&amp;#39;t hurt. &lt;/p&gt; &lt;p&gt; The notifications aren&amp;#39;t from this team&amp;#39;s own build; they are consuming a build from another team. &lt;em&gt;That&lt;/em&gt; team is updating at least every 10 to 15 minutes; not bad. A simpler solution might be to remove this team from the distribution list for that build&amp;#39;s automatic notification. There&amp;#39;s no need to have the email server churning when the notifications aren&amp;#39;t useful. Team members have to go in and delete all the useless emails at some point, too. Maybe it&amp;#39;s low enough impact that it doesn&amp;#39;t matter, in context. It &lt;em&gt;sounds&lt;/em&gt; a bit wasteful, anyway. &lt;/p&gt; &lt;p&gt; An &lt;a href=&quot;http://c2.com/cgi/wiki?InformationRadiator&quot;&gt;information radiator&lt;/a&gt; is sometimes helpful in cases when one team needs the latest stable build from another team. I&amp;#39;ve seen cases when a large monitor is set up in each team room showing the build status for all the parts of the project that are in flight at the moment. This team would be able to tell at a glance whether they needed to pull a new build. I don&amp;#39;t know which tools they&amp;#39;re using at Lee&amp;#39;s place, but I&amp;#39;ve seen this done using &lt;a href=&quot;http://code.google.com/p/bigvisiblecruise/&quot;&gt;Big Visible Cruise&lt;/a&gt; in conjunction with &lt;a href=&quot;http://cruisecontrol.sourceforge.net/&quot;&gt;Cruise Control&lt;/a&gt;. It may be possible with other CI servers, as well. Just a thought. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1956351</comments>
	
      <pubDate>Thu, 22 Oct 2009 09:31:44 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>Agiles2009 Conference</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956180</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1956180</guid>

      <description>&lt;br&gt;&lt;p&gt; &lt;a href=&quot;http://www.agiles2009.org&quot;&gt;&amp;Aacute;giles 2009&lt;/a&gt; took place on October 6-9 in Florianopolis, Brazil. It was the second in a series of agile development conferences bringing leading-edge software development and project management practices to Latin America. The first was held last year in &lt;a href=&quot;http://www.agiles2008.org&quot;&gt;Buenos Aires, Argentina&lt;/a&gt;. It was organized by a small group of highly motivated and dedicated people, primarily a group that had met during their university years in Buenos Aires and who are driving agile and lean adoption forward in Argentina, but also including professionals from several other Latin American countries who share a passion for agile development. The first conference was a great success. The second was at least as informative and enriching, if not moreso.  &lt;/p&gt; &lt;p&gt; Of course, these are not the only agile- and/or lean-focused events in Latin America, but they are the largest and they seek to bring in international participants. With strong support from the &lt;a href=&quot;http://www.agilealliance.org&quot;&gt;Agile Alliance&lt;/a&gt; and from key commercial sponsors, the &amp;Aacute;giles conferences bring together agile and lean practitioners and researchers from across the continent as well as from North America and Europe and help tie together the various local and national agile/lean adoption movements in Latin America.  &lt;/p&gt; &lt;p&gt; In addition to Latin American thought leaders in agile and lean adoption, the conference included several well-known figures in the general agile movement, including &lt;a href=&quot;http://futureworksconsulting.com/what-we-know/who-we-are&quot;&gt;Diana Larsen&lt;/a&gt;, &lt;a href=&quot;http://www.exampler.com/&quot;&gt;Brian Marick&lt;/a&gt;, &lt;a href=&quot;http://www.industriallogic.com/&quot;&gt;Joshua Kerievsky&lt;/a&gt;, &lt;a href=&quot;http://agilefaqs.com/nareshjain.html&quot;&gt;Naresh Jain&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/pub/david-hussman/0/44a/21&quot;&gt;David Hussman&lt;/a&gt;, and others. There were too many excellent sessions to describe in a blog post, and the quality of those presented by Latin American speakers was on par with that of the better-known speakers. Look to this region for the next generation of leaders in moving the industry forward with effective management and software development methods.  &lt;/p&gt; &lt;p&gt; Several participants took some great photos of the event. You can find links to their photo albums on the Latin American Agile Community site: &lt;a href=&quot;http://sites.google.com/site/comunidadagiles/agiles-2009&quot;&gt;http://sites.google.com/site/comunidadagiles/agiles-2009&amp;gt;&lt;/a&gt; I didn&amp;#39;t take any &lt;em&gt;great&lt;/em&gt; photos, but I took a few mediocre ones. Here&amp;#39;s a shot of me with some of the Argentines I met last year, as we began to gather in the lobby prior to the opening keynote: &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/argentines-and-me.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/argentines-and-me.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; Left to right: &lt;a href=&quot;http://www.linkedin.com/in/aialfonso&quot;&gt;Alejandra Alfonso&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/aeidelman&quot;&gt;Adri&amp;aacute;n Eidelman&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/emiliogutter&quot;&gt;Emilio Gutter&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/jgabardini&quot;&gt;Juan Gabardini&lt;/a&gt;, and me. &lt;/p&gt; &lt;p&gt; This one is from Joke Vandemaele&amp;#39;s presentation on Power Workshops, a technique she has been using successfully to launch complex agile projects at a company in Belgium. The visuals on the wall are the ones from an actual project that she used as an example. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/joke-power-workshops.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/joke-power-workshops.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; Brian Marick made himself available for pairing during the conference. He invited anyone who wanted to sit with him to work on an application for his wife&amp;#39;s veterinary practice. Here he has grabbed a spot in the lobby and is pairing with one of the conference participants as others look on. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/brian-pairing.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/brian-pairing.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; After the final session on Thursday, a rock band made up of people from &lt;a href=&quot;http://www.oncast.com.br/&quot;&gt;OnCast Technologies&lt;/a&gt;, a Florianopolis-based agile consultancy, put on a concert in the lobby and invited others to join in and jam.  &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/florianopolis-jam.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/florianopolis-jam.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; The conference proper was two days long, and was preceded by two days of training courses. These included a TDD &amp;amp; Refactoring course taught by Naresh, a CSM course taught by &lt;a href=&quot;http://www.linkedin.com/pub/alan-cyment/2/213/142&quot;&gt;Alan Cyment&lt;/a&gt;, a Certified Product Owner course taught by Alexandre Magno, and a course on retrospectives taught by Diana.  &lt;/p&gt; &lt;p&gt; My small contribution was a presentation of my session on &lt;a href=&quot;http://davenicolette.wikispaces.com/Agile+Metrics&quot;&gt;Agile Metrics&lt;/a&gt;. The presentation continues to be popular. This one was standing room only and went overtime, as usual. Although it seems a rather mundane topic, it is clearly one that is on the minds of many project managers and program managers as they learn different ways of planning and tracking projects.  &lt;/p&gt; &lt;p&gt; Florianopolis is quite a nice city. In my spare time I walked around and saw as much of the place as I could. I especially enjoyed the natural scenery around the bay.  &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/shore-5.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/shore-5.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://www.davenicolette.net/images/shore-11.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/shore-11.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://www.davenicolette.net/images/shore-19.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/shore-19.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; The weather was cloudy the whole week. The clouds and mist on the mountaintops in the distance made for an ever-changing scene. &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/mist-1.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/mist-1.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; Some parts of the city reminded me of certain European cities. This is the old central market plaza, for instance: &lt;/p&gt; &lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/shopping-4.jpg&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/shopping-4.jpg&quot; border=&quot;1&quot; alt=&quot;&quot; width=&quot;300px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; All in all, a great conference with great people, and a fantastic place to visit. &lt;/p&gt; &lt;p&gt; With last year&amp;#39;s conference in Argentina and this year&amp;#39;s in Brazil, we&amp;#39;ve all had a chance to try the &lt;em&gt;churrasquerias&lt;/em&gt; in both countries. Both are world-famous for their beef. The burning question on the minds of the conference organizers, since most of them come from those two countries, was: Who has the best beef, Argentina or Brazil? To me, the question reminded me of Belgians and Germans debating about who has the best beer. It&amp;#39;s basically a moot question, since Ireland has the best beer. (In my humble opinion, anyway.) Sorry to disappoint our gracious conference hosts, but I have to say Venezuela has the best beef. &amp;Aacute;giles2010 will be in Lima, Per&amp;uacute;, so the true test must wait for a future year. Fortunately, the future of agile and lean will be a long one. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1956180</comments>
	
      <pubDate>Wed, 21 Oct 2009 19:05:16 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>Grooving to the buzz</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1949456</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1949456</guid>

      <description>&lt;br&gt;&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;http://www.davenicolette.net/images/teamroom1.jpg&quot; target=&quot;pic&quot; title=&quot;click to enlarge&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/teamroom1.jpg&quot; alt=&quot;photo of team room&quot; width=&quot;250px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://www.davenicolette.net/images/teamroom2.jpg&quot; target=&quot;pic&quot; title=&quot;click to enlarge&quot;&gt;&lt;img src=&quot;http://www.davenicolette.net/images/teamroom2.jpg&quot; alt=&quot;photo of team room&quot; width=&quot;250px&quot; align=&quot;center&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt; An agile team at my current client finally got a proper team work room set up, following lengthy negotiations with the Furniture Police. They had been working in cubicles that were located next to each other arranged as conveniently as you can imagine cubicles being arranged.  &lt;/p&gt; &lt;p&gt; Although the cubicle set up wasn&amp;#39;t bad, having a true team work space has made a world of difference, even though the whiteboards haven&amp;#39;t arrived yet and they&amp;#39;ve requested wider tables. The team&amp;#39;s throughput tripled in the first iteration after the space was set up. &lt;a href=&quot;http://www.davenicolette.net/agile/index.blog/1804965/xp-high-intensity-low-stress/&quot;&gt;The &amp;quot;buzz&amp;quot; of a well-functioning agile team&lt;/a&gt; is in the air; it was absent in the cubicle environment, even though it was arranged as reasonably as possible and team members collaborated as closely as they could. &lt;/p&gt; &lt;p&gt; &lt;a href=&quot;http://alistair.cockburn.us/Osmotic+communication&quot;&gt;Osmotic communication&lt;/a&gt; and &lt;a href=&quot;http://agilefaq.net/2007/11/03/what-is-promiscuous-pairing/&quot;&gt;promiscuous pairing&lt;/a&gt;, managed &lt;a href=&quot;http://www.pomodorotechnique.com/&quot;&gt;pomodoro-style&lt;/a&gt;, have kept the team&amp;#39;s &lt;a href=&quot;http://c2.com/cgi/wiki$?TruckNumber&quot;&gt;truck number&lt;/a&gt; high and have even reduced the need for such basic overhead activities as the &lt;a href=&quot;http://www.extremeprogramming.org/rules/standupmeeting.html&quot;&gt;daily stand-up&lt;/a&gt;. The team has a stand-up when they need to discuss something or when a stakeholder comes to the team room to participate. Otherwise, they communicate seamlessly and continuously about issues and status.  &lt;/p&gt; &lt;p&gt; We haven&amp;#39;t tried to keep track of every little move the team members make, but I &lt;a href=&quot;http://www.davenicolette.net/agile/index.blog/1810653/the-hard-value-of-team-collocation/&quot;&gt;strongly suspect they&amp;#39;re enjoying cost savings&lt;/a&gt; just by being properly collocated.  &lt;/p&gt; &lt;p&gt; I&amp;#39;m more convinced than ever that a proper team work space is a &lt;a href=&quot;http://www.davenicolette.net/agile/index.blog/1944310/first-dominoes/&quot;&gt;First Domino&lt;/a&gt; agile practice. Why would any software development team choose &lt;em&gt;not&lt;/em&gt; to work this way, especially after all these years of proven effectiveness in the field? &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1949456</comments>
	
      <pubDate>Wed, 30 Sep 2009 20:27:04 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>Rails through thick and thin</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1948946</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1948946</guid>

      <description>&lt;br&gt;&lt;p&gt; It seems as if everyone likes to blog about the fat model and skinny controller idea when they&amp;#39;re just learning about &lt;a href=&quot;http://rubyonrails.org/&quot;&gt;Rails&lt;/a&gt; development. I&amp;#39;m just learning about Rails development, so here&amp;#39;s my blog post on the subject. &lt;/p&gt; &lt;p&gt; The canonical &lt;a href=&quot;http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller&quot;&gt;model-view-controller architecture&lt;/a&gt; calls for the controller to be lightweight. There are good reasons for this, including flexibility to scale across architectural layers, loose coupling, ease of understanding the code, and more. As a Java developer, I typically follow this guideline when building webapps with MVC frameworks like &lt;a href=&quot;http://struts.apache.org/&quot;&gt;Struts2&lt;/a&gt;. It&amp;#39;s only natural for Rails developers to try and conform with this very logical design guideline.  &lt;/p&gt; &lt;p&gt; When you generate Rails code, the out-of-the-box solution has very thin models with most of the logic included in the controllers; quite the opposite of generally-accepted good practice for an MVC app. There&amp;#39;s a lot of advice out there for people who want to skinny-down the controllers, and there&amp;#39;s nothing new about it. For instance, there&amp;#39;s &lt;a href=&quot;http://www.therailsway.com/2007/6/1/railsconf-recap-skinny-controllers&quot;&gt;a nice write-up&lt;/a&gt; by Michael Koziarski dating from 2007. The &amp;quot;before&amp;quot; version of the create method in his ReportsController is a great example of what can happen when you jam too much logic into a controller. In an even earlier example (2006), Jamis Buck &lt;a href=&quot;http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model&quot;&gt;shows the value&lt;/a&gt; of pushing logic from the controller to the model. His example resulting in the find_recent method in the Person model class is excellent.  &lt;/p&gt; &lt;p&gt; But there&amp;#39;s another issue to consider. Rails models are based on the &lt;a href=&quot;http://martinfowler.com/eaaCatalog/activeRecord.html&quot;&gt;ActiveRecord pattern&lt;/a&gt;. As a result, Rails models are &lt;a href=&quot;http://www.codeodor.com/index.cfm/2009/6/17/Strive-for-low-coupling-and-high-cohesion-What-does-that-even-mean/2902&quot;&gt;tightly coupled&lt;/a&gt; to the persistence mechanism. By default, the persistence mechanism is a relational database, although this can be overridden. Because of this coupling, Rails models really don&amp;#39;t feel quite like a domain layer; at least, not to me. It &amp;quot;feels&amp;quot; as if we need another layer between the controller and the model. I&amp;#39;ve heard and read Rails developers resist this idea, sometimes strongly. At the same time, other Rails developers say that pushing too much business logic into the models amounts to substituting a new problem for the old.  &lt;/p&gt; &lt;p&gt; Besides all that, it&amp;#39;s hard to test Rails models without a &lt;a href=&quot;http://www.artima.com/weblogs/viewpost.jsp?thread=126923&quot;&gt;dependency on the database&lt;/a&gt; due to the lack of &lt;a href=&quot;http://www.cs.utexas.edu/~EWD/transcriptions/EWD04xx/EWD447.html&quot;&gt;separation of concerns&lt;/a&gt;. There are tools available to mitigate the problem, such as Thoughtbot&amp;#39;s &lt;a href=&quot;http://github.com/thoughtbot/factory_girl&quot;&gt;FactoryGirl&lt;/a&gt;, but you still end up with some tests touching a real database instance. Tools like FactoryGirl make it easier to define fixtures, but they don&amp;#39;t really isolate you from the database. In a large app, tests that are dependent on a real database instance can affect build times, and long build times tend to have &lt;a href=&quot;http://www.davenicolette.net/agile/index.blog/1817468/shapes-in-the-fog/&quot;&gt;a domino effect&lt;/a&gt; on other good practices.   &lt;/p&gt; &lt;p&gt; So, we want skinny controllers, and Rails models are neither a business layer nor a domain layer, properly speaking. What should we do? I think it&amp;#39;s legitimate to treat the models as a thin persistence wrapper, and to add either helper classes or a distinct layer between the controllers and the models to function as a business layer, if you need one. You might not need a business layer, since most business applications are almost purely CRUD apps, and don&amp;#39;t actually &lt;em&gt;have&lt;/em&gt; much &amp;quot;business logic.&amp;quot; Let the models focus on one concern &amp;mdash; persistence management &amp;mdash; and pull the other concern &amp;mdash; the domain model as such &amp;mdash; into a separate layer. It seems more loosely coupled and cleaner than the default architecture.  &lt;/p&gt; &lt;p&gt; Most of the time, the hand-coded methods people add to Rails models are really just handling a &lt;em&gt;find&lt;/em&gt; with special conditions (as in Jamis&amp;#39; &lt;em&gt;find_recent&lt;/em&gt; example), or saving an object with a change of state, like from &amp;quot;active&amp;quot; to &amp;quot;inactive.&amp;quot; It seems to me this isn&amp;#39;t necessarily part of the model&amp;#39;s responsibility. It feels more like a choice being made by client code. The default model code already handles &lt;em&gt;find&lt;/em&gt; conditions passed in from the client, and already knows how to save whatever values the client passes to it. Custom methods that ostensibly make the intent of the code clearer may not actually do so. They may obfuscate the intent of the code by separating the conditions for a persistence request from the context that makes those conditions obvious. &lt;/p&gt; &lt;p&gt; Going with generated code for models, plus a few declarations to invoke built-in functionality like &lt;em&gt;has_many&lt;/em&gt; and &lt;em&gt;validates_presence_of&lt;/em&gt;, also alleviates the problem of isolating unit tests or specs for model classes. A rule of thumb for unit testing is that we should not test generated code or the plumbing/framework; we should test hand-written code. When you treat Rails models as a thin persistence wrapper, you end up with literally no hand-written code in the model classes. The problem of unit tests that have dependencies on an external database simply disappears, because you don&amp;#39;t &lt;em&gt;have&lt;/em&gt; unit tests for the model classes &amp;mdash; they consist entirely of generated code. Classes in your &lt;em&gt;true&lt;/em&gt; domain layer can be isolated for testing just by mocking the models. In effect, you let the model classes adhere to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Single_responsibility_principle&quot;&gt;Single Responsibility Principle&lt;/a&gt; simply by omitting domain logic from them, leaving them with the single responsibility to wrap the persistence mechanism. Now the &lt;em&gt;single reason to change&lt;/em&gt; is that you need to change the peristence mechanism from a relational database to something else. &lt;/p&gt; &lt;p&gt; I wanted to think through the question of skinny vs. fat to see whether there might be implications for scaling a Rails app. This is what I came up with, FWIW. &lt;/p&gt; &lt;p&gt; The app you get by default from the generators is designed for small-scale, low-volume CRUD apps that live entirely on a single server. Whether you have the bulk of your business logic in a controller or in a model doesn&amp;#39;t make all that much difference. A messy method in a model is just as hard to read as a messy method in a controller, and since the whole mess lives on the same server, it&amp;#39;s a wash. It&amp;#39;s like squeezing a balloon that is half-filled with air. When you squeeze one end, the air bulges into the opposite end. Think of one end as the controller and the other end as the model, and you can see the effect of moving code between the controller and the model. It really comes down to a question of personal preference. &lt;/p&gt; &lt;p&gt; Architectural niceties start to make a difference when you go beyond the level of small-scale, low-volume CRUD apps that live entirely on a single server. How you need to scale depends on the circumstances, and most forms of scaling will not affect the application code at all because they are handled by assets external to the application, like routers or containers. In those cases, it still will not matter whether most of your logic resides in controllers, in models, or in an additional layer between the two.  &lt;/p&gt; &lt;p&gt; Let&amp;#39;s say we begin with a small-scale, low-volume CRUD app that lives entirely on a single server. Over time, the user base for our app grows. We need to be able to handle a higher workload than we did originally. This can be done by running the Rails app with a facility like Passenger for Apache. Passenger is smart about caching query results and keeping objects instantiated in memory between requests. It enables a Rails app to handle a higher transaction volume in a way that is completely transparent to the application code. In this case, your personal preferences regarding controllers and models neither help nor hinder scalability; you are free to do as you please. &lt;/p&gt; &lt;p&gt; Maybe the need for scaling is a question of availability rather than transaction volume, or in addition to transaction volume. In this case, we can set up a router in front of the application that sends requests to alternate copies of the application running on different servers. The servers may be clustered and may support hot failover, or other features to support high availability. This can be done in conjunction with a facility like Passenger, too. The different instances of the app can access the same back-end data store or different ones, as appropriate. There is no effect on the application code, so your personal preferences are still completely valid. &lt;/p&gt; &lt;p&gt; One of the ways we scale Java webapps is by deploying different architectural layers independently. That way, we can deploy multiple controller instances or multiple business layer instances and so on as needs change. The advent of virtual servers makes this approach all the more feasible and responsive to dynamically-changing workload demands. &lt;/p&gt; &lt;p&gt; You wouldn&amp;#39;t normally separate Rails views, controllers, and models physically. If you needed to do so, you could use &lt;em&gt;routes.rb&lt;/em&gt; to route different requests to different instances of the business layer or model layer. I can&amp;#39;t actually think of a use case for it, but in any case it still doesn&amp;#39;t affect the application source code and wouldn&amp;#39;t push you toward thin or thick controllers, particularly. The use cases that drive us to separate components in Java webapps can be supported by deploying multiple copies of the whole Rails webapp. &lt;/p&gt; &lt;p&gt; Another scaling solution is to route requests to different servers based on geographical region or company code or some other piece of information that comes in on the request message. You could create a thin controller layer that does nothing other than interpret the relevant code and pass the request through to another controller residing on a different server. When you have different transaction volumes or different quality-of-service levels for different regions or companies (or whatever), this may be a reasonable way to split the traffic across multiple servers. The base application code still doesn&amp;#39;t have to change; all you need to do is create a new set of controllers, or a single controller, to pass the requests through to the appropriate instance of the app.  &lt;/p&gt; &lt;p&gt; You could conceivably achieve the same goal by defining special routes that included the necessary routing code, rather than introducing another controller layer. In that case, clients would have to include the routing code in the URLs they used to invoke the Rails app. This may or may not be desirable, depending on circumstances. In any case, it has no effect on the application source code, and so your personal preference for skinny or fat controllers is unaffected. &lt;/p&gt; &lt;p&gt; It&amp;#39;s possible that the need for scaling has to do with the volume of data transferred to and from the database. We can accommodate that by changing the database adapter and using a different DBMS product; perhaps moving from MySQL to Oracle or UDB. That&amp;#39;s transparent to the application code, as well, unless you&amp;#39;ve nailed your feet to the floor by using stored procedures. &lt;/p&gt; &lt;p&gt; Even if you&amp;#39;ve nailed your feet to the floor, you can pull them loose again by doing away with the built-in database access in the models and having them call a service layer instead; something like an enterprise service bus, perhaps. Your database resources (or whatever the real source of data happens to be) can be isolated behind the service layer where the details are transparent to your application code. In this case, your personal preference may affect the difficulty of the change.  &lt;/p&gt; &lt;p&gt; This is a fairly typical situation in enterprise IT organizations, including those whose feet are not nailed to the floor. Business apps need to pull data from a variety of back-end sources, and the sources may change without notice provided the interface remains stable. If you&amp;#39;re using a paper-thin model that acts as nothing more than a persistence wrapper, it&amp;#39;s a trivial modification to call the service layer instead of a local database adapter, and your existing unit tests provide a safety net for the changes. If you have a fat model design, you may have more work to do. Realistically, this sort of architectural issue would probably be known at design time, so it&amp;#39;s really an academic exercise. When the day comes that there are a lot of legacy enterprise Rails apps around, it may become more common situation. &lt;/p&gt; &lt;p&gt; Personally, I like the skinny model approach because it simplifies testing. I don&amp;#39;t mind seeing a bit of business logic in the controllers, and since Rails is a tool for CRUD webapps, there won&amp;#39;t be extensive business logic in most cases anyway. If the controllers start to look too fat, it&amp;#39;s easy enough to move some of the logic into helper classes. If the helper classes call the models, then you can think of them as a sort of &amp;quot;business layer,&amp;quot; although that&amp;#39;s really a matter of code organization and readability and not a matter of architecture, since the Rails app will be deployed all in one chunk. Another way to say it (although in a post this long the last thing we need is another way to say it) is that for a Rails app MVC is a design pattern rather than an architectural pattern.  &lt;/p&gt; &lt;p&gt; My conclusion about this matter is that it doesn&amp;#39;t make a difference one way or another. Structure your Rails app in the way that makes the most sense to you. If you need to scale it later on, it will make little or no difference whether you&amp;#39;ve written thick or thin controllers. Of course, this conclusion doesn&amp;#39;t automatically apply to other languages or frameworks, or to applications other than webapps. &lt;/p&gt; &lt;p&gt; I reserve the right to change my mind without notice as I continue to learn about Rails development. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1948946</comments>
	
      <pubDate>Tue, 29 Sep 2009 14:44:21 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>Some CFEclipse templates</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1947896</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1947896</guid>

      <description>&lt;br&gt;&lt;p&gt; I&amp;#39;m just wrapping up an engagement working with a team that uses ColdFusion. I found that ColdFusion requires a considerable amount of redundant typing, and I created a few Eclipse templates to save keystrokes. The templates work with the CFEclipse plug-in and the unit testing framework MXUnit. I&amp;#39;m sharing them here in case anyone else can use them. They are: &lt;/p&gt; &lt;table border=&quot;1&quot; width=&quot;400px&quot; style=&quot;font-size: 0.8em&quot;&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Name&lt;/th&gt; &lt;th&gt;Description&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ad&lt;/td&gt; &lt;td&gt;Insert call to assertDatesAreEqual&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ae&lt;/td&gt; &lt;td&gt;Insert MXUnit assertEquals in a cfset tag&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ef&lt;/td&gt; &lt;td&gt;Insert MXUnit assertFalse in a cfset tag&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;arg&lt;/td&gt; &lt;td&gt;Insert cfargument tag template&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;at&lt;/td&gt; &lt;td&gt;Insert MXUnit assertTrue in a cfset tag&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ax&lt;/td&gt; &lt;td&gt;Insert try/catch for MXUnit expecting an exception&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;before&lt;/td&gt; &lt;td&gt;MXUnit setUp function&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;fail&lt;/td&gt; &lt;td&gt;Insert MXUnit fail in a cfset tag&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;fun&lt;/td&gt; &lt;td&gt;Insert cffunction tag template&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;helper&lt;/td&gt; &lt;td&gt;Instantiate a TestHelpers component&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;if&lt;/td&gt; &lt;td&gt;Insert cfif tag template&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;init&lt;/td&gt; &lt;td&gt;Insert template for an init function&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;loop&lt;/td&gt; &lt;td&gt;Insert cfloop tag&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ret&lt;/td&gt; &lt;td&gt;Insert cfreturn tag&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;set&lt;/td&gt; &lt;td&gt;Insert cfset tag&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;test&lt;/td&gt; &lt;td&gt;MXUnit test function&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;this=&lt;/td&gt; &lt;td&gt;Insert template cfset assignment from arguments&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt; Download this zip file: &lt;a href=&quot;http://www.davenicolette.net/goodies/cfeclipse_helpers.zip&quot;&gt;cfeclipse_helpers.zip&lt;/a&gt;. The archive contains: &lt;/p&gt;&lt;ul&gt; &lt;li&gt;cfeclipse_templates.xml&lt;/li&gt; &lt;li&gt;MockSystemClock.cfc&lt;/li&gt; &lt;li&gt;TestHelpers.cfc&lt;/li&gt; &lt;li&gt;TestHelpersTest.cfc&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; To install the templates, with the CFEclipse view open in Eclipse, go to Window -&amp;gt; CFEclipse -&amp;gt; Editor -&amp;gt; Templates and choose Import. Point to the templates file and import it. &lt;/p&gt; &lt;p&gt; The .cfc files are test helpers that help isolate MXUnit tests that need to mock the system date. &lt;/p&gt; &lt;p&gt; Enjoy. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1947896</comments>
	
      <pubDate>Fri, 25 Sep 2009 12:37:10 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
    <item>
      <title>The new interview</title>
      <link>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1947137</link>
      <guid>http://dnicolet1.tripod.com/agile/index.blog?entry_id=1947137</guid>

      <description>&lt;br&gt;&lt;p&gt; I&amp;#39;m not sure whether this is a US tradition or if it&amp;#39;s more general, but job candidates in this country tend to oversell themselves. Americans (and maybe others, as well; I can&amp;#39;t speak to that) either believe they are gods or they assume they have to convince hiring managers that they are gods in order to have a chance of getting a job. &lt;/p&gt; &lt;p&gt; Yesterday, the team I&amp;#39;m presently coaching checked out two candidates for temporary contract positions on their project. This team spends very little time talking to candidates, and quickly moves to the audition phase when candidates pair with different team members to complete a small, contrived application. They have learned through experience that this is really the only meaningful part of the process, and that they cannot rely on r&amp;eacute;sum&amp;eacute;s or interviews (or certifications &amp;mdash; pay attention, ye who advocate developer certification programs!) to find out what a person can do. In fact, most of them don&amp;#39;t bother to read candidates&amp;#39; r&amp;eacute;sum&amp;eacute;s. They have learned that there is rarely anything factual in a r&amp;eacute;sum&amp;eacute;. &lt;/p&gt; &lt;p&gt; I was present during the interview phase and observed portions of the audition phase, although I didn&amp;#39;t comment or interfere. It seemed to me that both candidates were reasonably good at the work. Neither was extraordinary, but they were okay. Clearly, they had at least a moderate level of practical experience in both the technology areas relevant to the project. It seemed to take them a long time to get through the little project, but they did manage to get it done. They probably would have performed adequately on the project.  &lt;/p&gt; &lt;p&gt; The team decided the two were not up to par technically. I&amp;#39;m speculating that the candidates may have screwed themselves during the interview phase.  &lt;/p&gt; &lt;p&gt; Both did a wonderful job of selling themselves. Based solely on their own words, one would expect each to be a one-of-a-kind expert in the technologies relevant to the project, and an all-around genius generally. By the time they had finished describing themselves, I was wondering why their names aren&amp;#39;t household words, like Einstein or Newton. They didn&amp;#39;t perform badly in the audition phase, so I have to wonder whether they set expectations too high during the interview phase. There is absolutely no way they lived up to their respective self-portraits. Frankly, I&amp;#39;d be surprised if &lt;em&gt;anyone&lt;/em&gt; could have. &lt;/p&gt; &lt;p&gt; I wonder whether this is a difference between the conventional way of interviewing and the more empirical approach that is becoming more and more commonplace in agile software development circles. People used to have to sell themselves to employers strictly on the basis of words &amp;mdash; both written and spoken. Nowadays, the words can backfire unless the candidate can confirm their claims when they sit down to write code. Given the extreme degree of exaggeration typically found in r&amp;eacute;sum&amp;eacute;s, it&amp;#39;s unlikely many individuals can live up to their own sales pitch.  &lt;/p&gt; &lt;p&gt; These two may well have been selected had they sold themselves as reasonably competent developers with a balance between confidence and humility who enjoyed a collaborative working style and wanted to work with a high-performing team where they could share knowledge and learn from their peers while delivering value to their customers. They didn&amp;#39;t. &lt;/p&gt; &lt;p&gt; Maybe next time. &lt;/p&gt;</description> 
      <comments>http://dnicolet1.tripod.com/agile/control.comment?a=render&amp;blog_id=1048988&amp;entry_id=1947137</comments>
	
      <pubDate>Wed, 23 Sep 2009 12:35:23 -0500</pubDate>
      <source url="http://dnicolet1.tripod.com/agile/rss.xml">effective software development</source>     
    </item>
    
  </channel>
</rss>

  






