<?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>Perfect imprecision, thoughts on memory leaks, performance profiling, code coverage, deadlock detection and flow tracing</title>
	<atom:link href="http://www.softwareverify.com/software-verify-blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.softwareverify.com/blog</link>
	<description>Being productive with software tools</description>
	<lastBuildDate>Mon, 23 Apr 2012 10:05:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>x64 Porting gotcha #3. Serializing collections</title>
		<link>http://www.softwareverify.com/blog/?p=1747</link>
		<comments>http://www.softwareverify.com/blog/?p=1747#comments</comments>
		<pubDate>Sun, 22 Apr 2012 13:21:47 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Porting to Win64]]></category>
		<category><![CDATA[datatype]]></category>
		<category><![CDATA[loading]]></category>
		<category><![CDATA[mismatch]]></category>
		<category><![CDATA[saving]]></category>
		<category><![CDATA[serialization]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1747</guid>
		<description><![CDATA[When Microsoft ported MFC to 64 bits they also changed the return type for the GetSize() and GetCount() methods in the collection classes. They changed the return type from the 32 bit DWORD to the 64 bit DWORD_PTR on x64. This has implications if you write your own collection serialization methods. For example if you [...]]]></description>
			<content:encoded><![CDATA[<p>When Microsoft ported MFC to 64 bits they also changed the return type for the GetSize() and GetCount() methods in the collection classes. They changed the return type from the 32 bit DWORD to the 64 bit DWORD_PTR on x64. This has implications if you write your own collection serialization methods. For example if you use a CMap&lt;&gt; to map a thread id to an object you will want to write your own serialization code. </p>
<p>For example (error checking removed for simplification), consider the serialization of this collection.</p>
<pre>
	CMap<DWORD, DWORD, runningObjectManager *, runningObjectManager *>		threadObjectStatistics;
</pre>
<p><b>Saving</b></p>
<pre>
	CSingleLock	lock(&#038;threadObjectStatisticsSect, TRUE);
	POSITION	pos;

	ar << threadObjectStatistics.GetCount();

	pos = threadObjectStatistics.GetStartPosition();
	while(pos != NULL)
	{
		runningObjectManager	*rom = NULL;
		DWORD			threadID;

		threadObjectStatistics.GetNextAssoc(pos, threadID, rom);
		ar << threadID;
		rom->save(ar);
	}
</pre>
<p><b>Loading</b></p>
<pre>
	CSingleLock	lock(&#038;threadObjectStatisticsSect, TRUE);
	DWORD		i, count;

	ar >> count;
	for(i = 0; i < count; i++)
	{
		runningObjectManager	*rom = new runningObjectManager();
		DWORD			threadID;

		ar >> threadID;
		rom->load(ar);
		threadObjectStatistics.SetAt(threadID, rom);
	}
</pre>
<p>In the above code the first item saved/loaded is the number of objects in the CMap. After that the thread id and the complex object associated with the type is saved/loaded for each pair of objects in the CMap. The code above uses a DWORD to load the size. This won&#8217;t work for x64 because the count of objects is taken directly from the GetCount() method (or GetSize() for some collection types). </p>
<pre>
	ar << threadObjectStatistics.GetCount();
</pre>
<p><b>x86</b>, return type is DWORD, count is saved as DWORD (32 bit)</p>
<p><b>x64</b>, return type is DWORD_PTR, count is saved as DWORD_PTR (64 bit)</p>
<p>This is a problem because the loading code is expecting a DWORD.</p>
<pre>
	DWORD		i, count;

	ar >> count;
</pre>
<p><i>Update (23/4/2012): Turns out the same issue affects the STL collections as well. If you are directly serializing the result from the size() method in an STL collection you will be faced with the same problem as I describe for MFC.</i></p>
<h2>Solution 1</h2>
<p>One solution is simply to change the type being loaded from a DWORD to a DWORD_PTR.</p>
<pre>
	DWORD_PTR	i, count;

	ar >> count;
</pre>
<h2>Solution 2</h2>
<p>An alternative solution is to always save the size as a DWORD.</p>
<pre>
	DWORD		count;

	count = (DWORD)threadObjectStatistics.GetCount();
	ar << count;
</pre>
<h2>Conclusion</h2>
<p>You may think this is a trivial issue and why write a blog post about it? I agree the actual problem is trivial and the fix  for it is also trivial. However the fact that you have a mismatch in datatypes being serialized because you directly serialized the return value from GetCount() is not so obvious. So much so that this particular issue escaped our attention (and got past a static analyser) until today. </p>
<p>So yes, its a trivial problem but its a hidden problem and it will cause all sorts of issues during serialization and when you go looking for it you'll probably look straight past it for a while. Hopefully I've just saved you a few hours of banging your head on a brick wall, or more likely your desk.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1747&amp;title=x64%20Porting%20gotcha%20%233.%20Serializing%20collections"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1747</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Communication</title>
		<link>http://www.softwareverify.com/blog/?p=1591</link>
		<comments>http://www.softwareverify.com/blog/?p=1591#comments</comments>
		<pubDate>Fri, 30 Mar 2012 15:20:12 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Communication]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[terse]]></category>
		<category><![CDATA[verbose]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1591</guid>
		<description><![CDATA[Are you any good at communication? Thats a good question. If you&#8217;re like me, you probably think you are not good at communication. You may think that good communicators are slick, polished, don&#8217;t make mistakes, can sum things up nicely and exude a certain level of confidence. Well yes, the public speakers that have been [...]]]></description>
			<content:encoded><![CDATA[<p>Are you any good at communication? Thats a good question. If you&#8217;re like me, you probably think you are not good at communication.</p>
<p>You may think that good communicators are slick, polished, don&#8217;t make mistakes, can sum things up nicely and exude a certain level of confidence. Well yes, the public speakers that have been around for a while do tend to be that way. But that is more the result of speaking in public many times than natural ability. Eric Ries wasn&#8217;t as polished when he started speaking in public. He is the first to admit that. Practice makes perfect. </p>
<p>That isn&#8217;t want I&#8217;m talking about. I&#8217;m asking you if you communicate your ideas to others and if at the end of the conversation do they understand you? </p>
<p>Why am I mentioning this? Years ago I had a performance review by my line manager. The review was done in 3 parts. My manager would fill in his scores for various tasks and abilities, rating me. I would do the same. Then we&#8217;d compare the scores we had for each task and discuss the differences/similarities and how to improve any areas that needed improvement and how to make the most of areas I excelled at.</p>
<p>There were lots of categories, none of which I can remember except for &#8220;communication&#8221;. I don&#8217;t tend to award myself a 10 or 1 in anything when I self score, so the sheet had various high scores and a few low scores. I was hitting it out of the park in software development terms (which would come back to bite me a few years later in the form of RSI &#8211; my work was 3 months ahead of schedule) but for communication I gave myself a really low mark.</p>
<p>The really low mark for communication confused my line manager and we spent a good chunk of the review just talking about communication. I had interpreted &#8220;communication&#8221; on the form as &#8220;Can I present, Do I speak in public, do I do this, that the other&#8230;&#8221; all these imagined things that I thought a good speaker should do. I didn&#8217;t think I could do them.</p>
<p>My line manager wasn&#8217;t interested in that. He was interested in did my team mates, colleagues, people in teams interfacing with our team (in person or via our documented API), senior managers etc, did these people understand the technical work I was doing? Did they understand how to use it, why certain things were the way they were and most importantly if someone came and asked me a question could I answer it with confusing the living daylights out of them?</p>
<p>Turns out I could. I scored quite well on all that. No idea what he wrote down. Not really relevant these days.</p>
<p>All I&#8217;m trying to say is communication is making sure the other person understands. Far better to be slightly slower, or more verbose, or elaborate (or whatever) and succeed in communicating than be super concise, uber terse, abrupt and leave the other person feeling bewildered or intimidated by what you&#8217;ve just said.</p>
<p>How do you feel about communication now? Think you&#8217;re better at it than before reading this?</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1591&amp;title=Communication"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1591</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>64 bit porting gotcha #2! x64 Register preservation</title>
		<link>http://www.softwareverify.com/blog/?p=1689</link>
		<comments>http://www.softwareverify.com/blog/?p=1689#comments</comments>
		<pubDate>Fri, 09 Mar 2012 20:01:24 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Porting to Win64]]></category>
		<category><![CDATA[16 byte alignment]]></category>
		<category><![CDATA[assembler]]></category>
		<category><![CDATA[floating point]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1689</guid>
		<description><![CDATA[In a previous article on x64 development I mentioned the problem of aligning the callstack on 16 byte boundaries and what happens if you do not do this. Why 16 bytes? At the time it seemed odd to me that the stack had to be 16 byte aligned. Why? All the parameters are 8 bytes [...]]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://www.softwareverify.com/blog/?p=376" title="x64 datatype alignment">previous article on x64 development</a> I mentioned the problem of aligning the callstack on 16 byte boundaries and what happens if you do not do this.</p>
<h2>Why 16 bytes?</h2>
<p>At the time it seemed odd to me that the stack had to be 16 byte aligned. Why? All the parameters are 8 bytes (64 bits) wide and the first four are passed in registers. Everything else spills onto the stack and anything larger is passed as a reference. Floating point values are passed in dedicated floating point registers.</p>
<p>And there lies the key. That last sentence. The floating point registers.</p>
<p>Floating point on x64 is not done using the floating point coprocessor instructions. Instead the SSE instruction sets (and its extensions) are used.</p>
<h2>If everything floats, whats the point?</h2>
<p>If you are just hooking x64 functions and possibly collecting callstack you may never know need to know about floating point register preservation. We managed to get all four of our C++ tools (coverage, memory, profiler and deadlock detector) functional without knowing. Why would we need to know? Floating point preservation was never important for x86 because we could never damage the floating point without trying to do so.</p>
<p>But when we got into the details of the last bugs that were killing us we noticed seemingly random crashes. Closer investigation showed that calls to Win32 API functions had a tendency to wipe out the floating point registers. And that is when we got interested in what happens if we preserved the x64 floating point registers.</p>
<h2>How to view the registers?</h2>
<p><img src="http://www.softwareverify.com/blogImages/VS2008Registers.png"></p>
<p>At first glance this wasn&#8217;t obvious to me. <img src="http://www.softwareverify.com/blogImages/VS2008RegisterMenu.png" style="float:right; left-margin:20px;"> The Registers window in Visual Studio just shows the registers from RAX through R15 etc. However if you right click this window there is a helpful context menu that allows you to choose just how much information you display in this window.</p>
<p>Once you have the registers in view things get a lot easier inside the debugger. You can step through your code ensuring that nothing is getting trampled on until Viola! the floating point registers get totally hosed. A bit more investigation and you realise that seemingly innocent call you had in your code contains a call to a Win32 function (for example VirtualProtect) and that that function is responsible for the register death.</p>
<p>OK, so how do we preserve registers on x64? Its nothing like on x86.</p>
<h2>x64 floating point preservation</h2>
<p>The x64 designers in their infinite wisdom took away two very useful instructions (pushad and popad). As a result x64 hook writers now have to push lots of registers and pop lots of registers at the start and end of each hook. You can even see this in parts of the Windows operating system DLLs. So much simpler just to push everything and pop everything.</p>
<p>However what the Lord taketh away he can give back. And the x64 designers did that by providing two dedicated instructions for saving and restoring floating point. fxsave and fxrstor. These instructions take one operand each. The operand must point to a 512 byte chunk of memory which is 16 byte aligned.</p>
<p>A common usage would be as shown below although you can use any register as the destination location. It just so happens that the stack pointer (rsp) is the most common usage.</p>
<pre>
	sub	rsp, 200h;
	fxsave	[rsp];

	.. do your task that damages the floating point registers

	fxrstor	[rsp;]
	add	rsp, 200h;
</pre>
<p>When you see the above usage you can see why there is the requirement for the stack to be 16 byte aligned. Why 16 bytes? I suspect it is because it is the start of a cache line and that makes executing the instruction *SO* much quicker. </p>
<h2>Conclusion</h2>
<p>So now you know why the x64 callstack is 16 byte aligned. Its all to do with ensuring your code executes as fast as possible, especially when executing a memory intensive register copy when saving and restoring the x64 floating point registers. I&#8217;ve also shown you how to preserve and restore the floating point registers.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1689&amp;title=64%20bit%20porting%20gotcha%20%232%21%20x64%20Register%20preservation"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1689</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unhandled non-continuable exception. What?</title>
		<link>http://www.softwareverify.com/blog/?p=1642</link>
		<comments>http://www.softwareverify.com/blog/?p=1642#comments</comments>
		<pubDate>Fri, 17 Feb 2012 13:13:01 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[module not found]]></category>
		<category><![CDATA[static analysis]]></category>
		<category><![CDATA[unhandled]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1642</guid>
		<description><![CDATA[The Problem A few days ago I was testing the latest version of C++ Memory Validator x64. The testing was going fine until I tried testing a particular test tool of ours. C++ Memory Validator x64 would inject into the test tool, start injecting then just die at some point. No problem, just set the [...]]]></description>
			<content:encoded><![CDATA[<h2>The Problem</h2>
<p>A few days ago I was testing the latest version of C++ Memory Validator x64.</p>
<p>The testing was going fine until I tried testing a particular test tool of ours. C++ Memory Validator x64 would inject into the test tool, start injecting then just die at some point.</p>
<p>No problem, just set the injection flags to inject a breakpoint and that&#8217;ll trigger the debugger as soon as we inject. This works with most software and with all our test tools. No joy. Hmmm, puzzling.</p>
<p>OK, try again, but when we get to CreateProcess() I&#8217;ll attach the debugger to the paused process myself. That&#8217;ll work. Right? Wrong. The debugger does attach and thats great. I resume the process and the the debugger spits out a really impenetrable error message.</p>
<p><I>&#8220;Debugger:: An unhandled non-continuable exception was thrown during process load&#8221;.</I></p>
<p>That is a really useful and useless message all in one.</p>
<table border="0")<br />
<tr>
<th>Useful</th>
<td>Unhandled. No one handled it, so in that case it will be a problem.</td>
</tr>
<tr>
<th>Useful</th>
<td>Non-continuable. Even if someone could handle it, you can&#8217;t recover from it. Major problem.</td>
</tr>
<tr>
<th>Useless</th>
<td>No description of what the exception was, no exception code, nothing. Why?</td>
</tr>
</table>
<h2>Next steps</h2>
<p>One possible next step would be <img src="http://www.softwareverify.com/blogImages/exceptionDebugMenu.png" style="margin-left: 10px; float:right;"> to repeat this sequence but before resuming the application, go to the debugger and open the Exceptions dialog from the Debug menu.</p>
<p>When the Exceptions dialog is displayed go to the Win32 exceptions part of the settings and expand it so that you can see the various exceptions that will be reacted to. We need to tell the debugger to react to some of these exceptions. I&#8217;ve included screenshots with the exceptions highlighted. Feel free to enable other exceptions that you think may be troublesome.</p>
<p><img src="http://www.softwareverify.com/blogImages/exceptionAccessViolation.png" style="margin-top: 10px;"></p>
<p><img src="http://www.softwareverify.com/blogImages/exceptionModuleNotFound.png" style="margin-top: 10px;"></p>
<p>Having enabled the appropriate exceptions you can resume the process and see if the debugger reacts to any of these more obscure exceptions.</p>
<h2>Solution</h2>
<p>It turned out the problem was a DLL dependency was failing and thus resulting in a module not found exception.</p>
<p>In my case what had tripped me up was that we&#8217;ve been doing <a href="http://www.softwareverify.com/blog/?p=1604" title="Static analysis">static analysis</a> of our software recently using PC-Lint from Gimpel Software combined with Visual Lint from Riverblade. PC-Lint does the hard word of analysing your source code and Visual Lint organises the mountain of results into useful and usable information. If you&#8217;ve ever seen the log file from PC-Lint you&#8217;ll understand the benefits of a tool like PC-Lint to organise the results.</p>
<p>The result of the static analysis is that we&#8217;ve changed many APIs. Many objects that were passed in as objects (and implicitly incurred object copying penalties) are now passed as const references. Many char * strings and wchar_t * strings are now passed as const and so on. We&#8217;ve done this all over &#8211; changing our DLL APIs, everything.</p>
<p>It&#8217;s great, we&#8217;ve found bugs because of this. Really useful. But I digress. One side effect of this is that the anything dynamically or statically linked against our libraries now fails to work. We had rebuilt all the dynamically linked tests but forgotten the statically linked one. The test I was performing was statically linked.</p>
<p>Rebuilding and relinking the statically linked test meant that the DLL imports/exports now resolved and the DLL would load. Problem solved.</p>
<p>The change to our APIs is a one time change and will be painful for the folks that use our linkable APIs, but the benefits are increased software robustness for everyone, ourselves and customers alike.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1642&amp;title=Unhandled%20non-continuable%20exception.%20What%3F"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1642</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improving your code with Static Analysis tools</title>
		<link>http://www.softwareverify.com/blog/?p=1604</link>
		<comments>http://www.softwareverify.com/blog/?p=1604#comments</comments>
		<pubDate>Thu, 16 Feb 2012 13:58:25 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[dynamic analysis]]></category>
		<category><![CDATA[lint]]></category>
		<category><![CDATA[pc lint]]></category>
		<category><![CDATA[static analysis]]></category>
		<category><![CDATA[visual lint]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1604</guid>
		<description><![CDATA[At Software Verification we create tools for the dynamic analysis of software &#8211; analysing your software as it executes. This is an activity that takes places after you&#8217;ve compiled your software. There is a complementary method of analysing your software &#8211; static analysis. Static analysis is the process of analysing your software before your compile [...]]]></description>
			<content:encoded><![CDATA[<p>At Software Verification we create tools for the dynamic analysis of software &#8211; analysing your software as it executes. This is an activity that takes places after you&#8217;ve compiled your software. There is a complementary method of analysing your software &#8211; static analysis. Static analysis is the process of analysing your software before your compile it. </p>
<p>There is a small overlap between the types of bugs that static analysis and dynamic analysis can find. Static analysis will find some of the bugs dynamic analysis finds, but static analysis will also find bugs that dynamic analysis cannot find and dynamic analysis will find bugs that static analysis can&#8217;t find. In summary you should have both static analysis tools and dynamic analysis tools in your software tool box.</p>
<h3>Tools</h3>
<p>If you look around the web you will find a variety of tools, some open source and some commercial. The commercial tools range from the sensibly priced Gimpel PC Lint to tools that are so expensive you need to be sending rockets into space to afford them. For these products where the vendor does not list the price on the website, we have listed POA in the table below. POA means &#8220;Price on Application&#8221;, which you can think of as code for &#8220;very expensive&#8221;.</p>
<p>One other thing, most of these POA tools only license you for using the tool for one year. After that you have to buy the software again (not maintenance, but the right to use the software again). So they are even more expensive than you think.</p>
<p>This is not an exhaustive list of tools. There are many more, especially if you look outside of C/C++.</p>
<table border="0">
<tr>
<th>Tool</th>
<th>Type</th>
<th>Cost</th>
<th>Web</th>
</tr>
<tr>
<td>Coverity</td>
<td>Yearly subscription</td>
<td>POA</td>
<td><a href="http://www.coverity.com/" title="Coverity">http://www.coverity.com/</a></td>
</tr>
<tr>
<td>Klocwork</td>
<td>Yearly subscription</td>
<td>POA</td>
<td><a href="http://www.klocwork.com/" title="Klocwork">http://www.klocwork.com/</a></td>
</tr>
<tr>
<td>Understand</td>
<td>Yearly subscription</td>
<td>POA</td>
<td><a href="https://www.scitools.com/index.php" title="SciTools Understand">https://www.scitools.com</a></td>
</tr>
<tr>
<td>CodeSonar</td>
<td>Yearly subscription</td>
<td>POA</td>
<td><a href="http://www.grammatech.com/products/codesonar/overview.html" title="GrammaTech Code Sonar">http://www.grammatech.com</a></td>
</tr>
<tr>
<td>Pattern Insight</td>
<td>Yearly subscription</td>
<td>POA</td>
<td><a href="http://patterninsight.com/products/code-assurance" title="Pattern Insight">http://patterninsight.com/products/code-assurance</a></td>
<td></td>
</tr>
<tr>
<td>Imagix</td>
<td>Yearly subscription</td>
<td>POA</td>
<td><a href="http://www.imagix.com/a/source-code-analysis.html" title="Imagix">http://www.imagix.com/a/source-code-analysis.html</a></td>
</tr>
<tr>
<td>CheckMarx</td>
<td>Yearly subscription</td>
<td>POA</td>
<td><a href="http://www.checkmarx.com" title="CheckMarx">http://www.checkmarx.com</a></td>
</tr>
<tr>
<td>Parasoft C++ Test</td>
<td>Commercial</td>
<td>POA</td>
<td><a href="http://www.parasoft.com/jsp/products/cpptest.jsp" title="C++ Test">http://www.parasoft.com/jsp/products/cpptest.jsp</a></td>
</tr>
<tr>
<td>QA C++</td>
<td>Commercial</td>
<td>POA</td>
<td><a href="http://www.programmingresearch.com/qacpp_main.html" title="QA C++">http://www.programmingresearch.com/qacpp_main.html</a></td>
</tr>
<tr>
<td>SEntry</td>
<td>Yearly subscription</td>
<td>$4,995 US</td>
<td><a href="http://www.vigilantsw.com/" title="SEntry">http://www.vigilantsw.com/</a></td>
</tr>
<tr>
<td>Gimpel PC Lint</td>
<td>Commercial, permanent license</td>
<td>$389 US</td>
<td><a href="http://www.gimpel.com/html/pcl.htm" title="Gimpel PC Lint">http://www.gimpel.com/html/pcl.htm</a></td>
</tr>
<tr>
<td>Microsoft PREfast</td>
<td>Commercial</td>
<td>Free</td>
<td><a href="http://msdn.microsoft.com/en-us/windows/hardware/gg487345.aspx" title="Microsoft PREfast">http://msdn.microsoft.com/en-us/windows/hardware/gg487345.aspx</a></td>
<td></td>
</tr>
<tr>
<td>CppCheck</td>
<td>Open Source</td>
<td>Free</td>
<td><a href="http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page" title="CppCheck">http://sourceforge.net/apps/mediawiki/cppcheck</a></td>
</tr>
<tr>
<td>Splint</td>
<td>Open Source</td>
<td>Free</td>
<td><a href="http://lclint.cs.virginia.edu/" title="Splint">http://lclint.cs.virginia.edu/</a></td>
</tr>
<tr>
<td>Google cpplint.py</td>
<td>Open Source</td>
<td>Free</td>
<td><a href="http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py" title="C++ Lint">http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py</a></td>
</tr>
<tr>
<td>Inspirel Vera++</td>
<td>Commercial</td>
<td>Free</td>
<td><a href="http://www.inspirel.com/vera/" title="Inspirel Vera++">http://www.inspirel.com/vera/</a></td>
</tr>
</table>
<p>In addition to the above tools there is also a Visual Studio addin (Visual Lint by Riverblade) that can manage many of the above tools and provide you with a very usable, nice interface to the mountains of data some of these tools can generate. Visual Lint is not actually a lint or static analysis tool. Visual Lint&#8217;s job is to organise the output of the static analysis tools.</p>
<table border="0">
<tr>
<td>Riverblade Visual Lint</td>
<td>Commercial, permanent license</td>
<td>$399 US (varies)</td>
<td><a href="http://www.riverblade.co.uk/" title="Riverblade Visual Lint">http://www.riverblade.co.uk/</a></td>
</tr>
</table>
<h3>Our static analysis history</h3>
<p>Several years ago we thought getting a static analysis tool would be a good idea. We approached several tool vendors and drew a blank. The prices were astronomical &#8211; Coverity (based on their standard pricing) would want $5.6 million (for a one year, single user license) if I remember correctly. An email exchange with them revealed they would provide a discount but the price was still more than half a million dollars. We approached Klocwork but their reseller was only interested in selling us a five user license when we only wanted a single user license. I think that was $20,000 for a one year license.</p>
<p>We had previously used <a href="http://www.gimpel.com/html/pcl.htm" title="Gimpel PC Lint">Gimpel PC Lint</a>, but found it very hard to configure. Then we found <a href="http://www.riverblade.co.uk/" title="Riverblade Visual Lint">Riverblade&#8217;s Visual Lint</a> which is an addon for Microsoft Visual Studio. Visual Lint works with many other analysis tools and provides a nice visual front end for viewing the output of the other tools. For us this was perfect as it worked with Gimpel PC Lint and configured it correctly out of the box. No messing with Gimpel PC Lint to make it work with our Visual Studio builds. </p>
<p>We have been analysing our software using Visual Lint recently. We haven&#8217;t found a lot of bugs, but it has revealed subtle signed/unsigned conversions, some logic errors, redundant code and some code that could (in the right conditions) manifest as bugs. It also reports various issues that you may regard as coding style issues. One of the coding styles I hate is the call a function, assign its return value and test a conditional all in one. </p>
<pre>
    if (!(fResult = ETPhoneHome()))
    {
        RideBicycleIntoSpace();
    }
</pre>
<p>How much clearer to write:</p>
<pre>
    fResult = ETPhoneHome();
    if (!fResult)
    {
        RideBicycleIntoSpace();
    }
</pre>
<p>The compiler will generate the same code, but the second is easier to read and should you need to debug it, the second version is easier to debug. Disk space is cheap. There is no reason to code in the style of the first version. As such the informational warnings like this can be used a mini-style guides. Fix the issue to remove the informational warning from the tool output. </p>
<p>For any warning you don&#8217;t agree with or don&#8217;t care about you can filter them out.</p>
<p>I must say that I&#8217;m very pleased with the outcome of this exercise. I can recommend the combination of Gimpel PC Lint and Visual Lint. Finding these bugs so easily has paid for the software tools used to find them.</p>
<h3>Unusual benefits</h3>
<p>I&#8217;m going to list a few  things the PC-Lint/Visual Lint combination warns about which I&#8217;ve found beneficial.</p>
<p><b>Variables not initialised in constructors and functions.</b></p>
<p>Easy mistakes to make. Often caused by logic errors rather than forgetfulness.</p>
<p><b>Unused variables, unused functions and unreachable code.</b></p>
<p>Variables you once needed, left behind after edits, cluttering the place up. Same for debugging function and historically obsolete code. Useful to know what you can safely remove. A word of caution though &#8211; be sure to check for conditional compilation excluding the code for the lint analysis. Lint can get this wrong sometimes.</p>
<p><b>Incorrectly defined copy constructors and assignment operators.</b></p>
<p>I&#8217;ve found these to be a boon. The previous constructors and operators worked OK, but better to have them in the style that STL will expect.</p>
<p><b>Lack of const</b></p>
<p>Before: </p>
<pre>
void myFunc(char *title);

void myFuncRef(CString &#038;title);
</pre>
<p>After:</p>
<pre>
void myFunc(const char *title);

void myFuncRef(const CString &#038;title);
</pre>
<p>These are minor wins as this change only gets suggested if Lint can determine that the parameter is not modified. However it is a win for the rest of your software as you can now pass const objects into these functions without casting them to none const (ouch!) and also know that the function, if modified to modify the objects will not compile properly. So it is a useful maintenance win.</p>
<p><b>Change from pass by value to pass by const reference.</b></p>
<p>Before: </p>
<pre>
void myFuncRef(CString value);
</pre>
<p>After:</p>
<pre>
void myFuncRef(const CString &#038;value);
</pre>
<p>This is a major win. You get the maintenance wins from the previous example plus you get a CPU saving because there is no implicit object copying happening to pass the value into the function. In the case of complex objects (like CString) which allocate memory on construction and destroy memory on destruction there you save even more CPU cycles because the memory manager is not called. Additionally you are less likely to fragment the heap because the heap is used less. Win, win, win! </p>
<p>You definitely want to be making changes like this. Visual Lint will tell you stuff like this in its results. </p>
<p>The only downside to these changes are that you need to rebuild after the changes. If the changes are in a core header file or a class that many files use you&#8217;ll spend a while rebuilding. But this pain is short-lived. You&#8217;re making the software more robust in the process and long term that is a worthwhile trade off.</p>
<h3>Pricing</h3>
<p>I think most static analysis tool vendors are missing a huge opportunity. By pricing themselves so expensively most software houses will not purchase such tools. Then to compound matters they make it a yearly subscription so you have to spend the full price again each year. When I look at purchasing software the first thing I look for is a published price list. I&#8217;m not overly concerned with the prices until I&#8217;ve tried the software, but if the prices are not listed I don&#8217;t even bother evaluating the software because I know the price will be too high. It&#8217;s a waste of my time evaluating a tool, finding that I like it only to find out it&#8217;s $20,000 per year per user to use.</p>
<p>Any company that chooses to price their tools so they are affordable to software developers (in the $200 &#8211; $1000) range will have a much better opportunity for these tools. From what I can see only <a href="http://www.gimpel.com" title="Gimpel">Gimpel</a> and <a href="http://www.riverblade.co.uk/" title="Riverblade">Riverblade</a> have taken this route. </p>
<h3>Conclusion</h3>
<p>If you are not using static analysis tools I recommend that you spend some time investigating such tools. The free tools have their pitfalls &#8211; incomplete implementation and they don&#8217;t always have support. CppCheck seems to be highly thought of. If you are using Gimpel PC Lint or want to use a lint then I recommend Visual Lint for use with Visual Studio. If you have the budget then check out the POA tools in the table above.</p>
<p>Some people make the mistake of thinking that static analysis tools replace dynamic analysis tools (like <a href="http://www.softwareverify.com/cpp-memory.php" title="C++ Memory Validator">C++ Memory Validator</a>, etc). Static analysis tools complement dynamic analysis tools. There is a small middle ground where some bugs will be identified by both a static analysis tool and a dynamic analysis tool, but each group of tools can identify whole classes of bug that the other tool cannot identify.</p>
<p><b>If you are a tool vendor listed above please let us know your pricing and/or licensing terms if this article lists it incorrectly.</b></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1604&amp;title=Improving%20your%20code%20with%20Static%20Analysis%20tools"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1604</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Improving MFC memory performance</title>
		<link>http://www.softwareverify.com/blog/?p=1588</link>
		<comments>http://www.softwareverify.com/blog/?p=1588#comments</comments>
		<pubDate>Mon, 02 Jan 2012 12:16:47 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1588</guid>
		<description><![CDATA[If you are using MFC arrays it is possible in quite a few cases to improve the speed and memory performance of these arrays. This applies to the standard CStringArray, CUIntArray and similar classes and also to template classes based upon the CArray template. If you are not using MFC but using another framework or [...]]]></description>
			<content:encoded><![CDATA[<p>If you are using MFC arrays it is possible in quite a few cases to improve the speed and memory performance of these arrays. This applies to the standard CStringArray, CUIntArray and similar classes and also to template classes based upon the CArray template.</p>
<p>If you are not using MFC but using another framework or set of classes that provide similar functionality you can often find similar functions in those classes that will allow you to get a similar benefit to what I will describe in this article.</p>
<h2>The Problem</h2>
<p>The problem is the typical use of populating the array is by calling the Add() method to add something to the array. No actual problem with that, its simple and straightforward enough. However, under the hood, each time you call Add() the array class has to reallocate more memory of the data stored in the class.</p>
<p>This reallocation has a cost. The cost is increased CPU usage as suitable memory space is searched for by the memory allocator and memory is copied and reassigned inside the class. For small arrays this is not really a problem.</p>
<p>However for larger arrays this becomes quite a noticeable issue. In addition you also run into potential memory fragmentation issues, where memory &quot;holes&quot; of an unusuable size are left in the memory managed by the memory allocator. Should enough of these holes occur you can suffer out of memory conditions even when Task Manager tells you you have available memory. Frustrating! I&#8217;ll cover Memory Fragmentation in a different article.</p>
<p>Here is a (simplified) example of the type of problem:</p>
<pre>
// read data from the serialization archive and store in an array

DWORD i, n;

ar >> n;
for(i = 0; i < n; i++)
{
    someClass *sc;

    sc = new someClass();
    if (sc != NULL)
    {
        sc->load(ar);
        array.Add(sc);
    }
}
</pre>
<h2>The Solution</h2>
<p>In the case shown above we know how many objects we require storage for beforehand. This means we can tell the array how many objects to store and only perform one memory allocation to set aside storage for the array. This has CPU benefits and also because there are no repeated calls to reallocate the memory the likelihood of fragmentation occurring diminishes dramatically. In many cases, completely removed from the scenario.</p>
<p>To set the size beforehand we need to call SetSize(size); and to place data in the array we no longer use Add();, but use SetAt(index, data); instead. </p>
<p>Here is the reworked example:</p>
<pre>
// read data from the serialization archive and store in an array

DWORD i, n;

ar >> n;
array.SetSize(n);
for(i = 0; i < n; i++)
{
    someClass *sc;

    sc = new someClass();
    if (sc != NULL)
    {
        sc->load(ar);
        array.SetAt(i, sc);
    }
}
</pre>
<p>For large volumes of data the above implementation can be noticeably faster.</p>
<h2>Caveats</h2>
<p>When you preallocate memory like this you must be aware that if you don&#8217;t fill all locations in the array using SetAt() you may get errors when you call GetSize() to get the array size and GetAt(i) to retrieve data. </p>
<pre>
// read data from the serialization archive and store in an array
// we won't store all data, leaving some unused memory at the end of
// the array

DWORD i, n, c;

ar >> n;
c = 0;
array.SetSize(n);
for(i = 0; i < n; i++)
{
    someClass *sc;

    sc = new someClass();
    if (sc != NULL)
    {
        sc->load(ar);
        if (sc->IsEmpty())
        {
            // discard

            delete sc;
        }
        else
        {
            array.SetAt(c, sc);
            c++;
        }
    }
}
</pre>
<p>GetSize() will return the size of the array you set when you called SetSize(), this is not necessarily the number of items in the array &#8211; this will come as a surprise to people used to adding data by calling Add().</p>
<p>To fix this, use FreeExtra() to remove any unused items from the end of the array. You can also use GetUpperBound() to find the largest index that is used by the array. The example below shows this.</p>
<pre>
// read data from the serialization archive and store in an array
// we won't store all data, leaving some unused memory at the end of
// the array

DWORD i, n, c;

ar >> n;
c = 0;
array.SetSize(n);
for(i = 0; i < n; i++)
{
    someClass *sc;

    sc = new someClass();
    if (sc != NULL)
    {
        sc->load(ar);
        if (sc->IsEmpty())
        {
            // discard

            delete sc;
        }
        else
        {
            array.SetAt(c, sc);
            c++;
        }
    }
}

// make sure array.GetSize() returns the max number of items used

array.FreeExtra();
</pre>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1588&amp;title=Improving%20MFC%20memory%20performance"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1588</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Business of Software 2011 &#8211; mind food</title>
		<link>http://www.softwareverify.com/blog/?p=1541</link>
		<comments>http://www.softwareverify.com/blog/?p=1541#comments</comments>
		<pubDate>Tue, 22 Nov 2011 10:36:39 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[conference]]></category>
		<category><![CDATA[Talks & conferences]]></category>
		<category><![CDATA[Business of Software]]></category>
		<category><![CDATA[education]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1541</guid>
		<description><![CDATA[A few weeks ago in October I travelled to Boston, MA for the Business of Software conference. This is the number one conference to go to for folks aiming to create a software business to last the long term. This isn&#8217;t a place to come if you want to create a Facebook then flip it [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago in October I travelled to Boston, MA for the Business of Software conference. This is the number one conference to go to for folks aiming to create a software business to last the long term. This isn&#8217;t a place to come if you want to create a Facebook then flip it and walk away with millions. Nothing sustainable about flipping companies.</p>
<p>Twitter seemed to come into its own at and before the conference. People using phones, iPads, laptops to coordinate who they were eating with and when. #BoS2011 became unmanageable. Mark Littlewood&#8217;s advice to use Tweetdeck was well received.</p>
<h3>Audience</h3>
<p>Its a self selecting audience. They&#8217;re all very bright, self motivated. A lot of the people attending run their own businesses, from one man companies to some larger organisations like Red Gate who brought a good chunk of their staff with them. 30 people? 50 people? I don&#8217;t know. A lot &#8211; more than many people have on their entire staff. I spent Saturday evening with 5 Red Gate people and most of Sunday with some more Red Gate folk. It seems that Red Gate is being quite entrepreneurial with its staff &#8211; exposing them to conferences like this and training them for the future. It seems like a much more thoughtful vision for their future than most companies take.</p>
<p>Microsoft had some people in attendance too. The only Microsoftee I met was Patrick Foley, who was brave enough to give a Lightning talk. One attendee had travelled all the way from Romania, using three planes to get to Boston. He was probably one of the youngest attendees too. I spent a chunk of Tuesday evening chatting with him in The Whiskey Priest. Not sure I&#8217;d have been that keen to travel that far for a conference at age 25. Kudos.</p>
<p>The quality of the speakers was incredible. I thought Clayton Christensen would be the top draw (I&#8217;ve read most of his books, found them really interesting) but as it turned out I preferred the speakers on the second day &#8211; Rory Sutherland and Josh Linkner in particular. Most speakers manage to weave humour into their talks. I don&#8217;t know if this was planned, opportunist or just something you get good at. </p>
<h3>Note taking</h3>
<p>I typically record each speaker so that I can listen to them again. Unfortunately for me, although armed with loads of AA batteries when it came to record day two they all failed. So I couldn&#8217;t record what turned out to be my favourite talks. Next time, purchase the batteries when I get there, don&#8217;t rely on them being OK just because they&#8217;ve never been used.</p>
<p>Although at MicroConf I took copious notes, I took very few at Business of Software. I was just too wrapped up in what was being presented. When I look at my notes its in my typical unreadable &#8220;I should have been a doctor&#8221; handwriting, with a good chunk of the notes not about the talk being given but about ideas for improving the software process at Software Verification. Its as if being there was stimulating me to take action over what we will do in future. Part of me is pleased with this and part of me is frustrated I didn&#8217;t take more written notes.</p>
<p>The Business of Software goodie bag was unusual &#8211; full of stuff I will actually read. Books from some of the speakers. Their talks were interesting, so that bodes well for the books they wrote.</p>
<h3>Business of Software Team</h3>
<p>The team Mark Littlewood assembled were superb. They were always on hand to help. When I asked them for help with some nuts (I needed protein as the vegetarian food was all carbohydate and had no pulses etc) they to my amazement found some fruit and nuts for me. I expected them to tell me where I could find a shop. Later that evening two of them saw me collasped on a seat at The Whiskey Priest and came over. They wanted to walk me back to the hotel until I explained I&#8217;d be alright in about 20 minutes &#8211; when my blood sugar had become normal again after eating (I shouldn&#8217;t have had the beer so soon after eating with the noise of the Business of Software band &#8211; too much).</p>
<p>As well as the BoS team, the conference centre staff were helpful and courteous. Americans really understand service. So often I&#8217;ve had bad experiences in the UK. </p>
<h3>Clayton Christensen</h3>
<p>Clayton Christensen&#8217;s talk was pretty much a summary of his Innovator&#8217;s Dilemma book. Given that I&#8217;ve read his books I didn&#8217;t talk many notes. I think the standout items for me were:</p>
<ul>
<li>The customer rarely buys what the company thinks it is selling him.</li>
<li>You should be focussing on &#8220;What is the job to be done (by the customer)?&#8221;.</li>
<li>Look to the bottom of the market, that is where the innovation will come.</li>
</ul>
<p>The second point is really telling. Most companies create products they try to sell to customers. They don&#8217;t actually research what it is a potential customer is trying to do. Are you really trying to buy a car or just go from A to B conveniently? If its the latter a car may not be the best thing to sell them. On this point, in Cambridge, UK, there has been a rise in the number of people ditching their car and switching to electric bicycles. Job to be done is commuting around town. You don&#8217;t necessarily need a car for that.</p>
<p>This third point was illustrated nicely with the example of solar power. In the USA and Europe we have government grants creating solar power and wind farms. But that is trying replace the existing fossil fuel based systems with intermittent solar and wind power. But if you go to Africa and parts of Asia where there is an underserved market (people with little or no power supply) then an intermittent supply of solar and wind is more useful than no power supply. It is in these markets that new technologies to improve the intermittent power supply (with better battery technology for storage and better solar cell technology for improved generation, etc) can flourish. Eventually these technologies will get good enough to start competing in the more traditional markets for power in the Western economies. The key thing is that the economic drivers are in the underserved markets, not in the well served markets.</p>
<p>More Information: <a href="http://www.claytonchristensen.com/" title="Clayton Christensen">http://www.claytonchristensen.com/</a></p>
<h3>Jason Cohen</h3>
<p>Jason Cohen talked about Honesty and how companies misrepresent themselves to make themselves appear different from reality. A bit like a bird puffing up its chest to look more intimidating we write our about pages to appear different than we really are.</p>
<p>Jason argues that this is dishonest and misleading and that by being honest it is more profitable in the long run (and feels better). Jason also argues that by being candid about what you can and cannot do you also inform your customers better than the one-sided comparison charts (where every feature your software can do is listed and only your software gets a tick mark next to everything).</p>
<p>Jason sold his previous company and now runs a WP Engine. WP Engine is smaller than most of his competitors and as Jason admits, he isn&#8217;t the cheapest solution. However he believes that by being candid about your strengths and weaknesses your company size doesn&#8217;t have to be a weakness. You size means you need every customer, thus you must focus on them. Contrast this to the approach you get from Big Corp, where you are a faceless customer and often get treated like one.</p>
<p>I wrote two quotes during the talk:</p>
<ul>
<li>&#8220;Truth in limitations earns believability advances&#8221;.</li>
<li>&#8220;Open source is free like a puppy is free&#8221;.</li>
</ul>
<p>I had two todo items on my list at the end of this talk and a big note saying I must re-listen to this talk when I get home. It made an impression. Dave Collins from Software Promotions was so impressed he wrote a post about it then posted the before and after About pages so <a href="http://blog.softwarepromotions.com/index.php/lies-are-bad-2011-11-08/" title="Lies are Bad 2011">you could see the difference</a>.</p>
<p>More information: <a href="http://blog.asmartbear.com/" title="A Smart Bear">http://blog.asmartbear.com/</a></p>
<h3>Alex Osterwalder</h3>
<p>Alex Osterwalder gave a talk on Business Model Generation. I had thought Alex&#8217;s talk would be boring. And talking to some people later on (in the UX class lead by Richard Muscat) it appeared some other attendees also thought that. How wrong we were. One of the books in the goodie bag was Alex&#8217;s book on Business Model Generation.</p>
<p>On the face of it the title &#8220;Business Model Generation&#8221; sound rather dry. Alex demonstrated how to use a simple business model canvas to enter simple facts and figures about your business then use those to create other information you could use to see if the business is viable. If not viable, change some parameters and see if the new model is viable. It was surprisingly simple and easy and by the end of the talk I got the impression people wanted more. </p>
<p>To demonstrate a business model Alex used the Nespresso coffee making machines as an example. </p>
<ul>
<li>The machines are sold in retail outlets.</li>
<li>Most of the profit from sale of machines goes to the business partners.</li>
<li>Nespresso make their money from sales of the coffee pods by mail order, nespresso.com, call centers and from nespresso stores. These are all distribution channels owned and controlled by Nespresso.</li>
<li>This allows Nespresso to keep all the recurring margins.</li>
</ul>
<p>This talk also introduced the audience to Stattys, a non-sticky note that uses static electricity to stick to things rather than glue. After Business of Software Paul Kenny resorted to some awful puns because he liked Stattys so much.</p>
<p>Later on I was in the UX workshop (where we redesigned Business of Software) and talking with other attendees I found that my subgroup in the workshop all wanted to be in the Business Model Generation workshop but all of us had excluded that workshop because we thought it would be boring. None of us held that opinion after Alex&#8217;s talk. </p>
<p>Alex also demonstrated his iPad application which is a software implementation of the business model canvas. Looks quite slick and certainly an easy way to create and explore different business concepts.</p>
<p>More information at <a href="http://alexosterwalder.com/" title="Alex Osterwalder Business Model Generation">http://alexosterwalder.com/</a></p>
<h3>Dharmesh Shah</h3>
<p>Dharmesh spoke about customer retention and how to measure it, and pricing.</p>
<p>4 Churn Types:</p>
<ul>
<li>Customer. e.g. 5% 5 out of 100.</li>
<li>Revenue. e.g. 10% 20K out of 200K.</li>
<li>Discretionary. People cancel their account.</li>
<li>Involuntary. Billing failure causes cancellation.</li>
</ul>
<p>At Hubspot they use the Custom Happiness Index 2.0. This predicts how well the customer uses the software.</p>
<p>Dharmesh argues against Freemium pricing as this is a sunk cost. Instead if you want to do Freemium but without the sunk cost you should do Cheapium which is where you charge the customer the cost of supporting them. You don&#8217;t make any profit with Cheapium, but you also don&#8217;t lose money with Cheapium and you may convert some Cheapium customers to paid customers.</p>
<p>You need humans to sell Complex Products, New Products and products where the price is somewhat high (which Dharmesh defines as greater than $100/month). The point of indifference for most customers is between $30/month and $40/month.</p>
<p>More Information: <a href="http://onstartups.com/" title="On Startups">http://onstartups.com/</a></p>
<h3>Jeff Laswon</h3>
<p>Jeff Lawson gave a talk on &#8220;Saas Mating Calls&#8221; and value as perceived by the customer.</p>
<p>I don&#8217;t have many notes on this talk. The talk was somewhat ruined by a couple of people persistently talking behind me until I take no more and asked them to leave or shut up. I was so wound up by this point that I couldn&#8217;t really concentrate on Jeff&#8217;s talk. I found out later that many other folk had also been annoyed by these two people (perhaps they had not spent their own money to attend?).</p>
<p>So, sorry for no notes worth commenting on.</p>
<h3>Tobias Lütke</h3>
<p>The last talk of day one was by Tobias. Again, I don&#8217;t really have many notes. I think I was struggling with low blood sugar.</p>
<p>Tobias talked about the culture of your company. What sort of company do you want to build?</p>
<p>&#8220;Do not start a company to make money. Start a company to delight customers.&#8221;</p>
<h3>Patrick McKenzie</h3>
<p>Patrick McKenzie talked about sales funnels and A/B testing. He also revealed an engagement ring he was going to present to his girlfriend when he returned to Japan.</p>
<p><b>Sales Funnels:</b></p>
<ul>
<li>Describe the Funnel.</li>
<li>Measure the Funnel.</li>
<li>Optimize the Funnel.</li>
<li>Profit!</li>
</ul>
<p>Shorter funnels are better. Analyze your funnel. If you can find any un-needed steps in the sales funnel, remove them.</p>
<p><b>A/B Testing places:</b></p>
<ul>
<li>Home Page</li>
<li>Landing Pages</li>
<li>Pricing Page</li>
<li>Shopping Cart</li>
</ul>
<p>Test the following:</p>
<ul>
<li>Headlines</li>
<li>Offers</li>
<li>Calls to Action</li>
<li>Prominent graphic elements</li>
<li>Important micro-copy &#8211; address customer objections.<br />
<br />Example &#8220;Don&#8217;t worry, we won&#8217;t spam you&#8221; next to an email address field.</li>
</ul>
<p>Patrick recommends doing the A/B testing yourself so that you have the test data, but if you don&#8217;t want to do that use <a href="http://visualwebsiteoptimizer.com/" title="Visual Website Optimizer">Visual Website Optimizer</a> (Note: Dharmesh also said Visual Website Optimizer is good when I talked to him about Hubspot &#8211; even though Hubspot now has Performable&#8217;s A/B testing suite). Be systematic about A/B tests. It works. He says it &#8220;prints money&#8221;. </p>
<p><b>Purchasing page</b><br />
Change your purchase page to do purchasing only. Remove all un-necessary links from the purchasing page so there are no distractions. I suspect this advice is much more important for B2C websites than B2B websites.</p>
<p><b>First run experience</b><br />
Collect first run experience statistics. How many people run your software once? How many people run it twice?</p>
<p>If you know the search terms for an evaluating customer find a way to provide customised startup help for that search time on the first run of the software.</p>
<p><b>Tour Mode</b><br />
Find a way to provide an interactive tutorial to lead people through the steps to use your software effectively. This is called Tour Mode.</p>
<p><b>Telemetry</b><br />
If you do gather telemetry from your desktop software be sure to ask the user&#8217;s permission to send that data back to your servers.</p>
<p>More Information: <a href="http://www.kalzumeus.com/" title="Patrick McKenzie blog">http://www.kalzumeus.com/</a></p>
<h3>Laura Fitton</h3>
<p>Laura talked about how your communication to your customers and potential customers should <b>Be Useful</b>.</p>
<p>Be Useful. Its not about you. http://inay.org</p>
<p>Laura advocates a sequence of actions you can use to be more useful.</p>
<ul>
<li>Listen</li>
<li>Learn</li>
<li>Care</li>
<li>Serve</li>
<li>[repeat]</li>
</ul>
<p>Laura&#8217;s presentation is on <a href="http://www.slideshare.net/pistachio" title="Laura Fitton slideshare">www.slideshare.net/pistachio</a>.</p>
<p>Recommended book: <a href="http://maplebutter.com/content-marketing-for-startups/" title="Content Marketing for Startups">Content Marketing for Startups</a> by Dan Martell.</p>
<p>More information:  <a href=" hubspot.com/pistachio" title="Laura Fitton at Hubspot">hubspot.com/pistachio</a></p>
<h3>Josh Linkner</h3>
<p>Josh Linkner is VC. He didn&#8217;t talk about funding or finance. He gave an excellent talk on unleashing your creativity. His book <a href="http://www.amazon.co.uk/Disciplined-Dreaming-Proven-Breakthrough-Creativity/dp/0470922222" title="Disciplined Dreaming">Disciplined Dreaming</a> was part of the Business of Software Goodie bag.</p>
<p>Josh started by giving a background to creativity and explaining that although most of us think we are not creative, creativity is 85% learned behaviour.</p>
<p>Blocks to creativity are fear. Fear of failing. Fear that the idea/design won&#8217;t be any good. I&#8217;ll also posit that for a few people, they are afraid the idea/design will succeed and they will have to follow through.</p>
<p>Be curious. Make a point of being curious. Ask Why? Why if? Why not?</p>
<p>&#8220;Fail more to win more.&#8221;</p>
<p>Do not criticise small mistakes. </p>
<p>Encourage experiments, tolerate failure.</p>
<p><b>Remarkably Different</b><br />
Josh gave an example of an unusual and creatively inspired business &#8211; <a href="http://www.littlemissmatched.com/" title="Little Missmatched - the odd sock shop">http://www.littlemissmatched.com/</a> &#8211; where you can only buy socks in odd numbers. The socks don&#8217;t match and you can&#8217;t buy pairs. It&#8217;s a roaring success. It&#8217;s remarkably different.</p>
<p><b>5 Whys</b><br />
Josh recommends using the 5 Why&#8217;s technique. Ask &#8220;Why is this?&#8221; about the topic. Then repeat for the answer. Do this 5 times to get to different insights about what you are looking at. This technique is used in quality control, user experience design and other fields. You can use it creatively too.</p>
<p><b>Learned behaviour</b><br />
Josh demonstrated learned behaviour by describing an experiment known as <a href="http://communicatebetter.blogspot.com/2008/05/pike-syndrome.html" title="The Pike Syndrome">The Pike Syndrome</a> where a carnivorous fish (A Pike) ignores the prey fish because it had earlier learned that it was unable to eat them. In the same way, although creative during childhood, many things during our adolescent years and adulthood teach us not to be creative. But you can learn to be creative.</p>
<p><b>Role Storming</b><br />
Another technique Josh uses to encourage people to be creative is to &#8220;Role Storm&#8221;. This is where you take on the role of a particular person or character and approach the problem from their point of view. For example what would Business of Software be like if Darth Vader hosted it? What benefits and features would he be interested in? What sort of user experience would Darth Vader be expecting?</p>
<p><b>Captcha</b><br />
Josh demonstrated an alternative form of captcha that relies on understanding a caption and then acting upon it with a simple game. The layout of the game changes on a regular basis as do the captions. This makes it almost impossible for a bot to defeat the captcha. The example given was &#8220;Drag 3 peppercorns and 2 mushrooms onto the middle pizza&#8221;. It&#8217;s an inspired bit of creativity by taking the original problem and re-framing it.</p>
<p><b>Suggestion</b><br />
Take 5% of your time (2 hours) to be creative each week. You will be more productive.</p>
<p><i>I&#8217;ll be posting more on creativity as I compose tunes and people always ask me how I do that as it must be so hard and complex. Wrong! Its easy. Anyone can do it.</i></p>
<p>More information: <a href="http://joshlinkner.com/" title="Josh Linkner">http://joshlinkner.com/</a></p>
<h3>Rory Sutherland</h3>
<p>Rory Sutherland is Vice Chairman of Ogilvy, the advertising giant. Rory gave a talk about Praxeology, the study of human action. Rory talked about how creativity and rational thinking don&#8217;t necessarily go hand in hand. Rory was hilarious and the talk full of interesting nuggets. </p>
<p>I&#8217;m afraid my notes don&#8217;t do justice as I appear to have written short snippets to jog me into performing Google searches. As such I&#8217;ll list the phrases here and if any of them jog your mind or cause you to search then that is more use than me trying to frame them for you.</p>
<p>Creativity is policed by rationality but rationality is not policed by creativity. This can lead to very creative people being prevented from being creative but leave rational people to create things like the finance and banking meltdown that happened a few years ago and which we are still living through now.</p>
<p><b>Chunking</b><br />
If you want people to finish a task, split the tasks into chunks. People are much more likely to complete all tasks if approached this way.</p>
<p>You want your customers to avoid disappointment or complete surprises.</p>
<p>Rory introduced Ludwig von Mises and the subject of Praxeology. </p>
<p>Do not distinguish between subjective and tangible value.</p>
<p>Availability<br />
Signalling<br />
Handicap<br />
Hueristics and biases<br />
Framing, comparison and content<br />
Immediacy<br />
Loss</p>
<p>Information asymmetry and commitment.</p>
<p>Satisficing vs Maximising.</p>
<p><b>Make choosing easier</b><br />
Choice making is easier with 3 items than with 2 items. Put the best choice in the middle and create cheap, average, expensive choices. Most people will choose the middle one.</p>
<p><b>Framing</b><br />
Framing is all about the context in which you see the offer. Every thing is relative.</p>
<p>Reduce web steps from three to two improves conversion by approx 40%. </p>
<p>Resolve discomfort and disquiet to improve sales.</p>
<p>Behaviours lead attitudes.</p>
<p>Book: Ash Murya.</p>
<h3>Lightning talks</h3>
<p>I didn&#8217;t take any notes on the Lighting talks. </p>
<p>The most memorable talk for me was Tyler Rooney&#8217;s talk about the failures he witnessed and experienced at Amazon. The most hilarious being someone nobbling the companywide internal DNS, which killed everything. Including killing the IP-based telephones so that nobody could contact anyone to tell them to fix the problem. Sometimes economies (like purchasing IP based phones) are not economies.</p>
<p>Justin Goeres won the Lightning talk competition, so I never did bump into him (we were going to go for a meal later) because he was invited to the Speaker&#8217;s Dinner. Would he pass that up for a meal with me? No&#8230; <img src='http://www.softwareverify.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  We finally met up at breakfast the next morning.</p>
<h3>Michael McDermott</h3>
<p>The next talk was about being a design dictator at Fresh Books. I didn&#8217;t take any notes. I think I was struggling with low blood sugar.</p>
<p>Fresh Books is a good product. We use it.</p>
<h3>John Nese interviewed by Peldi</h3>
<p>The final talk of day 2 was John Nese, the owner of an <a href="http://www.sodapopstop.com/" title="Soda Pop Stop">independent Soda Pop store</a> being interviewed by Peldi. The interview was <a href="http://www.youtube.com/watch?v=gPbh6Ru7VVM" title="John Nese soda pop obsessive">prefaced with a video</a>. John Nese was fantastic. The little guy going against Big Corp (in the form of Coke and Pepsi). He had passion to spare and a true depth of knowledge about the products he sells, strong opinions on stuff he doesn&#8217;t like (Energy drinks and stupid recycling laws). </p>
<p>After the talk everyone was talking about him. Strong resonance between what he had to say and how most people felt business should be done (rather than how it often is done).</p>
<h3>Paul Kenny</h3>
<p>Paul talks about how to close a sale. How not to leave the sale dangling and how to not ruin the close by closing in the wrong way. Closing is a soft skill and not something that you can deal with in terms of cold hard data. </p>
<p>How many people in the audience are founders? Lots of hands. Good. &#8220;You are a founder. Therefore you are a salesperson.&#8221;</p>
<p>&#8220;The result of a business is a satisfied customer.&#8221;</p>
<p>How not to do it: Alec Baldwin <a href="http://www.youtube.com/watch?v=y-AXTx4PcKI" title="Always be closing">(always be closing)</a>.</p>
<p>Closing is asking for a commitment. Commit to what?</p>
<ul>
<li>Concept</li>
<li>Action</li>
<li>Purchase</li>
</ul>
<p>Asking avoids the decision making process. <em>(can&#8217;t read my handwriting, I think it says &#8220;avoids&#8221;).</em></p>
<p>Mistakes:</p>
<ul>
<li>Ask the wrong way at the wrong time. (push)</li>
<li>Fail to ask the right way at the right time.</li>
</ul>
<p>People are pushy when the have only one way of asking.</p>
<p>Once you have asked for your commitment, shut up and wait for the answer.</p>
<h3>David Cancel</h3>
<p>David Cancel talks about A/B tests. David&#8217;s company Performable was acquired by Hubspot in late 2010/early 2011.</p>
<p>Failing is good. It is OK to fail. You learn by failing.</p>
<p>He recommends having a business dashboard so you can measure your company&#8217;s health.</p>
<p>All initiatives should show improvement.</p>
<p>Use the <a href="http://en.wikipedia.org/wiki/Net_Promoter" title="Net Promoter Score">Net Promoter Score</a> to measure satisfaction.</p>
<p>If using multi-variate tests, don&#8217;t bother if you are a small company.</p>
<p>David thinks 2% is average percentage conversion rate. <em>(this is out of context).</em></p>
<h3>Alexis Ohanian</h3>
<p>Alexis Ohanian talked about different ways of making the world suck less.</p>
<p>I didn&#8217;t take any notes in particular except to remind me to give some of my time away to a local charity.</p>
<p>He also gave away an Apple MacBook. The two people that came up with winning entries both said they didn&#8217;t want or need the MacBook, so it was <a href="http://blog.businessofsoftware.org/2011/10/and-the-winner-of-alexis-ohanians-macbook-air-is.html" title="Alexis Ohanian MacBook competition">given away</a> to a public school in Melrose, Boston and a local programmer has agreed to teach at a local class.</p>
<h3>Workshops</h3>
<p>I attended two workshops at Business of Software.</p>
<p>The first workshop was by Richard Muscat from RedGate. This was a user experience workshop where we created user empathy maps for one member of a group of 5 or 6 people. Our workshop had about 30 people so we divided into 5 or 6 teams and redesigned Business of Software conference. The feedback from this workshop was given to Mark and the BoS team.</p>
<p>The second workshop I attended was with Dirk Paessler on the topic of &#8220;what do people do to keep their business online&#8221;. I had hoped to attend Nemo Chou&#8217;s workshop but it was cancelled at the last minute. As such I chose Dirk&#8217;s because I thought it may be interesting even if not directly related to what I do. It turned out to be surprisingly interesting, if only because of the extraordinary lengths Dirk&#8217;s company has gone to ensure it remains online. I got quite a few business specific takeaways from this workshop.</p>
<h3>Coming home</h3>
<p><img style="float:right; left-margin:10px;" src="http://www.softwareverify.com/blogImages/Bos2011Meal_480.jpg" alt="Krishna Kotecha, Patrick McKenzie, Corey Reid, Patrick Foley, Levi Kovacs, Tyler Rooney" /></p>
<p>After conference everyone had a chance to grab some food, possibly be interviewed by the roving cameraman. He got me. I don&#8217;t think I made a very good subject. I think you&#8217;re either good at this or not. When asked a question that required a thoughtful answer I should have paused and thought. But no. So a bit of a disaster on that front. I&#8217;m sure other people had better things to say to the camera than I did.</p>
<p>I milled around for a bit then a group of us headed off to a local restaurant for some pre-flight food. Mark Littlewood said he&#8217;d come and join us, but he took so long he met us on the way back to the hotel. Better luck next time Mark. </p>
<p>The photo shows (left to right) Krishna Kotecha, Patrick McKenzie, Corey Reid, Patrick Foley, Levi Kovacs, Tyler Rooney.</p>
<h3>TODO List</h3>
<p>My notes are littered with TODO items scrawled done as a speaker sparked something in me. On the plane home, reflecting on the conference, I found that every few minutes I&#8217;d have to write something down. In total I have about 4 pages of TODOs, 1 per line. Thats about 120 items to do or research. All directly from attending the conference. Not all of the TODO items were new to me at the conference, but the conference reinforced my pre-existing thoughts and coallesced them into an action point. </p>
<h3>Conclusion</h3>
<p>If I could summarise Business of Software into a few words, it would be &#8220;Incredible mind food, stuff to think about for a long time&#8221;.</p>
<p>Would I go again? Yes.<br />
Am I glad its on the East Cost of America? Yes. 5 hours out is one thing. 8 hours out another altogether.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1541&amp;title=Business%20of%20Software%202011%20%26%238211%3B%20mind%20food"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1541</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Important changes to how we bring you software updates</title>
		<link>http://www.softwareverify.com/blog/?p=1487</link>
		<comments>http://www.softwareverify.com/blog/?p=1487#comments</comments>
		<pubDate>Thu, 17 Nov 2011 23:36:10 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[maintenance]]></category>
		<category><![CDATA[software updates]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1487</guid>
		<description><![CDATA[In this blog post I&#8217;m going to tell you about some important changes that will be happening with respect to how we provide software updates to the people that use our software tools. Software Update Email Notification At present customers that have purchased our software tools receive software software update notifications via email. In addition [...]]]></description>
			<content:encoded><![CDATA[<p>In this blog post I&#8217;m going to tell you about some important changes that will be happening with respect to how we provide software updates to the people that use our software tools.</p>
<h2>Software Update Email Notification</h2>
<p>At present customers that have purchased our software tools receive software software update notifications via email. In addition participants in our beta software programmes also receive software update notifications via email.</p>
<p>Software updates are released whenever we have bug fixes we think should be released or whenever we have new functionality we wish to make public. This can result in releases on a day by day basis or no releases for weeks at a time. We never hold bug fixes or releases back for service packs. We always try to get them to our users as rapidly as possible.</p>
<p>For some people the constant email notifications are too much and they ask not to be notified any more. For other people they welcome the fact that we supply bug fixes and updates on a regular basis. Clearly there is no one-size-fits-all solution to email notification.</p>
<p>Another problem is bounced email. Sometimes valid email addresses bounce. Do we unsubscribe this email automatically or do we try it again the next time (because quite often these email addresses spring back into life)? Either way, over time we end up building a large list of dead email addresses.</p>
<h2>Automatic Software Updates</h2>
<p>Starting next week, we&#8217;re going to release new software versions which are capable of self-updating. These new releases will check for the availability of a new release, prompt you to ask if you are interested in the new release and if you are, login to our server, download the software, install the software and new license keys and then restart the software.</p>
<h2>Software Maintenance</h2>
<p>In addition to the ability to keep the software up to date it will also be possible to update the software maintenance from within the software update package. As such you will always know when the software updates are about to expire and when you need to renew your software maintenance.</p>
<p>When you purchase your software tools from us we always provide you with at least one year of software updates as part of the purchase. Up until now we have never enforced that. We have provided software updates for periods much longer than one year for some customers. With this new functionality we will continue to provide one year of software updates but we will now enforce that period from January 15 2012. </p>
<p>As such if you&#8217;ve purchased since a year of January 15 2011 your software maintenance will continue for a year from the purchase date. If you purchased before January 15 2011 your software maintenance will need renewing on January 15 2012. Two examples should demonstrate this:</p>
<table>
<tr>
<th>Example 1:</th>
<th></th>
</tr>
<tr>
<td>Purchase date:</td>
<td>2009-10-31</td>
</tr>
<tr>
<td>Maintenance expiry date:</td>
<td>2012-01-15</td>
</tr>
<tr>
<th>Example 2:</th>
<th></th>
</tr>
<tr>
<td>Purchase date:</td>
<td>2011-08-31</td>
</tr>
<tr>
<td>Maintenance expiry date:</td>
<td>2012-08-31</td>
</tr>
</table>
<p>The reason for this change is because there is a cost to us to provide the software updates and we can no longer provide these for free. We always intended to charge for software updates but for various reasons never got around to do it. Thus some of you, our customers, have had a very extended period of software updates without a maintenance fee.</p>
<p>As of the next software update, the only way to receive updates will be via the self-updating software updater. We will not be sending out software update emails after the next update.</p>
<p>For beta test participants, the maintenance expiry date will be adjusted as the beta test progresses. There will be no maintenance fee for beta test participants.</p>
<h2>How does the self-updater work?</h2>
<p><img style="float:right; left-margin:10px;" src="http://www.softwareverify.com/blogImages/webUpdateMenu.png" alt="Software update menu" /></p>
<p>We&#8217;ve added two menu items to the Tools menu in all full product and beta versions of the tools. These options allow you to edit the schedule when the tool will check for software updates and also to force a check for software updates.</p>
<p>In order to accommodate different working styles we&#8217;ve provided a variety of different update options so that the disruption to a given software developer&#8217;s workflow is minimized.</p>
<p>The software update schedule can be set to check for updates every day, every week, monthly or not at all. This check is performed when the software is first started on a given day. This means that people running multiple day tests (say doing regression testing on a large test suite) will not be interrupted by a software update prompt. We think that given how the tools are used they are typically not kept open for extended lengths of time and will typically be started when needed. As such checking once during startup is a suitable event to check for software updates.</p>
<p>The date of the most recent check is displayed on the schedule dialog. </p>
<p>If you wish to force a software update just choose &#8220;Check for software updates&#8230;&#8221; on the menu.</p>
<p><img style="float:left; left-margin:10px;" src="http://www.softwareverify.com/blogImages/webUpdateSchedule.png" alt="Software update schedule" /></p>
<p><br clear="all"><br />
When a software update is available the user will be prompted with a confirmation dialog providing the choices to download and install the software, to ignore the download until later or to ignore the download completely.</p>
<p>Options for editing the update schedule or purchasing additional software maintenance are also provided.</p>
<p><img src="http://www.softwareverify.com/blogImages/webUpdateDownloadYesNo.png" alt="Software update yes, no, skip selection" /></p>
<p>If the user chooses to ignore the download they will be prompted about this download (or a subsequent download) at the next software update interval (the next day, next week, or next month). </p>
<p>If the user chooses to skip this download they will only be prompted to download if a new software version becomes available for download. Should the user change their mind they can always choose to force a check for updates using the menu &#8220;Check for software updates&#8230;&#8221;.</p>
<p>If the user chooses to download and install the software, the tool contacts the server and logs in using the user supplied credentials (provided when you purchase the software or join a beta test). If no login credentials have been supplied the user is prompted for the login credentials.</p>
<p><img src="http://www.softwareverify.com/blogImages/webUpdateLogin.png" alt="Software update login details" /></p>
<p>
Once logged into the server the software downloads the software with progress shown on a download progress dialog.</p>
<p><img src="http://www.softwareverify.com/blogImages/webUpdateDownload.png" alt="Software update login details" /></p>
<p><P>When the software is downloaded successfully the tool will close and the software will be installed. Finally the tool is restarted so that work can continue with the tool. </p>
<h2>Expired Software Maintenance</h2>
<p>Software maintenance has an expiry date. The software continues to work but the ability to receive software updates ceases at this date. When software maintenance has expired a software maintenance expiry dialog is displayed. The user of the software has the opportunity to purchase additional software maintenance to continue receiving software updates.</p>
<p><img src="http://www.softwareverify.com/blogImages/webUpdateExpired.png" alt="Software update expired" /></p>
<h2>Software Maintenance Pricing</h2>
<p>Given that I&#8217;ve discussed purchasing maintenance I should just briefly cover maintenance pricing otherwise you may decide to spend time scouring the website for maintenance pricing. To save you that effort here is the brief summary.</p>
<p>The software maintenance fee is 25% of the listed purchase price on our website. This excludes any special offer pricing. This means that if you received a volume discount when purchasing the software the maintenance fee automatically includes the same volume discount pricing.</p>
<p>The easiest way to purchase this will be by clicking the appropriate purchase buttons on the software. They will log you into the website, choose the correct product and correct number of users and price etc, all automatically. And when the purchase is complete the correct account and expiry details will be updated. Much easier than trying to do this any other way.</p>
<h2>Conclusion</h2>
<p>This new method of providing software updates will be less intrusive (much less email) and more customizable (you can choose the update schedule). We hope you will find this a useful improvement to our current software update schedule.</p>
<p>Be sure to look out for the next software update email from us. You&#8217;ll need to download that software update to get the version of the software that can self-update as described in this article. If you wish to continue receiving software updates you will need the next version of our software tools.</p>
<p>We welcome your thoughts and comments on these changes.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1487&amp;title=Important%20changes%20to%20how%20we%20bring%20you%20software%20updates"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1487</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tablets vs PCs, is this the correct way to compare them?</title>
		<link>http://www.softwareverify.com/blog/?p=1469</link>
		<comments>http://www.softwareverify.com/blog/?p=1469#comments</comments>
		<pubDate>Fri, 21 Oct 2011 11:54:46 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[tablet]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1469</guid>
		<description><![CDATA[A brief history Since the dawn of electronic computing we&#8217;ve had valves disrupted by transistors, mainframes disrupted by minicomputers, mincomputers disrupted by workstations, workstations disrupted by PCs and PCs disrupted by notebooks and netbooks. The latest entrant is the tablet computer. Tablets were initially a failure, mainly due to desktop operating systems being forced to [...]]]></description>
			<content:encoded><![CDATA[<h2>A brief history</h2>
<p>Since the dawn of electronic computing we&#8217;ve had valves disrupted by transistors, mainframes disrupted by minicomputers, mincomputers disrupted by workstations, workstations disrupted by PCs and PCs disrupted by notebooks and netbooks. The latest entrant is the tablet computer.</p>
<p>Tablets were initially a failure, mainly due to desktop operating systems being forced to do a job they were ill suited to do. However the Apple iPad changed all that. A new way of considering how to use a tablet. This has spawned a lot of imitators, mainly based on Android. Microsoft will also be entering the fray with Windows 8 and the Metro UI. Microsoft is making the reverse mistake though &#8211; <a href="http://www.softwareverify.com/blog/?p=1450" title="Windows 8 Start Screen Disaster">forcing its tablet UI</a> on its desktop users. So it may succeed in the tablet space and then fail in the desktop space. We shall see.</p>
<h2>Disruptive or Complementary?</h2>
<p>Having set the scene the next question is are tablets going to be disruptive to PCs or complementary? Some people seem to think its a straight fight between PCs and tablets &#8211; that tablets are going to disrupt PCs and ultimately replace them. Even Professor Clayton Christensen, author of many books on industrial disruption thinks this is going to happen. His latest tweet on the subject &#8220;The value of theory: you know that iPads will cannibalize PCs long before the data tells you it&#8217;s happening <a href="http://bit.ly/nlSq2l" title="it-s-official-ipad-sapped-windows-pc-shipments-during-q4-2010-but-macs-more">http://bit.ly/nlSq2l</a> #disruption&#8221;. </p>
<p>I&#8217;ve read most of Professor Christensen&#8217;s books on disruptive innovation theory. I think the case is well argued and I find the books fascinating and engaging. I think I do understand the theory correctly. There is always room to improve my understanding.</p>
<p>But I don&#8217;t agree that just because iPad shipments exceed PC shipments its the end for the PC. Not even a long way into the future. When I say PC I&#8217;m talking not just Windows, but Macs and Linux boxes etc. Anything that sits on your desktop, under the desk, or a portable computer like a laptop, notebook or netbook.</p>
<p>I think tablets are in the main, complementary to PCs. By complementary I mean that they are providing opportunities in places where a PC is not practical or appropriate. I do think tablets will erode some consumer use of PCs. I do not think tablets will replace PCs in the business world.</p>
<h2>Tablets</h2>
<p>Tablets are great for passive consumption of data. For example, viewing movies, reading email and writing occasional replies, viewing websites, playing games, viewing 2D and 3D models. Touch screen UIs excel at the consumption of content.</p>
<p>Tablets will almost certainly gain traction in areas where you want to view business data. RedGate software&#8217;s <a href="http://www.red-gate.com/products/dba/sql-monitor/" title="SQL Monitor">SQLMonitor</a> is a great example of this. </p>
<p>Tablets will almost certainly gain traction in areas where you need to update the status of items but do not need to type extensive reports. A scenario for this would be in hospitals. Keyboards are a haven for bugs as they are hard to clean effectively. Tablets are smooth and easy to clean. Tablet touch screens are perfect for this type of work &#8211; well designed user interfaces will minimise the need to type and make a tablet usable in this situation.</p>
<p>The above two scenarios are not really tablet vs PC scenarios. They are complementary. The tablet is enabling a business activity that the PC either did badly, or could not do at all. For the SQLMonitor example, the tablet is doing the job better than the PC, is is more convenient. But this is a data consumption task (as opposed to content creation). In the hospital example, no one carries a laptop to the bed of the person they are seeing and then checks off their health and medication as they do their rounds. But I can easily see that happening with a tablet. That is, the tablet is serving an underserved or nonserved market.</p>
<p>But all that said, tablets are not good for any large scale content creation activity. Examples are word processing, accounting, creative work, video editing, audio editing, 3D CAD creation, writing software. All these activities are typically done by professionals with two or more large screen monitors with multiple windows open at once, referencing data in one window, cutting and pasting into another, sometimes having specialised external interaction devices (drawing tablets, styluses, trackballs, joysticks etc). For businesses that need computers the above describes the majority of those computing activities.</p>
<p>The 3D CAD creation item is an interesting one. I know some folks at SolidWorks Corporation. When the iPad came out they created a viewer for it. Have they moved to put SolidWorks on the iPad? No. Its a $4000/seat software product. People use it on powerful workstations with multiple screens with large resolutions. You just cannot replicate this experience on a tablet.</p>
<p>The other interesting point is software creation. When Apple introduced the Macbook, Macbook Pro and Macbook Air computers web developers and creatives very quickly switched to these computers to do their work. Have these people moved to the iPad or any other tablet to do their creative work? If a tablet was suitable for content creation these people would have switched already and be trying to prove it can be done.</p>
<h2>PCs</h2>
<p>However when it comes to content creation the PC is the place where that will continue to happen. </p>
<p>There are several reasons why PCs will continue to dominate in this area:</p>
<ul>
<li>PCs are designed to be used for content creation. The ability to have multiple windows open, multi-task, source data from one application easily into another application, these are key to being efficient at the job in hand. Tablets just can&#8217;t do this. I can&#8217;t see this being fixed on a tablet. </li>
<li>Multiple screens, with physical screen sizes up to 30&#8243; and pixel counts exceeding 2500 across. Even if you could get a 30&#8243; tablet with 2560&#215;1600 resolution, you wouldn&#8217;t be able to lift it and it would be too heavy and too unweildy to rest in your lap when you sit on the sofa. </li>
<li>Egonomics. The ergonomics of using a tablet are such that for occasional use sitting on the sofa, lying in bed, etc, they do you no harm. I can speak from <a href="http://www.objectmedia.ltd.uk/rsi/rsi_srk.html" title="My experience with RSI">my own painful experience with RSI</a> that for extended periods of working a tablet will give rise to all manner of unpleasant ailments. I can see all the problems with poor posture and static loading that did so much damage to me, those problems are all there with the tablet. And those problems will always be there because that is a function of the form factor of a tablet. </li>
</ul>
<p>In summary at large screen sizes, where tablets could in theory start to compete against a PC, the tablet becomes unweildy, impractical and in ergonomic terms, bad for you. If with advances in materials science &#8211; let us say if carbon fibre manufacture became cost effective and e-ink is the future &#8211; then the weight element of a large tablet would go away. But you&#8217;re still left with the physical size limits of a tablet that is 23&#8243; (or more!) to deal with. I&#8217;m writing this on a 23&#8243; screen and I could not imagine trying to sit with this on my lap. </p>
<p>You can improve the touch screen typing of a tablet, but the on screen keyboard will always obscure your work. At present there appears to be no solution to the multi-window aspect of computing that has been so successful on workstations and desktop computers for the last 30 years. Tablets have one window (or with Windows 8 Metro, possibly two) at a time. As you can <a href="http://blogs.msdn.com/b/b8/archive/2011/10/03/evolving-the-start-menu.aspx" title="Evolving the start menu">see</a> in the <a href="http://blogs.msdn.com/b/b8/archive/2011/10/04/designing-the-start-screen.aspx" title="Designing the start screen">comments</a> sections of the 4 blogs posts dedicated to the Metro UI and <a href="http://blogs.msdn.com/b/b8/archive/2011/10/18/designing-search-for-the-start-screen.aspx" title="Windows 8 Start Screen Search">Search</a> on the <a href="http://blogs.msdn.com/b/b8/archive/2011/10/11/reflecting-on-your-comments-on-the-start-screen.aspx" title="Reflecting comments on the start screen">MSDN blogs</a>, people that work with multiple large screens and many windows absolutely hate being forced to work with one window at a time. I confess that I am one of the many detractors of Microsoft&#8217;s new user interface work &#8211; it seriously degrades what they are doing.</p>
<h2>Conclusion</h2>
<p>It is inevitable that for some tasks PCs have been used for (mainly consuming information) tablets may well replace them as the best item &#8220;hired to do the job&#8221;. But I think there is quite a large section of jobs for which the tablet can never successfully compete against the PC &#8211; jobs which require multiple screens, large screens, overlapping windows/displays and specialised data entry devices. </p>
<p>Simply making the tablet larger is not a solution due to physical size constraints. Adding lots of external devices to the tablet (using say bluetooth) kind of defeats the point because then you can only use the tablet in one place &#8211; it no longer has the very attribute that makes it attractive (its single object portability) &#8211; you may as well use a desktop PC in that situation, it would be better suited to the task.</p>
<p>I think tablets are complementary to PCs. I think tablets are doing a job PCs have never been able to do well. I think PCs do a job that tablets will never be able to do well. </p>
<p>I think this quote from I-DotNET written in the MSDN blog comments <a href="http://blogs.msdn.com/b/b8/archive/2011/10/18/designing-search-for-the-start-screen.aspx" title="Windows 8 Start Screen Search">Windows 8 Search</a> best describes a tablet.</p>
<blockquote><p>Touch-screen UIs are not the next generation of UI the way that GUIs and the mouse replaced the command line. Instead, what we&#8217;re seeing here is the creation of a brand new category of device, a device that is used differently for different purposes and often by different people. The touch screen UI is simply the UI best suited for this category. No more. No less.</p></blockquote>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1469&amp;title=Tablets%20vs%20PCs%2C%20is%20this%20the%20correct%20way%20to%20compare%20them%3F"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1469</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 8 Start Screen disaster</title>
		<link>http://www.softwareverify.com/blog/?p=1450</link>
		<comments>http://www.softwareverify.com/blog/?p=1450#comments</comments>
		<pubDate>Thu, 13 Oct 2011 11:19:52 +0000</pubDate>
		<dc:creator>Stephen Kellett</dc:creator>
				<category><![CDATA[Future]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[start menu]]></category>
		<category><![CDATA[start screen]]></category>
		<category><![CDATA[windows 8]]></category>

		<guid isPermaLink="false">http://www.softwareverify.com/blog/?p=1450</guid>
		<description><![CDATA[Over on the MSDN blog there is a series of articles about Windows 8. Among those articles are three articles about the Windows 8 Start Screen which replaces the Start Menu. Some background I&#8217;ve been a member of MSDN since late 1994 when I first heard about MSJ magazine and then heard about MSDN. I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>Over on the MSDN blog there is a series of articles about Windows 8. Among those articles are three articles about the Windows 8 Start Screen which replaces the Start Menu.</p>
<h2>Some background</h2>
<p>I&#8217;ve been a member of MSDN since late 1994 when I first heard about MSJ magazine and then heard about MSDN. I&#8217;ve worked with Microsoft technologies for the vast majority of the time since then and pretty much exclusively since 1998. I&#8217;ve hated the backwards steps the Start menu took from Windows XP to Windows Vista/7 but the Windows 8 process &#8211; well that is such a change that I think this will debut so badly that this will be worse than the reception Vista received.</p>
<p>The Vista machines we purchased we got rid of. We have Vista as virtual machines only. We do like Windows 7 though. That works. </p>
<p>So far, despite repeated trials of Windows 8, all I can say is that it is awful. It is not productive, not for how we work. I don&#8217;t care how good it is at touch or how well it does web related home-consumer tasks. None of that helps me be productive in my day job. That is what counts. It is, more importantly, also what counts for my customers. </p>
<p><b>I want Windows 8 to be a success.</b> That is why I am pushing back so hard against the Windows 8 start screen.</p>
<h2>MSDN Blog articles</h2>
<p>The first article <a href="http://blogs.msdn.com/b/b8/archive/2011/10/03/evolving-the-start-menu.aspx" title="Evolving the start menu">Evolving the Start menu</a> explains what they did and why they did it. It received a lot of negative criticism. They followed up with a second article <a href="http://blogs.msdn.com/b/b8/archive/2011/10/04/designing-the-start-screen.aspx" title="Designing the start screen">Designing the Start screen</a> which completely ignored all the criticism and tried to steamroller the Start Screen as superb. This duly received a lot of further criticism. </p>
<p>There is now a third article <a href="http://blogs.msdn.com/b/b8/archive/2011/10/11/reflecting-on-your-comments-on-the-start-screen.aspx" title="Reflecting your comments on the start screen">Reflecting your comments on the Start screen</a> which is full of information, insights and analysis on how they came to arrive at the Start screen and why they think the Start menu should go away. The problem is the arguments are not convincing.</p>
<h2>Menus are inefficient</h2>
<p>The first argument is that the Start menu is inefficient. That it requires dextrous control of the mouse to find and select an item (this is true) and that it is slow to do so (also, reasonably true).</p>
<p>Therefore they introduce the start screen which is a 2 dimensional grid of tiles that you can easily find with your mouse etc. The problem is, this is not true. They boast that on screens of 1900 x 1080 resolution you can have 80 tiles. </p>
<p>Whooppee! Er No. </p>
<p>I have a screen of 1900 x 1200 and it has 72 icons on the desktop. Can I easily find the icon I want to launch a program? Yes, sometimes. But most of the time I have to scan the whole thing to find the one I want. And I organised that group of icons. It is not efficient. Sometimes despite knowing what I want is in my list of 72 icons I can&#8217;t find it and I give up and go and find it from the Search menu anyway.</p>
<p>And Microsoft want all of us to work this way in future. Yikes! </p>
<p>And of couse when you can&#8217;t find it you then have to use the new Search functionality. Which I&#8217;ll tell you about now&#8230;</p>
<h2>Search</h2>
<p>The old Start menu had a search function on it. In Windows 2000 and Windows XP this was really efficient &#8211; you could tell it where to search, what to look for in a document all before starting the search. No time wasted. </p>
<p>In Windows Vista and Windows 7 this was awful, very inefficient. You had to start a search you knew would fail, then bring up the search widget, choose custom and flail around in that awful user interface then get the search (with no progress indicator showing which directory was getting searched &#8211; we had that in W2K and XP).</p>
<p>The new Windows 8 search function &#8211; there isn&#8217;t one. Wait, there is. Just its invisible. Which is why I didn&#8217;t know it exists. Its <b><i>that</i></b> discoverable that an MSDN member of 17 years could not find it. </p>
<p>Yes, I know I know, I must be an old fart, but seriously. If I can&#8217;t find it can my parents, can my girlfriend, can the people working in the Vetinary surgery down the road? No they can&#8217;t.</p>
<p>To use search in Windows 8 you have to switch to the start screen and then type. That&#8217;s right type into nothing, just type. Apparently this nonesense is inspired from mobile phones. Thats great. Except it isn&#8217;t. I&#8217;m happy with that metaphor on a phone. But I want my PC to behave like a PC. What is efficient for one device is not efficient for another. If that were true we&#8217;d control aircraft the same way we control submarines. Unsurprisingly we don&#8217;t.</p>
<p>Furthermore when you switch to the Start menu to make your search you lose the context of your work &#8211; so god help you if were hoping to read some text from a website or a document to type into the search widget. How efficient is that? They just made you add an extra step &#8211; you now have to copy and paste the text from the website or document. What? The text isn&#8217;t copy and pastable? Oh dear, no you&#8217;ve got to copy the text off the document onto some paper, switch to the Start screen and then type what you&#8217;ve written on paper into the invisible search widget.</p>
<p>Sound exaggerated? Perhaps. But I can see this happening. Especially with less au-fait users like the aforementioned people at the Vetinary surgery (I am actually thinking of some people I know &#8211; good with animals, not so with computers &#8211; just things to use, on the Desktop!).</p>
<h2>But I don&#8217;t know what I&#8217;m looking for</h2>
<p>You don&#8217;t know what you&#8217;re looking for? So how will you know when you find it? Well, I can kind of remember its name, but not really, but I&#8217;ll know it when I see it. </p>
<p>Its like being in a library in the philosophy section and you&#8217;re not sure what you&#8217;re looking for then all of a sudden you hit the section of Thoreau books and out pops the one you&#8217;re looking for. How could I have forgotten its name? Silly me.</p>
<p>Well indeed. And its the same with programs. Often I can&#8217;t remember who wrote it (so I can&#8217;t select by Vendor) or what its exact name is. My developer machine has 94 menus on the Programs section and most of those have submenus with between 5 and 10 items on. Some have more and some have more submenus. That is a lot of program names to rememeber. Unsurprisingly I don&#8217;t rememeber them. I have better things to devote my memory to. But I can browse those menus relatively easily and with reasonable speed. </p>
<p>The main reason I can do that, browse between 450 and 900 items is because each menu only exposes the data under it when I look at it. If I had to look at all 450-900 items at once it would impossible. Most of the items I never look at the submenus, I just have to read the main menu entry and then move on or occasionally check the contents.</p>
<p>It is an efficient compromise between having to use search to search for all executables and then dig through the ridiculous number of results (very slow) and the other extreme where I have to remember them all.</p>
<p>The problem with Windows 8 is that there is no Start menu to browse. I have to use search to find what I want. How can I find what I want when I don&#8217;t know its name? Answers on a postcard please (or leave them in the comments section).</p>
<h2>Live Updates</h2>
<p>A few of the comments in support of Metro in the MSDN blog comments indicate that the poster of these comments thinks that people with views like mine are dinosaurs that can&#8217;t see the value of having updating live tiles. What a limited and narrow view. </p>
<p>Such live tiles were previewed in Vista with the gadgets on the screen. Sure they are useful. I haven&#8217;t said they are not useful. I have said I don&#8217;t wish to work that way. These are different concerns just as some people wish to drive manual cars and others don&#8217;t want that chore so they choose an automatic car. In fact that is not a bad analogy, Metro would be the automatic car (less control) and Start Menu users would be driving a manual car (more control).</p>
<p>I have no need for an email tile keeping me up to date with my email. Why? Because I work with 2 computers and three screens. One computer is dedicated to handling email and browsing the web. The other one is for development work. The email machine has an email browser open all the time. Even if I had one machine I&#8217;d have the email client open all the time. An email tile is a waste of CPU time for me. </p>
<p>Also, if you know anything about productivity the last thing you want is a screenful of animated tiles doing their thing in your peripheral vision. Nice eye candy for the easily impressed. Boring annoyance for those of us that want to get stuff done.</p>
<h2>Ubuntu One</h2>
<p>Linux? Who cares about Linux? Why suddenly talk about Linux?</p>
<p>Well they&#8217;ve already done this particular experiment for you. The most recent release of Ubuntu comes with the Ubuntu One interface as the default. This is a user interface that makes you access everything via tiles (admittedly more restricted than Metro) and forces you to work with single screen applications.</p>
<p>I first tried it on my netbook. My initial thoughts were that it was good. Web browser and email clients come up full screen (all 800&#215;600 of it!) and I could browse the web OK. </p>
<p>Then a few weeks later I thought I&#8217;d install Ruby On Rails on it and take a toy project away with me for a bit of tinkering while on a break. What a disaster. Totally impossible to get anything done in these single whole-screen environments. I spent a good deal of my time in the task switcher moving one window to the front, finding another, then moving that to the front and so on.</p>
<p>That installation of Ubuntu got replaced with the standard Ubuntu classic and all future installations are setup deliberately to exlude Ubuntu One. If you read around the web you&#8217;ll find lots of power users also hate Ubuntu One. Just like the power users complaining on the MSDN blog about Metro. You&#8217;re taking control (and thus productivity) away from your best customers.</p>
<h2>Multi-Screen</h2>
<p>The Windows 8 Start Screen covers all your screens. Not user friendly at all. Completely stops any context. As far as I am concerned losing even one whole screen is way too much, especially when you consider how efficient and non-context losing the start menu is.</p>
<p>If the start screen could be encompassed in a resizable window so you could move it whereever you want, or minimize it out of the way that would be useful. This in addition of course, to actually having a proper functioning start menu.</p>
<h2>Multi-Tasking</h2>
<p>Many complaints have been made about the inability to kill tasks in the Metro interface (all you can do is suspend them). Also the lack of support for multi-tasking windows is a real productivity killer. </p>
<p>These complaints remain un-addressed by the Windows 8 developer team.</p>
<h2>No Compromise</h2>
<p>The Windows 8 developer team seem completely unconcerned that those of us that want to use their PC to do work do not wish to work in a fashion that is dictated by the needs and desires of those whose only use for a PC is to consume the web/youtube/facebook/email on their tablet or gaming PC.</p>
<p>Both groups of people can be accomodated. </p>
<ul>
<li><strong>Business users.</strong> Leave our Windows Desktop alone and give us the Start menu we know and love.</li>
<li><strong>Home users.</strong> By all means give them the tablet UI you have designed Metro for.</li>
</ul>
<p>Why can&#8217;t this be a configurable option? A powerful Start menu option for folks like myself and the Metro interface for people that think search is a useful replacement for the Start menu.</p>
<h2>User Experience</h2>
<p>The user experience that I have had with Windows 8 Developer Preview has been extremely poor. Open source operating systems like <a href="http://haiku-os.org/" title="Haiku operating system">Haiku</a> give you a better experience out of the box.</p>
<h2>Dog Food</h2>
<p>I really do wonder if the Windows 8 Developer team is using Windows 8 to develop Windows 8. And I mean everyone, the management team, everyone that has to use office, powerpoint, email, MS Project, all the development team, including people using WinDbg and Visual Studio. I can&#8217;t believe they are because the loss in productivity would be huge.</p>
<p>I have to conclude the only people eating the Windows 8 dog food are the home consumer testing group that want a tablet/phone/home-user user interface.</p>
<h2>Productivity</h2>
<p>I hope that having read this far you realise that the problem with Windows 8 Start Screen is not the start screen itself. It is the drop in productivity and the horrible context switch from Desktop to Start Screen (which itself is a productivity issue) that are the issues. We know what is productive for us. And, although you think you know best for us Microsoft, you don&#8217;t. </p>
<p>I&#8217;ve already experienced Windows Vista/7 search and hate it. I don&#8217;t want to have to use Windows 8 search even more than I already have to use Windows 7 search. </p>
<p>Keep search as what it is good for and allow me to browse for my files, productively, using the Start menu.</p>
<h2>Windows 8 #fail</h2>
<p>I hope that when Windows 8 finally debuts people can look back at this article and think &#8220;Thank God, it didn&#8217;t happen, Windows 8 is still productive&#8221;. </p>
<p>Otherwise we&#8217;ll all be walking around in T-Shirts with the slogan &#8220;Windows 8 #fail&#8221;.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.softwareverify.com%2Fblog%2F%3Fp%3D1450&amp;title=Windows%208%20Start%20Screen%20disaster"><img src="http://www.softwareverify.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.softwareverify.com/blog/?feed=rss2&#038;p=1450</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

