<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Fabulous Adventures In Coding : Cargo Cult Programming</title><link>http://blogs.msdn.com/ericlippert/archive/tags/Cargo+Cult+Programming/default.aspx</link><description>Tags: Cargo Cult Programming</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Cargo Cultism, Part Four: Other Disciplines</title><link>http://blogs.msdn.com/ericlippert/archive/2004/03/04/cargo-cultism-part-four-other-disciplines.aspx</link><pubDate>Thu, 04 Mar 2004 21:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:84045</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/84045.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=84045</wfw:commentRss><description>&lt;SPAN&gt;
&lt;P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Just a couple quick follow-ups.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;A title=http://jroller.com/page/pyrasun/20040304#re_cargo_cult_programming href="http://jroller.com/page/pyrasun/20040304#re_cargo_cult_programming"&gt;Mike Spille&lt;/A&gt; has some good comments tying the relationship between cargo cult programmers and abstraction layers together.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;A title=http://larkware.com/articles/thedailygrind312.html href="http://larkware.com/articles/thedailygrind312.html"&gt;Mike Gunderloy&lt;/A&gt; wonders if I've ever read Steve &amp;#8220;Code Complete&amp;#8220; McConnell's &lt;A title=http://www.stevemcconnell.com/ieeesoftware/eic10.htm href="http://www.stevemcconnell.com/ieeesoftware/eic10.htm"&gt;Cargo Cult Software Engineering&lt;/A&gt; essay.&amp;nbsp; I have now -- thanks!&amp;nbsp; However, this essay is about cargo cultism amongst managers of software teams, not the developers themselves.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;What this really shows is that imitating form without understanding content is a methodology in many disciplines.&amp;nbsp; It is certainly not limited to the engineering professions!&amp;nbsp; In fact, this problem in a completely unrelated discipline has been on my mind lately.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;As Professor Thingo mentions in his recent blog entries, in addition to knowing a thing or two about scripting languages, I'm also an expert on the life and work of JRR Tolkien.&amp;nbsp; I have the dubious&amp;nbsp;distinction of being the first person to put a Tolkien fan page up on the Internet. For many years that page was the first result returned by Google searches for "Tolkien", which got me a &lt;I&gt;&lt;SPAN&gt;lot&lt;/SPAN&gt;&lt;/I&gt; of email from kids doing book reports and a number of unintentionally hilarious interviews with newspapers when the first Peter Jackson movie was released.&amp;nbsp; The admins of the university server upon which the page resided finally noticed that I'd graduated eight years earlier and removed it some time last year; it had not been updated since 1997 and was a mass of dead links.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;But I digress.&amp;nbsp;&amp;nbsp;I think that it is safe to say that the vast majority of fantasy genre fiction produced in the last fifty years apes the &lt;B&gt;&lt;SPAN&gt;form&lt;/SPAN&gt;&lt;/B&gt; of &lt;I&gt;&lt;SPAN&gt;The Lord of the Rings&lt;/SPAN&gt;&lt;/I&gt; without coming close to the quality of the &lt;B&gt;&lt;SPAN&gt;content&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; Want to sell books?&amp;nbsp; Put a map in the back, have a few plucky short guys with swords go up against evil incarnate to save the world, and wait for the royalties to roll in. (See Tom Shippey&amp;#8220;s excellent book &lt;EM&gt;Author of the Century&lt;/EM&gt; for an in-depth analysis of this fact.)&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Peter Jackson, in one of his Oscar acceptance speeches thanked the Academy for looking &lt;I&gt;&lt;SPAN&gt;beyond&lt;/SPAN&gt;&lt;/I&gt; the form -- the elves and wizards and hobbits -- to the underlying moral thematic core of the work.&amp;nbsp; And you have to look beyond it; most genre fantasy is derivative dreck, not to put too fine a point on it, and that prejudices people against it.&amp;nbsp; (A notable exception would be the early work of Guy Kay, who was Christopher Tolkien's assistant when he was editing &lt;I&gt;&lt;SPAN&gt;The Silmarillion&lt;/SPAN&gt;&lt;/I&gt;.&amp;nbsp; I haven't read any of Kay's recent work, so I don't know if it is still of such high quality.)
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Cargo cultism is everywhere.&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=84045" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Rants/default.aspx">Rants</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Cargo+Cult+Programming/default.aspx">Cargo Cult Programming</category></item><item><title>Cargo Cultists, Part Three: Is Mort A Cargo Cultist?</title><link>http://blogs.msdn.com/ericlippert/archive/2004/03/02/cargo-cultists-part-three-is-mort-a-cargo-cultist.aspx</link><pubDate>Tue, 02 Mar 2004 20:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:82840</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>16</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/82840.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=82840</wfw:commentRss><description>&lt;DIV&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;My colleague &lt;A title=http://www.mikepope.com/blog href="http://www.mikepope.com/blog"&gt;Mike&lt;/A&gt;, in a comment in &lt;A title=http://blogs.msdn.com/ericlippert/archive/2004/03/01/82168.aspx href="http://blogs.msdn.com/ericlippert/archive/2004/03/01/82168.aspx"&gt;yesterday's entry&lt;/A&gt;, mentions "Mort".&amp;nbsp; Who is this Mort guy?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;At Microsoft, we do a lot of market research, and frequently discover that large segments of our customers have characteristics in common.&amp;nbsp; It's a lot easier to talk about these customer segments if we take one prototypical example of that segment and give them a name.&amp;nbsp; It's a lot easier to say "&lt;I&gt;&lt;SPAN&gt;Mort likes Intellisense&lt;/SPAN&gt;&lt;/I&gt;" than "the &lt;I&gt;&lt;SPAN&gt;professional line-of-business programmer who lacks a degree in computer science but has a great deal of familiarity with Office and VBA, and who typically writes productivity applications shared amongst his coworkers, likes Intellisense&lt;/SPAN&gt;&lt;/I&gt;."
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;There are many of these prototypical customers but the three we talk about most often on the Visual Studio team are &lt;B&gt;&lt;SPAN&gt;Mort&lt;/SPAN&gt;&lt;/B&gt; (the line-of-business developer), &lt;B&gt;&lt;SPAN&gt;Elvis&lt;/SPAN&gt;&lt;/B&gt; (the professional application developer) and &lt;B&gt;&lt;SPAN&gt;Einstein&lt;/SPAN&gt;&lt;/B&gt; (the expert on both low level bit-twiddling and high-level object oriented architectures.)&amp;nbsp; Elvis and Einstein got their jobs by studying computer science and going into development as a career.&amp;nbsp; Mort comes to a development position via his line of business -- he's an expert on frobnicating widgets, and one day realizes that his widget tracking spreadsheets could benefit from a little VBA magic, so he picks up enough VBA to get by.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Clearly Elvis and Einstein are not Cargo Cult Programmers -- Elvis wouldn't last a month and Einstein's entire reason for continued breathing is directly opposed to Cargo Cult Programming.&amp;nbsp; Is Mort a Cargo Cult Programmer?
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Though Mort is more &lt;I&gt;&lt;SPAN&gt;likely&lt;/SPAN&gt;&lt;/I&gt; to be a Cargo Cult Programmer, I don't think that he necessarily &lt;I&gt;&lt;SPAN&gt;has&lt;/SPAN&gt;&lt;/I&gt; to be, and I certainly think that he does his job better if he is not!&amp;nbsp; Yes, Mort doesn't understand OOP, but &lt;I&gt;&lt;SPAN&gt;for the kinds of problems Mort solves&lt;/SPAN&gt;&lt;/I&gt;, he doesn't need to know what inheritance is or how polymorphism works.&amp;nbsp; Mort's programs tend to be straightforward procedural manipulation of object models and strings, with a few loops and subroutines thrown in here and there.&amp;nbsp; Mort &lt;I&gt;&lt;SPAN&gt;does&lt;/SPAN&gt;&lt;/I&gt; understand that stuff, and often has a quite sophisticated understanding of the practical uses of the object model.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;What makes Mort cargo-cultish is that he tends to proceed from a not-quite-working solution (often obtained off the web, or by macro recording) to a working solution by piecemeal local changes.&amp;nbsp; Mort is a very &lt;EM&gt;local&lt;/EM&gt; programmer -- he wants to make a few changes to one subroutine and be done.&amp;nbsp; Mort does not want to understand how an entire system works in order to tinker with it.&amp;nbsp; And my goodness, Mort &lt;I&gt;&lt;SPAN&gt;hates&lt;/SPAN&gt;&lt;/I&gt; reading documentation -- more on that tomorrow.&amp;nbsp; Intellisense is Mort's favourite feature in the whole world because it lets him look stuff up by hitting the period key.&amp;nbsp; Mort's primary job is to frobnicate widgets -- code is just a means to that end -- so every second spent making the code more elegant takes him away from his primary job.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;But what makes Mort not cargo-cultish is that Mort actually does enjoy writing code, Mort is interested in writing code, &lt;I&gt;&lt;SPAN&gt;Mort wants to do the right thing to write more effective code&lt;/SPAN&gt;&lt;/I&gt;.&amp;nbsp; But Mort, like all of us, sometimes fails to put in the necessary investment in time now that will pay off later. That's not because Mort is a lazy idiot; Mort's a very smart, dedicated&amp;nbsp;guy, but you know that he's got this huge pile of widgets to frobnicate by Wednesday&amp;#8230; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;In a sense, my advice for novice developers doesn't apply so much to Mort, because &lt;EM&gt;that advice was directed towards people who want to be Elvis&lt;/EM&gt;.&amp;nbsp; Mort does his job &lt;I&gt;&lt;SPAN&gt;better&lt;/SPAN&gt;&lt;/I&gt; if he avoids cargo cultism.&amp;nbsp; Elvis &lt;I&gt;&lt;SPAN&gt;can't do his job at all&lt;/SPAN&gt;&lt;/I&gt; if he falls into cargo cultism.&amp;nbsp; In the future I'll try to be more clear about what developer segment I'm blogging about.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Creating developer tools that work for Elvis and Einstein is relatively easy.&amp;nbsp; Creating dev tools that make Mort productive and effective is hard.&amp;nbsp; Creating tools that work effectively given the widely varying goals, learning styles and knowledge levels of those three is the hardest and most interesting thing about this job.&amp;nbsp; I'll certainly talk a lot more about Mort, Elvis and Einstein (as well as Matt, Thomas and Erin) as I start blogging more and more about VSTO.&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=82840" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Rants/default.aspx">Rants</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Cargo+Cult+Programming/default.aspx">Cargo Cult Programming</category></item><item><title>Cargo Cultists, Part Two</title><link>http://blogs.msdn.com/ericlippert/archive/2004/03/02/cargo-cultists-part-two.aspx</link><pubDate>Tue, 02 Mar 2004 18:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:82763</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/82763.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=82763</wfw:commentRss><description>&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Thanks all for your kind words and cogent thoughts on yesterday's post.&amp;nbsp; I'd like to sum up some of the wisdom in the comments:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;My advice for novice programmers was
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;UL type=disc&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Don't be a cargo cultist -- understand the meaning and purpose of every line of code before you try to change it. &lt;/SPAN&gt;&lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Understand abstraction, and use it appropriately. &lt;/LI&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;To that, you guys add:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;learn to use a debugger to step through the code and find problems&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;learn to NOT use a debugger -- learn to build programs that are debuggable by reading and understanding them&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;reading code is harder than writing it -- read lots of code&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;sound methodology is important -- you need to &lt;I&gt;&lt;SPAN&gt;know&lt;/SPAN&gt;&lt;/I&gt; that you got it right&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;object models carry semantics too -- learn their semantics&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;realize that mastery of any skill doesn't take ten days, it takes ten years&lt;/LI&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Good advice!&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;I'd also like to respond to some of the points raised in the comments.&amp;nbsp; I'll do that over the next couple of days.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=82763" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Rants/default.aspx">Rants</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Cargo+Cult+Programming/default.aspx">Cargo Cult Programming</category></item><item><title>Syntax, Semantics, Micronesian cults and Novice Programmers</title><link>http://blogs.msdn.com/ericlippert/archive/2004/03/01/syntax-semantics-micronesian-cults-and-novice-programmers.aspx</link><pubDate>Mon, 01 Mar 2004 19:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:82168</guid><dc:creator>Eric Lippert</dc:creator><slash:comments>46</slash:comments><comments>http://blogs.msdn.com/ericlippert/comments/82168.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ericlippert/commentrss.aspx?PostID=82168</wfw:commentRss><description>&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;I've had this idea in me for a long time now that I've been struggling with getting out into the blog space.&amp;nbsp; It has to do with the future of programming, declarative languages, Microsoft's language and tools strategy, pedagogic factors for novice and experienced programmers, and a bunch of other stuff.&amp;nbsp; All these things are interrelated in some fairly complex ways.&amp;nbsp; I've come to the realization that I simply do not have time to organize these thoughts into one enormous essay that all hangs together and makes sense.&amp;nbsp; I'm going to do what blogs do best -- write a bunch of (comparatively!) short articles each exploring one aspect of this idea.&amp;nbsp; If I'm redundant and prolix, so be it.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Today I want to blog a bit about novice programmers.&amp;nbsp; In future essays, I'll try to tie that into some ideas about the future of pedagogic languages and languages in general.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Novice programmers reading this&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;: I'd appreciate your feedback on whether this makes sense or it's a bunch of useless theoretical posturing.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Experienced programmers reading this&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;:&amp;nbsp; I'd appreciate your feedback on what you think are the vital concepts that you had to grasp when you were learning to program, and what you stress when you mentor new programmers.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;An intern at another company wrote me recently to say "&lt;I&gt;&lt;SPAN&gt;I am working on a project for an internship that has lead me to some scripting in vbscript.&amp;nbsp; Basically I don't know what I am doing and I was hoping you could help.&lt;/SPAN&gt;&lt;/I&gt;"&amp;nbsp; The writer then included a chunk of script and a feature request.&amp;nbsp; I've gotten requests like this many times over the years; there are a lot of novice programmers who use script, for the obvious reason that we designed it to be appealing to novices.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Well, as I wrote last Thursday, there are times when you want to teach an intern to fish, and times when you want to give them a fish.&amp;nbsp; I could give you the line of code that implements the feature you want.&amp;nbsp; And then I could become the feature request server for every intern who doesn't know what they're doing&amp;#8230;&amp;nbsp; nope.&amp;nbsp; Not going to happen.&amp;nbsp; Sorry.&amp;nbsp; Down that road lies cargo cult programming, and believe me, you want to avoid that road.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;What's cargo cult programming?&amp;nbsp; Let me digress for a moment.&amp;nbsp; The idea comes from a &lt;A href="http://en.wikipedia.org/wiki/Cargo_cult"&gt;true story,&lt;/A&gt; which I will briefly summarize:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;During the Second World War, the Americans set up airstrips on various tiny islands in the Pacific.&amp;nbsp; After the war was over and the Americans went home, the natives did a perfectly sensible thing -- they dressed themselves up as ground traffic controllers and waved those sticks around.&amp;nbsp; They mistook cause and effect -- they assumed that the guys waving the sticks were the ones making the planes full of supplies appear, and that if only they could get it right, they could pull the same trick.&amp;nbsp; From our perspective, we know that it's the other way around -- the guys with the sticks are there &lt;STRONG&gt;because&lt;/STRONG&gt; the planes need them to land.&amp;nbsp; No planes, no guys.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;The cargo cultists had the unimportant surface elements right, but did not see enough of the whole picture to succeed. They understood the &lt;B&gt;&lt;SPAN&gt;form&lt;/SPAN&gt;&lt;/B&gt; but not the &lt;B&gt;&lt;SPAN&gt;content&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; There are lots of cargo cult programmers -- &lt;B&gt;&lt;SPAN&gt;programmers who understand what the code does, but not how it does it&lt;/SPAN&gt;&lt;/B&gt;. &amp;nbsp;Therefore, they cannot make meaningful changes to the program.&amp;nbsp; They tend to proceed by making random changes, testing, and changing again until they manage to come up with something that works.&amp;nbsp; 
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;(Incidentally, Richard Feynman wrote a great essay on cargo cult science. &amp;nbsp;Do a web search, you'll find it.)
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Beginner programmers: do not go there! Programming courses for beginners often concentrate heavily on getting the syntax right.&amp;nbsp; By "syntax" I mean the actual letters and numbers that make up the program, as opposed to "semantics", which is the meaning of the program.&amp;nbsp; As an analogy, "syntax" is&amp;nbsp;the set of grammar and spelling rules&amp;nbsp;of English, "semantics" is what the sentences mean.&amp;nbsp; Now, obviously, you have to learn the syntax of the language -- unsyntactic programs simply do not run. But what they don't stress in these courses is that&amp;nbsp;&lt;B&gt;&lt;SPAN&gt;the syntax is the easy part.&lt;/SPAN&gt;&lt;/B&gt;&amp;nbsp; The cargo cultists had the syntax --&amp;nbsp;the formal outward appearance --&amp;nbsp;of an airstrip down cold, but they sure got the semantics wrong.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;To make some more analogies, it's like playing chess.&amp;nbsp; Anyone can learn &lt;B&gt;&lt;SPAN&gt;how the pieces legally move&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; Playing a game where the strategy&amp;nbsp;makes sense is the hard (and interesting) part.&amp;nbsp; &lt;B&gt;&lt;SPAN&gt;You need to have a very clear idea of the semantics of the problem you're trying to solve, then carefully implement those semantics.&lt;/SPAN&gt;&lt;/B&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Every VBScript statement has a meaning.&amp;nbsp; &lt;B&gt;&lt;SPAN&gt;Understand what the meaning is.&lt;/SPAN&gt;&lt;/B&gt;&amp;nbsp; Passing the right arguments in the right order will come with practice, but getting the meaning right requires thought.&amp;nbsp; You will eventually find that some programming languages have nice syntax and some have irritating syntax, but that it is largely irrelevant.&amp;nbsp; It doesn't matter whether I'm writing a program in VBScript, C, Modula3 or Algol68 -- all these languages have different syntaxes, but very similar semantics.&amp;nbsp; &lt;B&gt;&lt;SPAN&gt;The semantics &lt;I&gt;&lt;SPAN&gt;are&lt;/SPAN&gt;&lt;/I&gt; the program.&lt;/SPAN&gt;&lt;/B&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;You also need to understand and use &lt;B&gt;&lt;SPAN&gt;abstraction&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; High-level languages like VBScript already give you a huge amount of abstraction away from the underlying hardware and make it easy to do even more abstract things.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Beginner programmers often do not understand what abstraction is.&amp;nbsp; Here's a silly example.&amp;nbsp; Suppose you needed for some reason to compute 1 + 2 + 3 + .. + n for some integer n.&amp;nbsp; You could write a program like this:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;n = InputBox("Enter an integer")&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&lt;BR&gt;Sum = 0&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;For i = 1 To n&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sum = Sum + i&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;Next&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;MsgBox Sum&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Now suppose you wanted to do this calculation many times.&amp;nbsp; You could replicate the middle four lines over and over again in your program, or you could &lt;B&gt;&lt;SPAN&gt;abstract the lines into a named routine&lt;/SPAN&gt;&lt;/B&gt;:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;Function Sum(n)&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sum = 0&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 1 To n&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sum = Sum + i&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;End Function&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;n = InputBox("Enter an integer")&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;MsgBox Sum(n)&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;That is &lt;B&gt;&lt;SPAN&gt;convenient&lt;/SPAN&gt;&lt;/B&gt; -- you can write up routines that make your code look cleaner because you have less duplication.&amp;nbsp; But &lt;B&gt;&lt;SPAN&gt;convenience is not the real power of abstraction&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; The power of abstraction is that &lt;B&gt;&lt;SPAN&gt;the implementation is now irrelevant to the caller&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; One day you realize that your sum function is inefficient, and you can use Gauss's formula instead.&amp;nbsp; You throw away your old implementation and replace it with the much faster:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;Function Sum(n)&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sum = n * (n + 1) / 2&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Lucida Console" color=navy size=2&gt;&lt;SPAN&gt;End Function
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;The code which calls the function doesn't need to be changed.&amp;nbsp; If you had not abstracted this operation away, you'd have to change all the places in your code that used the old algorithm.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;A study of the history of programming languages reveals that we've been moving steadily towards languages which support more and more powerful abstractions.&amp;nbsp; Machine language abstracts the &lt;B&gt;&lt;SPAN&gt;electrical signals&lt;/SPAN&gt;&lt;/B&gt; in the machine, allowing you to program with &lt;B&gt;&lt;SPAN&gt;numbers&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; Assembly language abstracts the &lt;B&gt;&lt;SPAN&gt;numbers&lt;/SPAN&gt;&lt;/B&gt; into &lt;B&gt;&lt;SPAN&gt;instructions&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; C abstracts the &lt;B&gt;&lt;SPAN&gt;instructions&lt;/SPAN&gt;&lt;/B&gt; into higher concepts like &lt;B&gt;&lt;SPAN&gt;variables, functions and loops&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; C++ abstracts even farther by allowing variables to refer to &lt;B&gt;&lt;SPAN&gt;classes&lt;/SPAN&gt;&lt;/B&gt; which contain both &lt;B&gt;&lt;SPAN&gt;data and functions that act on the data&lt;/SPAN&gt;&lt;/B&gt;.&amp;nbsp; XAML abstracts away the notion of a class by providing a &lt;B&gt;&lt;SPAN&gt;declarative syntax&lt;/SPAN&gt;&lt;/B&gt; for object relationships.
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;To sum up, Eric's advice for novice programmers is:
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;B&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Don't be a cargo cultist -- understand the meaning and purpose of every line of code before you try to change it.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;B&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;B&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;Understand abstraction, and use it appropriately.&lt;/LI&gt;
&lt;P&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Lucida Sans Unicode" color=purple size=2&gt;&lt;SPAN&gt;The rest is just practice.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=82168" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Scripting/default.aspx">Scripting</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Rants/default.aspx">Rants</category><category domain="http://blogs.msdn.com/ericlippert/archive/tags/Cargo+Cult+Programming/default.aspx">Cargo Cult Programming</category></item></channel></rss>