<?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>sellmic.com &#187; Software Development</title>
	<atom:link href="http://sellmic.com/blog/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://sellmic.com/blog</link>
	<description>Augusto's corner of art, code and fun</description>
	<lastBuildDate>Fri, 14 Aug 2009 01:07:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Classpath hell just froze over</title>
		<link>http://sellmic.com/blog/2009/06/11/classpath-hell-just-froze-over/</link>
		<comments>http://sellmic.com/blog/2009/06/11/classpath-hell-just-froze-over/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 21:09:37 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[classpath]]></category>
		<category><![CDATA[jigsaw]]></category>
		<category><![CDATA[jsr-277]]></category>
		<category><![CDATA[jsr-294]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[osgi]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/?p=276</guid>
		<description><![CDATA[
&#8220;The classpath is dead&#8220; &#8230; that&#8217;s what Mark Reinhold (Principal Engineer @ Sun) said at a general session during JavaOne 2009. It&#8217;s the type of statement that should resonate with any of us who have been victims of classpath/jar hell. Mark announced this in the context of reviewing the new language features due to be [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://sellmic.com/gallery2/main.php?g2_itemId=8046"><img class="size-full wp-image-308 aligncenter" style="border: 1px solid gray;" title="Classpath Hell" src="http://sellmic.com/blog/wp-content/uploads/2009/06/classpath_hell.jpg" alt="Classpath Hell" width="589" height="399" /></a></p>
<p><em>&#8220;<strong>The classpath is dead</strong>&#8220;</em> &#8230; that&#8217;s what <a href="http://blogs.sun.com/mr/">Mark Reinhold</a> (Principal Engineer @ Sun) said at a general session during <a href="http://developers.sun.com/learning/javaoneonline/j1online.jsp?track=embedded&amp;yr=2009">JavaOne 2009</a>. It&#8217;s the type of statement that should resonate with any of us who have been victims of <a href="http://c2.com/cgi/wiki?ClasspathHell">classpath</a>/<a href="http://en.wikipedia.org/wiki/JAR_hell#JAR_hell">jar hell</a>. Mark announced this in the context of reviewing the new language features due to be released in <a href="https://jdk7.dev.java.net/">JDK 7</a> (ETA 2010) or more specifically the new Java module system codenamed <a href="http://openjdk.java.net/projects/jigsaw/">Jigsaw</a>.</p>
<h3>Module Systems and Jigsaw</h3>
<p>Jigsaw is a low level implementation of a module system, which also includes some language and VM changes that are specified in <a href="http://jcp.org/en/jsr/detail?id=294">JSR 294</a> (note that Jigsaw is being done outside of any JSR and is not a reference implementation of 294). Another implementation of a module system most Java developers are likely more familiar with is <a href="http://www.osgi.org/Main/HomePage">OSGi</a>. But what is a module system and why do we need one?</p>
<div id="attachment_322" class="wp-caption alignleft" style="width: 310px"><img class="size-full wp-image-322" title="Module dependencies" src="http://sellmic.com/blog/wp-content/uploads/2009/06/module_depencies.jpg" alt="Depencies on multiple versions (of module B in this example)" width="300" height="207" /><p class="wp-caption-text">Depencies on multiple versions (of module B in this example)</p></div>
<p>A module system enables <a href="http://en.wikipedia.org/wiki/Module_system">modular programming</a>, it allows developers to separate code into clearly defined modules that can specify what other modules they depend on and their versions, can be internally modified without breaking other modules that depend on it and can hide its own internals from external modules.</p>
<p>A module system can solve the classpath/jar hell problem by leveraging the previously mentioned features in order to allow an application to use the right versions of the set of libraries it requires. In the diagram shown here, we have an APP module that depends on the A, B and C modules. But module C also depends on B, however this dependency is to a different version of B than the one APP needs. A useful module system would then allow us to have 2 versions of the B module, with the compatible version and implementation visible to the appropriate modules (in this case APP and C).</p>
<p>Also, by clearly expressing module dependencies, we no longer have to look at random lib folders or hidden documentation when using a 3rd party library, just so we can guess what the corresponding jar files are needed to run it. With the system implemented by Jigsaw, we can simply introspect the module and let it tell us what those dependencies are. It takes the guesswork and the dark magic completely out of the equation.</p>
<p>But back to Mark&#8217;s presentation at the general session. The main reasons to introduce Jigsaw into JDK 7 are the following:</p>
<ul>
<li>Eliminate classpath complexity (classpath/jar hell problem already discussed).</li>
<li>Increase performance. The VM download size can be made smaller, and startup time should improve because for small programs (say HelloWorld) unnecessary classes don&#8217;t have to be loaded at all. Mark showed how he could run HelloWorld by only using 2 modules listed by the new <strong>jmod</strong> command; <strong>jdk.base@7-ea</strong> and <strong>jdk.boot@7-ea</strong>.</li>
<li>Enable native integration for installing modules.</li>
</ul>
<p><span id="more-276"></span>Mark demonstrated that last point by showing a demo of him installing various JDK packages via the Synaptic Package Manager.</p>
<div id="attachment_327" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-327" title="Synaptic Package Manager" src="http://sellmic.com/blog/wp-content/uploads/2009/06/synaptic_package_manager.jpg" alt="Installing Java modules via Synaptic Package Manager" width="450" height="258" /><p class="wp-caption-text">Installing Java modules via Synaptic Package Manager</p></div>
<h3>Alex Buckley&#8217;s presentation</h3>
<p>I attended <a href="http://www.doc.ic.ac.uk/~abuckley/">Alex Buckley</a>&#8217;s (Computational Theologist @ Sun) session on <a href="http://developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-4954.pdf">&#8220;Modularity in the Java Programming Language: JSR 294 and beyond&#8221;</a>, which had a lot more details on the specific language changes to be implemented in order to support this new feature.</p>
<p>The most noticeable aspect of this is the introduction of <em><strong>module-info.java</strong></em>. This file goes at the top of your module filesystem, and is the class that specifies at compile and runtime the definition of the module. Here is an example, coming from Alex&#8217;s slides;</p>
<pre name="code" class="java">module org.planetjdk.aggregator {
          system jigsaw;
          requires module jdom;
          requires module tagsoup;
          requires module rome;
          requires module rome-fetcher;
          requires module joda-time;
          requires module java-xml;
          requires module java-base;
          class org.planetjdk.aggregator.Main;
 }</pre>
<p>Our module is &#8220;<em>org.planetjdk.aggregator</em>&#8221; and uses the jigsaw module system. Depenencies are denoted by using <em>requires </em>and providing the module name, Alex calls this part of the module metadata the &#8220;<em>logical classpath</em>&#8221; of the module. You can also define the main class for the module which in this case is &#8220;<em>org.planetjdk.aggregator.Main</em>&#8220;.</p>
<p>You&#8217;ll also notice that the module name is quite long &#8220;org.planetjdk.aggregator&#8221;, while the list of required modules uses shorter names. This can be done by supplying a module alias. In the previous example, we could have added the line;</p>
<pre name="code" class="java">provides module aggregator;</pre>
<p>This would then allow other modules to say &#8220;<em>requires module aggregator</em>&#8221; and successfully link to this module by this shorter form of the name.</p>
<p>Also, you can specify your module version and version dependencies in <em>module-info.java</em>. This updated example illustrates this mechanism;</p>
<pre name="code" class="java">module org.planetjdk.aggregator @ 1.0 {
          system jigsaw;
          requires module jdom @ 1.*;
          requires module tagsoup @ 1.2.*;
          requires module rome @ =1.0;
          requires module rome-fetcher @ =1.0;
          requires module joda-time @ [1.6,2.0);
          requires module java-xml @ 7.*;
          requires module java-base @ 7.*;
          class org.planetjdk.aggregator.Main;
}</pre>
<p>Note also that you can only have one <em>module-info.java</em> per module, in only one location, so if you have a big source tree and you want to create multiple modules from it you will have to either separate your source into different trees or use some creative scripting to accomplish this at build time. I believe Mark mentioned they had to use some scripted solution for the jdk base as I believe it's one tree.</p>
<p>The rest of Alex's presentation focused on how to locate modules at compile and runtime by using the "<em>modulepath</em>", the use of the new module keyword and how it affects accessibility, and he gives a glimpse as to how they plan to support other module systems (for example, the version notation can be different when using other module systems).</p>
<p>This is all better explained in Alex's slides, so I encourage everyone to take a look at his presentation (link provided above).</p>
<h3>The Modular Java Platform: Q&amp;A</h3>
<div id="attachment_15" class="wp-caption aligncenter" style="width: 460px"><img class="size-full wp-image-15" title="round table" src="http://sellmic.com/blog/wp-content/uploads/2007/01/jury_duty.jpg" alt="Jury" width="450" height="161" /><p class="wp-caption-text">There were rumors in the meeting that the clown is a secret member of the Java Posse</p></div>
<p>Wednesday night, I attended a BOF like meeting hosted by Mark and Alex setup in order for the community to openly ask and voice any concerns over the work presented by them on modular Java. The setup was sort of a round table configuration (without the round table) in a very informal setting (btw it was hard for participants in the back to listen well, hopefully microphones are used next time). The first question was kind of funny, somebody asked Alex what a "<em><a href="http://bracha.org/Site/Theology.html">Computational Theologist</a></em>" does (the title makes it sound like the equivalent of a Thomas Aquinas for the nerd world).</p>
<p>After that, it seemed some people were very concerned about how to deploy modules, patch jars and other deployment issues. My impression was that a lot of people had a problem with the native installation part of the proposal. Mark answered that Java developers have gotten used to being in our own little jar world, separate from the OS integration issues of module and library management and that it was time for Java to integrate more with these systems. He has a point, do we really have to deploy log4j jars with all our products over and over instead of simply having a log4j installed in the system that all modules can refer to?</p>
<p>However, installation with native package systems is a big change. And it is also unclear what that is going to look like in Windows. It seemed like the Windows part of the equation has not been finalized, would Java 7 include some type of Java specific module registry or would it leverage something like .NET's <a href="http://en.wikipedia.org/wiki/Global_Assembly_Cache">Global Assembly Cache</a>?</p>
<p>Somebody bought up the point that this new system was imposing more work on open source projects. That is, today you want to release your library as a jar, you know it's going to work everywhere. With Jigsaw, projects may have to deliver a large set of native module packages depending on all the platforms they want to deploy to. Many suggested to Mark and Alex that a cross platform package format was needed, but Mark acknowledged that Sun is not really working on that and they're just worrying mainly about specifying the module file structure and leaving the rest to the native package systems.</p>
<p>I noticed a few members from the OSGi community in attendance, I recognized <a href="http://www.aqute.biz/Main/HomePage">Peter Kriens</a> (member of the OSGi Alliance), <a href="http://www.osgicongress.com/speakers_main.asp#33">Richard S. Hall</a> (From Apache Felix, works for Sun in the Glassfish team) and <a href="http://blog.bjhargrave.com/">BJ Hargrave</a> (CTO of the OSGi Alliance, committer on Eclipse Equinox and IBM employee). Peter and Richard are both members of the expert group for JSR 294, so I was a bit surprised they weren't at all in "harmony" with Mark and Alex and the work they've done with Jigsaw. See, last time I saw discussions on this topic, <a href="http://jcp.org/en/jsr/detail?id=277">JSR 277</a> was still active (it is on hold for now) and I was under the impression that Sun and OSGi had reached some type of "gentleman's agreement". That doesn't seem to be the case at all.</p>
<p>OSGi is a very mature technology and has more features than Jigsaw. However OSGi doesn't address the issue of native package installation, and you could argue that it would not be suitable to solve the issue of modularizing the JDK itself. I think on that last point, many people don't mind Jigsaw even on the OSGi side, the arguments come when you say Jigsaw could be used as an application level module system. Additionally OSGi still has some key features that are missing in Jigsaw; it allows more dynamic loading of modules (useful for plugins) and is backwards compatible (Jigsaw will only be supported from Java 7 and up).</p>
<p>Having said that, one thing I like more about Jigsaw is how it defines dependencies is the <strong><em>module-info.java</em></strong> file. It is a much better syntax than the error prone use of manifest files used in OSGi, where an extra space can break the whole thing for you. Adding keywords for module accessibility is also a very nice thing, and it seems the goal is to also let a modular system like OSGi take advantage of these features. Now how can these both systems inter-operate between each other in a single VM? I have no idea how that works ... yet.</p>
<p>In the end, the Q&amp;A showed that there is a lot of controversy and confusion over this new feature. There was also a noticeable lack of questions during the meeting, with a few of the same people asking all the questions. I got the impression that the need and functionality of a module system in Java is not generally fully understood, so to me that means a lot more work needs to be done to explain just what is going on and why there is so much effort going into this area.</p>
<p>Some key questions I'd like to see clarified:</p>
<ul>
<li>A more technical and detailed explanation of why Jigsaw was chosen over OSGi.</li>
<li>Will the JDK provide tools for wrapping modules in native packages?</li>
<li>Is a cross platform package system completely out of the question?</li>
<li>How would multiple modules systems work together in the same VM/application instance?</li>
<li>What happens when an applet or javafx application requires core JDK modules that are not present in the current installation?</li>
<li>Native library module integration issues (I sort of asked this in the Q&amp;A). Where are native packages placed, and what happens when multiple modules include the same native libraries (say 2 modules have the same DLL embedded in them)?</li>
</ul>
<h3>This doesn't affect me, why should I care?</h3>
<p>These changes will affect everybody, at the very least under the hood your core Java packages will be loaded in a more modularized fashion. For people who would like to run Java in other devices, you will notice that you have better ways to split up your Java distribution to only the parts that you need.</p>
<p>However, if you are interested in scaling your code the right way and modularizing it, you should start becoming familiar with what is going on in this space. For your applications, you'll still have the choice of using existing modular systems like OSGi or using the new facilities provided by Java 7. In the future, we should expect more details to come out as to how you can combine both (Jigsaw and OSGi). Others might prefer not to depend on an external Java project like OSGi and leverage the core support that will be provided for modules.</p>
<p>On the other hand, some people criticize that his is a repeat of the <em>java.util.logging</em> fiasco and say they can mostly ignore these changes. The jury is still out, but this is a very fundamental change in the language and platform and a very different scenario than choosing what logging package to include in the core JDK.</p>
<p>Oh and you might soon see new annoying interview or exam code questions trying to trip you up with gems like this one (from Alex's slides and <a href="http://blogs.sun.com/abuckley/en_US/entry/a_wrinkle_with_module">this blog entry</a>):</p>
<pre name="code" class="java">package module;
// BTW you should NEVER write code like this!!!
module class module {
        module module module = new
            module();
        module module() {}
}</pre>
<p>Anyways, sorry for the longish blog post but hopefully this sheds some light into some of the discussions about this topic that took place at JavaOne. If you are interested in getting more in depth details about this topic, please take a look at some of the following links;</p>
<ul> <a href="http://blogs.sun.com/theplanetarium/entry/project_jigsaw_modularizing_jdk_7">Java SE: Project Jigsaw: Modularizing JDK 7</a><br />
<a href="http://blogs.sun.com/mr/entry/jigsaw">Project Jigsaw</a> (Mark's blog)<br />
<a href="http://blogs.sun.com/mr/entry/modular_java_platform">The Modular Java Platform</a> (Mark's blog)<br />
<a href="http://blogs.sun.com/mr/entry/massive_monolithic_jdk">The massive, monolithic JDK</a> (Mark's blog)<br />
<a href="http://blogs.sun.com/mr/entry/packaging_java_code">Packaging Java code</a> (Mark's blog)<br />
<a href="http://openjdk.java.net/projects/jigsaw/doc/language.html">Project Jigsaw: Language changes for Modules</a><br />
<a href="http://www.osgi.org/blog/2008/12/project-jigsaw.html">Project Jigsaw</a> (Peter Kriens, his version of the "saga of Java modularity)<br />
<a href="http://www.osgi.org/blog/2008_12_01_archive.html">Project Jigsaw #2</a> (Peter Kriens, some criticisms of the proposed system)<br />
<a href="http://www.osgi.org/blog/2009/03/project-jigsaw-3.html">Project Jigsaw #3</a> (Peter Kriens, Jigsaw != JSR 294)<br />
<a href="http://www.infoq.com/news/2008/12/jigsaw-jsr277-dead">Jigsaw - the death knell of JSR277?</a><br />
<a href="http://atsatt.blogspot.com/2009/04/jigsaw-vs-osgi.html">Jigsaw vs OSGi?</a><br />
<a href="http://blogs.sun.com/abuckley/en_US/entry/a_wrinkle_with_module">A wrinkle with 'module'</a> (Alex's blog)<br />
<a href="http://blogs.sun.com/abuckley/resource/Devoxx2008-ModularityInJava.pdf">Modularity in Java</a> (Alex's presentation at DEVOXX 2008; covers module friendship, "virtual modules", multi-module packages, type observability and other topics not covered in the JavaOne slides I linked to in this article)</ul>
<p><strong>Update</strong>. Some additional links that have come to my attention after publishing this blog post;</p>
<ul>
<a href="http://robilad.livejournal.com/51325.html">Jigsaw Feedback Roundup</a> (Dalibor Topic)<br />
<a href="http://javaposse.com/index.php?post_id=492239">Java Posse #259 - Jigsaw and JSR 294 Interview</a> (Java Posse podcast interview with Mark Reinhold and Alex Buckley)
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2009/06/11/classpath-hell-just-froze-over/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Live blogging from CommunityOne</title>
		<link>http://sellmic.com/blog/2009/06/01/live-blogging-from-communityone/</link>
		<comments>http://sellmic.com/blog/2009/06/01/live-blogging-from-communityone/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 17:04:41 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[communityone]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/?p=229</guid>
		<description><![CDATA[
JavaOne officially starts tomorrow but today Sun has kicked off CommunityOne. Which is a more open source focused and free conference that precedes the bigger event.
The main theme this year is cloud computing. The presentation today has been about showing several vendor solutions in the areas of virtualization and large scale application deployment that is [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-234" title="communityone" src="http://sellmic.com/blog/wp-content/uploads/2009/06/communityone.jpg" alt="communityone" width="450" height="315" /></p>
<p>JavaOne officially starts tomorrow but today Sun has kicked off CommunityOne. Which is a more open source focused and free conference that precedes the bigger event.</p>
<p>The main theme this year is cloud computing. The presentation today has been about showing several vendor solutions in the areas of virtualization and large scale application deployment that is very easy to use (and graphical). To be completely honest, I think &#8220;cloud computing&#8221; is a big buzzword approaching marketroid levels, but there is some interesting technology here. I&#8217;ll be attending a few cloud computing sessions to see if I become one of the <strong>converted</strong>.</p>
<p><img class="aligncenter size-full wp-image-230" title="communityone_cloud" src="http://sellmic.com/blog/wp-content/uploads/2009/06/communityone_cloud.jpg" alt="communityone_cloud" width="450" height="269" /></p>
<p>Currently, we&#8217;re listening to some of the folks from OpenSolaris and JavaFX in a setup that seems like a nerd version of David Letterman from an alternate reality.</p>
<p>BTW we got a small announcement that JavaFX is now officially released for OpenSolaris. Although I&#8217;m not sure there&#8217;s a large community of OpenSolaris users looking forward to that <img src='http://sellmic.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2009/06/01/live-blogging-from-communityone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My JavaFX presentation at PanamaJUG 2007 (JavaFX en Español)</title>
		<link>http://sellmic.com/blog/2008/05/18/my-javafx-presentation-at-panamajug-2007-javafx-en-espanol/</link>
		<comments>http://sellmic.com/blog/2008/05/18/my-javafx-presentation-at-panamajug-2007-javafx-en-espanol/#comments</comments>
		<pubDate>Sun, 18 May 2008 19:12:30 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2008/05/18/my-javafx-presentation-at-panamajug-2007-javafx-en-espanol/</guid>
		<description><![CDATA[Last December I did a presentation about JavaFX in Spanish for the Panama Java User&#8217;s Group (JUG). This event took place in the city of Chitre, and was a lot of fun to participate in, specially since it gave me a chance to visit my native country. The presentation aimed to serve as an introduction [...]]]></description>
			<content:encoded><![CDATA[<p><center><iframe src="http://docs.google.com/EmbedSlideshow?docid=avn83j2j7zf_10dzgx4ngh" frameborder="0" height="342" width="410"></iframe></center>Last December I did a presentation about JavaFX in Spanish for the Panama Java User&#8217;s Group (JUG). This event took place in the city of Chitre, and was a lot of fun to participate in, specially since it gave me a chance to visit my native country. The presentation aimed to serve as an introduction to JavaFX, providing an overview of the main features of the language. I showed some simple demos from Sun, and a few I created myself. At the end, we went over my <a href="http://sellmic.com/blog/2007/05/22/javafx-clock-update-now-with-transparency/">JavaFX clock</a> implementation and discussed a bit what place JFX occupies in the RIA technology space. The slides are featured at the top of this post, and are in Spanish of course.  Thanks to <a href="http://avbravo.blogspot.com/">Aristides Villareal</a>, and the members of the Panama JUG for inviting me to this wonderful event! I was lucky enough to bring along one of my daughters, Sofia, and she enjoyed the trip very much.</p>
<p>I have to say, the most difficult part of preparing this presentation was trying to figure out the Spanish version of common programming words and concepts. Part of the problem is that when I was learning how to program in Panama (when I was around 10-12 years old) all of my resources; magazines, books, etc where all in English. So I never knew that array is &#8220;arreglo&#8221;, that a developer is called a &#8220;desarrollador&#8221;, or what the corresponding word for loop is. It would be really nice if there was some type of resource out there with a table with all these terms, and maybe other languages. One challenge is that it seems not all of these words are &#8220;settled&#8221;. I noticed some people were still pretty comfortable with the English versions, while others used the Spanish ones exclusively. Also, there are a lot of emerging technologies and concepts in Computer Science which I think still don&#8217;t have Spanish translations. Pretty much a more difficult challenge than I expected.</p>
<p><img src="http://sellmic.com/blog/wp-content/uploads/2008/05/javax-panama-jug.jpg" alt="javax-panama-jug.jpg" /></p>
<p>One more thing, JavaFX has changed a lot in the last year. When I did this presentation, I didn&#8217;t cover how much effort has gone into optimizing this technology or the new changes to the animation API (like the deprecated dur keyword). There is a preview JFX SDK coming out next month, and you can sign up for it at<a href="http://javafx.com"> javafx.com</a>. I didn&#8217;t attend JavaOne this year, so I don&#8217;t know all the details, but I&#8217;m hoping the SDK comes with some of the tooling that Sun has promised. Designer level tools are key to this technology&#8217;s success. I hope to make a blog post with a quick review of the SDK once it comes out.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2008/05/18/my-javafx-presentation-at-panamajug-2007-javafx-en-espanol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The maximum number of methods in a class</title>
		<link>http://sellmic.com/blog/2008/02/28/the-maximum-number-of-methods-in-a-class/</link>
		<comments>http://sellmic.com/blog/2008/02/28/the-maximum-number-of-methods-in-a-class/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 03:53:56 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2008/02/28/the-maximum-number-of-methods-in-a-class/</guid>
		<description><![CDATA[
 The other day I saw a Java interface with well over 300 methods (with no inheritance). It&#8217;s one of these interfaces that is a single point of entry into a system, and I&#8217;m partly to blame. Really didn&#8217;t think about how the API should scale, and now that there&#8217;s years and years of development [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center" align="center"><img src="http://sellmic.com/blog/wp-content/uploads/2008/02/penguins.jpg" alt="penguins.jpg" /></p>
<p> The other day I saw a Java interface with well over 300 methods (with no inheritance). It&#8217;s one of these interfaces that is a single point of entry into a system, and I&#8217;m partly to blame. Really didn&#8217;t think about how the API should scale, and now that there&#8217;s years and years of development depending on this interface, refactoring this single interface is not a trivial class (it would have to be broken up at least in a dozen smaller interfaces).</p>
<p>That got me wondering, what could be the maximum number of methods in a class. A quick google search yielded a forum discussion with the answer as defined in the <a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html">JVM spec (2nd edition)</a>;</p>
<blockquote>
<blockquote><p>The number of methods that may be declared by a class or interface is limited to 65535 by the size of the <code>methods_count</code> item of the <code>ClassFile</code> structure <a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#74353">(§4.1)</a>. Note that the value of the <code>methods_count</code> item of the <code>ClassFile</code> structure does not include methods that are inherited from superclasses or superinterfaces.</p></blockquote>
</blockquote>
<p>So even if you have 300 methods you are still very far away from ever hitting the limit. I wonder if there are any open source projects out there with classes with this number of methods. If you count inheritance, some of the AWT/Swing classes do have a large amount of methods, but there have to be more examples of this.</p>
<p>Anyways, my little piece of advise is to be forward thinking when designing APIs and make sure the API can scale as more functionality is added. It is always a good idea to think very modular and to group functionality in classes and packages that make sense.</p>
<p>Obviously, when others depend on your code, it never hurts to practice good <a href="http://www.ddj.com/windows/184405654">design usability</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2008/02/28/the-maximum-number-of-methods-in-a-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GenderRenderer, GenderEditor and unfortunate class names</title>
		<link>http://sellmic.com/blog/2008/02/15/genderrenderer-gendereditor-and-unfortunate-class-names/</link>
		<comments>http://sellmic.com/blog/2008/02/15/genderrenderer-gendereditor-and-unfortunate-class-names/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 14:19:19 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2008/02/15/genderrenderer-gendereditor-and-unfortunate-class-names/</guid>
		<description><![CDATA[
&#160;
So the other day I&#8217;m looking at somebody&#8217;s code and notice a class name that caught my attention; &#8220;GenderEditor&#8221;. I think it was just your normal JTable class to show a &#8220;gender&#8221; property, but I thought it was kind of funny because the class name implied you could use this program to switch a user&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center" align="center"><img src="http://sellmic.com/blog/wp-content/uploads/2008/02/whoops2.jpg" alt="whoops2.jpg" /></p>
<p style="text-align: center" align="center">&nbsp;</p>
<p align="left">So the other day I&#8217;m looking at somebody&#8217;s code and notice a class name that caught my attention; &#8220;GenderEditor&#8221;. I think it was just your normal JTable class to show a &#8220;gender&#8221; property, but I thought it was kind of funny because the class name implied you could use this program to switch a user&#8217;s gender very easily (with no surgery!).</p>
<p align="left"> I talked to the developer and we had a good laugh about it. Then I noticed in the code a class called &#8220;GenderRenderer&#8221;. Well, you don&#8217;t have to use a lot of imagination to figure out how this class could be potentially a problem (what should we use to represent gender &#8230; hum).</p>
<p align="left"> There&#8217;s nothing wrong with these class names of course, but it made me think about how hard it is sometimes to come up with good names for our classes and how easy it is to come up with some awkward and sometimes embarrassing names.</p>
<p> I can&#8217;t remember any similar to GenderEditor, but I do know somebody that got carried away with naming everything *Broker. UserControllerBroker, GroupManagerBroker, SaveTheDolphinsBroker. If that wasn&#8217;t enough, then actual &#8220;broker&#8221; implementations just appened &#8220;Impl&#8221; at the end of the name, making things even more convoluted; UserControlerBrokerImpl, GroupManagerBrokerImpl, etc. I guess good descriptive names are nice, but you can get carried away trying to define what the object does in the name. We do have comment blocks in most languages, so sometimes it&#8217;s best to just say what the thing is supposed to do there.</p>
<p>I&#8217;m also not a big fan of putting a big &#8220;I&#8221; in front of interfaces. IUser, IConsumer, ICreditCard, this convention is used a lot by Microsoft and IBM. You look at the Eclipse code and it is littered with it. I see the point though, sometimes you want to make clear people separate interface from implementation, but we do have IDEs that let us know quickly and visually what is a class and what is merely an interface.</p>
<p>The again, having some basic naming conventions is often better than none at all. As long as you apply a bit of common sense and make sure you read the names you are using out loud, you won&#8217;t end up with weird names or potentially offensive sounding classes.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2008/02/15/genderrenderer-gendereditor-and-unfortunate-class-names/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New Java logo, Ruby style! (a few thoughts on programming language marketing)</title>
		<link>http://sellmic.com/blog/2007/10/30/new-java-logo-ruby-style-a-few-thoughts-on-programming-language-marketing/</link>
		<comments>http://sellmic.com/blog/2007/10/30/new-java-logo-ruby-style-a-few-thoughts-on-programming-language-marketing/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 01:48:04 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2007/10/30/new-java-logo-ruby-style-a-few-thoughts-on-programming-language-marketing/</guid>
		<description><![CDATA[
 No, I&#8217;m not proposing my brand new Java logo replace the latest one from Sun. As a matter of fact it&#8217;s hardly a good logo, and seems more like a book cover, but for some reason a very similar logo (the one mine is based on) was selected as the official one for Ruby.

People [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center" align="left"><img src="http://sellmic.com/blog/wp-content/uploads/2007/10/java_logo_ruby_style.jpg" alt="Java on Ruby!" /></p>
<p align="left"> No, I&#8217;m not proposing my brand new Java logo replace <a href="http://en.wikipedia.org/wiki/Image:Java_Logo.svg">the latest one from Sun</a>. As a matter of fact it&#8217;s hardly a good logo, and seems more like a book cover, but for some reason a very similar logo (the one mine is based on) was <a href="http://www.rubyinside.com/so-heres-the-new-ruby-logo-639.html">selected as the official one for Ruby.</a></p>
<p class="caption" align="center"><img src="http://sellmic.com/blog/wp-content/uploads/2007/10/ruby-logo.jpg" alt="Ruby logo" /></p>
<p class="caption" align="left">People are being <a href="http://www.rubyinside.com/so-heres-the-new-ruby-logo-639.html#comment-29432">a bit harsh</a> on the thread from that last link, but yeah the logo they selected is not that great. Maybe it would make an OK book cover, but you would expect something a bit simpler and more visually appealing. Also was it really necessary to put &#8220;programming language&#8221; as part of the logo? That just looks bizarre.</p>
<p class="caption" align="left"><span id="more-113"></span>But the reaction is interesting. Judging on the responses of that and other threads, developers seem to be very passionate about programming language logos. More specifically, it seems people get excited about how their favorite language gets marketed!</p>
<p class="caption" align="left">Which brings me to my next topic; <em>programming language marketing</em>.</p>
<p class="caption" align="left">I don&#8217;t remember much marketing activity around Ada, Pascal or even C. When Java came out, you could tell things were a little bit different. The language (or platform if you want to see it that way) had a logo, a <a href="http://en.wikipedia.org/wiki/Write_once,_run_anywhere">slogan</a> and <a href="http://en.wikipedia.org/wiki/Java_mascot">even a mascot</a>! Heck, I can even remember a Duke comic book I got at a conference once.</p>
<p class="caption" align="left">I&#8217;m noticing a similar thing with Ruby. The interesting thing is that it seems this is much more of a grass roots effort. Were the Java marketing was part of a corporate strategy, Ruby&#8217;s marketing is not orchestrated by an army of marketroids but by a good number of bloggers, dedicated advocacy sites, online books, Flash video demos and even parody YouTube videos.</p>
<p>However there&#8217;s always the danger of over marketing and over hyping technologies (something many accused Sun of doing with Java), which can result in turning people off. Often the marketing gets <a href="http://www.poignantguide.net/ruby/">annoying</a>,  <a href="http://railsenvy.com/">a bit arrogant</a>, or <a href="http://www.jroller.com/obie/entry/top_10_reasons_why_java">extremely obnoxious</a>. But to be fair, <a href="http://www.sun.com/aboutsun/executives/mcnealy/bio.jsp">Scott McNealy</a> would often go over board with his advocacy too, so this is not unique to Ruby. Speaking of annoying, Adobe thank you for not showing the <a href="http://www.weiqigao.com/blog/2007/02/17/hes_been_thinking_in_java_now_hes_thinking_in_flex.html">Flex Bruce Eckel ads</a> on <em>every</em> Java site all the time anymore.</p>
<p class="caption" align="left">It&#8217;ll be interesting to see what the Ruby adoption is in a few more years, right now it&#8217;s a very vocal yet relatively small community. When we talk about the next great computer languages, hopefully we&#8217;ll all be deciding based on technical merits, but it seems that today if you want a language to be successful you just can&#8217;t ignore the marketing side of things anymore.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2007/10/30/new-java-logo-ruby-style-a-few-thoughts-on-programming-language-marketing/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Beware of rotten apples</title>
		<link>http://sellmic.com/blog/2007/10/28/beware-of-rotten-apples/</link>
		<comments>http://sellmic.com/blog/2007/10/28/beware-of-rotten-apples/#comments</comments>
		<pubDate>Mon, 29 Oct 2007 00:51:41 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2007/10/28/beware-of-rotten-apples/</guid>
		<description><![CDATA[
 I like Apple, it&#8217;s a highly innovative company with great products. I passion for programming was developed as a kid when I had an Apple //c. I own a couple of iPods and wouldn&#8217;t mind having one of those cool MacBooks. A few years ago, and at this year&#8217;s JavaOne, I noticed lots of [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center" align="center"><img src="http://sellmic.com/blog/wp-content/uploads/2007/10/rotten_apple.jpg" alt="Rotten development environment" /></p>
<p align="left"> I like <a href="http://www.apple.com/">Apple</a>, it&#8217;s a highly innovative company with great products. I passion for programming was developed as a kid when I had an <a href="http://applemuseum.bott.org/sections/computers/IIc.html">Apple //c.</a> I own a couple of iPods and wouldn&#8217;t mind having one of those cool MacBooks. A few years ago, and at this year&#8217;s JavaOne, I noticed lots of developers with cool looking Apple computers. They definitely look a lot more interesting than the standard corporate Dell stuff. But one thing got my attention at this last JavaOne, I noticed a lot of Sun engineers with Apple laptops, and doing demos on those machines.</p>
<p align="left">Nothing wrong with that, I didn&#8217;t expect them to be hauling some of those <a href="http://www.tadpolecomputer.com/">Sparc/Solaris laptops</a>. However, Java 6 had already been out and there was a lot of talk of future features (Java 7 and beyond) related to the language and I found it odd that it seemed like a lot of Sun engineers would do their work on an Apple machine with versions of Java that are not current. I expect Microsoft engineers to have no problem running the latest and greatest versions of the .net framework, but tosee some of the Java desktop guys running on a machine that didn&#8217;t have the latest desktop features, didn&#8217;t seem to me like the best idea.</p>
<p align="left">Due to Leopard and its <a href="http://javablasphemy.blogspot.com/2007/10/no-java-6-in-leopard-retail.html">lack of support for Java 6</a>, it seems many of these same engineers are changing their minds, <a href="http://blogs.sun.com/jag/entry/solaris_and_os_x">like James Gosling</a>.</p>
<p align="left"><span id="more-108"></span>Many people have expressed that the OS X is a great platform for developing Java, but it has always been clear to me that this can&#8217;t be the case, specially when you consider that:</p>
<ol>
<li>Java releases are tied to OS X version upgrades</li>
<li>Apple doesn&#8217;t provide a clear road map for their Java support</li>
<li>The iPhone; no Java ME support</li>
</ol>
<p>1. Tying Java runtime versions to an OS release is a bad idea. It only makes sense if the features of that runtime really demand new support from the operating system, but this is the standard operating procedure for OS X and it makes no sense.  I can&#8217;t imagine having to upgrade my whole OS just to use the latest versions of something like a Java VM. That people were putting up with this, is pretty amazing.</p>
<p>2. Apple&#8217;s been &#8220;working&#8221; on a Java 6 SDK for quite a bit, with beta releases but no clear date as to when it was going to get released. It&#8217;s pretty painful to read blogs from other developers speculating when their Java version will be released in what version of OS X. Wouldn&#8217;t it be better for Apple to just say when if at all they are releasing these things. The lack of communication on this front is truly confusing. But again, why developers would put up with this is pretty baffling to me. I wouldn&#8217;t want to setup a development environment where it&#8217;s so uncertain what versions of a compiler and a runtime I will have available at least in the near future!</p>
<p>3. There is no Java ME support, even though there are so many phones out there and applications that support this environment. What a disappointment it was to find out the iPhone wouldn&#8217;t support this Java runtime. For general 3rd party develpoment, up until not too long ago there wasn&#8217;t even going to be an SDK for this platform available to 3rd parties, that has changed but this shouldn&#8217;t even have been a question when the iPhone was first announced.</p>
<p>The pattern is clear, Apple can release some fantastic products, but very often the options the create for developers are pretty rotten. Ironically, the platform that is often accused of being very closed and monopolistic is much more open in this regard, and it should be clear that if you want a better Java development environment you should likely drop Apple and get yourself a Windows machine. That or wait for some open source project to do the work that Apple seems to have been doing but doesn&#8217;t seem to want to support.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2007/10/28/beware-of-rotten-apples/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Bad dialog practices &#8230;</title>
		<link>http://sellmic.com/blog/2007/05/03/bad-dialog-practices/</link>
		<comments>http://sellmic.com/blog/2007/05/03/bad-dialog-practices/#comments</comments>
		<pubDate>Fri, 04 May 2007 04:48:19 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2007/05/03/bad-dialog-practices/</guid>
		<description><![CDATA[
&#160;
When I launch Netbeans 5.5, it seems I&#8217;ve installed some version control module that produces these two dialogs whenever I start the IDE. I still can&#8217;t figure out what the program wants me to do here. First of all, it has to be a bug and not a feature that it&#8217;s popping up 2 modal [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center" align="center"><img src="http://sellmic.com/blog/wp-content/uploads/2007/05/nb-error-dialog-cvs-vcs.png" alt="nb-error-dialog-cvs-vcs.png" /></p>
<p style="text-align: center" align="center">&nbsp;</p>
<p align="left">When I launch Netbeans 5.5, it seems I&#8217;ve installed some version control module that produces these two dialogs whenever I start the IDE. I still can&#8217;t figure out what the program wants me to do here. First of all, it has to be a bug and not a feature that it&#8217;s popping up 2 modal dialogs at the same time. Very annoying. However, what really confuses me is that one dialog is for &#8220;<a href="http://www.nongnu.org/cvs/">CVS</a>&#8221; and the other for &#8220;<a href="http://vcsgeneric.netbeans.org/profiles/index.html">VCS</a>&#8220;, which adds to the confusion because just by looking at the text you really get the terms confused. (I&#8217;m guessing I get these because they are 2 different but related Netbeans Modules/Plugins)</p>
<p align="left"> But the worst part is that I&#8217;m not sure what these dialogs are trying to tell me. Both say that a module is being installed, while an older version of the source control infrastructure is being disabled. Both dialogs have almost the same exact text, but one at least is telling me that it &#8220;strongly recommends I restart the IDE after the installation is complete&#8221;. The question is, why do I have to do this manually? I&#8217;m not even sure when the installation is complete, there&#8217;s no visual indication. Wouldn&#8217;t it be better to bother me about the restart option once you are ready? Even better, how about restarting the IDE when it needs to do this (Would you like to restart the IDE so VCS/CVS modules can complete their installation?).</p>
<p align="left">I also don&#8217;t know how to get rid of these dialogs. I get the impression I&#8217;m not supposed to do any manual operation, but I keep getting them. Perhaps it&#8217;s time to blast my current installation and start over again, which is never a fun thing to do.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2007/05/03/bad-dialog-practices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magnetic Desklet v 0.1</title>
		<link>http://sellmic.com/blog/2007/04/07/60/</link>
		<comments>http://sellmic.com/blog/2007/04/07/60/#comments</comments>
		<pubDate>Sun, 08 Apr 2007 02:47:13 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2007/04/07/60/</guid>
		<description><![CDATA[
&#160;
I uploaded the first version of the &#8220;magnetic desklet&#8221;. If you have AB5K installed, it should install and start by clicking/downloading this:
http://sellmic.com/download/MagneticDesklet.desklet.
I have a blog entry that describes the concept of what this is trying to do (not everything is implemented), and another post on the desklet dev list with more details. The short description [...]]]></description>
			<content:encoded><![CDATA[<p align="center"><img src="http://sellmic.com/blog/wp-content/uploads/2007/04/magnetic-desklet-v0_1.png" alt="Magnetic Desklet v 0.1" /></p>
<p align="center">&nbsp;</p>
<p align="left">I uploaded the first version of the &#8220;magnetic desklet&#8221;. If you have <a href="http://www.ab5k.org/">AB5K</a> installed, it should install and start by clicking/downloading this:<br />
<a href="http://sellmic.com/download/MagneticDesklet.desklet" target="_blank" rel="nofollow">http://sellmic.com/download/MagneticDesklet.desklet</a>.</p>
<p align="left">I have a <a href="http://sellmic.com/blog/2007/03/21/magnetic-desklet-initial-thoughts/">blog entry </a>that describes the concept of what this is trying to do (not everything is implemented), and <a href="http://groups.google.com/group/desklets-contributors/browse_thread/thread/89c1f85134013be3">another post</a> on the desklet dev list with more details. The short description is that it&#8217;s sort of a window manager for desklets (desklets are the same concept as gadgets or widgets) with a magnet metaphor.</p>
<p align="left">There&#8217;s a lot of changes being committed to AB5K now, so this desklet won&#8217;t work for long. Give it a try if you get a chance.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2007/04/07/60/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usability matters</title>
		<link>http://sellmic.com/blog/2007/02/20/usability-matters/</link>
		<comments>http://sellmic.com/blog/2007/02/20/usability-matters/#comments</comments>
		<pubDate>Wed, 21 Feb 2007 00:20:18 +0000</pubDate>
		<dc:creator>Augusto</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://sellmic.com/blog/2007/02/20/usability-matters/</guid>
		<description><![CDATA[

 At work, I spend a lot of time talking about usability, and often find that people think I&#8217;m just talking about the aesthetics of a particular application. Usability is much more than that. At its essence, it&#8217;s a way to ensure that a product is really solving the needs of its intended users, in [...]]]></description>
			<content:encoded><![CDATA[<p align="center"><a href="http://www.jensroesner.de/wgetgui/" title="wGetGUI"></a></p>
<p style="text-align: center" align="left"><a href="http://www.jensroesner.de/wgetgui/" title="wGetGUI"><img src="http://sellmic.com/blog/wp-content/uploads/2007/02/wget-ui.png" alt="wget-ui.png" /></a></p>
<p align="left"> At work, I spend a lot of time talking about <a href="http://en.wikipedia.org/wiki/Usability">usability</a>, and often find that people think I&#8217;m just talking about the aesthetics of a particular application. Usability is much more than that. At its essence, it&#8217;s a way to ensure that a product is really solving the needs of its intended users, in an efficient, intuitive and easy to learn way. But the word says it all, &#8220;is the product usable?&#8221;.</p>
<p><span id="more-42"></span><a href="http://www.gnu.org/software/wget/">wget </a>is a very useful GNU utility used to retrieve files in various protocols, you can use it to retrieve the main page of a site (ex: wget cnn.com), &#8220;copy&#8221; a whole site to a local directory (ex: wget -r pjprimer.com), or download files contained in links or ftp sites. Because it&#8217;s a <a href="http://en.wikipedia.org/wiki/Command_line">command line</a> tool, you often wouldn&#8217;t associate ease of use with it, since most users prefer graphical versions of these tools.  <a href="http://www.jensroesner.de/wgetgui/">wGetGUI</a> (see screenshot above) is a graphical version of wget. On its website it&#8217;s described as &#8220;<em>The easy to use Graphical User Interface (GUI) for the powerful webgrabber wGet</em>&#8220;. There is nothing easy or intuitive about this GUI, in fact, it&#8217;s a good example of what happens when you build a user interface without having usability in mind. I feel bad criticizing an open source product like this, but it shows something that happens a lot, programmers building graphical user interfaces that are not only ugly but just not usable.  The first thing that a user will notice when launching this program, is the large amount of buttons, check boxes and text fields available. The common problem here is the temptation to visually represent every option in a dialog. We could organize these into tabs, menus, or a preferences dialog, but that wouldn&#8217;t really solve the problem. The approach here is to go back to basics; &#8220;Who are the users?&#8221;, &#8220;What are they trying to do?&#8221;. For this application, you usually just want to download a link, or copy a whole website to a local folder. The type of user who needs this functionality is most likely technically savvy, but that doesn&#8217;t mean that we should throw all options into a window.  Note that wGetGUI, has  a &#8220;minimal&#8221; version of the interface, which you can intuitively access by hitting a button with a &#8220;-&#8221; label. The minimal version is not much of an improvement, with buttons labeled &#8220;Start wGetStart.bat&#8221;, which are hard to associate with any download function.  The irony is that the non-graphical version is more usable. Compare the first screenshot to this one:</p>
<p style="text-align: center" align="center"><img src="http://sellmic.com/blog/wp-content/uploads/2007/02/wget.png" alt="wget.png" /></p>
<p>The only &#8220;hard&#8221; part about this interface is the use of switches (options). In this case &#8220;-r&#8221; which stands for &#8220;recursive&#8221; and allows you to download the whole contents of the site (doesn&#8217;t work on all sites, btw). For the switches, like most command line tools, if you use the &#8220;-h&#8221; switch (or &#8220;&#8211;help&#8221;) you&#8217;ll get a list of all the options available with short descriptions. This type of interface is a bit alien to a lot of Windows users, but once a person becomes familiar with the basic mechanics of their command line shell, you can see how typing &#8220;wget -r pjprimer.com&#8221; is just much easier than going thru the pain of launching something like wGetGUI.  Now I don&#8217;t give the impression that I&#8217;m advocating ditching graphical interfaces, not at all. I just wanted to point out that many times people think that because a tool has a GUI associated with it, the graphical version should be easier to use by definition. That&#8217;s only true if the GUI is well designed, and it&#8217;s built with usability in mind.</p>
]]></content:encoded>
			<wfw:commentRss>http://sellmic.com/blog/2007/02/20/usability-matters/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
