<?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/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Micah Elliott &#187; languages</title>
	<atom:link href="http://micahelliott.com/tag/languages/feed/" rel="self" type="application/rss+xml" />
	<link>http://micahelliott.com</link>
	<description>Stories from my Startup Journey</description>
	<lastBuildDate>Mon, 29 Nov 2010 07:46:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
<image>
  <link>http://micahelliott.com</link>
  <url>http://micahelliott.com/mde-gravatar7.png</url>
  <title>Micah Elliott</title>
</image>
	<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.6.3" -->
	<copyright>Copyright &#38;#xA9; Micah Elliott 2010 </copyright>
	<managingEditor>mde@micahelliott.com (Micah Elliott)</managingEditor>
	<webMaster>mde@micahelliott.com (Micah Elliott)</webMaster>
	<category>posts</category>
	<image>
		<url>http://micahelliott.com/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>Micah Elliott &#187; languages</title>
		<link>http://micahelliott.com</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary>Stories from my Startup Journey</itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Society &amp; Culture" />
	<itunes:author>Micah Elliott</itunes:author>
	<itunes:owner>
		<itunes:name>Micah Elliott</itunes:name>
		<itunes:email>mde@micahelliott.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://micahelliott.com/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<item>
		<title>How to Choose and Learn a New Programming Language</title>
		<link>http://micahelliott.com/2009/03/how-to-choose-and-learn-a-new-programming-language/</link>
		<comments>http://micahelliott.com/2009/03/how-to-choose-and-learn-a-new-programming-language/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 03:00:37 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[languages]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[qop]]></category>

		<guid isPermaLink="false">http://blog.micahelliott.com/?p=46</guid>
		<description><![CDATA[They say you should learn a new programming language every year.  I don&#8217;t necessarily agree, but it&#8217;s happening this year for me with R.  Here are the steps I have found over the years to make it go smoothly. If you&#8217;re a perl, C++, or Java zealot, it&#8217;s been nice knowing you&#8230; Why Learn a [...]]]></description>
			<content:encoded><![CDATA[<p>They say you should <a href="http://www.google.com/search?q=learn+new+language+every+year">learn a new programming language every year</a>.   I don&#8217;t necessarily agree, but it&#8217;s happening this year for me <a href="http://micahelliott.com/2009/03/considering-r-as-python-supplement/">with R</a>.   Here are the steps I have found over the years to make it go smoothly. If you&#8217;re a perl, C++, or Java zealot, it&#8217;s been nice knowing you&#8230;<span id="more-46"></span></p>
<h2>Why Learn a New Language?</h2>
<p>You may disagree or have your own unrelated reasons, but addressing the <em>why</em> seems a necessary start for such a <em>how</em> post.  Here are the reasons I could think of:</p>
<ol>
<li><strong>You want to impress someone.</strong> Your present/future boss?  Peers?   Just padding your resume?   This is not a very good reason.  Maybe just stick with perl/C++/Java.</li>
<li><strong>Pursue a new domain.</strong> E.g., I&#8217;m heading into R because it&#8217;s touted as the best for visualization and statistics, and even has some epidemiologic facilities I hope to make use of.</li>
<li><strong>You want to expand your mind.</strong> Given your new learnings, you&#8217;ll be able to achieve better/faster results with your present favorite language.  E.g., <a href="http://micahelliott.com/2008/06/a-single-command-to-get-started-on-functional-programming/">learning FP</a> is sure to help you with many other languages.</li>
<li><strong>You&#8217;re actually going to need to use the new language for real work.</strong> You need to work on some app written in it, or you think it will be the best tool for your next challenge.</li>
<li><strong>Get connected to a new community.</strong> Maybe those relationships will lead to finding startup founders.</li>
<li><strong>Have something new to write about.</strong> Not a great reason, but I suppose I&#8217;m guilty.</li>
<li><strong>Feed the hype machine.</strong> Maybe you&#8217;ve just heard too much buzz about a language and have to know what everyone&#8217;s talking about.  This was why I explored Ruby!</li>
</ol>
<p>There&#8217;s got to be more reasons.  <em>What have been yours?</em></p>
<h2>How Long Should it Take?</h2>
<p>Depending on your background and the new language you&#8217;re targeting, you should plan to dedicate  some significant time to learning it.  This is <a href="http://www.linuxjournal.com/article/3882">ESR on his first run-in with Python</a>:</p>
<blockquote><p><em>Not that it took me very long to learn the feature set. I wrote a working, usable fetchmailconf, with GUI, in six working days, of which perhaps the equivalent of two days were spent learning Python itself.</em></p></blockquote>
<p>Or you could side with <a href="http://norvig.com/21-days.html">Peter Norvig</a> and devote 10 years to it:</p>
<blockquote><p><em>&#8230;it takes about ten years to develop expertise in [a programming language].</em></p></blockquote>
<p>Maybe Peter only knows perl*, in which case I&#8217;d heartily agree, and <a href="http://steve.yegge.googlepages.com/ancient-languages-perl">so would others</a>.  Personally, <strong>I think a typical competent programmer can pick up a well-designed language in a couple solid months of hands-on study</strong>, though this estimate may be off by a couple years.</p>
<h2>How To Actually Learn It</h2>
<p>We all have to learn a bunch of languages throughout our hacking careers.  How do you go about picking up a new one?  Get a book?  Start hacking?  Stare at some existing code?  Those are all useful things to do, but I want to streamline the process and get to the best practices.  Here&#8217;s the checklist I&#8217;ve come up with for effectively and efficiently learning a new programming language:</p>
<ul>
<li><strong>Click around on the home site.</strong> Discover the documentation pages, FAQs, wiki, community, etc.  You&#8217;ll be back here a lot.</li>
<li><strong>See what Wikipedia has to say about it.</strong> You should see some interesting history and learn about why it behaves and looks the way it does.  Maybe you&#8217;ll even find something to add.</li>
<li><strong>Print out the Tutorial and work through it.</strong> Mark it up with colors.  Type the snippets into your REPL. Change them.</li>
<li><strong>Read the FAQ.</strong> At least browse it so you know something about the common pitfalls.<strong><br />
</strong></li>
<li><strong>Read the style guide.</strong> If it doesn&#8217;t have one, figure out why.  Hopefully you can find editor settings that will enforce it.</li>
<li><strong>Get a book.</strong> Sometimes it takes a couple.  With Perl you&#8217;ll need eight tomes, all of which will be witty, yet combinedly inconsistent.  With Python you&#8217;ll need <a href="http://www.amazon.com/Python-Nutshell-Second-OReilly/dp/0596100469/">one</a>. (some will argue which one that is, many are great).</li>
<li><strong>Avoid certain languages.</strong> If you can&#8217;t find a book that dedicates fewer than 100 pages to wholly describing the language core, then something is wrong with the language.  C++ and perl are violators of this, and prime examples of languages to avoid in all capacities, at all costs.  You will waste all your energy on learning and remembering their <strong>quirks</strong>, instead of focusing on problems to solve.   I can&#8217;t believe some institutions (my undergrad!) have used these to teach OOP.  I would go so far as to call their paradigm <em>QOP</em>, or &#8220;quirks-oriented programming&#8221;.  (<em>WOP</em> &#8212; &#8220;warts-oriented programming&#8221; &#8212; isn&#8217;t undeservedly harsh, but maybe not PC.).  They will damage your thinking process, waste years of your programming career, or destroy it altogether, and you will actually become <em>less</em> competent for having ingrained their quirks into your cognition.*</li>
<li><strong>Work through the examples in the book.</strong> Highlight and scribble all over it.  If the book is more than 600 pages, then either the language is crufty or the book is poorly organized, and you might not want either.</li>
<li><strong>Start collecting miscellaneous pages from around the web and bookmark and tag them appropriately.</strong> Look for <a href="http://delicious.com/ianb">language luminaries</a> that have created nice bookmark collections.</li>
<li><strong>Hang out on the IRC channel.</strong> That will be <a href="http://freenode.net/">irc.freenode.net</a>.  The traffic on some of these is overwhelming, but you can quickly get a feel for what are the tricky corners of the language.</li>
<li><strong>Find a local user group to meet people and get connected.</strong> You can even get a feel for the language by surveying the attendees. Watch for excessive drool! If a SIG doesn&#8217;t exist yet, then start one. If no one is interested in joining, move to a bigger town or find a new language, or try to associate with one online.</li>
<li><strong>Join the users (and announcements) mailing list.</strong> You&#8217;ll get to see lots of code written by others and see solutions to common problems.</li>
<li><strong>Watch some videos (Google tech talks) and slideshows.</strong></li>
<li><strong>Play in the REPL.</strong> Get a better REPL if available (ipython).  What, no REPL?  Beanshell doesn&#8217;t count.  Bye-bye, Java!</li>
<li><strong>Try the debugger.</strong> See if there are better ones.  Can you dive right into it from crashing code?</li>
<li><strong>Get the tool suite.</strong> Get familiar with the tools and understand why they&#8217;re necessary.</li>
<li><strong>Explore the vaults.</strong> Examples are Python&#8217;s PyPI (Cheeseshop), R&#8217;s CRAN, perl&#8217;s CPAN (though CPAN has similar issues to its books).  Having extensive add-ons is a good language health indicator.  Also note how difficult their packages are to install.</li>
<li><strong>Write a simple tool.</strong> That will season you in making use of important facilities.  A good example is grep, which will exercise regexes, getopt (Erlang&#8217;s was hard to find), command line, strings, files, etc.</li>
<li><strong>Blog about your experience.</strong> Trying to describe your learnings to others will ensure that you understand what you&#8217;re talking about.  Do I? <img src='http://micahelliott.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />   <em>Learn by teaching</em> can be even more effective than <em>learn by doing</em>.</li>
<li><strong>Find the right interpreter/compiler.</strong> Some languages (Lisp) provide many.</li>
<li><strong>Install it, and its documentation</strong>.  <code>apt-get install ...</code> Not available in apt?  Then it&#8217;s too new, or you&#8217;re seriously bleeding edge, or it&#8217;s not viable.</li>
<li><strong>Figure out how to use the documentation systems.</strong> Manpages, info, &#8211;help, REPL-tab-completion, special tool (pydoc, Edoc, perldoc))</li>
<li><strong>Make sure your editor is equipped.</strong> What? it prescribes an IDE for you?  Later, Smalltalk (Squeak)!  Mess with your editor until it&#8217;s working as intended.  Syntax highlighting, auto-completion, auto-indent, macros, etc.</li>
<li><strong>Learn a bit about its history.</strong> Why was the language created.  For what niche?  Are its strengths and weaknesses reflected in that history?</li>
<li><strong>Make sure it&#8217;s open.</strong> I shouldn&#8221;t go into this again, and I realize it&#8217;s a loaded statement, but I say avoid anything that doesn&#8217;t have an excessively open community and standards body around it.  I&#8217;m still teetering on the Flex (Adobe) fence, but anything that Microsoft has had its hands in developing is simply poisonous.</li>
<li>Compare to a language you know.  What&#8217;s it most similar to?</li>
<li><strong>Take a class.</strong> This is often not necessary, but if you&#8217;ve got some college nearby they may offer something helpful.</li>
<li><strong>Get certified.</strong> Some languages have (silly) certifications.  The main benefit of them is that there is training material built around them that help you focus on what someone thinks are the important pieces of the language.  Doing this with Java helped my focus quite a bit (though I&#8217;ve since left the language behind).</li>
<li><strong>Watch/shadow a pro.</strong> This can be the absolute fastest way to see what to do, or what not to do.  Careful that you choose the right pro.</li>
<li><strong>Study the idioms and quirks.</strong> All languages have some quirks, <a href="http://wiki.python.org/moin/PythonWarts">even Python</a>.  It&#8217;s best to know about them early.</li>
<li><strong>Find and explore a project source base that is known to be well-written.</strong> Dive into the code.  Try making some changes.</li>
</ul>
<p>I&#8217;m not suggesting you need to do all these things for every language you explore.  This list could even serve as an evaluation for a new language you&#8217;re just considering.</p>
<h2>Bonus: Go Deep</h2>
<p>If you&#8217;d like to move on to the next prescribed level, here are some bonus activities:</p>
<ul>
<li>Find a bug in a library, and submit it to the <a href="http://en.wikipedia.org/wiki/Bug_tracking_system">BTS</a>.</li>
<li>Fix a bug and submit a patch.</li>
<li>Understand how to mark up your code for document auto-generation.  Write a manpage/vignette.</li>
<li>Check out the source using the VCS and build the compiler/interpreter yourself. If this is hard, you might consider if your apps to-be-written in this language can ever be deployed.  (Huge language bonus if they&#8217;ve got it together enough to be <a href="http://www.python.org/dev/peps/pep-0374/">using a DVCS</a>.)</li>
<li>Try your app on multiple OSs.  If you can get it to work on Linux, Mac, and Windows (at least Cygwin), you&#8217;re probably safe.  Even a web app should have some portability since you never know what future co-developers might think they need to do.</li>
<li>Start or join a real project.</li>
<li>Make use of shared memory or message passing or whatever concurrency facilities are provided.  Measure the quality of the language by how long it takes to figure out how to do robust parallel programming.  Erlang takes a week.  If it&#8217;s years, like most, you may want to move on, or read the next item.</li>
<li>Integrate with another language, particularly C.  If this is impossible, it&#8217;s probably a showstopper.  Compare to Python and R as benchmark examples.</li>
</ul>
<p>If you can&#8217;t accomplish all these things with the new language you&#8217;re considering, just move on to the next.  There are <a href="http://en.wikipedia.org/wiki/Alphabetical_list_of_programming_languages">plenty</a> to try!</p>
<p>Note that these are all great things to do when getting started with a new language.  However, you probably don&#8217;t want to be hanging out on IRC or mailing lists forever, or writing excessive posts about your fascinating new learnings, or reading too many books.  I&#8217;ve fallen into all those traps.  The best advice I can give you (and myself) is to get those hands dirty!</p>
<p><em>What other things do you do to get comfortable with a new language?</em></p>
<p><span style="color: #808080;"><em>* Notes: [1] Peter is actually pretty bright, and I was joking about perl.  I sat on the floor right next to him last year at <a href="http://micahelliott.com/2008/04/startup-school-impressions-should-you-attend/">Startup School</a>, without realizing who he was until he excused himself to give the next talk.  [2] Wow, Stevey; that second glass certainly does get the juices flowing!</em></span></p>
]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/03/how-to-choose-and-learn-a-new-programming-language/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Considering R as a Python Supplement</title>
		<link>http://micahelliott.com/2009/03/considering-r-as-python-supplement/</link>
		<comments>http://micahelliott.com/2009/03/considering-r-as-python-supplement/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 18:00:12 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[languages]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[r]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=311</guid>
		<description><![CDATA[It&#8217;s quite an investment to pick up a new programming language (syntax, semantics, types), along with all its periphery: tools, libraries, interfaces, environment, documentation, culture, user groups, history, idioms, and quirks.  I&#8217;m not trying to force myself to learn a new language every year, though looking back it&#8217;s pretty much turned out that way.  I [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s quite an investment to pick up a new programming language (syntax, semantics, types), along with all its periphery: tools, libraries, interfaces, environment, documentation, culture, user groups, history, idioms, and quirks.  I&#8217;m not trying to force myself to <a href="http://www.perlmonks.org/?node_id=397542">learn a new language every year</a>, though looking back it&#8217;s pretty much turned out that way.  I actually think there&#8217;s a skill-diluting effect in going shallow and trying to memorize syntax for a breadth of languages without knowing much about those other necessary peripheral pieces.  You really need a native language as a foundation by which you judge the others.  That may consist of a few, but I think there must be a small core.  Over the years my primary foundation has become Python.  I actually tend to steer away from the majority of new languages (especially since I rarely get into a situation where Python won&#8217;t handle the job), though the temptation of the new is sometimes great.  This year I&#8217;m having an especially hard time holding back the urge for the new.  It&#8217;s <a href="http://www.r-project.org/"><strong>R</strong></a>.  I&#8217;ve spent the last month telling myself I can&#8217;t make the commitment now given <a href="http://micahelliott.com/2009/01/reasons-for-creating-a-business/">how critical my development momentum is</a> to survival.  Well, R keeps taunting me, showing up <a href="http://en.wikipedia.org/wiki/23_Enigma">everywhere I look</a>.  I&#8217;ve got to figure out why it won&#8217;t leave me alone.  So here are the compelling pieces I&#8217;ve discovered thus far about R, that have me tinkering in its <a href="http://en.wikipedia.org/wiki/REPL">REPL</a>, wanting to buy <a href="http://www.amazon.com/Interactive-Dynamic-Graphics-Data-Analysis/dp/0387717617/">book</a> after <a href="http://www.amazon.com/Handbook-Statistical-Analyses-Using-R/dp/1584885394">book</a>, and even <a href="http://www.ggobi.org/demos/tour.html">having some strange dreams</a>.  I&#8217;m trying to compare to Python to evaluate the investment in learning another new language.<span id="more-311"></span></p>
<p>Here are some great things I&#8217;ve discovered about R:</p>
<ul>
<li><strong>Functional.</strong> Although <a href="http://micahelliott.com/2008/06/a-single-command-to-get-started-on-functional-programming/">I&#8217;ve dabbled in Erlang, Haskell, and ML</a>, and grown towards using Python in various functional ways (<a href="http://www.ibm.com/developerworks/library/l-prog.html">Mertz</a>, <a href="http://www.amk.ca/python/writing/functional">AMK</a>), I can&#8217;t say I&#8217;m <em>fluent</em> in any sanctioned <a href="http://en.wikipedia.org/wiki/Category:Functional_languages">functional language</a> (okay, I just added R to that list, but <a href="http://www.ibm.com/developerworks/linux/library/l-r2/">it should have been there</a>: &#8220;R&#8217;s functional parts come from Scheme.&#8221;)  I want to continue &#8220;breaking my brain in useful and creative ways&#8221;, and R fits the bill for completing this repertory need (I&#8217;ll probably head back to Haskell if/when a strong need for concurrency arises).</li>
<li><strong>Statistics and data analysis.</strong> <a href="http://www.amazon.com/Numerati-Stephen-Baker/dp/0618784608">The Numerati</a> and <a href="http://www.mckinseyquarterly.com/Hal_Varian_on_how_the_Web_challenges_managers_2286">other sources</a> say statisticians rule the world.  My eyes have been opened and I believe they&#8217;re right, so I&#8217;m working back my math chops.  It would appear that R&#8217;s statistics packages are more expansive than Python&#8217;s, and more is built into the language itself.</li>
<li><strong>Mathematical learning tool.</strong> It&#8217;s been a decade since I finished that math degree, but now the investment is finally paying off&#8230; I, uh, hypothesize.  I&#8217;ll blame the hiatus on not having found very interesting work to do until now &#8212; another reason to be self-employed, and why I&#8217;m loving life this year.  Anyway, I&#8217;m already getting re-versed in stats just by starting to use the language.  It&#8217;s looking like playing with R is a much better way to learn statistics than muddling through textbooks and paper-based homework.</li>
<li><strong>Graphical.</strong> Don&#8217;t know where to start.  There are <a href="http://en.wikipedia.org/wiki/R_(programming_language)#Graphical_user_interfaces">so many graphical tools</a> for R it is mind-numbing.  I&#8217;m starting to look at <a href="http://www.ggobi.org/rggobi/">RGgobi</a>, but there are lots of others to get acquainted with, including what&#8217;s built in.  I&#8217;ve worked through a couple graphical tutorials, and they seem to just magically pop up amazing graphs without having installed anything.  Try: <code>&gt; demo('graphics')</code> Notice how few lines of code are doing all that. Wow!</li>
<li><strong>Geospatial.</strong> I&#8217;ve got a need to be plotting data on maps in a variety of formats.  I&#8217;ve <a href="http://delicious.com/mdelliot/visual">found a lot of ways to do this</a>, but R seems to be the lightest, and <a href="http://grass.itc.it/">very capable</a>.</li>
<li><strong>High-level. </strong> Everything is a data structure.  Operations applied to variables are done across the whole set with no loops or treatment of individual items.  The syntax appears to be a bit richer (higher level, more sugar) than found in Python.</li>
<li><strong>I/O.</strong> R seamlessly slurps table-oriented text files for processing.  Output is also automatically formatted in nice text tables.  A mini-book (<a href="http://cran.r-project.org/doc/manuals/R-data.pdf">PDF</a>) describes this and much more.  My next learning task is to start <a href="http://rpgsql.sourceforge.net/">interfacing with PostgreSQL</a>.</li>
<li><strong>Kind of Python-like.</strong> I&#8217;ve started outlining another article that I hope to actually write someday called &#8220;R For Python Programmers&#8221; (since I can&#8217;t find such a guide).  Isn&#8217;t Python the gold standard to which <a href="http://www.amazon.com/Real-World-Haskell-Bryan-OSullivan/dp/0596514980/">great books</a> make comparisons these days?  I won&#8217;t duplicate that here, but simply say that I can&#8217;t believe how comfortable the syntax feels coming from Python nativity.  And R appears to <a href="http://rpy.sourceforge.net/">integrate very well with Python</a> (this probably being the more important point).</li>
<li><strong>Best REPL evar!</strong> I start evaluating any language simply by firing up its REPL and comparing its facilities to those of <a href="http://ipython.scipy.org">IPython</a>.  R&#8217;s REPL is on par with it (readline editing with vim-mode support, tab completion for everything, extensive help), and even has some extra niceties; e.g., function parameter tab-completion.  While getting started, note that the help system uses <code>?</code> and <code>??</code> <em>prefixes</em> instead of IPython&#8217;s suffix notation.  IOW, use <code>?topic</code> instead of <code>topic?</code> I&#8217;m getting the impression that a common workflow is spending lots of time in the REPL working with files and graphics.  This is probably the killer feature that enables me to quickly get up to speed.</li>
<li><strong>Documentation.</strong> The pages aren&#8217;t pretty, but there is a mass of info on the R site.  And AFAICT R is the foremost language used in recent Statistics textbooks.  There&#8217;s also a free 100-page (a good length, compare to Python Tutorial) <a href="http://cran.r-project.org/doc/manuals/R-intro.html">intro book</a>.  It&#8217;s horrible for non-programmers, and less than perfect for non-statisticians, but will get you familiar with some language features.  Appendix A offers a nice REPL walk-thru of language features.  I can&#8217;t find any Python books with much treatment of numerics, except for <a href="http://www.amazon.com/Python-Scripting-Computational-Science-Engineering/dp/3540739157">this one</a> which seems to touch on some but shares space with language basics.</li>
<li><strong>CRAN.</strong> Incredibly diverse libraries (<a href="http://cran.r-project.org/web/packages/">list of packages</a>) for statistics, graphics, and even <a href="http://www.medepi.net/epir/">Epidemiology</a> (probably overkill for my present needs).</li>
<li><strong>Mature and well-designed.</strong> R has been growing as the de facto FOSS statistical/graphical language <a href="http://cran.r-project.org/doc/html/interface98-paper/paper.html">for over a decade</a> (inception in 1993, in <a href="http://micahelliott.com/2008/06/1983-96-the-golden-age-of-programming-languages/">the golden age</a>).  It has grown up from the learnings of its ancestor <a href="http://en.wikipedia.org/wiki/S_(programming_language)">S</a> (shouldn&#8217;t R then be T??; I guess similar to C-&gt;B-&gt;A progression), which came onto the scene circa 1976 (a good year <img src='http://micahelliott.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</li>
<li><strong>Widely used.</strong> A survey of university statistics courses and Public Health curricula show R as a prevalent tool; e.g., UC Berkeley and Iowa State.</li>
<li><strong>UNIX-friendly.</strong> I was humored to see that R is more apt to borrow names from UNIX commands than from other languages.  The commands for managing a namespace are <code>rm</code> and <code>ls</code> &#8212; easy for me to remember. <img src='http://micahelliott.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   And I&#8217;m glad to see it has good roots.</li>
<li><strong>Trivial Ubuntu installation.</strong> Try this: <code>apt-get install r-recommended r-cran-&lt;tab&gt;&lt;tab&gt;</code></li>
<li><strong>Script-friendly.</strong> Rscript enables R to act as a scripting language.</li>
<li><strong>PDX-visualization group.</strong> This month we&#8217;re starting up <a href="http://micahelliott.com/2009/03/getting-started-with-graphviz/">a group to discuss visualization technology/advances</a>, and R will be the primary language under discussion.  My statistician friend, <a href="http://twitter.com/znmeb">Ed</a>, won&#8217;t stop talking about R, and he&#8217;s someone I&#8217;ve come to listen intently to.</li>
</ul>
<p>It&#8217;s a bit early to be writing an article on a language I haven&#8217;t done much with yet.  But I had to explore what&#8217;s pushing me towards R.  Looks pretty compelling now, so I&#8217;m very close to diving in (actually using it in a project).  I&#8217;ve sprinkled a number of resources throughout this post which I hope will be helpful for newcomers to R (including myself).  I should also mention that the best articles I&#8217;ve seen on introducing R are by David Mertz (a very capable Pythonista): Statistical Programming with R, <a href="http://www.ibm.com/developerworks/linux/library/l-r1/">Part I</a> and <a href="http://www.ibm.com/developerworks/linux/library/l-r2/">Part II</a>.</p>
<p>I can&#8217;t ignore what&#8217;s been growing out of  <a href="http://www.scipy.org">Scipy</a>, especially the <a href="http://www.scipy.org/Cookbook/Matplotlib/Maps">maps</a>.  And <a href="http://matplotlib.sourceforge.net/gallery.html">matplotlib&#8217;s gallery</a> is incredible (and I have some of them working).  The above items are all great features of R, but if I can accomplish them nearly as well in Python I probably shouldn&#8217;t invest too much into R.  At this point it does appear that R offers some facilities beyond Python.  <em>Have you worked with both Python and R and found compelling reasons to prefer R?  For which types of tasks?</em></p>
<p>My pain points with Python today are in analyzing query data (ad hoc in loops and heuristics), and creating a bunch of different formats to send to various third-party visualizations.  My analysis is going to need to get more sophisticated, and I&#8217;d like to be able to look at data visually quickly with less overhead.</p>
<p>I&#8217;m probably overstating the investment required in getting up and running with R; it&#8217;s <a href="http://www.nytimes.com/2009/01/07/technology/business-computing/07program.html">supposed to be easy to pick up</a>.  I&#8217;d really like to get to being comfortable with applying <a href="http://en.wikipedia.org/wiki/Statistics">non-trivial statistics</a>, which means working through some R books.  I&#8217;ve made it this far (and now so have you), so I&#8217;m going for it, hoping it will be a pretty quick learn.  <em>Please feel free to share your experiences with learning and using R!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/03/considering-r-as-python-supplement/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>1983-96: The Golden Age of Programming Languages</title>
		<link>http://micahelliott.com/2008/06/1983-96-the-golden-age-of-programming-languages/</link>
		<comments>http://micahelliott.com/2008/06/1983-96-the-golden-age-of-programming-languages/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 08:00:00 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[functional]]></category>
		<category><![CDATA[languages]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[parallel]]></category>

		<guid isPermaLink="false">http://blog.micahelliott.com/?p=43</guid>
		<description><![CDATA[These are the languages that I consider interesting* today. I&#8217;ve included their approximate year of first release. Also, a look at the importance of support for concurrency. As you can see, these fit into a surprisingly small time window, which I&#8217;ll call the Golden Age.** I wanted to make it a round decade, but had [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-style: italic;">These are the languages that I consider interesting* today.  I&#8217;ve included their approximate year of first release.  Also, a look at the importance of support for concurrency.</span></p>
<p>As you can see, these fit into a surprisingly small time window, which I&#8217;ll call the <span style="font-style: italic;">Golden Age</span>.**  I wanted to make it a round decade, but had to include Common Lisp.
<ul>
<li>C++ (1983)</li>
<li>Common Lisp (1984)</li>
<li>Erlang (1986)</li>
<li>Haskell (1987)</li>
<li>Perl (1987)</li>
<li>Tcl (1988)</li>
<li>Fortran90 (1991)</li>
<li> Python (1991)</li>
<li>Lua (1993)</li>
<li>Ruby (1993)</li>
<li>Java (1995)</li>
<li>Javascript (1995)</li>
<li>PHP (1995)</li>
<li>OCaml (1996)</li>
</ul>
<p>What&#8217;s happened since 1996?  Not much, besides refinement and extension.  It would seem that it takes a decade or two for a language to really stabilize and see wide adoption.*  But why did the innovation come to a screeching halt in 1996?</p>
<p>Here is a sampling of some languages that are sprouting up this decade.  Maybe you&#8217;ve <span style="font-style: italic;">heard</span> of some of them.  But <span style="font-style: italic;">adopted</span> one?  Not likely.
<ul>
<li><a href="http://www.scala-lang.org/">Scala</a></li>
<li><a href="http://www.co-array.org/">Co-Array Fortran</a> (features merging into Fortran)</li>
<li><a href="http://en.wikipedia.org/wiki/Unified_Parallel_C">Unified Parallel C</a></li>
<li><a href="http://en.wikipedia.org/wiki/Fortress_%28programming_language%29">Fortress</a></li>
<li><a href="http://chapel.cs.washington.edu/">Chapel</a> (vaporware targeted for 2010)</li>
<li><a href="http://www.research.ibm.com/x10/">X10</a> (secret vaporware)</li>
<li><a href="http://www.cs.washington.edu/research/zpl/home/index.html">ZPL</a> (vaporware)</li>
<li><a href="http://titanium.cs.berkeley.edu/">Titanium</a> (not even in Wikipedia, just a Java dialect)</li>
</ul>
<p>What do all these have in common?  <span style="font-weight: bold;">They&#8217;re trying to tackle concurrency.</span>  But none of these have significant momentum (arguably Scala has <span style="font-style: italic;">some</span>).  It&#8217;s probably at least 10 years before any of these get major traction.  Will any of these take off the way the languages of the Golden Age have?  Or will we just keep extending mostly imperative languages (<a href="http://www.openmp.org/">OpenMP</a>, <a href="http://www.threadingbuildingblocks.org/">Threading Building Blocks</a>, vendor-specific compiler directives, etc).  Where does FP fit into all this?  <span style="font-weight: bold;">Will the functional languages see a resurgence based on their natural fitness for concurrency?</span>  That&#8217;s my bet.</p>
<p>Which of the Golden Age languages have the cleanest concurrency models?  I&#8217;ll be exploring that question in future posts.</p>
<p>Why do I care about this?  I simply want to use the <span style="font-style: italic;">best language for the job</span> (another future post).  But most jobs these days are needing to scale to multiple cores/machines (the &#8220;<a href="http://www.gotw.ca/publications/concurrency-ddj.htm">free lunch is over</a>&#8221; horse is dead; I won&#8217;t belabor that here).  Everyone is talking about this unaddressed barrier to writing parallel apps effectively, but most programmers have no solution in mind.  A language with clean concurrency support is essential so that applications will scale well, with little effort, and be easy to write, quickly and correctly.  Let&#8217;s discover some and let everybody know.</p>
<p><span style="color: rgb(102, 102, 102);font-size:85%;" ><span style="font-style: italic;">Notes: Some of these dates were hard to locate and may be inaccurate.  You may disagree with my unspecified definition of interesting.  Scheme and Smalltalk are worthy of mention, but they make the window too big.  I&#8217;ve omitted any language from Microsoft: they generally don&#8217;t last; those that do (VB, C#) are an uninteresting commercial niche; and they are always brown cows.</span></span><span style="font-style: italic; color: rgb(102, 102, 102);font-size:85%;" >  I won&#8217;t try to prove the &#8220;decade for adoption&#8221; theory, but you can go search for data on when Java started to supplant C++; and Python/Ruby might be starting to do the same to Java (even though Java is the younger).</span><br /><span style="font-style: italic;"><br />Related articles:</span>
<ul>
<li><a href="http://www.eetimes.com/showArticle.jhtml?articleID=196600735"><span class="storyheadline"></span></a><a href="http://en.wikipedia.org/wiki/Programming_language#History">Some programming language history</a></li>
<li><a href="http://www.levenez.com/lang/history.html">Language history graph</a></li>
<li><a href="http://en.wikipedia.org/wiki/Concurrent_computing#Concurrent_programming_languages">Some concurrent programming languages</a></li>
<li><a href="http://softwareblogs.intel.com/2007/02/23/do-we-need-another-parallel-programming-language/">Do we need another parallel programming language?</a></li>
<li><a href="http://www.eetimes.com/showArticle.jhtml?articleID=196600735"><span class="storyheadline">Cray, IBM, Sun weigh in on language</span></a></li>
<li><span class="storyheadline"><a href="http://www.infoq.com/presentations/erlang-software-for-a-concurrent-world">Joe Armstrong on Software for a Concurrent World (video)</a><br /></span></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2008/06/1983-96-the-golden-age-of-programming-languages/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

