<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>blog.philcrissman.com - Home</title>
  <id>tag:blog.philcrissman.com,2008:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.7.3">Mephisto Noh-Varr</generator>
  <link href="http://blog.philcrissman.com/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://blog.philcrissman.com/" rel="alternate" type="text/html"/>
  <updated>2008-04-03T18:44:30Z</updated>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-04-03:142</id>
    <published>2008-04-03T18:16:00Z</published>
    <updated>2008-04-03T18:44:30Z</updated>
    <link href="http://blog.philcrissman.com/2008/4/3/back-to-wordpress" rel="alternate" type="text/html"/>
    <title>Back To Wordpress</title>
<content type="html">
            &lt;p&gt;I&#8217;m going back to Wordpress, for awhile, I think. I kept telling myself that the features I&#8217;d like to see in Mephisto, I would add. I think I could but I&#8217;m beginning to realize that I really don&#8217;t have the time, and I won&#8217;t have time for awhile.&lt;/p&gt;


	&lt;p&gt;So, back to &lt;a href=&quot;http://philcrissman.com&quot;&gt;Wordpress&lt;/a&gt;. Thanks for reading,&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-04-02:134</id>
    <published>2008-04-02T15:29:00Z</published>
    <updated>2008-04-02T18:59:36Z</updated>
    <link href="http://blog.philcrissman.com/2008/4/2/social-networking-and-the-handshake-problem" rel="alternate" type="text/html"/>
    <title>Social Networking and the handshake problem</title>
<summary type="html">&lt;p&gt;There was a lot of discussion awhile back about Facebook and its limit of 5,000 friends. The discussion, in case you (mercifully) missed it, was largely driven by social networking power users like Scoble.&lt;/p&gt;


	&lt;p&gt;I didn&#8217;t think too much about it at the time. Between now and then, I&#8217;ve thought a few times about social networks, and how they are implemented. Not the front end, but the back matter; the model. The database; users and connections.&lt;/p&gt;


	&lt;p&gt;A social network is fundamentally a graph. Most social networks are analogous to non-directed graphs &#8211; that is, there is no distinction which &#8220;direction&#8221; a connection goes. If you are friends with someone in Facebook or MySpace, they are also friends with you. Pownce and Twitter have taken a directed-graph approach, in which friendship (following) is not automatically mutual. I could follow you, but you might not follow me. And so on.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;There was a lot of discussion awhile back about Facebook and its limit of 5,000 friends. The discussion, in case you (mercifully) missed it, was largely driven by social networking power users like Scoble.&lt;/p&gt;


	&lt;p&gt;I didn&#8217;t think too much about it at the time. Between now and then, I&#8217;ve thought a few times about social networks, and how they are implemented. Not the front end, but the back matter; the model. The database; users and connections.&lt;/p&gt;


	&lt;p&gt;A social network is fundamentally a graph. Most social networks are analogous to non-directed graphs &#8211; that is, there is no distinction which &#8220;direction&#8221; a connection goes. If you are friends with someone in Facebook or MySpace, they are also friends with you. Pownce and Twitter have taken a directed-graph approach, in which friendship (following) is not automatically mutual. I could follow you, but you might not follow me. And so on.&lt;/p&gt;
&lt;p&gt;Like any data structure, there are multiple ways of implementing a graph. Fundamentally it consists of vertices (the users, or nodes) and edges (the connections between the vertices). If we need to represent a directed graph (like Twitter) we have potentially two edges between any two vertices. In a non-directed graph (Facebook, LinkedIn, etc) only one edge will suffice. As far as implementation goes, a common solution would be to have a table for vertices(users) and a table for edges(connections or friendships).&lt;/p&gt;


	&lt;p&gt;The Facebook limit of 5,000 friends poses an interesting question. What exactly is the overhead of 5,000 friends? If only a few people have 5,000 friends, it&#8217;s not too bad; 5,000 edges. But if you&#8217;re implementing this, you need to consider a worst-case scenario. What if everyone decides to have 5000 friends?&lt;/p&gt;


	&lt;p&gt;As a simple example, suppose 5,000 people in Facebook are all part of the same organization, and all decide to befriend each other. Let&#8217;s say that everyone in the Oracle network decides they need to connect to every other Oracle person on Facebook. For simplicity, let&#8217;s say this network has 5,000 members, so we don&#8217;t need to worry about breaking Facebook&#8217;s limit.&lt;/p&gt;


	&lt;p&gt;Assuming that the users and connection are stored in two tables as mentioned earlier, our &#8220;users&#8221; table would have 5,000 records.&lt;/p&gt;


	&lt;p&gt;How many records would the &#8220;connections&#8221; table have?&lt;/p&gt;


	&lt;p&gt;The answer is simpler than it might seen; it&#8217;s the same as the handshake problem. The handshake problem asks, if there are &lt;em&gt;N&lt;/em&gt; people in the room, and everyone shakes hands with everyone else &lt;em&gt;one time&lt;/em&gt;, how many handshakes have there been? The answer is the triangular number for &lt;em&gt;N &#8211; 1&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;Triangular numbers are like a factorial, but using addition instead of multiplication. So where N! would be 1 * 2 * 3 * 4 * ... * N, the triangular number for &lt;em&gt;N&lt;/em&gt; would be 1 + 2 + 3 + 4 + ... + N. We&#8217;ll call it T&lt;sub&gt;n&lt;/sub&gt;. By this reasoning, T&lt;sub&gt;1&lt;/sub&gt; is 0, T&lt;sub&gt;2&lt;/sub&gt; is 1, T&lt;sub&gt;3&lt;/sub&gt; is 3, T&lt;sub&gt;4&lt;/sub&gt; is 6, and so on. For small graphs it&#8217;s very easy to confirm this by just drawing a few dots, drawing a line between every dot and counting the lines.&lt;/p&gt;


	&lt;p&gt;Is there a proof that for a graph of &lt;em&gt;N&lt;/em&gt; vertices we&#8217;d need T&lt;sub&gt;n &#8211; 1&lt;/sub&gt; edges to connect all of them? I&#8217;m a little rusty with formal proofs, but this one is fairly simple. If you have N nodes, you could make sure they are all connected by starting with one, and then drawing a line from it to each other node; next you would move to the next node, and draw a line to every other node to which was not already connected, and so on, until you run out of nodes.&lt;/p&gt;


	&lt;p&gt;If you were to actually do this, your first node, N&lt;sub&gt;1&lt;/sub&gt; would have N &#8211; 1 lines, as there would a line between it and every other node, excepting itself. When you move to N&lt;sub&gt;2&lt;/sub&gt;, it will only need N &#8211; 2 lines, as it is already connected to N&lt;sub&gt;1&lt;/sub&gt;... each consecutive node N&lt;sub&gt;k&lt;/sub&gt; would need one less edge to connect it to the remaining nodes, and you would wind up with edges numbering (N &#8211; 1) + (N &#8211; 2) + (N &#8211; 3) + ... + 1, or T&lt;sub&gt;n &#8211; 1&lt;/sub&gt;. Okay, as a formal proof it&#8217;s sloppy, but hopefully you can follow it.&lt;/p&gt;


	&lt;p&gt;Fortunately, there&#8217;s a simple formula to calculate T&lt;sub&gt;n&lt;/sub&gt; : n(n -1)/2.&lt;/p&gt;


	&lt;p&gt;So, if 5,000 people are all connected to each other, that requires 12,497,500 connections.&lt;/p&gt;


	&lt;p&gt;Okay&#8230; one step back here. Facebook has (last statistic I could find) about 67 million users. That means if each and every one of them were connected to their maximum amount of friends, it would require a database table of 167,466,500,000 records to store all the connections. Yes, that&#8217;s nearly 167.5 &lt;em&gt;billion&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;Not only that, but if the maximum friend count was increased by only &lt;em&gt;one&lt;/em&gt; more friend each, to 5001, and every Facebook user took advantage of it, that would actually add approximately 133 million connections to the table. &lt;em&gt;Just by allowing &lt;span class=&quot;caps&quot;&gt;ONE&lt;/span&gt; more friend per person&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;Now, I&#8217;m not a &lt;span class=&quot;caps&quot;&gt;DBA&lt;/span&gt;, but those numbers are huge for database tables. I&#8217;m pretty certain that most commercial databases would need to split a table like this up into multiple tables, for performance reasons if nothing else. I&#8217;m not going to attempt to figure out actual performance times to search a table of that size, but it&#8217;s not insignificant, especially if millions of others are searching the same table. In fact, looking at how high those number get even with the current maximum of 5,000 friends, I think it&#8217;s safe to say that Facebook&#8217;s engineers are &lt;em&gt;counting&lt;/em&gt; on the hope that 98% of their users will never create this many connections.&lt;/p&gt;


	&lt;p&gt;Now one argument could be that, even if Facebook doubled their maximum friends allowed, still only a &lt;span class=&quot;caps&quot;&gt;VERY&lt;/span&gt; small percentage of their users would accumulate this many friends, thus keeping the database records to a much more manageable number. That said, Scoble once reported that they started to see scaling issues over 5,000 friends, so it&#8217;s entirely possible that they even this is not practical&#8212;I&#8217;m going to assume that the engineers know what they&#8217;re talking about.&lt;/p&gt;


	&lt;p&gt;Another problem is, even if we are certain that 98%(ish) of the userbase won&#8217;t connect to nearly this many people, there is still the latent possibility that &lt;em&gt;they could&lt;/em&gt;. There&#8217;s also the possibility that a worm or script could do this for them, which is &lt;a href=&quot;http://namb.la/popular/&quot;&gt;not as far-fetched as it sounds&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Without knowing the details of Facebook&#8217;s architecture, I&#8217;m still going to have to side in with Facebook&#8217;s decision&#8212;I&#8217;d say allowing more than 5,000 per person friends is probably a bad decision, architecturally. That&#8217;s not to say there&#8217;s no way to do it effectively, but I can see there being some big challenges. Sorry, Scoble. I think I&#8217;m with Facebook on this particular decision.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-03-29:133</id>
    <published>2008-03-29T05:46:00Z</published>
    <updated>2008-03-29T06:35:04Z</updated>
    <link href="http://blog.philcrissman.com/2008/3/29/what-are-we-building-again" rel="alternate" type="text/html"/>
    <title>What Are We Building Again?</title>
<content type="html">
            &lt;blockquote&gt;The hardest single part of building a software system is deciding what to build. No part of the work so cripples the resulting system if done wrong. No other part is so difficult to rectify later.
&lt;br /&gt;- Fred Brooks&lt;/blockquote&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-03-18:132</id>
    <published>2008-03-18T07:35:00Z</published>
    <updated>2008-03-18T07:50:39Z</updated>
    <link href="http://blog.philcrissman.com/2008/3/18/some-things-i-saw-today" rel="alternate" type="text/html"/>
    <title>Some Things I Saw Today</title>
<content type="html">
            &lt;p&gt;&lt;a href=&quot;http://www.cs.st-and.ac.uk/~eb/Idris/&quot;&gt;Idris&lt;/a&gt; is a dependently typed language. You can visit the page to see what that means.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.iolanguage.com&quot;&gt;Io&lt;/a&gt; is &#8220;a small, prototype-based programming language. The ideas in Io are mostly inspired by Smalltalk (all values are objects, all messages are dynamic), Self (prototype-based), NewtonScript (differential inheritance), Act1 (actors and futures for concurrency), &lt;span class=&quot;caps&quot;&gt;LISP&lt;/span&gt; (code is a runtime inspectable/modifiable tree) and Lua (small, embeddable).&#8221;&lt;/p&gt;


	&lt;p&gt;Someone has written a &lt;a href=&quot;http://doom.chaosforge.org/&quot;&gt;Doom Roguelike&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;You can see the slides to an &lt;a href=&quot;http://weigend.com/blog/archives/18&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SXSW&lt;/span&gt; presentation on designing interactions&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://ozimodo.rubyforge.org/&quot;&gt;Ozimodo&lt;/a&gt; is a Tumblelog written with rails. A tumblelog is something like &lt;a href=&quot;http://www.anarchaia.org/&quot;&gt;Anarchaia&lt;/a&gt; (from which I found a few of the above links.&lt;/p&gt;


	&lt;p&gt;Can&#8217;t think of a good name for that class? No problem. Visit &lt;a href=&quot;http://www.classnamer.com/&quot;&gt;classnamer.com&lt;/a&gt;. There you will be inspired to call it things like &#8220;PrioritizedGridDispatcher&#8221; or &#8220;GenericMemoryBundle&#8221;.&lt;/p&gt;


	&lt;p&gt;There is at least one website full of &lt;a href=&quot;http://www.umljokes.com/component/option,com_datsogallery/Itemid,34/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; Jokes&lt;/a&gt;. Who knew?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-03-07:126</id>
    <published>2008-03-07T12:00:00Z</published>
    <updated>2008-03-07T13:38:01Z</updated>
    <link href="http://blog.philcrissman.com/2008/3/7/matz-on-ruby-1-9" rel="alternate" type="text/html"/>
    <title>Matz on Ruby 1.9</title>
<content type="html">
            &amp;lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&amp;lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/oEkJvvGEtB4&quot;&gt;&amp;lt;/param&gt;&amp;lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&amp;lt;/param&gt;&amp;lt;embed type=&quot;application/x-shockwave-flash&quot; src=&quot;http://www.youtube.com/v/oEkJvvGEtB4&quot; height=&quot;355&quot; wmode=&quot;transparent&quot; width=&quot;425&quot;&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;

	&lt;p&gt;Can&#8217;t leave out Matz; there are a lot of interesting things over in &lt;a href=&quot;http://www.youtube.com/profile_videos?p=r&#38;user=googletechtalks&quot;&gt;Google&#8217;s Tech Talks YouTube account&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-03-06:125</id>
    <published>2008-03-06T14:19:00Z</published>
    <updated>2008-03-06T14:22:29Z</updated>
    <link href="http://blog.philcrissman.com/2008/3/6/ola-bini-talks-about-jruby" rel="alternate" type="text/html"/>
    <title>Ola Bini Talks about JRuby</title>
<content type="html">
            &amp;lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&amp;lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/PfnP-8XbJao&quot;&gt;&amp;lt;/param&gt;&amp;lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&amp;lt;/param&gt;&amp;lt;embed type=&quot;application/x-shockwave-flash&quot; src=&quot;http://www.youtube.com/v/PfnP-8XbJao&quot; height=&quot;355&quot; wmode=&quot;transparent&quot; width=&quot;425&quot;&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-03-04:124</id>
    <published>2008-03-04T18:31:00Z</published>
    <updated>2008-03-04T18:33:26Z</updated>
    <link href="http://blog.philcrissman.com/2008/3/4/the-tension-between-developing-and-hacking" rel="alternate" type="text/html"/>
    <title>The Tension Between Developing and Hacking</title>
<summary type="html">&lt;p&gt;Again, I&#8217;m going to continue to use &#8220;hack&#8221; in &lt;em&gt;ye olde&lt;/em&gt; sense of interesting and/or excellent coding. And in this context, we&#8217;ll let &#8220;development&#8221; stand for the sort of coding you might do at work; something businessey, something enterprisey. It&#8217;s all good. I&#8217;ve been writing about this a lot. I hope that&#8217;s okay.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Again, I&#8217;m going to continue to use &#8220;hack&#8221; in &lt;em&gt;ye olde&lt;/em&gt; sense of interesting and/or excellent coding. And in this context, we&#8217;ll let &#8220;development&#8221; stand for the sort of coding you might do at work; something businessey, something enterprisey. It&#8217;s all good. I&#8217;ve been writing about this a lot. I hope that&#8217;s okay.&lt;/p&gt;
&lt;p&gt;I wrote something called &lt;a href=&quot;http://blog.philcrissman.com/2008/2/19/considered-harmful-considered-harmful&quot;&gt;Considered harmful considered harmful&lt;/a&gt; not too long back, basically leapfrogging from &lt;a href=&quot;http://hackety.org/2007/12/24/thisHackWasNotProperlyPlanned.html&quot;&gt;a post&lt;/a&gt; _why made on hackety.org.&lt;/p&gt;


	&lt;p&gt;I saw an example today in the &lt;a href=&quot;http://safari.oreilly.com/9780596516178&quot;&gt;Ruby Programming Language&lt;/a&gt; book by Matz and David Flanagan that really makes it easier to get at the point I was trying to reach.&lt;/p&gt;


	&lt;p&gt;In the first chapter, they have a ruby Sudoku solving program, as an example of a little bit longer chunk of ruby code. I&#8217;m a sudoku nut, so I started picking it a part to see how it worked. Then I arrived at:&lt;/p&gt;


&lt;blockquote&gt;
&lt;pre&gt;
      # ...Writing dense code
      # like this is probably not good coding style, but it demonstrates
      # the power and expressiveness of the language.
      (0..8).collect{|r| @grid[r*9,9].pack('c9')}.join(&quot;\n&quot;).tr(BIN,ASCII)
&lt;/pre&gt;
&lt;/blockquote&gt;

	&lt;p&gt;(BIN and &lt;span class=&quot;caps&quot;&gt;ASCII&lt;/span&gt;, in the above example, are string constants, &lt;code&gt;ASCII = &quot;.123456789&quot;&lt;/code&gt; and &lt;code&gt;BIN = &quot;\000\001\002\003\004\005\006\007\010\011&quot;&lt;/code&gt; respectively.)&lt;/p&gt;


	&lt;p&gt;Now, I&#8217;m not going to talk about how the snippet works &amp;mdash; I&#8217;ll let you explore that on your own if you like that sort of thing. I was struck by the comment: &lt;code&gt;Writing dense code like this is probably not good coding style, but it demonstrates the power and expressiveness of the language.&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Yes it does. But that line makes very clear the tension between hacking (this is fun and interesting!) and developing (this is sober, and let&#8217;s make sure nothing clever works its way into the code).&lt;/p&gt;


	&lt;p&gt;In my mind, the comment read something like this:&lt;/p&gt;


	&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;LOOK AT THE REALLY COOL THINGS YOU COULD DO WITH RUBY&lt;/span&gt;. NOW, &lt;span class=&quot;caps&quot;&gt;YOU ARE NOT ALLOWED TO EVER USE THIS IN REAL LIFE&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;What?&lt;/p&gt;


	&lt;p&gt;Now, that&#8217;s just mean.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-03-03:122</id>
    <published>2008-03-03T06:17:00Z</published>
    <updated>2008-03-03T06:23:25Z</updated>
    <link href="http://blog.philcrissman.com/2008/3/3/installing-junit-4-4-on-mac-os-x" rel="alternate" type="text/html"/>
    <title>Installing JUnit 4.4 on Mac OS X</title>
<summary type="html">&lt;p&gt;&#8220;Installing&#8221; is a little misleading&#8212;since JUnit is a jar file, you aren&#8217;t really installing anything&#8230; you&#8217;re simply putting it somewhere.&lt;/p&gt;


	&lt;p&gt;The trick is to let java and your system know where to &lt;em&gt;find&lt;/em&gt; JUnit.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&#8220;Installing&#8221; is a little misleading&#8212;since JUnit is a jar file, you aren&#8217;t really installing anything&#8230; you&#8217;re simply putting it somewhere.&lt;/p&gt;


	&lt;p&gt;The trick is to let java and your system know where to &lt;em&gt;find&lt;/em&gt; JUnit.&lt;/p&gt;
&lt;p&gt;So, let&#8217;s say you&#8217;ve downloaded JUnit 4.4 from http://junit.org. I downloaded the zip, so let&#8217;s assume you did that, too.&lt;/p&gt;


	&lt;p&gt;I put it in /Developer and ran:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;unzip junit4.4.zip&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Then, edit ~/.profile; you&#8217;ll need your path to know where junit is, and your classpath as well. My .profile wound up looking like this (only the $JUNIT_HOME stuff is really applicable, though you will definitely want to leave $PATH in there, so that you don&#8217;t get rid of everything that is in your path by default):&lt;/p&gt;


&lt;pre&gt;
export JUNIT_HOME=&quot;/Developer/junit4.4&quot; 
export PATH=&quot;/usr/local/bin:/usr/local/sbin:$PATH:$JUNIT_HOME&quot; 
export CLASSPATH=&quot;$CLASSPATH:$JUNIT_HOME/junit-4.4.jar:$JUNIT_HOME&quot; 
&lt;/pre&gt;

	&lt;p&gt;To get bash to know about the environment changes you just told it to make, you could close and restart your terminal, or you could type&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;source ~/.profile&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;Now, you should be able to type:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt; java org.junit.runner.JUnitCore org.junit.tests.AllTests&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;and see results something like:&lt;/p&gt;


&lt;pre&gt;
JUnit version 4.4
..........................................................
..........................................................
..........................................................
..........................................................
.......................................I.II...............
..........................................
Time: 4.098

OK (329 tests)
&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-02-28:118</id>
    <published>2008-02-28T22:52:00Z</published>
    <updated>2008-02-28T22:56:08Z</updated>
    <link href="http://blog.philcrissman.com/2008/2/28/rush-a-ruby-shell" rel="alternate" type="text/html"/>
    <title>Rush -- a Ruby Shell</title>
<content type="html">
            &lt;p&gt;&lt;a href=&quot;http://rush.heroku.com/&quot;&gt;Rush&lt;/a&gt; looks very cool. It is not &#8220;complete&#8221; but it is a usable shell, and is intended to replace bash &#38; ssh with a shell that uses Ruby syntax.&lt;/p&gt;


	&lt;p&gt;I once thought about creating a Ruby shell (I think about a lot of things that I never actually do), but I was going to call it &lt;em&gt;rash&lt;/em&gt;. It sounds more contagious.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-02-27:117</id>
    <published>2008-02-27T15:53:00Z</published>
    <updated>2008-02-27T16:07:16Z</updated>
    <link href="http://blog.philcrissman.com/2008/2/27/uml-for-hackers-class-diagrams" rel="alternate" type="text/html"/>
    <title>UML For Hackers: Lean Class Diagrams</title>
<summary type="html">&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; is usually seen as a very &lt;em&gt;corporate&lt;/em&gt; (i.e., boring) tool. It implies planning, best practices, and all those other things.&lt;/p&gt;


	&lt;p&gt;Hacking is usually described as a paradigm of just sitting down and starting to code, and altering your architecture along the way as you need to.&lt;/p&gt;


	&lt;p&gt;I think that&#8217;s fine, possibly even beneficial, for small projects, or projects worked on my one individual. But as soon as you decided to get a team working on a project&#8230; you need some way to represent parts of the application so people know how it works. Yes, we could just invent a new ad hoc representation scheme every time we need to do this&#8230; or we could just use &lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt;.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; is usually seen as a very &lt;em&gt;corporate&lt;/em&gt; (i.e., boring) tool. It implies planning, best practices, and all those other things.&lt;/p&gt;


	&lt;p&gt;Hacking is usually described as a paradigm of just sitting down and starting to code, and altering your architecture along the way as you need to.&lt;/p&gt;


	&lt;p&gt;I think that&#8217;s fine, possibly even beneficial, for small projects, or projects worked on my one individual. But as soon as you decided to get a team working on a project&#8230; you need some way to represent parts of the application so people know how it works. Yes, we could just invent a new ad hoc representation scheme every time we need to do this&#8230; or we could just use &lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; has the advantage that some smart people put a lot of time into thinking about how it should work. Martin Fowler has a particularly good book on the subject, &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; Distilled&lt;/em&gt;. This post might be thought of as &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; Even More Drastically Distilled&lt;/em&gt;.&lt;/p&gt;


&lt;h4&gt;Class Diagrams&lt;/h4&gt;

	&lt;p&gt;So, how about class diagrams, then. Here&#8217;s the bare minimum (IMHO):&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Classes&lt;/strong&gt;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;A Class is a rectangle.&lt;/li&gt;
		&lt;li&gt;If you want to name it, name it at the top and put a line under it.&lt;/li&gt;
		&lt;li&gt;If it has attributes you want to remember, list them under the name.&lt;/li&gt;
		&lt;li&gt;If you want to add methods (class functions), draw a line under your attributes and list them there.&lt;/li&gt;
		&lt;li&gt;If you think some methods are obvious, then just don&#8217;t list them; as long as everyone else will think they&#8217;re obvious, too: get_x() and set_x() might be obvious. put_fuzzy_bunny_at_x() might not be.&lt;/li&gt;
		&lt;li&gt;You can use + or &#8211; in front of attributes or methods to indicate public or private respectively. (# for protected, if you want that).&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;strong&gt;Relationships&lt;/strong&gt;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Subclassing (is-a) is represented by small open triangle under the superclass, and a line or lines to the subclass(es).&lt;/li&gt;
		&lt;li&gt;Aggregation (has-a) is represented by a small open diamond from &#8220;having&#8221; class, and a line to the attribute class. If another class is an attribute like this, you wouldn&#8217;t need to list it in the attributes necessarily; the class diagram makes it clear that Car &lt;strong&gt;has&lt;/strong&gt; an Engine (for example).&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;There&#8217;s more, but do you really want to know it? We want a lean toolkit, here. Ok, fine; you can look at the &lt;a href=&quot;http://www.digilife.be/quickreferences/QRC/UML%20Quick%20Reference%20Card.pdf&quot;&gt;quick reference card&lt;/a&gt; or &lt;a href=&quot;http://www.holub.com/goodies/uml/&quot;&gt;this handy cheatsheet&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-02-20:93</id>
    <published>2008-02-20T15:16:00Z</published>
    <updated>2008-02-20T15:29:18Z</updated>
    <link href="http://blog.philcrissman.com/2008/2/20/computer-science-vs-real-life" rel="alternate" type="text/html"/>
    <title>Computer Science vs. Real Life</title>
<summary type="html">&lt;p&gt;When I decided that I wanted to change my career and &#8220;go into computers&#8221;, I had a &lt;em&gt;very&lt;/em&gt; limited exposure to computing.&lt;/p&gt;


	&lt;p&gt;Well&#8230; I should qualify that. It&#8217;s true, I had used &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; so much in high school (before there was Windows) that I preferred &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; to the Macintosh of that day, wrote my own autoexec.bat files, and in fact had a copy of &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt;, Pascal, and Moria on 5.25&#8221; floppy disks that pretty much went everywhere with me. At the time, many &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; PCs did not have hard drives; you loaded the OS from a floppy, then it ran from memory and you put in some other disk with your files or other programs on it.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;When I decided that I wanted to change my career and &#8220;go into computers&#8221;, I had a &lt;em&gt;very&lt;/em&gt; limited exposure to computing.&lt;/p&gt;


	&lt;p&gt;Well&#8230; I should qualify that. It&#8217;s true, I had used &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; so much in high school (before there was Windows) that I preferred &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; to the Macintosh of that day, wrote my own autoexec.bat files, and in fact had a copy of &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt;, Pascal, and Moria on 5.25&#8221; floppy disks that pretty much went everywhere with me. At the time, many &lt;span class=&quot;caps&quot;&gt;DOS&lt;/span&gt; PCs did not have hard drives; you loaded the OS from a floppy, then it ran from memory and you put in some other disk with your files or other programs on it.&lt;/p&gt;
&lt;p&gt;And I took a class called AP Computer Science which spanned 2 years; the first of which was all Pascal, which I found that I loved, and the second of which was all theory, during which I tuned out and drew cartoons in my notebooks (I was 17, what can I say?).&lt;/p&gt;


	&lt;p&gt;But after that&#8230; after high school, I really didn&#8217;t touch a computer for years. I didn&#8217;t own one, didn&#8217;t know many people who did. I didn&#8217;t really edge back toward computing until 1996 or 97, when I think I got my first email address (a Yahoo account which &lt;em&gt;still&lt;/em&gt; accumulates spam).&lt;/p&gt;


	&lt;p&gt;So, when I decided to go into computers, it was by no means as a result of my casual familiarity with all things computer-ish. I had some distant background, but everything current was obscure to me. We had a PC at home which ran Window 95; and this was 2001.&lt;/p&gt;


	&lt;p&gt;I figured I&#8217;d need an edgemecation, so I looked at the curriculum of the local community colleges and saw &#8220;Computer Science.&#8221; &lt;em&gt;That must be what I&#8217;m looking for&lt;/em&gt;, I thought, so off I went. In the meantime, I got my foot in the door by reading an A+ book cover-to-cover, getting a helpdesk job, and teaching myself to program on the web.&lt;/p&gt;


	&lt;p&gt;In the past few years of being in IT departments (both at small businesses and now at Oracle), in the various computer science classes at universities, and reading just about any and everything I can, I&#8217;ve noticed a few things.&lt;/p&gt;


	&lt;p&gt;For starters, as is well known if you are also in either computer science or software development, &lt;em&gt;Computer Science&lt;/em&gt; as taught in schools does not seem to have much in common with &#8220;real world&#8221; software development. For this reason, you also see a major which overlaps &lt;em&gt;somewhat&lt;/em&gt; with a Comp. Sci. major&#8217;s requirements: usually called &lt;span class=&quot;caps&quot;&gt;MIS&lt;/span&gt; or &lt;span class=&quot;caps&quot;&gt;CIS&lt;/span&gt; (Management/Computer Information Systems) or something along those lines.&lt;/p&gt;


	&lt;p&gt;It&#8217;s &lt;em&gt;like&lt;/em&gt; Computer Science, only &lt;em&gt;practical&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;As it turns out, I&#8217;m more interested in Computer Science than &lt;em&gt;Managing Information Systems&lt;/em&gt;, in general, so I think I made the right choice. But thinking of things like my past few articles, I&#8217;m trying to determine just &lt;em&gt;why&lt;/em&gt; that is. (Though, honestly, &#8220;Managing Information Systems&#8221; just &lt;em&gt;sounds&lt;/em&gt; incredibly boring.)&lt;/p&gt;


&lt;h4&gt;Interesting vs. Practical&lt;/h4&gt;

	&lt;p&gt;Computer Science (my take, at least) is interested in structures and methods; what&#8217;s efficient, what&#8217;s interesting, why it works, and so forth.&lt;/p&gt;


	&lt;p&gt;More vocational programming (and hey: I am entirely in favor of developing software for a living) is much more concerned with processes, designing large systems, keeping code maintainable, being able to communicate what code is doing, &lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; diagrams, patterns, and so forth.&lt;/p&gt;


	&lt;p&gt;Now; I think there&#8217;s a lot of overlap there. But there are some big differences. Someone with a computer science mindset might be very interested in Lisp or Scheme (or Haskell, or Io, or Scala, or Ruby, or Python&#8230;) simply because of how they work, how they are different, and so on. A more pragmatic/vocational approach would have only one question: will anyone give me a job programming Lisp (or other from that list)? No? Okay; not interested.&lt;/p&gt;


	&lt;p&gt;In the second mindset, Ruby and Python only become interesting when you read that companies are actually using them, and paying people to write in them. In the first mindset, they are intrinsically interesting. Again, this is just a personal observation. It may be that most Computer Science students are really more interested in &lt;span class=&quot;caps&quot;&gt;J2EE&lt;/span&gt; programming for Fortune 500 companies and are just taking Comp. Sci. because &lt;em&gt;that is just how you do it&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;But &lt;span class=&quot;caps&quot;&gt;J2EE&lt;/span&gt; or whether we are interested in having good careers (of course we are) is not the point I&#8217;m trying to reach. The point, which in one way or another I&#8217;ve been writing about for the last few posts, is the dichotomy between the &#8220;clever hack&#8221; approach versus the &#8220;Great Wall Of Best Practices&#8221; approach, to programming in general.&lt;/p&gt;


	&lt;p&gt;Without re-treading too much old ground, one approach favors clever, neat, or elegant solutions. They might be shorter, or trickier, or more efficient, or merely unusual. The other approach favors&#8230; well, whatever is the least &lt;em&gt;risky&lt;/em&gt;, basically.&lt;/p&gt;


	&lt;p&gt;I can understand the necessity of most best practices. If you are writing software that will be enormous, that will handle huge amounts of data, data which may be incredibly important to many people (people&#8217;s banking or medical records, or airplane routes, for example), there is a much greater amount of risk involved than if you are writing a new blog platform that you will use and frankly you don&#8217;t care if anyone else ever uses it or not. In the first case, failure of the software could be catastrophic to hundreds of thousands of people, up to and including loss of life; in the second, it&#8217;s a minor annoyance and you fix it when you have a chance.&lt;/p&gt;


	&lt;p&gt;So, if I&#8217;m a large company commissioning the creation of a huge, critical software project, I&#8217;m going to appoint someone to manage it, and I&#8217;m going to make it very clear that they are responsible for returning a product that works as advertised and will not wipe out everyone&#8217;s bank account or cause two planes to crash into each other. Oh, and also on time and under budget. User friendly? &lt;em&gt;Only if you have time&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;So now this senior project manager is going to have a team of people working on this software. She&#8217;s going to want batteries of tests run, procedures followed, and code that can be maintained. What if five of the best developers quit and become consultants for &lt;span class=&quot;caps&quot;&gt;IBM&lt;/span&gt;? Well, someone had better be able to come in and continue working on their code, so it had better be readable, so do it &lt;em&gt;like this&lt;/em&gt;....&lt;/p&gt;


	&lt;p&gt;...And we spiral into the process that, if successful, creates the Enterprise Software we know and loathe today.&lt;/p&gt;


	&lt;p&gt;And yet, I believe&#8230; I &lt;em&gt;want&lt;/em&gt; to believe&#8230; that clever hacking can be kept alive and thriving in the midst of all this. I&#8217;m not sure that I can answer exactly &lt;em&gt;how&lt;/em&gt; this can be done, but here&#8217;s the reason I think it can:&lt;/p&gt;


	&lt;p&gt;At the core, all of the problems faced by the development of Enterprise software, are still &lt;em&gt;interesting problems&lt;/em&gt;, the kind that can engage someone in the clever hacks mindset. You need processes that allow code to be tested, maintained, that will be efficient, will allow for possible changing APIs of dependent software, changing platforms at some point in the future, changing file formats&#8230;? These are all potentially interesting problems. There have to be solutions that don&#8217;t involve sucking all the life out of the development process.&lt;/p&gt;


	&lt;p&gt;So even though the massive, test-driven, process-centric world of Enterprise software often seems at odds with the quick and dirty, use-the-language-of-your-choice, elegant-hack world of programming &lt;em&gt;for fun&lt;/em&gt;, I don&#8217;t think it &lt;em&gt;needs&lt;/em&gt; to be.&lt;/p&gt;


	&lt;p&gt;For an example (and maybe for a future post), I think this is part of the reason Rails has exploded in popularity over the last few years. It pleases (generally) both crowds. It incorporates all sorts of best practices and design patterns, while still being one big clever hack, using Ruby no less. I don&#8217;t think Rails is the be-all-end-all Ultimate Conclusion of this sort of thing, but I take it as a good example that, yes, &lt;em&gt;you can please both camps&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;Happy hacking.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-02-19:90</id>
    <published>2008-02-19T04:08:00Z</published>
    <updated>2008-02-19T04:16:14Z</updated>
    <link href="http://blog.philcrissman.com/2008/2/19/considered-harmful-considered-harmful" rel="alternate" type="text/html"/>
    <title>Considered Harmful Considered Harmful</title>
<content type="html">
            &lt;p&gt;Okay, the novelty of exploiting use-mention ambiguity wore off awhile ago. That&#8217;s okay.&lt;/p&gt;


	&lt;p&gt;It&#8217;s possibly time we stopped considering things harmful. The idea is somewhat puzzling; it seems as though the thing under consideration might not actually be recognized as harmful for any other reason than that we are &lt;em&gt;considering&lt;/em&gt; it such. A panel of experts, perched somewhere behind your shoulder, has unanimously agreed that what you&#8217;re about to do may, in fact, be harmful. Dispensing with things such as proof, we&#8217;ll just &lt;em&gt;consider&lt;/em&gt; it harmful and be done with it.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;What are you doing? Don&#8217;t you know that&#8217;s considered harmful?&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;The trouble with this is that, to be consistent, we can&#8217;t even consider &#8220;considered harmful&#8221; harmful without violating our new rule. You see? That&#8217;s what happens when we start inventing considerations without regard to rhyme, reason, or reality.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-02-18:88</id>
    <published>2008-02-18T22:14:00Z</published>
    <updated>2008-02-18T22:14:43Z</updated>
    <link href="http://blog.philcrissman.com/2008/2/18/on-iterative-development" rel="alternate" type="text/html"/>
    <title>On Iterative Development</title>
<content type="html">
            &lt;p&gt;&#8220;You should use iterative development only on projects you want to succeed.&#8221;&lt;/p&gt;


	&lt;p&gt;- Martin Fowler (&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; Distilled&lt;/strong&gt;, 3rd Edition).&lt;/p&gt;


	&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;NOTE&lt;/span&gt;: I&#8217;ve had a penchant for just posting quotations, recently. This is mainly because I&#8217;ve been swamped with work, but part of that work has included reading or re-reading a lot of software development classics, hence the quotations. For what it&#8217;s worth, I&#8217;ll try to write something of my own some time soon.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-02-18:89</id>
    <published>2008-02-18T04:11:00Z</published>
    <updated>2008-02-18T04:12:41Z</updated>
    <link href="http://blog.philcrissman.com/2008/2/18/another-perspective-on-advertisements-on-blogs" rel="alternate" type="text/html"/>
    <title>Another Perspective On Advertisements on Blogs</title>
<summary type="html">&lt;p&gt;About 3 months ago I stopped running advertisements on my blog.&lt;/p&gt;


	&lt;p&gt;This was after about 2-3 years (not sure, really) of running AdSsense ads on my blog, and in that time earning a grand total of about $100. Needless to say, it wasn&#8217;t making much of an income.&lt;/p&gt;


	&lt;p&gt;During this time, I often found myself trying (usually in vain) to attract more traffic to the blog, but after awhile I began to feel like my motivations were wrong. The canonical strategy to advertisements on a blog, or almost any website, is that the more traffic you get, you should get correspondingly more click-throughs, resulting in more income. After awhile, my main goal was to simply make some money off the website. Obviously, there&#8217;s nothing wrong with this; I&#8217;m a big supporter of making money. But it seemed (to &lt;em&gt;me&lt;/em&gt;, anyways) that my goal to drive traffic simply to make (hopefully) a few more dollars from the website, was distracting me from whatever purpose I had originally had in creating the website.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;About 3 months ago I stopped running advertisements on my blog.&lt;/p&gt;


	&lt;p&gt;This was after about 2-3 years (not sure, really) of running AdSsense ads on my blog, and in that time earning a grand total of about $100. Needless to say, it wasn&#8217;t making much of an income.&lt;/p&gt;


	&lt;p&gt;During this time, I often found myself trying (usually in vain) to attract more traffic to the blog, but after awhile I began to feel like my motivations were wrong. The canonical strategy to advertisements on a blog, or almost any website, is that the more traffic you get, you should get correspondingly more click-throughs, resulting in more income. After awhile, my main goal was to simply make some money off the website. Obviously, there&#8217;s nothing wrong with this; I&#8217;m a big supporter of making money. But it seemed (to &lt;em&gt;me&lt;/em&gt;, anyways) that my goal to drive traffic simply to make (hopefully) a few more dollars from the website, was distracting me from whatever purpose I had originally had in creating the website.&lt;/p&gt;
&lt;p&gt;So I cut out the advertisements. Not a particularly difficult decision, they were bringing in practically nothing as it was.&lt;/p&gt;


	&lt;p&gt;Despite the fact that the net income from the ads was miniscule, I have definitely noticed that since I quit with the ads on the website, my motivation to bring traffic, and even to post regularly has subsided. I find this interesting, possibly a little embarrassing. After all, should I want to write simply for the sake of writing?&lt;/p&gt;


	&lt;p&gt;Well, not necessarily. Professional writers, for example, don&#8217;t write for free. In general, we are motivated by incentive of some sort in almost &lt;em&gt;everything&lt;/em&gt; we do. So it&#8217;s not at all unreasonable that removing an incentive (advertising income&#8230; however small) would result in a decreased motivation to blog.&lt;/p&gt;


	&lt;p&gt;Because of this, I&#8217;ve been debating adding advertisements back to the blog again. My &lt;a href=&quot;http://philcrissman.com&quot;&gt;old blog&lt;/a&gt; and all it&#8217;s archives are still up (and getting substantially higher traffic than this new blog), so I decided to go ahead and put adsense ads back onto that site. After all, if the archives are just going to be sitting there getting traffic, I might as well have at least whatever slight income can be derived from that.&lt;/p&gt;


	&lt;p&gt;As far as this blog goes, the one that I&#8217;m writing now, I&#8217;m still undecided. Putting some sort of advertisements on the site would certainly reinstate some incentive to post more often. Would that incentive be offset by the temptation to drive traffic By Any Means Necessary, rather than just by writing the things that really interest me?&lt;/p&gt;


	&lt;p&gt;A sample ethical/pragmatic quandary: does having Amazon affiliate links make any potential book reviews I might write suspect? Less than honest? I can always determine to review only books that I love, but that&#8217;s not entirely honest either. If I read a book that really stinks (e.g., any of the Deitel series of programming books), it would seem a public service to share that with people before they make the mistake of buying it.&lt;/p&gt;


	&lt;p&gt;I suspect I&#8217;ll be pondering this for a bit yet. Since this blog receives such little traffic (currently, at least), it wouldn&#8217;t &lt;em&gt;really&lt;/em&gt; matter if I added advertisements anyways. Still, I&#8217;m considering the pros and cons.&lt;/p&gt;


	&lt;p&gt;If you have strong feelings about advertisements on blogs, one way or the other, feel free to share them in a comment: thanks.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.philcrissman.com/">
    <author>
      <name>philcrissman</name>
    </author>
    <id>tag:blog.philcrissman.com,2008-02-18:87</id>
    <published>2008-02-18T02:08:00Z</published>
    <updated>2008-02-18T02:09:41Z</updated>
    <link href="http://blog.philcrissman.com/2008/2/18/abstraction" rel="alternate" type="text/html"/>
    <title>Abstraction</title>
<content type="html">
            &lt;p&gt;&#8220;The discovery of common abstractions and mechanisms greatly facilitates our understanding of complex systems. For example, with just a few minutes of orientation, an experienced pilot can step into a multiengine jet aircraft he or she has never flown before and safely fly the vehicle. Having recognized the properties common to all such aircraft, such as the functioning of the rudder, ailerons, and throttle, the pilot primarily needs to learn what properties are unique to that particular aircraft. If the pilot already knows how to fly a given aircraft, it is far easier to learn how to fly a similar one.&#8221;&lt;/p&gt;


	&lt;p&gt;Booch, Grady, 2007. &lt;strong&gt;Object-Oriented Analysis and Design With Applications.&lt;/strong&gt; Third Edition. Addison-Wesley.&lt;/p&gt;
          </content>  </entry>
</feed>
