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

<channel>
	<title>The Snowtide Blog</title>
	<atom:link href="http://blog.snowtide.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.snowtide.com</link>
	<description>building complex, innovative software and the business that goes with it</description>
	<pubDate>Thu, 01 May 2008 12:10:31 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Burn It Down</title>
		<link>http://blog.snowtide.com/2008/05/01/burn-it-down</link>
		<comments>http://blog.snowtide.com/2008/05/01/burn-it-down#comments</comments>
		<pubDate>Thu, 01 May 2008 12:10:31 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Everything Else]]></category>

		<category><![CDATA[Geek Commentary]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/?p=56</guid>
		<description><![CDATA[While at dinner with a friend of mine a couple of weekends ago, we got to talking about how certain programming problems, usually the hardest ones we&#8217;ve faced, are ones where we ended up having to simply work the problem: stare at the code, stare at the reference / specification / dataset, hunker down, and [...]]]></description>
			<content:encoded><![CDATA[<p>While at dinner with a friend of mine a couple of weekends ago, we got to talking about how certain programming problems, usually the hardest ones we&#8217;ve faced, are ones where we ended up having to simply <em>work</em> the problem: stare at the code, stare at the reference / specification / dataset, hunker down, and plow through the tough stuff with more determination and tenacity than engineering or design rigor.  While we were talking about this dynamic, I inadvertently summed up that kind of experience and approach with what I think is a pretty apt phrase: sometimes, you just need to<em> &#8220;burn it down&#8221;</em> (&#8217;it&#8217; being the problem at hand).</p>
<p>The phrase &#8220;burn it down&#8221; has been rattling around in my head incessantly since then, so I&#8217;m hoping to exorcise it here.  Perhaps the reason why it&#8217;s stayed with me so long is that there&#8217;s a pretty good chance that that phrase has a lot of applicability to life in general.  Looking back over the years, I&#8217;ve often found myself in situations where the key to survival and (ostensibly) success has been my ability (tendency?) to wage a war of attrition against that which stands in my way.</p>
<p>The most immediate case is a programming challenge: you&#8217;re sitting there trying to solve a problem for the umpteenth time, and the algorithm in your head or on the page in front of you is laughing at your inadequacies.  Ideally, you&#8217;d like to step up to the whiteboard, and bang out a description of how this data structure should look, a proof for how that graph-walking algorithm can be sped up by an order of magnitude, whatever.  I&#8217;ve seen programmers do this – they&#8217;ll pull out a small pad, and in about 8 minutes, they&#8217;ll knock out some pseudocode for an implementation of some algorithm that might take you an hour to comprehend, never mind implement.</p>
<p>Unfortunately, only a vanishing minority can seize hard problems like that on a regular basis; the rest of us are left wanting to be smarter than we clearly are.  So, despite all of your hopes, your text editor simply stares blankly at you, the whiteboard is inert, and you&#8217;re left with two options: failure, or the last resort of the almost-overwhelmed, unyielding determination.</p>
<p>(This is very simply the same thing that <a href="http://en.wikipedia.org/wiki/Thomas_edison">Edison</a> talking about: <em><span>&#8220;Genius is one percent inspiration, ninety-nine percent perspiration.&#8221;</span></em><span> Of course, I don&#8217;t think we&#8217;re in genius territory here&#8230;competency, perhaps?)</span></p>
<p>I&#8217;ve experienced that exasperation so many times while working on PDFTextStream and other Snowtide products.  I&#8217;m fond of saying that I&#8217;m a math idiot, and while few people believe me, it&#8217;s entirely true.  There are things in PDFTextStream that required me to slowly, painfully learn more about esoteric corners of computational geometry than I would ever care to know otherwise, and the same goes for various other specialties in mathematics and computer science.  For me, understanding formalisms in those fields is like feathering a chicken by running it through a keyhole.  The only way I&#8217;ve been able to ship a single bloody line of code has been to Burn It Down.</p>
<p>Of course, programming is a very narrow domain, but I think the same strategy is the only tool that us humans have to use in coping with the crush of life and disorder that surrounds us.  Through growing up, getting an education, finding a job, starting a business, sustaining a life partnership, raising children, and coping with the march of time, the only common thread of human endeavor is <a href="http://www.poets.org/viewmedia.php/prmMID/15377">rage</a>.  Even that majickal 1% of prodigies and bona fide geniuses have areas of their lives where their only hope of enduring is to simply <em>endure</em>.  In a way, it&#8217;s comforting to know that despite the pretensions of some, the only sure way to succeed in programming (and likely even loftier domains) is to lay siege to (or perhaps, depending upon your mindset, to practice judo with) whatever challenge is ahead.</p>
<p>The day is young.  Burn, baby, burn.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2008/05/01/burn-it-down/feed</wfw:commentRss>
		</item>
		<item>
		<title>Snowtide Is Hiring</title>
		<link>http://blog.snowtide.com/2008/03/21/snowtide-is-hiring</link>
		<comments>http://blog.snowtide.com/2008/03/21/snowtide-is-hiring#comments</comments>
		<pubDate>Fri, 21 Mar 2008 16:36:36 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[The Business]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2008/03/21/snowtide-is-hiring</guid>
		<description><![CDATA[We have one open position, and we are also accepting internship applications.  Do you feel up to a challenge?
]]></description>
			<content:encoded><![CDATA[<p>We have one open position, and we are also accepting internship applications.  <a href="http://snowtide.com/OpenPositions">Do you feel up to a challenge?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2008/03/21/snowtide-is-hiring/feed</wfw:commentRss>
		</item>
		<item>
		<title>Western Mass. Developer&#8217;s Group and Snowtide Host Rich Hickey and Clojure</title>
		<link>http://blog.snowtide.com/2008/03/21/western-mass-developers-group-and-snowtide-host-rich-hickey-and-clojure</link>
		<comments>http://blog.snowtide.com/2008/03/21/western-mass-developers-group-and-snowtide-host-rich-hickey-and-clojure#comments</comments>
		<pubDate>Fri, 21 Mar 2008 16:30:52 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Clojure]]></category>

		<category><![CDATA[Scala]]></category>

		<category><![CDATA[Western Mass Developers]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2008/03/21/western-mass-developers-group-and-snowtide-host-rich-hickey-and-clojure</guid>
		<description><![CDATA[Last night, we had the privilege to host a talk by Rich Hickey on concurrency in Clojure at our offices in Northampton.  A good portion of the Western Mass. Developer&#8217;s Group showed up for the event.  Many thanks to Lou Franco for coordinating things, and Shawn Fumo for arranging to have Rich&#8217;s talk taped for [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, we had the privilege to host a talk by Rich Hickey on concurrency in <a href="http://clojure.org">Clojure</a> at our offices in Northampton.  A good portion of the <a href="http://wmassdevs.com">Western Mass. Developer&#8217;s Group</a> showed up for the event.  Many thanks to <a href="http://loufranco.com/blog/files/20-Days-of-Clojure-Day-20.html">Lou Franco</a> for coordinating things, and <a href="http://shawnfumo.com">Shawn Fumo</a> for arranging to have Rich&#8217;s talk taped for posterity (a link will be coming soon, I would think).</p>
<p>And, of course, thanks go to Rich who took the time to make the drive up to Northampton from New York City.  (<em>Fanciful thought: does this mean that the developer&#8217;s group constitutes a programmer&#8217;s oasis?  Is Western Mass. the new center of gravity for innovative software development in New England?</em> <em>*wink*</em>)</p>
<p>Lou&#8217;s notes on the talk itself capture its content far better than I&#8217;ll dare to attempt at this point.  Suffice it to say that it was a great presentation by Rich, who clearly has a penchant for teasing apart complex topics and evangelizing Clojure very effectively.  Luckily for the rest of us, there are a <a href="http://clojure.blip.tv">number of other talks</a> about Clojure by Rich <a href="http://www.lispnyc.org/wiki.clp?page=past-meetings">floating around in the ether</a>.</p>
<p>It should come as no surprise to anyone who knows me at all that I love what Clojure has come to be.  I followed Rich&#8217;s prior attempts to marry Lisp and Java (specifically, <a href="http://foil.sourceforge.net">Foil</a> and <a href="http://jfli.sourceforge.net">jFli</a>), but Clojure tops those efforts handily on essentially every front.</p>
<p>But, what of my fervent love of Scala, so earnestly professed in this very space?  Clearly, I&#8217;m not particularly monogamous when it comes to programming languages.  Clojure and Scala have a lot in common, but they are very, very different from each other &#8212; although they share the common traits of (a) being better than &#8220;straight&#8221; Java in so many ways, and (b) enabling functional programming on the JVM (and of course, .NET via ikvm).  You <strong>can</strong> love both; maybe it&#8217;s a right-brain, left-brain thing.  (I can clearly imagine <a href="http://helios.hampshire.edu/~nasCCS/">Professor Stillings</a> scowling at me for that one.)</p>
<p>Anyway, again, a big &#8216;thank you&#8217; to Rich Hickey and everyone else who made last night possible.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2008/03/21/western-mass-developers-group-and-snowtide-host-rich-hickey-and-clojure/feed</wfw:commentRss>
		</item>
		<item>
		<title>&#8230;recommended by 4 out of 5 surveyed seasoned programmers&#8230;</title>
		<link>http://blog.snowtide.com/2007/11/06/recommended-by-4-out-of-5-surveyed-seasoned-programmers</link>
		<comments>http://blog.snowtide.com/2007/11/06/recommended-by-4-out-of-5-surveyed-seasoned-programmers#comments</comments>
		<pubDate>Tue, 06 Nov 2007 17:18:50 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Geek Commentary]]></category>

		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2007/11/06/recommended-by-4-out-of-5-surveyed-seasoned-programmers</guid>
		<description><![CDATA[In a thread on the Google Group dedicated to discussing languages hosted on the JVM (i.e. Scala, Groovy, JRuby, et al.), it was asked by a fellow named Jon Harrop whether something like F# (an OCaml / Standard ML derivative that targets the .NET CLR) would find any traction if it were made available for [...]]]></description>
			<content:encoded><![CDATA[<p>In a thread on the Google Group dedicated to discussing languages hosted on the JVM (i.e. <a href="http://scala-lang.org">Scala</a>, Groovy, JRuby, et al.), it was asked by a fellow named Jon Harrop whether something like F# (an OCaml / Standard ML derivative that targets the .NET CLR) would find any traction if it were made available for the JVM.  Well, some unremarkable discussion ensued about the costs associated with developing languages, how existing efforts attract funding, etc., and then things turned towards the question of &#8220;Why not just use Scala?&#8221;, since Scala does fold in a lot of functional programming primitives.</p>
<p>Mr. Harrop&#8217;s replies centered on various aspects of ML-style languages that he misses in Scala, and aspects of Scala that he finds irritating.  All fine and good &#8212; hey, everyone has their own preferences &#8212; until he unveiled <a href="http://groups.google.com/group/jvm-languages/msg/b7edd5f9e6ed0361">this nugget</a> (emphasis mine):</p>
<blockquote><p>OCaml and F# have shown that ML&#8217;s approach to structured programming using modules, variant types and pattern matching and extensive type inference is almost always preferable to OOP.  <strong>When given the choice between OOP and FP, seasoned programmers rarely choose OOP.</strong></p></blockquote>
<p>Zealotry isn&#8217;t anything new &#8212; you can probably find inverse statements right now in some Smalltalk newsgroups, or someone agitating about the uniform superiority of s-expressions in a Lisp or Scheme forum.  The odd thing about this is that Mr. Harrop is not exactly a random troll &#8212; he seems fairly well-respected in the F#/OCaml/ML community, is a prolific writer, and looks to be writing a book on F# for Microsoft Press.</p>
<p>Stuff like this makes the whole facade about software development being akin to engineering even more farcical than one might initially imagine.  Can we please recognize that there is a difference between spirited advocacy and demagoguery?  I&#8217;ve certainly been guilty of the latter on occasion (usually much to my later regret), but it&#8217;s particularly irksome to find those that are apparently unaware of the distinction at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2007/11/06/recommended-by-4-out-of-5-surveyed-seasoned-programmers/feed</wfw:commentRss>
		</item>
		<item>
		<title>WMassDevs Meeting Notes (2007.11.01)</title>
		<link>http://blog.snowtide.com/2007/11/02/wmassdevs-meeting-notes-20071101</link>
		<comments>http://blog.snowtide.com/2007/11/02/wmassdevs-meeting-notes-20071101#comments</comments>
		<pubDate>Fri, 02 Nov 2007 17:12:49 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Scala]]></category>

		<category><![CDATA[Western Mass Developers]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2007/11/02/wmassdevs-meeting-notes-20071101</guid>
		<description><![CDATA[Paul and Miles have been keeping notes at recent meetings of the Western Mass. Developer&#8217;s Group lately so as to keep those who can&#8217;t make it some weeks in the loop.  However, neither of them could make it last night, so I thought I&#8217;d take a whack at providing a bullet-point précis.
Now, keep in [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://e-scribe.com/news/389">Paul</a> and <a href="http://wmassdevs.com/wordpress/2007/10/19/notes-for-the-october-18-2007/">Miles</a> have been keeping notes at recent meetings of the <a href="http://wmassdevs.com">Western Mass. Developer&#8217;s Group</a> lately so as to keep those who can&#8217;t make it some weeks in the loop.  However, neither of them could make it last night, so I thought I&#8217;d take a whack at providing a bullet-point précis.</p>
<p>Now, keep in mind that this is my first foray into anything resembling <strike>journalism</strike> hackery.</p>
<ul>
<li>A couple of new faces showed up, including (dear god, I hope I&#8217;m getting the names right) Jason from <a href="http://studio4tech.com">Studio4Technologies</a>, who mostly works with C#, Dan, who lives in Avon, CT, has a day job using C#, but is working through SICP on his own and is interested in all manner of functional programming languages, and Michael (Eger, not McIntosh), who is a jack-of-all-trades consultant.</li>
<li>Gerard and <a href="http://www.atalasoft.com/cs/blogs/loufranco/">Lou</a> had already installed Mac OS X 10.5, and sang its praises (for the most part).  Highlights include Spaces (a &#8220;killer&#8221; implementation of virtual desktops), the Exposé/Safari select-and-clip widget maker (very cool feature, although no one can think of a good practical use of the tech), and the salvation that is having the Dock on the side of the screen so as to avoid the absurdities associated with how it&#8217;s rendered at the bottom of the screen.</li>
<li>Lou&#8217;s going to a tech convention in Las Vegas next week (thereby missing election day!); it turns out that the whole gang from Atalasoft is going to be sporting <a href="http://www.thinkgeek.com/apparel/hats-ties/9352/">snazzy pixelated ties</a> on the convention floor.  Very cool, but <em>clip-ons</em>?</li>
<li>Logo design is always about whatever the guys in the design shop happen to be messing around with in Illustrator the day your order hits their desk.  Thus, the cyclic obsession with graceful swoops, cubist abstract styles, and flaming butterflies.</li>
<li>Gerard took a look at <a href="http://scala-lang.org">Scala</a> since our last meeting, and found much to his liking.  &#8220;If I were using Java, I&#8217;d definitely be coding in Scala,&#8221; said Gerard, in yet another example of how Sun made everything more complicated for everybody by conflating the JVM and the Java programming language for years.  Here&#8217;s hoping IntelliJ gets moving on some first-class Scala support.</li>
<li>Dan&#8217;s been using Scheme to go through SICP and the Little Schemer (an obvious choice since that&#8217;s the language used in those materials), but he&#8217;s somewhat overwhelmed by the number of functional programming languages that are available &#8212; how can one choose what to use?  My response was that they&#8217;re all functionally the same (ba-dum-crash!) in terms of the primitives they provide.  Which FP language to use in any particular situation generally comes down to the details of one&#8217;s deployment and runtime requirements at the time.  For example, I&#8217;m using Scala right now because it interoperates smoothly with Java and .NET, making it easy to work with PDFTextStream&#8217;s existing codebase.</li>
<li>Michael asked what functional programming is, exactly.  From there, I somehow found myself holding forth on definitions of functional programming, why minimizing state is Good™, what continuations are and why they&#8217;re handy, and the differences between global continuations and delimited continuations.  I&#8217;m sure most people were groaning.  Lou mentioned Common Lisp&#8217;s exception handling (better known in that world as <a href="http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html">conditions and restarts</a>) as an instance of delimited continuations.</li>
<li>Jason mentioned that there seems to be some noticeable growth in the number of startups in the area, his Studio4 Technologies being one of them.  Maybe it&#8217;s time for the group to start tracking how much work is coming into the area, how many new businesses have opened and where, etc.</li>
<li>Greg pulled out his new Thinkpad, running Linux (though I can&#8217;t remember the distro).</li>
<li>Using OS X Mail to access GMail via IMAP is apparently still a no-go, given Mail&#8217;s lack of tag support.  Thunderbird was thrown out there as a possible alternative, but some had doubts that GMail&#8217;s tags would be properly represented via IMAP.</li>
<li>The state of social networks is totally out of control &#8212; there are too many profiles to manage on too many sites.  Some fun was had at the expense of those that are &#8220;professional networkers&#8221; &#8212; those people that have thousands and thousands of LinkedIn connections, etc.</li>
<li>Michael polled the group for thoughts on XSLT, at which point a wave of grunts was heard &#8217;round the table.  Just about everyone panned XSLT as being handy, but inevitably too complex without the right tools.  XSLT 2.0 doesn&#8217;t exactly make progress on this front.  As an aside, I noted that XSLT also happens to be a functional language (perhaps the most widely used FP in industry these days, I&#8217;ll wager).  [As an aside, Dan's first message to the list arrived with the title "XSLT is like Lisp, but with a punch in the face."]</li>
<li>Generics were briefly discussed, including some comparison of how they&#8217;re implemented in the JVM (erasure) and the CLR (not-erasure, although no one knew the details there).</li>
<li><a href="http://www.ikvm.net/">ikvm</a> was mentioned as a practical and totally usable way to cross-compile Java libraries for use in .NET environments. [We happen to use it in order to provide <a href="http://snowtide.com/PDFTextStream.NET">PDFTextStream.NET</a>.]</li>
<li>For those new to the group, the <a href="http://lists.wmassdevs.com/mailman/listinfo/java-python-dev">mailing list</a> was mentioned, as well as our usual IRC channel (#wmassdevs on Freenode), which is unfortunately pretty sparse these days!</li>
<li>A pretty lively exchange was had on the topic of Borders vs Barnes and Noble, especially as it relates to the availability of technology tomes.  The B&amp;N in Hadley is tremendously mediocre, and the one in Holyoke isn&#8217;t a whole lot better.  The general consensus was that Borders generally has a better tech book section than B&amp;N, so there&#8217;s reason to hope that the significant presence that Borders looks to be building in the Holyoke Mall will make things a lot easier when one of us just absolutely has to have a particular tech book <em>today</em>.  There was also talk of the partnership between Borders and Amazon, which apparently yields various benefits.</li>
</ul>
<p>That&#8217;s all that I can recall.  I really should have had a notepad with me, I suppose.  If anyone has anything else they want to add, feel free to drop it in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2007/11/02/wmassdevs-meeting-notes-20071101/feed</wfw:commentRss>
		</item>
		<item>
		<title>Scala Makes Me Think</title>
		<link>http://blog.snowtide.com/2007/10/31/scala-makes-me-think</link>
		<comments>http://blog.snowtide.com/2007/10/31/scala-makes-me-think#comments</comments>
		<pubDate>Wed, 31 Oct 2007 15:22:13 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Geek Commentary]]></category>

		<category><![CDATA[PDFTextStream]]></category>

		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2007/10/31/scala-makes-me-think</guid>
		<description><![CDATA[(&#8230;or, &#8220;Oh, Dear, Wasn&#8217;t I Thinking Before?&#8221;)
As my friends will attest, I really enjoy programming languages.  I&#8217;m one of those language fetishists that talk about &#8220;expressiveness&#8221; and &#8220;concision&#8221;, and yes, I&#8217;m one of those very strange fellows who blurt out bad Lisp jokes while getting odd looks from innocent bystanders.  And while my [...]]]></description>
			<content:encoded><![CDATA[<p>(&#8230;or, &#8220;Oh, Dear, Wasn&#8217;t I Thinking Before?&#8221;)</p>
<p>As my friends will attest, I really enjoy programming languages.  I&#8217;m one of those language fetishists that talk about &#8220;expressiveness&#8221; and &#8220;concision&#8221;, and yes, I&#8217;m one of those very strange fellows who blurt out <a href="http://wmassdevs.com/wordpress/2007/10/19/notes-for-the-october-18-2007/">bad Lisp jokes</a> while getting odd looks from innocent bystanders.  And while my <a href="http://snowtide.com/PDFTextStream">bread and butter</a> is built in Java, I often find myself yearning for a more expressive language while deploying, customizing, or integrating PDFTextStream (there I go again with the &#8220;expressiveness&#8221; bit).  That yearning can reach almost pathological extremes at times, prompting me to go so far as to <a href="http://blog.snowtide.com/2006/08/21/working-together-pythonjava-open-sourcecommercial">sponsor projects</a> that make it possible to <a href="http://jpype.sourceforge.net/">use Java libraries (including PDFTextStream) from within Python</a>.</p>
<p>Fortunately, things don&#8217;t always have to be so hard.  Case in point, I recently dove head-first into <a href="http://scala-lang.org">Scala</a>, a language that combines object orientation and functional programming into one very tasty stew.  Scala has a number of characteristics that make it interesting aside from its merging of OO and FP mechanisms:</p>
<ul>
<li>it is statically-typed, and provides moderately good type inference that enables one to skip most type declarations and annotations</li>
<li>it is  compiled, which provides a minimum level of performance (sure, it&#8217;s actually byte-compiled, but let&#8217;s not quibble right now)</li>
<li>and the real kicker: it  compiles down to Java class files (or .NET IL), thereby enabling it to be hosted on a JVM (or .NET&#8217;s CLR), and call (and be called by) other Java (or .NET) libraries</li>
</ul>
<p>There&#8217;s a lot to like here, for programmers from many walks of life, and I could go on and on about how Scala has single-handedly created and filled a great niche of delivering most of the raw power of purely functional languages like Haskell and ML within a JVM-hosted environment with respectable performance.  But what has really impressed me has been the way that Scala has improved how I work.  In short, it&#8217;s made really think about development again.</p>
<p>I generally have two working styles.  In a classic statically-typed environment (say, Java or C#), I tend to generate pretty clean designs, but my level of productivity is very low.  I attribute both of these characteristics to the copious amount of actual work (i.e. finger-typing) that has to go into writing Java or C# code, even with the best of tools.  See, while I&#8217;m typing (and typing, and typing), I&#8217;m thinking two, three, four steps ahead, figuring out the design of the next chunk of code.  The verbosity of the language gives me time to reason about the next step while my fingers are working off the previous results.</p>
<p>In a dynamically-typed environment (say, Python or Scheme), I tend to be extraordinarily productive, but unless I consciously step back and purposefully engage in design, the code I write is much more complex.  In such environments, there&#8217;s less finger-typing going on, so I don&#8217;t have a natural backlog allowing me to think about the code before it&#8217;s already on the screen.  Further, I know I can get from point A to point B relatively easily in many circumstances, so I end up skipping the design step, switching into Cowboy Coder mode, and hacking at things until everything works.  Oddly enough, in certain circles, this isn&#8217;t so much frowned upon as it is <strong>recommended</strong>.</p>
<p>Scala is statically-typed, so the naive observer might speculate that my working style in Scala would be much the same as in Java.  However, I&#8217;ve found that working with Scala has prompted (forced?) me to consciously step back and think about <strong>everything</strong>, at every step along the way: class hierarchies, type relationships in general, testing strategies, eliminating state where possible&#8230;the amount of actual thinking I&#8217;ve done while working with Scala has far outstripped the amount of reasoning that typically goes into any similar period of coding.  Unsurprisingly, this has led to quite the spike in code quality, which translates into productivity through fewer bugs and less rework.</p>
<p>I attribute this to the strong, static typing that Scala enforces, combined with the type inference that Scala provides.  The former forces me to reason about what I&#8217;m doing (as it does in Java, for instance), but because the latter eliminates so much of the finger-typing associated with static typing in other environments, I&#8217;m given the opportunity to realize that a concrete design phase would yield tremendous benefits, regardless of the scope of code in question.  I suspect I would find working in Haskell or ML to be a similar experience, but because those languages don&#8217;t easily interoperate with the libraries I need to do my work, I&#8217;ve never really given them a chance.</p>
<p>Thankfully, I don&#8217;t think I&#8217;ll have to.  Scala is a great environment, and even more important than its technical merits, its design has led me to engage in a more thoughtful, more conscious development process.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2007/10/31/scala-makes-me-think/feed</wfw:commentRss>
		</item>
		<item>
		<title>Thoughts on Martin Fowler&#8217;s Domain Specific Languages Overview</title>
		<link>http://blog.snowtide.com/2007/04/16/thoughts-on-martin-fowlers-domain-specific-languages-overview</link>
		<comments>http://blog.snowtide.com/2007/04/16/thoughts-on-martin-fowlers-domain-specific-languages-overview#comments</comments>
		<pubDate>Mon, 16 Apr 2007 13:53:50 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Geek Commentary]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2007/04/16/martin-fowler-domain-specific-languages-overview</guid>
		<description><![CDATA[I&#8217;m way late in linking to this, but it&#8217;s worth it.
Last October, a presentation by Martin Fowler from JAOO 2006 popped up on InfoQ (which does a great job of simulating the actual experience of being at the session with its video/slideshow integration) where he gave a very high-level overview of domain specific languages (DSLs). [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m way late in linking to this, but it&#8217;s worth it.</p>
<p>Last October, <a href="http://www.infoq.com/presentations/domain-specific-languages">a presentation by Martin Fowler from JAOO 2006</a> popped up on InfoQ (which does a great job of simulating the actual experience of being at the session with its video/slideshow integration) where he gave a very high-level overview of domain specific languages (DSLs).  He really only scratched the surface, but it&#8217;s a great introduction for those that haven&#8217;t yet thought about DSLs much.</p>
<p>(Of course, that population is getting smaller by the minute thanks to Ruby (and Rails), since it builds in the metaprogramming facilities necessary to implement internal DSLs.)</p>
<p>I recently had occasion to re-watch the presentation.  This time around, I took the time to scribble down some thoughts:</p>
<ul></ul>
<ol>
<li>I think he played up the potential role of DSLs as &#8220;configuration code&#8221; too much.  Yes, you can tailor a DSL to provide primarily configuration data, and that&#8217;s very useful as far as it goes.  However, internal DSLs (given an appropriately useful host environment) are able to provide levels of abstraction and composability that go way beyond configuration.</li>
<li>I think that casting the Java example he showed as a DSL is really over the top, and is a result of overemphasizing the potential configuration role DSLs can play. As Mr. Fowler said, the line between an internal DSL and just a bunch of specific goal-driven coding in the host language is fuzzy. However, a big part of that line (and therefore whether an environment can reasonably host a DSL) is how well the host language&#8217;s existing constructs can be recast as sensible constructs in the DSL. The Ruby DSL example fits this criterion well, as its range (4..12, etc) and block constructs mapped well to the domain at hand. On the other hand, the Java example <em>is</em> Java, unapologetically so &#8212; the explicit object creation, the function calls, return statements, etc., simply do not map to the domain. The fact that the integers and strings being passed in those function calls can be recast as an actual configuration file should not lead us to think that Java configuration code is a functional DSL.</li>
<li>At least in my experience, external DSLs are dead-ends. There&#8217;s just too much heavy lifting that needs to be done to consume external DSL &#8220;source files&#8221; and align their contents with the host language&#8217;s environment. True, internal DSLs need to conform to the syntax of their host environment, but the advantages of &#8220;symbolic integration&#8221; (as Mr. Fowler puts it) and the fact that you get your IDE&#8217;s functionality for free are just too compelling to outweigh any nitpicky syntax quibbles that one might have with any DSL-capable language. And, if those syntax quibbles are significant enough, and the problem the DSL is going to solve is significant enough to make you come close to considering building all of the cruft necessary to implement an external DSL, then go find yourself a secondary language/environment that provides a more palatable syntax, and hook everything up with IPC of some kind.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2007/04/16/thoughts-on-martin-fowlers-domain-specific-languages-overview/feed</wfw:commentRss>
		</item>
		<item>
		<title>Python, Growth, and Sandboxes</title>
		<link>http://blog.snowtide.com/2007/04/01/python-growth-and-sandboxes</link>
		<comments>http://blog.snowtide.com/2007/04/01/python-growth-and-sandboxes#comments</comments>
		<pubDate>Mon, 02 Apr 2007 00:19:25 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Geek Commentary]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2007/04/01/python-growth-and-sandboxes</guid>
		<description><![CDATA[Well, I sure did step in it.
Consider: up until last week, I was simply using this space every now and then for some relatively bland navel-gazing related to selected goings-on at Snowtide.  Then, a friend of mine decided to put my most recent post (probably the only potentially inflammatory post I&#8217;ve ever written) on [...]]]></description>
			<content:encoded><![CDATA[<p>Well, I sure did step in it.</p>
<p>Consider: up until last week, I was simply using this space every now and then for some relatively bland navel-gazing related to selected goings-on at Snowtide.  Then, a friend of mine decided to put <a href="http://blog.snowtide.com/2007/03/28/python-growth-lack-thereof">my most recent post</a> (probably the only potentially inflammatory post I&#8217;ve ever written) on reddit, and a variety of people weren&#8217;t very happy (both in comments to the post itself, on <a href="http://programming.reddit.com/info/1dznm/comments">reddit&#8217;s comment page</a>, and to a lesser extent on <a href="http://discuss.joelonsoftware.com/default.asp?joel.3.473578">a Joel On Software thread</a>).  For someone who can lay only a tenuous claim to being a blogger (never mind the title of A-, B-, C-, or D-list blogger!), it&#8217;s been an interesting experience to say the least.</p>
<p>I tried to participate in the discussions that were swirling around, but eventually the comments became too numerous for me to follow in a timely way given the amount of bandwidth I&#8217;ve allocated to such things.  So, I&#8217;m taking the easy/cheap way out with a response post.  I know this is frowned upon by many, but c&#8217;est la vie.  Here, I will respond in two parts:</p>
<ol>
<li><a href="#a1">Python and the Growth &#8220;Problem&#8221;</a></li>
<li><a href="#a2">Sandbox Etiquette</a></li>
</ol>
<h3><a title="a1" name="a1"></a>Python and the Growth &#8220;Problem&#8221;</h3>
<p>In reading over all of the commentary, there seem to be three types of responses:</p>
<h4>Response Type A: Any lack of growth/&#8221;innovation&#8221; or a slowing of such growth in Python is good &#8212; stability makes it easier to concentrate on customer solutions, and encourages robust library development.</h4>
<p>Regardless of your language or platform, if stability and operational continuity is an overriding interest of yours, then lock yourself into a particular build, and stay there as long as you want.  This is a significant part of the job of IT organizations in large organizations – to standardize on environments and tools so as to shield the organization from unwanted change and cost.</p>
<p>(As an aside, Ruby&#8217;s Matz provides a positive spin on the &#8220;Python is stable, and that&#8217;s good&#8221; attitude, which may or may not be cheeky [it's hard to tell through the translation]: <a href="http://www.rubyist.net/~matz/20070329.html#p04">&#8220;Perhaps Python has a sense of responsibility.&#8221;</a>)</p>
<h4>Response Type B:  The &#8220;significant improvements&#8221; I&#8217;d like to see in Python are (take your pick): of academic use only; are overhyped genius toys that only make it easier to build overly complex solutions; distractions from other improvements that would be immediately useful to the majority of the Python userbase.</h4>
<p>This attitude pops up frequently in <em>any</em> discussion of programming paradigms that are off the beaten track, any technique that is unfamiliar to the commenter, or any <em>anything</em> that the commenter has had problems with in the past.  <a href="http://blog.snowtide.com/2007/03/28/python-growth-lack-thereof#comment-43">Meek</a> typified this kind of response with:</p>
<blockquote><p>Python is not growing because you want programmable syntax and “esoteric” features? Features that 99% of software developers <strong>should</strong> never use. Let me guess, you have never maintained a project written in a language that supports programmable syntax where geniuses abuse meta-programming where simpler alternatives achieve the same goal.</p></blockquote>
<p>This is a particularly disturbing line of thought, and one that I had always considered to be antithetical to a central principle of Python (at least in my eyes), that the programmer should always be trusted. I&#8217;ve always associated this with a variety of Python features, including duck typing, the lack of access controls around class members (modulo the slightly perverse double-underscore notation and associated name mangling of &#8220;private&#8221; attributes), the composability of namespaces, etc.</p>
<p>Lots of programming features are &#8220;esoteric&#8221;, depending on who you ask.  Pointer access is esoteric to a web app developer and should never be used in such a context, but it&#8217;s critical to a C-language device driver programmer.  Any number of language features can simultaneously be considered esoteric by some and necessary by others.  Not recognizing this, and then implying that &#8220;simpler alternatives&#8221; could readily take the place of those &#8220;genius&#8221; toys is evidence of a lack of perspective.   <a href="http://discuss.joelonsoftware.com/default.asp?joel.3.473578">28/w in the JOS thread</a> makes my point better than I ever could:</p>
<blockquote><p>It’s precisely because I want my projects to be on time that I don’t use assembly language for everything. That’s the same reason I don’t use C++ either. I’m about 5x as productive in Ocaml as I am in C++ i.e., at least 80% of my time spent coding C++ is spent dealing with language issues; it’s the equivalent of spending time making all my function calls out of gotos.</p>
<p>Most likely, 80% of my time coding Ocaml is wasted too, and I just don&#8217;t know it.</p></blockquote>
<p>Bottom line: just because you don&#8217;t see a use for a particular language feature doesn&#8217;t mean that someone else doesn&#8217;t find it absolutely, positively necessary.</p>
<h4>Response Type C: Python <strong>is</strong> growing, and if you were to pay attention, you&#8217;d notice.  We&#8217;re just not working on what <strong>you</strong> want.</h4>
<p>This point has been made by a variety of people, but I should give special attribution to <a href="http://blog.snowtide.com/2007/03/28/python-growth-lack-thereof#comment-42">Phillip J. Eby</a>, since he&#8217;s a significant Python contributor:</p>
<blockquote><p>Um, so you don’t think the “with” statement and coroutines were new features?</p>
<p>What about the new metaclass hook that’ll be in Python 3.0 (and maybe 2.6)? It’s actually a pretty significant step forward for implementing Ruby-like DSL’s in Python.</p></blockquote>
<p>I suppose this is the nut of the problem, at least as far as this discussion has related specifically to the technical aspects of Python: I&#8217;m not bowled over by the improvements Phillip cites.   They&#8217;re very useful and handy to the vast majority of Python programmers, but they&#8217;re not game-changers (which I suppose is what I meant by &#8220;significant growth&#8221;).  I think the description of the <a href="http://www.python.org/dev/peps/pep-3115/">metaclass hook</a> as &#8220;a pretty significant step forward for implementing Ruby-like DSL&#8217;s in Python&#8221; is very telling.  The facilities for building DSLs in Ruby are good in so far as they make it <em>possible</em> to get the job done, but they&#8217;re by no means conceptually complete nor functionally clean (as pointed out by <a href="http://programming.reddit.com/info/1dznm/comments/c1e1b7">jerf in the reddit comments</a>), so taking a &#8220;significant step&#8221; towards implementing such facilities isn&#8217;t the whole ballgame.</p>
<p>Regardless of that detail, the point is that progress <em>is</em> being made in Python &#8212; just not in the vector I need.  And, that&#8217;s OK.  Which brings me to&#8230;</p>
<h3><a title="a2" name="a2"></a>Sandbox Etiquette</h3>
<p>After all has been said and done, my original post was a mistake, in that I exhibited a similar type and degree of technological selfishness as those who replied with Type A responses.  As some of my friends will attest, I&#8217;ve personally been unhappy with Python and its direction for a variety of reasons for months now, especially as I&#8217;ve sunk further and further into a class of problems for which Python isn&#8217;t particularly well-suited at the moment.  While I had settled on that conclusion some time ago, I&#8217;ve obviously been suffering from a mental block that caused me to do drive-bys against Python.  This came to a head with my blog post.</p>
<p>The more mature (and zen) thing to do would have been to simply go looking for a different sandbox, and leave well enough alone with regard to Python.  (It is, after all, a fantastic language and will likely remain my favorite for most common tasks [especially web programming] for a some time hence).  This is especially true given the fact that I am essentially a nobody in the Python community – I&#8217;ve contributed in <a href="http://blog.snowtide.com/2006/08/21/working-together-pythonjava-open-sourcecommercial">my own small ways</a>, but it&#8217;s not like I&#8217;m a core hacker or important library author.  Instead, I adopted the Response Type A attitude, but flipped it on its head, claiming that my favorite language should advance itself to suit my requirements, and to hell with the priorities of others.</p>
<p>So, let&#8217;s make a deal: I&#8217;ll stop sniping on Python, and maybe everyone else can stop making clever comments about &#8220;esoteric&#8221; language features.  Then we can all spend more time building bigger and better sandcastles.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2007/04/01/python-growth-and-sandboxes/feed</wfw:commentRss>
		</item>
		<item>
		<title>All Aboard the Arc Bandwagon!</title>
		<link>http://blog.snowtide.com/2007/04/01/all-aboard-the-arc-bandwagon</link>
		<comments>http://blog.snowtide.com/2007/04/01/all-aboard-the-arc-bandwagon#comments</comments>
		<pubDate>Sun, 01 Apr 2007 15:56:11 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Everything Else]]></category>

		<category><![CDATA[Geek Commentary]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2007/04/01/all-aboard-the-arc-bandwagon</guid>
		<description><![CDATA[Inkling beat me to it, but after my recent revelations about Python, I&#8217;ve also decided to move all new development to Arc.  Even better, it looks like someone has done an Arc implementation for .NET/Mono called SteelArc, which will suit our embedded apps nicely.  I think the name is a take-off on IronPython.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.inklingmarkets.com/journal/2007/4/1/inklings-hiring.html">Inkling beat me to it</a>, but after <a href="http://blog.snowtide.com/2007/03/28/python-growth-lack-thereof">my recent revelations about Python</a>, I&#8217;ve also decided to move all new development to <a href="http://www.paulgraham.com/arc.html">Arc</a>.  Even better, it looks like someone has done an Arc implementation for .NET/Mono called SteelArc, which will suit our embedded apps nicely.  I think the name is a take-off on IronPython.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2007/04/01/all-aboard-the-arc-bandwagon/feed</wfw:commentRss>
		</item>
		<item>
		<title>Python 3 and Growth (or the lack thereof)</title>
		<link>http://blog.snowtide.com/2007/03/28/python-growth-lack-thereof</link>
		<comments>http://blog.snowtide.com/2007/03/28/python-growth-lack-thereof#comments</comments>
		<pubDate>Wed, 28 Mar 2007 21:02:40 +0000</pubDate>
		<dc:creator>Chas Emerick</dc:creator>
		
		<category><![CDATA[Geek Commentary]]></category>

		<guid isPermaLink="false">http://blog.snowtide.com/2007/03/28/python-3in-motion</guid>
		<description><![CDATA[Paul Bissex just posted a simple three-step procedure for how one might become acquainted with the changes coming in Python 3 (née Python 3000).  The mere mention of Python 3 prompted me to start writing a comment for Paul&#8217;s post, but it went on long enough that I figured it wiser to post here.
In [...]]]></description>
			<content:encoded><![CDATA[<p>Paul Bissex just posted a <a href="http://e-scribe.com/news/351">simple three-step procedure</a> for how one might become acquainted with the changes coming in Python 3 (née Python 3000).  The mere mention of Python 3 prompted me to start writing a comment for Paul&#8217;s post, but it went on long enough that I figured it wiser to post here.</p>
<p>In understanding Python 3, I think it&#8217;s equally important (especially for those of us who might not walk on the beaten path with regard to domains, types of apps, etc) to review <a href="http://www.python.org/dev/peps/pep-3099/">PEP 3099</a>, which outlines what <span style="font-weight: bold">won&#8217;t</span> be included in Python 3.</p>
<p>Personally, reading PEPs 3099 and 3100 (which Paul references in his post) is depressing.  I&#8217;ll explain why by example and contrast.  Consider <a href="http://mail.python.org/pipermail/python-3000/2006-April/000286.html">this post from GvR</a> from about a year ago.  Quote:</p>
<p style="margin-left: 40px">But please save your breath. Programmable syntax is not in Python&#8217;s future &#8212; or at least it&#8217;s not for Python 3000. The problem IMO is that everybody will abuse it to define their own language. And the problem with that is that it will fracture the Python community because nobody can read each other&#8217;s code any more.</p>
<p>This is predictable, especially given GvR&#8217;s prior comments on various topics surrounding more &#8220;esoteric&#8221; features like multiline anonymous functions, operator overloading, etc., etc., etc.  However, compare and contrast that to <a href="http://www.rubyist.net/~matz/slides/rc2005/index.html">this slideshow from Ruby&#8217;s Matz</a> from about two years ago.  I don&#8217;t have a money quote, but the difference in attitude and approach is staggering.  There&#8217;s a line in Annie Hall (I think, or some other Woody Allen movie) where Woody&#8217;s character says that relationships are like sharks: they must continue to move forward in order to survive.</p>
<p>Now, I&#8217;m not saying that Python is dying somehow &#8212; far from it.  However, I think it&#8217;s safe to say that it has stopped growing (and hasn&#8217;t grown significantly since v2.2 with the great class/type unification).  Meanwhile, Ruby is &#8220;a white-hot nexus of innovation&#8221;, according to <a href="http://www.tbray.org/ongoing/When/200x/2007/03/25/Ruby-is-Hot">Tim Bray</a>, anyway; and really, anyone who knows and cares about what Python is lacking in terms of expressiveness and capability would agree.</p>
<p>At this point, you might fairly assume that I&#8217;m some kind of Ruby booster, but in fact, about 90% of the coding I do these days is in Python, and that has been the case for almost 3 years.  And as much as I enjoy working in Python, it has not (and looks like it will not) grow along with the problems that I need to solve.</p>
<hr/>
<strong>Part II</strong>: The feedback to this post has been significant, both in comments here, on reddit, by email, and elsewhere on the net.  You can read my summary follow up <a href="http://blog.snowtide.com/2007/04/01/python-growth-and-sandboxes">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.snowtide.com/2007/03/28/python-growth-lack-thereof/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
