<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">
   <channel>
      <title>Andy Maleh - Eclipse Blog</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=HlcXmguf3BGdQ2H6Bx2yXQ</link>
      <pubDate>Mon, 23 Nov 2009 23:45:46 -0800</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Social Dev Camp - Iterative Prototyping: Discover Your Interface Sooner!</title>
         <link>http://andymaleh.blogspot.com/2009/11/social-dev-camp-paper-prototyping.html</link>
         <description>&lt;span style=&quot;font-weight:bold;&quot;&gt;Updated Nov 8, 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm giving a presentation at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://barcamp.pbworks.com/SocialDevCampChicago&quot;&gt;Social Dev Camp / Chicago&lt;/a&gt; this Sunday at 2:30PM.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Title:&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Iterative Prototyping: &lt;span style=&quot;font-style:italic;&quot;&gt;Discover Your Interface Sooner!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Abstract:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Iterative incremental design of software is great as it helps developers discover how to build their applications gradually with small low-risk steps followed by user acceptance testing. However, why limit this agile approach to writing code? This same technique can be applied to user interfaces too during the early conceptual stages of design, enabling ability to make changes in hours instead of weeks since it is done to paper instead of code. For example, can you think how much more time it would take to redesign each page in MySpace to look more like Facebook if it is already coded vs when it was still on paper? Come to this talk to learn the basics of Iterative Prototyping and how you can apply this valuable tool to achieve better user experience.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-8995853171199971390?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-8995853171199971390</guid>
         <pubDate>Fri, 06 Nov 2009 02:16:00 -0800</pubDate>
      </item>
      <item>
         <title>Polyglot Programmers: Hello, and Beyond.</title>
         <link>http://andymaleh.blogspot.com/2009/10/polyglot-programmers-hello-and-beyond.html</link>
         <description>This might be of interest to developers in the Chicago area who are always&lt;br /&gt;checking out new languages and technologies.&lt;br /&gt;&lt;br /&gt;The Polyglot Programmers of Chicago are meeting this Thursday at 6PM&lt;br /&gt;to see a talk by Clyde Forrester titled &quot;Hello, and Beyond&quot;.&lt;br /&gt;&lt;br /&gt;Abstract:&lt;br /&gt;&lt;br /&gt;&quot;When learning a new programming language or testing a new&lt;br /&gt;environment, one commonly runs the &quot;Hello&quot; program, which simply puts&lt;br /&gt;&quot;Hello&quot; on the screen. Some, like me, do not progress beyond that in&lt;br /&gt;great leaps, but must define deliberate small steps to understand new&lt;br /&gt;languages and additional functionality. To help with this, I am&lt;br /&gt;gradually building a set of exercises and implementations in many&lt;br /&gt;computer languages. I will present what I have so far, as well as the&lt;br /&gt;significant problems I have encountered, and some lessons learned.&quot;&lt;br /&gt;&lt;br /&gt;When: Thursday, October 22, 2009, 6:00-8:00&lt;br /&gt;Where: Obtiva, 566 W. Adams St., Suite 400, Chicago, IL&lt;br /&gt;Eating: Giordano's Pizza&lt;br /&gt;&lt;br /&gt;Link: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://polyglotprogrammers.com/usa/illinois/chicago/200910.html&quot;&gt; http://polyglotprogrammers.com/usa/illinois/chicago/200910.html&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-6010188822026410528?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-6010188822026410528</guid>
         <pubDate>Mon, 19 Oct 2009 07:15:00 -0700</pubDate>
      </item>
      <item>
         <title>Glimmer Webinar Video</title>
         <link>http://andymaleh.blogspot.com/2009/09/glimmer-webinar-video.html</link>
         <description>Here is a video of the Glimmer Webinar I gave today:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://live.eclipse.org/node/792&quot;&gt;http://live.eclipse.org/node/792&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;And, email me any questions you have.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-3532384418371239397?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-3532384418371239397</guid>
         <pubDate>Wed, 23 Sep 2009 07:20:00 -0700</pubDate>
      </item>
      <item>
         <title>Webinar: Simplifying Desktop Development with Glimmer</title>
         <link>http://andymaleh.blogspot.com/2009/09/webinar-simplifying-desktop-development.html</link>
         <description>&lt;span style=&quot;font-weight:bold;&quot;&gt;Webinar:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simplifying Desktop Development with Glimmer&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Link:&lt;/span&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://live.eclipse.org/node/792&quot;&gt;&lt;br /&gt;http://live.eclipse.org/node/792&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot; class=&quot;field-label&quot;&gt;Abstract:&lt;br /&gt;&lt;/span&gt; &lt;span class=&quot;field-item&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Programming SWT/JFace user-interfaces in Java often involves a lot of repetitive boiler-plate code that is overly verbose and hard to map to the user-interface visually. This can significantly hinder maintainability and productivity for Eclipse RCP projects.&lt;/p&gt; &lt;p&gt;Enter Glimmer; a JRuby API for SWT that takes advantage of the expressive Ruby language to provide a simple user-interface DSL (domain-specific language). Developers can rely on Glimmer to build the presentation layer of desktop applications in Ruby while keeping the business logic in Java, or alternatively do complete desktop application development in Ruby. Glimmer comes with built-in data-binding support to greatly facilitate writing maintainable and testable desktop application code.&lt;/p&gt; &lt;p&gt;In this webinar, I will introduce Glimmer, demo the latest features by contrasting the code of an application written in both Glimmer and classic SWT, provide a quick update on the status of the project and finally, have a Q&amp;amp;A and feedback session.&lt;/p&gt; &lt;p&gt;Total running time will be approximately 1 hour&lt;/p&gt; &lt;p&gt;9:00 am PDT / 12:00 pm EDT / 4:00 pm GMT - &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.timeanddate.com/worldclock/fixedtime.html?month=9&amp;amp;day=23&amp;amp;year=2009&amp;amp;hour=16&amp;amp;min=0&amp;amp;sec=0&amp;amp;p1=0&quot;&gt;Convert to other time zones&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-5091233811302612999?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-5091233811302612999</guid>
         <pubDate>Tue, 22 Sep 2009 02:13:00 -0700</pubDate>
      </item>
      <item>
         <title>Palm webOS Development First Impression</title>
         <link>http://andymaleh.blogspot.com/2009/09/palm-pre-webos-development-first.html</link>
         <description>Yesterday, I got a chance to pair-program on a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.palm.com/us/products/phones/pre/&quot;&gt;Palm Pre&lt;/a&gt; application with my colleague Roy Kolak, author of the iPhone music bookmarking application &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.vimeo.com/5701304&quot;&gt;NoteWorthy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The application being built connects to a web service in order to list media offerings available for playback on the device.&lt;br /&gt;&lt;br /&gt;Given my non-existent experience with development on the Palm Pre or any mobile device for that matter, I was a little worried about the learning curve, but I was delightfully surprised by how productive I was in helping Roy with the application.&lt;br /&gt;&lt;br /&gt;While a part of the reason is Roy's good &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andymaleh.blogspot.com/2009/03/agile-2009-talk-pairing-parody.html&quot;&gt;pairing skills&lt;/a&gt;, like explaining things before jumping into code, listening to all questions and suggestions openly, and taking turns driving with the keyboard, another big factor was certainly the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://developer.palm.com/&quot;&gt;Mojo SDK&lt;/a&gt;, which enabled me to leverage my existing Javascript/XHTML/CSS web development skills to write code for the Palm webOS without having to learn any new languages.&lt;br /&gt;&lt;br /&gt;Additionally, Roy factored the code in such a way that maximizes separation of business logic from the view, enabling us to do true test-driven development with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jania.pe.kr/aw/moin.cgi/JSSpec&quot;&gt;JSSpec&lt;/a&gt; (a Javascript spin-off of Ruby's famous &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://rspec.info/&quot;&gt;rspec&lt;/a&gt;). In fact, the Mojo SDK encourages code structure that follows a variation of the familiar MVC pattern.&lt;br /&gt;&lt;br /&gt;I asked Roy what he thought of development on the webOS in comparison to the iPhone OS. His response was that it took him several months to truly get how things worked with iPhone development whereas it took him less than a month to figure out Palm webOS development.&lt;br /&gt;&lt;br /&gt;Palm sure has a lot of inertia to go against with its platform as the iPhone is a lot more mature and has a very big following. But, given that development on the webOS takes a fraction of the time of that on the iPhone OS, will the platform pay off for Palm in the long term? Only time will tell.&lt;br /&gt;&lt;br /&gt;In any case, thanks to Palm's engineers for building such an elegant platform for us developers to quickly deliver value to consumers.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-1132873335244888012?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-1132873335244888012</guid>
         <pubDate>Tue, 01 Sep 2009 05:35:00 -0700</pubDate>
      </item>
      <item>
         <title>Software Craftsmanship North America Conference Coverage</title>
         <link>http://andymaleh.blogspot.com/2009/08/software-craftsmanship-north-america.html</link>
         <description>Last updated at 5:42PM&lt;br /&gt;&lt;br /&gt;I am at the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://scna.softwarecraftsmanship.org/schedule&quot;&gt;Software Craftsmanship North America conference&lt;/a&gt; in Chicago, USA.&lt;br /&gt;&lt;br /&gt;I will be doing live coverage of the conference in this blog post, so do not be jarred if the content gets updated often.&lt;br /&gt;&lt;br /&gt;Here is a twitter stream about it too:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/#search?q=%23scna%20AndyMaleh&quot;&gt;http://twitter.com/#search?q=%23scna%20AndyMaleh&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ken Auer kicked off the conference with a spectacular story about his upbringing both in and out of the software industry. He then proceeded to transition it to software craftsmanship and how he concluded that it is his favorite model for excelling in improving software development skills.&lt;br /&gt;&lt;br /&gt;The first talk I attended was &quot;There and Back Again&quot; by Dave Astels, who recently left Google to join EngineYard, a very promising Rails hosting enterprise. His talk kicked off with a Software Craftsmanship version of the Star Wars rolling movie intro. The main emphasis of the talk is for developers to stick with technical work no matter how many ranks they ascend. Those who turn into complete managers cross to the dark side. In fact, that was partially why Dave left Google himself. He did not want to lose touch with the industry so he seeked more technical software work.&lt;br /&gt;&lt;br /&gt;Next, I attended &quot;Demonstrating Responsibility: The Mindset of Craftsmanship&quot; by Christopher Avery. This was a talk on how taking responsibility is a key factor in succeeding with software development projects. Whether the process is agile or whatever new buzzword is out there. If team members are not taking responsibility, the chance of excelling and delivering is much lower.&lt;br /&gt;&lt;br /&gt;Christopher mentioned the different emotional states people pass through when confronted with problems (sometimes skipping some) as a coping mechanism:&lt;br /&gt;&lt;br /&gt;Denial &amp;gt; Lay Blame &amp;gt; Justify &amp;gt; Shame &amp;gt; Obligation&lt;br /&gt;&lt;br /&gt;These states get in the way of being responsible, which gets in the way of solving problems and learning. In order to get through the states quickly towards responsibility, Christopher recommended adopting these attitudes:&lt;br /&gt;Intention - The Winning Key: intending to recognize current emotional state and get beyond it&lt;br /&gt;Awareness - The Change Key: being aware of current emotional state&lt;br /&gt;Confront - The Truth Key: confronting current emotional state&lt;br /&gt;&lt;br /&gt;Afterwards, I went to Jim Weirich's talk &quot;Grand Unified Theory of Software Design&quot;. After quizzing the audience on common software design best practices such as DRY, SOLID, Law of Demeter, etc..., he proceeds to compare these practices to the early upbringing of physics and how there were many different theories in it before they were recently unified (partially) under M-Theory and Super-String Theory. He was wondering if he could do the same with software design principles, and his conclusion was that all principles seem to step from wanting to minimize &lt;span class=&quot;status-body&quot;&gt;&lt;span id=&quot;msgtxt3559746411&quot; class=&quot;msgtxt en&quot;&gt;connascence.&lt;br /&gt;&lt;br /&gt;Connascence is a variation on the idea of software coupling, which is defined as follows:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;status-body&quot;&gt;&lt;span id=&quot;msgtxt3559746411&quot; class=&quot;msgtxt en&quot;&gt;&quot;Two pieces of software share connascence when a change in one requires a corresponding change in the other&lt;/span&gt;&lt;/span&gt;.&quot;&lt;br /&gt;&lt;br /&gt;Here are the different types of connascence he went through (C stands for Connascence):&lt;br /&gt;CoName, CoPosition, CoMeaning, ContraC, CoAlgorithm, CoTiming, CoExecution, CoIdentity, CoValue, CoType.&lt;br /&gt;&lt;br /&gt;Ward Cunningham talked next about how he designed computers with a completely different paradigm following the way bacteria communicates. In fact, the title of the talk was &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://scna.softwarecraftsmanship.org/schedule#ward_cunningham&quot;&gt;What If Bacteria Designed Computers&lt;/a&gt;&quot;&lt;br /&gt;&lt;br /&gt;Next, I helped moderate a talk/panel given by Kevin Tayler, Micah Martin, and Carl Erickson titled &quot;The Business of Craftsmanship.&quot; The audience asked quite a few interesting questions, such as, &quot;How do you sell clients on apprentices working on their projects?&quot;, &quot;How often does apprenticeship not work out?&quot;, &quot;What happens if apprentices leave after investing in them?&quot;&lt;br /&gt;&lt;br /&gt;The last talk I saw before the final keynote was &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://scna.softwarecraftsmanship.org/schedule#cory_foy&quot;&gt;Selling Craftsmanship in the Enterprise&lt;/a&gt;&quot; by Cory Foy. One of the key points he made in it was: &quot;&lt;span class=&quot;status-body&quot;&gt;&lt;span id=&quot;msgtxt3564784512&quot; class=&quot;msgtxt en&quot;&gt;The core of this movement [craftsmanship] is developers taking responsibility for their own careers.&lt;/span&gt;&lt;/span&gt;&quot;&lt;br /&gt;&lt;br /&gt;Last but not least, I attended Bob Martin's incredibly dynamic keynote: &quot;Craftsmanship Under Pressure&quot;.&lt;br /&gt;&lt;br /&gt;Here are some traits he listed on what it means to be a professional:&lt;br /&gt;- Can stay cool under pressure&lt;br /&gt;- Under-commit but over-deliver&lt;br /&gt;- Can have difficult conversations with the customer, like delaying the deadline.&lt;br /&gt;- Know their field&lt;br /&gt;- Live to learn. Love to Learn.&lt;br /&gt;&lt;br /&gt;Great conference overall. It has been filmed, and you can find the sessions once announced on the @scna twitter feed.&lt;br /&gt;&lt;br /&gt;That's all folks. Maybe we'll meet next year at this conference.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-1888242233866139752?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-1888242233866139752</guid>
         <pubDate>Wed, 26 Aug 2009 03:35:00 -0700</pubDate>
      </item>
      <item>
         <title>Taking the Status Quo for Granted</title>
         <link>http://andymaleh.blogspot.com/2009/08/taking-status-quoue-for-granted.html</link>
         <description>Software developers often take the status quo of the software industry for granted, aiming no higher in their solutions than the standards set by their community.&lt;br /&gt;&lt;br /&gt;Let's take web programming as an example. In order to build web applications for clients or companies, most developers out there strive to master the standard web technologies: XHTML, CSS, Javascript as well as a back-end programming language+framework such as Java+Spring or Ruby on Rails.&lt;br /&gt;&lt;br /&gt;However, once developers are comfortable enough with building web applications, they often seek ways to increase productivity and quality of work (performance, reliability, security, ...) through changes in software development processes and/or technologies.&lt;br /&gt;&lt;br /&gt;As far as software technologies though, I've observed that developers too often only think of improvements that are incremental and within the box of what they normally do as opposed to outside the box.&lt;br /&gt;&lt;br /&gt;What are some examples of in-the-box thinking?&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;You have to program in two languages, one on the server and one on the client, in order to build a web application successfully.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Despite your best efforts in adhering to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://eisabainyo.net/weblog/web-standards/&quot;&gt;web standards&lt;/a&gt;, you ought to spend time dealing with many browser-dependent issues while in the midst of building business web applications.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You have to think about the low-level HTTP protocol details every time you build new business features in order to map them into service requests according to the web &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Resource_oriented_architecture&quot;&gt;resource-oriented architecture&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You have to code URL history management for Ajax calls yourself (with the aid of some library like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://developer.yahoo.com/yui/history/&quot;&gt;YUI Browser History Manager&lt;/a&gt; or &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.javascriptplugins.com/framework/jquery/really-simple-history/&quot;&gt;Really Simple History&lt;/a&gt;) to ensure that the back button and bookmark-ability are not broken in your shiny Web 2.0 application.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Having listed a few examples of in-the-box thinking, one may wonder &quot;What is the box exactly made of?&quot;&lt;br /&gt;&lt;br /&gt;The box is made of all the currently assumed constraints that seem unchangeable, such as available development technologies, team values, and quality standards set by the client.&lt;br /&gt;&lt;br /&gt;How do you think outside the box?&lt;br /&gt;&lt;br /&gt;Thinking outside the box is an exercise in which people temporarily drop some (or all) of the assumed constraints and imagine how things would go about instead in that alternate reality. It is an exercise in creativity and imagination, and while it may yield some ideas that are not feasible in reality, it often yields other ideas that make people realize some of the assumed constraints are indeed changeable.&lt;br /&gt;&lt;br /&gt;This is in fact what some luminaries in the Java world, such as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.springframework.com/rod/&quot;&gt;Rod Johnson,&lt;/a&gt; did when they envisioned successful enterprise development without the constraints of EJBs (Enterprise JavaBeans). That's what &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.loudthinking.com/&quot;&gt;DHH (David Heinemeier Hansson)&lt;/a&gt; did when he envisioned simplified web development relying on conventions instead of endless configuration files. That's what Google did when they built &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/webtoolkit/&quot;&gt;GWT (Google Web Toolkit)&lt;/a&gt;, a framework that abstracts all the web low level details from developers.&lt;br /&gt;&lt;br /&gt;In any case, often developers reject out-of-the-box solutions because they are not mature enough yet. For example, I know quite a few developers that are not very fond of GWT despite the fact that it offers these benefits:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simplifies the problem of web development by abstracting it to its essence: programming on the server and programming on the client with data passed back and forth in between. This has been successfully solved for desktop applications in the 90s with one programming language, so why have developers deal now with co-incidental technologies like XHTML, CSS, and Javascript?&lt;/li&gt;&lt;li&gt;Unified debugging interaction for client and server making it very easy to trace data moving between them without having to context switch between many different syntaxes and technologies&lt;/li&gt;&lt;li&gt;Abstracted all browser-related variations saving the developers from a huge burden in web development. Isn't that the premise of abstraction in software after all?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The reasons GWT is not considered a mature solution by some developers though are:&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Does not render &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://eisabainyo.net/weblog/web-standards/&quot;&gt;web-standards&lt;/a&gt; compliant XHTML/CSS as it relies on the frowned up abuse of HTML tables to do layout&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Relies on the imperative Swing-like Java syntax to layout widgets, which is considered archaic nowadays compared to using DSLs that map closely to the visual layout, like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://groovy.codehaus.org/Swing+Builder&quot;&gt;Groovy SwingBuilder&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.swixml.org/&quot;&gt;SWIXML&lt;/a&gt; (or even good old XHTML)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Of course, there is the learning curve and the fact that developers would have to remember to debug through an IDE instead of a browser debugger like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://getfirebug.com/&quot;&gt;Firebug&lt;/a&gt;. So, traditional web developers are kinda out of luck until they learn the new ways, but veteran desktop developers would be fine.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Still, the reason I bring this example up is because often when people get frustrated with a technology like GWT, they go back to accepting the status quo and working with solutions that are in-the-box as opposed to fixing the problems with the new out-of-the-box solutions.&lt;/p&gt;&lt;p&gt;The few that do persist and go beyond the box though end up with solutions that completely shatter existing expectations. For example, the Java language in its early days was considered by many developers as outlandish and impractical in comparison to writing code with a language that hits memory directly and works close to the hardware, like C/C++.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Who's making all the money now? :)&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-989834390069843600?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-989834390069843600</guid>
         <pubDate>Thu, 13 Aug 2009 14:48:00 -0700</pubDate>
      </item>
      <item>
         <title>TODO or not TODO</title>
         <link>http://andymaleh.blogspot.com/2009/07/todo-or-not-todo.html</link>
         <description>In the spirit of continuous improvement and XP's recommendation to always keep the code pristine clean (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.extremeprogramming.org/rules/refactor.html&quot;&gt;Refactor Mercilessly&lt;/a&gt;), I often perform a lot of refactorings to simplify the code as much as possible as the accumulated debts over the many months of a project can otherwise make working with the code intolerable a few years down the road.&lt;br /&gt;&lt;br /&gt;The way I look at refactoring is it's like maintaining your car or cleaning your room. Do it continuously and you'll enjoy driving around or relaxing in your room. Ignore it, and a year later your car is not working as it should anymore and your room is completely intolerable except for running in to sleep and then run out again.&lt;br /&gt;&lt;br /&gt;Unfortunately though, while I get insights for many refactorings that can make a significant dent on code simplicity, I often don't seem to find time to perform all of them when approaching a deadline. Should I ignore them and hope for the best? What if I ignore them, and after the deadline, I don't remember them anymore?&lt;br /&gt;&lt;br /&gt;The best solution I personally found is to add a TODO in the place where the pending refactoring is useful.&lt;br /&gt;&lt;br /&gt;But some developers from the agile community would immediately flinch and say: &lt;span style=&quot;font-style:italic;&quot;&gt;If you put off refactorings by adding TODO statements, you'll never get to do them and your code will be littered with them.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I used to have that fear myself till I gave that approach a try a few years ago.&lt;br /&gt;&lt;br /&gt;Turned out that since continuous merciless refactoring is in my blood, I never find myself ignoring refactorings and letting the code rot. Quite the opposite, I sometimes almost miss deadlines to ensure that the code is in pristine condition.&lt;br /&gt;&lt;br /&gt;Nonetheless, given that I have to let go of some refactorings to meet deadlines, I often forget them afterwards. One approach I tried to remedy that is to add reminder tasks about the refactorings in my task management app. Unfortunately, these often get ignored when the list grows too big.&lt;br /&gt;&lt;br /&gt;So, I finally resorted to adding TODOs within the code, and I found a number of benefits as a result:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Refactoring ideas are preserved next to the code that needs them, thus maintaining context&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Other developers see them and get an opportunity to perform the refactorings in the process of fixing a bug or adding a new feature&lt;/li&gt;&lt;li&gt;Developers are constantly reminded about them whenever they see the code that can benefit from refactoring&lt;/li&gt;&lt;/ul&gt;Therefore, TODOs are not used as a crutch to avoid performing refactorings when working in the code, they are used instead as reminders for refactorings that there was absolutely no time to perform before some deadline. They are placed right next to the code that needs them, thus constantly reminding developers of them and becoming available for all developers on the team to see as opposed to only the original developer who spotted their need.&lt;br /&gt;&lt;br /&gt;I'd be curious to hear the opinions and experiences of other developers on the matter. Feel free to post a comment about it.&lt;br /&gt;&lt;br /&gt;p.s. if you're using the Eclipse IDE, there is a view you can bring up called the Tasks view, which aggregates all TODO tasks from your project files (or a selected subset). That can help keep TODOs at the back of your mind at all times. Of course, if you're a command line zealot, you can simply grep or rak the TODOs instead.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-1132202260171969120?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-1132202260171969120</guid>
         <pubDate>Thu, 30 Jul 2009 04:32:00 -0700</pubDate>
      </item>
      <item>
         <title>Mouse-less Eclipse</title>
         <link>http://andymaleh.blogspot.com/2009/07/mouse-less-eclipse.html</link>
         <description>&lt;span style=&quot;font-style:italic;&quot;&gt;Last updated on July 29, 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A fellow blog reader &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.blogger.com/comment.g?blogID=32881756&amp;amp;postID=5323123261837242469&quot;&gt;commented&lt;/a&gt; on a post I made last month titled &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andymaleh.blogspot.com/2009/06/ide-vs-editor-war-in-ruby-world.html&quot;&gt;The IDE vs Editor War in the Ruby World&lt;/a&gt;, asking how I actually use Eclipse in a mouse-less way. So, I decided to post a list of all Eclipse shortcuts that I find practical enough to use in my day-to-day work. Note that my focus will be mostly on text editing shortcuts as opposed to language specific shortcuts.&lt;br /&gt;&lt;span style=&quot;font-size:130%;&quot;&gt;&lt;b&gt;&lt;br /&gt;Mouse-less Eclipse Keyboard Shortcuts:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+SHIFT+R:&lt;/span&gt; lookup up a resource (e.g. html, xml, rb, erb, properties, etc...)&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+SHIFT+T:&lt;/span&gt; lookup a class name (e.g. String or Customer)&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+F6: &lt;/span&gt;quickly jump between open files&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+E: &lt;/span&gt;jump between open files using a filename filter or navigation keys&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ALT+LEFT and ALT+RIGHT: &lt;/span&gt;navigate back and forth in the history of the files I opened. I rely on this one a lot to avoid using the mouse when navigating back and forth between different classes that collaborate to get a user interaction handled.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+O:&lt;/span&gt; lookup a method (thanks Kristian for reminding me)&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;F3:&lt;/span&gt; jump to method, class, or variable declaration.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+J keyword:&lt;/span&gt; instant search of a keyword within a file&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+F keyword then ENTER: &lt;/span&gt;regular search.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+K and CTRL+SHIFT+K: &lt;/span&gt;find next and find previous repeating search for the last keyword&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Highlight text to find other occurrances of a keyword and then CTRL+K:&lt;/span&gt; lets you find a keyword without even typing it if you see one occurrence already in the file (for example, you see a use of the slow performing method &quot;reindex&quot; and you wonder where else it's used in the file)&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+H:&lt;/span&gt; project-wide search for a keyword. You can also specify file patterns. Make sure to tab into fields or use mnemonics and hit ENTER instead of using the mouse. Once the search completes, pick the result you want using the up/down arrows and then hit enter to open the file.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;HOME/END/PGUP/PGDN:&lt;/span&gt; for navigation of course. I've been surprised many times by how very few developers rely on these buttons to navigate a file efficiently without using the mouse.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+LEFT and CTRL+RIGHT&lt;/span&gt;: jump between words for quicker navigation in a line without taking hand off keyboard to use the mouse.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+SHIFT+LEFT and CTRL+SHIFT+RIGHT: &lt;/span&gt;quick highlighting of words without taking hand off keyboard to use the mouse.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+L:&lt;/span&gt; jump to a particular line number. I keep line numbers visible to quickly locate stack trace errors. This one is invaluable in saving me from paging through a file or using the mouse.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+ALT+DOWN (or UP):&lt;/span&gt; clones a line downwards. It's like copy/paste without using the clipboard, which I use often to avoid emptying the clipboard from something I've copied that I'd like to paste somewhere. This is most useful with the CTRL+UP/DOWN shortcuts.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+UP and CTRL+DOWN: &lt;/span&gt;moves a line up or down quickly. I often start by cloning a line, and then I move the cloned line down or up to the place I want it to be at.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;CTRL+SHIFT+F: &lt;/span&gt;format content (makes sure everything is indented nicely)&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ALT+SHIFT+UP:&lt;/span&gt; highlights an entire variable name even if it had underscores and multiple words&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ALT+W P: &lt;/span&gt;access preferences via ALT+character mnemonics&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ALT+character mnemonics in general: &lt;/span&gt;useful to do all upper menu navigation instantly without a mouse if you're on Linux or Windows (sorry Mac people). Over time, your nervous system ends up memorizing a lot of the character sequences, saving you from having to even read the menu items, let alone pointing at them with a mouse and clicking them.&lt;/li&gt;&lt;/ul&gt;Additionally, there are many shortcuts for refactoring and source generation, which I will leave for the readers to discover on their own through the refactoring menus of Eclipse.&lt;br /&gt;&lt;br /&gt;If I remember more shortcuts over the next few days, I will make sure to update the list above. Although anyone can look up shortcuts in the Eclipse keys preferences page, not all shortcuts are practical, so I am only highlighting the ones that I consistently use to increase productivity and flow. Of course, there may be shortcuts that I have not learned to appreciate yet, so feel free to contribute in the comments the shortcuts you normally like to use.&lt;br /&gt;&lt;br /&gt;How do I know about all these shortcuts? Did I learn them all from a reference? How can I keep learning more shortcuts in my day-to-day job? I'll leave the answers to these questions to a future blog post.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-3194985267292681439?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-3194985267292681439</guid>
         <pubDate>Mon, 27 Jul 2009 13:03:00 -0700</pubDate>
      </item>
      <item>
         <title>Software Craftsmanship North America</title>
         <link>http://andymaleh.blogspot.com/2009/06/software-craftsmanship-north-america.html</link>
         <description>Dave Hoover, one of my fellow colleagues at Obtiva, is collaborating with the people at 8th Light to bring us one of the first conferences focused on software craftsmanship (Software Craftsmanship North America):&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://scna.softwarecraftsmanship.com/&quot;&gt;http://scna.softwarecraftsmanship.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I originally got introduced to the idea of Software Craftsmanship while reading the Pragmatic Programmer by Andrew Hunt and Dave Thomas, and later learned more about it through the book titled Software Craftsmanship by Pete-McBreen.&lt;br /&gt;&lt;br /&gt;I even blogged about Software Craftsmanship contrasting it with Software Engineering over here:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andymaleh.blogspot.com/2008/12/software-craftsmanship-vs-software.html&quot;&gt;http://andymaleh.blogspot.com/2008/12/software-craftsmanship-vs-software.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well, if you want to learn more about it, InfoQ recently posted an interview with Dave Hoover clarifying the purpose and goals behind the conference:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.infoq.com/news/2009/06/software-craftsmanship-conf&quot;&gt;http://www.infoq.com/news/2009/06/software-craftsmanship-conf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feel free to post a comment if you have any questions about it&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-2389861015190830863?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-2389861015190830863</guid>
         <pubDate>Wed, 24 Jun 2009 03:28:00 -0700</pubDate>
      </item>
      <item>
         <title>The IDE vs Editor War in the Ruby World</title>
         <link>http://andymaleh.blogspot.com/2009/06/ide-vs-editor-war-in-ruby-world.html</link>
         <description>Ever since I switched to Ruby programming last September to develop Rails web applications, I've been fighting an up-hill battle to convince other developers of the value of using Eclipse or IDEs in general.&lt;br /&gt;&lt;br /&gt;Since Ruby is an interpreted language (with a transparent compilation step for optimizations purposes only), developers mainly rely on test-driven development to produce reliable code. Auto-compilation and verification of code is thus rendered for the most part unnecessary. &lt;br /&gt;&lt;br /&gt;Additionally, given Ruby's support for attributes (via attr* methods) and no need to declare class variables, many of the source code generators used in Java are not needed in Ruby. After all, Ruby's philosophy is about producting the tersest most abstract code, free of boiler-plate repetitive code.&lt;br /&gt;&lt;br /&gt;Refactoring with Ruby is often done manually, but given that there isn't usually a lot of code with proper abstraction, and given Ruby's method aliasing support, huge refactorings of the nature that ripples through the whole system are rare, and thus refactoring is quite easy to perform manually especially given the protection of the Ruby must-have unit tests. &lt;br /&gt;&lt;br /&gt;So, what does that leave as far as tooling needs? Color coding, syntax highlighting, file lookup, search and replace, and possibly some autocompletion capabilities.&lt;br /&gt;&lt;br /&gt;Well, these limited needs brought back the popularity of simple editors that support just these features. By simple editors, I do actually mean good old VIM and emacs as well as the new extremely popular Mac editor, TextMate.&lt;br /&gt;&lt;br /&gt;After 10 months of pair-programming with different Ruby developers with varying habits and backgrounds, I got to do a pilgrimage through most Ruby editors and IDEs. So far, I've gone through TextMate, VIM, Aptana RadRails, Eclipse DLTK, NetBeans, and IntelliJ RubyMine. &lt;br /&gt;&lt;br /&gt;Yes, I'm a shortcut freak, and I used to write Java programs in Eclipse mouse-less!!! So, how did other editors and IDEs measure in comparison as far as shortcuts and productivity? &lt;br /&gt;&lt;br /&gt;I'll leave that to another post. &lt;br /&gt;&lt;br /&gt;In the meantime, what is your opinion of the matter? Do any of you prefer editors over IDEs? If so what's your editor/IDE of choice and what are the reasons you like it? Feel free to mention different ones for different programming languages.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-5323123261837242469?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-5323123261837242469</guid>
         <pubDate>Tue, 02 Jun 2009 14:24:00 -0700</pubDate>
      </item>
      <item>
         <title>iMeow</title>
         <link>http://andymaleh.blogspot.com/2009/05/imeow.html</link>
         <description>Some of my colleagues at work built a new iPhone app called iMeow &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=314851507&amp;mt=8&quot;&gt;(iTunes link)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The instructions for using iMeow are actually encoded in a poem included with the app:&lt;br /&gt;&lt;br /&gt;&quot;I like to have my ears and belly rubbed. &lt;br /&gt;But, please don't step on my toes or pull my tail!!!&lt;br /&gt;I'll cry for food if I'm hungry.&lt;br /&gt;And whatever you do. Do. Not. Shake. Me.&quot;&lt;br /&gt;&lt;br /&gt;Since I have a coffee-colored cat called Java, I decided to try out iMeow with her. &lt;br /&gt;&lt;br /&gt;When I pressed the mouth of the iMeow cat to make it meow, my cat suddenly became alert and still. I did it a few times and then tossed the phone away. My cat started moving slowly towards the phone and then went and sniffed it.&lt;br /&gt;&lt;br /&gt;Next experiment was to pull the iMeow's cat tail or step on its toes. The shrieks that came out of that sent chills down my cat's spine!!!&lt;br /&gt;&lt;br /&gt;Finally, I shook the iPhone forcing the iMeow cat to give an aggressive fighting shriek and exhale (the one cats do right before clawing you). That freaked my cat out, but it was fast enough that my cat was able to get over it quickly.&lt;br /&gt;&lt;br /&gt;In any case, I expect the app to get a number of updates in the future, so if you have a cat and you would like to test how it would react to another cat, give iMeow a spin.&lt;br /&gt;&lt;br /&gt;My next experiment will be to test iMeow in the wild, either in a pet store, or at a public place to see how everyone will react. ;)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-6313786885702483549?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-6313786885702483549</guid>
         <pubDate>Mon, 18 May 2009 02:43:00 -0700</pubDate>
      </item>
      <item>
         <title>XP West Michigan and EclipseCon 2009</title>
         <link>http://andymaleh.blogspot.com/2009/03/xp-west-michigan-and-eclipsecon-2009.html</link>
         <description>Tyler Jennings, Jake Scruggs, and I went on a road trip to Grand Rapids, Michigan yesterday and gave two presentations at the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.xpwestmichigan.org/&quot;&gt;XP West Michigan&lt;/a&gt; user group. Jake presented &quot;What’s the right level of testing?&quot;, and Tyler and I presented &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andymaleh.blogspot.com/2009/03/agile-2009-talk-pairing-parody.html&quot;&gt;Pairing Parody&lt;/a&gt;&quot;. Atomic Object hosted us and gave us a tour around their office. They had a nice open environment for pair-programming and a street light that signals the state of project builds (red for failure, green for success, and yellow for build in progress). The experience was very hospitable overall thanks to Michael Swieton.&lt;br /&gt;&lt;br /&gt;Today, I flew to the Silicon Valley area around San Jose, California to present at EclipseCon 2009 tomorrow. I will be giving a short talk about &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.eclipse.org/glimmer&quot;&gt;Glimmer&lt;/a&gt; and the current state of the project.&lt;br /&gt;&lt;br /&gt;If you have any specific questions about the project, feel free to list them here in the comments, and I will try to cover them in the talk.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-407552550158407914?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-407552550158407914</guid>
         <pubDate>Wed, 25 Mar 2009 16:47:00 -0700</pubDate>
      </item>
      <item>
         <title>Agile 2009 Workshop: TDD Ping Pong Match!</title>
         <link>http://andymaleh.blogspot.com/2009/03/agile-2009-talk-tdd-ping-pong-match.html</link>
         <description>By the way, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://nuts.redsquirrel.com/&quot;&gt;Dave Hoover&lt;/a&gt; and I proposed a workshop for Agile 2009 titled: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://agile2009.agilealliance.org/node/2371&quot;&gt;TDD Ping Pong Match!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a new and improved version of the same workshop conducted in Toronto last year at Agile 2008.&lt;br /&gt;&lt;br /&gt;Abstract:&lt;br /&gt;&lt;br /&gt;Attendees will be entered into a competition where they will pair-program on implementing small software application features following the TDD Ping Pong game rules. Each game will last for a few minutes, and the programmer with the least time driving (i.e. doing the simplest thing that works and coming up with the most tests) will be declared winner. This game is a great opportunity to learn TDD and Pair-Programming effectively and pragmatically. Winners will receive prizes, so sharpen your TDD Ping Pong skills and get ready for Andy and Dave’s challenge!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-2616584571353988344?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-2616584571353988344</guid>
         <pubDate>Mon, 09 Mar 2009 05:45:00 -0700</pubDate>
      </item>
      <item>
         <title>Agile 2009 Talk: Pairing Parody</title>
         <link>http://andymaleh.blogspot.com/2009/03/agile-2009-talk-pairing-parody.html</link>
         <description>I submitted a proposal for this talk with Tyler Jennings:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://agile2009.agilealliance.org/node/2370&quot;&gt;http://agile2009.agilealliance.org/node/2370&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Comments are welcome.&lt;br /&gt;&lt;br /&gt;Abstract&lt;br /&gt;&lt;br /&gt;Pair programming requires a certain level of social interaction (Yikes!!!) that quite a few developers are not accustomed to - even with their peers. Learning to work effectively with people of different personalities and skills (or even Jedi powers) can sometimes seem daunting compared to the typical habit of working alone in a dark corner. We’ve seen pairing work wonderfully, we’ve seen it be an abysmal failure that involved some shouting and storming away, and we’re going to bring our best-of moments to you in comedic fashion.&lt;br /&gt;Process/Mechanics&lt;br /&gt;&lt;br /&gt;First we’ll cover the basics for anyone who isn’t familiar with the drama that often accompanies pair programming. Afterward, Andy and I will be acting out various skits, demonstrating both effective and dysfunctional pairing scenarios. Discussions (and laughter or cries of terror) are highly encouraged at the end of each skit.&lt;br /&gt;&lt;br /&gt;Basic Patterns&lt;br /&gt;&lt;br /&gt; * Be Verbose&lt;br /&gt; * Questions Not Demands&lt;br /&gt; * Pair Negotiation&lt;br /&gt; * Ping Pong Programming&lt;br /&gt; * 2 x 2 Pairing&lt;br /&gt; * Independent Research / Spikes&lt;br /&gt;&lt;br /&gt;Mentoring Patterns&lt;br /&gt;&lt;br /&gt; * Let the student drive&lt;br /&gt; * Let the student fail&lt;br /&gt; * The third wheel&lt;br /&gt; * Test Mentor&lt;br /&gt;&lt;br /&gt;Anti-Patterns&lt;br /&gt;&lt;br /&gt; * The Prima Donna Programmer&lt;br /&gt; * The Apathetic Programmer&lt;br /&gt; * The Human Compiler&lt;br /&gt; * Worshipping The Hero&lt;br /&gt; * The Professional Driver&lt;br /&gt;&lt;br /&gt;Learning outcomes&lt;br /&gt;&lt;br /&gt; * Recognizing a dysfunctional pairing session&lt;br /&gt; * Patterns for pairing effectively with various personality types and skill levels&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-8088458943812792708?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-8088458943812792708</guid>
         <pubDate>Tue, 03 Mar 2009 06:02:00 -0800</pubDate>
      </item>
      <item>
         <title>Obtiva HackFest and Glimmer Tree Data Binding in Progress</title>
         <link>http://andymaleh.blogspot.com/2009/02/obtiva-hackfest-and-glimmer-tree-data.html</link>
         <description>Today, instead of having our weekly GeekFest meeting at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://obtiva.com&quot;&gt;Obtiva&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://redsquirrel.com/dave/&quot;&gt;Dave&lt;/a&gt; organized a HackFest instead.&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://aberant.tumblr.com/&quot;&gt;Colin&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://redsquirrel.com/cgi-bin/dave&quot;&gt;Dave&lt;/a&gt;, Roy, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://natejackson.blogspot.com&quot;&gt;Nate&lt;/a&gt; worked on &lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://aberant.tumblr.com/&quot;&gt;Colin&lt;/a&gt;'s ultimate midi controller project. Tom, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://softwareapprenticetips.blogspot.com/&quot;&gt;Leah&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jakescruggs.blogspot.com/&quot;&gt;Jake&lt;/a&gt; worked on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://metric-fu.rubyforge.org/&quot;&gt;Metric Fu&lt;/a&gt; Aggregator. And, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://squaremasher.blogspot.com/&quot;&gt;Tyler&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://crimsonknight78.blogspot.com/&quot;&gt;Turner&lt;/a&gt;, and I worked on implementing Tree Data-Binding support for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.eclipse.org/glimmer&quot;&gt;Glimmer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In one hour, we made as much progress as we could, which amounted to coming up with a design for the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andymaleh.blogspot.com/2007/12/glimmers-built-in-data-binding-syntax.html&quot;&gt;data-binding&lt;/a&gt; syntax in this unit test:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; module Node&lt;br /&gt; attr_accessor :parent, :children&lt;br /&gt; end&lt;br /&gt; &lt;br /&gt; class Person &lt;br /&gt; include Node&lt;br /&gt; attr_accessor :name, :age, :adult&lt;br /&gt; end&lt;br /&gt; &lt;br /&gt; def test_root_node_only&lt;br /&gt; adam = Person.new&lt;br /&gt; adam.name = &quot;Adam&quot;&lt;br /&gt; &lt;br /&gt; @target = shell {&lt;br /&gt; @tree = tree {&lt;br /&gt; items bind(adam, :name)&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; assert_equal 1, @tree.widget.getItems.size&lt;br /&gt; assert_equal adam, @tree.widget.getItems.first&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To bind SWT Tree items to a model node hierarchy, you pass two parameters to the bind command: the root model node and the name of the attribute to be used for displaying text in the tree.&lt;br /&gt;&lt;br /&gt;More tests will eventually be written to test data-binding a root model with children.&lt;br /&gt;&lt;br /&gt;In the future, this will probably grow in other directions to handle tree node images and selection. &lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.agiledata.org/essays/tdd.html&quot;&gt;Test-driven design&lt;/a&gt; is a common practice at Obtiva as it gets many birds with one stone: ease of exploration of ideas, test-coverage, clean code design, and higher productivity due to incremental development preventing endless hours of debugging.&lt;br /&gt;&lt;br /&gt;Stay tuned for more on Tree Data-Binding support in Glimmer in the future.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-6435504790453707624?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-6435504790453707624</guid>
         <pubDate>Tue, 03 Feb 2009 05:47:00 -0800</pubDate>
      </item>
      <item>
         <title>Sudoku Solver in Glimmer</title>
         <link>http://andymaleh.blogspot.com/2009/01/sudoku-solver-in-glimmer.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://redsquirrel.com/dave/&quot;&gt;Dave Hoover&lt;/a&gt; recently experimented with writing a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/redsquirrel/nest/tree/master/sudoku&quot;&gt;Sudoku solver&lt;/a&gt; in Ruby, so Joseph Leddy and I decided to slap a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.eclipse.org/glimmer&quot;&gt;Glimmer&lt;/a&gt; cover on top of it. We pair-programmed on writing it test-first following the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andymaleh.blogspot.com/2008/02/table-data-binding-and-mvp-in-glimmer.html&quot;&gt;Model View Presenter&lt;/a&gt; pattern.&lt;br /&gt;&lt;br /&gt;Here is how the user-interface looks like:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_XQt1Vabxo5g/SYEZ8R0EwpI/AAAAAAAAAKE/O7DutPqFvzg/s1600-h/Picture+17.png&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:400px;height:342px;&quot; src=&quot;http://1.bp.blogspot.com/_XQt1Vabxo5g/SYEZ8R0EwpI/AAAAAAAAAKE/O7DutPqFvzg/s400/Picture+17.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296543160129077906&quot;/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll provide more details once I've committed the code to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.eclipse.org/glimmer&quot;&gt;Glimmer&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://dev.eclipse.org/viewcvs/index.cgi/?root=Technology_GLIMMER&quot;&gt;repository&lt;/a&gt;.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-403889723818572623?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-403889723818572623</guid>
         <pubDate>Thu, 29 Jan 2009 08:39:00 -0800</pubDate>
         <media:thumbnail width="72" url="http://1.bp.blogspot.com/_XQt1Vabxo5g/SYEZ8R0EwpI/AAAAAAAAAKE/O7DutPqFvzg/s72-c/Picture+17.png" height="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>About My 2008/2009 Vacation</title>
         <link>http://andymaleh.blogspot.com/2009/01/about-my-20082009-vacation.html</link>
         <description>I've been wanting to blog about this for a while, so here it goes.&lt;br /&gt;&lt;br /&gt;I spent my Christmas vacation this year in Dubai, and I got to see a lot of interesting things, such as the world's new highest tower (higher than CN), one of the world's largest malls (slightly larger than Edmonton's), a 7-star hotel that looks like a sail, an indoor skiing/snowboarding hill, palm artificial islands, and a hotel that is partially underwater and has a massive aquarium.&lt;br /&gt;&lt;br /&gt;Best of all, through a friend of mine who works in technology in Dubai, I got to go to a programming user group meeting that had Matt Mullenweg from WordPress/Automattic. &lt;br /&gt;&lt;br /&gt;Here are some photos from the trip:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SX_m1rAfGbI/AAAAAAAAAJk/MzGG1bZCEbs/s1600-h/IMG_0981.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:240px;height:320px;&quot; src=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SX_m1rAfGbI/AAAAAAAAAJk/MzGG1bZCEbs/s320/IMG_0981.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296205496563210674&quot;/&gt;&lt;/a&gt;&lt;br /&gt;Highest tower in the world (Burj Dubai)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SYEWbzVoSwI/AAAAAAAAAJs/6bJQtrrApdo/s1600-h/IMG_0788.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:320px;height:240px;&quot; src=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SYEWbzVoSwI/AAAAAAAAAJs/6bJQtrrApdo/s320/IMG_0788.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296539303657622274&quot;/&gt;&lt;/a&gt;&lt;br /&gt;Atlantis Hotel partially underwater at the head of the palm artificial islands&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/_XQt1Vabxo5g/SYEW5pPC_uI/AAAAAAAAAJ0/4xIJPQPMF6A/s1600-h/IMG_0693.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:240px;height:320px;&quot; src=&quot;http://4.bp.blogspot.com/_XQt1Vabxo5g/SYEW5pPC_uI/AAAAAAAAAJ0/4xIJPQPMF6A/s320/IMG_0693.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296539816341733090&quot;/&gt;&lt;/a&gt;&lt;br /&gt;7-star hotel that looks like a sail (Burj al Arab)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SX_mmT9k_QI/AAAAAAAAAJY/xeJ2_VYVG90/s1600-h/IMG_1131.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:240px;height:320px;&quot; src=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SX_mmT9k_QI/AAAAAAAAAJY/xeJ2_VYVG90/s320/IMG_1131.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296205232678960386&quot;/&gt;&lt;/a&gt;&lt;br /&gt;Foggy skyscrapers&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SYEXn1QMMHI/AAAAAAAAAJ8/5R1ASHbjJag/s1600-h/IMG_0915.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:320px;height:240px;&quot; src=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SYEXn1QMMHI/AAAAAAAAAJ8/5R1ASHbjJag/s320/IMG_0915.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296540609841737842&quot;/&gt;&lt;/a&gt;&lt;br /&gt;Indoor skiing/snowboarding hill&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SYE_cmTlXzI/AAAAAAAAAKM/rb1VwxLmVTc/s1600-h/IMG_0930.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:400px;height:300px;&quot; src=&quot;http://3.bp.blogspot.com/_XQt1Vabxo5g/SYE_cmTlXzI/AAAAAAAAAKM/rb1VwxLmVTc/s400/IMG_0930.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296584397315989298&quot;/&gt;&lt;/a&gt;&lt;br /&gt;Me and a snowboard on the indoor hill&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/_XQt1Vabxo5g/SX_l_gaJDVI/AAAAAAAAAI4/gYeP3DRpsxA/s1600-h/IMG_1235.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer;cursor:hand;width:320px;height:240px;&quot; src=&quot;http://1.bp.blogspot.com/_XQt1Vabxo5g/SX_l_gaJDVI/AAAAAAAAAI4/gYeP3DRpsxA/s320/IMG_1235.JPG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5296204566005091666&quot;/&gt;&lt;/a&gt;&lt;br /&gt;User group meeting with Matt from WordPress&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-4969381918782958540?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-4969381918782958540</guid>
         <pubDate>Wed, 28 Jan 2009 12:43:00 -0800</pubDate>
         <media:thumbnail width="72" url="http://3.bp.blogspot.com/_XQt1Vabxo5g/SX_m1rAfGbI/AAAAAAAAAJk/MzGG1bZCEbs/s72-c/IMG_0981.JPG" height="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Easily Typable</title>
         <link>http://andymaleh.blogspot.com/2009/01/easily-typable.html</link>
         <description>For the Rubyists of us, I created a new mixin module called EasilyTypable:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/AndyObtiva/easilytypable/tree/master&quot;&gt;http://github.com/AndyObtiva/easilytypable/tree/master&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am pasting the README for it over here:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Easily Typable&lt;br /&gt;==============&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Introduction:&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;Often when working with models that belong to an inheritance hierarchy, &lt;br /&gt;it is useful to verify if a particular model is of a certain type to &lt;br /&gt;perform some behavior specific to it. For example, this is needed when &lt;br /&gt;the view needs to handle a special rendering case when encountering a&lt;br /&gt;certain type.&lt;br /&gt;&lt;br /&gt;The call typically made to accomplish the task is: &lt;br /&gt;model.is_a?(CertainType)&lt;br /&gt;&lt;br /&gt;Often, to do so in a more readable fashion, developers add a more &lt;br /&gt;English-like method that hides the details of type checking: &lt;br /&gt;model.certain_type? &lt;br /&gt;&lt;br /&gt;Writing such methods gets repetitive after a while, so an easier way &lt;br /&gt;to get these methods automatically is to mixin the EasilyTypable &lt;br /&gt;module.&lt;br /&gt;&lt;br /&gt;When mixed into classes in an inheritance hierarchy, each class gets &lt;br /&gt;&quot;certain_type?&quot; methods for its type and all of its subclass types.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;--------&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'spec'&lt;br /&gt;require File.dirname(__FILE__) + '/../lib/easily_typable'&lt;br /&gt;&lt;br /&gt;class TypeA&lt;br /&gt; include Obtiva::EasilyTypable&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class TypeB &amp;lt; TypeA&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class TypeC &amp;lt; TypeB&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;describe &quot;Obtiva::EasilyTypable&quot; do&lt;br /&gt; it &quot;should add type_a? method to TypeA object&quot; do&lt;br /&gt; TypeA.new.type_a?.should be_true&lt;br /&gt; end&lt;br /&gt; it &quot;should add type_b? method to TypeB object&quot; do&lt;br /&gt; TypeB.new.type_b?.should be_true&lt;br /&gt; end&lt;br /&gt; it &quot;should add type_b? method to TypeA object&quot; do&lt;br /&gt; TypeA.new.type_b?.should be_false&lt;br /&gt; end&lt;br /&gt; it &quot;should add type_c? method to TypeC object&quot; do&lt;br /&gt; TypeC.new.type_c?.should be_true&lt;br /&gt; end&lt;br /&gt; it &quot;should add type_c? method to TypeA object&quot; do&lt;br /&gt; TypeA.new.type_c?.should be_false&lt;br /&gt; end&lt;br /&gt; it &quot;should add type_c? method to TypeB object&quot; do&lt;br /&gt; TypeB.new.type_c?.should be_false&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Keep in mind that this is no substitute for good Object-Oriented design and is not an excuse to type-check everything in your code instead of letting behavior live in the models or rely on patterns like Strategy and State.&lt;br /&gt;&lt;br /&gt;The type checking methods are simply useful in cases where type-related behavior really should not live on the model to maintain its cohesion and avoid strong coupling. An example of that is View logic that depends on the type of the model, but should not live in the model.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-1568991420491787977?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-1568991420491787977</guid>
         <pubDate>Wed, 14 Jan 2009 13:09:00 -0800</pubDate>
      </item>
      <item>
         <title>Glimmer Short Talk Description Change for EclipseCon 2009</title>
         <link>http://andymaleh.blogspot.com/2008/12/glimmer-short-talk-description-change.html</link>
         <description>I reported a few days ago that I will be presenting Glimmer at EclipseCon 2009:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://andymaleh.blogspot.com/2008/12/eclipsecon-2009-here-i-come.html&quot;&gt;http://andymaleh.blogspot.com/2008/12/eclipsecon-2009-here-i-come.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just wanted to mention that I updated the description to provide more value to attendees in the 10-minute talk that I will be giving in 2009. Last year, I provided a quick introduction to what Glimmer is about. This year, I will expand by demonstrating the latest features added to Glimmer.&lt;br /&gt;&lt;br /&gt;Here is the part I specifically changed in the talk's description:&lt;br /&gt;&lt;blockquote style=&quot;font-style:italic;&quot;&gt;In this presentation, I will introduce Glimmer, demo the latest features by contrasting the code of an application written in both Glimmer and classic SWT, and finally provide a quick update on the status of the project.&lt;/blockquote&gt;Looking forward to seeing everyone at the conference.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-2291443617408276893?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-2291443617408276893</guid>
         <pubDate>Mon, 22 Dec 2008 00:33:00 -0800</pubDate>
      </item>
      <item>
         <title>Black Box vs Invisible Box of Professional Practices</title>
         <link>http://andymaleh.blogspot.com/2008/12/black-box-vs-invisible-box-of.html</link>
         <description>When a non-technical client requests software development services from a consulting shop, and they agree about the development of a certain application (the what,) is it a good idea to discuss the practices that will be followed in order to get the job done (the how,) or would mentioning the practices be irrelevant to a client who is not technical and has no expertise with software development?&lt;br /&gt;&lt;br /&gt;For example, a certain consulting shop may choose to build the client's application following XP practices because from experience, developers at that shop have found that they finish developing features faster and with higher quality when following the XP process.&lt;br /&gt;&lt;br /&gt;Is it relevant at all to mention these practices to a client who knows nothing about XP without being asked first? Or is it initially better to provide the client with the minimum amount of information needed, such as the number of developers, hourly-rate, estimated development time, etc...?&lt;br /&gt;&lt;br /&gt;If the client was curious to know how the application is being developed, the details can always be provided when asked, but the reason I am asking the questions above is because often, mentioning these details too early can muddy the water and give the client authority over practices they do not have the qualifications to decide on.&lt;br /&gt;&lt;br /&gt;For example, mentioning radical practices such as test-driven development and pair-programming sometimes stirs up discomfort and confusion about how these practices work due to lack of experience with them (like the classical misconception that the two practices aforementioned reduce productivity instead of increasing it.) The client then may demand removal/adjustment of the practices when in fact, the main reason the practices are followed is to serve the client in the most professional and productive way possible. That leads to the often frowned upon micro-management of practices, thus hindering creativity and productivity.&lt;br /&gt;&lt;br /&gt;Without micro-management on the other hand, when the client is told he is sold the work hours of four developers with a certain estimate for application release, the developers can choose any way they desire to accomplish the client's goals. If they decide that it's more productive to pair on certain tasks and always write tests first, that is their decision. Trusting them with that freedom can often result in higher creativity and productivity in the long run, freeing the client from focusing on practices (the how) in order to focus on coming up with the best product to build (the what.)&lt;br /&gt;&lt;br /&gt;After all, when I request from a company to build me a house, I do not want to be bored with all the technical details about how it is going to be built. I just want a quality home built by a certain date. If I get interested enough to know about the practices followed, I will ask, but I do not want to waste my time hearing about them before the beginning of the project if they do not affect my involvement with it.&lt;br /&gt;&lt;br /&gt;In either case, clients still need to hear about the practices that directly affect their involvement with the development of the product. For example, stand-up meetings and iterative planning are two XP practices that need to be agreed on with the client before beginning the project in order to get the client's commitment and effectively apply them.&lt;br /&gt;&lt;br /&gt;How would you answer the questions asked above? Are you in favor of having a black box or an invisible box around the professional practices that do not directly affect the client? Keep in mind that in either case, the box is transparent. It's just that with the black box, the client has to look closely to see them (like looking at tinted glass) whereas with the invisible box, all the details are being shown even before asking for them.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-3256547103309603755?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-3256547103309603755</guid>
         <pubDate>Sun, 21 Dec 2008 14:22:00 -0800</pubDate>
      </item>
      <item>
         <title>The Attitudes for Excelling in a Team</title>
         <link>http://andymaleh.blogspot.com/2008/12/attitudes-for-excelling-as-team.html</link>
         <description>Programmers working on a team often fall into the trap of comparing their skills to their coworkers and feeling negative about it. They often forget that people have different strengths and weaknesses, and having different perspectives and styles of work actually improves synergy and output rather than hinder it.&lt;br /&gt;&lt;br /&gt;What are some attitudes that can help a team be more effective though?&lt;br /&gt;&lt;br /&gt;Here is a list I just brainstormed quickly:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Motivation, enthusiasm, and excitement&lt;/li&gt;&lt;li&gt;Positive attitude and optimism&lt;/li&gt;&lt;li&gt;Respect and patience&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Humbleness&lt;/li&gt;&lt;li&gt;Belief in the value of others&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Love for learning&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Could you think of other attitudes or traits that would help a team be more effective?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-3393008735323905231?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-3393008735323905231</guid>
         <pubDate>Sat, 20 Dec 2008 09:31:00 -0800</pubDate>
      </item>
      <item>
         <title>Contributing Value as a Junior Developer</title>
         <link>http://andymaleh.blogspot.com/2008/12/contributing-value-as-junior-developer.html</link>
         <description>When I was still a junior software developer in the enterprise, I often felt like my opinion did not count. I had the typical shyness many junior developers have at their first job out of college. Whenever I was in the presence of senior developers, I worried about whether what I said would sound dumb and attempted as much as possible to be right to avoid embarrassing myself.&lt;br /&gt;&lt;br /&gt;What was the net result of that?&lt;br /&gt;&lt;br /&gt;I shared my opinion less and less, holding back on any ideas I had, and feeling frustrated with myself being junior. I had the illusion that if I gain enough experience and knowledge, I would finally speak intelligently and assert myself. &lt;br /&gt;&lt;br /&gt;Also, whenever I was sure of something I said to someone more senior, and he was not convinced of it, I would get really angry.&lt;br /&gt;&lt;br /&gt;That attitude finally changed after I learned two things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Even the most senior and experienced of developers are sometimes wrong and they often humbly admit it because to them, finding the truth and serving the customer is much more important than others' perception of them.&lt;/li&gt;&lt;li&gt;When working with other people, our brains are not directly connected to theirs, so communication is not instantanious or perfect, often requiring a lot of patience and many attempts from both the speaker and listener before the message is communicated successfully.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Once my attitude changed, my behavior changed too as a consequence. &lt;br /&gt;&lt;br /&gt;For example, now whenever I have an idea I would like to share, I speak up about it despite knowing that the team may resist it or the idea may simply be bad. Why? Because that's why we work as a team; to get different ideas, different perspectives, and different thoughts. Every opinion matters whether it's from a senior developer or a junior developer. Having a different mind thinking about the problem is very valuable. And, if the idea is not good for some reason, so what? I learn something new and I feel good about stimulating others' thoughts with my suggestion, possibly helping them come up with a different more effective idea.&lt;br /&gt;&lt;br /&gt;Also, whenever someone would not see my point of view or not be convinced of something I said, I would take a deep breath and try to communicate it a different way by drawing on the whiteboard, telling a story or scenario, giving a concrete example, or asking the person questions that point him to the message I was trying to communicate. At least, when communication fails, I don't take it personally and appreciate the fact that other people have different points of view and paradigms of thinking, which could make it challenging to communicate a point sometimes. But, if the point does get communicated, the synergistic value of co-operation is priceless!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-4169552422939852906?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-4169552422939852906</guid>
         <pubDate>Thu, 18 Dec 2008 23:40:00 -0800</pubDate>
      </item>
      <item>
         <title>Ridiculous or Outside the Box?</title>
         <link>http://andymaleh.blogspot.com/2008/12/ridiculous-or-outside-box.html</link>
         <description>Ever heard someone call your idea about something ridiculous? &lt;br /&gt;&lt;br /&gt;Well, that may be a good sign about the idea. &lt;br /&gt;&lt;br /&gt;Usually, when people call something ridiculous it is not because they objectively thought about it and found it ridiculous. It is because it triggered a feeling in their body that it's ridiculous. If they had thought about it objectively, they would have pointed out why they don't believe the idea is good and/or listened to you actively to figure out why you believe the idea is useful.&lt;br /&gt;&lt;br /&gt;But, when someone utters a statement like that, it means the idea completely shattered their first level of habituated thinking and triggered a feeling of discomfort in their body. It means the idea pierced through their current paradigms of thinking. It means the idea is fresh and has potential.&lt;br /&gt;&lt;br /&gt;So, the next time you hear the word ridiculous about an idea you mentioned, don't immediately flinch and take that personally. Instead, re-evaluate the idea objectively to verify that it is sound, and calmly present the pros and cons of implementing it versus the status quo or other ideas presented. &lt;br /&gt;&lt;br /&gt;After all, is the idea presented really ridiculous or is it simply outside the box?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-7594139686936609353?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-7594139686936609353</guid>
         <pubDate>Thu, 18 Dec 2008 00:51:00 -0800</pubDate>
      </item>
      <item>
         <title>EclipseCon 2009 Here I Come</title>
         <link>http://andymaleh.blogspot.com/2008/12/eclipsecon-2009-here-i-come.html</link>
         <description>&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.eclipsecon.org/submissions/2009/view_talk.php?id=367&quot;&gt;&lt;img style=&quot;cursor:pointer;width:100px;height:100px;&quot; src=&quot;http://www.eclipsecon.org/2009/static/image/100x100_speaking.gif&quot; alt=&quot;I'm speaking at EclipseCon 2009&quot; border=&quot;1&quot;/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My Glimmer talk proposed for EclipseCon 2009 has been accepted:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.eclipsecon.org/submissions/2009/view_talk.php?id=367&quot;&gt;https://www.eclipsecon.org/submissions/2009/view_talk.php?id=367&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looking forward to being at Santa Clara, California during Mar 23-26 2009.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32881756-2241505018148552474?l=andymaleh.blogspot.com' alt=''/&gt;&lt;/div&gt;</description>
         <author>Annas &quot;Andy&quot; Maleh</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-32881756.post-2241505018148552474</guid>
         <pubDate>Wed, 17 Dec 2008 02:18:00 -0800</pubDate>
      </item>
   </channel>
</rss>
<!-- fe12.pipes.sp1.yahoo.com uncompressed/chunked Mon Nov 23 23:45:46 PST 2009 -->
