<?xml version='1.0' encoding='UTF-8' ?>
<rss version="2.0" xml:base="http://www.cincomsmalltalk.com/userblogs/runarj/" xmlns:admin="http://webns.net/mvcb/" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:icbm="http://postneo.com/icbm" xmlns:includedComments="http://www.laudably.com/rss2-comments" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
	<channel>
		<title>Runar Jordahl - Smallwalk</title>
		<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView</link>
		<description>Smallwalking</description>
		<webMaster>rjordahl@hotmail.com</webMaster>
		<lastBuildDate>Sat, 27 Jun 2009 19:43:46 EDT</lastBuildDate>
		<image>
			<url>/images/why-small.png</url>
			<title>Runar Jordahl - Smallwalk</title>
			<link>http://www.cincomsmalltalk.com/userblogsrunarj/blogView</link>
			<height>50</height>
			<width>81</width>
		</image>
		<admin:generatorAgent rdf:resource="/CincomSmalltalkWiki/Silt"></admin:generatorAgent>
		<admin:errorReportsTo rdf:resource="mailto:rjordahl@hotmail.com"></admin:errorReportsTo>
		<dc:language>en-us</dc:language>
		<dc:creator>Runar Jordahl</dc:creator>
		<dc:rights>Copyright 2005 Runar Jordahl</dc:rights>
		<dc:date>2009-06-27T19:43:46-04:00</dc:date>
		<icbm:latitude>59.933333</icbm:latitude>
		<icbm:longitude>10.733333</icbm:longitude>
		<item>
			<title>Misunderstanding the SOLID principles </title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Misunderstanding_the_SOLID_principles_&amp;entry=3411481153</link>
			<category>development</category>
			<pubDate>Sat, 07 Feb 2009 17:39:13 EST</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><div>

<p>In a recent podcast, <a href="http://www.joelonsoftware.com/items/2009/01/31.html">with parts transcribed here</a>, Joel Spolsky attacks the <a href="http://davesquared.blogspot.com/2009/01/introduction-to-solid-principles-of-oo.html">SOLID principles</a>. The SOLID principles give advice on how to handle dependency management in software projects. They explain how to prevent dependencies getting out of control, and how to structure code in the various layers of a project.</p>

<p>Joel's claim is that following the SOLID principles cause to much code, and that developers that follow the principles spend &ldquo;(&hellip;) enormous amount of time writing a lot of extra code.&rdquo;</p>

<p>I think it is generally accepted that dividing a project into modules helps the whole development process. The SOLID principles simply explain how to do this in practice. Joel should either state that he does not care about dependency management, or describe alternatives to the SOLID principles if he thinks they are not usable to keep dependencies under control. Keeping dependencies under control is hard, and you need to apply non-trivial techniques to accomplish it. If you think it is OK to let each <a href="http://www.laputan.org/mud/mud.html#ShearingLayers">software project be defined as a single module</a>, it is true that the SOLID principles are a waste of time.</p>

<p>Joel does not fully understand the SOLID principles. He believes that following them will lead to an explosion in the number of classes required:</p>

<blockquote>One of the SOLID principles, and I'm totally butchering this, but, one of the principles was that you shouldn't have two things in the same class that would be changed for a different reason [<a href="http://www.objectmentor.com/resources/articles/srp.pdf">PDF</a>]. Like, you don't want to have an Employee class, because it's got his name which might get changed if he gets married, and it has his salary, which might get changed if he gets a raise. Those have to be two separate classes, because they get changed under different circumstances. And you wind up with millions of tiny little classes, like the EmployeeSalary class, and it's just... (laughs) idiotic!</blockquote>

<p><strong>It seems clear that name and salary both are part of the same module. They are probably both part of the module that is commonly termed the &ldquo;business layer&rdquo;.</strong> Then, there is no need to create separate classes for these two properties. You should divide functionality after the layers/components in the problem domain, not per property, as Joel believes.</p>

<p><a href="http://www.objectmentor.com/resources/articles/srp.pdf">The linked article</a> from Object Mentor specifically mentions an example where modules for geometry and graphics are mixed in the same class. The advice is to separate the graphic system into a separate module. The new graphic module will depend on the geometry module. Then, any changes in the graphic module will not affect the geometry layer. There is no claim to make the structure Joel describes.</p>

<p>Joel reads the article in the context of C++, without reflecting over the progress that has been made in the tools he uses himself. C# and Visual Basic both support layering code into modules without making "millions of tiny little classes". The new construct (in C#) is named <a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx">"extension methods"</a>, but has been used to make modules in Smalltalk projects since the mid 1990s. Modules simply add methods to existing classes in other modules.</p>

<p><strong>When the layering is not done per property and tools support layering without making new classes, following the SOLID principles is not &hellip; &ldquo;idiotic&rdquo;. You do not end up with a lot more code. But you get more control over how the various parts of your system interact.</strong></p>

</div>
</p></div>]]></description>
			<guid isPermaLink="false">3411481153</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3411481153</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3411481153</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3411481153</wfw:comment>
		</item>
		<item>
			<title>Supporting Multiple CPU Cores in VisualWorks</title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Supporting_Multiple_CPU_Cores_in_VisualWorks&amp;entry=3394801732</link>
			<category> Smalltalk</category>
			<pubDate>Tue, 29 Jul 2008 16:28:52 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">


<p> The <a href="http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=roadmap">VisualWorks Roadmap</a> says Cincom will research how to make it &rdquo;(&#8230;) easier to leverage multi-core computer&rdquo;. Cincom will follow a <a href="http://radar.oreilly.com/2007/07/shared-nothing-parallel-progra.html">share-nothing approach for multi-core support</a> in VisualWorks. Their approach will therefore probably be to add better support for <a href="http://www.cincomsmalltalk.com/userblogs/runarj/blogView?entry=3348279474 ">running multiple images</a>. </p><p>But how should spawning new images happen? In a new OS thread per image? How many images will developers spawn, and when will it be done? Per task you need to parallelize, or during startup of the application?</p><p>As Anwar Ghuloum of Intel explains, <a href="http://blogs.intel.com/research/2008/06/unwelcome_advice.php">there exists two directions when scaling for multiple cores</a>. I think these directions can be summarized as: </p><ul xmlns="http://www.w3.org/1999/xhtml">
			<li>Parallelize the code to match the current hardware. This typically means spawning threads to match the number of cores you have at hand. You parallelize your code in <em>n</em> jobs in order to keep <em>n</em> cores busy.</li>
		<li>Parallelize the code to match the domain problem. Erlang-style programming follows this approach. This style results in process counts far larger than the number of cores on today&rsquo;s CPUs.</li></ul><p> Using <em><em>match-the-hardware</em> approach</em> means you target hardware that soon becomes dated. Anwar Ghuloum recommends programming &ldquo;(&#8230;) for as many cores as possible, even if it is more cores than are currently in shipping products.&ldquo; This means choosing the <em>match-the-domain approach</em>, which is what Cincom should try to support in VisualWorks.</p><p>A problem with using the match-the-hardware approach is that spawning many OS threads boggles the operating system. Erlang solves this nicely by using lightweight VM (Virtual Machine) threads that is executed using a pool of OS threads. The number of OS threads matches the number of cores.</p><p>VisualWorks should have support for letting multiple images share all static data. This would for example include all Smalltalk byte code. Letting each image consume several megabytes is too much. The question is whether match-the-domain approach is feasible in VisualWorks at all. Without some smart work by Cincom, starting a new image will be many times as expensive as starting a new OS thread. Developers will then need to use the match-the-hardware approach.</p><p><strong>Cincom should look at running multiple instances of a (single) image from one VM. All images should share their static data. The VM would use a pool of OS threads (possible matching the number of cores), and schedule the execution of the images using its own algorithm. Starting a new image should consume less resources than starting an OS thread.</strong> <a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29#Concurrency_and_distribution_oriented_language">Erlang consumes around 1200 bytes per process</a>. Maybe this is an impossible goal for Smalltalk. Basically, Cincom need to look at Erlang and see if there are lessons to learn.</p><p>As <a href="http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Using_the_Croquet_Hydra_VM_to_Scale_on_Multiple_CPU_Cores_&amp;entry=3392477604">I wrote earlier</a>, there already exists a solution to scale on multiple cores using Squeak. The Hydra VM basically eases start-up and communication between multiple images running in parallel. In Hydra, each image uses its own memory (no sharing of static data), and one OS thread. Cincom should aim for an approach similar to Hydra&rsquo;s, but needs to improve it. </p></div>]]></description>
			<guid isPermaLink="false">3394801732</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3394801732</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3394801732</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Supporting_Multiple_CPU_Cores_in_VisualWorks&amp;entry=3394801732</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Supporting_Multiple_CPU_Cores_in_VisualWorks&amp;entry=3394801732</includedComments:puid>
					<includedComments:author>Jochen</includedComments:author>
					<includedComments:pubDate>2008-10-09T08:59:47-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
&lt;/p&gt;&lt;/div&gt;</includedComments:content>
					<includedComments:title>Mixed approach?</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3394801732</wfw:comment>
		</item>
		<item>
			<title>New Avi Bryant Video Interview.</title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=New_Avi_Bryant_Video_Interview.&amp;entry=3394357931</link>
			<category> Smalltalk</category>
			<pubDate>Thu, 24 Jul 2008 13:12:11 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">


<p><a href="http://www.infoq.com/news/2008/07/bryant-smalltalk-dabbledb">Avi Bryant on DabbleDB, Smalltalk and Persistence.</a></p></div>]]></description>
			<guid isPermaLink="false">3394357931</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3394357931</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3394357931</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3394357931</wfw:comment>
		</item>
		<item>
			<title>Using the Croquet Hydra VM to Scale on Multiple CPU Cores </title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Using_the_Croquet_Hydra_VM_to_Scale_on_Multiple_CPU_Cores_&amp;entry=3392477604</link>
			<category> Smalltalk</category>
			<pubDate>Wed, 02 Jul 2008 18:53:24 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">


<p>After spending some time playing with Erlang, I decided it was time to test running Smalltalk on multiple cores too. </p><blockquote><a href="http://news.squeak.org/2008/02/21/qwaq-releases-hydra-multi-core-squeak-vm/">&quot;Hydra VM is a virtual machine capable of running multiple Croquet images side-by-side, therefore being able to effectively utilize multi-core CPUs.&quot;</a></blockquote><p>To test Hydra on Windows, follow these steps:</p><ul xmlns="http://www.w3.org/1999/xhtml">
			<li><a href="http://www.opencroquet.org/index.php/Downloads">Download and install Croquet 1.0 SDK</a> </li>
		<li><a href="http://www.qwaq.com/HydraVM/">Get the Hydra VM</a> (HydraVM-bin.zip)</li><li>Copy the files over the original Croquet files. They are located in the bin folder. </li><li>Start the Croquet image by running Croquet.bat</li><li>Install the Hydra support code. Details on how to get that can be found <a href="http://squeakvm.org/~sig/hydravm/devnotes.html ">here.</a> </li></ul><p> A workspace explains how to save a headless copy of the current image. After saving it you can start the headless image by evaluating:</p><p><em>HydraVM loadAndRunNewImage: fileNameOfImage. </em></p><p>To evaluate some code (asynchronously) on the started image, evaluate:</p><p> <em>HydraVM doIt: 'Transcript show: ''Doit Test''' at: indexOfStartedImage.</em></p><p>I added a load stress class before saving the headless image, started multiple copies of the image, and sent the instruction to start the load test to each image. All worker images ran the stress code in parallel.</p><p>Now, this way of using images has a lot of similarities to using processes in Erlang. You fork of another process/image in your code, keep a reference to it and send it asynchronous messages. I can easily see a lot of Erlang&rsquo;s infrastructure being added at the Smalltalk level, and you have something that works well for a lot of heavy computational problems.</p><p>Hydra does however have some aspects which make it far from as good as Erlang&rsquo;s approach to scaling on multiple cores. When running a large number of Erlang processes, the VM will not create one OS thread per Erlang process. Instead, it will create one OS thread per CPU core, and use its own (green-thread-like) scheduler to run the processes on the (relatively small number of) OS threads. Hydra, on the other hand, will use one (or two -- I am not sure) OS threads per Smalltalk image started. The disadvantage to this method is that operating systems fail to handle a large number of concurrently running OS threads. Erlang programs might start thousands of process, but this is out of question with Hydra&rsquo;s approach.</p><p>Another aspect that prevents starting many images, is the fact that each image will consume a lot of memory. We are talking about several <em>megabytes</em> while an Erlang process uses only a few hundred <em>bytes.</em> I think this might be solvable by letting images share their static parts, but that might take a lot of work at the VM level to support.</p><p>I really think the Hydra VM is a great initiative. It shows how Smalltalk can scale on multiple CPU cores, using the only sane method to parallelize a problem (non-shared memory). Even if Hydra has similarities to the Erlang approach, the coding style will be different. While Erlang emphasizes using process as a dynamic part of the program, the Hydra approach will probably be to create a few worker images when your program starts and let the main image send jobs to these images. You do not want to start and stop these images dynamically as your program executes. That will be too expensive. </p></div>]]></description>
			<guid isPermaLink="false">3392477604</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3392477604</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3392477604</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3392477604</wfw:comment>
		</item>
		<item>
			<title>Helpful Comments</title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Helpful_Comments&amp;entry=3385467832</link>
			<category>Smalltalk</category>
			<pubDate>Sat, 12 Apr 2008 15:43:52 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">





<p> Here is the comment for CompositePart&gt;&gt;initialize</p><blockquote>&quot;Initialize the receiver.&quot; </blockquote><p><em>How helpful!</em> We could auto-document all code by getting the name of the selector and appending &quot;the receiver&quot;.</p><p>If your comment does not add any useful information, drop it.</p></div>]]></description>
			<guid isPermaLink="false">3385467832</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3385467832</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3385467832</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3385467832</wfw:comment>
		</item>
		<item>
			<title>Use accessors to access private instance variables</title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Use_accessors_to_access_private_instance_variables&amp;entry=3385467148</link>
			<category>Smalltalk</category>
			<pubDate>Sat, 12 Apr 2008 15:32:28 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">


<p> I need to subclass CompositePart and change the way it stores its components. I basically want to hold a predefined set of named components and answer those when a client of the class sends it #components.</p><p>Of course CompositePart choose to access its instance variable #components directly, instead of going thought an accessor. Now, had it decided to always use the accessor I could have overridden a single method. Now I got around 15 methods I would need to change. Better look for another way to solve this problem&#8230;</p><p><em>If you want to ease white-box reuse, use accessors to access your private instance variables. </em></p></div>]]></description>
			<guid isPermaLink="false">3385467148</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3385467148</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3385467148</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Use_accessors_to_access_private_instance_variables&amp;entry=3385467148</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Use_accessors_to_access_private_instance_variables&amp;entry=3385467148</includedComments:puid>
					<includedComments:author>Claus</includedComments:author>
					<includedComments:pubDate>2008-04-16T06:05:17-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;The VSE class hierarchy below Listbox is a very good example how not to do it. It has three to four levels, and accessors and variables are mixed wildly. The method inheritance is interesting as well, for it goes like 3-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;1 for method calls in a single method. But that is actually good design as it reduces method clutter drastically. But doing the same with instance variables, i.e. having accessors for value but not for list which is actually the more important variable makes subclassing there (I created the ComboBoxEx class below ComboBox) a gigantic headache at first.&lt;/p&gt;
&lt;p&gt;So, yes, accessors are definitely necessary for reuse. Though them being absent is not as bad as having a mix.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Indeed</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3385467148</wfw:comment>
		</item>
		<item>
			<title>Presentation of the Office 2007 UI design process</title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Presentation_of_the_Office_2007_UI_design_process&amp;entry=3385387017</link>
			<category>development</category>
			<pubDate>Fri, 11 Apr 2008 17:16:57 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">


<p>Jensen Harris is one of the designers behind the new Office 2007 UI, and has a <a href="http://blogs.msdn.com/jensenh/">blog</a> which is filled with interesting details on how Microsoft ended up with this advancement in Office.</p><p>Now a <a href="http://blogs.msdn.com/jensenh/archive/2008/03/12/the-story-of-the-ribbon.aspx">video showing a presentation of the design process behind the Office 2007 UI</a> is available. The video sums up some of the previous details found in the blog posts, but does also show previously unpublished information. </p></div>]]></description>
			<guid isPermaLink="false">3385387017</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3385387017</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3385387017</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3385387017</wfw:comment>
		</item>
		<item>
			<title>Do you need "native" widgets?</title>
			<link>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?showComments=true&amp;printTitle=Do_you_need_native_widgets&amp;entry=3385386209</link>
			<category>Gui Frameworks</category>
			<pubDate>Fri, 11 Apr 2008 17:03:29 EDT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">


<p> &#8230;probably not. Here&rsquo;s a <a href="http://www.hethu.com/blog/2006/05/future-of-windows-uis.html ">post</a> that sums up the various Microsoft applications that ignores their own &ldquo;native&rdquo; widgets. </p></div>]]></description>
			<guid isPermaLink="false">3385386209</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIPBServlet?guid=3385386209</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/runarj/blogView?guid=3385386209</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Do_you_need_native_widgets&amp;entry=3385386209</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Do_you_need_native_widgets&amp;entry=3385386209</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-04-11T20:43:21-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Sure, if you have MS/Apple/Adobe's resources then you can design and build your own. And along the way you need to add accessibility, internationalization/bidi, scripting etc. And do this on each platform separately e.g. input method support.&lt;/p&gt;
&lt;p&gt;The desire to have interfaces that people immediately know how to use by virtue of their familiarity is only part of the issue, and obviously the rise of the web shows that users can largely abstract over the visual appearence of interface elements and recognise their underlying function. However, the non-obvious features of controls, such as the IM support are sufficiently complex (e.g. how to use each IM) that 'rolling your own' is IMO a very bad idea. Even worse is to build controls that ignore such requirements. That approach dramatically reduces both the comprehensiveness of the UI, and the ability to leverage other OS features such as scripting support.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>If you have the resources ...</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Do_you_need_native_widgets&amp;entry=3385386209</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Do_you_need_native_widgets&amp;entry=3385386209</includedComments:puid>
					<includedComments:author>Sean McGinty</includedComments:author>
					<includedComments:pubDate>2008-04-12T06:34:40-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Thanks to the glut of ugly apps showered on the Windows community in the last 20+ year, yes I agree that you probably don't need native widgets for Windows programs--ones that give a close enough approximation are good enough. However, on the Mac platform, users will expect a certain look and feel to your application. The menu bar must be at the top, the tool bar needs to be a certain size an contain minimal icons, etc. An application that doesn't look like a Mac application will be dismissed quickly. Call it&amp;nbsp;elitist&amp;nbsp;or snobbery if you will but that's the way it is. Even I, a fairly new Mac user and a Windows user at work can spot a migrated-from-Windows application and will quickly dismiss it as being inferior because if the developer hasn't taken the time to make it look good, then they probably haven't put in the functionality a Mac user will expect.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>What about on Mac</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Do_you_need_native_widgets&amp;entry=3385386209</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Do_you_need_native_widgets&amp;entry=3385386209</includedComments:puid>
					<includedComments:author>Antony Blakey</includedComments:author>
					<includedComments:pubDate>2008-04-12T20:18:10-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;There are OSX apps from Apple (such as Logic) that don't use the standard OSX widget set, and they don't look ugly. Furthermore, Logic even has window-local menubars, which was originally a reflection of it's cross-platform nature, but has been preserved by Apple because of the enormous complexity of the App and it's interface.&lt;/p&gt;
&lt;p&gt;Apple can do this because they have the resources to do it properly, and in the case of Logic people will learn the interface because the application dominates their interface experience (IMO that is not uncommon with audio and 3D apps at least).&lt;/p&gt;
&lt;p&gt;But I agree with your point about the tolerance of UI variance differing between OSX and Windows. IMO VW should be designed for OSX and Windows will follow, rather than the other way around.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: What about on Mac</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/runarj/servlet/CommentAPIServlet?guid=3385386209</wfw:comment>
		</item>
	</channel>
</rss>
