<?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>Sufficiently Small &#187; C++</title>
	<atom:link href="http://www.smallshire.org.uk/sufficientlysmall/category/computing/software/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.smallshire.org.uk/sufficientlysmall</link>
	<description>sin(x) = x</description>
	<lastBuildDate>Sun, 01 Jan 2012 23:29:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>In C++ throw is an expression</title>
		<link>http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/</link>
		<comments>http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 11:11:45 +0000</pubDate>
		<dc:creator>Robert Smallshire</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.smallshire.org.uk/sufficientlysmall/?p=384</guid>
		<description><![CDATA[After 15 years programming in C++, I was surprised to discover today that throw in C++ is an expression rather than a statement. As a result, throw may be used as part of larger expressions. The only use I&#8217;ve found for this &#8212; and in fact the speculative attempt by which I discovered it &#8212; [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.smallshire.org.uk%2Fsufficientlysmall%2F2009%2F07%2F31%2Fin-c-throw-is-an-expression%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.smallshire.org.uk%2Fsufficientlysmall%2F2009%2F07%2F31%2Fin-c-throw-is-an-expression%2F&amp;source=robsmallshire&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>After 15 years programming in C++, I was surprised to discover today that <code>throw</code> in C++ is an expression rather than a statement. As a result, <code>throw</code> may be used as part of larger expressions.</p>
<pre class="brush: cpp; title: ; notranslate">
int x = 5;
int y = x &gt; 4 ? x : throw std::out_of_range;
</pre>
<p>The only use I&#8217;ve found for this &#8212; and in fact the speculative attempt by which I discovered it &#8212; is range checking within constructor initializer lists.</p>
<pre class="brush: cpp; title: ; notranslate">
RangeChecked::RangeChecked(int x) :
    int_member(x &gt; 0 ? x : throw std::out_of_range)
{
}
</pre>
<p>It&#8217;s academic what the <i>type</i> of a throw expression is, since it will never be returned, but for type-checking purposes the compiler seems to be happy to use it in place of any type.</p>
<hr/>Copyright &copy; 2012 <strong><a href="http://www.smallshire.org.uk/sufficientlysmall">Sufficiently Small</a></strong>. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement. Please contact legal@smallshire.org.uk so we can take legal action immediately.<br/><span style="float: right;font-size: 7pt"><a href="http://blog.taragana.com/index.php/archive/wordpress-plugins-provided-by-taraganacom/">Plugin</a> by <a href="http://www.taragana.com/">Taragana</a></span>]]></content:encoded>
			<wfw:commentRss>http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>NEXT please! Compiling iteration structures in BBC BASIC</title>
		<link>http://www.smallshire.org.uk/sufficientlysmall/2007/07/02/next-please-compiling-iteration-structures-in-bbc-basic/</link>
		<comments>http://www.smallshire.org.uk/sufficientlysmall/2007/07/02/next-please-compiling-iteration-structures-in-bbc-basic/#comments</comments>
		<pubDate>Mon, 02 Jul 2007 16:32:37 +0000</pubDate>
		<dc:creator>Robert Smallshire</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[OWL BASIC]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.smallshire.org.uk/sufficientlysmall/2007/07/02/next-please-compiling-iteration-structures-in-bbc-basic/</guid>
		<description><![CDATA[This posting has been re-written from an earlier version which contained unnecessary complexity Following on from my proposal on how to compiler BBC BASIC functions with variant return types, in response to Richard Russell’s compilation challenges, I’d like to move on to compiling BBC BASIC loop structures. Nonetheless, several readers have comments how useful even [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.smallshire.org.uk%2Fsufficientlysmall%2F2007%2F07%2F02%2Fnext-please-compiling-iteration-structures-in-bbc-basic%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.smallshire.org.uk%2Fsufficientlysmall%2F2007%2F07%2F02%2Fnext-please-compiling-iteration-structures-in-bbc-basic%2F&amp;source=robsmallshire&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><em>This posting has been re-written from an earlier version which contained unnecessary complexity</em></p>
<p>Following on from my proposal on how to compiler BBC BASIC functions with variant return types, in response to Richard Russell’s <a href="http://www.smallshire.org.uk/sufficientlysmall/2007/06/10/writing-a-bbc-basic-compiler-for-the-clr/#comment-1579">compilation challenges</a>, I’d like to move on to compiling BBC BASIC loop structures. Nonetheless, several readers have comments how useful even a compiler that did not support these features would be.</p>
<p>The claimed difficulty arises is because BBC BASIC maintains a stack at run-time for managing loop structures such as <code>FOR..NEXT</code>, <code>REPEAT..UNTIL</code> and <code>WHILE..ENDWHILE</code>. As the interpreter executes the program it presumably uses the instructions it encounters to manipulate this stack. They key point here is that the tokens listed above are not merely loop delimiters used by the parser, they are actually statements which modify the internal state of the interpreter.</p>
<p>The situation is further complicated by the quirky behaviour of the <code>NEXT</code> statement. First of all, the loop variable following the <code>NEXT</code> is optional. If it is omitted the next iteration of the <code>FOR</code> loop which is topmost on the stack (<em>i.e.</em> the inner-most loop) is executed. However, it is also possible to supply a comma-separated list of loop variables, for example <code>NEXT i%,j%</code>. This is equivalent to <code>NEXT i% : NEXT j%</code>.</p>
<p>Richard goes on to illustrate the point with a real-world example,</p>
<blockquote><p>Here there are two NEXT I% statements; which gets used depends at run-time on the contents of the array. This is a real-world example (although the code could no doubt be written more elegantly).</p></blockquote>
<p>DEF FNscan(A()) : LOCAL I%<br />
    FOR I% = 0 TO DIM(A(),1)<br />
        IF A(I%) = 0 THEN<br />
            I% = DIM(A(),1)<br />
            NEXT I%<br />
            = TRUE<br />
        ENDIF<br />
        REM Some more code here<br />
    NEXT I%<br />
= FALSE</p>
<p>This time, I will use a different example, which is very similar in structure to Richard’s code, but which excludes the array, for the sake of clarity.</p>
<p>FOR i% = 1 TO 5<br />
    IF i% = 3 THEN<br />
        PRINT &quot;Three!&quot;<br />
        NEXT<br />
    ENDIF<br />
    PRINT &quot;i% is &quot;;i%<br />
NEXT</p>
<p>Note there is one <code>FOR</code> statement and two <code>NEXT</code> statements, so it is not possible to pair them. I simply print the loop counter, or in one case print a different string and <code>NEXT</code> early.</p>
<p>Formatted like this we can see that the inner <code>NEXT</code> is exactly like the <code>continue</code> statement in C#.</p>
<pre class="brush: csharp; title: ; notranslate">
for (int i = 1; i &lt;= 5 ; ++i)
{
   if (i == 3)
   {
      Console.WriteLine(&quot;Three!&quot;);
      continue; // next
   }
   Console.WriteLine(&quot;i% is {0}&quot;, counter);
   continue; //next
}
</pre>
<p>So, we can do something isomorphic in C#, C# is compilable to CIL, ergo this particular BBC BASIC construct is compilable to C#. Obviously.</p>
<p>However, more nefarious constructs are possible in BBC BASIC, such as this:</p>
<p>FOR i% = 1 TO 5<br />
FOR j% = 1 TO 5<br />
PRINT &quot;i% = &quot;;i%,&quot;j% = &quot;;j%<br />
NEXT i%</p>
<p>where we iterate on the outer loop, from &#8216;within&#8217; the inner one.  It may be possible to weed these out at compile time in simple cases such as this, and replace the <code>FOR j%= 1</code> with a simple assignment.  If not, its definitely possible to deal with it at run-time</p>
<p>The equivalent code using the C# a simple ForNext class I devised looks like this:</p>
<pre class="brush: csharp; title: ; notranslate">
ForNext outer = new ForNext(&quot;i%&quot;, 1, 5, 1);
outer.execute(delegate(int counter)
        {
            ForNext inner = new ForNext(&quot;j%&quot;, 1, 5, 1);
            inner.execute(delegate(int counter2)
            {
                Console.WriteLine(&quot;i% = {0} j% = {1}&quot;, counter, counter2);
                ForNext.Next(&quot;i%&quot;);
            });
         });
</pre>
<p>For the run-time solution, I create a <code>ForNext</code> loop object, initialized with the counter name which is just a label and the start, end and step values. I then pass the loop body to the <code>ForNext</code> object as a C# anonymous delegate. <code>NEXT</code> statements are implemented as calls to the static method <code>ForNext.Next()</code> with an optional counter name.</p>
<p>When run, the code produces,</p>
<pre class="brush: plain; title: ; notranslate">
i% = 1     j% = 1
i% = 2     j% = 1
i% = 3     j% = 1
i% = 4     j% = 1
i% = 5     j% = 1
</pre>
<p>Of course, some machinery in the <code>ForNext</code> class is required to make this work. In this case we use the .NET exception handling machinery to manage the stack of <code>FOR..NEXT</code> loops on our behalf, calling <code>ForNext.Next()</code> exits the current iteration of the top-most loop on the stack and if necessary begins the next iteration.</p>
<pre class="brush: csharp; title: ; notranslate">
class ForNext
{
    public delegate void Body(int counter);
    private string id;
    private int end;
    private int step;
    private int counter;

    private class NextException : System.Exception
    {
        public string id;

        public NextException(string id)
        {
            this.id = id;
        }

        public NextException() :
            this(null)
        {
        }
    }

    public ForNext(string id, int start, int end, int step)
    {
        this.id = id;
        this.counter = start;
        this.end   = end;
        this.step  = step;
    }

    public void execute(Body body)
    {
        while (counter &lt;= end)
        {
            try
            {
                body(counter);
            }
            catch (NextException e)
            {
                if (e.id != null &amp;&amp; e.id != this.id)
                {
                    throw;
                }
                counter += step;
            }
        }
    }

    public static void Next()
    {
        if (counter &lt; end)
        {
            throw new NextException();
        }
    }

    public static void Next(string id)
    {
        if (counter &lt; end)
        {
            throw new NextException(id);
        }
    }
}
</pre>
<p>Note how in this example we pass the loop counter label as <code>ForNext.Next("i%")</code>.</p>
<p>Of course, relying on the .NET exception handling mechanism for all such loops in BBC BASIC would be overkill. The majority of <code>FOR..NEXT</code> constructs are must simpler than this. The challenge moves on to detecting the simple cases using static analysis of the program to be compiled, and generating normal loop code in these simple cases. We would only fall back to the mechanism described here when required, if multiple unlabelled <code>NEXT</code> statements are present. It remains to be seen how feasible detection of these cases will be.</p>
<p>Of course, in functional languages, explicit iteration structures such as <code>FOR..NEXT</code> need not be present at all, since all iteration is achieved through recursion, usually with tail-calls. Another feature invented in the functional language LISP and now commonly available in more sophisticated languages is the concept of <a href="http://en.wikipedia.org/wiki/Continuation">continuations</a>, which are basically &#8220;GOTOs with parameters&#8221;.  Both exception handling, as used in this post, and other complex control structures can be implemented using continuations, as can all the iteration structures of BBC BASIC, even with mismatched <code>FOR..NEXT</code> statements, even when the <code>NEXT</code> statement is not labelled with a counter variable.</p>
<hr/>Copyright &copy; 2012 <strong><a href="http://www.smallshire.org.uk/sufficientlysmall">Sufficiently Small</a></strong>. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement. Please contact legal@smallshire.org.uk so we can take legal action immediately.<br/><span style="float: right;font-size: 7pt"><a href="http://blog.taragana.com/index.php/archive/wordpress-plugins-provided-by-taraganacom/">Plugin</a> by <a href="http://www.taragana.com/">Taragana</a></span>]]></content:encoded>
			<wfw:commentRss>http://www.smallshire.org.uk/sufficientlysmall/2007/07/02/next-please-compiling-iteration-structures-in-bbc-basic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A sub-orbital trajectory from the C++ productivity black-hole</title>
		<link>http://www.smallshire.org.uk/sufficientlysmall/2005/11/25/tracing-a-sub-orbital-trajectory-from-the-c-productivity-black-hole/</link>
		<comments>http://www.smallshire.org.uk/sufficientlysmall/2005/11/25/tracing-a-sub-orbital-trajectory-from-the-c-productivity-black-hole/#comments</comments>
		<pubDate>Fri, 25 Nov 2005 18:23:51 +0000</pubDate>
		<dc:creator>Robert Smallshire</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[computing]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.smallshire.org.uk/sufficientlysmall/?p=2</guid>
		<description><![CDATA[... why do programmers continue to subject themselved to working in C++ ... ?]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.smallshire.org.uk%2Fsufficientlysmall%2F2005%2F11%2F25%2Ftracing-a-sub-orbital-trajectory-from-the-c-productivity-black-hole%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.smallshire.org.uk%2Fsufficientlysmall%2F2005%2F11%2F25%2Ftracing-a-sub-orbital-trajectory-from-the-c-productivity-black-hole%2F&amp;source=robsmallshire&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>There&#8217;s an awful lot of C++ out there. As a industry we&#8217;ve been pumping out C++ code since we collectively jumped on the object orientation bandwagon in the early 1990s. There are large systems, each with millions of lines of code created entirely in C++. Every day thousands of hours are spent, at fantastic expense, finding memory leaks, wondering why pointers are dangling and waiting hours for our code to compile. And these are the major contibutory factors to <em>the</em> big C++ problem. </p>
<p>Productivity.</p>
<p>Or lack of it. You see, writing C++ is easy. Writing good C++ is hard. Of course it is possible to write solid C++ but the unfortunate truth is that the huge existing body of code is unlikely to be rebuilt around the good programming techniques facilitated by libraries such as Boost or Qt. We will continue on the long death-march down the road of ongoing mainentance.</p>
<p>So why do programmers continue to subject themselved to working in C++, and why do our managers not only think this is acceptable, but activly encourage it? Of course, there are many reasons, but two stand out. First of all, many developers value the performance of their code, over their personal productivity. The second is the perceived difficulty of learning a different programming language in which to create better code.</p>
<p>My experience is that developers display an almost unnatural obsession with the performance of their code. This need for high performance has become some sort of pseudo-requirement for new code in the mind of many developers. Performance is commonly cited as a reason for using C++ over and above some other language such as Java or Python. But rarely is it necessary; many developers are not aware of exactly how fast their code needs to be, or conversely how slow it can afford to be. In spite of the claim that performance is important, the overwhelming majority have never used profiling tools in order to truly improve performance in the few lines where it counts. Why is performance valued more highly than rapid producing something that works?</p>
<p>This attachment to performace presents a serious problem, since for most programming tasks it <em>is</em> possible to write faster solutions in C++ than is most other programming languages. Any other language is then almost always a notch down in performance, even though this in itself is usually irrelevant for the task at hand. Perl hackers have recognised this for years with &#8216;You can sometimes write faster code in C, but you can always write code faster in Perl&#8217; &#8211; although I fully agree with the spirit of their statement  I actually think Perl introduces its own set of syntactic productivity barriers.</p>
<p>So given these topsy-turvy circumstances we should expect managers to be challenging their developers. Our managers should be asking <em>why</em> we are using tools such as C++ which make it unnecessarily awkward and time-consuming to write reliable code, and which do nothing to prevent common categories of errors. They should be encouraging us to write in Python, Ruby or even C# which allow us to much more rapidly create something which works, and which will liekly require much less cumulative maintenance over the life of the software. Furthermore, developers should be volunteering to use these tools in droves since their own productivity will increase massively, which is surely good for their careers and employers,  and they will spend less time with mind-numbing debugging. </p>
<p>Although there is certainly biodiversity in the programming language jungle, most developers choose only to sample one or two programming language fruits and usually these are usually very similar &#8211; more a case of oranges and lemons than apples and oranges. For example many developers may know C++ (from work) and Java (from college). This citric experience provides a limited perspective on programming solutions. I don&#8217;t believe that the best programmers &#8216;think in C++&#8217; or &#8216;think in Python&#8217;, in spite of some excellent books with that moniker. The best developers &#8211; the superstars our teams depend on &#8211; &#8216;think in software&#8217;, some sort of well defined, but difficult to expess, higher-level concept of how software should be designed and implemented. These great hackers know several languages which exploit different paradigms &#8211; C++ (imperative, strong, static typing), Python (imperative, strong, dynamic typing), Haskell (functional, strong typing) &#8211; and they are comfortable with applying techniques from one language in another, for example, by writing reliable code in C++ by avoiding functions with side-effects. Learning languages is relatively easy within a given paradigm &#8211; for example a C++ programmer learning Python. Crossing paradigm boundaries can be more challenging I&#8217;m a C++ developer by trade and I still struggle with functional Haskell &#8211; largely through lack of practical experience. However, the majority or programmers know only one language well enough to apply it commercially, and more remarkably show little curiosity about what other programming languages could offer them.</p>
<p>So why all the fuss about multiple languages and the corporate obsession with C++ ?</p>
<p>I recently had the dubious honour of being asked to review some C++ code which both transformed XML recieved from a socket into standardized SOAP requests. I was asked for comments on how the code could be improved, or refactored. The original was unreliable, leaked memory, and hogged the CPU due to some dubious socket handling. I hacked around in the code for 15 minutes looking for easy opportunities for improvement; hoping to make an impression, or spot some neat refactoring that could be applied. I was struggling &#8211; the code was almost unreadable, with <em>five </em>different string representations (don&#8217;t ask) and multitudinous conversions between them. It was clear that this particular problem was indeed the proverbial nail being pounded by the proverbial C++ hammer. Nobody volunteers to do XML processing in C++ do they? When I encountered inhumane C++ SOAP bindings statically generated from WSDL files I knew I had seen enough. I wanted to recommend that the code be rewritten in something more suited to the problem at hand- in this case I though Python would be a much better fit to the problem with its nice XML processing and SOAP libraries.</p>
<p>I spend a few evenings trying to understand the intent of the original code and re-implementing it in Python &#8211; not line-by-line as that would have achieved nothing &#8211; but from a higher level perspective. The result? I had reduced 8000 lines of C++ down to around 800 lines of Python, and I had enjoyed myself to boot. This was the first time I had experienced the fabled 10:1 code reduction of working in Python in a non-trivial example. I was amazed. Surely I had missed some critical piece of functionality? But no, it was all there &#8211; and what&#8217;s more it nearly worked.</p>
<p>I presented my late-night efforts back to my colleague who had introduced me to the problematic C++ code initially. He responded enthusiastically. We spend a few days with him debugging, and me helping and hinting &#8211; a kind of pair programming separated by  communicating only through Jabber and source control over the 300 kilometres of mountain and glacier that separated us. Within 36 hours and with some help from <code>tcpdump</code>, he had something that worked. We had slain the leaking, intransigent, C++ beast, and replaced it with a svelt Pythonic beauty.</p>
<p>And then he talked to his manager.</p>
<p>I wasn&#8217;t present, but I imagine the conversation went something like this:</p>
<p>  <strong>Developer:</strong> &#8220;You know the SOAP agent we&#8217;ve been having trouble with?&#8221;</p>
<p>  <strong>Manager:</strong> &#8220;Yeah &#8211; the one we need to fix and deploy by the end of next week?&#8221;</p>
<p>  <strong>Developer:</strong> &#8220;Well, most of the problems are sorted, its no longer leaking memory and the socket communication is now far more reliable. In fact &#8211; I&#8217;m confident its now a quality product.&#8221;</p>
<p>  <strong>Manager:</strong> &#8220;So what was the problem?&#8221;</p>
<p>  <strong>Developer:</strong> &#8220;Well, we didn&#8217;t want to waste more time tracing leaks in the C++ version, so we recoded it in Python; now its 90% smaller, and far more robust. By the way, you know how the older version only worked on Windows? Well now it also works on our Linux, Solaris and Irix too!&#8221;</p>
<p>  <strong>Manager:</strong> &#8220;We can&#8217;t use it.&#8221;</p>
<p>  <strong>Developer:</strong> &#8220;The only catch is that we don&#8217;t have experience of deploying Python applications, so there might be some work to do on the installer, but this program is usually installed by sys-admins anyway, and we&#8217;re sure its solvable in the &#8230;&#8221;</p>
<p>  <strong>Manager:</strong> &#8220;We can&#8217;t &#8230;&#8221;</p>
<p>  <strong>Developer:</strong> &#8220;&#8230; Excuse me?&#8221;</p>
<p>  <strong>Manager:</strong> &#8220;We don&#8217;t use Python here. We use C++. We can&#8217;t afford the overhead of developers needing to know more than one language.&#8221;</p>
<p>Ouch! So now the Python solution, which is a much better technical fit to the problem than the C++ behemoth is rejected because it is feared the cognitive load of learning a second language may be too high for some developers. Worse still, the hopes for our enthusiastic colleague becoming a topline developer are diminished, because rather than valuing diversity of programming language knowledge, the application of such abilities is frowned upon as &#8216;too costly&#8217;.</p>
<p>There is hope for Python, Ruby and other productive languages though to overturn the C++ monopoly in the realm of proprietary software, non web-based sofware. (Remember <em>real</em> applications?) But with developers on the one hand needlessly obsessing about which functions they should<code> inline</code>, or avoiding <code>dynamic_cast</code> completely because its slow, and on the other hand managers encouraging a language monoculture to protect their developers from having to learn something new, I think change will take an order of magnitude longer to achieve than we have seen in the FOSS world. Achieving escape velocity from the black hole of C++ productivity cannot be achieved without both main engine developer thrust and management boosters.  Developers on the ground must accept that using a language slower than C++ can be a good thing, and managers need to permit a degree of linguistic diversity in the interests of multiplying the productivity of their teams.</p>
<hr/>Copyright &copy; 2012 <strong><a href="http://www.smallshire.org.uk/sufficientlysmall">Sufficiently Small</a></strong>. This Feed is for personal non-commercial use only. If you are not reading this material in your news aggregator, the site you are looking at is guilty of copyright infringement. Please contact legal@smallshire.org.uk so we can take legal action immediately.<br/><span style="float: right;font-size: 7pt"><a href="http://blog.taragana.com/index.php/archive/wordpress-plugins-provided-by-taraganacom/">Plugin</a> by <a href="http://www.taragana.com/">Taragana</a></span>]]></content:encoded>
			<wfw:commentRss>http://www.smallshire.org.uk/sufficientlysmall/2005/11/25/tracing-a-sub-orbital-trajectory-from-the-c-productivity-black-hole/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

