<?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>voyce &#187; Rant</title>
	<atom:link href="http://www.voyce.com/index.php/category/rant/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.voyce.com</link>
	<description>Programming and debugging tidbits</description>
	<lastBuildDate>Sun, 15 Jan 2012 13:10:46 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tax Avoidance 2.0</title>
		<link>http://www.voyce.com/index.php/2012/01/06/tax-avoidance-2-0/</link>
		<comments>http://www.voyce.com/index.php/2012/01/06/tax-avoidance-2-0/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 00:05:21 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.voyce.com/?p=1430</guid>
		<description><![CDATA[Tax avoidance is rife in the new (and existing) generation of tech companies.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.voyce.com/wp-content/uploads/2012/01/dislike.png"><img src="http://www.voyce.com/wp-content/uploads/2012/01/dislike.png" alt="dislike" title="dislike" width="210" height="95" class="alignleft size-full wp-image-1443" /></a>Warning: This is a bit off-topic for my blog, but I had to write it and get it off my chest. </p>
<p>In these times of financial woe, people love to complain about all the big, nasty, faceless companies avoiding paying tax. They inevitably moan about it on Facebook, Google and Twitter (and sometimes even do something about it in the real, physical, world). But what about those companies themselves? The Web 2.0 behemoths are now some of the largest companies in the world, and they&#8217;ve decided &#8211; just like the evil old companies &#8211; that they don&#8217;t like paying all that tax. Don&#8217;t be evil&#8230; and don&#8217;t pay any tax if you can help it. But how do they do it?<br />
<span id="more-1430"></span></p>
<h2>The Numbers</h2>
<p>An Irish Times <a href="http://www.irishtimes.com/newspaper/finance/2011/1223/1224309416349.html">newspaper article</a> caught my eye the other day. It discusses the rapid growth of Facebook&#8217;s Dublin operation in 2010, whose accounts have just been published (as they must be by law, despite FB&#8217;s apparent reluctance). The headline figure is that:</p>
<blockquote><p>
[Revenue] is up from €15.2 million to <b>€229.1 million</b>
</p></blockquote>
<p>That&#8217;s a pretty significant increase! But that&#8217;s only revenue, how much of it was left over as profit?</p>
<blockquote><p>
Facebook Ireland generated a pretax profit of <b>€1.9 million</b>
</p></blockquote>
<p>What?! Where did the other €227 million go? </p>
<p>According to the article it mostly disappeared into a mysterious black hole known as &#8220;administrative expenses&#8221;:</p>
<blockquote><p>
Administrative expenses increased &#8230; to €221.6 million as a result of &#8230; royalties paid to other Facebook entities for services provided during the year.
</p></blockquote>
<h2>How do they do that?</h2>
<p>Is it me or does that sound suspicious? Well, it should do, because it is. </p>
<p>It turns out that Ireland&#8217;s significantly lower rate of corporation tax (12% vs 26% in the UK, and one of the lowest in the world) isn&#8217;t the only reason why companies like Facebook, <a href="http://www.guardian.co.uk/business/ireland-business-blog-with-lisa-ocarroll/2011/mar/24/google-ireland-tax-reasons-bermuda">Google et al move there</a>. There&#8217;s also the very useful fact that, unlike most developed economies, Ireland chose not to introduce any legislation to prevent companies siphoning off their revenue to low-or-no-tax regimes like the Cayman islands or Bermuda.</p>
<p>So that&#8217;s where the &#8220;missing&#8221; €221 million has ended up: it&#8217;s been paid from the Irish part of the business to the tax-haven subsidiary, leaving only a small amount subject to corporation tax in Ireland. This practise is known in tax circles as the &#8220;double Irish&#8221;, and it (along with its Dutch equivalent) seems to be fairly widely used and well understood, even having its own <a href="http://en.wikipedia.org/wiki/Double_Irish_arrangement">wikipedia entry</a>. Of course Facebook now funnels as much as possible of the revenue from the UK (its second biggest market) through the Ireland operation to get the most out of this arrangement. That explains the large increase in the numbers since last year. </p>
<p>There are many high-profile tech companies that have Dublin operations and may be avoiding tax in this way, including:</p>
<ul>
<li>Facebook</li>
<li>Twitter</li>
<li>LinkedIn</li>
<li>Google</li>
<li>Microsoft</li>
<li>Oracle</li>
</ul>
<p>That&#8217;s quite a roll call.</p>
<h2>The Result</h2>
<p>The result of all these shenanigans for Facebook? It pays a ridiculously small effective tax rate of less than 1%, even better than <a href="http://www.businessweek.com/technology/google-tax-cut/google-terminal.html">Google&#8217;s 2.4% rate</a>.  And given Ireland&#8217;s <a href="http://news.businessweek.com/article.asp?documentKey=1376-LXBO661A1I4H01-4A40DCQ22ID111VEL291CSBQT6">current economic state</a> I can&#8217;t imagine their government will be introducing more restrictive tax legislation any time soon in an attempt to crack down on it. They can&#8217;t risk these big companies abandoning their new homes in Dublin&#8217;s <a href="http://www.irishtimes.com/newspaper/finance/2011/0930/1224305000761.html">Silicon Dock</a>.</p>
<p>Of course, you should feel free to &#8216;like&#8217; this blog post on Facebook, after all, what will it cost you?</p>
<p>(* Disclaimer: These are solely my opinions, not those of my employer or anyone else).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2012/01/06/tax-avoidance-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++: The oldest new kid on the block</title>
		<link>http://www.voyce.com/index.php/2011/09/18/cpp-the-oldest-new-kid-on-the-block/</link>
		<comments>http://www.voyce.com/index.php/2011/09/18/cpp-the-oldest-new-kid-on-the-block/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 23:06:09 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[win32]]></category>

		<guid isPermaLink="false">http://www.voyce.com/?p=1294</guid>
		<description><![CDATA[Is C++ coming back to a warm welcome from Microsoft?  ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.voyce.com/wp-content/uploads/2011/09/ballmer_cpp.png"><img src="http://www.voyce.com/wp-content/uploads/2011/09/ballmer_cpp.png" alt="Tasty" title="Tasty" width="200" height="200" class="alignright size-full wp-image-1296" /></a>Nobody could have failed to notice the recent resurgence of interest in the C++ programming language. In particular, the recent <a href="http://www.buildwindows.com/">Build</a> conference was the most we’ve seen Microsoft talking about C++ for several years. Why has a language that’s been languishing in the “prehistoric irrelevance” category for so long suddenly come back into vogue?<br />
<span id="more-1294"></span></p>
<h3>Dark Days</h3>
<p>We should bear in mind that in some camps, C++ never went away. The financial, scientific and games programming communities have bravely kept the fires burning.</p>
<p>Why? Primarily performance. In these industries performance is a feature, it’s a key differentiator, and it will help you make money. Can you say the same for an enterprise app (there I go, using that term disparagingly again) that just displays a form interface over a relational database?</p>
<p>However, even in the C++ bastions, the language was getting a bad press. I can only speak for the finance industry, where I’ve been working for the past 10 years, but even here the focus briefly switched away from raw performance to complex (overly-complex, dangerously-complex, as hindsight tells us) trades where getting to market first with something new was key: developer productivity was key. Flexibility and generality was key.</p>
<p>In that case, you don’t want to be dealing with the vagaries of subtle errors, crashes and memory leaks that can easily creep in when you’re using a language as low-level as C++. You just want to be able to release quickly. You probably want to be using a managed language.</p>
<p>In fact, C++ was getting a bad press all over. The functional power that was provided in languages like Haskell and F# &#8211; and being hastily added to C# &#8211; was missing or awkwardly implemented in C++. The provision of things like the .NET thread pool provided programmers on the CLR an easy way to schedule asynchronous tasks, and it was being touted as the only way to survive in the highly-parallel near-future. Of course, it was possible to do this stuff in C++, it was just more difficult.   </p>
<p>Despite this, the programming community widely understood the power that C++ brings, but also that it has to be wielded carefully. Witness the oft-repeated jokes about the fact that when you shoot yourself in the foot with C++, you tend to blow your leg off. There were even tensions within Microsoft, with the pro-managed DevDiv vs the hardcore, native-favouring Windows division.</p>
<h3>The New Order</h3>
<p>So what’s changed? Herb Sutter’s recent <a href="http://channel9.msdn.com/posts/C-and-Beyond-2011-Herb-Sutter-Why-C">talk</a> covered many of the reasons why C++ is relevant again, and the most obvious reason is the emergence and importance of mobile devices and data centres. </p>
<p>They have a completely different set of requirements than the desktop: they focus on squeezing the best experience out of every available cycle (and corresponding minute of battery life), and the most performance out of every watt of data centre power per degree of cooling. We’re seeing the impact of the smartphone in your pocket and the data-centric web and social media reflecting back onto the languages we use to write software.  </p>
<p>Managed languages fall down in some important areas here. They sacrifice memory efficiency to the god of garbage collection and they offer fewer opportunities for aggressive compiler optimisations, including, in the case of .NET, making use of chip-provided performance features like SIMD instructions.</p>
<p>Nowadays in more and more of the computing industry, it’s the hardware that’s driving the development choices, not the other way around.</p>
<p>With resource-constricted platforms, you want to be doing more of the heavy lifting offline, at compile time, not at run-time with a JIT compiler.</p>
<h3>How the iPhone showed devs don&#8217;t care</h3>
<p>While (parts of) Microsoft were busy pushing the managed languages hard, Apple was quietly producing game-changing pieces of hardware that the device-carrying public were buying in their hordes. And they weren’t just buying devices, they were buying apps to play on these devices &#8211; in their millions. Lots of developers wanted a piece of this action but &#8211; quelle horreur! &#8211; You had to use an obscure variant of C to create them.</p>
<p>But &#8211; surprise, surprise &#8211; developers did it anyway. Luckily, they weren’t on their own, but this time rather than a managed runtime, they had an API to use. And they had to use it; it was, and is, literally a condition of sale that your app uses only the APIs that Apple provide and in the way that they intended. Whatever your view on the fairness of this approach, having a restricted surface area and well defined set of libraries helps developers win back some of the productivity they might otherwise have sacrificed by using Objective-C.</p>
<p>Microsoft must’ve been looking askance at this, wondering how Apple had so effectively switched the model around. MS had been based on the idea of developer productivity being king and the hardware being utterly insignificant. Now developers were writing code in a language that was broadly derided by people in the programming community, yet they were in a virtuous circle where writing apps helped to ship hardware that increased the market for their apps. </p>
<h3>We need libraries</h3>
<p>Is it possible to find a good balance between the raw power of C++ and the productivity of managed languages? I think it is; and partly it comes down to having a good set of libraries. When I say good, I mean consistent, relevant, well-documented, easily available set of libraries. Can you see where C++ may have struggled here before?</p>
<p>For the low-level, programming task oriented basics, Boost is the answer. Seriously, Boost always seems to be the answer to questions of “how do I do X in C++?” where X is a modern programming technique. Smart pointers, lambdas, higher-order functions… they’re all there. </p>
<p>A few years ago if you were working in C++, you didn’t have many options apart from vanilla STL, Boost, and writing-it-yourself (again). Now, the STL and the language itself is richer and anecdotally, organisations are more receptive to the use of Boost. So hopefully, this combination gives us back access to most of the functionality that’s available to managed developers in their pre-packaged base class libraries.</p>
<h3>C++ and Apps</h3>
<p>But how is that going to help people use it to produce compelling apps and “experiences” (cough) and specifically, how is Microsoft going to use its developer productivity nous to keep Windows relevant in the new hardware markets? </p>
<p>They need something else; something like the Apple Core frameworks. It looks like this is what Microsoft is talking about with Windows 8 and the Windows Runtime. It’s suddenly not embarrassed to admit that, hey, Windows itself is written in C++, so maybe you shouldn’t have to go through a managed ‘interpretation’ of the existing APIs, one that’s exclusively available to managed languages.</p>
<p>Of course, Microsoft can’t do anything as radical as forcing all developers targeting a mobile or tablet platform to use C++. For them, programmers, rather than any particular hardware, are the bread-and-butter, so they tend to have a slightly less dictator-style relationship with devs than Apple does. </p>
<p>Judging from what I’ve seen from Build, Microsofts chosen approach is to provide language-specific “projections” (their term) from the Windows Runtime layer into a variety of languages, including C++. The native C++ types are mapped into corresponding concepts in the vernacular of the higher level languages; Javascript, C# etc. They’ve gone to some lengths, it seems, to ensure that transitions between levels are efficient. Using C++ at both levels should be the fast path, and of course you can mix it freely with code that, for example, uses Boost or other C++ libraries. </p>
<p>Additionally and importantly, as well as basic types, collections etc, the Windows Runtime also contains all of the rich APIs for accessing app-level functionality; things like image capture, sound and geolocation. So suddenly, all of this stuff is available in all its glory directly from C++ &#8211; and other languages too via cheap bridges. What they’ve essentially got is an identical copy of the architecture that exists in the iOS world, while still attempting to keep non C++ developers on-side. </p>
<h3>The Return&#8230;?</h3>
<p>So, have Microsoft managed to bring C++ in from the cold? They seem to have admitted, at least to themselves, that developers will need to use it in order to effectively target some platforms, and they’ve used their tooling experience to make it look and feel like a managed language in their IDEs, as well as leveraging their compiler technology to do some additional useful performance tricks. It feels like C++ was a fundamental concern in the redesign of the new alternative to the creaking Win32 API.</p>
<p>But will the transition be something to make current developers switch to C++, especially those who’ve been used to living in the cosseted managed world? Perhaps, if the Microsoft-based tablet market becomes as compelling &#8211; read, large &#8211; as Apple’s. Otherwise I don’t see any reason why developers who don’t have specific platform or other runtime requirements would move; for the majority of environments, developer time is still the dominant cost, so developer productivity will still be paramount. </p>
<p>The gap between managed and unmanaged languages has certainly narrowed in that area, but it still exists. C++ is still proving surprisingly relevant, despite its 30+ years, and hopefully its use in new and different areas of computing will feed back into improvements in the language and libraries for everyone’s benefit. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2011/09/18/cpp-the-oldest-new-kid-on-the-block/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>London Underground UI Fail</title>
		<link>http://www.voyce.com/index.php/2010/06/04/london-underground-ui-fail/</link>
		<comments>http://www.voyce.com/index.php/2010/06/04/london-underground-ui-fail/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 10:10:48 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[London]]></category>

		<guid isPermaLink="false">http://www.voyce.com/?p=879</guid>
		<description><![CDATA[You'd think replacing a magnetic board with a digital system would be a good thing, wouldn't you? Well, not if you get the "user interface" completely wrong...]]></description>
			<content:encoded><![CDATA[<p>I mentioned this on Twitter the other day, but I was so incensed I just had to scribble out a blog post too. It&#8217;s a classic case of replacing a traditional (in this case paper-based) &#8220;interface&#8221; with an electronic one, and in the process failing to translate the fundamental functionality that made the original system useful.</p>
<p>How can you screw-up creating an electronic version of an existing sign?<br />
<span id="more-879"></span></p>
<p>Here&#8217;s the offending item:<a href="http://www.voyce.com/wp-content/uploads/2010/06/lu_sign.png"><img src="http://www.voyce.com/wp-content/uploads/2010/06/lu_sign-224x300.png" alt="Underground line status" title="Underground line status" width="224" height="300" class="alignright size-medium wp-image-888" /></a><br />
It&#8217;s a replacement for a combination of magnetic labels and hand scrawled messages that convey the current state of each of the London underground lines. They&#8217;re generally one of &#8220;good service&#8221;, &#8220;minor delays&#8221;, &#8220;severe delays&#8221;, or &#8220;oh no, you&#8217;ll never get to work&#8221;. </p>
<p>For the majority of people, their only interaction with this system is walking past, early in the morning, when they&#8217;re not at their sharpest, and trying to figure out if their tube line is working. As such, if there was a magnetic label stuck on your line, you knew things weren&#8217;t good. Given the lines themselves are colour coded, it&#8217;s easy to determine which line you&#8217;re interested in. Bear in mind that people aren&#8217;t going to get closer than about 2 metres to the board. </p>
<p>And herein lies the problem: by replacing the analogue board with a digital version, it&#8217;s no longer possible to ascertain by the physical presence of a label or writing, what state the line is in. </p>
<p>Let me say that again. It&#8217;s virtually impossible to tell, even from relatively close, if there are delays. Take a look at that screenshot (dodgy quality as it is) and see if you can tell which line has &#8220;minor delays&#8221;. Yeah, not easy is it? Now try doing that as you&#8217;re briskly walking past at 7.46am.  </p>
<p><div id="attachment_890" class="wp-caption alignleft" style="width: 310px"><a href="http://www.voyce.com/wp-content/uploads/2010/06/lu_sign_detail.png"><img src="http://www.voyce.com/wp-content/uploads/2010/06/lu_sign_detail-300x119.png" alt="Underground line status (detail)" title="lu_sign_detail" width="300" height="119" class="size-medium wp-image-890" /></a><p class="wp-caption-text">Underground line status (detail)</p></div>It&#8217;s not helped by the fact that the state descriptions are all roughly the same length and form, &#8220;good service&#8221; could just as easily be &#8220;severe delays&#8221; when it&#8217;s in 36pt and seen from 2m away. There have been many studies on the legibility of type, most in the context of road signage, and of course, there are the seminal texts (e.g. <a href="http://www.amazon.com/gp/product/0881792063?ie=UTF8&#038;tag=wwwvoycecom-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0881792063">The Elements of Typographic Style</a><img src="http://www.assoc-amazon.com/e/ir?t=wwwvoycecom-20&#038;l=as2&#038;o=1&#038;a=0881792063" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />) on how typography can be applied for good, not evil. Shame no-one responsible for this application seems to have read them. </p>
<p>I&#8217;m surprised that they&#8217;ve relied solely on text and haven&#8217;t used any other means of distinguishing the significant information. Some other things that could&#8217;ve been used:</p>
<ul>
<li>Colour (of the text itself, the background, or some indicator. Need some inspiration? How about taking a look at something <em>way</em> out there, like, say, traffic lights)</li>
<li>Size</li>
<li>Weight (using font weight to indicate relative importance)</li>
<li>Icons (or some other kind of visual indicators, nothing flashy)</li>
</ul>
<p>I&#8217;m sure there are a whole load of advantages to having this digital system; most notably that it&#8217;s connected, and can be automatically and centrally updated. If only they&#8217;d spent any time on thinking about how people were actually going to use it!</p>
<p><a href="http://en.wikipedia.org/wiki/Harry_Beck">Harry Beck</a> would be turning in his grave.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2010/06/04/london-underground-ui-fail/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programming is like a bad analogy</title>
		<link>http://www.voyce.com/index.php/2009/11/11/programming-is-like-a-bad-analogy/</link>
		<comments>http://www.voyce.com/index.php/2009/11/11/programming-is-like-a-bad-analogy/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 00:19:22 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www2.voyce.com/?p=388</guid>
		<description><![CDATA[The joy of programming can be a difficult thing to describe. I take a look at some of the bizarre things people have compared it to.]]></description>
			<content:encoded><![CDATA[<p>The <a href="<a href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&#038;tag=wwwvoycecom-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=1430219483">joy of programming</a><img src="http://www.assoc-amazon.com/e/ir?t=wwwvoycecom-20&#038;l=as2&#038;o=1&#038;a=1430219483" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> is hard for anyone to precisely define. At least, it&#8217;s hard for programmers to define, and seeing as nobody else understands what the hell it is anyway, that&#8217;s pretty much the same thing. However a few people on the interweb have tried quite hard to describe just what the feeling of developing software is by comparing it to things in &#8220;the real world&#8221;.</p>
<p>A quick google reveals some of the funny, interesting and downright weird things that people have compared programming to. Let&#8217;s take a closer look at some of them&#8230;<br />
<span id="more-398"></span></p>
<h3>The Classics</h3>
<p>&#8220;Programming is like sex&#8221;<br />
The most common version of this is, of course, that &#8220;One mistake and you have to support it for the rest of your life&#8221;. Very true. Unless you can manage to change jobs every six months, and then it&#8217;s more like &#8220;You can have lots of fun and then leave somebody else to clear up the mess&#8221;. There are lots of other variations too, including the controversial: &#8220;Sometimes you have to pay a lot of money to get someone who&#8217;s good at it&#8221;. </p>
<p>&#8220;Programming is like <a href="http://compsci.ca/blog/programming-is-like-lego/">LEGO</a>&#8221;<br />
<img src="http://www.voyce.com/wp-content/uploads/2009/11/lego.png" alt="lego" title="lego" width="150" height="150" class="alignleft size-full wp-image-531" />Hmm. As far as I can see this just means that, yes, you can put the pieces together in any way you like, but nothing you make will look <em>quite</em> as good as the thing you make by following the instructions. The impression of infinite freedom is an illusion. And if you&#8217;re not careful you&#8217;ll end up losing important bits down the back of the sofa or hoovering them up.</p>
<p>And, hang on, if it is like Lego, then how come we&#8217;re always talking about programming &#8220;glue&#8221;?</p>
<p>&#8220;Programming is like <a href="http://ebersys.blogspot.com/2009/07/programming-is-like-chess.html">chess</a>&#8221;<br />
Not sure about this one. The biggest similarity I can see is that a lot of Russians are quite good at it. </p>
<p>Or maybe you could compare the interminably long games with the average duration of an enterprise software project? In fact, maybe having a <a href="http://en.wikipedia.org/wiki/Game_clock">chess clock</a> would make pair programming more fun; you get 30 seconds to write a line of code before it&#8217;s the other&#8217;s turn.</p>
<h3>The Outliers</h3>
<p>&#8220;Programming is like <a href="http://winpdb.org/2009/07/ice-programming/">Ice Sculpting</a>&#8221;<br />
What?! This has to be one of the most bizarre comparisons. I mean, yeah, it makes my hands really cold too. And my coworkers keep asking me why I bring that razor-sharp <a href="http://en.wikipedia.org/wiki/Ice_pick">ice pick</a> into the office on code review days.</p>
<p>&#8220;Programming is like <a href="http://www.independentdeveloper.com/archive/2009/03/17/programming-is-like-a-dream">a dream</a>&#8221;<br />
Unfortunately sometimes it&#8217;s like a really bad dream, the kind that you get from falling asleep on your keyboard during your afternoon sugar-low, dribbling on your mouse and getting an imprint of the enter key on your forehead. The kind where you wake up screaming after a nightmare about finding a bug in a 600-line long function with one-letter variable names and no comments. Only to find it&#8217;s not a dream after all, but where you will spend the majority of your waking hours for the next six months.</p>
<p>But of course, it can also be the kind of dream where you&#8217;re so far in the zone that you feel like you&#8217;re flying, effortlessly gliding over the terrain, appreciating the bigger-picture before swooping down into the details and watching how everything meshes beautifully together. Ahhh. </p>
<p>But it&#8217;s probably not the, erm, y&#8217;know, <em>other</em> type of dream. </p>
<p>&#8220;Programming is like <a href="http://www.gameproducer.net/2006/03/03/sometimes-programming-is-like-playing-an-adventure-game/">an adventure game</a>&#8221;<br />
<img src="http://www.voyce.com/wp-content/uploads/2009/11/zork_text1.png" alt="zork_text" title="zork_text" width="150" height="150" class="alignleft size-full wp-image-535" />Yes indeed. I often find myself having to go back over ground I&#8217;ve already covered, in order to perform repetitive and mundane tasks purely so I can level up (I think it&#8217;s known as &#8220;getting promoted&#8221;).</p>
<p>Sometimes I think that compiler writers treat their error messages as some kind of sadistic text-based game:</p>
<p><code>You are in an open field west of a big white house with a boarded front door. There is an unterminated string constant to the west, and an undefined external symbol to the east. There is a header file on the floor in front of you.<br />
&gt; include header<br />
You include the header. You are in a forest with incredibly long STL error messages all around.<br />
</code></p>
<p>On a serious note, I think part of the reason programming is so difficult to pin-down is because it requires such disparate skills; a combination of creative, intuitive right-brainedness and the logical, analytical left. People can take a lot of different things away from it depending on where they start from. </p>
<p>Anyway, that&#8217;s my selection of gems. Got any other interesting ones?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2009/11/11/programming-is-like-a-bad-analogy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TwitterVision: How Twitter transformed TV</title>
		<link>http://www.voyce.com/index.php/2009/10/13/twittervision-how-twitter-transformed-tv/</link>
		<comments>http://www.voyce.com/index.php/2009/10/13/twittervision-how-twitter-transformed-tv/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 23:19:48 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[tv]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.voyce.com/?p=405</guid>
		<description><![CDATA[How has Twitter transformed the act of watching TV?]]></description>
			<content:encoded><![CDATA[<p><img src="http://72.47.193.211/wp-content/uploads/2009/10/old_tv_hash.png" alt="TwitterTV" title="TwitterTV" width="128" height="128" class="alignleft size-full wp-image-415" />For a long time now, TV executives have bemoaned the lack of &#8220;event TV&#8221;. Modern broadcast television is a fractured ghost of its previous self. People&#8217;s attention is no longer focused in a tight beam on 3 channels; we have millions of videos at a click on YouTube, full-length TV shows and films on iTunes, hundreds of channels on satellite and cable. That means there&#8217;s no longer a significant section of society sharing the experience of a television show and discussing it the next day at school/the office water-cooler.</p>
<p>But what they seem to have missed is that something very different, but equally significant, has replaced it: the instantaneously-shared TV experience, enabled by Twitter. With the omnipresence of laptops, broadband and Twitter, the sofa&#8217;s now connected. It&#8217;s possible to sit at home on your own and discuss, berate and dissect whatever&#8217;s on RIGHT NOW.<br />
<span id="more-405"></span><br />
Most of us have experienced shared TV viewing at some point in our lives. People my age would&#8217;ve probably sat in the living room with their parents, before every kid over the age of 6 got a TV in their bedrooms. Shared living, like student accommodation, is also a common way to experience it. As we get older our social circle tends to shrink, and television watching can become a more isolated affair.</p>
<p>Of course, the &#8220;old&#8221; ways of discussing TV still exist; we still enjoy vitriolic printed reviews in <a href="http://www.amazon.com/gp/product/0571227554?ie=UTF8&#038;tag=wwwvoycecom-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0571227554">books</a><img src="http://www.assoc-amazon.com/e/ir?t=wwwvoycecom-20&#038;l=as2&#038;o=1&#038;a=0571227554" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, newspapers and magazines, we can still call someone and discuss a program over the phone. But these off-line methods are bandwidth-limited (we can only call one person at a time), slow (with a lead time of days or weeks for printed media) or uni-directional. Fundamentally, they lack immediacy.</p>
<p>In contrast Twitter enables us to connect with lots of people simultaneously; lots of people who are all sharing the same TV experience. It&#8217;s like having a load of sarcastic, funny mates in your living room. Ones that you can get rid off just by closing a laptop lid.</p>
<p>I&#8217;ve identified 5 major groups of TV twitters:</p>
<p><b>Schedulers</b><br />
These helpful individuals post tweets about things they find interesting and are intending to watch themselves, normally along the lines of:<br />
<img src="http://72.47.193.211/wp-content/uploads/2009/10/default_profile_3_normal.png" alt="default_profile_3_normal" title="default_profile_3_normal" width="48" height="48" class="alignleft"  /><code>Guy Richie's Revolver is starting now on Channel 5 - the most confusing film I've ever seen!</code><br/><br />
The usefulness depends on the type of people you follow and on where in the world they are. @aplusk and @courtneylover79 are not going to be posting much about what&#8217;s on BBC 1 on a Sunday evening.</p>
<p><b>Crowds</b><br />
This accounts for the vast majority of people twittering about telly. They tend to congregate around large &#8220;event&#8221; programmes, Eurovision, Derren Brown, X-Factor etc, or geek-oriented watching such as Charlie Brookers recent (and excellent) <a href="http://www.whatthetrend.com/trend/Gameswipe">Gameswipe</a>. Of course any reality-TV type programme presents significant opportunities for Twitter-enabled sniping. We all know how much the internet <i>loves</i> this kind of &#8220;look at that!&#8221;, &#8220;lolwut&#8221;, &#8220;OMG!&#8221;, &#8220;loozer&#8221; stuff, but it&#8217;s often combined with genuinely funny material too.</p>
<p><b>Hangers-on</b><br />
This groups consists mostly of spammers, and people outside of the country where the program is being broadcast. They spot trending hashtags and either piggyback whatever they&#8217;re selling onto it, or tweet something along the lines of &#8220;What the hell is #nnn&#8230;?&#8221;. They don&#8217;t add much. Enough about them.</p>
<p><b>Celebrity Friends</b><br />
If you follow celebrities* &#8211; and lets be honest, who doesn&#8217;t? &#8211; the chances are they have some friends. And celebrities friends are quite often celebrities themselves (keep it in the family, eh?) so you&#8217;ll often see tweets like:<br />
<img src="http://72.47.193.211/wp-content/uploads/2009/10/default_profile_3_normal.png" alt="default_profile_3_normal" title="default_profile_3_normal" width="48" height="48" class="alignleft"  /><code>my friend on bbc2 newsnight right now! go sister!</code><br/><br/><br />
Try to contain your excitement. Unless it&#8217;s you of course, and then you&#8217;re welcome to tweet <code>OMG!1!! I'm on TELLY!!</code><br />
(* of course, by celebrity I mean anyone with more than 500 followers).</p>
<p><b>Commentators</b><br />
Some twitterers take it upon themselves to provide blow-by-blow, often eloquent and vaguely fantastical coverage of certain programmes. This can feel like having someone on LSD on the sofa next to you whispering in your ear. So probably not for those of a sensitive disposition.<br />
<img src="http://72.47.193.211/wp-content/uploads/2009/10/default_profile_3_normal.png" alt="default_profile_3_normal" title="default_profile_3_normal" width="48" height="48" class="alignleft"  /><code>Gregg keeps saying "I would happily eat that." To be fair, he would happily eat an old Big Mac out of a tramp's shoe.</code><br/><br />
This type of companionship can brighten even the most mundane viewing. It tends to be the product of &#8220;resting&#8221; writers or comedians, writer\comedians, or comedian\writers.</p>
<p>Will TV ever be the same again? For me it won&#8217;t.</p>
<p>(The @names have been changed to protect the innocent. Well, some of them&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2009/10/13/twittervision-how-twitter-transformed-tv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The 7 signs your UI was created by a programmer</title>
		<link>http://www.voyce.com/index.php/2009/09/14/the-7-signs-your-ui-was-created-by-a-programmer/</link>
		<comments>http://www.voyce.com/index.php/2009/09/14/the-7-signs-your-ui-was-created-by-a-programmer/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 22:57:35 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[Excel]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[win32]]></category>

		<guid isPermaLink="false">http://www.voyce.com/?p=344</guid>
		<description><![CDATA[Programmers are notoriously bad at creating good user interfaces. How can you tell if your app was designed by a programmer? (Hint: it's easy).]]></description>
			<content:encoded><![CDATA[<p>Do you suspect a programmer may have put together the terrible user interface on that &#8220;enterprise&#8221; software you&#8217;re forced to use every day? There are some give-away indicators. Look out for them in your software, hunt down the developer and force them to read <a href="http://www.amazon.com/gp/product/0470084111?ie=UTF8&#038;tag=wwwvoycecom-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0470084111">a book about user interface design</a><img src="http://www.assoc-amazon.com/e/ir?t=wwwvoycecom-20&#038;l=as2&#038;o=1&#038;a=0470084111" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />. If you&#8217;re suitably senior, force them to a) improve it, or even better b) get someone with real UI experience to fix it.</p>
<p><b>1. Exclamation marks in dialog box messages</b><br />
Look, it&#8217;s probably the 50th time I&#8217;ve seen this message today. The fact that this application &#8220;Cannot connect to database!&#8221; is no longer a surprise. You may have noticed that most professional software uses a neutral tone for its communication with the user. Try that. Also:<br />
<b>1a. Double negatives in confirmation dialogs</b><br />
&#8220;Are you sure you don&#8217;t want to lose your changes?&#8221; Err&#8230; what? No. I mean YES. Oh sh*t. Any dialog that requires you to stop and try to parse the question in order to work out if you&#8217;re about to destroy several hours of work is not doing its job. It&#8217;s getting in the way of you doing your job. In fact, convoluted messages are such a serious issue that Microsoft even tried to help developers to help their users by introducing a whole new kind of dialog box in Vista: the <a href="http://msdn.microsoft.com/en-us/library/aa511269(loband).aspx#questionDialogsLinks">question/task dialog</a>. Good luck with that.</p>
<p><b>2. No tab ordering defined\mouse only navigation</b><br />
Because no-one&#8217;s ever going to use the keyboard to navigate the zillion controls in your data entry app, are they? This one actually surprises me, because I&#8217;d have thought that developers would&#8217;ve needed to navigate quickly through the application while they&#8217;re writing it. Well, that doesn&#8217;t seem to be the case. Pretty much all commercial apps are good counter examples. I don&#8217;t mean to hold up Microsoft Office as a paragon of UI virtue, but they definitely do the &#8220;alternate way of navigating everything&#8221; thing well. Everything you need can be reached by both keyboard and mouse. Unplug your mouse and try that with your favourite piece of in-house software and see how you get on.</p>
<p><a href="http://72.47.193.211/wp-content/uploads/2009/09/groups.png"><img src="http://72.47.193.211/wp-content/uploads/2009/09/groups.png" alt="groups" title="groups" width="360" height="327" class="alignleft size-full wp-image-358" /></a><b>3. Group boxes around everything</b><br />
This is a bit of a WinForms specific one. The clue is in the name: group boxes are for <i>grouping</i> logically related controls, not for providing a kewl recessed border around <i>every single one</i> of the controls in your dialog. Don&#8217;t kid yourself that this is doing anything other than using up some valuable screen real estate. (See if you can spot another pet peeve in the example dialog, too).</p>
<p><a href="http://72.47.193.211/wp-content/uploads/2009/09/icon_editor.png"><img src="http://72.47.193.211/wp-content/uploads/2009/09/icon_editor.png" alt="icon_editor" title="icon_editor" width="128" height="128" class="alignleft size-full wp-image-361" /></a><b>4. Icons created in the IDE</b><br />
Look, Visual Studio&#8217;s a really good integrated development environment, but it ain&#8217;t no Photoshop. Don&#8217;t try and use it to create icons. And while you&#8217;re at it, please don&#8217;t make icons consisting solely of the name of your application (inevitably an acronym) in pixel font and primary colours. Oh, and don&#8217;t just steal various icons from another application, unless you&#8217;re going to steal the whole lot; one of the key visual aspects of a good UI is consistency. Mixing your hand-drawn 4-bit icons with the glorious 32-bit shiny ones you borrowed is going to be jarring. In fact, why not go the whole way and get someone who can actually draw to create your icons for you? After all, you wouldn&#8217;t have someone who wasn&#8217;t a programmer writing the code, would you&#8230;?</p>
<p><b>5. Data grids</b><br />
Otherwise known as the &#8220;Excel is the pinnacle of user interface design&#8221; disease. Break the habit. Generally, the more types of controls that are embedded in your grid, the less likely that it&#8217;s the right kind of interface paradigm. Yeah, I&#8217;m looking at you, person embedding a calendar control, drop down box, graph, slider and checkbox in each row of a data grid. And whatever your 3rd-party grid provider of choice says, it&#8217;s not going to do screen redraw performance any good, either.</p>
<p><b>6. Not implemented message boxes</b><br />
Ahh, the GUI equivalent of source code TODO comments. Of course, it&#8217;s an in-house software give-away; no commercial (desktop) software would be brazen enough to ship with bits of functionality dangling from the stumps of buttons and menu items. Would it? Feel free to provide counter-examples if you have them.</p>
<p><a href="http://72.47.193.211/wp-content/uploads/2009/09/dialog_dialog.png"><img src="http://www.voyce.com/wp-content/uploads/2009/09/dialog_dialog-300x114.png" alt="dialog_dialog" title="dialog_dialog" width="300" height="114" class="alignright size-medium wp-image-365" /></a><b>7. Excessive use of dialog boxes</b><br />
Warning: dialog boxes are considered harmful (to usability). They&#8217;re the equivalent of restraining your user by force and preventing her from moving until she answers your question. That might be OK for matters of life or death (i.e. data loss), but not otherwise. Every time you find yourself about to add a new message box, stop, take a deep breath and consider whether it&#8217;s really necessary.</p>
<p>So, if you&#8217;re a victim or one, many, or all of these user interface faux pas, all I can say is: sorry. I&#8217;ve been responsible for doing at least one of these things myself over the years. Consider this post repentance for my user interface sins.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2009/09/14/the-7-signs-your-ui-was-created-by-a-programmer/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>Static libraries are Evil</title>
		<link>http://www.voyce.com/index.php/2008/09/24/static-libraries-are-evil/</link>
		<comments>http://www.voyce.com/index.php/2008/09/24/static-libraries-are-evil/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 15:27:27 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[COM]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[dll]]></category>
		<category><![CDATA[lib]]></category>

		<guid isPermaLink="false">http://www.voyce.com/?p=41</guid>
		<description><![CDATA[In my opinion.
Why? Well, because it&#8217;s too easy to use them as an excuse for not defining your shared library interfaces properly.
The reason this is on my mind recently is that several hundred, yes, you heard that right, several hundred DLLs have been released by my group over the last, ooh, 10 years or so. [...]]]></description>
			<content:encoded><![CDATA[<p>In my opinion.</p>
<p>Why? Well, because it&#8217;s too easy to use them as an excuse for not defining your shared library interfaces properly.</p>
<p>The reason this is on my mind recently is that several hundred, yes, you heard that right, several <em>hundred</em> DLLs have been released by my group over the last, ooh, 10 years or so. They are all still in use. Each of them has burned into it a copy of the library that deals with interfacing with Excel. That means each of these has it&#8217;s own little internal copy of the current state-of-the-art. The problem with that is; the state-of-the-art moves on. And how do you go about updating the DLLs that are already in production? You have to re-release them. In an environment where thes DLLs are used for marking the profit and loss on a large derivatives trading book, that&#8217;s not a small undertaking. And it&#8217;s made worse if, say the DLL in question was last released with a different version of the compiler.</p>
<p>My approach would be to refactor this shared static library (.lib) into a stand-alone DLL.</p>
<p>At this point, people start saying &#8220;oh, but then you&#8217;ve got a single point of failure, if you release a broken version of that DLL, everything will stop working!&#8221;. Not exactly a compelling argument. If the functionality of the DLL is well defined, and there are well known entry points it should be easy to put together a comprehensive black-box test suite. In fact we already do that with all our other DLLs (COM servers). The fact that this shared library *isn&#8217;t* a DLL has meant that it&#8217;s fallen through the testing cracks; another good reason to refactor it.</p>
<p>The internal interface to the shared library is already relatively well defined. It has a set of header files that define all of the functions and classes that are consumed by others. It&#8217;s a relatively small step to compile it as a DLL, rather than a static library. The problem then becomes one of maintenance, dealing with the inevitable changes to the external interface in a backwardly compatible way.</p>
<p>And that&#8217;s the problem. It requires some effort. Elsewhere in our codebase we use COM as a magic cure-all for avoiding having to deal with versioning: interface immutability rules. All interfaces are public, no published interface ever changes, object identity is based purely on interfaces supported. If you haven&#8217;t got these crutches to rely on, then you have to enforce the rules yourself, which can be both logistically and technically difficult when you&#8217;re dealing with C++.</p>
<p>But it&#8217;s not impossible. And I really think it would be better than having hundreds of DLLs all containing subtley different versions of the same code, and being unable to change behaviour across the board without having to build, test and release them all.</p>
<p>Maybe you&#8217;ve got a different opinion?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2008/09/24/static-libraries-are-evil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Back from the brink&#8230;</title>
		<link>http://www.voyce.com/index.php/2008/02/09/back-from-the-brink/</link>
		<comments>http://www.voyce.com/index.php/2008/02/09/back-from-the-brink/#comments</comments>
		<pubDate>Sat, 09 Feb 2008 00:20:26 +0000</pubDate>
		<dc:creator>ian</dc:creator>
				<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://www.voyce.com/?p=25</guid>
		<description><![CDATA[&#60;sigh&#62; After the attack of the incompetent hosts (1&#38;1). Previous content should be restored shortly.
]]></description>
			<content:encoded><![CDATA[<p>&lt;sigh&gt; After the attack of the incompetent hosts (1&amp;1). Previous content should be restored shortly.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.voyce.com/index.php/2008/02/09/back-from-the-brink/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

