<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Relative Sanity &#187; blogging</title>
	<atom:link href="http://relativesanity.com/category/blogging/feed/" rel="self" type="application/rss+xml" />
	<link>http://relativesanity.com</link>
	<description>Nerdery, curmudgeon, humanity and science</description>
	<lastBuildDate>Wed, 12 May 2010 07:59:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How not to build an in-house CMS</title>
		<link>http://relativesanity.com/2008/11/17/how-not-to-build-an-in-house-cms/</link>
		<comments>http://relativesanity.com/2008/11/17/how-not-to-build-an-in-house-cms/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 13:32:02 +0000</pubDate>
		<dc:creator>relativesanity</dc:creator>
				<category><![CDATA[blogging]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[curmudgeon]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://journal.relativesanity.com/?p=77</guid>
		<description><![CDATA[It&#8217;s so easy to create a content managed website these days that it&#8217;s often equally easy to be paralysed by choice. This journal runs on WordPress, and uses a modified version of a theme by MidMo Web Design. It took all of 20 minutes from download to test-posting into this theme.
Picking the engine itself, though, [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s so easy to create a content managed website these days that it&#8217;s often equally easy to be paralysed by choice. This journal runs on <a href="http://wordpress.org/">WordPress</a>, and uses a modified version of a theme by <a href="http://midmodesign.com/">MidMo Web Design</a>. It took all of 20 minutes from download to test-posting into this theme.</p>
<p>Picking the engine itself, though, has taken about 2 years, and was based on one thing: immediacy.</p>
<h2>Choices, choices</h2>
<p>Choice is good, right? Competition is even better. I&#8217;ve recently become jaded with my own erstwhile approach to site management systems. That approach could be boiled down to two simple statements:</p>
<ul>
<li>Content Management Systems are simple</li>
<li>Given enough projects, I can incrementally build my own while getting paid for it</li>
</ul>
<p>The implication being that &#8220;my own&#8221; will be inherently better than any of the off-the-shelf systems that are already out there, because I&#8217;ll understand it from the ground up.</p>
<p>What really happens can be summed up by these parallel statements:</p>
<ul>
<li>CMS is as &#8220;simple&#8221; as word processing: easy to describe, easy to prototype, hard to perfect</li>
<li>Clients are not software designers, and I&#8217;m a scorched-earth perfectionist</li>
</ul>
<p>All of which results in me, having idealised the first two statements, but followed the second two, writing this post two years later.</p>
<h2>Build it in increments -&gt; (step 2) -&gt; profit!</h2>
<p>If you are planning on building an in-house CMS, I&#8217;m assuming that you&#8217;ve already come up with all the rationalising arguments about why it will be &#8220;better&#8221; than off-the-shelf. It doesn&#8217;t matter whether you&#8217;ve convinced yourself that the client&#8217;s requirements are beyond the scope of any existing system, or whether you&#8217;re just full of &#8220;Not Invented Here&#8221; Kool-aid, the point is that you and your team are committed to delivering a CMS to fulfil your client&#8217;s spec.</p>
<p>Of course, what I&#8217;ve just described is a bespoke CMS for a single client. Everyone knows that&#8217;s not scalable to larger projects, so how do we get around that?</p>
<p>All together now:</p>
<blockquote><p>We write the core of the CMS for this client, and build it modularly so that we can just give them what they asked for, but <strong>reuse</strong> the core on the next project!</p></blockquote>
<p>Bingo. Sounds great, doesn&#8217;t it? You make a bit of a time loss on this project, but it&#8217;s an investment, because next time around you&#8217;ll be mainly writing modules for the next client&#8217;s functionality. If the next client has the same spec as this client, it&#8217;s <strong>instant profit</strong>! What can go wrong?</p>
<p>This is where reality creeps in. You build your CMS nice and modularly for the first two weeks. You then realise that you&#8217;re not quite finished the core yet, and you&#8217;ve only got two weeks left to implement the various bits of functionality as modules. You panic. You know what modules you need, so you start building the remainder of the core with those modules in mind. You maybe even start building some modules into the core, promising to refactor them out on the next project, because you finally remembered your <a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer">Pragmatic Programmer</a>, and suddenly it&#8217;s all about &#8220;just get it working&#8221;.</p>
<p>You complete the project on time, and what do you have? A half-bespoke, half-modular monster that is going to require a serious refactoring job to make usable for the next project.</p>
<p>However, you&#8217;ve <strong>learned a lot</strong>. This is a key realisation, and often missed. You&#8217;ve learned a hell of a lot, and this is where the rot starts. You&#8217;ve learned so much that you convince yourself that, on the next project, it would be insanity to try to reuse any of what you&#8217;ve just coded. What you decide to do instead is to reuse the <strong>knowledge</strong>. Oh yeah, baby &#8211; we salvaged something after all!</p>
<p>So you start coding again from scratch. This time it will be better, you say, since you know how it all went wrong last time, and you&#8217;ve come up with five great new ways of modularising from the get-go. Then client number 2 rolls along.</p>
<h2>One of these kids is kinda different</h2>
<p>So with your newfound &#8220;I get it now!&#8221; knowledge, you start implementing The Plan again. Client 1 was a false start &#8211; client 2 is the real deal. Now you know how to make it modular, you&#8217;ll do it right this time.</p>
<p>Except the same thing happens. This time, because you&#8217;re having so much fun coding, and because you&#8217;ve convinced yourself that last time you caved and started coupling the core to the modules too early, you hold out to week three to produce the core CMS. But again, week three rolls around and you&#8217;re still not done. With only one week left to implement the functionality that took you two weeks last time, you start panicking and even more coupling happens. Worse, your project runs over time and is late.</p>
<p>So far, with two projects in the bag, you&#8217;ve overserviced both, pissed off one of the clients by being late, given each a rushed bespoke system (with all the attendant maintenance overheads), and have precisely zero reusable code. Not exactly the outcome you&#8217;d hoped for.</p>
<p>So what went wrong?</p>
<h2>Addiction is curable</h2>
<p>What went wrong is that you failed to notice that your stated goals were not really your goals. Worse, you actually got what you wanted all along.</p>
<p>Huh?</p>
<p>Your implicit goal in building an in-house CMS was to reduce the amount of work you do. You&#8217;ve noticed that servicing your clients is boring, because you&#8217;re constantly writing the same stuff. To fix that, you decide to consciously write that stuff in a way that you can reuse next time.</p>
<p>The logical next step of that is to write an entire <strong>system</strong> that you can reuse next time. This is where the logic breaks down, because there already <strong>are</strong> systems that you can reuse. Right now. You can download <a href="http://modxcms.com/">MODx</a> right now and be at precisely the point you say you want to be at in four weeks.</p>
<p>So why didn&#8217;t you? You didn&#8217;t because your goal isn&#8217;t to reduce the amount of work you do, it&#8217;s to increase it. What you secretly want to do is build a bespoke CMS for every one of your clients. You hope that maybe, one day, you might hit upon a pattern that you can reuse, but you don&#8217;t really care about that. You love coding, you love tweaking and refining and burning it down and starting again. You love it, and you got it.</p>
<h2>Step zero is realising you&#8217;re addicted</h2>
<p>So what are you addicted to? Coding? No &#8211; you&#8217;re addicted to the knowledge you&#8217;re learning, to the experience, to &#8220;figuring it out&#8221;. That&#8217;s why it&#8217;s so difficult to locate the source of the problem. When I said &#8220;you wanted to increase your workload&#8221;, you balked, because to you the work is becoming more and more painful.</p>
<p>The knowledge isn&#8217;t, though. You&#8217;re putting up with the pain for the rush of having refined your perfect plan for next time.</p>
<p>And the truth is that your CMS prototypes <em>are</em> getting better all the time. After 5 or 6 more clients, you might have a really solid platform.</p>
<p>Too bad for your first half-dozen alpha and beta testing clients, though.</p>
<h2>Where&#8217;s the exit?</h2>
<p>So how do you break this cycle? You decide which of these is more important to you right now. Do you want to:</p>
<ul>
<li>Build a CMS; or</li>
<li>Streamline your client servicing?</li>
</ul>
<p>You don&#8217;t get both, not right now. If you want to build an in-house CMS, you&#8217;re going to have to commit 6 to 9 months of development time to it, and the client has to be your company, not some real-world project you&#8217;re using to guinea-pig your sketches on. You need to take yourself (and perhaps another developer) off paid work and become software developers, with the attendant investment and payoff cycles that don&#8217;t exist in direct-to-client sales.</p>
<p>That&#8217;s the price. Once you have your CMS, you can start flogging it to people. At that point you can start to &#8220;Streamline your client servicing&#8221;.</p>
<p>Of course, by then, I&#8217;ll be in your sector, stealin&#8217; your clients, because I chose to &#8220;Streamline my client servicing&#8221; straight up using <a href="http://wordpress.org/">WordPress</a> and <a href="http://expressionengine.com/">Expression Engine</a>, with <a href="http://modxcms.com/">MODx</a> in there for the really tricky stuff, and have been having a whale of a time developing modules, plugins and extras for those mature platforms you&#8217;re only starting to catch up with.</p>
<p>Your CMS had better do something unique.</p>
]]></content:encoded>
			<wfw:commentRss>http://relativesanity.com/2008/11/17/how-not-to-build-an-in-house-cms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Providing multiple feeds</title>
		<link>http://relativesanity.com/2008/11/11/providing-multiple-feeds/</link>
		<comments>http://relativesanity.com/2008/11/11/providing-multiple-feeds/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 12:18:15 +0000</pubDate>
		<dc:creator>relativesanity</dc:creator>
				<category><![CDATA[blogging]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://journal.relativesanity.com/?p=61</guid>
		<description><![CDATA[Like everyone else these days, I have multiple feeds that encompass my online life. My main site, relativesanity.com, serves as a home page for all these feeds, so that friends and family have a single place to visit if the want to see what I&#8217;m up to. But we live in the age of Google [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://relativesanity.com/wp-content/uploads/2008/11/multiple-feeds100px-feed-iconsvg1.png" border="0" alt="100px-Feed-icon.svg.png" width="80" height="70" align="left" />Like everyone else these days, I have multiple feeds that encompass my online life. My main site, <a href="http://relativesanity.com">relativesanity.com</a>, serves as a home page for all these feeds, so that friends and family have a single place to visit if the want to see what I&#8217;m up to. But we live in the age of <a href="http://reader.google.com">Google Reader</a> and <a href="http://www.newsgator.com/INDIVIDUALS/NETNEWSWIRE/">NetNewsWire</a>. Who wants to visit a site any more?</p>
<p>Certainly not me, and certainly not my visitors.</p>
<h2>Offering sensible choices</h2>
<p>Let&#8217;s look at all the places I live:</p>
<ul>
<li><a href="http://journal.relativesanity.com/">here</a></li>
<li><a href="http://flickr.com/photos/rsanity">flickr</a></li>
<li><a href="http://ma.gnolia.com/people/relativesanity">ma.gnolia</a></li>
<li><a href="http://twitter.com/relativesanity">twitter</a></li>
<li><a href="http://www.last.fm/user/relativesanity/library/recent">last.fm</a></li>
</ul>
<p>Each of these services provides a simple feed of content (though for some reason, last.fm has stopped scrobbling for about a week now. Grumble. Any ideas? <strong>Solved:</strong> it seems that the Mac OS X last.fm client doesn&#8217;t report password problems. It just fails silently and looks like you&#8217;ve logged in. Nasty bug.). If a visitor just wants to follow me on flickr, they can click on the flickr link on relativesanity.com and then add that feed to whatever reader they use. Job done, right?</p>
<p>Well, not really. I&#8217;m aggregating content on relativesanity.com, so wouldn&#8217;t it make sense to aggregate feeds? By default, relativesanity.com&#8217;s feed <code>link</code> tag used to be a direct pull of my twitter feed, so someone subscribing to the autodetected feed on relativesanity.com would get my twitter updates.</p>
<p>That was fine, but I got more and more requests to provide direct links to the rss feeds from my other accounts. Family, for example, had no idea how to subscribe to flickr (or even that it was an option.</p>
<p>So what to do?</p>
<h2>Relationships for relatives</h2>
<p>Let&#8217;s do some anatomy. <code>link</code> is made up of a few elements:</p>
<dl>
<dt><code>rel</code></dt>
<dd>this specifies the relationship of the link to the page, e.g. &#8220;stylesheet&#8221; or &#8220;alternate&#8221;</dd>
<dt><code>type</code></dt>
<dd>this is the MIME type of the file. For feeds, it&#8217;s often &#8220;application/rss+xml&#8221; or &#8220;application/atom+xml&#8221;</dd>
<dt><code>title</code></dt>
<dd>this is the optional title of the link. For multiple feeds, these titles may be displayed by your browser when you try to subscribe to the feed.</dd>
<dt><code>href</code></dt>
<dd>this is the actual address of the feed itself.</dd>
</dl>
<p>I mentioned &#8220;multiple feeds&#8221; there. You can, it may surprise you to hear, have multiple feeds for any given page. Most people seem to see this as a means to add different <strong>formats</strong> of feed to their page. Flickr is a great example:</p>
<div style="text-align:center;"><img src="http://relativesanity.com/wp-content/uploads/2008/11/screenshotspicture-2.png" border="0" alt="Picture 2.png" width="536" height="93" /></div>
<p>I say &#8220;great&#8221; here, but what I mean is &#8220;terrible&#8221;. What are my options here? &#8220;Atom&#8221; or &#8220;RSS&#8221;? I know they&#8217;re different formats, but why do I care which one to pick? I don&#8217;t know of any feed readers these days that only handle one or the other, so as a visitor, what differentiator is there for me to choose between these? Do they provide the same content? If so, is one more &#8220;efficient&#8221; at delivering that content than the other? Will one become obsolete soon? Do I lock myself into something by choosing one over the other?</p>
<p>It&#8217;s a minefield, and that&#8217;s all from the point of view of someone who understands what <a href="http://en.wikipedia.org/wiki/Atom_(standard)">Atom</a> and <a href="http://en.wikipedia.org/wiki/RSS">RSS</a> are. How&#8217;s my Mum going to feel about this, other than stupid?</p>
<p>Let&#8217;s look at some code:</p>
<pre><code>
  &lt;link rel="alternate" type="application/atom+xml"
    title="Flickr: Your Photostream Atom feed" href="..."&gt;
  &lt;link rel="alternate" type="application/rss+xml"
    title="Flickr: Your Photostream RSS feed" href="..."&gt;
</code></pre>
<p>This is how flickr codes up its photostream feeds. To my mind, it&#8217;s completely pointless. If the feeds offer different content, telling me the format doesn&#8217;t tell me what the difference is. If the feeds <strong>don&#8217;t</strong> offer different content, why offer two?</p>
<p>Here&#8217;s how relativesanity.com&#8217;s feeds now look:</p>
<div style="text-align:center;"><img src="http://relativesanity.com/wp-content/uploads/2008/11/multiple-feedspicture-1.png" border="0" alt="Picture 1.png" width="342" height="156" /></div>
<p>Isn&#8217;t that neat? Some code:</p>
<pre><code>
  &lt;link rel="alternate" type="application/rss+xml"
    title="articles" href="http://journal.relativesanity.com/feed/" /&gt;
  &lt;link rel="alternate" type="application/rss+xml"
    title="thoughts" href="http://twitter.com/statuses/user_timeline/6040962.rss" /&gt;
  &lt;link rel="alternate" type="application/rss+xml"
    title="photos" href="http://api.flickr.com/services/feeds/..." /&gt;
  &lt;link rel="alternate" type="application/rss+xml"
    title="links" href="http://ma.gnolia.com/rss/full/people/relativesanity" /&gt;
  &lt;link rel="alternate" type="application/rss+xml"
    title="music" href="http://ws.audioscrobbler.com/1.0/user/relativesanity/..." /&gt;
  &lt;link rel="alternate" type="application/atom+xml"
    title="everything" href="http://friendfeed.com/relativesanity?format=atom" /&gt;
</code></pre>
<p><code> </code></p>
<p>Now, when visitors arrive, they can choose what to subscribe to, and the differences between each choice are clearly marked.</p>
<h2>One feed to rule them all (sorry)</h2>
<p>Even better, there&#8217;s an &#8220;everything&#8221; feed that aggregates all the others. This is built using <a href="http://friendfeed.com/">friendfeed.com</a>, which has been on my radar for ages, but for all the wrong reasons. My impression was that friendfeed primarily aggregated feeds of your friends. What I wanted was to aggregate all my feeds (and here&#8217;s the key bit) <strong>into a single RSS feed</strong>. Friendfeed not only lets you do this, it actually provides it as a first-class feature (they should have called it &#8220;myfeed&#8221;, but myfeed.com is gone).</p>
<div style="text-align:center;"><img src="http://relativesanity.com/wp-content/uploads/2008/11/multiple-feedspicture-3.png" border="0" alt="Picture 3.png" width="508" height="346" /></div>
<p>So there we have it. Nice semantic feeds of content, all in one place, and the &#8220;everything&#8221; feed can be updated whenever I sign up to some other life-sucking service that lets me tell the world what I&#8217;m doing.</p>
<p>No, I&#8217;m not on facebook.</p>
]]></content:encoded>
			<wfw:commentRss>http://relativesanity.com/2008/11/11/providing-multiple-feeds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
