<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Peter on Rails</title>
    <link>http://marklunds.com</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Lessons Learned in Ruby on Rails and related technologies. By Peter Marklund.</description>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/petermarklund" /><feedburner:info uri="petermarklund" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
      <title>Launching new Website</title>
      <description>We just launched a new website for We+ at &lt;a href="http://www.weplus.se"&gt;www.weplus.se&lt;/a&gt;. The website is available in both a swedish and english version and is responsive. Please check it out and let us know if you think We+ would be a good fit for your company!&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/_xRQJJQuQts" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 22 May 2013 16:25:47 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/439</guid>
      <link>http://marklunds.com/articles/one/439</link>
      <category>The IT Business</category>
    </item>
    <item>
      <title>We+</title>
      <description>&lt;p&gt;
  This autumn I have joined &lt;a href="http://www.weplus.se"&gt;We+&lt;/a&gt; - a new exciting startup in the exercise and health area. Our product uses the power of small groups and positive peer pressure to promote exercise among employees. We have already built a first version of the system and done Alpha testing and this week we are kicking off a pilot with two large swedish companies. Exciting!
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/8x66T6xHzJ4" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 20 Nov 2012 08:52:12 CET</pubDate>
      <guid>http://marklunds.com/articles/one/438</guid>
      <link>http://marklunds.com/articles/one/438</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Creating and Deploying an EdgeRails (Rails 4) Application to Heroku</title>
      <description>&lt;p&gt;
I wanted to create a new Rails app based on EdgeRails (Rails 4) and I didn't find much when I googled around so I ended up creating &lt;a href="https://gist.github.com/3025502"&gt;a Gist on Github&lt;/a&gt; and answering the corresponding &lt;a href="http://stackoverflow.com/questions/3821077/how-to-create-edge-rails-application/11277919#11277919"&gt;question on Stack Overflow&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
  I'm really happy to see how Rails continues to evolve &lt;a href="http://www.edgerails.info/"&gt;through thousands of small improvements&lt;/a&gt;, many of which are features which I know would have been useful in projects I have worked on in the past. I hope to be able to cover some of the new stuff in Rails 4 later.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/_6XPeojOfBI" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 30 Jun 2012 23:50:16 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/437</guid>
      <link>http://marklunds.com/articles/one/437</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Explore the Future of Tablet Publishing With Mag+</title>
      <description>We have a great job opening right now for Ruby developers at &lt;a href="http://www.magplus.com"&gt;Mag+&lt;/a&gt;. Mag+ helps bring &lt;a href="http://www.magplus.com/publications"&gt;magazines and other publications&lt;/a&gt; (such as the IKEA catalogue) to the iPad and other tablets. Please check out the &lt;a href="http://www.magplus.com/about/jobs/ruby-developer-%E2%80%93%C2%A0stockholm/"&gt;job ad&lt;/a&gt; if you are interested.&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/BoqGZiWJL8s" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 20 Sep 2011 10:51:17 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/436</guid>
      <link>http://marklunds.com/articles/one/436</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Course Material for a Two Day Introductory Ruby Course</title>
      <description>&lt;p&gt;
  I'm giving a series of two day introductory Ruby courses to C++ programers at Ericsson here in Stockholm and I've made the &lt;a href="https://github.com/peter/ruby_basic"&gt;course material&lt;/a&gt; available on Github. The course material includes slides (keynote and pdf) as well as Ruby code examples. For the exercise part I am relying on the &lt;a href="http://rubykoans.com"&gt;Ruby Koans&lt;/a&gt; and they have been much appreciated.
&lt;/p&gt;

&lt;p&gt;
  I enjoy being back in the teacher role and I hope to be able to teach courses like this many times again in the future.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/fRGm8wjH03Q" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 02 Sep 2011 17:03:19 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/435</guid>
      <link>http://marklunds.com/articles/one/435</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Rails Tip: Inserting NULL to the Database Instead of Empty Strings</title>
      <description>&lt;p&gt;
  The value &lt;a href="http://en.wikipedia.org/wiki/Null_%28SQL%29"&gt;NULL&lt;/a&gt; in a relational database represents the absence of a value. Empty text fields and text areas in HTML forms on the other hand get submitted in Rails as empty strings. This means you can easily end up with empty strings in the database where you would expect NULL values. I came up with the following workaround for our ActiveRecord models:
&lt;/p&gt;

&lt;script src="https://gist.github.com/715518.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/Nly4fkbJB5E" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 25 Nov 2010 16:32:03 CET</pubDate>
      <guid>http://marklunds.com/articles/one/434</guid>
      <link>http://marklunds.com/articles/one/434</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Rails 3.0.3 Backwards Incompatible for File Uploads</title>
      <description>&lt;p&gt;
  We upgraded from Rails 3.0.1 to Rails 3.0.3 yesterday and sadly this broke file uploads for us in production. What do we conclude from this other than that we are missing integration tests for file uploads? Well, one noteworthy thing is that the Rails 3.0.3 release is not quite as backwards compatible &lt;a href="http://weblog.rubyonrails.org/2010/11/15/rails-3-0-3-faster-active-record-plus-plenty-of-fixes"&gt;as announced&lt;/a&gt;, at least not when it comes to file uploads. In Rails file fields in multipart forms are exposed in the params hash as an ActionDispatch::Http::UploadedFile object. As of &lt;a href="https://github.com/rails/rails/commit/c4528deec12d738f537745ff1622756db497cb05"&gt;a commit&lt;/a&gt; by tenderlove on the 5:th of October this class no longer inherits from Tempfile but instead delegates to Tempfile (i.e. tenderlove favored composition over inheritance like the GoF prescribes). Unfortunately, the UploadedFile class only delegates a handful of methods and not two important methods that we happened to be using, namely open and path. So now, for example when getting the path of the tempfile we have to fetch the tempfile first: 
&lt;/p&gt;

&lt;pre&gt;
  params[:my_file].tempfile.path
&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/BlLsozsjzQU" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 18 Nov 2010 10:49:27 CET</pubDate>
      <guid>http://marklunds.com/articles/one/433</guid>
      <link>http://marklunds.com/articles/one/433</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Testing Rails Migrations</title>
      <description>&lt;p&gt;
  Is it worthwhile testing Rails ActiveRecord migrations? After all, they are only intended to be run once so regression testing isn't an issue. I honestly haven't tested my migrations much in the past but I recently decided to &lt;a href="https://gist.github.com/700194"&gt;give it a try&lt;/a&gt;. I was surprised by the fact that it wasn't very different from testing any other part of my application. My test didn't end up having very good coverage so I still needed to test the migration manually. As usual when writing tests, I found that it drove a series of extract method refactorings. I went from having all code in the up method to having five shorter methods. A different approach to migration testing is to add sanity checks at the end of migrations that output an error message in production if the outcome of the migration wasn't what was expected.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/LBgC8DIkSAo" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 15 Nov 2010 10:39:27 CET</pubDate>
      <guid>http://marklunds.com/articles/one/432</guid>
      <link>http://marklunds.com/articles/one/432</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Heroku Deploys With Rollbacks and Changelog</title>
      <description>&lt;p&gt;
  One of the features I miss from Capistrano is the ability to easily do rollbacks when deploying to Heroku. What you can easily do though is git tag your releases and then do a rollback by pushing the previous release tag. I've created a RubyGem called &lt;a href="https://github.com/peter/heroku_release"&gt;heroku_release&lt;/a&gt; that does this. The gem has a few additional features such as the ability to generate a CHANGELOG file from the release tags and their comments. I also use it to generate a version file so that I can check on the live server what version of the code it is running.
&lt;/p&gt;

&lt;p&gt;
 It's interesting to note that Heroku is &lt;a href="http://blog.heroku.com/archives/2010/11/5/hug-recap/"&gt;apparently&lt;/a&gt; working on supporting release management and logging - two problems I have ended up rolling my own solutions for recently. I look forward to seeing what they have come up with.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/oBR4Aa4HBH8" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 05 Nov 2010 11:34:22 CET</pubDate>
      <guid>http://marklunds.com/articles/one/431</guid>
      <link>http://marklunds.com/articles/one/431</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Ruby Debug Printouts</title>
      <description>&lt;p&gt;
	It can get really tiresome and repetitive to do debug printouts with puts. I've created a simple RubyGem called
	&lt;a href="https://github.com/peter/debug_log"&gt;debug_log&lt;/a&gt; that gives you a convenient way of evaluating and printing variables and other Ruby expressions
	that you want to debug. Here is an example:
&lt;/p&gt;

&lt;script src="https://gist.github.com/663900.js?file=gistfile1.rb"&gt;&lt;/script&gt;

&lt;p&gt;
	It's funny how I created this gem pretty much at the same time as Niclas Nilsson created his &lt;a href="https://github.com/niclasnilsson/dp"&gt;dp gem&lt;/a&gt;.
  I owe the approach to patching the binding object to Niclas. I think that is a beautiful solution as it avoids you having to pass the binding object as an argument.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/jqRM54yBRn8" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 05 Nov 2010 11:00:42 CET</pubDate>
      <guid>http://marklunds.com/articles/one/430</guid>
      <link>http://marklunds.com/articles/one/430</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Ruby Testing: Avoid Stubbing Non-Existent Methods with Mocha</title>
      <description>&lt;p&gt;
  Mocks and stubs can be fragile and come back and bite you when they can get out of sync with your code. One way this can happen is that a method is renamed or you misspell the method name. To avoid this issue you can configure Mocha to disallow stubbing and mocking of non-existent methods. I've come up with two new methods for the cases where you are working with messages implemented with method_missing:
&lt;/p&gt;

&lt;script src="http://gist.github.com/658203.js?file=gistfile1.rb"&gt;&lt;/script&gt;

&lt;p&gt;
  It is interesting to note that this extension of Mocha is possible because of its flexible and clever design. Mocha was recently updated to version 0.9.9. I am grateful to James Mead (Floehopper) for providing this excellent testing library.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/SiW8MX0hpY4" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 01 Nov 2010 15:04:42 CET</pubDate>
      <guid>http://marklunds.com/articles/one/429</guid>
      <link>http://marklunds.com/articles/one/429</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Request Log - RubyGem for Logging Rack (Rails) Web Requests to MongoDB</title>
      <description>&lt;p&gt;
  Prompted by the fact that Heroku doesn't keep the Rails request logs around I went out looking for a logging solution. What I've ended up with is &lt;a href="http://github.com/peter/request_log"&gt;Request Log&lt;/a&gt; - a simple &lt;a href="https://rubygems.org/gems/request_log"&gt;RubyGem&lt;/a&gt; for logging web requests to MongoDB.
&lt;/p&gt;

&lt;p&gt;
  My experiences with logging to MongoDB so far have been very positive. I see big potential in logging web requests to a database. The reason MongoDB is so well suited for the task is its high performance and strong query capabilities. This allows you to do advanced queries such as "give me all requests in this time period, with this response, status, this execution time, these parameters etc.". Each web request becomes a document in MongoDB and if you choose your database fields wisely you have a great tool at your disposal for statistics, monitoring, and debugging etc. 
&lt;/p&gt;

&lt;p&gt;
  I'm curious to see how we'll be able to design and use our web request logs in the project I'm currently in. I'll report back here any interesting findings that we make.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/WUfpZnv2H3E" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 29 Oct 2010 10:31:50 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/428</guid>
      <link>http://marklunds.com/articles/one/428</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Rails Presentation: Minimizing Library Dependencies</title>
      <description>&lt;p&gt;
  I gave a presentation tonight entitled "Minimizing Library Dependencies" at the &lt;a href="http://rails.se/rails/show/SHRUG+25+Oktober+2010"&gt;Stockholm Ruby User Group (SHRUG) meeting&lt;/a&gt;. The event was hosted by MediaPilot and sponsored (with beer) by Auktionskompaniet and it turned out to be a huge success with 73 registered attendees, great presentations and atmosphere. I talked to David Wennergren about hosting the next meetup and our ambition is to have about one per quarter. It's great to see the community coming to life again! 
&lt;/p&gt;

&lt;p&gt;
  The slides for my presentation are &lt;a href="http://github.com/peter/presentation_library_dependencies"&gt;hosted on Github&lt;/a&gt; and are also available &lt;a href="http://marklunds.com/s5/library_dependencies/html/all.html"&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/polDQALoI4k" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 25 Oct 2010 23:14:33 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/427</guid>
      <link>http://marklunds.com/articles/one/427</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Migrating RSpec to Mocha</title>
      <description>&lt;p&gt;
  Over at the MyNewsdesk developer blog:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://developer.newsdesk.se/2010/05/29/migrating-rspec-to-mocha/"&gt;Migrating RSpec to Mocha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/iJCzc4QpPOs" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 29 May 2010 22:24:41 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/426</guid>
      <link>http://marklunds.com/articles/one/426</link>
      <category>Programming</category>
    </item>
    <item>
      <title>PostgreSQL Unreliable Default Sort Order and Random Rails Test Failures</title>
      <description>&lt;p&gt;
  More good stuff from the MyNewsdesk Developer Blog:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://developer.newsdesk.se/2010/05/11/postgresql-random-sort-order-causing-random-rails-test-failures/"&gt;PostgreSQL Unreliable Default Sort Order and Random Rails Test Failures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/Hvr5EzS7hrI" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 11 May 2010 09:33:26 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/425</guid>
      <link>http://marklunds.com/articles/one/425</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Rails 2.3.2 Bug and Rails Cache Enable/Disable</title>
      <description>&lt;p&gt;
  Two new posts from the MyNewsdesk Developer Blog:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://developer.newsdesk.se/2010/05/05/rails-232-bug-sending-multipart-email-breaks-when-current-directory-is-not-rails_root/"&gt;Rails 2.3.2 Bug - Sending Multipart Email Breaks When Current Directory is not RAILS_ROOT&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://developer.newsdesk.se/2010/05/04/enablingdisabling-the-rails-cache/"&gt;Enabling/Disabling the Rails Cache&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/YgiAg3dYVGc" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 05 May 2010 16:15:14 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/424</guid>
      <link>http://marklunds.com/articles/one/424</link>
      <category>Programming</category>
    </item>
    <item>
      <title>New Plugins For Rails Model Caching: Cachable Model</title>
      <description>&lt;p&gt;
  As part of an ongoing effort to offload out database at MyNewsdesk &lt;a href="http://developer.newsdesk.se/2010/04/14/announcing-cachable-model-a-new-plugin-for-caching-your-rails-models"&gt;I have released&lt;/a&gt; a new Rails plugin called &lt;a href="http://github.com/newsdesk/cachable_model"&gt;Cachable Model&lt;/a&gt;. The plugin is similar to an older plugin called Cached Model in that it basically caches primary key id lookups for ActiveRecord models. The Cachable Model plugin has an extra feature that lets you cache lookups by other unique columns as well. Here is an example: 
&lt;/p&gt;

&lt;script src="http://gist.github.com/372161.js?file=gistfile1.ru"&gt;&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/chTQ3pdLvv0" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 20 Apr 2010 09:31:58 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/423</guid>
      <link>http://marklunds.com/articles/one/423</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Newsdesk Developer Blog - Back in Business</title>
      <description>&lt;p&gt;
  Now that I'm back working at Newsdesk I've started posting in our developer blog again:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://developer.newsdesk.se/2010/01/15/configuring-proper-404-exception-handling-in-rspec-and-controller-tests/"&gt;Configuring Exception Handling in RSpec and Controller Tests&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://developer.newsdesk.se/2010/01/13/acts_as_bitfield-plugin-now-radio-button-compatible/"&gt;acts_as_bitfield Plugin now Radio Button Compatible&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://developer.newsdesk.se/2010/01/13/rails-i18n-and-404500-error-pages/"&gt;Rails I18n and 404/500 Error Pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/PuBEoUCtV8Q" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 18 Jan 2010 09:02:31 CET</pubDate>
      <guid>http://marklunds.com/articles/one/422</guid>
      <link>http://marklunds.com/articles/one/422</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Book Tip: The Mythical Man Month</title>
      <description>&lt;p&gt;
Fred Brooks is a Computer Science professor who managed 5000 man-year IT projects at IBM in the sixties. His words carry a lot of weight and he certainly has something profound to say about software engineering. The central theme of the book is that of conceptual integrity. It's about the need to have a single architect, a master mind, who oversees all development and makes sure all the parts fit together. "A clean, elegant programming product must present to each of its users a coherent mental model of the application". The ideal scenario for conceptual integrity naturally is having a single programmer. The problem is that some systems are so big that in order to finish them before they are obsolete you need a large number of developers. Much of the book is spent discussing this difficult problem. How do you organize huge developer teams?
&lt;/p&gt;

&lt;!--teaser--&gt;

&lt;p&gt;
Something I found myself wondering as I was reading the book is how large scale open source projects are able to organize themselves and how they differ from commercial projects. The &lt;a href="http://en.wikipedia.org/wiki/Brooks%27s_law#Open_source_software_development"&gt;Wikipedia article&lt;/a&gt; on Brooks law (i.e. adding people to a late project makes it later) suggests that open source projects scale through "Efficient parallelization of work, reducing the communication overhead" and through having a large number of testers.
&lt;/p&gt;

&lt;p&gt;
One of the ideas in the book that resonated the most with me is that of the incremental build model. You start out by building an end-to-end skeleton system, i.e. system with a small subset of the complete functionality. This sounds very much like the &lt;a href="http://www.artima.com/intv/tracer.html"&gt;Tracer Bullet approach&lt;/a&gt; advocated by the Pragmatic Programmers. The benefit is early user feedback and exploration of the users needs.
&lt;/p&gt;

&lt;p&gt;
According to Brooks, "...the quality of the people on a project, and their organization and management, are much more important factors in success than are the tools they use or the technical approaches they take.". Brooks refers to the &lt;a href="http://en.wikipedia.org/wiki/Peopleware"&gt;Peopleware book&lt;/a&gt; when making this point, i.e. it's about the physical and social work environment, about aligning and motivating developers etc. However, it also ties in with the idea of conceptual integrity, i.e. you need to solve the communications problem and make sure that the left hand knows what the right hand is doing.
&lt;/p&gt;

&lt;p&gt;
Brooks offers a great analysis on the problems of software maintenance and fixing bugs:
&lt;/p&gt;

&lt;p&gt;
"The fundamental problem with program maintenance is that fixing a defect has a substantial (20-50 percent) chance of introducing another. So the whole process is two steps forward and one step back.
&lt;/p&gt;

&lt;p&gt;
Why aren't defects fixed more cleanly? First, even a subtle defect shows itself as a local failure of some kind. In fact it often has system-wide ramifications, usually nonobvious. Any attempt to fix it with minimum effort will repair the local and obvious, but unless the structure is pure or the documentation very fine, the far-reaching effects of the repair will be overlooked. Second the repairer is usually not the man who wrote the code, and often he is a junior programmer or trainee."
&lt;/p&gt;

&lt;p&gt;
Brooks ends his essay with these dark words:
&lt;/p&gt;

&lt;p&gt;
"System program building is an entropy-decreasing process, hence inherently metastable. Program maintenance is an entropy-increasing process, and even its most skillful execution only delays the subsidence of the system into unfixable obsolescence."
&lt;/p&gt;

&lt;p&gt;
The most famous essay in the book is &lt;a href="http://en.wikipedia.org/wiki/No_Silver_Bullet"&gt;No Silver Bullet — Essence and Accidents of Software Engineering&lt;/a&gt;. According to Brooks, programming at its essence will always be a complex, time consuming, and error prone thought process, and therefore, despite advances in technology, we will never see the kind of explosive productivity growth in software that we have seen in hardware.
&lt;/p&gt;

&lt;p&gt;
This is just a small teaser of what the book has to offer. If you are at all interested in the methodology and management of software development I highly recommend checking it out.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/VfBROi9QJjg" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 06 Jan 2010 18:50:50 CET</pubDate>
      <guid>http://marklunds.com/articles/one/421</guid>
      <link>http://marklunds.com/articles/one/421</link>
      <category>Programming</category>
    </item>
    <item>
      <title>Teaching a Three Day Ruby on Rails Course in Rome</title>
      <description>&lt;p&gt;
  This weekend I taught a three day Ruby on Rails course here in Rome in Italy. It was a great experience and the people down here have shown the greatest hospitality and have taken very well care of me.
&lt;/p&gt;

&lt;p&gt;
  The format of the course was like a workshop with a small group of participants in a private and relaxed setting. I used my &lt;a href="http://marklunds.com/s5/rails101/html/table_of_contents.html"&gt;course material&lt;/a&gt; as a starting point and a road map but then improvised a lot and ended up doing a lot of hands on programming. Basically the course was divided into three parts:
&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ruby and Rails fundamentals. A lot of time was spent on the programming language itself and we toured the features of Ruby by live coding in TextMate.&lt;/li&gt;
  &lt;li&gt;Writing a demo application. Similar to the AWR book, I built the basics for a store application, including file upload, advanced ActiveRecord associations, and deployment to a VPS with Capistrano.&lt;/li&gt;
  &lt;li&gt;The participants got to work on different features in the application. Time was also spent code reviewing the participants own Rails applications.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  Overall I must say the course was quite a success. Every time I teach a course I look for ways to make my courses more interactive, more hands on, and more tailored to the needs of the participants. &lt;/p&gt;

&lt;p&gt;
I also had a great time outside the course in Rome - a city that I fell in love with immediately.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/petermarklund/~4/p_xqY1RyRl4" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 07 Sep 2009 11:32:46 CEST</pubDate>
      <guid>http://marklunds.com/articles/one/420</guid>
      <link>http://marklunds.com/articles/one/420</link>
      <category>Programming</category>
    </item>
  </channel>
</rss>
