<?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>Adrian Kosmaczewski &#187; Quality</title> <atom:link href="http://kosmaczewski.net/category/quality/feed/" rel="self" type="application/rss+xml" /><link>http://kosmaczewski.net</link> <description></description> <lastBuildDate>Wed, 08 Feb 2012 08:51:50 +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>Roundup of iPhone App Sketchbooks</title><link>http://akosma.com/2009/10/27/roundup-of-iphone-app-sketchbooks/</link> <comments>http://akosma.com/2009/10/27/roundup-of-iphone-app-sketchbooks/#comments</comments> <pubDate>Tue, 27 Oct 2009 07:37:37 +0000</pubDate> <dc:creator>akosma software</dc:creator> <category><![CDATA[iPhone]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[design]]></category> <category><![CDATA[mobile]]></category> <category><![CDATA[roundup]]></category> <category><![CDATA[sketchbook]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/?p=2013</guid> <description><![CDATA[Nailing down the idea, the navigation and the UI of your next killer iPhone application is as important (if not more) as writing good code. This is why this post will showcase some recent iPhone designer products, all providing a &#8230; <a
href="http://akosma.com/2009/10/27/roundup-of-iphone-app-sketchbooks/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Nailing down the idea, the navigation and the UI of your next killer iPhone application is as important (if not more) as writing good code. This is why this post will showcase some recent iPhone designer products, all providing a paper-based, iPhone-shaped and iPhone-sized support for sketching out iPhone apps with your client (or just for your own creative pleasure).</p><p>Here we go:</p><p><strong><a
href="http://appsketchbook.com/">App Sketchbook</a></strong> by <a
href="http://www.squareposition.com/">Square Position, LLC (USA)</a>, <a
href="http://twitter.com/appsketchbook">@appsketchbook</a> on Twitter, sold via PayPal for USD 12.99, in both a perforated and non-perforated version.</p><p
align="center"><img
src="http://kosmaczewski.net/wp-content/uploads/2009/10/sketchbook1.png" alt="sketchbook1" title="sketchbook1" width="524" height="214" class="alignnone size-full wp-image-2014" /></p><p><span
id="more-2013"></span> <strong><a
href="http://www.mobilesketchbook.com/">iPhone Application Sketch Book</a></strong> originally by <a
href="http://www.kapsoft.com/">Kapsoft (USA)</a> but <a
href="http://theappleblog.com/2009/09/29/iphone-application-sketch-book-rights-sold-to-apress-publishing/">recently sold to Apress Publishing</a>, <a
href="http://www.amazon.com/gp/product/B002IE2ZK4?ie=UTF8&#038;tag=iphoapplsketb-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=B002IE2ZK4">sold on Amazon for USD 9.99</a> (while supplies last!).</p><p
align="center"><img
src="http://kosmaczewski.net/wp-content/uploads/2009/10/sketchbook2.png" alt="sketchbook2" title="sketchbook2" width="400" height="280" class="alignnone size-full wp-image-2015" /></p><p><strong><a
href="http://notepod.net/">Notepod</a></strong> by <a
href="http://inventivelabs.com.au/">Inventive Labs (Australia)</a>, <a
href="http://twitter.com/notepods">@notepods</a> on Twitter, sold via PayPal for USD 17.95.</p><p
align="center"><img
src="http://kosmaczewski.net/wp-content/uploads/2009/10/sketchbook3.png" alt="sketchbook3" title="sketchbook3" width="406" height="279" class="alignnone size-full wp-image-2016" /></p><p><strong><a
href="http://www.ebutterfly.com/books/devsketchbook/">The Developer Sketchbook for iPhone Apps</a></strong> by <a
href="http://www.ebutterfly.com/">Electric Butterfly (USA)</a>, <a
href="http://twitter.com/ebutterfly">@ebutterfly</a> on Twitter, <a
href="http://www.amazon.com/gp/product/143925608X?ie=UTF8&#038;tag=electricbutterfl&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=143925608X">sold on Amazon for USD 19.99</a>.</p><p
align="center"><img
src="http://kosmaczewski.net/wp-content/uploads/2009/10/sketchbook4.jpg" alt="sketchbook4" title="sketchbook4" width="180" height="274" class="alignnone size-full wp-image-2017" /></p><p>Finally, the <strong><a
href="http://www.uistencils.com/featured/iphone-sketch-pad.html">UI Stencils Sketch Pad</a></strong> (for USD 7.95) with its <strong><a
href="http://www.uistencils.com/featured/iphone-stencil-kit.html">iPhone Stencil Kit</a></strong> (for USD 17.95) by <a
href="http://www.designcommission.com/">Design Commission</a> (<a
href="http://twitter.com/designcom">@designcom</a> on Twitter).</p><p
align="center"><img
src="http://kosmaczewski.net/wp-content/uploads/2009/10/sketchbook5.jpg" alt="sketchbook5" title="sketchbook5" width="500" height="247" class="alignnone size-full wp-image-2021" /></p><p>I&#8217;ve ordered some of these items, and I&#8217;ve seen some others in the hands of some colleagues, and I can tell you that they are really handy and useful. I look forward to using them soon! For more information, here&#8217;s a <a
href="http://www.tuaw.com/2009/10/03/mega-super-tuaw-shootout-of-the-iphone-ui-sketchbooks/">recent article on TUAW</a> comparing some of the items featured in this article.</p><p>Happy iPhone app designing!</p><p><strong>Update, 2009-11-12:</strong> <a
href="http://www.mobilesketchbook.com/">The iPhone Application Sketch Book</a> (recently bought by Apress) has been revamped and now features a plastic stencil too!</p> ]]></content:encoded> <wfw:commentRss>http://akosma.com/2009/10/27/roundup-of-iphone-app-sketchbooks/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Objective-C Compiler Warnings</title><link>http://akosma.com/2009/07/16/objective-c-compiler-warnings/</link> <comments>http://akosma.com/2009/07/16/objective-c-compiler-warnings/#comments</comments> <pubDate>Thu, 16 Jul 2009 12:11:57 +0000</pubDate> <dc:creator>akosma software</dc:creator> <category><![CDATA[Code]]></category> <category><![CDATA[iPhone]]></category> <category><![CDATA[Opinion]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[Cocoa]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/?p=1633</guid> <description><![CDATA[A recent comment by Joe D&#8217;Andrea in a previous post reminded me about the importance of removing compiler warnings in Xcode projects. Most importantly, it reminded me of a conversation with a fellow developer a couple of weeks ago, in &#8230; <a
href="http://akosma.com/2009/07/16/objective-c-compiler-warnings/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>A <a
href="http://kosmaczewski.net/2009/06/24/opengl-es-2-on-iphone-os-3/#comment-26078">recent comment</a> by <a
href="http://twitter.com/jdandrea">Joe D&#8217;Andrea</a> in a <a
href="http://kosmaczewski.net/2009/06/24/opengl-es-2-on-iphone-os-3/">previous post</a> reminded me about the importance of removing compiler warnings in Xcode projects. Most importantly, it reminded me of a conversation with a fellow developer a couple of weeks ago, in which he told me that he was surprised to see that my projects compiled all the time without warnings. Not a single one. Nada. And that I took the time to remove them before checking code into source control.</p><p><em>He actually didn&#8217;t know you could remove all compiler warnings</em>; he thought Objective-C was the land of compiler warnings. This situation, I think, is far from exceptional, and due mostly to cultural and technical reasons.</p><p>It is my opinion, that removing compiler warnings is <strong>basic project hygiene</strong>, like writing unit tests, or using the Clang Static Analyzer. I will explain in this post some techniques I use to remove warnings in my Objective-C code.</p><p><img
src="http://kosmaczewski.net/wp-content/uploads/2009/07/warnings2.png" alt="warnings2" title="warnings2" width="547" height="673" class="alignnone size-full wp-image-1636" /> <span
id="more-1633"></span> First of all, why does the Objective-C compiler (or compilers in general) output &#8220;warnings&#8221;? Many developers are puzzled the first time they encounter them, since even if the compiler complained, the application usually runs anyway without (perceptible) problems.</p><p>Warnings are used to signal specific issues in the source code which could potentially lead to crashes or misbehavior under some circumstances, but which should not (pay attention to the verb &#8220;should&#8221;) block the normal compilation and (hopefully) execution of your code (otherwise, it would be a compiler error).</p><p>It&#8217;s the way used by your compiler to say:</p><blockquote>Hey, I&#8217;m not sure, but there&#8217;s something fishy in here.</blockquote><p>Not removing warnings, as I said above, is a problem that originates both in the programming background of the developer, and specific technical issues.</p><p>Culturally speaking, many other programming environments either do not have compilers at all (at least not &#8220;visible&#8221; ones, like Ruby or PHP) or simply do not spit warnings for anything else than deprecated methods (like C# or Java); this situation has made many developers new to the iPhone platform to blatantly ignore them.</p><p>Technically, given the fact that Objective-C is the &#8220;other&#8221; object-oriented superset of C, and that it behaves as a coin with both a static and a dynamic side, compiler warnings convey a great amount of precious information that must <em>never</em> be ignored.</p><p>In this sense, Objective-C has a lot in common with C++. Ignoring warnings in C++ is strongly discouraged, and Scott Meyers explains this in chapter 9 of his book &#8220;Effective C++&#8221;, stating that (third edition, page 263):</p><blockquote>Take compiler warnings seriously, and strive to compile warning-free at the maximum warning level supported by your compilers</blockquote><p>In the case of Objective-C, this can be done by setting GCC_TREAT_WARNINGS_AS_ERRORS (-Werror) to true in your build settings.</p><p><img
src="http://kosmaczewski.net/wp-content/uploads/2009/07/warnings3.png" alt="warnings3" title="warnings3" width="547" height="673" class="alignnone size-full wp-image-1637" /></p><p>Steve McConnell takes this advice to another level of importance in his classic book &#8220;Code Complete&#8221; (second edition, page 557):</p><blockquote>Set your compiler&#8217;s warning level to the highest, pickiest level possible, and fix the errors it reports. It&#8217;s sloppy to ignore compiler errors. It&#8217;s even sloppier to turn off the warnings  so that you can&#8217;t even see them. Children sometimes think that if they close their eyes and can&#8217;t see you, they&#8217;ve made you go away (&#8230;).
Assume that the people who wrote the compiler know a great deal more about your language than you do. If they&#8217;re warning you about something, it usually means you have an opportunity to learn something new about your language.</blockquote><p>To give a concrete example of the importance of warnings, many of us have had to migrate applications developed for iPhone OS 2.x to the 3.0 operating system, mostly because failure to run on the new version of the OS was ground for removal from the App Store. That moment of truth, the rebuild of the Xcode project, unveiled a plethora of compiler warnings, most due to deprecated methods, like the tableView:accessoryTypeForRowWithIndexPath: method of the UITableViewDelegate protocol, or the initWithFrame:reuseIdentifier: method of the UITableViewCell class (which, incidentally, are properly marked as such in the documentation, too).</p><p>Compiler warnings in Objective-C have a multitude of reasons:</p><ul><li>Using deprecated symbols;</li><li>Calling method names not declared in included headers;</li><li>Calling methods belonging to implicit protocols;</li><li>Using some ambiguous commands which might be intentional but are syntactically valid anyway;</li><li>Forgetting to return a result in methods not returning &#8220;void&#8221;;</li><li>Forgetting to #import the header file of a class declared as a forward &#8220;@class&#8221;;</li><li>Downcasting values and pointers implicitly.</li></ul><p>Many solutions exist for these problems, and I do not claim to know them all; I&#8217;ll just describe some of them, and hopefully some of the readers of this post will add others in the comments below.</p><p><strong>1) Make implicit protocols explicit</strong></p><p>This is a really simple one, and it&#8217;s also good for documentation and code clarity reasons. Get all the references of delegate methods you use in the code, and group the methods into their own header file. Import the header file whenever you need, and make classes explicitly implement them:</p><p>[source:c]
//&#8230;
@interface NewClass : NSObject <SomeProtocol> {
//&#8230;
[/source]</p><p>Of course, take advantage of Objective-C&#8217;s @required and @optional keywords in your protocol declarations; they are used by the compiler to verify (or not) the existence of delegate methods in your class implementation. This way, you&#8217;ll surely remove some warnings.</p><p><strong>2) <del
datetime="2009-07-17T07:36:51+00:00">Do not use &#8220;id&#8221; as the data type for delegate fields</del> Using id as datatype for delegate fields</strong></p><p>I personally use the following declaration for delegate fields:</p><p>[source:c]
//&#8230;
NSObject<SomeProtocol> *delegate;
//&#8230;
[/source]</p><p>instead of simply</p><p>[source:c]
//&#8230;
id delegate<SomeProtocol>;
//&#8230;
[/source]</p><p>This is because I always check on delegates before calling their methods. Call me paranoid, but this is what a good delegate call looks to me:</p><p>[source:c]
if([delegate respondsToSelector:@selector(someObj:doesThis:)])
{
[delegate someObj:self doesThis:@"123"];
}
[/source]</p><p>Using NSObject instead of id in the delegate declaration avoid yet another warning. <strong>Update, 2009-07-17:</strong> This is because using id<SomeProtocol> raises a warning that &#8220;respondsToSelector:&#8221; is not defined in SomeProtocol. The solution for this is making SomeProtocol inherit from the NSObject protocol (I always forget this double life of the NSObject symbol):</p><p>[source:c]
@protocol SomeProtocol <NSObject> //&#8230;
@end
[/source]</p><p>This way, you can use id&lt;SomeProtocol&gt; variables without problem.</p><p><strong>3) Create categories for private methods</strong></p><p>Objective-C uses the @private, @public and @protected identifiers only for instance fields, but otherwise methods can only be marked as instance (&#8220;-&#8221;) or static (&#8220;+&#8221;), but all methods specified in the header file are public by default.</p><p>If you need to specify private methods, do that in your implementation file, creating what&#8217;s called a &#8220;category&#8221; of your own class, which basically &#8220;extends&#8221; the class with new methods:</p><p>[source:c]</p><h1>import &#8220;NewClass.h&#8221;</h1><p>@implementation NewClass (Private)
// your methods here
@end</p><p>@implementation NewClass
// &#8230;
@end
[/source]</p><p>This way you can define private methods, not exposing them in the public interface file. And you remove some more warnings.</p><p><strong>4) Turn implicit type conversions and casts into explicit ones:</strong></p><p>This one is inspired by McConnell&#8217;s Code Complete (second edition, page 293):</p><p>[source:c]
int i;
float y, x;
y = x + (float)i
[/source]</p><p>Even if the compiler could work out the &#8220;y = x + i&#8221; expression without problem, the code above will remove yet another warning, and will make your code more obvious and easier to read, since it clearly states your intentions.</p><p><strong>5.1) Support earlier OS versions via runtime checks</strong></p><p>If you have to write iPhone applications compatible with both the 3.0 and 2.x versions, this sample from Apple https://developer.apple.com/iphone/library/samplecode/MailComposer/listing7.html provides instructions on how to do it.</p><p>&#8220;MailComposer runs on earlier and later releases of the iPhone OS and uses new APIs introduced in iPhone SDK 3.0. See below for steps that describe how to target earlier 0S versions while building with newly released APIs.&#8221;</p><p>It is worth noting that this sample application compiles without a single warning!</p><p><strong>5.2) Support earlier OS versions via #defines</strong></p><p>Use #ifdef IPHONE_OS_3.0 and IPHONE_OS_2.2.1 if you can (or must) provide different binaries for each supported platform. This might be the case for in-house applications, but again, it might help removing some warnings too.</p><p><strong>6) Use @class in the @interface, #import on the @implementation</strong></p><p>Whenever you use a class on a header file, to avoid cross-references, use the @class keyword to reference it, but do not forget to #import its header file in the implementation!</p><p>[source:c]
@class AnotherClass</p><p>@interface SomeClass : NSObject
{
@private
AnotherClass *field;
//&#8230;
}
[/source]</p><p>and then</p><p>[source:c]</p><h1>import &#8220;AnotherClass.h&#8221;</h1><p>@implementation SomeClass</p><ul><li>(id)init
{
if (self = [super init])
{
field = [[AnotherClass alloc] init];
}
return self;
}</li></ul><p>@end
[/source]</p><p>The problem is, if you do not #import the file, you get a warning&#8230;</p><p>The advantage of this technique is not obvious in small projects, but it is strongly recommended anyway; it prevents header files from cross-referencing each other, and it reduces build times in projects anyway. It is the Objective-C analog to the technique of using &#8220;class&#8221; statements in C++ header files, instead of #include.</p><p>For more information: Matt Gallagher also wrote about this issue, and I strongly recommend <a
href="http://cocoawithlove.com/2009/04/8-confusing-objective-c-warnings-and.html">his article</a> too! Read also <a
href="http://developer.apple.com/Tools/xcode/compilercodewarnings.html">this article from Apple</a> about the issue of compiler warnings which covers all the options available on GCC in great detail.</p><p>Finally, all of this boils down to the fact that <a
href="http://kosmaczewski.net/2008/12/23/dirty-little-secret/">iPhone programming is not as easy as web development</a>, and that iPhone applications, for many reasons, require patience and attention. Removing warnings from your code <a
href="http://kosmaczewski.net/2009/01/28/10-iphone-memory-management-tips/">is just one of many steps</a> to have great iPhone applications, running smoothly without problems.</p><p><strong>Update, 2009-07-17:</strong> Regarding the &#8220;id vs. NSObject&#8221; issue, I&#8217;ve used NSObject because you get a warning when calling respondsToSelector: on a variable of type id<SomeProtocol>. Now, after reading all the comments I&#8217;ve gone back to Xcode and found out that you can define SomeProtocol as implementing the NSObject protocol itself, and this solves the problem. Thanks everyone for the heads-up!</p> ]]></content:encoded> <wfw:commentRss>http://akosma.com/2009/07/16/objective-c-compiler-warnings/feed/</wfw:commentRss> <slash:comments>14</slash:comments> </item> <item><title>Random Quotes on Business and Software</title><link>http://kosmaczewski.net/random-quotes-on-business-and-software/</link> <comments>http://kosmaczewski.net/random-quotes-on-business-and-software/#comments</comments> <pubDate>Mon, 20 Apr 2009 07:57:05 +0000</pubDate> <dc:creator>Adrian</dc:creator> <category><![CDATA[Opinion]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[business]]></category> <category><![CDATA[Code]]></category> <category><![CDATA[project]]></category> <category><![CDATA[Technology]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/?p=1520</guid> <description><![CDATA[A Cooperative Organization: (&#8230;) Gore has been a team-based, flat lattice organization that fosters personal initiative. There are no traditional organizational charts, no chains of command, nor predetermined channels of communication. Instead, we communicate directly with each other and are &#8230; <a
href="http://kosmaczewski.net/random-quotes-on-business-and-software/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><strong><a
href="http://www.gore.com/en_xx/aboutus/culture/index.html">A Cooperative Organization:</a></strong></p><blockquote>(&#8230;) Gore has been a team-based, flat lattice organization that fosters personal initiative. There are no traditional organizational charts, no chains of command, nor predetermined channels of communication.
Instead, we communicate directly with each other and are accountable to fellow members of our multi-disciplined teams. We encourage hands-on innovation, involving those closest to a project in decision making. Teams organize around opportunities and leaders emerge.</blockquote><p><span
id="more-1520"></span> <strong><a
href="http://tales-of-an-it-director.blogspot.com/2008/06/i-quit-my-job-today.html">What you must avoid:</a></strong></p><blockquote>Corporate IT needs the ability to run their own internal infrastructure projects without needing permission from the business.(&#8230;)
Most people in corporate IT want to do a good job. Most people in corporate IT are capable of doing a good job. Every developer I know is driven crazy by crappy code; they want nothing more than to get in there and make it better, stronger, faster. Most of the time, however, they are actively stymied from doing a good job because they can&#8217;t act on their own, best instincts. Sorry pal, but that&#8217;s not in the business plan.</blockquote><p><strong><a
href="http://www.randsinrepose.com/archives/2005/03/20/free_electron.html">What you need:</a></strong></p><blockquote>The Free Electron is the single most productive engineer that you’re ever going to meet. I have not even provided a definition and I’m guessing a person has already popped into your mind that fits the bill.
A Free Electron can do anything when it comes to code. They can write a complete application from scratch, learn a language in a weekend, and, most importantly, they can dive into a tremendous pile of spaghetti code, make sense of it, and actually getting it working. You can build an entire businesses around a Free Electron. They’re that good.</blockquote><p><strong><a
href="http://technically.us/code/x/the-human-programmer/">Base recipe for quality:</a></strong></p><blockquote>Here’s a theory of software quality for you: software must be nurtured. The existence of bugs isn’t mysterious to any honest programmer. They are the product of neglect. (&#8230;) Programmers have complete control over the quality of their code and, when working on code they care about, tend to produce things that work. The secret is to care for the programmers, so that they take good care of the software.
Large organizations generally drive their software bees into combat formations, rather than nurturing colonies. Standardization is the mantra. Everyone will use one language, one set of libraries, and three ostentatious software “patterns.” In such forced conditions the feeling of code ownership vanishes and quality goes out with it. (&#8230;)
The alternative is obvious: break systems down into their smallest practical units, and let small groups of programmers determine implementations from top to bottom. Necessary interfaces between modules are hammered out according to the best available standards; unnecessary interfaces are not built. Coders get to work in their favorite technology, or learn a new one.</blockquote> ]]></content:encoded> <wfw:commentRss>http://kosmaczewski.net/random-quotes-on-business-and-software/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>The Dirty Little Secret of iPhone Development</title><link>http://akosma.com/2008/12/23/dirty-little-secret/</link> <comments>http://akosma.com/2008/12/23/dirty-little-secret/#comments</comments> <pubDate>Tue, 23 Dec 2008 12:34:54 +0000</pubDate> <dc:creator>akosma software</dc:creator> <category><![CDATA[Code]]></category> <category><![CDATA[iPhone]]></category> <category><![CDATA[Project Management]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[.NET]]></category> <category><![CDATA[AJAX]]></category> <category><![CDATA[Apple]]></category> <category><![CDATA[Objective-C]]></category> <category><![CDATA[programming]]></category> <category><![CDATA[project]]></category> <category><![CDATA[Software]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/?p=1275</guid> <description><![CDATA[This is happening right now, at a web agency near you. The dot-com boom of the 90&#8242;s spawned a brand new generation of coders and software developers, including me, by the way. While before that time the term of &#8220;software &#8230; <a
href="http://akosma.com/2008/12/23/dirty-little-secret/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>This is happening right now, at a web agency near you.</p><p>The dot-com boom of the 90&#8242;s spawned a brand new generation of coders and software developers, including me, by the way. While before that time the term of &#8220;software developer&#8221; might have been reserved to system programmers fluent in C, COBOL, C++ or other languages, right now the vast majority of developers I know spend their time writing web applications, either public or in a private intranet, in J2EE, ASP.NET, Rails, PHP, you name it.</p><p><a
href="/2007/08/02/web-development-equal-software-development/">I have said before</a> that writing web applications should be taken as seriously as writing desktop systems. Call me names if you want, but I&#8217;m a big fan of <a
href="http://www.joelonsoftware.com/articles/fog0000000043.html">Joel&#8217;s Test</a>.</p><p>However, after all this years, after the <a
href="http://www.cs.nmt.edu/~cs328/reading/Standish.pdf">Chaos reports</a>, after <a
href="/2005/11/20/my-bookshelf-part-iii/">Peopleware</a>, after the <a
href="/2008/08/08/adding-manpower/">Mythical Man Month</a>, people still treat <a
href="/2007/12/16/software-project-quality/">quality</a> as an afterthought. And also complain about how much software sucks, how expensive it is, and how late it arrives, by the way. Now that the iPhone SDK is widely available, that the App Store is selling more apps that we could have had imagined 6 months ago, many web agencies want to jump to native iPhone development contracts, which are hype and nice and pricey and whatnot. Which is only going to make things worse.</p><p>The dirty little secret in this story is this: <strong>iPhone development looks more like developing applications for a desktop operating system, and less, much less than web development.</strong> And I&#8217;m frightened to see some small shops (and even bigger ones), who never attained a real level of professionalism or quality in their software tasks, starting projects and realizing, later, when they are over budget and <a
href="/2007/06/05/schedule-issues/">behind schedule</a>, that this kind of applications requires a different mindset.</p><p><span
id="more-1275"></span></p><p>Let&#8217;s repeat something that you should know by now: web apps are easy to maintain. To begin with, you just have one instance running of it, and as <a
href="http://www.paulgraham.com/avg.html">Paul Graham said</a>, you can write them in any language you want, you can release bug fixes with your application running, monitor performance issues live, change its appearance quite easily and for everyone at once, etc. This is probably the single biggest advantage of web apps. With AJAX we even got the possibility of going beyond in terms of user interface, responsiveness, perceived speed, you name it, and today the number of famous web apps is outstanding.</p><p>However, web apps run into this terrific (and terrifying) sandbox called the browser. They (normally) cannot access your file system, they cannot open other applications and interact with them &#8211; well, with some custom URL schemes like lastfm: mailto: or skype: you might have the ability to do some things, but certainly not much more than activating the application in some limited way as a help for the user. You cannot access the user&#8217;s hardware directly &#8211; well, again, you can access the webcam through Flash, or you can trigger the window.print() method to have the native print dialog pop up, but that&#8217;s more or less the maximum you can do.</p><p>In the iPhone, there is a similar situation. You choose to create a native iPhone application over a web one when you require one or many of these things in your application:</p><ul><li>GPS geographical data;</li><li>Accelerometer information;</li><li>Photo camera or library;</li><li>3D graphics;</li><li>Complex animations;</li><li>Address Book entries;</li><li>Sound recording and playback;</li><li>etc&#8230;!</li></ul><p>I&#8217;ve talked about the dichotomy between iPhone native vs. web apps in my <a
href="/2008/11/03/iphone-conference-2008-a-bit-of-magic/">speech during the iPhone conference</a> where I used this graphic, which might help those having to decide whether they should do a native or a web application:</p><p><img
src="/wp-content/uploads/2008/12/graph.png" alt="" title="graph" width="450" height="372" class="alignnone size-full wp-image-1276" /></p><p>The tradeoff, basically, consists in knowing that having the ability to access these features, means that you are giving up your capacity to roll out quick upgrades to your code. You have to depend on Apple&#8217;s own review process timings for that, which, as far as I&#8217;ve seen so far, cannot be predicted. And finally, you depend on the user&#8217;s final will to update your application!</p><p>Similarly, you also lose the ability to create these applications using your common, well-known, garbage-collected programming language, but you&#8217;ll have to deal with Objective-C exclusively, together with its weird syntax, possible memory leaks, eventual out-of-memory notifications, lazy loading techniques, compiler warnings and errors, and seeing the MVC design pattern even in your wildest dreams at night. Regarding the syntax, I admit that I love it, but it took me a while to get used to it, when I started playing with it back in 2003.</p><p>Given these conditions, when you start an iPhone project you will have (let me be very clear about this, so I&#8217;ll repeat) you will have to dust out your good old desktop application programming techniques (or learn if you don&#8217;t have them), read Code Complete again (which I&#8217;m doing right now) and take all the advice that you can from C and C++ programmers who have been working in this kind of stuff for the past 20 years.</p><p>I&#8217;ve even done my Master&#8217;s <a
href="http://remproject.org/">degree project in C++</a> because of this: the mindset required for iPhone apps is not the same as for your day-to-day web application, and is closer to that of a desktop application. I&#8217;ve been doing web apps for 12 years now, and desktop apps for 5 years (mostly in C#, Objective-C and C++); that&#8217;s my ground for stating this. You require a spec, you require tests, you require testers, you require daily builds, you require bug databases, you require <a
href="/2007/05/10/open-space-or-individual-offices/">quiet working conditions</a>.</p><p>You require at least an 11 in <a
href="http://www.joelonsoftware.com/articles/fog0000000043.html">Joel&#8217;s Test</a> to know that you&#8217;re doing fine, but not only that: you need to know about pointers, you need to <a
href="http://cocoadevcentral.com/articles/000081.php">know C</a>, you need to know that your code runs in an fragile environment with EXC_BAD ACCESS (SIGBUS) and low-memory warnings and stuff like that happening when you expect it the least.</p><p>Unfortunately, from what I&#8217;ve seen so far (at least here in the Lake Geneva region) many companies are spending much more than they intended to for rolling out their iPhone apps; these are real quotes from people I&#8217;ve dealt with in the past 6 months:</p><ul><li>&#8220;Oh, we do not write specs, we prefer to modify the code as we have ideas!&#8221;;</li><li>&#8220;Oh, we do not write tests, we do not have the time for that!&#8221;;</li><li>(in general) &#8220;Oh, we do not work like that here. We do what the client asks and that&#8217;s all.&#8221;;</li><li>&#8220;We will not follow Apple&#8217;s iPhone Human Design Guidelines at all; we have our own. Users must double-click on buttons, so they feel more comfortable while using our application&#8221;;</li><li>&#8220;We want our [PUT YOUR FAVORITE UIKIT CLASS NAME HERE] to have [SOME IMPOSSIBLE FEATURE WHICH DEFIES GRAVITY]. Easy, right?&#8221;</li><li>&#8220;We have to remove this XYZ feature, right now!&#8221;, which means rewriting half of the code and leads to this: &#8220;What? So much? For such a small change?&#8221;</li><li>&#8220;Why have you spent all that time &#8216;fixing memory leaks&#8217;? I won&#8217;t pay for that. Please concentrate in the new features we&#8217;ve asked. By the way, what are memory leaks?&#8221;</li><li>&#8220;Here&#8217;s the styles document you asked, with the colors and fonts for the application&#8221; and the guy provides me with&#8230; a CSS stylesheet. Which references a <a
href="/2008/11/12/iphone-font-browser/">font not available on the iPhone</a>, by the way, and with colors in hex format.</li><li>&#8220;We want an animation at startup, like the Chanel application&#8221; (everyone wants to release the next Chanel iPhone app these days) &#8220;here&#8217;s an [animated GIF / Flash movie / PowerPoint slides] with the animation for you.&#8221;</li><li>&#8220;Our team has slightly modified the code when you weren&#8217;t there, but it does not work any more, could you fix it please?&#8221;</li></ul><p>And of course, the all-time winners: the support tickets stating that &#8220;everything is slow&#8221; without further indication, or that &#8220;the application hangs&#8221;, without any details in it.</p><p>OK, I confess, I&#8217;m a bit of an extremist here; many of the quotes above are valid in some contexts. But not those of the small-to-medium sized iPhone projects I&#8217;ve been involved in lately, with the urgency of releasing the code as fast as possible, just for the sake of being there, in the App Store, right now.</p><p>There&#8217;s a long road ahead. The problem, again, is not the technology itself, but the people involved in these projects (me, for example :). There&#8217;s a bit of what Joel mentioned a while ago, about the <a
href="http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html">perils of Java schools</a>, which actually only has to do with developers, but there&#8217;s also the issue about teaching the clients the limits of the platform, and about creating a strong software engineering body of knowledge in companies which usually did not need it previously.</p><p>We&#8217;ve been doing web apps for so long that we&#8217;ve forgotten how to sit down, take a deep breath, fix that goddamn memory leak, and realize that, as Brooks and <a
href="http://www.joelonsoftware.com/articles/fog0000000017.html">Joel said</a>, good software takes time.</p> ]]></content:encoded> <wfw:commentRss>http://akosma.com/2008/12/23/dirty-little-secret/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>Saving a Failing Project</title><link>http://kosmaczewski.net/saving-a-failing-project/</link> <comments>http://kosmaczewski.net/saving-a-failing-project/#comments</comments> <pubDate>Mon, 11 Aug 2008 06:40:02 +0000</pubDate> <dc:creator>Adrian</dc:creator> <category><![CDATA[Papers]]></category> <category><![CDATA[Project Management]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[Architecture]]></category> <category><![CDATA[Lausanne]]></category> <category><![CDATA[project]]></category> <category><![CDATA[source control]]></category> <category><![CDATA[tools]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/?p=1248</guid> <description><![CDATA[In 2006 I had the opportunity to work as a &#8220;project leader&#8221; into a small failing project. Three developers were working in an ad hoc basis, creating a software application for an important client (a government office in Lausanne), without &#8230; <a
href="http://kosmaczewski.net/saving-a-failing-project/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>In 2006 I had the opportunity to work as a &#8220;project leader&#8221; into a small failing project. Three developers were working in an ad hoc basis, creating a software application for an important client (a government office in Lausanne), without any kind of detailed formal specification, without any kind of design documentation, and with strong pressure from the management to release the application, even if not in an usable state. Needless to say, the project was also beyond budget.</p><p>I had just joined this company a couple of days ago, and the management asked me to take the project in charge. Not an easy task, particularly because it was my first experience of this kind. <span
id="more-1248"></span> The client was pushing to get the software it had paid for (it was a desktop reporting application for the Police department), and had not got any kind of preview yet. So the first thing I did is to pick up my copy of &#8220;Leading a Software Development Team&#8221; book and read chapter 2, &#8220;I&#8217;m taking over the leadership of an existing project // where do I start?&#8221; and get a thorough read:</p><blockquote>The first thing that you should start to do is to review the situation. This involves more than just absorbing impressions; you need to organize these impressions into a framework. Try to organize your thoughts into the following areas, and in each area try to separate technical issues from personnel ones:
- Where is the team now? (&#8230;)
- Where is it supposed to be getting to? (&#8230;)
- How does the team currently intend to continue?</blockquote><p>(Whitehead, page 17)</p><p>Another highly pragmatic resource was Joel Spolsky, and his &#8220;Joel Test&#8221;:</p><blockquote>The neat thing about The Joel Test is that it&#8217;s easy to get a quick yes or no to each question. You don&#8217;t have to figure out lines-of-code-per-day or average-bugs-per-inflection-point. Give your team 1 point for each &#8220;yes&#8221; answer.(&#8230;)
A score of 12 is perfect, 11 is tolerable, but 10 or lower and you&#8217;ve got serious problems. The truth is that most software organizations are running with a score of 2 or 3, and they need serious help, because companies like Microsoft run at 12 full-time.</blockquote><p>(Spolsky, 2000)</p><p>The &#8220;Joel Test&#8221; result for this team was 2 when I joined the team (they just had source control and good tools). When I left the company, they were running at 9 (we just did not have candidates writing code during interviews, nor testers, nor hallway usability testing).</p><p>For this project I took the following decisions:</p><ul><li>Since the priority for the client was to see results, I asked the developers to concentrate on stabilizing &#8220;visible&#8221; features, particularly on a visual report editor, that used a complex set of controls, similar to those of a drawing application, to create reports. Doing this, we could have a stabilized preview version that we showed to the client as early as one week after my arrival to the project.</li><li>In agreement with the developers, we set up a daily build procedure, and I also asked them to provide a &#8220;client build&#8221; every Wednesday, that would be placed in a public directory available to the client. It turns out that the client never downloaded the binaries, but they liked to see the version numbers grow, and the binaries being delivered. Every week, Wednesday was the &#8220;public build&#8221; day, Thursday was the &#8220;bug correction&#8221; day, and Friday, Monday and Tuesday were &#8220;new features day&#8221;. Small stand-up meetings every day allowed us to know what was going on.</li><li>Another important concern from the developers&#8217; side was to have a quiet environment to work. They were constantly interrupted by the (quite nervous) managers to see their progress, and as such, I decided to stand in between both; I asked them to not to interrupt the developers for any reason, and to ask me for updates. I became a &#8220;proxy&#8221; between both, which reduced the tensions, and brought some peace to the developers.</li><li>I created a fast project plan in our Intranet (there wasn&#8217;t any, so tracking the project was next to impossible) by asking the developers about the tasks they needed to do to finish the project, with the estimated time to do them, and setting some milestones. Since the project was in a wiki page, the developers could change the time estimations in case that they felt they had made a mistake; the only condition being to notify me of these changes.</li><li>Using that information, I could create a couple of reports for everyone to see, and bring more visibility to the project:<ol><li>I wrote a weekly report stating the week&#8217;s achievements, the status of the project (number of open bugs, new functionality available, etc).</li><li>In the intranet, I set up a couple of graphs and report tables, which were automatically updated every day.</li></ol></li><li>I did not take any technical decisions about the project; I gave full authority on this matter to the lead developer, who in turn appreciated this trust and took spontaneously the decision of documenting and unit testing the system thoroughly doing extra hours every day. This boosted the morale of the team, and the quality of the application as well. The other two developers contributed to these tasks as well, and the rhythm of releases and their quality increased in a couple of months. It turns out that the architecture of the system was particularly well done, and as such, adding new features was a relatively simple task, once the underlying framework was done; of course, during that time no visible results were available, which made everyone nervous.</li></ul><p>Looking backwards, the only technical decision I&#8217;ve needed to take during this project was to use the company wiki; there I could add information pages that everyone contributed to, reducing the number of communication channels and reducing the misunderstandings between project team members. I cannot stress how much this helped; it provided a complete dashboard for everyone to refer to.</p><p>The most important problems in this project were human and customer related ones. By providing more visibility to the project, and by reducing the signal-to-noise ratio in the communication channels between developers and management, the team was able to provide the customer with a more reliable and full-featured product.</p><p><strong>References</strong></p><p>Joel Spolsky, &#8220;The Joel Test: 12 Steps for Better Code&#8221;, Wednesday, August 9th, 2000 [Internet] <a
href="http://www.joelonsoftware.com/articles/fog0000000043.html">http://www.joelonsoftware.com/articles/fog0000000043.html</a> (Accessed June 8th, 2007)</p><p>Whitehead, R.; &#8220;Leading a Software Development Team &#8211; A Developer&#8217;s Guide to Successfully Leading People &amp; Projects&#8221;, Addison-Wesley, 2001, ISBN 0-201-67526-9</p> ]]></content:encoded> <wfw:commentRss>http://kosmaczewski.net/saving-a-failing-project/feed/</wfw:commentRss> <slash:comments>11</slash:comments> </item> <item><title>Certification</title><link>http://kosmaczewski.net/certification/</link> <comments>http://kosmaczewski.net/certification/#comments</comments> <pubDate>Tue, 05 Aug 2008 08:09:31 +0000</pubDate> <dc:creator>Adrian</dc:creator> <category><![CDATA[Papers]]></category> <category><![CDATA[Project Management]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[Architecture]]></category> <category><![CDATA[business]]></category> <category><![CDATA[learning]]></category> <category><![CDATA[university degree]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/?p=1246</guid> <description><![CDATA[While several other professions have a long, established and standard procedure of certification, the title &#8220;software engineer&#8221; is applied to both self-made developers, turned into experts of some technique, or to people with PhD degrees, and a long history of &#8230; <a
href="http://kosmaczewski.net/certification/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>While several other professions have a long, established and standard procedure of certification, the title &#8220;software engineer&#8221; is applied to both self-made developers, turned into experts of some technique, or to people with PhD degrees, and a long history of both academic and professional achievements.</p><p>When in some situations it is not legally possible to use the title &#8220;software engineer&#8221; without an engineering degree of some kind (for example, in some states of the USA or some institutions like the IEEE &#8211; <a
href="http://www.ieeeusa.org/policy/positions/titleengineer.html">http://www.ieeeusa.org/policy/positions/titleengineer.html</a>), the term &#8220;software developer&#8221; is usually applied to people in charge of designing, writing and / or maintaining software-based systems. I will use the terms developer and engineer interchangeably in this discussion, which some people might think is not correct. <span
id="more-1246"></span> The discussion about the need of a formal certification process is a relatively new one:</p><blockquote>Professional certification in the IT industry is a relatively recent phenomenon. It was begun in the late 1980s by Novell, Inc., an upstart networking vendor from Provo, Utah, in an effort to build market share and manage support costs for its products by building the skill levels of the people who worked with those products. Novell was one of the first companies to recognize the links between education/skills and product success. They knew that they could not build an education infrastructure that would support their worldwide marketing plans with their own resources. However, they also recognized that if they did not provide for skills acquisition for their highly technical products, they could never meet their product revenue goals.</blockquote><p>(Shore)</p><p>However, no consensus about whether or not certification is needed has been reached yet. This article will highlight some of the problems raised by software engineering certification, which might explain the lack of consensus cited before:</p><ul><li>The first one has to do with the inherent extension of the software engineering field: are all software developers equal?</li><li>The second one has to do with the large number of available certifications: which one to choose? Which ones are &#8220;reliable&#8221; indicators of expertise, and in which fields?</li></ul><p><strong>What is a &#8220;Software Engineer&#8221;?</strong></p><p>In my career, I&#8217;ve found self-made people (I&#8217;m one of them, actually), real-estate architects, lawyers, mathematicians, economists and even geophysicists writing code for a life. What I&#8217;ve seen so far is that the most successful software developers are those who like doing it, no matter which profession they&#8217;ve followed. And the opposite is also true: many guys with a computer science degree discover, some time after they start their careers, that they definitely do not like that code thing.</p><p>One of the biggest problems with certifications is that there is not such thing as a &#8220;single kind&#8221; of software developer:</p><ul><li>There are those who write games, and spend most of their time writing in low-level languages for game consoles, optimizing for speed and space, and creating three-dimensional worlds using as little memory as possible&#8230;</li><li>There are those who write web-based applications, and spend their time creating 3-tier architectures, talking to a database, using some kind of object-oriented platform, and luckily exposing some data using XML web services, dealing with cross-browser issues, and wondering what is all that fuss about Web 2.0&#8230;</li><li>There are those who write operating systems, and work for some embedded software company, or hack Linux kernel device drivers every night, or work for Microsoft or Sun or Apple, and spend most of their time discussing whether microkernels are better than monolithic architectures&#8230;</li><li>There are those who have the ill fate of working as a consultant, and spend more time switching from project to project every day, or dealing more with corporate politics, rather than with code&#8230;</li><li>There are those who manage projects and spend more time in their mailing list or in Microsoft Project rather than being able to code (and then complain about this in their blogs)&#8230;</li><li>There are those who have a software engineering degree, but work for ZDNet writing about industry trends&#8230;</li><li>There are those who turn into human resource consultants, and try to keep up to date on the new trends, but feel completely lost given what they learnt in university&#8230;</li><li>There are those who do a little bit of all what I&#8217;ve mentioned above, and are or not really good at all of them&#8230;</li><li>And finally there are those who might fit any of the characteristics above, but would have preferred not to listen their parents and rather open that scuba-diving shop in Honolulu.</li></ul><p><strong>Available Certifications</strong></p><p>This diversity explains the existence of more common product-specific certifications: you can be certified to use Microsoft technologies (<a
href="http://www.microsoft.com/learning/mcp/default.mspx">http://www.microsoft.com/learning/mcp/default.mspx</a>), MySQL databases (<a
href="http://www.mysql.com/certification/">http://www.mysql.com/certification/</a>), Apple servers (<a
href="http://www.apple.com/xserve/raid/certifications.html">http://www.apple.com/xserve/raid/certifications.html</a>), various IBM products (<a
href="http://www-03.ibm.com/certify/certs/index.shtml">http://www-03.ibm.com/certify/certs/index.shtml</a>), Java development stacks (<a
href="http://www.sun.com/training/certification/java/index.xml">http://www.sun.com/training/certification/java/index.xml</a>), Cisco routers (<a
href="http://forums.cisco.com/eforum/servlet/CCNP?page=main">http://forums.cisco.com/eforum/servlet/CCNP?page=main</a>), RedHat Linux installations (<a
href="https://www.redhat.com/training/certification/">https://www.redhat.com/training/certification/</a>) or UML diagrams (<a
href="http://www.omg.org/uml-certification/index.htm">http://www.omg.org/uml-certification/index.htm</a>)</p><p>However, given that technology companies have interest in having many people taking their certifications, their affordability and low-entry barriers to get them, many of these become much easy to get than they should be, and as a result, they lose credibility, and do not help IT recruiters to filter properly software developers during the selection processes. I&#8217;ve heard many complaints of project managers regarding these certifications, and I think it&#8217;s a generalized feeling:</p><blockquote>&#8220;Certified skills pay has not just flat lined, it&#8217;s in the negative. This is big news if you&#8217;re certified and you&#8217;re thinking about getting recertified,&#8221; said Foote.
&#8220;This trend is in the fourth quarter, that pay for certifications is on the wane, while non-certified skills are growing in pay.&#8221;(&#8230;)
Certifications are losing value because employers are looking for more in their workers than the ability to pass an exam; they want business-articulate IT pros.&#8221;</blockquote><p>(Rothberg, 2006)</p><p>Bruce Schneier, a well-known security researcher, has written about security certifications as well, with a mixed feeling:</p><blockquote>In the end, certifications are like profiling. They work , but they&#8217;re sloppy. Just because someone has a particular certification doesn&#8217;t mean that he has the security expertise you&#8217;re looking for (in other words, there are false positives). And just because someone doesn&#8217;t have a security certification doesn&#8217;t mean that he doesn&#8217;t have the required security expertise (false negatives). But we use them for the same reason we profile: We don&#8217;t have the time, patience, or ability to test for what we&#8217;re looking for explicitly.</blockquote><p>(Schneier, 2006)</p><p>The conclusion of all of this is that the debate is pretty much still open, and that there is not a simple answer to it.</p><p><strong>Market Fragmentation</strong></p><p>There is an interesting anonymous comment in Schneier&#8217;s website as well:</p><blockquote>Another thought on certification is they are not all equal.
There are Vendor Certs.
Microsoft&#8217;s MCP/MCSE, CISCO CCNA/CCNP/CCIE
Pro: The canidate is likley to know how to work on your specific platform.
Con: The canidate is likely to think in only the vendor&#8217;s interest.
There are Certs to assure knowledge of standard security terminlogy.
ISC CISSP
Pro: Can talk strategy and evaluate the nine domains to evaluate how the company is doing overall
Cons: Most likely could not tell you what the nineth byte of an ip packet means or if OpenSSL is out of date on Red Hat Linux.
Topic specific, vendor neutral.
SANS GIAC
Pro: Vendor neutral. A lot of focus on specific skills in NIDS or Hardening Windows, Incident Handeling, etc.
Con: Concentration on open source tools since they are easily available, but it does not seem to impress all employers.</blockquote><p>(@nonymou5, in Schneier, 2006, spelling mistakes not corrected)</p><p>I think that this comment summarizes pretty well another problem with certifications: there is a great level of fragmentation in today&#8217;s market. Every single important technology in the IT world requires a huge investment in time and practice in order to master it, and this translates in a huge complexity for the developers to choose the right certification. All of these without taking into account the large number of IT-related university degrees available, online or not.</p><p><strong>Conclusion</strong></p><p>The term &#8220;software engineer&#8221; is sufficiently vague, and the number of &#8220;certifications&#8221; sufficiently large, as to allow a single &#8220;yes or no&#8221; answer to whether professionals in the software sector should be certified or not. I personally think that I would rather avoid vendor-specific certifications as far as possible, and choose university-related or problem domain related certifications instead, to keep my career options open, and my mind free of marketing.</p><p><strong>References</strong></p><p>Rothberg, Deborah; &#8220;Another Nail in the IT Certification Coffin&#8221;, Novembrer 3rd, 2006, [Internet] <a
href="http://www.eweek.com/article2/0,1895,2051272,00.asp">http://www.eweek.com/article2/0,1895,2051272,00.asp</a> (Accessed June 3rd, 2007)</p><p>Schneier, Bruce; &#8220;Security Certifications&#8221;, July 20th, 2006, [Internet] <a
href="http://www.schneier.com/blog/archives/2006/07/security_certif.html">http://www.schneier.com/blog/archives/2006/07/security_certif.html</a> (Accessed June 3rd, 2007)</p><p>Shore, Julie; &#8220;Why Certification? The Applicability of IT Certifications to College and University Curricula&#8221;, [Internet] <a
href="http://www.developer.ibm.com/university/scholars/certification/ebusiness/pdfs/why-certification.pdf">http://www.developer.ibm.com/university/scholars/certification/ebusiness/pdfs/why-certification.pdf</a> (Accessed June 3rd, 2007)</p> ]]></content:encoded> <wfw:commentRss>http://kosmaczewski.net/certification/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>On the Need of Minimalist Polyglots</title><link>http://kosmaczewski.net/minimalist-polyglots/</link> <comments>http://kosmaczewski.net/minimalist-polyglots/#comments</comments> <pubDate>Mon, 12 May 2008 13:19:25 +0000</pubDate> <dc:creator>Adrian</dc:creator> <category><![CDATA[Code]]></category> <category><![CDATA[Opinion]]></category> <category><![CDATA[Project Management]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[programming]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/2008/05/12/on-the-need-of-minimalist-polyglots/</guid> <description><![CDATA[Many companies, at some point of their history, ask themselves a simple question: what programming language should I use? The answer to this question is tricky, and has big, big consequences, for every single line of code of your future &#8230; <a
href="http://kosmaczewski.net/minimalist-polyglots/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Many companies, at some point of their history, ask themselves a simple question: <strong>what programming language should I use?</strong> The answer to this question is tricky, and has big, big consequences, for every single line of code of your future products will be written, read and suffered by it. This single choice defines the level of salaries you will have to pay, the skills of programmers you will have to deal with, the relative length and performance of your systems, the availability of tools (or lack thereof), the kind of support you will get (or not), the number of operating systems your code will work in, etc.</p><p><a
href='http://flickr.com/photos/undercover_surrealist/2314668364/'><img
src="http://kosmaczewski.net/wp-content/uploads/2008/05/2314668364_4b7c65db9b-300x300.jpg" alt="" title="2314668364_4b7c65db9b" width="150" height="150" align="left" /></a></p><p>Given the fact that <a
href="http://kosmaczewski.net/2007/08/02/web-development-equal-software-development/">Web Development equals Software Development</a>, this discussion will be of interest to those building the smallest websites, as well as old desktop-intensive apps. It will not be a &#8220;Tell me what programming language you use, and I will tell you who you are&#8221; type of article, though it may look like one, because that is something you have to figure out all by yourself.</p><p>If you take a look at the <a
href="http://en.wikipedia.org/wiki/List_of_programming_languages">list of programming languages</a>, any business person would have an instant headache. There are lots of them. With the strangest names. You cannot possibly guess which one to pick from such a list, obviously. So, how do companies choose the languages they use? There are some straightforward methods that I have seen so far, in no particular order:</p><ul><li>Looking at what other companies use (typically <a
href="http://www.google.com/">Google</a>, <a
href="http://www.microsoft.com/">Microsoft</a>, <a
href="http://www.apple.com/">Apple</a> or <a
href="http://www.sun.com/">Sun</a>, but it could be <a
href="http://37signals.com/">37signals</a> too).</li><li>Following the advice of the CIO, the Lead Architect or some other politically-powered person, which might or might not have read this article ;)</li><li>Looking at what the current pool of programmers in the company know how to use. Rinse, wash, repeat.</li><li>Following hype.</li><li>Because there is a market plenty of available, cheap programmers that I could use for this project.</li><li>Taking into account the characteristics of the languages themselves (static vs. dynamic, etc).</li><li>Following the company&#8217;s history of past projects (successful or not).</li><li>Following what your the client suggests (or mandates).</li></ul><p>I think that <strong>it is a very bad idea to take any of the above methods in isolation, without considering other factors.</strong> Doing so is a path to self-destruction in the medium to long term, even if you succeed in the short term.</p><p><span
id="more-1165"></span></p><p>Just as a small background for people not into programming: you can safely (roughly) group programming languages in a table like this:</p><table
border="1" cellpadding="5" cellspacing="0"><tr><td></td><th>Static</th><th>Dynamic</th></tr><tr><th>Strongly typed</th><td><a
href="http://kosmaczewski.net/2007/05/02/not-exactly-what-i-meant/">Java</a>, <a
href="http://kosmaczewski.net/2008/03/07/iphone-sdk-une-nouvelle-ere-demarre/">Objective-C</a>, Pascal, &#8230;</td><td><a
href="http://kosmaczewski.net/2008/01/11/my-first-django-project/">Python</a>, <a
href="http://kosmaczewski.net/2007/11/11/deliver-now/">Ruby</a>, <del
datetime="2008-05-13T06:49:42+00:00">JavaScript</del>, Objective-C, Lisp, &#8230;</td></tr><tr><th>Weakly typed</th><td><a
href="http://kosmaczewski.net/2008/03/13/templates/">C++</a>, C, &#8230;</td><td><a
href="http://kosmaczewski.net/2007/08/03/javascript-tips-tricks-1/">JavaScript</a>, <a
href="http://kosmaczewski.net/2005/09/15/land-of-the-forbidden-maneuver/">VBScript</a>, &#8230;</td></tr></table><p>In a static language all variable type references are bound at compile time; in a dynamic language, this is done at runtime (which allows you to assign a string or an int to the same variable). In a strongly-typed language, either the compiler or the runtime enforces the operations you can and cannot do on an object (depending on its type, as you may have guessed). In a weakly-typed one, there is no such restriction, and you can perform implicit conversions from one type to the other. And then you have functional ones, but that is another problem, because <a
href="http://kosmaczewski.net/2006/05/10/about-oop-and-other-programming-paradigms/">there are many programming paradigms</a> out there. And then there is the hybrid ones, which I love as <a
href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html">Steve Yegge</a> does:</p><blockquote> But also there&#8217;s, like, the Boo language, the io language, there&#8217;s the Scala language, you know, I mean there&#8217;s Nice, and Pizza, have you guys heard about these ones? I mean there&#8217;s a bunch of good languages out there, right? Some of them are really good dynamically typed languages. Some of them are, you know, strongly [statically] typed. And some are hybrids, which I personally really like.</blockquote><p>He did not include Objective-C as &#8220;hybrid&#8221;, but I think it is. Anyway, so much for the theory, here is the main point of this article:</p><p><a
href='http://flickr.com/photos/urban_data/373580375/'><img
src="http://kosmaczewski.net/wp-content/uploads/2008/05/373580375_ebd110c4cb.jpg" alt="" title="373580375_ebd110c4cb" width="500" height="377" class="alignnone size-full wp-image-1168" /></a></p><p>First of all, I consider programming languages (I know a <a
href="http://kosmaczewski.net/2007/12/19/erlang/">few of them</a>, and I have <a
href="http://kosmaczewski.net/2007/03/09/preferred-programming-languages/">my personal picks</a>) just as tools to <a
href="http://www.davidco.com/what_is_gtd.php">get things done</a>&trade;. <strong>Nothing else.</strong> I think of them as hammers or Black &amp; Decker screwdrivers or saws or nail guns.</p><p>Second, I believe that <a
href="http://www.elise.com/quotes/a/heinlein_specialization_is_for_insects.php">specialization is for insects</a>. Getting stuck in a single programming language because of any of the reasons I have enumerated above is just stupid.</p><p>So what I want to say is: <strong>You need polyglot programmers in your team</strong>, like you need a team of people knowledgeable in many human languages in every company doing business at global scale. I would say even more, you need not only people fluent in western languages (like English, French, Spanish and Italian, which is my combination) but also in other languages, with different paradigms behind, like Arab, Hebrew, Hindi or Chinese.</p><p>What does that mean in programming terms? You want to have programmers in your team being able to use different languages in different ways; you want to have programmers that learn new languages every so often, just for the sake of it. And most importantly, you want to get rid of programmers that not only get stuck on a single language, but that, even worse, dismiss any other way to do things. Having people that takes a negative look on the learning side of things can bring your whole company to a dead-end. This industry is plenty of integrists, and you do not want that in your company.</p><p>For example, JavaScript can be used as a procedural, object-oriented or functional programming language. Does your JavaScripters know how to write functional JavaScript? If not, that is too bad, because they will not be able to fully understand what is going on behind the scenes in <a
href="http://prototypejs.org/">Prototype</a> or <a
href="http://jquery.com/">jQuery</a> then. Of course this will not block them from using those libraries, but they might not understand how to apply some interesting patterns in their own code.</p><p>Ask more about your programmers: do they know how to do <a
href="http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern">complex C++ template metaprogramming</a>? Are they aware of some <a
href="http://kosmaczewski.net/2005/06/14/common-garbage-collection-problems/">performance problems brought by garbage collectors</a>? Do they follow the latest evolutions of the next version of JavaScript? (even if <a
href="http://kosmaczewski.net/2008/03/03/now-this-is-ridiculous/">they do not like them</a>) Which <a
href="http://kosmaczewski.net/2008/01/31/6-blogs/">blogs</a> do they follow? Do they know <a
href="http://www.ihatephp.net/">why some people hate PHP</a>? Do they know what a <a
href="http://www.seaside.st/">continuation server</a> is? Which <a
href="http://kosmaczewski.net/2008/01/23/best-books-of-2007/">programming books have they read</a> lately?</p><p>And finally, what is even more important than having chosen a good programming language? <strong>Your methodology.</strong> Ask yourself (or your team) about these points:</p><ul><li>Do you write unit tests? You might not have testers, which is a <a
href="http://www.joelonsoftware.com/articles/fog0000000067.html">bad idea</a> anyway, but that does not block you from testing code yourself (<a
href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html">Steve Yegge</a>):</li></ul><pre><code>&lt;blockquote&gt;
    And I would say it's a pain in the butt, but I mean... it's a pain in the butt because... a static type-systems researcher will tell you that unit tests are a poor man's type system. The compiler ought to be able to predict these errors and tell you the errors, way in advance of you ever running the program.
&lt;/blockquote&gt;
</code></pre><ul><li>Do you use <a
href="http://kosmaczewski.net/2007/08/23/design-by-contract/">defensive programming</a> techniques?</li><li>Do you have a wiki, a project website or at least good documentation in your code? If not, how do your new hires learn about your product? No, reading the code is NOT a good answer.</li><li>Is your chosen programming language portable? You might think that your system will never have to run on Linux or Mac, but why stuck yourself on purpose?</li></ul><p>The common factor of all the above items is that you have to <strong>manage complexity</strong>. If you write code, you are creating complex stuff, and one of the best ways to manage complexity is to create small systems; as <a
href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html">Steve Yegge said</a>:</p><blockquote> Small systems are not only easier to optimize, they&#8217;re possible to optimize. And I mean globally optimize.</blockquote><p><a
href='http://flickr.com/photos/simon_shek/80220468/'><img
src="http://kosmaczewski.net/wp-content/uploads/2008/05/80220468_0747c5d7bd.jpg" alt="" title="80220468_0747c5d7bd" width="500" height="375" class="alignnone size-full wp-image-1167" /></a></p><p>And this is why you do not only need polyglot, but also <strong>minimalist programmers</strong> in your team. Small is beautiful. Paul Graham (of <a
href="http://ycombinator.com/">Y Combinator</a> fame) knows that <a
href="http://www.paulgraham.com/hp.html">dynamic languages yield small systems</a>:</p><blockquote> The right tools can help us avoid this danger. A good programming language should, like oil paint, make it easy to change your mind. Dynamic typing is a win here because you don&#8217;t have to commit to specific data representations up front. But the key to flexibility, I think, is to make the language very abstract. The easiest program to change is one that&#8217;s very short.</blockquote><p>And how can you get small programs? By choosing the right programming language. Which brings us to the beginning of this post! So, here go some tips for all of you looking for the right programming language:</p><ul><li><strong>Prefer strongly-typed, dynamic languages;</strong> there are a lot of reasons for that, particularly those exposed by Steve Yegge in his <a
href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html">excellent presentation at Stanford</a>:</li></ul><blockquote> Yeah, sure, it catches a few trivial errors, but what happens is, when you go from Java to JavaScript or Python, you switch into a different mode of programming, where you look a lot more carefully at your code. And I would argue that a compiler can actually get you into a mode where you just submit this batch job to your compiler, and it comes back and says &#8220;Oh, no, you forgot a semicolon&#8221;, and you&#8217;re like, &#8220;Yeah, yeah, yeah.&#8221; And you&#8217;re not even really thinking about it anymore.
Which, unfortunately, means you&#8217;re not thinking very carefully about the algorithms either. I would argue that you actually craft better code as a dynamic language programmer in part because you&#8217;re forced to. But it winds up being a good thing.</blockquote><ul><li>Some points about his talk:<ul><li>Many of the caveats of dynamic languages are not (so) true anymore (like the lack of decent <a
href="http://www.jetbrains.com/idea/">IDEs</a> or the performance problems);</li><li>There is a lot of research going on nowadays on the performance of programming languages, and this means that code written in these languages will benefit from many improvements in the near future, for free;</li><li>And yes, there is the hype factor I have mentioned above; the <a
href="http://www.paulgraham.com/pypar.html">cool kids are using them</a>:</li></ul></li></ul><blockquote> Which makes them exactly the kind of programmers companies should want to hire. Hence what, for lack of a better name, I&#8217;ll call the Python paradox: if a company chooses to write its software in a comparatively esoteric language, they&#8217;ll be able to hire better programmers, because they&#8217;ll attract only those who cared enough to learn it. And for programmers the paradox is even more pronounced: the language to learn, if you want to get a good job, is a language that people don&#8217;t learn merely to get a job.</blockquote><ul><li><strong>Teach yourselves;</strong> setup internal workshops to have all your team learn how to do cool stuff with those languages you have read about in <a
href="http://www.ddj.com/">DDJ</a>.</li><li><strong>Teach the community around you, and do not be scared of competition;</strong> have your team write papers, articles on business or technical journals, publish code as open source projects, and show that you can go beyond.</li><li><strong>Keep an open mind:</strong> continuation servers, <a
href="http://en.wikipedia.org/wiki/Comet_(programming)">Comet</a> or <a
href="http://www.gotw.ca/publications/concurrency-ddj.htm">multicore processors</a> are the future. Is your team prepared?</li></ul><p>Software is a social process. Once you get this in your mind, and get your team working proactively, collaboratively and teaching each other, the choice of a programming language comes in second place.</p> ]]></content:encoded> <wfw:commentRss>http://kosmaczewski.net/minimalist-polyglots/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Quick spec from your Python tests</title><link>http://kosmaczewski.net/quick-spec-for-python-tests/</link> <comments>http://kosmaczewski.net/quick-spec-for-python-tests/#comments</comments> <pubDate>Thu, 17 Apr 2008 16:25:58 +0000</pubDate> <dc:creator>Adrian</dc:creator> <category><![CDATA[Django]]></category> <category><![CDATA[How to?]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[Python]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/?p=1148</guid> <description><![CDATA[Using Python&#8217;s own unittest package, here&#8217;s a small script that can iterate over your test suite to output a small, quick, nice list of the tests in your application: [source:python] import unittest loader = unittest.TestLoader() tests = loader.loadTestsFromName(&#8216;path.to.your.tests.package&#8217;) for test &#8230; <a
href="http://kosmaczewski.net/quick-spec-for-python-tests/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Using Python&#8217;s own unittest package, here&#8217;s a small script that can iterate over your test suite to output a small, quick, nice list of the tests in your application:</p><p>[source:python]
import unittest</p><p>loader = unittest.TestLoader()
tests = loader.loadTestsFromName(&#8216;path.to.your.tests.package&#8217;)
for test in tests.<em>tests:
print test._tests[0].<strong>class</strong>.<strong>name</strong>.replace(&#8220;Test&#8221;, &#8220;&#8221;)
for method in test._tests:
print &#8221;   %s&#8221; % method._testMethodName.replace(&#8220;test</em>&#8220;, &#8220;&#8221;).capitalize().replace(&#8220;_&#8221;, &#8221; &#8220;)
[/source]</p><p>This would yield something like this: <code> Business
&nbsp;&nbsp;&nbsp;&nbsp;Accounts have at least one entry
&nbsp;&nbsp;&nbsp;&nbsp;Clerks cannot close accounts
Security
&nbsp;&nbsp;&nbsp;&nbsp;Users can create new accounts
&nbsp;&nbsp;&nbsp;&nbsp;Anonymous users cannot access private areas
... </code></p><p>Of course, you&#8217;ll get better results if you follow <a
href="http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsibly.html">Google&#8217;s naming conventions</a> for your tests&#8230; ;) This is not <a
href="http://rspec.info/">rspec</a> (nor an alternative to it) but it might be useful to some of you.</p><p>Just as a reminder for Django users: you might need to</p><p><code> setenv DJANGO_SETTINGS_MODULE application.settings </code></p><p>or</p><p><code> export DJANGO_SETTINGS_MODULE=application.settings </code></p><p>in order to make the script work properly! At least I had to :)</p> ]]></content:encoded> <wfw:commentRss>http://kosmaczewski.net/quick-spec-for-python-tests/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Another category for this blog</title><link>http://kosmaczewski.net/another-category-for-this-blog/</link> <comments>http://kosmaczewski.net/another-category-for-this-blog/#comments</comments> <pubDate>Wed, 19 Dec 2007 08:11:10 +0000</pubDate> <dc:creator>Adrian</dc:creator> <category><![CDATA[Quality]]></category> <category><![CDATA[blogging]]></category> <category><![CDATA[category]]></category> <category><![CDATA[Software]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/2007/12/19/another-category-for-this-blog/</guid> <description><![CDATA[Those who read my blog know that I tend to write about software quality issues fairly often; particularly about open spaces and my aversion against them :) I thought it was time to group all those entries into a WordPress &#8230; <a
href="http://kosmaczewski.net/another-category-for-this-blog/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Those who read my blog know that I tend to write about software quality issues fairly often; particularly about open spaces and my aversion against them :)</p><p>I thought it was time to group all those entries into a WordPress category of its own: <a
href="/category/quality">&#8220;Quality&#8221;</a>. Feel free to check the articles in there, and of course, to leave any comments that you want.</p> ]]></content:encoded> <wfw:commentRss>http://kosmaczewski.net/another-category-for-this-blog/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Total Quality Management and Software</title><link>http://kosmaczewski.net/total-quality-management-and-software/</link> <comments>http://kosmaczewski.net/total-quality-management-and-software/#comments</comments> <pubDate>Tue, 18 Dec 2007 15:14:47 +0000</pubDate> <dc:creator>Adrian</dc:creator> <category><![CDATA[Papers]]></category> <category><![CDATA[Project Management]]></category> <category><![CDATA[Quality]]></category> <category><![CDATA[Software]]></category> <category><![CDATA[Opinion]]></category> <guid
isPermaLink="false">http://kosmaczewski.net/2007/12/18/total-quality-management-and-software/</guid> <description><![CDATA[Introduction Total Quality Management is one of the founding pillars of modern mass-production economy, of which the software industry is by far the youngest (and most rebel) child. This article will provide a short discussion on some TQM principles and &#8230; <a
href="http://kosmaczewski.net/total-quality-management-and-software/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><strong>Introduction</strong></p><p>Total Quality Management is one of the founding pillars of modern mass-production economy, of which the software industry is by far the youngest (and most rebel) child. This article will provide a short discussion on some TQM principles and about their applicability to software projects. <span
id="more-1024"></span> <strong>TQM Principles</strong></p><p>Joel Spolsky has written a brilliant introduction to software testing in his famous &#8220;Joel on Software&#8221; blog:</p><blockquote> Software has bugs. CPUs are outrageously finicky. They absolutely refuse to deal with things that they weren&#8217;t taught to deal with explicitly, and they tend to refuse in the most childish of ways. When my laptop is away from home, it tends to crash a lot because it can&#8217;t find the network printer it&#8217;s used to finding. What a baby. It probably comes down to a single line of code somewhere with a teensy tiny almost insignificant bug in it.</blockquote><p>(Spolsky, 2000)</p><p>The software industry has been a victim of its own success. Software companies have experienced the fastest growing rates in the history of capitalism, and this rush to conquer juicy worldwide markets, and to offer services to literally billions of human beings has, more often than not, been done at the expense of proper quality guidelines.</p><p>William Deming proposed 14 key principles that form the basis of what became TQM in the second half of the 20th century:</p><blockquote><ol><li>Create <strong>constancy of purpose</strong> for the improvement of product and service (&#8230;)</li><li>Adopt a new <strong>philosophy of cooperation</strong> (win-win) (&#8230;)</li><li>Cease dependence on mass inspection to achieve quality. Instead, <strong>improve the process</strong> and build quality into the product in the first place.</li><li>End the practice of awarding business on the basis of price tag alone. Instead, <strong>minimize total cost</strong> in the long run. (&#8230;)</li><li><strong>Improve constantly</strong>, and forever, the system of production, service, planning, of any activity. (&#8230;)</li><li><strong>Institute training</strong> for skills.</li><li>Adopt and <strong>institute leadership for the management of people</strong>, recognizing their different abilities, capabilities, and aspiration. (&#8230;)</li><li><strong>Drive out fear</strong> and build trust so that everyone can work more effectively.</li><li><strong>Break down barriers between departments.</strong> Abolish competition and build a win-win system of cooperation within the organization. (&#8230;)</li><li><strong>Eliminate slogans</strong>, exhortations, and targets asking for zero defects or new levels of productivity. (&#8230;)</li><li><strong>Eliminate numerical goals</strong>, numerical quotas and management by objectives. (&#8230;)</li><li><strong>Remove barriers</strong> (&#8230;) abolishing the annual rating or merit system that ranks people and creates competition and conflict.</li><li>Institute a vigorous program of <strong>education and self-improvement.</strong></li><li>Put everybody in the company to work to accomplish the transformation.<strong> The transformation is everybody&#8217;s job.</strong></li></ol></blockquote><p>(Wikipedia, emphasis added)</p><p>In the following section, I will discuss how these principles overlap and intersect, and how they can be applied (and have been applied historically) in software companies.</p><p><strong>Focus on the People</strong></p><p>From the above list, some commonalities appear for all and each one of the principles: the biggest one in my opinion is the focus on the people. As such, knowing that software is a pure mind product, completely intangible and tremendously flexible, I think more than ever that software is a human &amp; social process. This focus in people is particularly evident in principles 2, 6, 7, 8, 9, 10, 13 and 14.</p><p>For example, reducing the causes of internal and external conflict in the organization (principles 12, 9, 2), makes software developers able to collaborate with other departments or companies, creating integrated software suites that become de facto standards in their respective industries. A very extreme example of this phenomenon is Microsoft&#8217;s Office System, which was created from separate products created by different teams, such as Word and Excel. The synergy created by the developers working together, not only unifying the UI look &amp; feel or the programming model, but also increasing the interoperability of both systems, created a product that effectively is much more than just two products together.</p><p>Moreover, the Peopleware book by DeMarco and Lister showed that historically, the most successful software companies have been those that excelled in creating a human-centric environment:</p><blockquote> In 1982, (Mitchell Kapor) founded Lotus Development Corporation, for which he is most noted. While there, he revolutionized corporate workplace culture by making diversity and inclusivity top priorities in his goal for creating an environment that attracted and retained employees. There were many &#8220;firsts&#8221; for Lotus, including being the first company to sponsor an AIDS Walk event in the mid-80&#8242;s and refusing to do business with South Africa due to Apartheid.</blockquote><p>(Sterling-Hoffman)</p><p>Thanks to a sharp hiring process, a series of innovations in their flagship spreadsheet product, and a progressive corporate culture, Lotus dominated the software landscape of the 80s. Today, Google follows very closely Lotus&#8217; steps (Google, 2007a), and their brilliant results in the last few years seem to confirm this trend. Google applies principle 13 very strongly, allowing their employees to use 20% of their time in their own projects (Google, 2007b). This is resulting in an incredible amount of code, used internally and also released as open-source projects, such as the MacFUSE project (Google Mac Blog, 2007):</p><blockquote> Google is a fantastic company to work for. I could cite numerous reasons why. Take the concept of &#8220;20 percent time.&#8221; Google engineers are encouraged to spend 20 percent of their time pursuing projects they&#8217;re passionate about. I started one such exciting project some time back, and I&#8217;m pleased to announce that Google is releasing the fruits of this project as an open source contribution to the Macintosh community. That project is MacFUSE, a Mac OS X version of the popular FUSE (File System in User Space) mechanism, which was created for Linux and subsequently ported to FreeBSD.</blockquote><p><strong>Conclusion</strong></p><p>Deming&#8217;s principles are today, more than ever, extremely important in the software industry. With a very high rate of turnover and burnout, software companies are faced with the choice of stop considering their staff as a &#8220;resource&#8221; but rather as an &#8220;asset&#8221;. The most successful companies in the field are not only those that are able to cut costs effectively (following the fourth principle) but also those that arrive to empower their staff, increasing creativity, well-being and innovation, which ultimately leads to market leadership and economic success.</p><p><strong>References</strong></p><p>DeMarco, Tom &amp; Lister, Timothy, &#8220;Peopleware &#8211; Productive Projects and Teams, 2nd Edition&#8221;, 1999, Dorset House Publishing, ISBN 0-932633-43-9</p><p>Google, &#8220;Top 10 Reasons to Work at Google&#8221;, 2007a [Internet] <a
href="http://www.google.com/jobs/reasons.html">http://www.google.com/jobs/reasons.html</a> (Accessed April 5th, 2007)</p><p>Google, &#8220;What&#8217;s it like to work in Engineering, Operations, &amp; IT?&#8221;, 2007b, [Internet] <a
href="http://www.google.com/support/jobs/bin/static.py?page=about.html">http://www.google.com/support/jobs/bin/static.py?page=about.html</a> (Accessed April 5th, 2007)</p><p>Google Mac Blog, &#8220;Taming Mac OS X File Systems&#8221;, January 11th, 2007, [Internet] <a
href="http://googlemac.blogspot.com/2007/01/taming-mac-os-x-file-systems.html">http://googlemac.blogspot.com/2007/01/taming-mac-os-x-file-systems.html</a> (Accessed April 5th, 2007)</p><p>Lewis, W.; Veerapillai, G.; &#8220;Software Testing and Continuous Quality Improvement&#8221;, Auerbach Publications, 2005, ISBN 0-8493-2524-2</p><p>Spolsky, J.; &#8220;Top Five (Wrong) Reasons You Don&#8217;t Have Testers&#8221;, [Internet] <a
href="http://www.joelonsoftware.com/articles/fog0000000067.html">http://www.joelonsoftware.com/articles/fog0000000067.html</a> (Accessed April 5th, 2007)</p><p>Sterling-Hoffman, &#8220;Opening Doors To Higher Education&#8221;, [Internet] <a
href="http://www.sterlinghoffman.com/newsletter/articles/article140.html">http://www.sterlinghoffman.com/newsletter/articles/article140.html</a> (Accessed April 5th, 2007)</p><p>Wikipedia, &#8220;William Edward Deming&#8221;, [Internet] <a
href="http://en.wikipedia.org/wiki/W._Edwards_Deming">http://en.wikipedia.org/wiki/W._Edwards_Deming</a> (Accessed April 5th, 2007)</p> ]]></content:encoded> <wfw:commentRss>http://kosmaczewski.net/total-quality-management-and-software/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
