<?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>Perlblogs &#187; ruby</title>
	<atom:link href="http://perlblogs.com/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://perlblogs.com</link>
	<description>Posts from selected Perl bloggers</description>
	<lastBuildDate>Mon, 06 Feb 2012 20:47:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Your EDSL is only Pretty in Stockholm</title>
		<link>http://www.modernperlbooks.com/mt/2011/01/your-edsl-is-only-pretty-in-stockholm.html</link>
		<comments>http://www.modernperlbooks.com/mt/2011/01/your-edsl-is-only-pretty-in-stockholm.html#comments</comments>
		<pubDate>Wed, 26 Jan 2011 18:02:29 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[catalyst]]></category>
		<category><![CDATA[languagedesign]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl5]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[programminglanguages]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rants]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Disclaimers: Catalyst chained dispatching is great Dave Rolsky is a fantastic, underpraised hacker, a great guy, and one of the first people to say that an interface or implementation could use improvement Martin Fowler is smart and a deep thinker...]]></description>
			<content:encoded><![CDATA[
        <p>Disclaimers:</p>

<ul>

<li><a href="http://search.cpan.org/perldoc?Catalyst::DispatchType::Chained">Catalyst chained dispatching</a> is great</li>

<li><a href="http://blog.urth.org/">Dave Rolsky</a> is a fantastic, underpraised hacker, a great guy, and one of the first people to say that an interface or implementation could use improvement</li>

<li><a href="http://www.martinfowler.com/">Martin Fowler</a> is smart and a deep thinker</li>

<li>I <em>like</em> <a href="http://search.cpan.org/perldoc?MooseX::Declare">MooseX::Declare</a> and its ilk</li>

<li>I don't object to what these systems <em>do</em>; I question <em>how</em> they do it</li>

<li>If it makes sense for you&mdash;if you've thought about the benefits and drawbacks and the benefits outweigh the drawbacks and costs&mdash;use it with no quibbles or qualms on my part. I do sometimes.</li>

</ul>

<p>Your embedded so-called "domain specific language" is only pretty if <a href="http://www.archive.org/details/thesybioneseliberationarmy">your language's liberation army</a> has kidnapped and brainwashed you so long ago that your notion of beauty and concision is horribly warped.</p>

<p>To wit:</p>

<pre><code>  use CatalystX::Routes;

  BEGIN { extends 'Catalyst::Controller'; }

  # /user/:user_id

  chain_point '_set_user'
      =&gt; chained '/'
      =&gt; path_part 'user'
      =&gt; capture_args 1
      =&gt; sub {
          my $self = shift;
          my $c    = shift;
          my $user_id = shift;

          $c-&gt;stash()-&gt;{user} = ...;
      };</code></pre>

<p>... is not particularly pretty. It may make the <em>intent</em> of the
declaration of routing clearer than the alternative:</p>

<pre><code>sub _set_user :Chained('/') :PathPart('user') :CaptureArgs(1)
{
    my $self = shift;
    my $c    = shift;
    my $user_id = shift;

    $c-&gt;stash()-&gt;{user} = ...;
}</code></pre>

<p>... but suggesting that it's pretty goes a bit far.  I don't have many
<em>better</em> syntaxes in mind, but if I could remove the inline <code>=&gt;
sub { ... }</code> and the need for fat arrows everywhere, I would. Something
like this might be more aesthetically pleasing:</p>

<pre><code>chained:      /
path_part:    user
capture_args: 1
method _set_user($c, $user_id)
{
    ...
}</code></pre>

<p>... although it might be fun to write:</p>

<pre><code>method _set_user($c, $user_id)
as user, chained to /, capturing one arg
{
    ...
}</code></pre>

<p>... if route declarations must be in the same file or attached to the same
method as declarations.  Then again, the Catalyst debugging syntax is awfully clear:</p>

<pre><code>/<user>/*</code></pre>

<p>Perl 5 is hardly the only offender in the syntax department though.  Here's
<a href="http://code.activestate.com/recipes/534150/">a so-called embedded DSL
in Python 2</a>:</p>

<pre><code>with create_table("Employee") as t:
    t.first_name = {"type" : "char", "length" : 30 }
    t.last_name  = {"type" : "char", "length" : 30 }
    t.age        = {"type" : "int"}</code></pre>

<p>To whom is this nicer than SQL?  (You'd almost think someone had already
created a language specific to the domain of describing relational data
structures.)</p>

<p>Somehow Ruby fans fail to notice the baffling need to sprinkle syntax all
over their tooth-decaying sugar, as in <a href="http://cukes.info/">Cucumber</a>, where you get the illusion of writing test specifications in plain English as well as the absolute joy of writing and maintaining regular expressions to extract the <em>necessary</em> data from them.</p>

<p>That's right, the important data structure in your test suite is <a
href="http://www.modernperlbooks.com/mt/2010/10/structured-data-and-knowing-versus-guessing.html">semi-structured
text</a>:</p>

<pre><code>Feature: Addition
  In order to avoid silly mistakes
  As a math idiot
  I want to be told the sum of two numbers

  Scenario Outline: Add two numbers
    Given I have entered &lt;input_1&gt; into the calculator
    And I have entered &lt;input_2&gt; into the calculator
    When I press add
    Then the result should be &lt;output&gt; on the screen

  Examples:
    | input_1 | input_2 | output |
    | 20      | 30      | 50     |
    | 2       | 5       | 7      |
    | 0       | 40      | 40     |</code></pre>

<p>... and you still have to parse it yourself, in an ad hoc fashion:</p>

<pre><code>Given /I have entered (.*) into the calculator/ do |n|
    calculator = Calculator.new
    calculator.push(n.to_i)
end</code></pre>

<p>There's a cleverness there to be sure, but is that really the best the
programming world can provide?</p>

<p>Lisps fare little better, where outside of Dylan, every Lisp program ends up
looking like every other Lisp program. At least XSLT had the good grace to
reveal that homoiconicity means that ugly languages make for programs that are
ugly to the bone.</p>

<p>Designing great languages is difficult. That's one reason why there are so many languages. If the best you can do as the writer of a so-called embedded dynamic language is to find some corner cases in the syntax of your host language then sprinkle regular expressions around, you haven't done much at all. (Tell me a non-programmer is always going to follow Cucumber's "But it's only semi-structured plain text, it's so eeeeeeeeeezy to write!" semi-structured format in a way that your ad hoc regular expressions always match perfectly, and I'll show you non-programmers who write their plain-text behaviors in Microsoft Word.)</p>

<p>Again, if these tools make your life easier, great. I use them sometimes
myself. I just don't dislocate my shoulder patting myself on the back for my
cleverness in doing so. Maybe some of the energy spent trying to twist a host
language into not looking like the host language would be better spent writing
simpler, more fluent interfaces in the dominant and effective idioms&mdash;if
not writing <em>actual</em> new domain-specific languages, with parsers and
everything.</p>
        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2011/01/26/your-edsl-is-only-pretty-in-stockholm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Language Kumquat Count Comparisons</title>
		<link>http://www.modernperlbooks.com/mt/2010/12/language-kumquat-count-comparisons.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/12/language-kumquat-count-comparisons.html#comments</comments>
		<pubDate>Wed, 22 Dec 2010 18:34:10 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[cobol]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programminglanguages]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Counting Perl Modules is half serious and half satire. I should know better than to publish satire. (Someday someone will invent an Internet populated only by people who know that Jonathan Swift was not the Western world's best known host...]]></description>
			<content:encoded><![CDATA[
        <p><a
href="http://www.modernperlbooks.com/mt/2010/12/counting-modules.html">Counting
Perl Modules</a> is half serious and half satire.  I should know better than to
publish satire.  (Someday someone will invent an Internet populated only by
people who know that Jonathan Swift was not the Western world's best known host
of <strike>Donner</strike> dinner parties, but that hasn't happened yet.)</p>

<p>Getting an accurate count of the number of distinct modules on the CPAN is useful, but it's insufficient to compare the awesomeness of Perl to the fauxhawked machismo of Ruby to the humorless pseudocode-spewing Cylonification of Python to the cubist performance art of PHP.</p>

<p>Why?</p>

<p>Because <em>what is a module and what does it represent</em>?</p>

<p>In Perl 5, a module is a namespace.  It may or may not contain code.  It may or may not contain data.  It may or may not exist in its own file.  It may or may not be part of a bundle of other modules.  It may or may not be useful on its own.</p>

<p>Count all of those up on the CPAN and compare them to the count of classes or packages or gems or eggs or copy and paste snippets for other languages, and you can learn... well, not <em>nothing</em> but not much useful.</p>

<p>You may as well compare the utility of (say) code written in Java to the
same code written in Forth, despite the fact that Java's capability for
abstraction begins and ends with the idea that everything in the world is a
class or an instance of a class (except for those nasty primitives, and what
are you, some sort of anti-business Smalltalk hippie anyway!) and that Forth's
capability for abstraction is really good Forth programmers who create their
own little languages that look and act like Forth but better, at least for
their specific problem domains.</p>

<p>Oh, and a Perl 5 module may or may not be a class and it may or may not export a procedural interface and it may or may not be primarily documentation.</p>

<p>You may as well compare the goodness of two comparable modules chosen
randomly from two languages with regard to use of standard language features,
standard library features, and re-use of other modules, because ... well, it
all depends, doesn't it?  Sometimes the standard library is weak in one area,
or one language lacks a feature of abstraction critical to another language, or
there's clearly one really good way to do something in one language (Perl's <a
href="http://search.cpan.org/perldoc?DBI">DBI</a>) and someday a standard might
evolve and slowly spread through the ecosystem including a morass of hosting
providers (PHP's database access layers).</p>

<p>... or what if one language has one more-or-less blessed way of doing
something (Python's Django) and a small handful of alternate approaches or one
obvious first choice to consider to do things (Perl's Catalyst) and a larger
handful of worthy approaches or is in fact itself the primary way people do
things (PHP) or overshadows other projects in the language so dramatically
(Rails)?</p>

<p>... or what if one repository is primarily applications and one is reusable components, or one is a vast swath of untested abandonware ripped out of three-commit Git projects and another has an annual refresh rate of 30% and millions of test reports every year?</p>

<p>If you still insist on measuring your value as a person by comparing incomparables between your favorite language and the barbarian mutterings of those unwashed Philistines who {like sigils|hate sigils|love blocks|couldn't indent their code with a tab key and a flashlight|smell of body spray|know how to read documentation|haven't upgraded to a newer version yet|deprecated an insecure feature you relied on anyway|do it like Java|don't do it like Java|have a mustache|aren't Danish|aren't Dutch}, you might despair and consider returning to the time-honored practice of counting the number of mentions on the Internet of a random moniker sometimes and somehow related to the name of your languages&mdash;but resist that temptation, for That Is Obviously Bad Epistemology.</p>

<p>You might as well count the lines of code written in each language to find
the bestest, most gratifyingest language in which only real, true programmers
program.</p>

<p>I hope to see you all at Yet Another COBOL Conference 2011.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/12/22/language-kumquat-count-comparisons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Counting Modules</title>
		<link>http://www.modernperlbooks.com/mt/2010/12/counting-modules.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/12/counting-modules.html#comments</comments>
		<pubDate>Mon, 20 Dec 2010 18:52:46 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A new website modulecounts.com compares the number of extension modules for Perl, PHP, Python, and Ruby. Unfortunately, it's wrong. That's not necessarily the fault of the website, but the graph and the extrapolation on the graph make Ruby's momentum with...]]></description>
			<content:encoded><![CDATA[
        <p>A new website <a href="http://www.modulecounts.com/">modulecounts.com</a> compares the number of extension modules for Perl, PHP, Python, and Ruby.  Unfortunately, it's wrong.</p>

<p>That's not necessarily the fault of the website, but the graph and the
extrapolation on the graph make Ruby's momentum with gems look all but
unbeatable.  That's wrong too.</p>

<p>CPAN's number (as of today) is 18936 modules, which corresponds closely with the number on <a href="http://www.cpan.org/">www.cpan.org</a>.  You can forgive someone not closely associated with the Perl 5 community for thinking that number represents all of CPAN.</p>

<p>In truth, it represents <a href="http://www.cpan.org/modules/01modules.index.html">the CPAN modules list</a>&mdash;specifically the <a href="http://www.cpan.org/modules/00modlist.long.html"><em>registered</em> modules list</a>.  The important notice on that page says:</p>

<blockquote>This Perl 5 Registered Module List <em>document</em> is currently <em>not being maintained</em> and is several years out of date.</blockquote>

<p><a href="http://search.cpan.org/">search.cpan.org</a> provides a much better set of numbers: 21585 distributions and 88698 modules.  Almost 80% of the modules available on CPAN are <em>not</em> on the registered list.</p>

<p>What's the registered list?  Back in the day, when you uploaded a new distribution on the CPAN, community standards suggested that you should choose a location in the module naming hierarchy and that you should describe your upload with a short code of metadata to indicate the support level, the type of interface, and the like.  This was/is the <a href="http://www.cpan.org/modules/00modlist.long.html#ID1_ModuleListi">DSLIP code</a>.</p>

<p>Some experienced CPAN authors might even remember DSLIP codes; they're used
even less often than the initial hierarchy of the CPAN index.  Registering
modules is much less useful than merely uploading them and letting people
search for them by name and description with search.cpan.org.</p>

<p>To summarize, the module count on www.cpan.org represents a fraction of the
available modules available on the CPAN because it only counts modules which
the uploaders have bothered to register with the registered module list.  You
can write a lot of great modern Perl code while using unregistered modules.
There's no correlation between appearance on the module list and quality or
utility, except that most of the registered modules are likely older projects
first uploaded when the registered module list and DSLIP codes were used more
widely.</p>

<p>Any count of CPAN modules should use the numbers from search.cpan.org
instead of cpan.org.  I've submitted <a
href="https://github.com/edebill/modulecounts/pull/1">a pull request to update
the sources of the CPAN module counts for modulecounts.com</a>.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/12/20/counting-modules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reinventing the Axle</title>
		<link>http://www.modernperlbooks.com/mt/2010/10/reinventing-the-axle.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/10/reinventing-the-axle.html#comments</comments>
		<pubDate>Mon, 25 Oct 2010 18:58:59 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[ctypes]]></category>
		<category><![CDATA[factor]]></category>
		<category><![CDATA[ffi]]></category>
		<category><![CDATA[freesoftware]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[libraries]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[nci]]></category>
		<category><![CDATA[Parrot]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[... or A Modest Proposal for Dynamic Language Bindings I've worked on a few shared library bindings for various dynamic languages: several libraries for Parrot, a few for Perl 5, and one for Ruby. I've embedded Perl 5 and I've...]]></description>
			<content:encoded><![CDATA[
        <p><em>... or A Modest Proposal for Dynamic Language Bindings</em></p>

<p>I've worked on a few shared library bindings for various dynamic languages: several libraries for Parrot, a few for Perl 5, and one for Ruby.  I've embedded Perl 5 and I've embedded Parrot.  (I figured out how to get Perl 5's reference counting working correctly with Parrot's "true" GC and how to get Parrot's GC working when embedded in Ruby.)</p>

<p>I even wrote <a href="http://search.cpan.org/perldoc?P5NCI">a proof of concept silly port of Parrot's foreign function interface to Perl 5</a> before the Python folks adopted the much better <a href="http://docs.python.org/library/ctypes.html">ctypes</a> (and can't wait to use <a href="http://socghop.appspot.com/gsoc/student_project/show/google/gsoc2010/tpf/t127230763807">ctypes for Perl 5</a>).</p>

<p>All of this reveals to me that there's something rotten about writing simple
bindings to shared libraries from dynamic languages.  It's mostly tedious,
uninteresting work with far too many chances of bugs and far too many
repetitive details.  You'd think computers would be good at solving both
problems.</p>

<p>I have generalized from my psyche-scarring experiences two fundamental
assumptions:</p>

<ul>

<li>C (and specifically C headers) are a terrible layer of interoperability because they cannot express some of the most important details (Does this function acquire a shared resource?  Whose responsibility is it to manage the lifespan of that resource?) and they obscure the clarity of intent through the use of abstractions such as C declarations and macros.</li>

<li>Requiring end users to install a full development environment along with the development headers for any library to which they want to install your bindings is a recipe for madness on the part of installers and soul-crushing despair on your part, as you try to figure out precisely which version of OpenGL is available on which version of Windows with which specific release of a given video card and oh goodness no, please do not tell me you just upgraded your Cygwin.</li>

</ul>

<p>In other words, parsing headers at the configuration time of a CPAN module which binds to, for example, <em>libcurl</em>, is madness, and we should stop.</p>

<p>Assume that ctypes for Perl 5 exists very soon in a form in which you can rely on its presence on a modern Perl 5 installation.  Assume that if you prefer Python or Lua or Ruby or Haskell or Factor or even some form of Common Lisp not tightly bound to the JVM or the CLR that you have a similar library which knows how to translate from your language's calling conventions to the C ABI to which the library's exported functions conform and that the type mapping problem is solved for 80% of the cases.</p>

<p>Now you need some mechanism to identify the symbols exported from the shared library to generate the appropriate thunks.</p>

<p>I've tried (and failed) to use <a href="http://www.swig.org/">Swig</a>, and I blame myself more than anyone else for that&mdash;but Swig is the <em>wrong</em> answer.  Parsing C headers is the <em>wrong</em> answer in 2010 and it was the wrong answer 20 years ago.  C headers do not provide the <em>right</em> information in the <em>right</em> form.  Effectively you have to have a bug-free C preprocessor to expand headers into literal C source code and then hope that your C parser will identify the correct information you need.</p>

<p>What's the right level of abstraction?  That depends on the information a thunk library such as ctypes needs to know:</p>

<ul>

<li>The name of an exported symbol</li>

<li>Its input and output types (and in specific, bit width, signedness, any varargs)</li>

<li>Constness of pointers or expected modification of out parameters</li>

<li>Exceptional conditions such as control flow modifications through <code>longjmp</code></li>

<li>Error handling, such as setting <code>errno</code> or special return values</li>

<li>Resource handling, such as a function which returns a <code>malloc</code>ed value but expects you to <code>free</code> it yourself (or some combination)</li>

</ul>

<p>... and probably more.</p>

<p>I've set aside the concept of opaque pointers versus raw structs, because
that's another rathole full of platform-specific concerns (and besides that,
any library which does not expose only opaque pointers to external uses is in a
state of denial of reality and deserves a very good refactoring), but you
probably already get the idea.</p>

<p>Wouldn't it be nice if shared libraries could provide some sort of
machine-parseable, semantics-preserving, declarative (that is, <em>no cpp
necessary!</em>) file which all of us poor users could parse once with our
thunk generators to produce bare-bones, no sugar added interfaces to these
wonderful libraries, then get on with the interesting work such as building <a
href="http://pygame.org/">Pygame</a> and <a
href="http://sdl.perl.org/">SDL_perl</a> in wonderfully Pythonic and Perlish
ways instead of manually reading <em>SDL_video.h</em> and figuring out how to
map all of that implicit information into XS ourselves?</p>

<p>I'm not asking for another section crammed into ELF files and I'm not
suggesting that the fine people behind <em>libxslt</em> need to compile a
manual file of machine-extractable information themselves&mdash;if we had a
nice format all of our dynamic languages could understand, <em>anyone</em>
could make this file once for any API/ABI version of the library and we could
all share for a change.  Wouldn't that be nice?</p>

<p>(and yes, I'm aware of CORBA and COM and their IDLs, but the existence of
Monopoly money by no means renders a $20 useless at the grocery store)</p>
        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/10/25/reinventing-the-axle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What You Can and Cannot Teach about Encapsulation</title>
		<link>http://www.modernperlbooks.com/mt/2010/09/what-you-can-and-cannot-teach-about-encapsulation.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/09/what-you-can-and-cannot-teach-about-encapsulation.html#comments</comments>
		<pubDate>Mon, 13 Sep 2010 19:02:39 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[encapsulation]]></category>
		<category><![CDATA[languagedesign]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[moose]]></category>
		<category><![CDATA[perl5]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Chris Yocum recently argued that Perl (5) can be difficult for lazy and undisciplined programmers. I agree; when the default of a language or ecosystem are difficult, laziness wins. Isn't that an axiom of Perl? Laziness wins, so let the...]]></description>
			<content:encoded><![CDATA[
        <p>Chris Yocum recently argued that <a href="http://blogs.perl.org/users/cyocum/2010/09/writing-large-systems-in-perl-is-a-privledge-not-a-right.html">Perl (5) can be difficult for lazy and undisciplined programmers</a>.  I agree; <a href="http://www.modernperlbooks.com/mt/2010/03/the-difficulties-of-unwritten-community-standards.html">when the default of a language or ecosystem are difficult, laziness wins</a>.</p>

<p>Isn't that an axiom of Perl?  Laziness wins, so let the compiler and runtime and libraries do the work so that lazy people will still get their jobs done well?</p>

<p>The question is "What do you encourage?"  Which design decisions does your language allow people to make with the least friction?  (Leave out the people who distrust arrays and so they use the filesystem to process aggregate data structures, line by line&mdash;I've seen this, but not in Perl.  These people need more help than language design; this is active malice and hostility toward programming and programmers.)</p>

<p>I come back to the example of <a href="http://moose.perl.org/">Moose</a>
because it's a great example.  Moose doesn't explicitly say <a
href="http://www.modernperlbooks.com/mt/2010/01/subtle-encouragement-toward-correctness.html">the
right way to handle instance variables is through accessors</a>, even though
that's probably the best way to handle instance variables.  Moose also doesn't
explicitly say that the best way to initialize instance variables is through
named parameters passed to a constructor, even though that's a great approach.
Instead, Moose makes those seem natural and easy such that you must be actively
malicious (or be very curious, or have very specific, special needs in your
project) to stumble upon a different approach.</p>

<p>Moose doesn't explicitly teach <em>encapsulation is good</em>!  I'm not sure how well you <em>can</em> teach that, until the student has experienced the problem of poor encapsulation.  Even so, you can teach the student good habits and you can hope that osmosis will drill in the point that encapsulation of instance variables leads to fewer problems.</p>

<p>Compare that to the Perl 5 documentation about how you can bless any type of reference, how you can manipulate data structures, and&mdash;oh, look over there at that blessed typeglob in core libraries!</p>

<p>The old Perl 5 way of doing something special when you need something
different than default is to cram something else in a C-shaped box to fit the
C-shaped prejudice of the core Perl 5 VM.  After all, experienced C programmers
know that an object is just a struct with an extra pointer hanging off it for
method dispatch.  (Larry has since resolved not to borrow features from Python
wholesale.)</p>

<p>(Incidentally, this is why many novice programmers who've just learned Ruby
think that Ruby is more flexible than Perl: Perl 5's Perlish API for
metaprogramming is horribly ugly because of early and foolish consistencies.
Even so, Perl 5 lets you manipulate more things than Ruby does because while
ugly is skin deep, its manipulexity is chromosonal.)</p>

<p>The Moose approach is simpler: there's an official metaobject protocol with
a very Perlish interface and no distinction between the Perl side and the C
side.  (You can't teach consistency either, but you can certainly demonstrate
its presence and its absence.)</p>

<p>The lesson from all of this is simple: if you want to help the lazy programmers in the middle of the spectrum, make their lives easier by making the right thing so easy to do that their laziness will prevent them from doing the wrong things.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2010/09/13/what-you-can-and-cannot-teach-about-encapsulation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Looking for a new job? TigerLead is also Hiring in Ann Arbor MI</title>
		<link>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-also-hiring-in-ann-arbor-mi/</link>
		<comments>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-also-hiring-in-ann-arbor-mi/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 19:41:27 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[jobs]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=443</guid>
		<description><![CDATA[In addition to the job vacancy in West LA, the company I work for, TigerLead.com, has an opening for a &#8220;skilled developer&#8221; in Ann Arbor, Michigan: Our work involves manipulating and warehousing external data feeds and developing web interfaces to create home search tools for prospective buyers and lead management tools for real estate agents. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&#38;blog=2562816&#38;post=443&#38;subd=timbunce&#38;ref=&#38;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In addition to the <a href="http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/">job vacancy in West LA</a>, the company I work for, <a href="http://www.tigerlead.com/">TigerLead.com</a>, has an opening for a &#8220;skilled developer&#8221; in Ann Arbor, Michigan:</p>
<blockquote><p> Our work involves manipulating and warehousing external data feeds and developing web interfaces to create home search tools for prospective buyers and lead management tools for real estate agents. We&#8217;re looking for a skilled coder to join our small team of talented engineers in Ann Arbor. We hope to find an experienced programmer who is a good fit with our team, well-versed in multiple languages, able to learn quickly and work independently. We work in a Linux environment, and tools and languages we use include Perl, Ruby on Rails, PostgreSQL, and GIT. Perl experience is a significant plus, but your current comfort level with any of these specific tools is less important than overall technical aptitude and ability to learn quickly and fit in well with the current team.</p></blockquote>
<p>That&#8217;s a little thin on details partly because the work is varied. If you think you might be interested, take a look at the <a href="http://annarbor.craigslist.org/eng/1804836163.html">full job posting</a>.</p>
<p>TigerLead is a lovely company to work for and this is a great opportunity. Highly recommended.</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/'>software</a> Tagged: <a href='http://blog.timbunce.org/tag/jobs/'>jobs</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/postgresql/'>postgresql</a>, <a href='http://blog.timbunce.org/tag/ruby/'>ruby</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/443/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&amp;blog=2562816&amp;post=443&amp;subd=timbunce&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-also-hiring-in-ann-arbor-mi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&amp;amp;d=identicon&amp;amp;r=G" length="" type="" />
		</item>
		<item>
		<title>Looking for a new job? TigerLead is Hiring in West LA</title>
		<link>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/</link>
		<comments>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 17:37:22 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[jobs]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=439</guid>
		<description><![CDATA[The company I work for, TigerLead.com, has an opening for a &#8220;skilled coder / database wrangler&#8221;. We&#8217;re looking for a skilled coder / database wrangler to play a key role within our Operations and Engineering teams. The various responsibilities of the job include working with the large databases underlying our real estate search tools, setting [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&#38;blog=2562816&#38;post=439&#38;subd=timbunce&#38;ref=&#38;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>The company I work for, <a href="http://www.tigerlead.com/">TigerLead.com</a>, has an opening for a &#8220;skilled coder / database wrangler&#8221;. </p>
<blockquote><p>We&#8217;re looking for a skilled coder / database wrangler to play a key role within our Operations and Engineering teams. The various responsibilities of the job include working with the large databases underlying our real estate search tools, setting up services for new clients, communicating with clients to evaluate bug reports, troubleshooting technical issues escalated by our client services team, and interfacing with the engineering team on systems maintenance and development. The scope of work that we do involves managing hundreds of external data feeds that feed into in-house databases totaling several million property listings. These listing databases power hundreds of real estate search sites used by more than a million home-buyer leads, who are tracked and cultivated by the thousands of Realtors using our management software. This position is critical to the robustness of these systems.</p></blockquote>
<p>If that sounds like interesting work to you then take a look at the <a href="http://losangeles.craigslist.org/wst/eng/1821042952.html">full job posting</a>.</p>
<p>TigerLead is a lovely company to work for and this is a great opportunity. Highly recommended.</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/'>software</a> Tagged: <a href='http://blog.timbunce.org/tag/jobs/'>jobs</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/postgresql/'>postgresql</a>, <a href='http://blog.timbunce.org/tag/ruby/'>ruby</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/439/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&amp;blog=2562816&amp;post=439&amp;subd=timbunce&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&amp;amp;d=identicon&amp;amp;r=G" length="" type="" />
		</item>
		<item>
		<title>Walled Gardens, VM Sharecroppers, and &#8220;Sugar Daddies&#8221;</title>
		<link>http://www.modernperlbooks.com/mt/2009/11/walled-gardens-vm-sharecroppers-and-sugar-daddies.html</link>
		<comments>http://www.modernperlbooks.com/mt/2009/11/walled-gardens-vm-sharecroppers-and-sugar-daddies.html#comments</comments>
		<pubDate>Mon, 23 Nov 2009 22:01:43 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[perl5]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tcl]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Tim Bray went to RubyConf 2009. Ignore the provincial "The Ruby community knows how to build, test, distribute, package, and reuse software better than almost any other language in the world" comment (c'mon, Tim -- the CPAN has been around...]]></description>
			<content:encoded><![CDATA[
        <p><a href="http://www.tbray.org/ongoing/When/200x/2009/11/21/RubyConf-2009">Tim Bray went to RubyConf 2009</a>.  Ignore the provincial "The Ruby community knows how to build, test, distribute, package, and reuse software better than almost any other language in the world" comment (c'mon, Tim -- the CPAN has been around for a while and <a href="http://blog.cpantesters.org/diary/58">the CPAN Testers service has over six million test results</a> for CPAN distributions -- and the current rate of reporting is <em>four million a year</em>).  There's a better quote buried deeper in the report:</p>

<blockquote>... it turns out that there's almost nobody who's actually getting paid to work on actual core Ruby (less than the number who are getting paid to work on JRuby and IronRuby and MagLev and so on). Ruby really needs to find a sugar daddy -- in my opinion, a deep-pocketed Japanese corporate sugar daddy -- and find it soon.</blockquote>

<p>Do I recall correctly that <a href="http://www.tbray.org/ongoing/When/200x/2006/09/07/JRuby-guys">Tim helped convince Sun to hire a handful of JRuby developers in 2007</a>?  (They've since left the Oracle-eclipsed Sun.)  Hmm.  Hirer's regret?</p>

<p><a href="http://blog.ianbicking.org/sun-come-lately.html">Ian Bicking
criticized Sun for the JRuby hire at the time</a>; apparently I'm not the only
one who detects a whiff of provincialism here.  It's odd; <a
href="http://home.pacbell.net/ouster/">John Ousterhout</a> worked at Sun for a
while, putting resources behind dynamic languages in the form of Tcl.  (Anyone
who says their favorite dynamic language is unsurpassed in automation
abilities, easy embedding, Unicode, event handling, and GUI integration
probably knows nothing about Tcl.  Those who do not know programming language
theory condem the rest of us to hear their incessant chest beating.)</p>

<p>I don't really want to talk about Ruby, though.  I want to talk about Perl.</p>

<p>I wrote <a
href="http://www.modernperlbooks.com/mt/2009/11/how-perl-happens.html">How Perl
Happens</a> as a subtle reminder that Perl has little corporate sponsorship.
To my knowledge, there's no IronPerl nor JPerl.  There's no Enterprise Perl
fork of the Perl 5 interpreter.  There's no Perl on the Smalltalk VM, nor on
V8, nor on SpiderMonkey.</p>

<p><a href="http://news.perlfoundation.org/2008/12/bookingcom_makes_a_major_contr.html">Booking.com</a> <em>did</em> make a large donation of $50,000 to contribute to Perl 5 development -- and they deserve credit and thanks and acknowledgement for that, as do all of the contributors to TPF... but try to find someone (anyone!) employed anywhere, as an agent of TPF or otherwise, with the full-time job to implement, support, maintain, or manage <em>any</em> implementation of Perl.</p>

<p>TPF hasn't spent (to my knowledge) <em>any</em> of that $50,000 -- though not because TPF is unwilling, but because no one has made a plausible, workable plan for spending that money.</p>

<p><a href="http://www.perlfoundation.org/ian_hague_perl_6_development_grants">Ian Hague made a generous donation to help with Perl 6 development</a>, and that's sponsored several grants to people such as Patrick Michaud, Jonathan Worthington, and Jerry Gay.  As well, Vienna.pm has sponsored a portion of Jonathan Worthington's time for several months -- but again, these are modest grants, not resembling anything close to full-time employment.</p>

<p>The thought of a business benefactor is interesting, especially in comparison to other language communities.  Does the close-knit Japanese community primarily developing MRI form a barrier to sponsorship from outside of Japan?  Does Python gain an edge from Google's deep pockets?  Can anyone argue that Zend's control over PHP has helped the language more than it has hurt the language?  Would Lua have worked anywhere outside a research university?</p>

<p>I don't mean to criticize or condemn alternate Ruby implementations for their own sake.  <a href="http://rubyspec.org/">RubySpec</a> is the most important project to come out of completing implementations; it can turn them into complementary implementations.  (I do choke back chuckles every time I read a starry-eyed programmer who's only ever learned Ruby say that the Ruby community has the best testing of any programming language ever invented in heaven or on earth, because they figured out how to write test descriptions and invented a new acronym for it, but I'm a history-aware jerk that way.)  There's nothing wrong with multiple implementations of a programming language built around a common specification (hey, Python has a pretty good one!) and a comprehensive test suite (fill in your own parenthetical statement here).</p>

<p>The problem comes, as Tim Bray is just starting to discover, when the reason for those competing implementations is to divide up a pie of consulting and support fees by capturing market segments tapped, untapped, unrelated but tappable, and not invented yet but looking very tapperific without replenishing the commons.</p>

<p>In other words, while I have no doubt of the good intentions of someone
porting Perl 5 to the CLR or the JVM to run in businesses where standard Perl 5
might not be allowed or appropriate or to give access to libraries not
available in Perl 5 yet, I suspect that the corporate interest in
<em>sponsoring</em> such development is to expand the walled garden around the
CLR or the JVM, not to make a better Perl 5 or to help programmers get their
work done with less ceremony and mess and frustration.</p>

<p>This leaves me with two questions:</p>

<ul>

<li>Why doesn't Perl 5 have sponsored development beyond a few donations here and there?  (Again, those businesses and individuals who have donated to support Perl development in any form deserve praise.  By no means do I intend any slight or anything other than gratitude toward them.)</li>

<li>Is the Perl community <em>fortunate</em> that it hasn't fragmented by implementation on various platforms, or <em>unfortunate</em> that it couldn't perform corporate aikido to turn walled-garden sharecropper sponsorship into dollars to improve the Perl core for everyone?</li>

</ul>
        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2009/11/24/walled-gardens-vm-sharecroppers-and-sugar-daddies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The False Dilemma of Novice and Savant User Experiences</title>
		<link>http://www.modernperlbooks.com/mt/2009/09/the-false-dilemma-of-novice-and-savant-user-experiences.html</link>
		<comments>http://www.modernperlbooks.com/mt/2009/09/the-false-dilemma-of-novice-and-savant-user-experiences.html#comments</comments>
		<pubDate>Thu, 10 Sep 2009 23:36:08 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[modernperl]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl5]]></category>
		<category><![CDATA[perlprogramming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[In the discussion of Perl Applications for Normal Users, the subject of installation came up again. User experience isn't always my primary concern, and I don't mind overgeneralizing that to other parts of the Perl 5 community. For example, many...]]></description>
			<content:encoded><![CDATA[
        <p>In the discussion of <a
href="http://www.modernperlbooks.com/mt/2009/09/applications-for-normal-users.html">Perl
Applications for Normal Users</a>, the subject of installation came up again.
User experience isn't always my primary concern, and I don't mind
overgeneralizing that to other parts of the Perl 5 community.</p>

<p>For example, <a href="http://news.perlfoundation.org/2009/08/2009q3_grant_proposal_improve.html">many Perl community websites are unattractive visually</a>.  There are exceptions.  The <a href="http://london.pm.org/">London Perl Mongers</a> site is very attractive.  I also like the design of the <a href="http://www.iinteractive.com/moose/">Perl Moose</a> site.</p>

<p>Yet a common refrain in many (more heat than light, sadly) discussions is
that functional is more important than attractive.  Yes, that's a false
dichotomy.</p>

<p>I don't want to restart the debate over the attractiveness of Perl 5
websites.  (I'd love to see variant templates that writers, developers, and
projects could borrow and adapt for consistency of good design, but that's a
different story.)</p>

<p>I want instead to talk about installation.  This ties in to <a href="http://www.modernperlbooks.com/mt/2009/08/who-benefits-from-the-cpan.html">Who Benefits from the CPAN?</a>.  Consider, for example, the amount of work required to configure a <a href="http://search.cpan.org/perldoc?CPAN">CPAN</a> client in 2000 versus the amount of work required to configure the same client in 2009.  This has improved.</p>

<p>Yet compare that to installing a random PHP application.</p>

<p>Preemptive ad hominem: if at any time you feel the need to comment here or elsewhere saying "You fool!  You foolish fool!  You want to turn Perl into Java, you drooling maniac!", you are a masochist and your opinion does not matter.</p>

<p>One commenter on the previous post praised <a
href="http://rubygems.org/">Ruby Gems</a> for not failing tests and not spewing
diagnostic output and asking confusing questions.  Of course the thought of
<em>not running tests</em> on installation horrifies me (how do you have any
idea if your software works?), but the point is a good one.  What information
do users need to know to install your software?  What questions do you really
need to ask them?</p>

<p>We've optimized the Perl ecosystem for Perl developers.  That's good.  That
helps us.  That doesn't necessarily mean that what's good for Perl developers
is good for Perl users.  That also doesn't mean that we can only optimize the
experience for one group at the expense of the other.</p>

<p>We can do better.</p>

<p>I argue often for <em>better defaults</em> -- not just at the language level
but at every level users might see.  Yes, I've overloaded the word "user".
Deal with it.</p>

<p>One important question for me as I ponder <a
href="http://www.modernperlbooks.com/mt/2009/07/expressing-visions-for-perl-5.html">visions
for Perl 5 and its ecosystem</a> is "How can we improve the default behavior
for novices and for most uses by experienced programmers while allowing
experienced programmers to customize behavior for advanced uses?"  That's a
language design principle.  If you analyze the design of Perl 5, you'll see
Larry's answers everywhere.  The same goes for Perl 6.</p>

<p>I don't have complete, systemic answers for that yet.  We have a lot to
ponder.  As food for thought, consider the (oblique) connection between two
comments.  The first comes from <a href="http://bitcheese.net/wiki/nopython">a
critique of Python</a>:</p>

<blockquote><em>Also, its libraries require compilation. What a nonsense.</em></blockquote>

<p>The second comes from <a href="http://slowass.net/~scott/">Scott
Walters</a>, specifically his <a
href="http://use.perl.org/~scrottie/journal/39611">Language choice motivated by
greed</a> journal:</p>

<blockquote>Moose is good and Moose is great, but the real win would be to
automatically install modules, automatically call the OS's package manager to
install libraries and other deps, to have created PHP before php did (or after)
and have a libperl linking executable that outputs web pages (period), and most
of all, to have a sandbox mode enabled by default (tired idea, I know) where
users can write code without getting yelled at by humans, only by the computer,
even if just because the code is labeled (all is fair if you predeclare) as
"babytalk". Perhaps this would be a mix of strict, diagnostics/warnings, and a
<a href="http://search.cpan.org/perldoc?Perl::Critic">Perl::Critic</a> policy
that tries to help them in only the most immediate sense likely to be useful to
novices in the short term.</blockquote>
        
    ]]></content:encoded>
			<wfw:commentRss>http://perlblogs.com/2009/09/11/the-false-dilemma-of-novice-and-savant-user-experiences/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

