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

<channel>
	<title>brian will . net &#187; Programming</title>
	<atom:link href="http://brianwill.net/blog/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://brianwill.net/blog</link>
	<description></description>
	<lastBuildDate>Mon, 25 Jan 2010 11:49:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Stop creating new languages</title>
		<link>http://brianwill.net/blog/2009/08/30/stop-creating-new-languages/</link>
		<comments>http://brianwill.net/blog/2009/08/30/stop-creating-new-languages/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 21:48:46 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=844</guid>
		<description><![CDATA[Every couple of months, an announcement for a new language pops up on ProgReddit or Hacker News, and while some of these languages might have interesting ideas, their ideas rarely justify whole new languages, so mostly these languages seem like arbitrary remixes of existing ones. Consequently, these languages’ authors often come off a bit like [...]]]></description>
			<content:encoded><![CDATA[<p>Every couple of months, an announcement for a new language pops up on <a href="http://www.reddit.com/r/programming/search?q=new+language">ProgReddit</a> or Hacker News, and while some of these languages might have interesting ideas, their ideas rarely justify whole new languages, so mostly these languages seem like arbitrary remixes of existing ones. Consequently, these languages’ authors often come off a bit like crackpots: ‘Look, everyone! I’ve rearranged the bookshelves with my new classification system. Once you master it, you’ll find browsing of biographies 6% more efficient and reshelfing of <em>auto</em>biographies <em>11</em>% more efficient! <em>*ehem*</em> Once you master it.’</p>
<p>Some observers react to this steady nuisance of quixotic pet projects by dismissing the need for better languages entirely. This is sensible in the short term because new things in programming rarely constitute big enough improvements over the day’s <em>status quo</em> to justify the transition costs. In the long run, however, it&#8217;s myopic: the languages and tools of today are generally significantly superior to what we were using a generation ago, so it&#8217;s not unreasonable to expect further significant advances.</p>
<p>In one reading of the history, though, the improvements we’ve seen in the last twenty-odd years are entirely from the realization of old ideas—automatic garbage collection, full object-orientation, functional programming, <em>etc</em>.–and so it’s claimed that no one has had any really new ideas for decades now. There’s something to this observation, but we still shouldn’t reject new languages out of hand:</p>
<ul>
<li>First, the original formulations of the old <em>ur-</em>ideas prompted many practical questions, but many of our answers to these questions still remain sketchy, leaving open the possibility of more fundamental changes to come.</li>
<li>Second, while I think it very unlikely that, at this late date, someone will identify a new programming paradigm, it always seems naïve to declare the End of History and rule out any future potential for big, transformative ideas.</li>
<li>Third, and most importantly, I don’t believe languages must only advance on big ideas, for little details matter—they add up. Even if what most new languages largely do is just rearrange the furniture for the sake of aesthetics and minor efficiencies, after a few rounds of 5% improvement, you begin to see a real qualitative difference. Python, for instance, is semantically not all that different from Perl, but what a difference sane syntax makes.</li>
</ul>
<p>So am I saying we should tolerate the crackpots? To a point. Any new language warrants major skepticism, no matter the source, but especially a language coming from an unknown. It’s for a good reason that we have a natural tendency to treat the opinions and ideas of established voices much more charitably—both in time and sympathy—than those of unknown quantities: without this bias, we’d waste a lot more time on crap than we do already, for it simply can take a lot of time and effort to discern the difference between a crackpot and someone worth listening to.</p>
<p>So as an unknown with something Important To Say, you must be very careful in how you present yourself and your ideas so as not to be dismissed as a crackpot. I have two pieces of advice. First off:</p>
<p style="padding-left: 30px;"><em>Don’t be a crackpot.</em></p>
<p>Obvious, perhaps, but surprising how many people miss this one. Second:</p>
<p style="padding-left: 30px;"><em>Be as clear as possible.</em></p>
<p>Only when reading a name-brand am I willing to accept that difficulties in comprehension are my own fault, not necessarily the author’s. Not so for an unknown. If James Joyce hadn’t written <em>Dubliners</em>, it’s doubtful anyone would ever have read <em>Finnegan’s Wake,</em> let alone called it brilliant.</p>
<p>In the particular case of introducing a new programming language, it’s especially critical to be very clear about the problems your language addresses. What’s the point of this thing? How is it supposedly actually better? Before I continue reading what you have to say, I want to know that you’re not just re-arranging the furniture.<sup>1</sup></p>
<p>So it’s with full awareness and trepidation that I admit that I, too, have tried my hand at designing a programming language. Following my own advice, I’ll try to be up front about what I’m pushing: a Lisp people will actually learn and use.<sup>2</sup></p>
<p>Here’s what I want in a Lisp, in order of ambition:</p>
<ul>
<li><strong>Easy to learn:</strong> The standard dialects of Lisp tend to be taught ineffectually and tend to be unnecessarily confusing. (Yes, that includes Scheme.) I won’t go in to details here, but suffice it to say that <em>ease of learning really matters</em>—not just for the sake of getting more people to use the language, but for the sake of getting those who use the language to truly understand it.</li>
<li><strong>Readable syntax: </strong>As everyone knows, Lisp has a problem with parentheses. Proponents argue that you just get used to it, and this is true, but the preponderance of parentheses constitutes a lot of line noise that I believe hinders readability (and editability) even for experienced eyes. Additionally, some Lisp dialects get a bit too noisy with reader macros, such as having the apostrophe for quoting all over the place. Furthermore, I find that the irregularity of the standard indentation style of current Lisps is unnecessarily difficult for learners to grok and leaves too much to stylistic choice.</li>
<li><strong>Syntax highlighting, code assist, and assisted refactoring: </strong>Programmers working in Java and C# have become much accustomed to conveniences that keep their code neat, that provide quick access to documentation, and that free them from having to remember minute details such as type taxonomies, function signatures, and precise identifier names. Providing those same conveniences in a dynamic language is much more challenging and error prone because something as simple as renaming an identifier often requires that the tools make risky assumptions about what’s going on at runtime. Up to now, solutions to this problem have relied upon very sophisticated code analysis that still doesn’t work right much of the time. I believe there’s a simpler solution.</li>
<li><strong>Push-button debugging:</strong> Programmers working in Java and C# become accustomed to no-hassle debugging, where setting a breakpoint requires just a click and where the IDE takes you through the code as you step through. This level of ease is lacking in most other languages, but especially in Lisp, where macros complicate the process.</li>
<li><strong>Embedded data: </strong>Lisp’s tree-based syntax makes it usable as a structured-data format, meaning we don’t have to punt data into a separate format, such as XML or JSON. Instead, data can be expressed in Lisp using an ordinary library rather than a special syntax that requires special processing and tools. This could spare us from perverse data languages, like XSLT, which inevitably contort into full-fledged—and crappy—programming languages. The trouble is that standard Lisp syntax doesn’t work well for data dominated by text, <em>i.e.</em> documents. So, for instance, while you might use a current Lisp in place of JSON, you probably wouldn’t use one in place of HTML.</li>
<li><strong>Embedded languages: </strong>While some languages arguably shouldn’t exist at all (some haters say this about Java, for instance), other languages, like C and C++, clearly exist for a reason. But the fact that these languages fill necessary <em>semantic</em> niches doesn’t mean that they need their own <em>syntaxes</em>: instead, the right dialect of Lisp could “host” the complete semantics of a foreign language as a library. Consider a C program, which is typically written as a mish-mash of C code, preprocessor directives, and build files (makefiles, <em>etc.</em>). We could create a Lisp library that allows us to write C semantics in Lisp and produces the same end product (executables and object code) but which would elegantly integrate the equivalent functionality of the preprocessor and build chain in a way that is cleaner, more flexible, and easier to learn. If a way can be found for Lisp syntax and macros to provide the ideal amount of syntactical concision for all possible languages, future language designers can forget about syntax and just focus on semantic innovations.<sup>3</sup></li>
</ul>
<p>Now, as it turns out, the Lisp I want in all other respects resembles Clojure, so really what I’m proposing is specifically a Clojure dialect. In fact, implementation of my dialect won’t require much more than swapping out Clojure’s reader, wrapping some of its macros and functions, adding one or two data types, and creating editor assistance.</p>
<p>I’m calling my Clojure dialect <em>Animus</em>. Animus is still very much in flux, but I describe it in its current form <a href="http://brianwill.net/docs/animus.htm">here</a>. Also take a look at <a href="http://brianwill.net/docs/animus-embedding-test.htm">some experiments</a> with various languages to see what they might look like embedded in Animus.</p>
<ol class="footnotes"><li id="footnote_0_844" class="footnote">Or at least, if you <em>are</em> just rearranging furniture, I’d much rather you be honest about it: if you yourself realize that that’s what you’re doing, then you at least have a chance of delivering an actual—if small—improvement to the <em>status quo</em>.</li><li id="footnote_1_844" class="footnote">This isn’t actually what I set out to design. When I first started thinking about a language a few years ago, my favorite language was Python, and I didn’t know Lisp, so for a long time I was simply thinking of ways to improve upon Python. At some point, I accepted the idea of prefix notation and macros, and things progressed from there.</li><li id="footnote_2_844" class="footnote">Haskell strikes me as language that could greatly benefit from embedding in Lisp. The few times I’ve attempted to pick up Haskell, I’ve been offended by the ridiculous Perl-like syntax of <em>ad hoc</em> convenience piled upon <em>ad hoc</em> convenience. If there’s something worthy in Haskell’s semantic model, it’s obscured under a mess of syntax.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2009/08/30/stop-creating-new-languages/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A beginner&#8217;s first programming language</title>
		<link>http://brianwill.net/blog/2009/05/27/a-beginners-first-programming-language/</link>
		<comments>http://brianwill.net/blog/2009/05/27/a-beginners-first-programming-language/#comments</comments>
		<pubDate>Wed, 27 May 2009 16:32:51 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Education]]></category>
		<category><![CDATA[Learn Programming]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=448</guid>
		<description><![CDATA[I&#8217;ve finally put together and posted the video of part 1 of my introduction to programming. This first part presents a simple programming language to users in about 70 minutes.

UPDATE: I&#8217;ve also now added the second part, which covers representing numbers as bits.

The remaining eight or so parts will have to wait until I devise [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve finally put together and posted the <a href="http://www.youtube.com/view_play_list?p=2F1485C69B311408">video of part 1 of my introduction to programming</a>. This first part presents a simple programming language to users in about 70 minutes.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/p/2F1485C69B311408&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/p/2F1485C69B311408&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>UPDATE: I&#8217;ve also now added the <a href="http://www.youtube.com/view_play_list?p=F53769BC814C6327">second part</a>, which covers representing numbers as bits.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/p/F53769BC814C6327&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/p/F53769BC814C6327&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>The remaining eight or so parts will have to wait until I devise a better process for turning my slides and narration into video.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2009/05/27/a-beginners-first-programming-language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clojure introduction video; Pigeon on hiatus</title>
		<link>http://brianwill.net/blog/2009/04/19/clojure-introduction-video-pigeon-on-hiatus/</link>
		<comments>http://brianwill.net/blog/2009/04/19/clojure-introduction-video-pigeon-on-hiatus/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 11:34:32 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Education]]></category>
		<category><![CDATA[Learn Programming]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=190</guid>
		<description><![CDATA[I&#8217;ve created an hour long introduction video to Clojure, a new dialect of Lisp.
I&#8217;ve also decided to leave unfinished my implementation of Pigeon, my pedagogic programming language, even though it would take a trivial amount of work to complete. I now think that it&#8217;s not really important for students to actually run Pigeon code; in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve created <a href="http://www.youtube.com/view_play_list?p=AC43CFB134E85266&amp;playnext=1&amp;playnext_from=PL&amp;v=Aoeav_T1ARU">an hour long introduction video</a> to <a href="http://clojure.org">Clojure</a>, a new dialect of Lisp.</p>
<p>I&#8217;ve also decided to leave unfinished my implementation of Pigeon, my pedagogic programming language, even though it would take a trivial amount of work to complete. I now think that it&#8217;s not really important for students to actually <em>run</em> Pigeon code; in fact, I think it best to discourage students from writing anything beyond a trivial amount of code in Pigeon lest they waste time rather than just moving on to later material.</p>
<p>Instead, my focus now is on creating a course of videos for total newbs to programming, totaling about 10 hours and running in this sequence:</p>
<ul>
<li>A first language (a run through of Pigeon)</li>
<li>Numbers (how numbers are represented as bits)</li>
<li>Text and images (how they are represented as bits)</li>
<li>The system (hardware and OS basics)</li>
<li>Language and tools survey</li>
<li>Javascript (<em>sans</em> browser)</li>
<li>The internet and the web</li>
<li>HTML / CSS / Javascript (in browser)</li>
<li>The command line and Unix environment</li>
<li>C</li>
<li>Data structures and algorithms</li>
<li>OOP</li>
<li>Java</li>
<li>Encryption, security, and compression</li>
<li>GUI Toolkits (Swing?)</li>
<li>Version control</li>
<li>Databases</li>
</ul>
<p>I&#8217;m processing the audio and video for the first two, but that leaves a lot of work as I only have sketches of the remaining parts.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2009/04/19/clojure-introduction-video-pigeon-on-hiatus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The naturalistic (language) fallacy revisited</title>
		<link>http://brianwill.net/blog/2009/01/05/the-naturalstic-language-fallacy-revisited/</link>
		<comments>http://brianwill.net/blog/2009/01/05/the-naturalstic-language-fallacy-revisited/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 04:45:50 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Learn Programming]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=134</guid>
		<description><![CDATA[The comments to this y.combinator item add to what I said here. In particular, commenter apinstein writes:
I used to do a lot of AppleScript programming. When I initially learned about the &#8220;natural&#8221; syntax I though &#8220;this is gonna be so easy!&#8221; But ultimately it works against you.
Computers are very precise beasts, and they need to [...]]]></description>
			<content:encoded><![CDATA[<p>The comments to <a href="http://news.ycombinator.com/item?id=420226">this y.combinator item</a> add to what I said <a href="http://brianwill.net/blog/2007/05/26/the-naturalistic-language-fallacy/">here</a>. In particular, commenter <em>apinstein</em> writes:</p>
<blockquote><p><span class="comment">I used to do a lot of AppleScript programming. When I initially learned about the &#8220;natural&#8221; syntax I though &#8220;this is gonna be so easy!&#8221; But ultimately it works against you.</span></p>
<p>Computers are very precise beasts, and they need to know exactly what you want them to do. The looser the &#8220;syntax&#8221; gets, the more guesses the compiler has to make to come up with a set of precise instructions.</p>
<p>What I initially thought would be easy and liberating turned out to be a total PITA. AppleScript programming is horrible. Ultimately there is an underlying syntax, but it&#8217;s harder to remember because it&#8217;s less consistent (ie &#8220;natural&#8221;). I had to spend way too much time trying to understand what goofy &#8220;natural&#8221; grammar I had to use to get it to do what I wanted.</p>
<p>Even if you assume an &#8220;ideal AI,&#8221; I still don&#8217;t think that a natural language syntax is a good idea, since language itself has a lack of specificity that requires even an &#8220;ideal AI&#8221; to make guesses that could be logically wrong.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2009/01/05/the-naturalstic-language-fallacy-revisited/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teach the (other) controversy</title>
		<link>http://brianwill.net/blog/2008/05/31/teach-the-other-controversy/</link>
		<comments>http://brianwill.net/blog/2008/05/31/teach-the-other-controversy/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 03:03:41 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Learn Programming]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=86</guid>
		<description><![CDATA[My programming education began when I took a C language course at the local community college. I can still recall how strange I found the language&#8217;s rules about when I could and couldn&#8217;t use a variable (e.g. variables declared in one function can&#8217;t be read or modified in others), for it seemed to me this [...]]]></description>
			<content:encoded><![CDATA[<p>My programming education began when I took a C language course at the local community college. I can still recall how strange I found the language&#8217;s rules about when I could and couldn&#8217;t use a variable (<em>e.g.</em> variables declared in one function can&#8217;t be read or modified in others), for it seemed to me this made writing programs far harder than they would be otherwise. Combine this confusion with the syntactical kruft of C and the fact that I took my instructor&#8217;s prohibition against global variables to mean <em>never </em>use globals (something I later learned real world C programs of non-trivial size don&#8217;t actually do), and the result was that I ended up totally paralyzed, baffled as to how programmers ever got anything to work. For these and a few other reasons, I basically abandoned programming entirely before taking it up again two years later, this time studying independently from books.</p>
<p>Somehow, some very basic ideas in programming just didn&#8217;t click upon my first learning attempt even though I now find these ideas very simple and clear. While my C instructor was mostly competent, he failed to focus on the vital &#8216;why&#8217;. Why does the language make me do this? Why is the syntax like this? <em>Etc.</em> Unfortunately, it&#8217;s too easy for learners to give up on &#8216;why&#8217; because so few sources out there&#8212;teachers, books, blog posts&#8212;provide clear, accurate, complete answers to the &#8216;why&#8217; questions (and far too many sources aren&#8217;t too hot on the &#8216;what&#8217;s or &#8216;how&#8217;s, either). Why do modern computers use 8-bit bytes? Why do we need to allocate memory? Why are exceptions expensive performance-wise? Many decent, working programmers out there simply have no idea how to answer questions like these. The really bad ones wouldn&#8217;t understand the answers or care if you tried educating them.</p>
<p>Recently, I&#8217;ve realized that the biggest, most common failing of programming education is the tendency to teach a technical matter as a solution in search of a problem&#8212;as a mechanism without a &#8216;why&#8217;. A great example is generics in Java, which are so convoluted that their explanation takes up a good quarter of a full treatment of the Java language. Absorbing all the subtle rules and asymmetries of Java generics typically distracts students from a critical understanding of why generics exist in the language in the first place. I would go so far to say that <strong>the fact that Java got on fine for many years without generics is the first and most important thing a student should know about generics</strong>. Only <em>after</em> well establishing what perceived problems generics were meant to address should students learn what generics are and how they work, and then it&#8217;s critical that this be followed up by exposure to dissenting arguments against generics.</p>
<p>You might assume confronting learners with controversy up front will lead to confusion, but on the contrary it <strong>gives a clearer presentation because it is more honest</strong>. Lies, hype, and wishful thinking tend to be incoherent and therefore perhaps impossible to be understood by anyone not already versed in the truth. Furthermore, teaching controversy has the benefit of putting students in a critical mindset, <em>e.g.</em> if the dominant languages of the day may harbor serious mistakes about which it&#8217;s OK to have your own opinion, maybe the whole basis of programming is neither set in stone nor out of reach for you to one day fully understand computing and to one day have a hand in directing the course of computing&#8217;s future development.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2008/05/31/teach-the-other-controversy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Piled Heap of Poo</title>
		<link>http://brianwill.net/blog/2008/05/24/piled-heap-of-poo/</link>
		<comments>http://brianwill.net/blog/2008/05/24/piled-heap-of-poo/#comments</comments>
		<pubDate>Sat, 24 May 2008 12:14:43 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=127</guid>
		<description><![CDATA[Anti-PHP screed #34019. For those of us who&#8217;ve only glanced at PHP, both interesting and distrubing.
My favorite bit, though, is an in passing quote from a C course the author took: “German Umlaute don’t work in C, so don’t use them”.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://maurus.net/resources/programming-languages/php/">Anti-PHP screed #34019.</a> For those of us who&#8217;ve only glanced at PHP, both interesting and distrubing.</p>
<p>My favorite bit, though, is an in passing quote from a C course the author took: “German Umlaute don’t work in C, so don’t use them”.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2008/05/24/piled-heap-of-poo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Video of talk on Pigeon</title>
		<link>http://brianwill.net/blog/2008/05/18/video-of-talk-on-pigeon/</link>
		<comments>http://brianwill.net/blog/2008/05/18/video-of-talk-on-pigeon/#comments</comments>
		<pubDate>Sun, 18 May 2008 10:45:40 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Education]]></category>
		<category><![CDATA[Learn Programming]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=125</guid>
		<description><![CDATA[Last month at LugRadio Live USA 2008 in San Francisco, I gave a talk discussing programming education and Pigeon, my learner&#8217;s programming language. Videos of all the talks at LugRadio Live are going up. Below is my talk, which you can also download. (I occasionally mumble a few key words. Sorry.)
The current status of Pigeon [...]]]></description>
			<content:encoded><![CDATA[<p>Last month at LugRadio Live USA 2008 in San Francisco, I gave a talk discussing programming education and <a href="http://code.google.com/p/pigeon-programming-language/">Pigeon</a>, my learner&#8217;s programming language. Videos of all the talks at LugRadio Live are <a href="http://lugradio.org/live/USA2008/schedule">going up</a>. Below is my talk, which you can also <a href="http://www.archive.org/details/LRL_USA_2008_Pigeon">download</a>. (I occasionally mumble a few key words. Sorry.)</p>
<p>The current status of Pigeon is that I still haven&#8217;t bothered to put the finishing touches on it for it to be actually usable, as I&#8217;m currently working on the material for students to learn Python after learning Pigeon. Until I give learners some plausible place to go after Pigeon, I figure I can put off finishing up Pigeon itself.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="402" height="310" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="id" value="VideoPlayback" /><param name="src" value="http://video.google.com/googleplayer.swf?docid=-294945751119165731&amp;hl=en" /><embed id="VideoPlayback" type="application/x-shockwave-flash" width="402" height="310" src="http://video.google.com/googleplayer.swf?docid=-294945751119165731&amp;hl=en"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2008/05/18/video-of-talk-on-pigeon/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UML sucks</title>
		<link>http://brianwill.net/blog/2008/05/16/uml-sucks/</link>
		<comments>http://brianwill.net/blog/2008/05/16/uml-sucks/#comments</comments>
		<pubDate>Sat, 17 May 2008 00:23:06 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/?p=123</guid>
		<description><![CDATA[Everything said here.
I&#8217;ll just add that pictorial representation of code is fundamentally flawed because it inevitably means drawing a bunch of boxes and connective lines all over the place. Just as there&#8217;s no one true way to distribute your functions and classes in text, there is no true optimum 2D layout for boxes representing functions [...]]]></description>
			<content:encoded><![CDATA[<p>Everything said <a href="http://littletutorials.com/2008/05/15/13-reasons-for-umls-descent-into-darkness/">here</a>.</p>
<p>I&#8217;ll just add that pictorial representation of code is fundamentally flawed because it inevitably means drawing a bunch of boxes and connective lines all over the place. Just as there&#8217;s no one true way to distribute your functions and classes in text, there is no true optimum 2D layout for boxes representing functions and classes. No algorithm does this layout well enough to not need human reworking. Every good diagram of any complexity you&#8217;ve ever seen, whether of code or of a subway system, has been heavily hand-massaged if not entirely hand-generated. Even if you had a decent algorithm for layout, the layout it computes might change radically each time you add a box or connection, which would be disorienting in the same way as if someone were to rearrange your workspace behind your back. A big part of what it means to be comfortable with a codebase is knowing where most things are. How familiar can you ever be if the codebase gets constantly scrambled? The only solution is to have the coder position all the boxes and draw the connections manually, but this will just mean that systems will get uglier and uglier as they grow and that refactoring the layout will grow more and more painful.</p>
<p>Text to some degree has these problems too, for you have to decide which file to put a function or class in, and you must then decide how to order the functions and classes of each file. But in text, you aren&#8217;t burdened with the stylistic choice of how to draw connections: everything has a proper name, and you make connections by using the proper name, end of story. Making connections pictorially is only simple if you stick to straight lines, which typically makes the diagram much harder to read than were the connections cleverly grouped and routed along the cardinal directions. Text code with many connections is complicated but readable; diagrammed code with many connections is complicated but totally <em>un</em>readable. The <em>whole point</em> of diagramming code is to visualize connections, to see the shape of a design, but past a rather low level of complexity, the visualization is too much to mentally process.</p>
<p>In sum, stick to code for code. Use diagrams only for broad communication, and use them only when they are understood to be lies.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2008/05/16/uml-sucks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Subtlety hinders grokability</title>
		<link>http://brianwill.net/blog/2008/03/17/subtlety-hinders-grokability/</link>
		<comments>http://brianwill.net/blog/2008/03/17/subtlety-hinders-grokability/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 14:29:16 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Learn Programming]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/2008/03/17/subtlety-hinders-grokability/</guid>
		<description><![CDATA[Here&#8217;s some nice paragraphs recycled from an old crappy post no longer worth reading.
In C, the conceptual and syntactical distinction between definitions and declarations is blurred. This is a prime example of a misguided attempt at conceptual unity in design.
I think what goes on in designers&#8217; heads is that they spend their time juggling many [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0in"><em>Here&#8217;s some nice paragraphs recycled from an <a href="http://brianwill.net/blog/2007/02/11/pygeonc-function-declarationsdefinitions-and-function-pointers/">old crappy post no longer worth reading</a>.</em></p>
<p style="margin-bottom: 0in">In C, the conceptual and syntactical distinction between definitions and declarations is blurred. This is a prime example of a misguided attempt at conceptual unity in design.</p>
<p style="margin-bottom: 0in">I think what goes on in designers&#8217; heads is that they spend their time juggling many parts around, mentally banging the parts together to see which fit with which and which overlay the others, and then occasionally, in moments of revelation, the designer sees how parts they were thinking of as separate can be neatly overlayed, interlocked, or even <em>dissolved into one</em>, greatly simplifying the design. A small minority of the time, these revelatory moments really pan out just like they seem they will in that initial flash of recognition. However, most of these moments come to nothing when it later turns out that, upon further reflection, the idea doesn’t really make sense or fit consistently with the rest of the design. Other times, refactoring the rest of the design to fit the revelatory idea actually makes the whole more complicated. Other times, the idea can be accommodated just fine, but the gain is just an illusion: the designer, unhappy with some trade off, finds a solution that seems to dissolve that trade off, but euphoria blinds the designer to some side-effect introduced by his solution; on any other day, this new problem would displease the designer just as much as the problem he’s just solved, but he just isn’t thinking about it at the moment—maybe he’ll notice in a week or two.</p>
<p style="margin-bottom: 0in">I believe the misguided attempts at conceptual unity in C that displease me so are actually partly examples of success: after all, the conceptual unities of C ‘work’ in the sense that (obviously) they comprise a real working language and the sense that the conceptual unities do in fact reduce the syntax (<em>e.g.</em> pointer and array declaration syntax mirrors the syntax for dereferencing and array indexing). Still, these design choices also exhibit the designer euphoria blindness I described: aspects of the design have been simplified, but only by incurring disregarded costs elsewhere. In this case, the costs are to language transparency: these supposed conceptual unities in C are difficult to convey to outsiders because they <em>really only make sense to people who already understand them</em>. Having read many accounts of the C language, I’ve come to the conclusion that many of the traditional stories and vocabulary which C programmers use to talk about the language to each other simply fail to account for what is really going on in the language. Really, this is an unfortunate fact of any area of expertise: the experts are already cognizant of what’s really going on, so it’s fine for communication amongst themselves if their explanations and vocabulary abridge or misrepresent to untrained ears what they’re actually saying, but these inaccurate utterances are profound barriers to the uninitiated.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2008/03/17/subtlety-hinders-grokability/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>No, Mr. Perl, I expect you to die</title>
		<link>http://brianwill.net/blog/2008/02/28/no-mr-perl-i-expect-you-to-die/</link>
		<comments>http://brianwill.net/blog/2008/02/28/no-mr-perl-i-expect-you-to-die/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 20:16:19 +0000</pubDate>
		<dc:creator>Brian Will</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brianwill.net/blog/2008/02/28/no-mr-perl-i-expect-you-to-die/</guid>
		<description><![CDATA[Steve Yegge on Perl
UPDATE: Oops, apparently it&#8217;s from 2004. Still good, though.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://steve.yegge.googlepages.com/ancient-languages-perl">Steve Yegge on Perl</a></p>
<p>UPDATE: Oops, apparently it&#8217;s from 2004. Still good, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianwill.net/blog/2008/02/28/no-mr-perl-i-expect-you-to-die/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
