<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>A view from the hill - Programming</title>
    <link>http://hillview.1on.de/</link>
    <description>Blogging Holgers little world</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.3.1 - http://www.s9y.org/</generator>
    <pubDate>Fri, 20 Apr 2012 07:33:47 GMT</pubDate>

    <image>
        <url>http://hillview.1on.de/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: A view from the hill - Programming - Blogging Holgers little world</title>
        <link>http://hillview.1on.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>I'll never be anybody's hero now</title>
    <link>http://hillview.1on.de/archives/188-Ill-never-be-anybodys-hero-now.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/188-Ill-never-be-anybodys-hero-now.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=188</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=188</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    One aspect I think is important for a Scrum Master or Project Manager is to make sure that your team doesn&#039;t go on a trip to Vienna (if that term doesn&#039;t ring a bell, search for &quot;Tom DeMarco peopleware&quot;). Quite contrary to popular management belief, I think in general it&#039;s not okay if &quot;occasionally&quot; somebody on the team &quot;puts in some extra work&quot;. There is a reason why many agile methodologies insist on keeping a &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=793&amp;amp;entry_id=188&quot;  onmouseover=&quot;window.status=&#039;http://www.infoq.com/news/2008/05/sustainable-pace&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.infoq.com/news/2008/05/sustainable-pace&quot;&gt;sustainable pace&lt;/a&gt;. Besides all of the very good reasons for making sure your team members stay healthy (see this &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=791&amp;amp;entry_id=188&quot;  onmouseover=&quot;window.status=&#039;http://geon.github.com/Personal/2012/04/07/burnout/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://geon.github.com/Personal/2012/04/07/burnout/&quot;&gt;Burnout story&lt;/a&gt; as a negative example), there is also a management point to it: your understanding of what the team is capable of (in terms of results/effort, aka velocity) decreases substantially if you have to take &quot;heroic behaviour&quot; into account.  It&#039;s particular bad when you don&#039;t see the connection between reached goals and involved effort, i.e. when team members just move their card from &quot;working&quot; to &quot;done&quot; late in the evening without making clear that it involved five hours more than initially estimated. &lt;br /&gt;
&lt;br /&gt;
Heroic behaviour just can&#039;t be counted on, because nobody will be able to keep it up over a substantial amount of time (that&#039;s the very definition of not being substainable). It&#039;s highly understandable that project members after having committed to some goal can be tempted to go out of their way to reach it. What team members might miss is that &quot;heroic behaviour&quot; can only have an influence on the &quot;time&quot; aspect of the magic triangle of &quot;time, budget and quality&quot;. Extra effort is just that: effort. Hence, it comes with a cost, with the cost it just takes to reach the goal. I&#039;ve also seen that there is a misunderstanding of the term &quot;commitment&quot;. It&#039;s not an unconditional promise of &quot;I can do that task with the effort I think it takes&quot;, there is also the implicit condition of &quot;I understand correctly what the task involves and  there is no other external negative influence&quot; (e.g. the urgent bug that needs to be looked at, or the lack of sleep during three days of the week due to the kids being sick at home). &lt;br /&gt;
&lt;br /&gt;
Commitment to a particular goal might at times conflict with taking responsibility for the project as a whole. As a general rule of thumb it&#039;s nearly always much more important to think about the entire project / the big picture than about a small aspect of it. There is the exceptional situation that needs exceptional reaction and maybe exceptional effort. But it&#039;s important to treat it like an exceptional situation. And for these exceptional situations it&#039;s vital that they get treated like a mini project: they should have a clear purpose and have fixed start and end dates. Plus, they should come with a compensation. Scrum Masters and project managers alike should communicate clearly that exceptions are exceptions, not the rule. And team members should clearly communicate that it takes what it takes. When it comes to professional work, follow the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=792&amp;amp;entry_id=188&quot;  onmouseover=&quot;window.status=&#039;http://501manifesto.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://501manifesto.org/&quot;&gt;501 manifesto&lt;/a&gt; (in case you don&#039;t directly understand the &quot;501&quot; part like I did: it&#039;s not about jeans, but about leaving at 5:01pm).&lt;br /&gt;
&lt;br /&gt;
ObTitle: &lt;i&gt;Morrissey&lt;/i&gt;, from &quot;Ringleader of the tormentors&quot; 
    </content:encoded>

    <pubDate>Fri, 20 Apr 2012 09:00:26 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/188-guid.html</guid>
    <category>agile</category>
<category>project management</category>

</item>
<item>
    <title>New year meme</title>
    <link>http://hillview.1on.de/archives/186-New-year-meme.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/186-New-year-meme.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=186</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=186</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    Tarek Ziades repeated his &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=779&amp;amp;entry_id=186&quot;  onmouseover=&quot;window.status=&#039;https://tarekziade.wordpress.com/2011/12/20/new-years-python-meme-2/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;https://tarekziade.wordpress.com/2011/12/20/new-years-python-meme-2/&quot;&gt;Python new year meme&lt;/a&gt; in which he summarizes his accomplishments in the Python world this year and his considerations for the new year. As I stopped working as a Python developer some time ago, I will hence drop the Python restriction although I will keep the restriction on only looking at developer questions. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;1. What’s the coolest developer application, framework or library you have discovered in 2011?&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Mostly stuff I already new about but hadn&#039;t specifically the chance to use previously, so actually there was probably nothing which I would call &#039;cool&#039;. For one, I started using git this year. For other projects, I took the next step and started hosting my Mercurial repositories at &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=780&amp;amp;entry_id=186&quot;  onmouseover=&quot;window.status=&#039;http://bitbucket.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://bitbucket.org/&quot;&gt;bitbucket&lt;/a&gt;. For another, I used nose for unit testing my Python stuff.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;2. What new programming technique did you learn in 2011?&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Probably the most interesting stuff I learned this year was from me finally reading &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=781&amp;amp;entry_id=186&quot;  onmouseover=&quot;window.status=&#039;http://www.cliki.net/AMOP&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.cliki.net/AMOP&quot;&gt;AMOP (the Art of the Meta-Object Protocol)&lt;/a&gt;, thereby learning a lot about the meta object protocol in Common Lisp and how it&#039;s related to CLOS. However, I didn&#039;t really put it to use much, although in hindsight I recognized that I&#039;ve used stuff from it previously without understanding the complete picture. There was also a lot of &#039;enterprise technology&#039; I looked into this year but nothing could be directly be labeled a &#039;programming technique&#039;. Otherwise I think I mainly stuck to the techniques I&#039;m used to. &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;3. What’s the name of the open source project you contributed the most in 2011? What did you do?&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
My contributions to the free software world continue to be at a very low level (typically, I don&#039;t contribute anything of value besides small hints on the net, complaints and the occasional bug report), which I keep seeing as a personal weak spot. This year at least I managed to implement something for &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=782&amp;amp;entry_id=186&quot;  onmouseover=&quot;window.status=&#039;http://hillview.1on.de/archives/178-Lisp,-sql,-git-and-mercurial.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://hillview.1on.de/archives/178-Lisp,-sql,-git-and-mercurial.html&quot;&gt;CL-SQL&lt;/a&gt;. I also wrote two small utilities, mainly to scratch my own itch, which I still need to clean up a more before I could publicly present them.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;4. What was the development blog or website you read the most in 2011?&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
That&#039;s certainly &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=783&amp;amp;entry_id=186&quot; title=&quot;http://www.reddit.com/r/programming&quot;  onmouseover=&quot;window.status=&#039;http://www.reddit.com/r/programming&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;proggit&lt;/a&gt;, followed by &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=784&amp;amp;entry_id=186&quot;  onmouseover=&quot;window.status=&#039;http://www.infoq.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.infoq.com/&quot;&gt;InfoQ&lt;/a&gt;. I also follow &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=785&amp;amp;entry_id=186&quot;  onmouseover=&quot;window.status=&#039;http://planet.lisp.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://planet.lisp.org/&quot;&gt;Planet Lisp&lt;/a&gt; and Planet Python quite closely. I started again to listen to the podcasts by &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=786&amp;amp;entry_id=186&quot; title=&quot;http://www.heise.de/developer&quot;  onmouseover=&quot;window.status=&#039;http://www.heise.de/developer&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Heise developer&lt;/a&gt; and the software engineering radio, but I have to admit I&#039;m too easily distracted to really keep going.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;5. What are the three top things you want to learn in 2012?&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
I would like to continue to learn Clojure, finally writing some useful code in it. In particular, I would like to mess around with parallel computations, although there is a huge chance I&#039;ll apply it for small silly tools or web programming first. I would also like to work on some semantic web stuff, probably with RDFa. And maybe I&#039;ll take a look at programming with some of the more or less free tablet stuff, either WebOS or Maemo/Qt. I&#039;ll probably also continue to look into Java programming and common architectures on that platform, which is an enormous universe.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;6. What are the top software, app or lib you wish someone would write in 2012?&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
I would like to see the semantic web getting a little bit more traction, mainly by easy integration of stuff like RDFa into content management systems. And, like probably every year since 1999, I wish somebody would finally write an (open source) application/set of clients to finally solve the synchronisation problems between different computers/phones/tablets. Note: I&#039;ve given up on the wish that somebody writes an enterprise acceptable open source replacement for Lotus Notes or Outlook (and I&#039;m talking only about calender and mail, sigh). 
    </content:encoded>

    <pubDate>Wed, 28 Dec 2011 22:38:00 +0100</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/186-guid.html</guid>
    <category>cl-sql</category>
<category>programming</category>

</item>
<item>
    <title>Agile development -- what is the benefit for the business?</title>
    <link>http://hillview.1on.de/archives/184-Agile-development-what-is-the-benefit-for-the-business.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/184-Agile-development-what-is-the-benefit-for-the-business.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=184</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=184</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    In a recent meeting, a colleague of mine mentioned that we wanted to use agile development this time with that new project and that I would provide some insight as an &#039;agile development expert&#039; (not that this would be a term I would use). This in turn brought me some curious looks and a pretty general question during the discussion: what is the benefit of an agile development model from a business perspective anyway?&lt;br /&gt;
&lt;br /&gt;
If I remember correctly, my answer went in the direction that with an agile approach you can change your mind about what you really need/want to implement throughout the project, if you learn something &#039;new&#039; about what is really required. The second important aspect is that you get quicker feedback which allows for more influence in case things don&#039;t turn out right. After the meeting I started pondering the question a little, as I had the impression that my answer wasn&#039;t that convincing, so what you find below is a more detailed written elaboration of it.&lt;br /&gt;
&lt;br /&gt;
Basically, what &quot;you can change your mind throughout the project&quot; boils down to is that agile development gives you more options to make use of opportunities coming up along the way/throughout the time you need to implement the project. The most important idea here is that you don&#039;t make decisions &lt;u&gt;too&lt;/u&gt; early, because that limits your options. For an example, let&#039;s assume that one feature we specify is that we want to have a &#039;Facebook like&#039;-button on the order page. Now, if we&#039;re following the waterfall style &#039;implementation follows after specification has been completed&#039; development model, you would specify that and design the page with the button and at some time in the future, you hopefully get your Facebook button. But maybe during the hypothetical nine months from now in which development happens, what if Germany&#039;s privacy laws enforce new severe restrictions on the use of such buttons and, btw., Google+ is now the new hip site you have to support? You have to go through a (with larger features typically quite costly) change process, redo the specification, etc. This essentially makes the cost you had in writing the specification as well as for the design etc. a double problem: you didn&#039;t get out any ROI, obviously, but additionally time has passed while writing specs, doing design etc. in which you didn&#039;t really work on any results for the customer (lost opportunity: gather new clients with at least some new features). &lt;br /&gt;
&lt;br /&gt;
So, you would have been better off with having the idea that at some point throughout the project you want &#039;social media integration for marketing reasons&#039; and delaying what to do exactly until you&#039;re really there (from a priority point of view) where this is a feature that you want implemented -- i.e. you do the specification when your planning that feature to get implemented in the next development phase (which is typically two to four weeks with an agile development team). The idea is to take small, well defined steps that can be taken fast and starting out with the most important/valuable ones first, rather than to spend a lot of time on some &#039;complete specification&#039; which withers fast throughout the projects implementation time.&lt;br /&gt;
&lt;br /&gt;
The problematic point here is obviously, that it&#039;s pretty difficult to say when exactly is the right point in time to make a decision. In general, there is no &#039;right point&#039; -- also often called the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=772&amp;amp;entry_id=184&quot;  onmouseover=&quot;window.status=&#039;http://www.codinghorror.com/blog/2006/10/the-last-responsible-moment.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.codinghorror.com/blog/2006/10/the-last-responsible-moment.html&quot;&gt;last responsible moment&lt;/a&gt; after which some opportunity is lost (I think the phrase was coined by &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=773&amp;amp;entry_id=184&quot;  onmouseover=&quot;window.status=&#039;http://www.poppendieck.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.poppendieck.com/&quot;&gt;Mary and Tom Poppendieck&lt;/a&gt;, see the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=777&amp;amp;entry_id=184&quot;  onmouseover=&quot;window.status=&#039;http://www.leanessays.com/2003/08/concurrent-development.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;Concurrent development&quot;&gt;excerpt from &#039;Lean software development&#039;&lt;/a&gt;) -- but multiple points in time, depending on many aspects. Influencing aspects are things like business opportunities (e.g. a new feature nobody else has at that time) or reducing risks (projects risks) (cf. &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=775&amp;amp;entry_id=184&quot;  onmouseover=&quot;window.status=&#039;http://alistair.cockburn.us/Last+Responsible+Moment+reconsidered&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://alistair.cockburn.us/Last+Responsible+Moment+reconsidered&quot;&gt;Alistair Coburn reconsidering the least responsible moment&lt;/a&gt;).  The best answer I currently have seen when to make a decision is that it should be taken when you have &#039;enough knowledge&#039;, i.e. when you have carefully considered your options and evaluated them (cf. &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=776&amp;amp;entry_id=184&quot;  onmouseover=&quot;window.status=&#039;http://decision-coach.com/lean-and-real-options/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://decision-coach.com/lean-and-real-options/&quot;&gt;real options&lt;/a&gt;). Even thinking about options alone is typically a highly valuable undertaking in itself, because all to often people just assume that the &#039;obvious way&#039; is the best one. &lt;br /&gt;
&lt;br /&gt;
So, the general answer is probably along the way of: for the business side, agile development has the benefit that it provides more flexibility and more influence throughout the project phase while at the same time (possibly) generating real value/revenue more early. There is, of course, more to it that also has appeal from a business perspective, but that&#039;s probably the main point. Feel free to add different opionions. 
    </content:encoded>

    <pubDate>Mon, 24 Oct 2011 14:38:00 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/184-guid.html</guid>
    <category>agile</category>
<category>project management</category>

</item>
<item>
    <title>Report about the European Lisp Symposium 2011</title>
    <link>http://hillview.1on.de/archives/179-Report-about-the-European-Lisp-Symposium-2011.html</link>
            <category>Lisp</category>
    
    <comments>http://hillview.1on.de/archives/179-Report-about-the-European-Lisp-Symposium-2011.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=179</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=179</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    So, &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=749&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;http://www.european-lisp-symposium.org/editions/2011/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.european-lisp-symposium.org/editions/2011/&quot;&gt;ELS 2011&lt;/a&gt; is over which was the first conference I attended that was solely aimed at Lisp programmers. Overall I am quite happy with it although not all talks have been of the same quality. In particular I wasn&#039;t too excited about all three key notes, although all had interesting topics. The first one by Craig Zilles about best effort code optimization was about things intelligent compilers could do. Very interesting stuff for sure and I learned a lot about low-level soft- and hardware architectures but there was no apparent direct relation to Lisp. A similar problem troubled the talk about Scala: perhaps it was due to my late arrival (I got on the right subway but in the wrong direction, not for the first time) but the part I attended left me wondering why Scala is relevant on a Lisp conference. Marc Battayani&#039;s invited talk about his use of Common Lisp for programming FPGAs was nice, but first of all it was difficult to follow (not due to the content) and not many details were given about how the specialized Lisp embedded DSLs get converted to the FPGA specific code and what problems he had to overcome.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- s9ymdb:7 --&gt;&lt;img class=&quot;serendipity_image_right&quot; width=&quot;110&quot; height=&quot;83&quot; style=&quot;float: right; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://hillview.1on.de/uploads/hamburg-harbour.serendipityThumb.jpg&quot; alt=&quot;picture of Hamburg harbour&quot; /&gt;Now for some of the interesting regular talks: on Thursday, the report about porting &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=750&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;http://www.sbcl.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.sbcl.org/&quot;&gt;SBCL&lt;/a&gt; to the supercomputing Blue Gene/P was nice and raised an interesting question: what can/needs to be re-discovered from old Lisp dialects for parallel programming for Lisps when more and more parallel cpus are becoming available to programmers. An issue that came up in both the talk about the futures implementation for ACL2 and in Nicolas Neuss&#039; initial digression about his experiences in parallelizing &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=751&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;http://www.femlisp.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.femlisp.org/&quot;&gt;Femlisp&lt;/a&gt; was that garbage collection can get in the way of effective parallelization, up to the point where much of the expected speedup is lost. The motivation of  the talk about &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=752&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;https://secure.wikimedia.org/wikipedia/en/wiki/Actor_model&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;https://secure.wikimedia.org/wikipedia/en/wiki/Actor_model&quot;&gt;actors&lt;/a&gt; framework named &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=753&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;https://antoniogarrote.wordpress.com/2010/09/03/jobim-an-actors-library-for-clojure/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;https://antoniogarrote.wordpress.com/2010/09/03/jobim-an-actors-library-for-clojure/&quot;&gt;Jobim&lt;/a&gt; for &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=754&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;http://www.clojure.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.clojure.org/&quot;&gt;Clojure&lt;/a&gt; nicely fitted in with an immediate question that came to my mind when I saw how Clojure connects to Java: What do you do so that Java&#039;s semantics don&#039;t leak into your application code? They seem to have found a nice way to abstract away the underlying Java libraries in their framework. In the last session of the first day, the lightning talk session, two things were interesting: Ralf Möller talked about using user-defined method combinations as a more powerful approach than design patterns, showing how one might implement html specific print-object methods, and Didier Verna talked about user-extensible format directives which he wants to turn in as a &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=755&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;http://lambda-the-ultimate.org/node/300&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://lambda-the-ultimate.org/node/300&quot;&gt;CLRFI&lt;/a&gt;. Having done a lot of work in computational linguistics, the talk about &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=756&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;http://www.snltk.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.snltk.org/&quot;&gt;S-NLTK&lt;/a&gt;, the Scheme toolkit for natural language processing, was nice to see. Damir Cavar did a good job promoting the toolkit which has a similar aim like the Python &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=757&amp;amp;entry_id=179&quot;  onmouseover=&quot;window.status=&#039;http://www.nltk.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.nltk.org/&quot;&gt;NLTK&lt;/a&gt;, although I would have liked to learn more about the API and implementation issues. Finally, Alec Berryman by ITA gave a last minute presentation about things ITA learned about optimizing stuff for SBCL and about issues arising when adopting the old code to multi-threaded programming. Interestingly they didn&#039;t report about gc issues but that may be related to their extensive use of object caches of pre-allocated objects.&lt;br /&gt;
&lt;br /&gt;
The final panel discussion with James Knight, Christophe Rodes, James Anderson and Martin Simmons went back and forth about concurrency, distribution and efficiency vs. performance. The discussion took up several points from the talks, including gc and hardware issues. I took away from the discussion that unsurprisingly a lot of open questions need to be solved of which people are aware while at the same time there doesn&#039;t seem to be much momentum, which, given that the community isn&#039;t that big, isn&#039;t surprising either after all.&lt;br /&gt;
&lt;br /&gt;
Summing up I liked it a lot. For one, it was very nice to see people you only know via the net (while I haven&#039;t been active in the community in the last years, I was surprised to see people recognize my name). For another, I also think that the organizers made a good decision to select a main theme for the conference and an important one, too. It really set the main theme for the conference and the discussions, and hence nicely reached its goal. Generally speaking, the conference was nicely organized so thanks for a pleasant time in Hamburg. 
    </content:encoded>

    <pubDate>Mon, 04 Apr 2011 21:25:00 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/179-guid.html</guid>
    <category>lisp</category>

</item>
<item>
    <title>Lisp, sql, git and mercurial</title>
    <link>http://hillview.1on.de/archives/178-Lisp,-sql,-git-and-mercurial.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/178-Lisp,-sql,-git-and-mercurial.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=178</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=178</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    This has been a rather unpleasant month (don&#039;t ask, I won&#039;t tell) but right now I&#039;ll look forward toward its end because of two reasons: for one, I&#039;ll be in Hamburg for the European Lisp Symposium for the next two days; the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=746&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://www.european-lisp-symposium.org/content-programme-full.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.european-lisp-symposium.org/content-programme-full.html&quot;&gt;program for the ELS&lt;/a&gt; has also been published in between. I&#039;m really looking forward to an interesting set of talks. For another, some patches to &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=736&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://clsql.b9.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://clsql.b9.com/&quot;&gt;CL-SQL&lt;/a&gt; which add support for autoincrement behaviour for Postgresql, are probably going to be released soon. To clarify, &quot;autoincrement&quot; is a column constraint in MySQL (among others) that automatically increments the value of the column when a new row is inserted when no value for the autoincrement column is given (cf. &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=737&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html&quot;&gt;MySQL docs on AUTOINCREMENT&lt;/a&gt;), a behaviour that Postgresql supports with the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=738&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://wiki.postgresql.org/wiki/FAQ#How_do_I_create_a_serial.2Fauto-incrementing_field.3F&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://wiki.postgresql.org/wiki/FAQ#How_do_I_create_a_serial.2Fauto-incrementing_field.3F&quot;&gt;serial&lt;/a&gt; constraint (cf. this &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=747&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;https://secure.wikimedia.org/wikibooks/en/wiki/Converting_MySQL_to_PostgreSQL&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;https://secure.wikimedia.org/wikibooks/en/wiki/Converting_MySQL_to_PostgreSQL&quot;&gt;wikibook on converting between MySQL and Postgres&lt;/a&gt;). Actually, that has been my first substantial amount of Common Lisp programming in the last two years, which has been triggered by an upgrade of my Debian system. This upgrade implied that an old application of mine would now use CL-SQL version 5.0 which in turn broke the app: I had simply specified a db-type of &quot;serial&quot; previously, but the new CL-SQL code wouldn&#039;t recognize that it had to fetch the automatically generated value from the DB when inserting a new record. More details on the patches can be found on the CL-SQL mailing list.&lt;br /&gt;
&lt;br /&gt;
The developement of this addition was also the first time I had a real-world setup developing with git. In my own projects I use mercurial, so I was eager to learn a little bit more about the differences. It&#039;s funny that a recent opinonated article &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=744&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://jhw.dreamwidth.org/1868.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://jhw.dreamwidth.org/1868.html&quot;&gt;&quot;Why I like mercurial better than git&quot;&lt;/a&gt; more or less talks only about the one point that I found confusing: branch handling. For more background information, I suggest reading this article &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=745&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/&quot;&gt;&quot;A guide to branching in mercurial&quot;&lt;/a&gt;. Basically, in my current projects where I use mercurial, I&#039;m using the &quot;branching with clones&quot; approach Steve is describing there. When working on the patches for CL-SQL, I was working on the existing autoincrement branch but when I was through I wanted to port my patches to the master branch. When using mercurial with the described approach, selecting (pulling or pushing) my patches and only my patches to the master branch is dead easy: you just issue a pull/push command restricted to the &quot;right&quot; changesets. Doing this is even supported by Subversion these days via &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=748&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://svn.apache.org/repos/asf/subversion/trunk/notes/merge-tracking/requirements.html#cherry-picking&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://svn.apache.org/repos/asf/subversion/trunk/notes/merge-tracking/requirements.html#cherry-picking&quot;&gt;svn cherry picking&lt;/a&gt;. Looking at the docs for &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=743&amp;amp;entry_id=178&quot;  onmouseover=&quot;window.status=&#039;http://www.kernel.org/pub/software/scm/git/docs/git-pull.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.kernel.org/pub/software/scm/git/docs/git-pull.html&quot;&gt;git pull&lt;/a&gt;, fetch and merge, I wasn&#039;t able to figure out what the corresponding &quot;right&quot; incantation for git might look like, if there is one at all. As I didn&#039;t want to hose my &quot;working copy&quot; (sorry for the SVN term again), I resorted to git format-patch, git am resp., which worked fine. Please note that I&#039;m not suggesting that it&#039;s not possible with another approach, quite to the contrary I would be happy to learn about it. One thing that I found rather useful is git&#039;s stash command which let&#039;s you safely abandon your current work to fall back to the last commited version, in order to be able to work on something that popped up in between (typically a minor unrelated problem you encounter while working on a larger piece of changes). I understand that mercurials patch queues enable a similar functionality, but I haven&#039;t used them sofar. Another thing that I found very useful is git&#039;s very easy way to correct (or in git terminology &quot;amend&quot;) a commit by just issuing &quot;git commit -a&quot;. I also like the idea of the &quot;index&quot; or more exactly that you have to explictly &quot;add&quot; which changes you want to commit. A similar behaviour is possible with SVN &quot;changelist&quot; command, but the mere existance of a changelist is not automatically honoured by SVN&#039;s commit. 
    </content:encoded>

    <pubDate>Tue, 29 Mar 2011 21:25:00 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/178-guid.html</guid>
    <category>cl-sql</category>
<category>lisp</category>
<category>version control</category>

</item>
<item>
    <title>European Lisp Symposium 2011 in Hamburg</title>
    <link>http://hillview.1on.de/archives/177-European-Lisp-Symposium-2011-in-Hamburg.html</link>
            <category>Lisp</category>
    
    <comments>http://hillview.1on.de/archives/177-European-Lisp-Symposium-2011-in-Hamburg.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=177</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=177</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    &lt;a title=&quot;http://www.european-lisp-symposium.org/content-programme-full.html&quot; id=&quot;s9yisp6&quot;&gt;&lt;/a&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&quot;http://hillview.1on.de/exit.php?url_id=730&amp;amp;entry_id=177&quot;  onmouseover=&quot;window.status=&#039;http://hillview.1on.de/serendipity_admin_image_selector.php?serendipity[step]=showItem&amp;amp;amp;serendipity[image]=6&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; id=&quot;s9yisphref6&quot; onclick=&quot;javascript:this.href = this.href + &#039;&amp;amp;serendipity[from]=&#039; + self.location.href;&quot;&gt;&lt;!-- s9ymdb:6 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;110&quot; height=&quot;98&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://hillview.1on.de/uploads/lisplogo_flag2_128.serendipityThumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=731&amp;amp;entry_id=177&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Hamburg&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/Hamburg&quot;&gt;Hamburg&lt;/a&gt;, I&#039;ll see you soon -- for the 2011 edition of the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=732&amp;amp;entry_id=177&quot;  onmouseover=&quot;window.status=&#039;http://www.european-lisp-symposium.org/content-programme-full.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.european-lisp-symposium.org/content-programme-full.html&quot;&gt;European Lisp Symposium&lt;/a&gt;. I haven&#039;t done much Lisp programming in the last two years, but as I can combine visiting a good friend with a nice conference, I just couldn&#039;t resist. I&#039;m really looking forward to meet several people I&#039;ve had contact with over the net in reality. (And don&#039;t forget about that &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=733&amp;amp;entry_id=177&quot;  onmouseover=&quot;window.status=&#039;http://www.xkcd.org/859/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.xkcd.org/859/&quot;&gt;unresolved tension&lt;/a&gt;. 
    </content:encoded>

    <pubDate>Sun, 27 Feb 2011 17:13:00 +0100</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/177-guid.html</guid>
    <category>lisp</category>

</item>
<item>
    <title>Laziness for the win</title>
    <link>http://hillview.1on.de/archives/174-Laziness-for-the-win.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/174-Laziness-for-the-win.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=174</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=174</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    Loren Segal writes a blog discussing the question whether users of dynamically typed languages are just &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=719&amp;amp;entry_id=174&quot;  onmouseover=&quot;window.status=&#039;http://gnuu.org/2010/12/13/too-lazy-to-type/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://gnuu.org/2010/12/13/too-lazy-to-type/&quot;&gt;too lazy to type&lt;/a&gt;? The argument goes roughly like this: The dynamic is not in &quot;passing wildly arbitrary ever-changing types to methods&quot; and we&#039;re just (okay, not only just, but mainly) doing dynamic code generation and are too lazy to add type information. Regarding a particular, but not too relevant code example, Loren says:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;It’s easy to see that this code is executed immediately at load time. Although it’s possible for someone to generate a method at run-time (by run-time I mean much later after the initial .rb file was require‘d), it’s a fairly rare occurrence. What we’re really doing here is just avoiding to extra LoC involved in typing out those def’s each time. What we’re doing here really is just runtime code generation.&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
Yes, Loren, it&#039;s just runtime code generation, but calling it &#039;just&#039; is somewhat misssing the point. I mean, if runtime code generation is not dynamic, what is? Loren goes on to say that &lt;quote&gt;programs in dynamic languages with these runtime modification behaviours often stop modifying their behaviour after a certain amount of &quot;load time&quot;.&lt;/quote&gt; I agree, this is also what I would expect. But the entire point is that once again, &quot;dynamic&quot;  means that it is not necessary that you have to (statically) pre-determine at some fixed time (compile time or initial process launch time) which stable behaviour it should be. &lt;em&gt;Of course&lt;/em&gt;, after a certain amount of load time, it&#039;s likely that the behaviour of your program (or better said of the running process) becomes stable and all functionality needed is loaded. But a different process of the same program may use a different set of possible behaviour. Plus: you might be able to add new functionality to a running programm. Additionally, you don&#039;t necessarily have to provide all possible behaviours at start-up time, runtime code generation (or runtime code loading) allows you to add new behaviour later on. In some cases (Ruby and Lisp come to mind) it is even possible to alter existing behaviour. Now, if &quot;typical&quot; dynamic programs really don&#039;t do that routinely (as suggested by the studies Loren is citing) this says more about how often we (really don&#039;t) need such dynamic behaviour but it sure is dynamic. &lt;br /&gt;
&lt;br /&gt;
However, I must admit that I&#039;m a little surprised by the cited results of the studies. I&#039;ve seen systems that have the ability to change their behaviour at runtime one time too often. First, there are programs that embed some extension mechanism (be it embedded scripting languages, plugin mechanisms or other)  that are specifically crafted for users to tinker with the running system, which clearly is all runtime code generation. Second, a particular interesting aspect of web programming is that many templating engines have some kind of import/include statement that are typically used to build complex templates out of smaller ones. In combination with other features of template languages, specifically conditions, loops and even macros (cf. &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=720&amp;amp;entry_id=174&quot;  onmouseover=&quot;window.status=&#039;http://pydanny.blogspot.com/2010/12/stupid-template-languages.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://pydanny.blogspot.com/2010/12/stupid-template-languages.html&quot;&gt;stupid template languages&lt;/a&gt;, &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=721&amp;amp;entry_id=174&quot;  onmouseover=&quot;window.status=&#039;http://lucumr.pocoo.org/2010/12/5/not-so-stupid-template-languages/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://lucumr.pocoo.org/2010/12/5/not-so-stupid-template-languages/&quot;&gt;not so stupid template languages&lt;/a&gt;) this feature can be and is used to alter behaviour at runtime. So, obviously there is a need for dynamic behaviour, and people find ways to scratch their itch. Note that neither of my two examples require dynamic languages, so it&#039;s not a rebuttal of the studies or Lorens claims. However, thinking about it, I would expect that a lot of programs written in your todays typical dynamic language are &#039;scripts&#039;, which might be the reason why most people treat the idea of &#039;dynamic language&#039; as synonym to &#039;scripting language&#039; (it isn&#039;t -- Common Lisp, for instance, is surely a dynamic language, but hardly a scripting language). That such scripts don&#039;t require much dynamic change in runtime behaviour isn&#039;t too surprising, after all.&lt;br /&gt;
&lt;br /&gt;
Now ultimately I wouldn&#039;t really disagree with the impression that quite often one &quot;value&quot; of dynamic languages lies in reduced typing and that on the contrary some type related problems would be found more quickly in static typed languages. I would even go so far and say that wrt.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;I’d really love to see some research on case studies of how often arbitrary structural typing (that cannot be refactored into polymorphic relationships) is really used in dynamically typed languages. If anyone knows of any research/papers in this field, I’d love to hear about it.&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
it&#039;s highly likely that it&#039;s extremely rare to find &quot;arbitrary structural typing&quot;, if such a thing exists at all (ironically I would guess that using &#039;void *&#039; as a type specifier in C functions is where one comes closest to &quot;arbitrary&quot;). To me the very idea looks suspiciously like a strawmen for an argument that if there were &quot;no arbitrary structural typing&quot;, we could/should go for static typing anyway, as we could &quot;reduce&quot; the solutions we implement with dynamic typed languages to solutions in statically typed languages (an argument coming close to the &#039;turing complete&#039; hammer). This looks like a distinction between &#039;we can&#039;t use type information at all&#039; and &#039;we need to use type information at each and every place&#039; and I don&#039;t believe that the world is only black or white. &lt;br /&gt;
&lt;br /&gt;
The point I want to make is this: Let&#039;s assume it may be very much the case that in all places where dynamic typing is used you can find a static typed solution, too. Then the benefit is of course not that &quot;you&#039;re doing something that&#039;s not possible in statically typed languages&quot; (which might still be true under the interpretation that the statically typed solution probably looks rather different). But there might be plenty of room for benefit in that coming up with a solution in the dynamic language might reduce cost (e.g. less development time, greater flexibility for extension later on). The arguments by proponents of static languages that the cost reduction lies in other aspects (e.g. earlier detection of errors) are surely worth a comparison. If studies for this question of associated costs beyond anecdotical tales exist, I would be interesting in seeing them.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Update&lt;/i&gt;: &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=726&amp;amp;entry_id=174&quot;  onmouseover=&quot;window.status=&#039;http://thecleancoder.blogspot.com/2010/12/too-lazy-to.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://thecleancoder.blogspot.com/2010/12/too-lazy-to.html&quot;&gt;Uncle Bob raises another important point&lt;/a&gt; that with introducing static type information we&#039;ll get closer coupling: &lt;blockquote&gt;But in the end, we like dynamic language not because we are too lazy to &quot;Type&quot;. We like dynamic languages because we are tired of untangling couplings.&lt;/blockquote&gt; 
    </content:encoded>

    <pubDate>Tue, 14 Dec 2010 19:10:00 +0100</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/174-guid.html</guid>
    <category>lisp</category>
<category>programming</category>
<category>python</category>
<category>ruby</category>

</item>
<item>
    <title>Coders at work</title>
    <link>http://hillview.1on.de/archives/169-Coders-at-work.html</link>
            <category>Literature</category>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/169-Coders-at-work.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=169</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=169</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    For the holidays I finally bought Peter Seibels &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=696&amp;amp;entry_id=169&quot;  onmouseover=&quot;window.status=&#039;http://www.codersatwork.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.codersatwork.com/&quot;&gt;Coders at work&lt;/a&gt;, which is a very unusable book about programming: it consists solely of interviews with pretty well known programmers or &quot;coders&quot;. It&#039;s an interesting constellation: On the one hand, Peter Seibel is well known in the Common Lisp community for his book &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=697&amp;amp;entry_id=169&quot;  onmouseover=&quot;window.status=&#039;http://www.gigamonkeys.com/book/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.gigamonkeys.com/book/&quot;&gt;Practical Common Lisp&lt;/a&gt; which gives a modern view on Lisp: not only is it an introduction to the language but also to several libraries and the general setting of modern lisp programming. On the other (fifteen) hands, there are people like Jamie Zawinski (XEmacs, Netscape), Don Knuth (TeX, &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=698&amp;amp;entry_id=169&quot;  onmouseover=&quot;window.status=&#039;http://www-cs-faculty.stanford.edu/~uno/taocp.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www-cs-faculty.stanford.edu/~uno/taocp.html&quot;&gt;Art of Computer Programming&lt;/a&gt;), Guy Steele (Lisp, Scheme, Java), Peter Norvig (&lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=699&amp;amp;entry_id=169&quot;  onmouseover=&quot;window.status=&#039;http://norvig.com/paip.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://norvig.com/paip.html&quot;&gt;PAIP&lt;/a&gt;, Google), Brendan Eich (Javascript) and Ken Thompson (Unix)  -- just to note the ones that are probably the most well known.&lt;br /&gt;
&lt;br /&gt;
I&#039;ve had resisted the urge to buy the book because I&#039;ve always felt that programming is a craft that ultimately forces you to make your own experiences. I mean, you can read all the books you like but ultimately you have to make your own hands dirty to really get knowledge about the issues involved. So, what could I learn from other peoples experiences? On the other hand, as a lightweight (in terms of reading attention) holiday book it seemed about right, so I finally gave in.&lt;br /&gt;
&lt;br /&gt;
Well, the book turned out to be a real page turner for me. It&#039;s a fascinating read because of the re-occuring topics Seibel is addressing and the various opinions he got. He addresses topics you would expect like preferred tools (e.g. editor), worst bugs, debugging techniques, asssertions and verification, literate programming (which suprises me a little), design approaches and team work, but of course the main focus is the personal experiences and how they wound up with whatever made these guys known. One thing that I liked is that Seibel has a way to ask good follow-up questions to the responses he gets, without ever letting his own experiences or opinions getting in the way, which I can imagine has probably made for pleasant interview situations (at least I take away that impression). I wouldn&#039;t have imagined beforehand that I would find the different stories how the guys (and one woman) got into coding so interesting. There are very few people in this book whose experience doesn&#039;t go back to teletype and time sharing systems. Of course, as a result these stories tend to be similar, but the details differ enough that&#039;s it doesn&#039;t get too boring. Starting with computers in the early 80s, I don&#039;t have any experiences with such systems and which I frankly don&#039;t miss at all after reading more about it. But just to get to this conclusion is interesting: the constant comparison with your own experiences and opinions you can&#039;t help but make while reading this book alone is worth buying and reading it.&lt;br /&gt;
&lt;br /&gt;
Over all, it&#039;s hard to say which interviews I found the most interesting one, essentially each has some unique point or other. That being said, the interviews with Joe Armstrong and Guy Steele made a lot of impresssion on me, whereas I&#039;m a little disappointed by the one with Peter Norvig (though he had the funniest quotes), but I can&#039;t really nail down why. I didn&#039;t particular like the interview with Brad Fitzpatrick, it didn&#039;t seem  to contain as much information as the others. And Joshua Bloch seemed to hype Java all the time which I found not very convincing -- the idea that todays larger context for programming contains quite a few different languages and approaches seems to elude him. &lt;br /&gt;
&lt;br /&gt;
There are some points I took away from this book: For one, most of the interviewed people seem to be much more concerned with data types than I am, even the ones who have done extensiv work on dynamically or weakly typed languages. I guess I should really take a closer look at that topic and, to make it more concrete, play around with e.g. Haskell. Another point is that concurrency or parallel programming is a topic that (IIRC) all of the interviewees have seen as being responsible for the worst bugs they encountered and as a result are interested in newer approaches like &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=700&amp;amp;entry_id=169&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Software_transactional_memory&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/Software_transactional_memory&quot;&gt;STM&lt;/a&gt;. So, it might be worthwhile to look closer into such developments, for example by playing with &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=701&amp;amp;entry_id=169&quot;  onmouseover=&quot;window.status=&#039;http://clojure.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt;, Erlang. or the transaction monad, if I&#039;ll ever really play around with Haskell. A third point is that I realized that I&#039;m not keeping up with academic research in CS and, not having TAoCP, might never have been up to date at all. I&#039;m following a few online references like &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=702&amp;amp;entry_id=169&quot;  onmouseover=&quot;window.status=&#039;http://lambda-the-ultimate.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://lambda-the-ultimate.org/&quot;&gt;LtU&lt;/a&gt;, but not closely and it&#039;s pretty rare these days that I look deeply into some research paper. This is something else I should probably change, if time permits.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Wed, 22 Sep 2010 20:38:00 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/169-guid.html</guid>
    <category>book</category>
<category>programming</category>
<category>review</category>

</item>
<item>
    <title>There's nothing left to see</title>
    <link>http://hillview.1on.de/archives/157-Theres-nothing-left-to-see.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/157-Theres-nothing-left-to-see.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=157</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=157</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    Via &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=623&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://lambda-the-ultimate.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://lambda-the-ultimate.org/&quot;&gt;Lambda the Ultimate&lt;/a&gt; I came across an interesting article &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=624&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://lambda-the-ultimate.org/node/3668&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://lambda-the-ultimate.org/node/3668&quot;&gt;On data abstraction, revisited&lt;/a&gt; by William Cook, written for OOPSLA&#039;09. It carefully dissects abstract data types from objects. All theoretical considerations aside that distinguish ADTs and objects, there is one common characteristics given by Cook: you can&#039;t inspect the concrete representation of the data you&#039;re abstracting. This is in itself interesting and reminded me of two rather practical things. &lt;br /&gt;
&lt;br /&gt;
First of all, I was reminded of a section in Bob Martins &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=625&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882&quot;&gt;Clean code development&lt;/a&gt; which discussed the idea that you should on the one hand follow the rule &quot;Tell, don&#039;t ask&quot; and on the other hand have data access objects that don&#039;t have much, if any behaviour besides providing data. This is obviously directly related to Cooks article: if you want data abstraction, you shouldn&#039;t really provide any way to allow other objects/methods to access the internal representation. This somewhat also forbids getters as this is likely to lead to leaky abstraction, since more often than not programmers simply return the value of some data field, directly exposing the representation chosen. Now, please note that this does not necessarily follow from Cooks article, as it is possible to design getters in such a way that you can return whatever you want for a getter method, i.e., you can return a desired return type or an object satisfying a particular interface. For me, the relevant point here is the way of thinking about the kind of object at hand: do I want some behaviour (aka Cooks objects) or do I want a data sink. In the former case, and in line with what is suggested in the clean code book, it is arguably the best way to tell the object to do what is necessary rather than to inspect (get) the data it holds and do it externally in some other object/method. But even in the latter case, I think it is important to give great attention to hiding the internal representation from external access and to only allow very focussed access to the data itself. It could and has been argued that restricting the access to the stored data via getter methods is tedious (see e.g. the discussion in &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=626&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://tomayko.com/writings/getters-setters-fuxors&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://tomayko.com/writings/getters-setters-fuxors&quot;&gt;getters/setters/fuxors&lt;/a&gt;) and that allowing public access to members is allright, but looking at the issue from a data abstraction point of view it simply boils down to the question whether you want or need data abstraction or not.&lt;br /&gt;
&lt;br /&gt;
Second, I&#039;ve recently seen these two postings on the merits of the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=627&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://pypi.python.org/pypi/zope.component&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://pypi.python.org/pypi/zope.component&quot;&gt;Zope Component Architecture&lt;/a&gt;: &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=628&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://mockit.blogspot.com/2009/11/emperors-new-clothes.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://mockit.blogspot.com/2009/11/emperors-new-clothes.html&quot;&gt;The emperors new clothes&lt;/a&gt; and the reply &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=629&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://faassen.n--tree.net/blog/view/weblog/2009/11/06/0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://faassen.n--tree.net/blog/view/weblog/2009/11/06/0&quot;&gt;The success of the ZCA&lt;/a&gt;. Malthe asks why one should use the ZCA to override the use of a particular implementation with another instead of using some kind of reloading (or rather says that the latter is the preferrable approach). Relating this to Cooks article, Malthe could be paraphrased roughly as: we have ADTs all over the place and we only should allow only one implementation per ADT (this is what the type system would guarantee in other systems). If you want another implementation (of some interface, as Cook shows for his objects), you should reload the object defintion with the one you want. The use of the ZCA, however, is directly related to the very idea of object oriented programming in the way Cook defines it: you only have interfaces that are the relevant defining characteristics of objects (values) and hence, the use of the ZCA is &lt;b&gt;the&lt;/b&gt; way to deal with multiple implentations in Zope (or Python). For me, all I can say is that I&#039;m happy that the ZCA and hence the ability to easily intermingle multiple implementations is there (then again, with me reading computer science theoretic articles I&#039;m arguably not of the angry web designer type whose benefit Malthe is arguing for).&lt;br /&gt;
&lt;br /&gt;
There is another, more puzzling aspect of the article to me. After some considerations, I have to conclude that of all OO languages I happen to know, it&#039;s really only Java that seems to be object oriented in Cooks view of the world. This is because in Java, you can define a method to return objects satisfying an interface. In addition, in dynamically typed languages like Python, Ruby, or CLOS, you could try to come away with &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=630&amp;amp;entry_id=157&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Duck_typing&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/Duck_typing&quot;&gt;duck typing&lt;/a&gt;, but it&#039;s arguably only Python which tries to take it to the heart (for instance in CLOS, most values you&#039;re gonna deal with are non-CLOS values and you even have an ETYPECASE statement, which is a switch-statement on type distinction). Funny enough, Cook finishes his Smalltalk analysis with the statement that &quot;one conclusion you could draw from this analysis is that the untyped lambda calculus was the first object-oriented language&quot;. But besides the point how some language is &quot;more OO&quot; than another, there is also to the point that in order to program truly object-oriented, you shouldn&#039;t (and in Cooks world really can&#039;t) rely on type checks, because the whole point of using objects as data abstraction is to rely on behaviour.&lt;br /&gt;
&lt;br /&gt;
ObTitle: &lt;i&gt;Dial M for Murder&lt;/i&gt;, &quot;Fiction of her dreams&quot; 
    </content:encoded>

    <pubDate>Mon, 09 Nov 2009 09:28:12 +0100</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/157-guid.html</guid>
    <category>clean code development</category>
<category>oop</category>
<category>python</category>
<category>zope</category>

</item>
<item>
    <title>Magic theatre not for everybody</title>
    <link>http://hillview.1on.de/archives/154-Magic-theatre-not-for-everybody.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/154-Magic-theatre-not-for-everybody.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=154</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=154</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    If you just stumbled over this blog entry searching for what the heck all that buzzing about agile methods amounts to, I may have unfortunate news for you: An agile approach to development might for a lot of people all over the world, but may be not  for &lt;strong&gt;you&lt;/strong&gt;. For starters, take a look at the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=614&amp;amp;entry_id=154&quot;  onmouseover=&quot;window.status=&#039;http://agilemanifesto.org/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://agilemanifesto.org/&quot;&gt;agile manifesto&lt;/a&gt; and its &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=615&amp;amp;entry_id=154&quot;  onmouseover=&quot;window.status=&#039;http://agilemanifesto.org/principles.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://agilemanifesto.org/principles.html&quot;&gt;principles&lt;/a&gt;. These have quite a lot of implications, directly translating into presuppositions about you, if you wanted to participate in an agile development project.&lt;br /&gt;
&lt;br /&gt;
Now, perhaps you&#039;re the well communicating, team oriented developer type who happens to work in a surrounding which you respect and general feel well motivated. But real life experience with your typical geek or ex-geek-turned-professional-developer suggests that having a hard time with direct communication, face-to-face, happening very often with those pesky guys and girls you don&#039;t really like is a more likely scenario (&quot;Eeek, those business and marketing people&quot; anybody?). Now, you might say, baah, I know some communication is a necessary evil of professional software development, but maybe I can get away with my old habits of trading documents (specs, bug reports, etc.) against direct communication, since that is the trusted old way and what do you mean by face-to-face communication being more effective? Everybody hates those horrible meetings eating up all your time, right?&lt;br /&gt;
&lt;br /&gt;
The point is that if you&#039;re wanting to go agile you should better soon adapt your view or else you won&#039;t see any of the promised benefits of all of those agile processes. Agile development is &lt;strong&gt;not&lt;/strong&gt; &lt;em&gt;only&lt;/em&gt; about using test driven design, timeboxing, iterations and releasing often. More than anything else, agility is about how people effectively interact with each other as quickly and direct as possible in order to come to solutions. To me, this basically boils down mainly to three issues: adaptability to (changing) situations, an open mind toward communication and taking responsibility for the project at hand.&lt;br /&gt;
&lt;br /&gt;
Being lazy, sticking bone-headed to &quot;trusted paths&quot;, not seeking confrontation when it&#039;s needed, avoiding communication because of being too busy &quot;doing&quot; is the anti-pattern to agility. You could keep a product and sprint backlog, present new features every other week to your customer and even use continuous integration and still would be muddling in pseudo agile, doomed to fail water. What I would suggest is that you should revisit the agile manifesto and think about what those principles might imply for you and your current behaviour. Let&#039;s try an example: If you find that you might end up pointing fingers at your customer (or product owner to use the terminology from Scrum) because he won&#039;t behave as demanded in the agile manifesto, you should reconsider if that fits in with what the agile manifesto demands of you: you wouldn&#039;t do the project any good. You would build up frontiers where there should be a single team including the target of your pointed finger. This is not to say that you shouldn&#039;t point out the defect, no communication about problems is another all too familiar reason for frustration and lack of commitment. What is necessary is direct communication and finding a way that works for all people involved.&lt;br /&gt;
&lt;br /&gt;
Let me sum up this posting: if you&#039;re interested in agile approaches to software development, that&#039;s fine. If you don&#039;t feel comfortable about what this might imply for you, that&#039;s fine too. But it might also tell you that agile development approaches might not work for you.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Update:&lt;/i&gt; Irionically, I stumbled via &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=616&amp;amp;entry_id=154&quot;  onmouseover=&quot;window.status=&#039;http://www.infoq.com/news/2009/10/agiles-one-essential-ingredient&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.infoq.com/news/2009/10/agiles-one-essential-ingredient&quot;&gt;Infoq&lt;/a&gt; about &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=618&amp;amp;entry_id=154&quot;  onmouseover=&quot;window.status=&#039;http://blog.criticalresults.com/2009/10/23/essential-humility/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://ow.ly/wgac&quot;&gt;the one essential agile ingrediment&lt;/a&gt; which says all about it much nicer than I ever could have done, only that Mark Schumann shows the confidence that agile works for the most part whereas I hold the more pessimistic view that it&#039;s not going to work for some, but for exactly the same reasons.&lt;br /&gt;
&lt;br /&gt;
ObTitle: Hermann Hesse, &quot;Steppenwolf&quot;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Thu, 22 Oct 2009 18:38:00 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/154-guid.html</guid>
    <category>agile</category>
<category>project management</category>

</item>
<item>
    <title>Version control and testing</title>
    <link>http://hillview.1on.de/archives/149-Version-control-and-testing.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/149-Version-control-and-testing.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=149</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=149</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
     &lt;img src=&quot;http://clean-code-developer.de/attachment/wiki/CcdStempel/dotnetpro%20ccd%20stempel2%20almost%20half%20size%20banner.gif?format=raw&quot; align=&quot;right&quot; alt=&quot;clean code development&quot; /&gt;What have version control and testing to do with each other? Well, first of all, both are common virtues in the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=594&amp;amp;entry_id=149&quot;  onmouseover=&quot;window.status=&#039;http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/&quot;&gt;clean code&lt;/a&gt; community. What you&#039;ll find is that both virtues are important on their own ground: version control provides a safety guard in that you can roll back to prior versions if you accidently introduce problems in your code. Testing (automated unit tests) provides a safety guard, too, because you can do regression testing when you work with your code. These are both fine goals but seemingly have little to do with each other.&lt;br /&gt;
&lt;br /&gt;
But in reality they do. For sake of argument, let&#039;s take a step back and assume that you have to work in an environment of several developers where neither of these things exists. What will you likely see? What we all have seen several years ago. Commented out code blocks, redundant and often misleading or outdated comments, timestamps with comments cluttered all over the code. And frightened developers that feared each minor change because of the miriad of subtle side effects it might have, let alone major changes to core components. It&#039;s an environment in which refactorings as welll as extensions are very hard and expensive, which results in frightened overworked developers and frustrated managers.&lt;br /&gt;
&lt;br /&gt;
So, what happens when you introduce only one of those virtues? Say, we introduce version control. Now, every change gets documented, except that documenting every change requires, from the developers point of view, documentation at the wrong point. They can&#039;t see the documented changes and the reason for these changes in the source, they see it only in the version control system -- iff they add a change message with every change at all. Much more likely is that you will see commit messages such as &quot;.&quot; or &quot;bug fix&quot;, and the same old mess of timestamps, outdated comments and commented out code as before. Why is that? Because your developers are now not as frightened as they used to be (because they can now rely on the version control system to fall back to older versions), but they still have the same need to understand and document the code. And the commit log is both &quot;too far away&quot; from the code and &quot;out of it&#039;s purpose&quot; for this task: the commit log shouldn&#039;t document what the code is supposed to do, only when something was implemented to behave in a particular way.&lt;br /&gt;
&lt;br /&gt;
This is where a development (unit) test suite comes into the picture: you document every required behaviour in tests. With every change to the code, you also update the test. As a developer, you can now look into your test suite to see what the code is supposed to do. Now developers will likely become much more confident with their changes, because they can run the tests and see what happens (hopefully next to immediately) without requiring time- and resource-consuming manual tests. &lt;br /&gt;
&lt;br /&gt;
But what about documenting the changes to the code? Well, you should simply document any changes in the commit message of your version control system, because it&#039;s now no longer necessary to keep the entire version history in mind to understand what the current code state is supposed to do. You have the tests that tell you what the code should do.  The commit log now only serves the purpose of documenting what has changed over time and is no longer required to understand what the code should do. So you don&#039;t have to keep the clutter in your code, resulting in much cleaner source code files.&lt;br /&gt;
&lt;br /&gt;
Summary: Taken together, the whole of version control and testing adds up to more than a simple addition of their own values. 
    </content:encoded>

    <pubDate>Fri, 24 Jul 2009 10:30:05 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/149-guid.html</guid>
    <category>clean code development</category>
<category>tdd</category>
<category>version control</category>

</item>
<item>
    <title>I guess I'll hang out my tears to dry</title>
    <link>http://hillview.1on.de/archives/145-I-guess-Ill-hang-out-my-tears-to-dry.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/145-I-guess-Ill-hang-out-my-tears-to-dry.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=145</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=145</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    There seems to be a &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=583&amp;amp;entry_id=145&quot;  onmouseover=&quot;window.status=&#039;http://gilesbowkett.blogspot.com/2009/05/what-killed-smalltalk-my-balls.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://gilesbowkett.blogspot.com/2009/05/what-killed-smalltalk-my-balls.html&quot;&gt;roaring&lt;/a&gt; &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=584&amp;amp;entry_id=145&quot;  onmouseover=&quot;window.status=&#039;http://pab-data.blogspot.com/2009/05/what-killed-smalltalk-sometimes-balls.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://pab-data.blogspot.com/2009/05/what-killed-smalltalk-sometimes-balls.html&quot;&gt;discussion&lt;/a&gt; &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=585&amp;amp;entry_id=145&quot;  onmouseover=&quot;window.status=&#039;http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;amp;printTitle=Smalltalk:_Our_Death_has_been_Exaggerated&amp;amp;entry=3419278263&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.cincomsmalltalk.com/blog/blogView?showComments=true&amp;printTitle=Smalltalk:_Our_Death_has_been_Exaggerated&amp;entry=3419278263&quot;&gt;about&lt;/a&gt; a &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=591&amp;amp;entry_id=145&quot;  onmouseover=&quot;window.status=&#039;http://railsconf.blip.tv/file/2089545/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://railsconf.blip.tv/file/2089545/&quot;&gt;talk by Robert &quot;Uncle Bob&quot; Martin&lt;/a&gt; at this years RailsConf, which mainly seems to be concerned with the question (raised by a quote appointed to Ward Cunningham) whether languages such as Smalltalk make it too easy to create a mess. Languages such as C++ would penalize the mess at least by longer compile times. &lt;br /&gt;
&lt;br /&gt;
As Giles points out that&#039;s an old argument, which I too have heard too often in the past about dynamic languages, regardless whether we&#039;re talking Smalltalk, Ruby, Lisp, Python or Perl. And the anti-dote was always the current idiot language of the date, i.e. Visual Basic at its high time, Java or C# (for those who considered C or C++ to be too dangerous). Please note that I&#039;m not at all saying that users of those languages are idiots, but those languages are particularly claimed to be usable by idiots, too. This approach to languages or to their classification does a great job of misrepresenting programmers regardless of the language of their choice. It makes the bold claim that there are programmers that are idiots and that it&#039;s possible to design a language that even those idiots can do their jobs. And the exaggeration is that its only good business sense to enforce the use of those languages for all development projects, because, as we all know, there are more idiots than intelligent programmers out there, right?&lt;br /&gt;
&lt;br /&gt;
The only problem with this claim is that human stupidity is probably the only thing larger than the universe, if you make something idiot proof, nature will quickly make a better idiot. To put it a little less cynical, to err is human. And there is value in people making mistakes. As for instance, &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=587&amp;amp;entry_id=145&quot; title=&quot;http://de.wikipedia.org/wiki/Tom_DeMarco&quot;  onmouseover=&quot;window.status=&#039;http://de.wikipedia.org/wiki/Tom_DeMarco&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Tom DeMarco&lt;/a&gt; claims in his book &quot;Slack&quot; it&#039;s a particular good way to learn. Bob Martin tries to sell excessive testing (which isn&#039;t particular surprising, giving his &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=588&amp;amp;entry_id=145&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Robert_Cecil_Martin&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/Robert_Cecil_Martin&quot;&gt;background&lt;/a&gt;) as one safety guard to which James Robertson responds that this is not always necessary:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Yes, tests are useful. But, the debugger is not something to be feared. Rather, it&#039;s a great tool to be used in order to have the computer do all the memory work for you. I can get a lot more done by working with decent tools like the Smalltalk debugger than I can by assuming the doc is good and writing tests that just help me a whole lot less than you might think. &lt;/blockquote&gt; &lt;br /&gt;
&lt;br /&gt;
I can relate to this quote, being a fan of &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=589&amp;amp;entry_id=145&quot;  onmouseover=&quot;window.status=&#039;http://hillview.bugwriter.net/archives/99-Interactive-development-gets-more-popular.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://hillview.bugwriter.net/archives/99-Interactive-development-gets-more-popular.html&quot;&gt;interactive development&lt;/a&gt; that languages like Lisp or Smalltalk made popular. But I think James is missing the point: tests are not only helpful during development. Sure, using an interactive approach helps getting the code run but does it help to come up with a clean design? Looking back at some code, I can assure you it doesn&#039;t, quite to the contrary it&#039;s a way to get a working solution &lt;emph&gt;quickly&lt;/emph&gt;, not &lt;emph&gt;cleanly&lt;/emph&gt;. This doesn&#039;t make the debugger or the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=590&amp;amp;entry_id=145&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/REPL&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/REPL&quot;&gt;REPL&lt;/a&gt; less valuable: using it you can quickly establish your tests, debug your tests, whatever. This is exactly where the value of dynamic languages shines and those &quot;silver-bullet&quot; idiot languages are still behind, regardless of their shiny  IDEs.&lt;br /&gt;
&lt;br /&gt;
But the real point summing up the discussion so far is the old Frederick Brooks quote: There is no silver bullet. It&#039;s good to be careful and to use the tools at your hands to help you avoid the big mistakes. As Paul Graham puts it for OOP: &quot;For programs that would have ended up as spaghetti anyway, the object-oriented model is good: they will at least be structured spaghetti.&quot; But in the end you have to learn how to avoid the mess in the first place and no language and no tool can do that for you.&lt;br /&gt;
&lt;br /&gt;
ObTitle: &lt;i&gt;Dexter Gordon&lt;/i&gt;, &quot;Ballads&quot; 
    </content:encoded>

    <pubDate>Mon, 11 May 2009 08:55:33 +0200</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/145-guid.html</guid>
    <category>lisp</category>
<category>perl</category>
<category>python</category>
<category>ruby</category>
<category>tdd</category>

</item>
<item>
    <title>Testing and terminology confusion </title>
    <link>http://hillview.1on.de/archives/133-Testing-and-terminology-confusion.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/133-Testing-and-terminology-confusion.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=133</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=133</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    I may be rather late to the game, but over the last one and a half years, I&#039;ve become quite addicted to writing tests during my development tasks. I&#039;ve had wanted to dig into test-driven development for quite some time, but it was the seamless integration of &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=529&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html&quot;&gt;Test::Unit&lt;/a&gt;, Ruby&#039;s unit testing module, in Eclipse that got me going initially. I then did some unit testing with Common Lisp packages and am currently heavily using &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=530&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://pyunit.sourceforge.net/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://pyunit.sourceforge.net/&quot;&gt;pyunit&lt;/a&gt; and &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=531&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://docs.python.org/library/doctest.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://docs.python.org/library/doctest.html&quot;&gt;python doctests&lt;/a&gt; (mostly in the context of &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=532&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://pypi.python.org/pypi/zope.testing&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://pypi.python.org/pypi/zope.testing&quot;&gt;zope testing&lt;/a&gt;).  Writing tests has become my second development nature: It gives you that warm fuzzy feeling that you have that little safety net while modifying code. &lt;br /&gt;
&lt;br /&gt;
However, there are times when terminology comes along and gives you a headache. A terminology I&#039;ve learned about during the last year is the difference between unit testing, integration tests and functional tests (for an overview see &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=533&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Software_testing&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/Software_testing&quot;&gt;wikipedia on software testing&lt;/a&gt;). But as you can see for instance in this &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=534&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://weblog.jamisbuck.org/2006/3/9/integration-testing-in-rails-1-1&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://weblog.jamisbuck.org/2006/3/9/integration-testing-in-rails-1-1&quot;&gt;article on integration tests in Rails&lt;/a&gt;, it&#039;s not always easy to agree on what means what -- Jamis and/or the Rails community seem to have the integration/functional distinction entirely backwards from what, for instance, the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=535&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://wiki.zope.org/zope2/Testing&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://wiki.zope.org/zope2/Testing&quot;&gt;Zope community (on testing)&lt;/a&gt; thinks. &lt;br /&gt;
&lt;br /&gt;
Now, one might argue that terminology doesn&#039;t matter much given that you do write tests at all, but it&#039;s not so easy. For instance, if your &quot;unit test&quot; of a given class requires  another class, is that still unit testing or is it integration testing?  Does it even make sense to talk about unit-testing a class? A class on its own isn&#039;t that interesting after all, it&#039;s its integration and interoperation with collaborateurs were the semantics of a class and its methods become interesting. Hence, shouldn&#039;t you rather test a specific &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=536&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Behavior_Driven_Development&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/Behavior_Driven_Development&quot;&gt;behaviour&lt;/a&gt;, which probably involves those other classes? And what now, if your code only makes sense when run on top of a specific framework (Zope, Rails, you name it)? Michael Feathers argues convincingly in his &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=550&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://www.artima.com/weblogs/viewpost.jsp?thread=126923&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.artima.com/weblogs/viewpost.jsp?thread=126923&quot;&gt;set of unit testing rules&lt;/a&gt; that any such tests are probably something else. &lt;br /&gt;
&lt;br /&gt;
Ultimately these questions directly pertain to two aspects: code granularity and code dependencies -- and remember, test code is code after all. These are directly related, of course: if your code is very fine-grained, it&#039;s much more likely that it will also be much more entangled (although the dependency might be abstracted with the help of interfaces or some such, you still have the dependency as such). And as a consequence, your test code will have to mimick these dependencies. On the contrary, if your code blocks are more coarse-grained (i.e. cover a greater aspect of funcionality), you might have less (inter-)dependencies, but you won&#039;t be able to test functionality on a more fine-grained level.  As Martin Fowlers excellent article &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=544&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://martinfowler.com/articles/mocksArentStubs.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://martinfowler.com/articles/mocksArentStubs.html&quot;&gt;Mocks aren&#039;t stubs&lt;/a&gt; discusses in detail, one way to loosen these connections between code and tests is to use &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=539&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://en.wikipedia.org/wiki/Mock_object&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://en.wikipedia.org/wiki/Mock_object&quot;&gt;mock objects&lt;/a&gt; or stubs. Fowlers article also made clear to me that I&#039;ve used the term &quot;mock object&quot; wrongly in my post on &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=540&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://hillview.bugwriter.net/archives/121-Unit-tests-with-mockups-in-Lisp.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://hillview.bugwriter.net/archives/121-Unit-tests-with-mockups-in-Lisp.html&quot;&gt;mock objects in Common Lisp&lt;/a&gt;: dynamically injecting an object/function/method (as a replacement for a collaborator required for the &quot;code under test&quot;) that returns an expected value means using a stub, not a mock -- another sign of not clearly enough defined terminology (btw, the terminology Fowler is using is that of G. Mercezaos &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=557&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://xunitpatterns.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://xunitpatterns.com/&quot;&gt;xunit patterns book&lt;/a&gt;).  &lt;br /&gt;
&lt;br /&gt;
It&#039;s worth keeping these things apart because of their different impact on test behaviour: mocks will force you to think about behaviour whereas stubs focus on &#039;results&#039; of code calls (or object state if you think in terms of objects being substituted). As a result, when you change the behaviour of the code under test (say you&#039;re changing code paths in order to optimize code blocks) this might (mocks) or might not (stubs) result in changes to the test code. &lt;br /&gt;
&lt;br /&gt;
It&#039;s also worth thinking about mocks and stubs because they also shed a new light on the question of test granularity: when you&#039;re substituting real objects in either way, you&#039;re on your way to much more fine-grained tests, which implies that you loosen the dependency of your tests: You can now modify the code of your collaborateur class without the test for your code under test breaking. Which brings us back full circle to the distinction between unit tests and integration tests: you now might have perfect unit tests, but now you&#039;re forced to additionally tests the integration of all the bits and pieces. Otherwise you might have all unit tests succeed but your integrated code still fails. Given this relationship, it seems immediately clear that 100% test coverage might not be the most important issue with unit tests: you might have 100% unit test success, but 100% integration failure at the same time -- if you don&#039;t do continuous integration and integration tests, of course. Now what&#039;s interesting is that it might be possible to check test coverage on code paths, but it might not be easy to check integration coverage. I would be interested to learn about tools detailing such information.&lt;br /&gt;
&lt;br /&gt;
Recently I had another aha moment with regard to testing terminology: Kevlin Henney&#039;s presentation at this years german conference on object oriented programming, the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=542&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://www.sigs-datacom.de/sd/kongresse/oop_2009/index.php&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.sigs-datacom.de/sd/kongresse/oop_2009/index.php&quot;&gt;OOP 2009&lt;/a&gt;, on &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=543&amp;amp;entry_id=133&quot;  onmouseover=&quot;window.status=&#039;http://www.sigs-datacom.de/sd/kongresse/oop_2009/program.php?cat=session&amp;amp;ID=47&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.sigs-datacom.de/sd/kongresse/oop_2009/program.php?cat=session&amp;ID=47&quot;&gt;know your units: TDD, DDT, POUTing and GUTs&lt;/a&gt;: tdd is test driven development, of course. The other ones might be not so obvious: &quot;guts&quot; are just good unit tests and &quot;pout&quot; is &quot;plain old unit testing&quot;. I saw myself doing tdd, but come to think of it, I&#039;m mostly applying a combination of tdd, pout (after the fact testing) and ddt: defect driven testing. I find the introduction of a term for testing after the code has been written interesting because it provides a way to talk about how to introduce testing in the first place. Especially defect driven testing, the idea to write a test to pinpoint and overcome an erroneous  code path, might be a very powerful way to introduce the habit of regularly writing (some) tests for an existing large code base. So you avoid the pitfall of never being able to test &quot;all this lots of code because there is never the time for it&quot; and you might also motivate people to try writing test before code. And on this level, it might at first not be that relevant to make the distinction between integration and unit tests to clear: start out with whatever is useful. &lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Fri, 06 Feb 2009 11:11:40 +0100</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/133-guid.html</guid>
    <category>tdd</category>

</item>
<item>
    <title>Core wars</title>
    <link>http://hillview.1on.de/archives/125-Core-wars.html</link>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/125-Core-wars.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=125</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=125</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    Drew Campsie &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=505&amp;amp;entry_id=125&quot;  onmouseover=&quot;window.status=&#039;http://common-lisp.net/pipermail/bese-devel/2009-January/006566.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;external link: mailing list announcement&quot;&gt;announces ucw-core&lt;/a&gt;, the next generation of &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=506&amp;amp;entry_id=125&quot;  onmouseover=&quot;window.status=&#039;http://common-lisp.net/project/ucw/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://common-lisp.net/project/ucw/&quot;&gt;Uncommon Web&lt;/a&gt;, a continuation-based framework for web applications written in Common Lisp. It&#039;s the first major announcement since Drew took over development lead of ucw and it seems to focus on establishing a core library of basic technology on top of which other functionality can be implemented (e.g. functionality like those offered by the ucw-ajax). To me as a UCW user this sounds like great news, since I had the impression that ucw seemed to linger in a state of void over the last year or so.&lt;br /&gt;
&lt;br /&gt;
But even more interesting is that ucw just seems to follow a certain trend. For instance, according to the &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=507&amp;amp;entry_id=125&quot;  onmouseover=&quot;window.status=&#039;http://yehudakatz.com/2008/12/23/rails-and-merb-merge/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://yehudakatz.com/2008/12/23/rails-and-merb-merge/&quot;&gt;announcement that Ruby on Rails and Merb will merge&lt;/a&gt;, one goal is that &lt;quote&gt;Rails will be retrofitted to make it easy to start with a “core” version of Rails (like Merb’s current core generator), that starts with all modules out, and makes it easy to select just the parts that are important for your app&lt;/quote&gt;. The main aspect of such development (at least I hope so) seems to be best described by one of &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=508&amp;amp;entry_id=125&quot;  onmouseover=&quot;window.status=&#039;http://docs.djangoproject.com/en/dev/misc/design-philosophies/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://docs.djangoproject.com/en/dev/misc/design-philosophies/&quot;&gt;Django design goals&lt;/a&gt;): &lt;quote&gt;A fundamental goal of Django’s stack is loose coupling and tight cohesion. The various layers of the framework shouldn’t “know” about each other unless absolutely necessary.&lt;/quote&gt; The python folks have even gone so far as to write down a &lt;emph&gt;web server gateway interface specification&lt;/emph&gt; (&lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=509&amp;amp;entry_id=125&quot;  onmouseover=&quot;window.status=&#039;http://wsgi.org/wsgi/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://wsgi.org/wsgi/&quot;&gt;WSGI&lt;/a&gt;, a quite minimalistic specification).&lt;br /&gt;
&lt;br /&gt;
It will be interesting to see whether there&#039;s going to be even more unification, maybe even across language diffferences. I&#039;m not too certain that such an unification would necessarily be a good aim; as always there are probably as many benefits as downsides to it. For instance, a common specification certainly lowers the learning curve for people switching frameworks while at the same time may stiffle further development. Then there&#039;s the fact that the different frameworks have different approaches which are certainly reflected in their APIs: for instance, Django explicitly tries to avoid magic at all cost while there&#039;s traditionally a lot of magic going on behind the scenes of a Rails application. I&#039;m also not sure where exactly one should draw the line between common &quot;core&quot; functionality and additional &quot;batteries&quot;. As an application designer it&#039;s probably most important that there is such a line at all so that you can easily pick your poison without having to buy everything.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Thu, 08 Jan 2009 21:48:00 +0100</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/125-guid.html</guid>
    <category>lisp</category>
<category>python</category>
<category>ruby</category>
<category>ucw</category>
<category>web development</category>

</item>
<item>
    <title>You're wondering now</title>
    <link>http://hillview.1on.de/archives/124-Youre-wondering-now.html</link>
            <category>Media</category>
            <category>Programming</category>
    
    <comments>http://hillview.1on.de/archives/124-Youre-wondering-now.html#comments</comments>
    <wfw:comment>http://hillview.1on.de/wfwcomment.php?cid=124</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://hillview.1on.de/rss.php?version=2.0&amp;type=comments&amp;cid=124</wfw:commentRss>
    

    <author>nospam@example.com (Holger Schauer)</author>
    <content:encoded>
    &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=503&amp;amp;entry_id=124&quot;  onmouseover=&quot;window.status=&#039;http://herbsutter.wordpress.com/2008/12/31/the-2008-media-inflection-meet-dr-web-the-new-gorilla/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://herbsutter.wordpress.com/2008/12/31/the-2008-media-inflection-meet-dr-web-the-new-gorilla/&quot;&gt;Herb Sutter announces&lt;/a&gt; that &lt;a href=&quot;http://hillview.1on.de/exit.php?url_id=504&amp;amp;entry_id=124&quot;  onmouseover=&quot;window.status=&#039;http://www.ddj.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot; title=&quot;http://www.ddj.com/&quot;&gt;Dr.Dobbs Journal&lt;/a&gt;  is permanently suspending print publication and going web-only as of January 2009. I&#039;ve used to be a long-time subscriber of DDJ -- several not-so-excited friends that recently helped moving into our new flat are my witnesses. Actually, I&#039;ve stopped my subscription (and we&#039;re talking about a way to expensive subscription via a German importer, here) roughly one or two years ago, since I couldn&#039;t keep up with my reading but occasionally I&#039;ve regret that I no longer receive it. Now, it seems to me like the last printed programming related magazine is going down the drain -- sorry, you Java and PHP magazines floating around, but your content isn&#039;t nearly as interesting as what DDJ had as it was ultimately the mix of different topic and opionated editorials that made DDJ so unique. Perhaps now I should hurry and finally buy the DDJ developer library dvd covering 21 years of DDJ articles.  I&#039;ll keep an eye on what will happen to DDJ as a web publication. 
    </content:encoded>

    <pubDate>Fri, 02 Jan 2009 09:18:33 +0100</pubDate>
    <guid isPermaLink="false">http://hillview.1on.de/archives/124-guid.html</guid>
    <category>literature</category>
<category>media</category>

</item>

</channel>
</rss>
