<?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>while coding &#187; programming</title>
	<atom:link href="http://www.youell.com/matt/writing/?cat=3&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.youell.com/matt/writing</link>
	<description>simplify</description>
	<lastBuildDate>Wed, 31 Oct 2018 04:08:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>&#8220;What Idiot Wrote This?&#8221; as a Metric</title>
		<link>http://www.youell.com/matt/writing/?p=1420</link>
		<comments>http://www.youell.com/matt/writing/?p=1420#comments</comments>
		<pubDate>Wed, 26 Aug 2015 15:18:53 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=1420</guid>
		<description><![CDATA[People grasp for ways to understand &#38; communicate the fundamental complexity of a software project. As a programmer it&#8217;s particularly hard to communicate to non-technical people how big and complex a piece of software is.
The most common metric is LoC &#8211; Lines of Code. It&#8217;s a simple metric: How many lines of code did it [...]]]></description>
			<content:encoded><![CDATA[<p>People grasp for ways to understand &amp; communicate the fundamental complexity of a software project. As a programmer it&#8217;s particularly hard to communicate to non-technical people how big and complex a piece of software is.</p>
<p>The most common metric is LoC &ndash; Lines of Code. It&#8217;s a simple metric: How many lines of code did it take to create a particular piece of software? For non-programmers this is a pretty good metric. It gives them something to nod their heads at in meetings. For programmers this isn&#8217;t a very good metric at all. As with any prose, lines of code can vary in utility, complexity, and meaning.</p>
<p>Programmers would like to be able to gauge size and complexity in a more meangingful way. Other metrics are offered from time to time. The number of classes. The number of endpoints on a service. The number of possible execution paths. Many possibilities exist. Automated tools start to crop up.</p>
<p>All of these measurements are fine if they give some insight into a project. But there&#8217;s this missing piece that never seems to figure in: <strong>People.</strong></p>
<p>In particular, how many people have touched the code?</p>
<p>This is an unavoidably fuzzy metric. Each person&#8217;s impact on the code is unpredictable on its own. What is undeniable is that a 50k line application with a 3 programmer history is a totally different beast than a 50k line application with a 15 programmer history. </p>
<p>(Tellingly, neither the Wikipedia page for <a href="https://en.wikipedia.org/wiki/Programming_complexity">Programming Complexity</a> nor the page for <a href="https://en.wikipedia.org/wiki/Software_metric">Software Metric</a> contain &mdash; as of this writing &mdash; the word &#8220;person&#8221; or &#8220;people&#8221;.)</p>
<p>Tallied up, perhaps the number of people who worked on a codebase can give us an added dimension to consider.</p>
<p><br/><br />
<br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=1420</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Hump</title>
		<link>http://www.youell.com/matt/writing/?p=1327</link>
		<comments>http://www.youell.com/matt/writing/?p=1327#comments</comments>
		<pubDate>Tue, 28 Apr 2015 20:38:38 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[problem solving]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=1327</guid>
		<description><![CDATA[About 3 years ago I went out and bought a skateboard. The official reason was to model an active lifestyle for my kids. The real reason? I woke up one day and I realized I hadn&#8217;t ridden a skateboard in over 20 years. That killed me a little inside.
One lingering regret is that I never [...]]]></description>
			<content:encoded><![CDATA[<p>About 3 years ago I went out and bought a skateboard. The official reason was to model an active lifestyle for my kids. The real reason? I woke up one day and I realized I hadn&#8217;t ridden a skateboard in over 20 years. That killed me a little inside.</p>
<p>One lingering regret is that I never learned to ollie. After I got comfortable skating again I set my mind to learning how to ollie. Last summer I made a small bit of progress, and this summer I&#8217;m hoping to finally nail the damned thing. </p>
<p>This weekend I shot some footage of myself practicing. Then I wanted to use that footage to make a little movie. For me, on my Mac, that means iMovie.</p>
<p>I&#8217;ve had some modest successes with iMovie in the past, but I&#8217;ve never really understood it. The interface is confusing. I&#8217;m sure they are trying to make things easy, but it&#8217;s like there are so many things to make easy that they make it crazy instead.</p>
<p>I had two and a half minutes of footage of me flubbing around with the skateboard. What I wanted was to grab two portions of the video (where I was actually practicing) and join those together with a modest transition. Then I&#8217;d add a title screen and upload it to YouTube to embarass myself.</p>
<p>Simple, right?</p>
<p>First I had to figure out how to get my video out of Photos and into iMovie. I imagined that I could just export the file and then import it, but that seems like The Hard Way. Apple ships the computer with both programs. There must be a Better Way. Off to Google I went, which is ok because I&#8217;m basically a Professional Google User (uncertified). Much to my consternation, the recommended way to get your movie from Photos to iMovie is&#8230; to export it to a folder and then import it. Stone knives and bear skins!</p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2015/04/iMovieInAction.jpg" alt="iMovieInAction" title="iMovieInAction" width="480" height="321" class="aligncenter size-full wp-image-1335" /></p>
<p>I did the export/import and created a new project in iMovie. That part went fine. I had a project, I imported my footage, and then I started to make a title. That took a while to figure out (despite the fact that I&#8217;ve done it before) but soon my title was in place. Ah, but I needed to split up my footage into two parts. How do I do that? More googling. It was easy but not obvious. I finally figured out how to split it up, but then realized that I have the opportunity to have a cold open on my video where I walk up to the skateboard. So this will be great. Cold open to establish I&#8217;m doing something with a skateboard, then title, then my two clips. Ah, but what would be <em>really</em> cool is to have the background audio going over the title sequence so there is continuity in my little story. Googling again, I find out how to do this in iMovie 11. (Later I find out I&#8217;m on iMovie 10.) I can&#8217;t find the option I found with Google, but poking around in the right place helps me figure out that I can detach the audio. Perfect! This is great. I mess around a little more and then I have a cold open, a title, and then I&#8217;m on the skateboard. Something is not quite right though. Ah, the title card just pops in. There is a tiny effect but no smooth transitions. I see the option for transitions and pick the simplest and put it in place. Now everything is set up! I sit back and watch. Something is still wrong&#8230;. Ah! The audio is out of sync. Probably by the amount that it is offset during the title sequence. Or maybe I just dragged the wrong slider and screwed something up. I really don&#8217;t know. It&#8217;s all voodoo at this point. I have no idea what is going on and no idea how to fix it.</p>
<p>I gave up. I wasn&#8217;t pissed, just disheartened. I could see nothing but frustration in my future, so I stopped.</p>
<p>And this is The Hump.</p>
<p>The Hump is this point on your learning curve, usually after some early success, where you decide that the effort just isn&#8217;t worth the reward. This is the point where opportunities are lost, where you talk yourself out of victory, and where dreams die.</p>
<p>Seriously.</p>
<p>Look how close I got to success before I gave up! This is common. And then there was my bad attitude. I felt like I was being held back. I blamed the software. I blamed Apple. It wasn&#8217;t until I realized this was just The Hump that my attitude started to change. I stopped thinking about how messed up the situation was. I started to think about how I was going to get my video done. I went from being indignant to resolute. I went from being pissed at tools to being pissed that I was letting little things get in my way.</p>
<p>I tossed out the crappy work I&#8217;d done earlier and stepped back. I started to reframe the problem. I realized that since I now knew how to split footage, I could at least start by breaking things up into clips. With that done it was easy to delete the cruft. I was left with a series of scenes that were keepers. That formed the backbone of my movie. Instead of trying to build the movie from the front to the back, I created a scaffold along the critical path of what I was trying to do.</p>
<p>I eventually got my movie done. It took about an hour more than I thought it would, but <a href="https://youtu.be/Czs8bB54mlA">I shipped</a>. (WARNING: Super-boring single-shot video of 42 year-old legs mostly not ollying. My wife panned it, it&#8217;s that boring.) The movie isn&#8217;t the exciting part. Beating The Hump is the exciting part.</p>
<p>I worry that The Hump is this quiet killer of potential engineering careers. It&#8217;s great to see the energy behind programs to encourage people to learn to code, but it&#8217;s not enough. You can show people how to code all day long and all you&#8217;ll ever create is a bunch of people who can follow instructions. That isn&#8217;t what programming is. Software is a particularly cruel medium. You don&#8217;t just get over The Hump when you learn how to code. The act of building software is a non-stop series of Humps. Even worse, software eats problems. That means today&#8217;s hard problems are always a little harder than yesterday&#8217;s. Meaning the Humps never stop coming.</p>
<p>May you turn your Humps into moguls.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=1327</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Whither Bob Grossblatt?</title>
		<link>http://www.youell.com/matt/writing/?p=1202</link>
		<comments>http://www.youell.com/matt/writing/?p=1202#comments</comments>
		<pubDate>Wed, 26 Nov 2014 18:47:41 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[reading]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=1202</guid>
		<description><![CDATA[So there I am, 11 years old, lying in a hospital bed, freshly missing an appendix that I hadn&#8217;t known existed a week before. 
Bored. So bored. 
My aunt walks in with a magazine she thinks I might like.




I read Radio-Electronics for years. From grade school, through junior high, and into high school. I kept [...]]]></description>
			<content:encoded><![CDATA[<p>So there I am, 11 years old, lying in a hospital bed, freshly missing an appendix that I hadn&#8217;t known existed a week before. </p>
<p>Bored. So bored. </p>
<p>My aunt walks in with a magazine she thinks I might like.<br />
<center><br />
<a href="http://www.americanradiohistory.com/Radio_Electronics%20_Master_Page.htm" target="_blank"><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/radio_electronics_magazine.jpg" alt="Radio-Electronics magazine" title="Radio-Electronics"/></a><br />
</center></p>
<hr />
<p>I read Radio-Electronics for years. From grade school, through junior high, and into high school. I kept every copy. I would read and re-read. Trying to understand what I didn&#8217;t already.  Dreaming about having the tools and parts to build the kinds of projects that I would read about. Very often I&#8217;d dream up my own projects, and sometimes cobble them together with the parts I could lay my hands on. Electronics absorbed me. I spent most of my teenage years split between reading science fiction and scheming to build circuits that reached toward making that fiction into fact.</p>
<p>Fast forward to my late teens. College wasn&#8217;t in the cards for me right away, despite all of the college prep. Somehow I&#8217;d managed to move out on my own into a little apartment I could barely afford on my electronics-assembler wages. It was a miserable existence in many ways, but my one great pleasure was Tower Books, my local bookstore. I would spend hours browsing their cramped stacks. I stayed mostly in the areas I understood &#8211; physics and electronics. (There was this baffling section on software, but it wasn&#8217;t accessible. Every book seemed to be about things that were totally made up!)</p>
<p>Electronics books always got me excited. With a few exceptions (another build-your-own-robot book?), I was stoked whenever something new would come in. I would linger in the bookstore for as long as I would have spent at the movies, but usually spent less. I often left empty handed, or maybe with a copy of Circuit Cellar magazine. In any case, a cheap evening of entertainment.</p>
<p>One day I saw a book by a familiar author I remembered from Radio-Electronics, Robert Grossblatt. I can&#8217;t remember which of his two books I bought first. It doesn&#8217;t really matter. There&#8217;s a common theme between them. These books are ostensibly about engineering electronics, but are applicable to engineering in general. Because of that, if you can read between the lines, they are some of the best foundation-building books on software development you&#8217;ll read.</p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/grossblatt_books.jpg" alt="Bob Grossblatt&#039;s books" title="Bob Grossblatt&#039;s books" width="750" height="563" class="size-full wp-image-1266" /></p>
<p>I&#8217;m not sure I can properly articulate the value of these books to me. At that time especially I was broke and couldn&#8217;t afford to build the projects described. I read them anyway, preparing my mind for what I didn&#8217;t know was coming next: A career as a software developer. Those books gave me a perspective that helped me through struggles and to value and appreciate the field I was entering.</p>
<p>So whatever happened to Bob? I don&#8217;t know. I&#8217;ve googled a bit and haven&#8217;t found anything. </p>
<p>Wherever you are now Bob, thanks.</p>
<hr/>
<p>I&#8217;ll close with just a few of Bob&#8217;s &#8220;Laws of Life &amp; Design&#8221;. </p>
<style>
.excerpt {
	float: none;
	margin: 10px;
}
</style>
<p><center></p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/if_you_only_see_one_solution.png" alt="if_you_only_see_one_solution" width="500" height="99" class="excerpt" alt="If you only see one solution, you don't understand the problem." title="If you only see one solution, you don't understand the problem."/></p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/its_more_important_to_get_it_working.png" alt="its_more_important_to_get_it_working" width="500" height="78"  class="excerpt" alt="It's more important to get it working than to get it perfect." title="It's more important to get it working than to get it perfect." /></p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/logical_thinking_produces_logical_circuits.png" alt="logical_thinking_produces_logical_circuits" width="500" height="58"  class="excerpt" alt="Logical thinking produces logical circuits." title="Logical thinking produces logical circuits."/></p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/thursday_or_good.png" alt="thursday_or_good" width="500" height="51"  class="excerpt" alt="Do you want it Thursday or do you want it good?" title="Do you want it Thursday or do you want it good?"/></p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/you_can_never_be_too_sure.png" alt="you_can_never_be_too_sure" width="500" height="134"  class="excerpt" alt="You can never be too sure." title="You can never be too sure."/></p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/your_subconscious_is_your_best_friend.png" alt="your_subconscious_is_your_best_friend" width="500" height="51"  class="excerpt" alt="Your subconscious is your best friend." title="Your subconscious is your best friend."/></p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2014/11/think_for_yourself.png" alt="think_for_yourself" width="500" height="129"  class="excerpt" alt="Think for yourself." title="Think for yourself."/></p>
<p></center></p>
<p>These excerpts are from &#8220;Bob Grossblatt&#8217;s Guide To Creative Circuit Design&#8221; and &#8220;The 8088 Project Book&#8221;, both &copy; Robert Grossblatt,  published by TAB Books. (A lot of TAB books were crap but they did publish a few gems and these were two of them.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=1202</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Simple Rewrite (How I Code)</title>
		<link>http://www.youell.com/matt/writing/?p=84</link>
		<comments>http://www.youell.com/matt/writing/?p=84#comments</comments>
		<pubDate>Mon, 20 Feb 2012 02:58:05 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[How I Code]]></category>
		<category><![CDATA[humane]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=84</guid>
		<description><![CDATA[Note: I just found this unpublished post from a couple of years ago. I think I wanted to polish it a bit before publishing, but it looks fine to me now.

I&#8217;m taking another shot at the &#8220;How I Code&#8221; series of posts. This isn&#8217;t a preachy &#8220;How everyone should code&#8221; post. Instead, this is a [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: I just found this unpublished post from a couple of years ago. I think I wanted to polish it a bit before publishing, but it looks fine to me now.<br />
</em><br />
I&#8217;m taking another shot at the &#8220;How I Code&#8221; series of posts. This isn&#8217;t a preachy &#8220;How everyone should code&#8221; post. Instead, this is a snapshot of how I look at code now, at this point in time. Next week I could be doing things differently. </p>
<p>Here&#8217;s an example from Satchmo, the web shopping cart software that is built on the Django framework. A bug involving MySQL was recently patched in the Satchmo code base. The bug fix itself isn&#8217;t very interesting, but the remaining code is. Here&#8217;s the post-fix code:</p>
<pre class="syntax-highlight:python">
def payments_completed(self):
    q = self.payments.exclude(transaction_id__isnull = False, transaction_id = &quot;PENDING&quot;)
    result = [p for p in q if p.amount]
    return result
</pre>
<p>Naturally, I have questions.</p>
<p>Why does the &#8216;result&#8217; variable exist? </p>
<pre class="syntax-highlight:python">
def payments_completed(self):
    q = self.payments.exclude(transaction_id__isnull = False, transaction_id = &quot;PENDING&quot;)
    return [p for p in q if p.amount]
</pre>
<p>What are &#8216;p&#8217; and &#8216;q&#8217;?</p>
<pre class="syntax-highlight:python">
def payments_completed(self):
    query_set = self.payments.exclude(transaction_id__isnull = False, transaction_id = &quot;PENDING&quot;)
    return [payment for payment in query_set if payment.amount]
</pre>
<p>Would a non-programmer understand this?</p>
<pre class="syntax-highlight:python">
def payments_completed(self):
    payments = self.payments.exclude(transaction_id__isnull = False, transaction_id = &quot;PENDING&quot;)
    return [payment for payment in payments if payment.amount]
</pre>
<p>Don&#8217;t we already have a &#8216;payments&#8217; variable?</p>
<pre class="syntax-highlight:python">
def payments_completed(self):
	return self.payments.exclude(transaction_id__isnull = False, transaction_id = &quot;PENDING&quot;, amount__isnull = false)
</pre>
<p>I think that&#8217;s better. What do you think?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=84</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Data Structure Runs Through It</title>
		<link>http://www.youell.com/matt/writing/?p=769</link>
		<comments>http://www.youell.com/matt/writing/?p=769#comments</comments>
		<pubDate>Wed, 01 Dec 2010 22:16:58 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Road To Wheeler]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[programming languages]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=769</guid>
		<description><![CDATA[I&#8217;m surprised to be developing a programming language. I didn&#8217;t know I had a language in me until a few years ago. I always considered new languages kind of a waste. Most of the cool tricks seem to be known. No reason they can&#8217;t be added to existing languages, right?
The past few years of wide-ranging [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m surprised to be developing a programming language. I didn&#8217;t know I had a language in me until a few years ago. I always considered new languages kind of a waste. Most of the cool tricks seem to be known. No reason they can&#8217;t be added to existing languages, right?</p>
<p>The past few years of wide-ranging language interest have cast doubt on that perspective. Still, one theme that I can&#8217;t shake is that you should be able to model new features in an existing language. It might be awkward, but it should still be possible. (Especially if you&#8217;re going to implement the language!)</p>
<p>In that spirit, I&#8217;ve tried to express one of the core ideas in Wheeler with a library for Python called <a href="https://github.com/built/AssociativeTools">AssociativeTools</a>. The star of the show is the Workspace class, which represents a data structure I call an Associative Network.</p>
<p>The word &#8220;network&#8221; is overloaded. Most often it is used to refer to computer networks. Here, I&#8217;m referring to a <a href="http://en.wikipedia.org/wiki/Network_model_(database)">network or web of data</a>. Think of a big pool of data in which nodes can be arranged into graphs of your choosing.</p>
<p>The Workspace lets you relate items (anything that is hashable in Python) to one another. Mostly I&#8217;m using strings and numbers. You relate items to build graphs so that later you can come back and fetch those graphs with partial information. It&#8217;s a lot like querying a database. It&#8217;s more like querying a search engine. Look:</p>
<p><code language="python"><br />
s = Workspace()<br />
s.associate("foo", "bar", "baz")<br />
# Later in the code...<br />
print(s.comprehend("foo"))<br />
</code></p>
<p>Outputs:</p>
<pre>set(['bar', 'baz'])</pre>
<p>Btw, the naming for all of this (AssociativeNetwork, associate, comprehend) is all flexible. Suggestions are welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=769</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A Fork in the Road</title>
		<link>http://www.youell.com/matt/writing/?p=763</link>
		<comments>http://www.youell.com/matt/writing/?p=763#comments</comments>
		<pubDate>Mon, 16 Aug 2010 03:50:44 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[problem solving]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software industry]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=763</guid>
		<description><![CDATA[I got into an interesting conversation the other day with my pairing partner about the approach he and I wanted to take while trying to fix a bug. What followed was something of an existential conversation about software, complexity, and the role of the programmer in managing complexity.
We work with a small but quite tangled [...]]]></description>
			<content:encoded><![CDATA[<p>I got into an interesting conversation the other day with my pairing partner about the approach he and I wanted to take while trying to fix a bug. What followed was something of an existential conversation about software, complexity, and the role of the programmer in managing complexity.</p>
<p>We work with a small but quite tangled system. The system itself is only a few years old but contains many technologies and bears the scars of several smart but inexperienced people learning how to design as they went. I won&#8217;t articulate the details of the bug we were experiencing but I will say that it is something that recently appeared and was troublesome but non-critical.</p>
<p>The difference in our two points of view became apparently very quickly. My desired approach was to try to pin down the bug, deconstruct it to the point of understanding, and then apply a fix. My coworker&#8217;s approach was to make a well-educated guess about the cause of the bug and apply a refactoring to our codebase that would address the anticipated problem.</p>
<p>His reasoning was that our codebase was too complex to spend time trying to understand it in detail, and in the worst-case scenario we would still have completed a useful refactoring that improved the quality of our codebase. I found this a bit hopeless. Is software really so complex that we as programmers now have to act like doctors &#8211; diagnosticians &#8211; making reasoned guesses about the world around us? Is there no more engineering?</p>
<p>10 or 15 years ago I would have considered his approach ridiculous. Now I&#8217;m honestly not sure. Modern software systems contain so much abstraction and layering that it is really hard to judge the level of effort that will be involved in addressing any one problem.</p>
<p>So what option did we choose? We guessed and did the refactoring. I don&#8217;t think I would have agreed to that with just any pair partner, but this particular coworker is a very productive programmer. He had a clear path forward and a clear rationale.  And one thing you don&#8217;t do with a productive programmer is get in their way.</p>
<p>Did it work? No. I almost want to say &#8220;OF COURSE NOT!&#8221; but that would be unfair. It could very easily have worked. What did eventually work? A pair sitting down and tracing through the application stack with <a href="http://www.gnu.org/software/gdb/">gdb</a>. And even that has only located the approximate location of the error. We still haven&#8217;t solved the problem yet. But we&#8217;re much closer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=763</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction To Wheeler, Part 3: Transitions and Mutual Dispatch</title>
		<link>http://www.youell.com/matt/writing/?p=665</link>
		<comments>http://www.youell.com/matt/writing/?p=665#comments</comments>
		<pubDate>Thu, 22 Jul 2010 00:59:10 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Road To Wheeler]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[programming languages]]></category>
		<category><![CDATA[wheeler]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=665</guid>
		<description><![CDATA[Hey, quick, watch this video before you read any further. It&#8217;s under 2 minutes long and it is *fascinating*.

That video is about how cell membranes work. Did you notice how proteins, enzymes, etc. can only pass through the cell membrane if they are the right shape (and flavor)? That&#8217;s how values trigger transitions in Wheeler.
Transitions
If [...]]]></description>
			<content:encoded><![CDATA[<p>Hey, quick, watch this video before you read any further. It&#8217;s under 2 minutes long and it is *fascinating*.</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/owEgqrq51zY&amp;hl=en_US&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/owEgqrq51zY&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>That video is about how cell membranes work. Did you notice how proteins, enzymes, etc. can only pass through the cell membrane if they are the right shape (and flavor)? That&#8217;s how values trigger transitions in Wheeler.</p>
<h3>Transitions</h3>
<p>If categories are the most minimal representation of state, then transitions are the most minimal representation of action. Transitions are how computation happens in Wheeler. After all, organizing data is only half the battle with programming. Once you have the data in the form you want, you have to actually <em>do something</em>.</p>
<p>You can think of transitions as being very much like an event handler. You define a transition to trigger when an interaction between one or more categories happens.</p>
<p>Since Wheeler is still a work in progress, transitions are not yet native. Instead, transitions are created in Python, the language Wheeler is built on.</p>
<p>Remember our Hello example?</p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/hello_world_363x174.png" alt=""  style="float: none"/></p>
<p>Here&#8217;s the transition defined for it in Python:</p>
<pre class="syntax-highlight:php">
def printer(category):
	for item in category:
		print item.name[1:-1],
	print
	return []

ROOT.create(&#039;print&#039;).add_handler( STRING, printer )
</pre>
<p>(I&#8217;ve omitted some unimportant details for clarity.)</p>
<p>What you might be able to suss out here is that there is a ROOT category that all categories live within, and I&#8217;ve created a &#8220;print&#8221; category within that. In addition, I&#8217;ve added a transition (with add_handler) which knows to watch for interactions with items in the string category. If the transition finds an interaction that matches, it executes the printer() function, which simply calls Python&#8217;s &#8216;print&#8217; function.</p>
<h3>Mutual Dispatch</h3>
<p>When more than one transition is triggered by an expression, the transitions all execute AND &#8211; at least in concept &#8211; they all execute *at the same time*.</p>
<p>This is very much like the real world. If two objects collide you don&#8217;t say that one or the other of them collided first. The collision is mutual and simultaneous. In that same way, when categories interact, the interaction is mutual and simultaneous.</p>
<p>Here&#8217;s the final snippet of Wheeler for this introduction:</p>
<p><img src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/mutual_dispatch.png" alt=""  style="float: none"/></p>
<p>In case it&#8217;s not clear what is going on here, we have some numbers, which are in the category &#8216;number&#8217;, some text in the category &#8217;string&#8217;, and some other categories (&#8217;print&#8217;, &#8216;+&#8217;) which give it all meaning with transitions. One transition knows to add all of the numbers in the expression when the plus sign is present. Another transition knows to print all of the strings in the expression to stdout when the &#8216;print&#8217; category is present.</p>
<p>When presented with this jumble of categories, Wheeler figures out what to do based on the criteria of the transitions. This effectively creates a typed-dispatch mechanism. I call this simultaneous, polymorphic behavior &#8220;Mutual Dispatch&#8221;.</p>
<p>That sums up Wheeler as currently implemented. </p>
<p>There&#8217;s still a lot of work to be done. I&#8217;ve covered what Wheeler is currently capable of. There are other planned features that I didn&#8217;t cover and hope to implement soon. I will provide more info here as new features are added.</p>
<p>I hope you find it as oddly fascinating as I do! Feedback is not just requested, it is begged for. I also strongly encourage you to <a href="http://github.com/built/wheeler">grab the code</a>, play, and contribute.</p>
<p>(Thanks to Westside Programmers and #pdxfunc for letting me present on Wheeler a few times over the past year. Having the chance to present and receive feedback has firmed up the concepts in my mind and made them easier to distill into this introduction.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=665</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Introduction To Wheeler, Part 2: Values &amp; Types</title>
		<link>http://www.youell.com/matt/writing/?p=663</link>
		<comments>http://www.youell.com/matt/writing/?p=663#comments</comments>
		<pubDate>Wed, 21 Jul 2010 23:57:31 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Road To Wheeler]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[programming languages]]></category>
		<category><![CDATA[wheeler]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=663</guid>
		<description><![CDATA[(Note: It may be helpful to read the posts I did on types several months ago.)
Someone recently asked me if Wheeler had types. My answer was &#8220;No. Uhhh&#8230; and yes.&#8221; What a terrible answer! I&#8217;ll try to do better in this post.
Wheeler has no explicit type system. You will never declare a value to be [...]]]></description>
			<content:encoded><![CDATA[<p>(Note: It may be helpful to read the <a href="http://www.youell.com/matt/writing/?p=601">posts I did on types</a> several months ago.)</p>
<p>Someone recently asked me if Wheeler had types. My answer was &#8220;No. Uhhh&#8230; and yes.&#8221; What a terrible answer! I&#8217;ll try to do better in this post.</p>
<p>Wheeler has no explicit type system. You will never declare a value to be of a certain type. You might, however, associate a value with a particular category through an interaction. In that way you&#8217;re establishing a relationship that will allow typing *behavior*.</p>
<h3>What is a value?</h3>
<p>Values are the imaginary, interstitial things floating between categories. When you establish a relationship between categories in Wheeler, you&#8217;re creating values.</p>
<h3>What is a type?</h3>
<p>I won&#8217;t attempt to answer this in general. I am not a type theorist. From the perspective of Wheeler we might say that a type is determined by a graph&#8217;s &#8220;shape&#8221; and &#8220;flavor&#8221;. Shape is the actual form of the graph we create in memory (tree, ring, object, etc.). Flavor is what specific categories are being connected by that graph.</p>
<h3>What the hell is the difference?</h3>
<p>Context. It&#8217;s all context. A value will trigger typing behavior when something matching that shape and flavor is being watched for. At that point it could be considered a type. The rest of the time, a value.</p>
<h3>Layering values into types</h3>
<p>Have you ever seen an artist paint a landscape? First they&#8217;ll paint the background&#8230; the sky, the horizon, the land. Then they start to layer on more and more detail. At what point does their work become a painting? Existential arguments aside, you might say that the work is a painting when it meets the criteria of the artist. Criteria will vary from artist to artist. Everyone has their own objectives, aesthetics, etc. In other words, everyone brings their own point of view or <em>context</em> to a situation. This idea is so fundamental in Wheeler that it is a core value of the language:</p>
<p><strong>Context Drives Behavior</strong></p>
<p>To help understand this, let&#8217;s look at a Venn diagram. (Venn diagrams are quite handy for discussing concepts in Wheeler.)</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/value_cars.png" alt="" /></p>
<p>Here you see we&#8217;ve got just a category, Cars. You could think of that as a type. Let&#8217;s pile on some more specifics:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/value_cars_honda.png" alt="" /></p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/value_cars_honda_element.png" alt="" /></p>
<p>Now we&#8217;ve got all cars that are Honda Elements. That&#8217;s more specific, but it&#8217;s still more like a type than anything.</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/value_cars_honda_element_vin.png" alt="" /></p>
<p>Ah, but now that we have a VIN, the unique Vehicle Identification Number. That&#8217;s so unique as to specify a particular vehicle. That seems more like a concrete value now. Yay.</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/value_cars_honda_element_vin_actual.png" alt="" /></p>
<p><a href="http://www.youell.com/matt/writing/?p=665">Next time</a> we&#8217;ll look at <em>Transitions</em> which allow computation in Wheeler. Then we&#8217;ll exercise our type and value scheme.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=663</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduction To Wheeler, Part 1: Categories &amp; Interactions</title>
		<link>http://www.youell.com/matt/writing/?p=659</link>
		<comments>http://www.youell.com/matt/writing/?p=659#comments</comments>
		<pubDate>Thu, 08 Jul 2010 16:07:39 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Road To Wheeler]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[programming languages]]></category>
		<category><![CDATA[wheeler]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=659</guid>
		<description><![CDATA[I started my &#8220;Road to Wheeler&#8221; series last year to introduce some of the ideas behind Wheeler, a new programming language I&#8217;ve been developing. Instead of continuing that discussion I&#8217;m going to explain through demonstration. This is the first in a series of posts that will introduce the basic ideas behind Wheeler.
(You can play along [...]]]></description>
			<content:encoded><![CDATA[<p>I started my &#8220;Road to Wheeler&#8221; series last year to introduce some of the ideas behind Wheeler, a new programming language I&#8217;ve been developing. Instead of continuing that discussion I&#8217;m going to explain through demonstration. This is the first in a series of posts that will introduce the basic ideas behind Wheeler.</p>
<p>(You can play along at home by grabbing <a href="http://github.com/built/wheeler">the latest code</a> and running the examples. You&#8217;ll need Python 2.5 and patience.)</p>
<p>First, let&#8217;s fire up &#8220;bigwheel&#8221;, the Wheeler interpreter:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/bigwheel_349x150.png" alt="" /></p>
<p>Here is &#8220;Hello, world&#8221; in Wheeler:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/hello_world_363x174.png" alt="" /></p>
<p>Wheeler is flexible though, so you could also say:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/hello_world2_355x150.png" alt="" /></p>
<p>More on that later.</p>
<h3>Categories</h3>
<p>Wheeler is different from many languages you may be familiar with. All languages have abstractions. Some common examples are functions, lists, collections, stacks, pointers, and objects. In Wheeler, <strong>state</strong> is the fundamental abstraction.</p>
<p>State is represented by an abstraction called a Category. Categories are lightweight, atomic things. In Wheeler, <em>everything</em> is a category. Here are some sample categories:</p>
<ul>
<li>Fred</li>
<li>blue</li>
<li>5.3</li>
<li>&#8220;Hello, world!&#8221;</li>
<li>number</li>
<li>3/15/10</li>
<li>send</li>
<li>05:10:59</li>
<li>AM</li>
<li>PM</li>
<li>true</li>
<li>print</li>
</ul>
<p>Categories express boolean state. You&#8217;re either in a category or you&#8217;re not. Here&#8217;s an example:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/apple_red.png" alt="" /></p>
<p>Do you see that? No? Good. What you do not see is &#8216;apple&#8217; being put into the &#8216;red&#8217; category. That is happening behind the scenes through an <em>interaction</em> between apple and red.</p>
<p>Categories aren&#8217;t containers, but from a practical standpoint they act like containers. This allows you to make statements about the world. We can pile some more attributes on &#8220;apple&#8221;:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/apple_red2.png" alt="" /></p>
<h3>Interactions</h3>
<p>Interactions are expressions that combine categories to create new states. Our &#8220;Hello, world!&#8221; was an example of an interaction. Making our apple red was another interaction. Interaction is a mutual, simultaneous event where a connection (graph edge) is created between each item in the expression.</p>
<p>Wheeler has a &#8220;dump&#8221; command that will let you see (in GraphViz) the relationships you&#8217;ve created. Let&#8217;s dump &#8220;apple&#8221; and see the relationships:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/apple_dump.png" alt="" /></p>
<p>And the relationships as diagrammed in GraphViz:</p>
<p><img style="float: none" src="http://www.youell.com/matt/writing/wp-content/uploads/2010/07/apple_graph.png" alt="" /></p>
<p>Here you can see that &#8220;apple&#8221; is related to &#8220;red&#8221;, &#8220;tasty&#8221;, and &#8220;sweet&#8221;. (You might notice that it is also related to &#8220;dump&#8221;, the category it interacted with to generate our diagram, and &#8220;metadata&#8221;, a built-in category.)</p>
<p>You can see that not only is &#8216;apple&#8217; connected to &#8216;red&#8217;, but &#8216;red&#8217; is also connected to &#8216;apple&#8217;. In Wheeler all relationships are bidirectional. This may seem odd if you&#8217;re used to typical hierarchical relationships in programming. Wheeler doesn&#8217;t think about the world that way. Wheeler has a few strongly-held beliefs, and one of these is:</p>
<p><strong>Hierarchy Is Bullshit</strong></p>
<p><a href="http://www.youell.com/matt/writing/?p=663">Next time</a> we&#8217;ll talk about composing categories into types.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=659</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Typical Types of Typing and the Types They Typify, Part 2</title>
		<link>http://www.youell.com/matt/writing/?p=627</link>
		<comments>http://www.youell.com/matt/writing/?p=627#comments</comments>
		<pubDate>Tue, 17 Nov 2009 11:31:59 +0000</pubDate>
		<dc:creator>matt</dc:creator>
				<category><![CDATA[Road To Wheeler]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.youell.com/matt/writing/?p=627</guid>
		<description><![CDATA[Note: This is the conclusion of a two-part entry in my ongoing “Road to Wheeler” series.
In my last post I covered some of the popular type schemes used in programming today. I continued a little past where most discussions of type go when I pulled in pattern matching.
Deconstructing Types
Imagine that you are using a language [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Note: This is the conclusion of a two-part entry in my ongoing “Road to Wheeler” series.</p></blockquote>
<p>In <a href="/matt/writing/?p=601">my last post</a> I covered some of the popular type schemes used in programming today. I continued a little past where most discussions of type go when I pulled in pattern matching.</p>
<h4>Deconstructing Types</h4>
<p>Imagine that you are using a language with no data types and you want to implement some of the typing behavior that I showed in my last post. One way you might do it is with a <a href="http://en.wikipedia.org/wiki/Record_%28computer_science%29">record</a> used to associate type information with a value.</p>
<p>A C-style int might look something like this:</p>
<pre class="syntax-highlight:c">
x = (int, 5)
</pre>
<p>That&#8217;s pretty simple. We&#8217;re storing our value along with it&#8217;s type. Using that same scheme we can also represent a typical object instance:</p>
<pre class="syntax-highlight:c">
vendor = (Vendor, FirstName, LastName)
</pre>
<p>&#8220;Vendor&#8221; here is the classname, but it could also be an interface name. Or the record could contain a list of interfaces supported. Or, a list of methods implemented.</p>
<p>The pattern matching example from last time is already in record format. We&#8217;ll just change the Erlang braces to parentheses for continuity with the other examples:</p>
<pre class="syntax-highlight:c">
(customer, FirstName, LastName)
</pre>
<p>Let&#8217;s list all of these records together to compare them:</p>
<pre class="syntax-highlight:c">
(int, 5)
(Vendor, FirstName, LastName)
(customer, FirstName, LastName)
</pre>
<p>See the similarity? The types are from different methodologies, but they boil down to equivalent concepts.</p>
<h4>Our Own Imaginary Type Implementation</h4>
<p>I could easily define a function in my imaginary typeless language to properly handle any of these records:</p>
<pre class="syntax-highlight:python">
def display(record):

	type = record[0] # Key off first item in the record.

	if type == int:
		print_int(record)

	elif type == Vendor:
		print_vendor(record)

	elif type == customer:
		print_customer(record)
</pre>
<p>Is pattern matching a typing scheme? Do typing schemes devolve to pattern matching? </p>
<p>One thing I left out of my pattern matching example from last time: Patterns can match concrete values, such as specific numbers. In this example I&#8217;m expecting to find out just how overdue a customer&#8217;s account is:</p>
<pre class="syntax-highlight:c">
bill_with_msg({customer, 0}) -&gt; send_bill(&quot;Here&#039;s your new bill.&quot;);
bill_with_msg({customer, DaysOverdue}) -&gt; send_bill(&quot;Your bill is ~p days overdue.&quot;, DaysOverdue).
</pre>
<p>The first pattern matches on the atom &#8220;customer&#8221; and the specific value of 0 for the number of days overdue.</p>
<p>If we rewrote this in our typeless language with records it might look something like this:</p>
<pre class="syntax-highlight:python">
def bill_with_msg(record):

	type = record[0]
	days_overdue = record[1]

	if days_overdue == 0:
		send_bill(&quot;Here&#039;s your new bill&quot;)
	else:
		send_bill(&quot;You&#039;re bill is $days_overdue days overdue.&quot;)
</pre>
<h4>Guards Point The Way</h4>
<p>Have you seen guards? They&#8217;re pretty handy. Here&#8217;s an example of guards in Erlang:</p>
<pre class="syntax-highlight:c">
bill_with_msg({customer, 0}) -&gt; send_bill(&quot;New bill.&quot;);
bill_with_msg({customer, DaysOverdue}) when DaysOverdue &lt;= 30 -&gt; send_bill(&quot;Your bill is overdue.&quot;);
bill_with_msg({customer, DaysOverdue}) when DaysOverdue &gt; 30 -&gt; send_bill(&quot;YOUR BILL IS SERIOUSLY OVERDUE. PLEASE PAY NOW.&quot;).
</pre>
<p>Those &#8220;when&#8221; clauses are guards. And they&#8217;re pretty nice. In a fairly concise and clear way we&#8217;ve expressed our desire to do several things with relatively little code. In the process we&#8217;ve managed to unlock a new dimension to typing. If you accept that typing is essentially pattern matching you can see that the guards are actually adding extra dimension to our types by letting us do very specific pattern matching.</p>
<p>The trouble with guards is that they are bound to a function. What if you want to capture a certain type of customer (one who has spent more than $10k this year) so you can target them directly? You might find yourself with functions like this:</p>
<pre class="syntax-highlight:c">
bill_customer(customer, spent) when spent &gt; 10000 -&gt; preferred_billing().

find_shipping_options(customer, spent) when spent &gt; 10000 -&gt; preferred_shipping().

lookup_special_offers(customer, spent) when spent &gt; 10000 -&gt; offer_preferred_promos().
</pre>
<p>That&#8217;s a lot of repetition; a code smell. If you&#8217;re an OO type of person you might break that kind of customer out into it&#8217;s own class, generated by a factory. Or perhaps you might decorate your customer objects with particular account classes. And of course there might be many other strategies.</p>
<p>This might also be a good place for a macro if you&#8217;re a Lisper.</p>
<p>Another way might be to declare a type with the guard built-in. Here&#8217;s one way this might work with some made-up syntax:</p>
<pre class="syntax-highlight:c">
typedef Customer = Customer when spent &lt; 10000
typedef GoldCustomer = Customer when spent &gt;= 10000 and spend &lt; 10000
typedef PlatinumCustomer = Customer when spent &gt;= 100000
</pre>
<p>Here we&#8217;re creating some concise types on top of an existing type. Instead of subtyping or aggregating classes, we&#8217;re taking a class or data structure (Customer) and describing some situations where we&#8217;d like it to be treated specially. Now we can have polymorphic behavior on anything &#8211; types, values, or ranges of values.</p>
<p>This scheme will stretch a little farther:</p>
<pre class="syntax-highlight:c">

typedef Spam = String when contains &quot;viagra&quot;

def proc_mail(Spam msg):
	mark_and_toss()

def proc_mail(String msg):
	deliver(msg)
</pre>
<p>Of course you can only do this with lazy type evaluation, so there&#8217;s some runtime cost. I&#8217;m ok with that. Laziness has its virtues.</p>
<p>What I&#8217;ve presented so far is interesting but still rather flat. We can go farther. What if we can look at the shape of things too? After all, an interface represents a sort of shape. What if you just want to support objects that have a &#8220;Text&#8221; property? What if you only want to deal with Customers who have blue items in their RecentPurchases collection? Or more abstractly, what if we only want to deal with objects that expose a hashtable containing other hashtables?</p>
<p>Sound weird? It shouldn&#8217;t. It happens all the time, it just depends on the environment you work and code in. See also: jQuery, LINQ, RSpec, Hamcrest, etc., etc..</p>
<h4>This Way To The Egress</h4>
<p>I haven&#8217;t seen a type system that does exactly what I describe. Maybe you have. If so I hope you&#8217;ll tell me about it. Haskell&#8217;s type system is pretty nice (and I&#8217;m still learning), but seems to stop short of the dynamic behavior I&#8217;m looking for. Wheeler, the language I&#8217;m working on, aims (at least in part) for something very much like this.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.youell.com/matt/writing/?feed=rss2&amp;p=627</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
