<?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>MIH SWAT &#187; development</title>
	<atom:link href="http://www.mihswat.com/tag/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mihswat.com</link>
	<description>MIH SWAT - the official blog of MIH's Strategic Worldwide Applications and Technology Team.</description>
	<lastBuildDate>Mon, 06 Sep 2010 10:24:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Agile Planning Reviewed</title>
		<link>http://www.mihswat.com/2010/08/23/agile-planning-reviewed/</link>
		<comments>http://www.mihswat.com/2010/08/23/agile-planning-reviewed/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 08:53:22 +0000</pubDate>
		<dc:creator>Otavio Ferreira</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=1492</guid>
		<description><![CDATA[Agile software development methods have reached great popularity among technology-based companies around the globe, arguably due to their effectiveness at managing the project stakeholders&#8217; expectations and goals. However, this positive outcome is directly related to the team members&#8217; ability to carry out the planning phases. And unfortunately the minimalistic theory frequently observed in agile processes [...]]]></description>
			<content:encoded><![CDATA[<p>Agile software development methods have reached great popularity among technology-based companies around the globe, arguably due to their effectiveness at managing the project stakeholders&#8217; expectations and goals. However, this positive outcome is directly related to the team members&#8217; ability to carry out the planning phases. And unfortunately the minimalistic theory frequently observed in agile processes tends to result in poorly written user stories.<span id="more-1492"></span></p>
<p>Agile methods are often described as &#8220;common sense&#8221;. For this reason <a href="http://en.wikipedia.org/wiki/Ken_Schwaber">Ken Schwaber</a> refuses being titled the Co-Creator of Scrum. Several software development practitioners such as <a href="http://en.wikipedia.org/wiki/Ivar_Jacobson">Ivar Jacobson</a>, <a href="http://en.wikipedia.org/wiki/Grady_Booch">Grady Booch</a>, and <a href="http://en.wikipedia.org/wiki/James_Rumbaugh">James Rumbaugh</a> all contributed to the set of principles that today form the Scrum framework.</p>
<p>However, having <a href="http://en.wikipedia.org/wiki/Scrum_%28development%29">Scrum</a>, <a href="http://en.wikipedia.org/wiki/Extreme_programming">XP</a>, or any other method classified as common sense leaves a lot of room for interpretation by the individuals applying them. Thus, iteration planning efforts sometimes end up being superficial, not entirely committed to the system actors&#8217; real goals. As a practical consequence, user stories are found reduced to single sentences hanging on the white-board.</p>
<p>It is clear that <a href="http://www.mountaingoatsoftware.com/articles/27-advantages-of-user-stories-for-requirements">User Stories are not Use Cases or Requirement Statements</a>, as detailed by Mike Cohn, and highlighted as follows. Firstly, use cases are generally written as the result of a long analysis, whereas user stories are written as notes that will be used to initiate further analysis conversations. Secondly, requirement statements make costs visible only when all of them have been formally written in a lengthy document, whereas with user stories a complexity estimate is associated with each story immediately. Costs are then easily calculated by taking into account the velocity of the team.</p>
<p>Nonetheless, developers should not underestimate the complexity inherent in each story, and complementary theory can be found on this topic. Ron Jeffries breaks down the stories into three aspects: <a href="http://xprogramming.com/articles/expcardconversationconfirmation/">Card, Conversation, and Confirmation</a>.</p>
<p>Firstly, the card does not detail the story in depth, but successfully identifies it. Typically, team members and product owners adhere to the following template, popularized by Mike Cohn: “As an &lt;actor&gt;, I want to &lt;action&gt;, so that &lt;achievement&gt;”. Although <a href="http://blog.mountaingoatsoftware.com/advantages-of-the-as-a-user-i-want-user-story-template">advantages derived from using this template</a> have been listed, other agile evangelists have proposed enhancements. Elizabeth Keogh, for instance, came up with <a href="http://sirenian.livejournal.com/47679.html">a new user story format that better emphasizes business value</a>. One way or the other, templating has been the common approach, and teams should adopt one that will fit in smoothly within their environment.</p>
<p>Secondly, conversation is the activity that communicates the requirement from customers to developers during the product and sprint planning. At this stage, details such as dependencies and barriers are mapped out. As depicted by Jeffries, the conversation is largely verbal, but is often supplemented with documents. It is important to bear in mind that good communication is a key success factor in any software development project, and none of the artifacts produced throughout the process may substitute that.</p>
<p>Finally, stories are verified through confirmation or, more specifically, <a href="http://en.wikipedia.org/wiki/Acceptance_testing">acceptance testing</a>. All criteria taking into consideration ought to be defined during planning phases as well.</p>
<p>Although the theory presented above brings some structure to the loose perception of user stories, the writing itself remains vague. So William Wake advocates that agile practitioners should <a href="http://xp123.com/xplor/xp0308/">INVEST in good stories and SMART tasks</a>. Despite not being a particular fan of forced acronyms, I have to admit that some guideline will be welcome here.</p>
<p>Briefly, characteristics that form a good story description are the following:</p>
<ul>
<li>Independent</li>
<li>Negotiable</li>
<li>Valuable</li>
<li>Estimable</li>
<li>Small</li>
<li>Testable</li>
</ul>
<p>.<br />
Hence, a story should be independent from others, negotiable between customers and programmers, valuable to customers, estimable in terms of complexity, small for the sake of understandability, and testable on account of readiness confirmation. Further studies suggest that “Small” should be replaced with “Sized appropriately”, as the bottom of the product backlog may contain items that are not fully understandable by the team yet, also known as Epics.</p>
<p>Tasks, in their turn, should be:</p>
<ul>
<li>Specific</li>
<li>Measurable</li>
<li>Achievable</li>
<li>Relevant</li>
<li>Time-boxed</li>
</ul>
<p>.<br />
So a task needs to be specific by addressing one particular point, measurable in order to be tested against the <a href="http://www.scrumalliance.org/articles/105-what-is-definition-of-done-dod">definition of done</a>, achievable by the task owner, relevant to the story at hand, and time-boxed. This latter characteristic should not be perceived as a formal estimation in hours or days though, as it does not work. The raw material in Software Engineering is the developer&#8217;s own intellect, and nobody would be able to estimate its maturation time. The same applies to activities such as painting or novel writing. Civil Engineering, on the other hand, benefits from using raw materials that allow for accurate calculations, such as concrete and iron.</p>
<p>As a final note, during the planning, instead of defining longer iterations and allowing for bigger stories, you might be interested in giving the following set of constraints a try. SWAT has successfully built some of its software by adhering to them. Manageability goes through the roof!</p>
<ul>
<li>5-day sprints</li>
<li>5-point stories, or less</li>
<li>2-developer teams, up to 4</li>
</ul>
<p>.<br />
In conclusion, a better organized agile planning is more likely to drive the team towards the goals identified by project stakeholders. Theories and guidelines have been proposed, and I suggest bringing these concepts to the table when starting a new agile project.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2010/08/23/agile-planning-reviewed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developing Apps for Mobile</title>
		<link>http://www.mihswat.com/2010/08/10/developing-apps-for-mobile/</link>
		<comments>http://www.mihswat.com/2010/08/10/developing-apps-for-mobile/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 11:08:58 +0000</pubDate>
		<dc:creator>Dani Valentin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=1561</guid>
		<description><![CDATA[One of the most fascinating presentations I attended last OSCON (you can read my review here) was entitled Building Mobile Apps with HTML, CSS and Javascript by Jonathan Stark. Jonathan is a consultant for mobile applications, a frequent conference speaker and often quoted when media speaks of trends for internet and mobile. As outlined in [...]]]></description>
			<content:encoded><![CDATA[<p>One of the most fascinating presentations I attended last OSCON (you can read my review <a href="http://www.mihswat.com/2010/07/26/oreilly-oscon/">here</a>) was entitled  Building Mobile Apps with HTML, CSS and Javascript by <a href="www.jonathanstark.com">Jonathan Stark</a>. Jonathan is a consultant for mobile applications, a frequent conference speaker and often quoted when media speaks of trends for internet and mobile.<span id="more-1561"></span></p>
<p>As outlined in his talk, the very first question when developing for mobile is: what type of application do I want my product to have? Currently, there are three different types: Native, Web and SMS. Choosing one is based on the purpose of your project as well as the target audience.</p>
<ul>
<li><strong>Native:</strong> used when the aesthetics of the app is very important. Native is recommended when you want to access a core feature of the device, like a camera or GPS. And, because of their app stores, Native apps have the added advantages discoverability and visibility.  The disadvantage with this type of application is fragmentation, i.e. you must write a different application for each device.</li>
<li><strong>Web:</strong> used when the focus is on distribution. Web apps are available on any device enabled with Internet access and there is no need to download. Considering testing and supporting, web applications have an advantage since they do not need to go through all the bureaucracy of the app store. Updates are also up and running instantly. The main disadvantage of web apps is sand-boxing.</li>
<li><strong>SMS:</strong> rare and only used in markets where internet access on the phone is not available or prohibitively expensive. SMS apps don&#8217;t offer discoverability.</li>
</ul>
<p>Considering the above, Web applications are usually the best choice. They are cheaper to produce, more standardized and easier to distribute. According to Stark himself, &#8220;If you CAN build your app with HTML, CSS and JavaScript, then you probably should.&#8221;</p>
<p>In the second part of the talk, two interesting tools were demonstrated:</p>
<h1>jQTouch</h1>
<p><a href="http://jqtouch.com">jQTouch</a> is a jQuery plugin for mobile webkit browsers developed by David Kaneda. It Allows native animations, navigation and automatic customization of theme. Even if you will not actually using it in your application, it is a great tool for prototyping it.</p>
<p>To set jQTouch, you have to add in your page:</p>
<p><a href="http://www.mihswat.com/wp-content/uploads/2010/07/Screenshot-test.html-gedit.png"><img class="size-full wp-image-1567 alignnone" title="jQTouch" src="http://www.mihswat.com/wp-content/uploads/2010/07/Screenshot-test.html-gedit.png" alt="jQTouch" width="424" height="119" /></a></p>
<p>That means:</p>
<p>(1) adding hardcore structural design rules. This is required and you shouldn&#8217;t edit it<br />
(2) add your theme style file. There are some options in jQTouch website or you can write your own<br />
(3) initialize jQTouch after javascripts files are added. You can pass an object as a parameter with some values as icon and preloadImages</p>
<p>You can learn more from  the <a href="http://jqtouch.com">jQTouch website</a> or its <a href="http://code.google.com/p/jqtouch/">documentation</a>.</p>
<p>You can also see a quick overview in the video bellow:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/6X4K2MQsSeI&amp;hl=en_US&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/6X4K2MQsSeI&amp;hl=en_US&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h1>PhoneGap</h1>
<p><a href="http://phonegap.com">PhoneGap</a> is a framework for building cross-platform mobile apps. Using it, you can still take advantage of core features in iPhone, Android, Palm Symbian and Blackberry. It&#8217;s been recognized as a game-changer and its source code has been downloaded more than 200,000 times! Web applications can now compete with native applications when functionality is the main requirement.</p>
<p>For more information, you can visit the <a href="http://phonegap.com">PhoneGap</a> website.</p>
<p>To learn how to install it, check the video bellow:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/yuTqQyzyVvU&amp;hl=en_US&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/yuTqQyzyVvU&amp;hl=en_US&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2010/08/10/developing-apps-for-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two Approaches To Setting Up An Agile Team</title>
		<link>http://www.mihswat.com/2009/12/01/two-approaches-to-setting-up-an-agile-team/</link>
		<comments>http://www.mihswat.com/2009/12/01/two-approaches-to-setting-up-an-agile-team/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 07:41:02 +0000</pubDate>
		<dc:creator>Graeme Cumming</dc:creator>
				<category><![CDATA[SWAT]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[teams]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=896</guid>
		<description><![CDATA[The development team at DStv Labs, a division of DStv Online and MIH SWAT has recently been thrown together to look at some exciting projects in the New Media space. In keeping with the latest thinking around agile development frameworks, the DStv Labs team has adopted Scrum as the framework that will be used to [...]]]></description>
			<content:encoded><![CDATA[<p>The development team at <strong>DStv Labs</strong>, a division of <a href="http://www.dstvo.com/">DStv Online</a> and <a href="http://www.mihswat.com">MIH SWAT</a> has recently been thrown together to look at some exciting projects in the New Media space. In keeping with the latest thinking around agile development frameworks, the DStv Labs team has adopted <strong><a href="http://en.wikipedia.org/wiki/Scrum_%28development%29">Scrum</a></strong> as the framework that will be used to deliver these projects.<span id="more-896"></span></p>
<p>For those not familiar with <strong>Scrum</strong>, let me summarise the key principles quickly:</p>
<p>1. A project team is setup usually consisting of between 5 and 9 resources.<br />
2. The resources within the team have the set of skills needed to develop products.<br />
3. There are defined roles within this setup, namely</p>
<ul>
<li>The <strong>Product Owner</strong>:      Manages a list of product features that require development. These      features are prioritized by the Product Owner.</li>
<li>The <strong>Scrum Master</strong>:      Ensures that the processes are followed and helps the team deliver the      product features by removing any impediments that prevent them from      delivering.</li>
<li>The <strong>Team</strong>:      Self organises around the product features and collectively work together      to deliver these product features.</li>
</ul>
<p>I&#8217;m simplifying the roles here of course &#8211; there are further responsibilities that are played by each role, but this is the essence.</p>
<p>4. The team produces working demonstrations of the product features at regular intervals (typically every two weeks).<br />
5. These working demonstrations are visible to the business, allowing the business to get a view on where the product is going and whether it needs refinement or a complete change in direction.<br />
6. The refinements or improvements are then fed back into the team, prioritised by the Product owner and driven through to demonstration once again.</p>
<p>The framework is <strong>agile</strong> in nature. Problems are quick to identify, and quick to change. Traditional project management methodologies would allow a project to proceed down a long and drawn-out development path and if the up-front analysis had not been 100% accurate, or if external factors had required a change to the project during development, this would be very difficult to accommodate. The Scrum process by contrast makes sense &#8211; it is a simple, logical way of delivering projects and caters for changing requirements.</p>
<p>That said, the question of how to setup the Scrum team and environment remains. As a new team, we are facing these questions and trying to figure out the best path to creating the esteemed &#8220;<strong>High Performance Team</strong>&#8220;. There are two schools of thought here. Let me deal with the first.<br />
As competent and experienced team members, there is a sense of &#8220;doing things right, from the start&#8221;. This includes everything from ordering the right development hardware, deciding on what software is appropriate, defining the practices and principles the team is going to follow, which languages are best suited for the projects that need to be developed, and what the collaboration environments need to look like. All good stuff, and completely necessary. The planning also includes discussion and decisions around how to test the code that is developed, how it is documented, how much of this is automated versus manual, which tools are best suited for testing, how new issues get logged and fed back into the team, and how much test coverage is considered acceptable. Again, all good stuff, and all appropriate to the work that is being done within the team. It is also a good idea to get the overall context of the project defined up front so that broad architecture decisions can be made. Where the team needs to be careful however, and we are all sometimes guilty of this, is when it comes to over-engineering a solution up-front. Chances are that this picture is changing, or will eventually change. Nothing wrong with good architecture up-front, but trying to understand too much detail too soon is probably wasted effort.</p>
<p>Lets take a look at the second school of though for a moment. The principles of Scrum and Agile development methodologies and practices suggest that the value lies in <strong>delivering small</strong>, <strong>incremental features</strong>, <strong>regularly</strong>. Mistakes and changes to project scope are inevitable and it is the ability of the team to correct these mistakes, and accept the changes in scope that makes them &#8220;High Performance Teams&#8221;. Through <strong>continuous feedback</strong> and team &#8220;retrospectives&#8221;, the gaps get filled, and the holes get plugged. The team continues to improve as a result and the delivery continues to speed up &#8211; well, from the initial stages anyway. Its a situation in which the team adapts the principles of Agile software development to suit their unique environment, the individual strengths and weaknesses and their team characters.</p>
<p>The point that I am trying to make here, is that there are two ways to try and achieve the &#8220;High Performance Team&#8221;. There is the &#8220;Lets build the 6-foot armour-plated robot with Augmented Reality vision&#8221;, or, the &#8220;Lets build the stick man and determine what he needs next&#8221; approach. There is a fine line between setting up a team that does everything right from the start, and a team that is <strong>setup to learn</strong> how to do what is right for them.</p>
<p>I was recently made aware of an agile development team based in the UK that has been together for the past 60 months. They deliver code weekly, have a number of visible metrics for how many bugs are in their system and how quickly they are resolved, what the velocity (capacity for delivery) of the team is, converted into monetary value, and a number of other &#8220;reporting&#8221; metrics. Incredibly useful information, and a sign that they are a &#8220;High Performance Team&#8221;, but I wonder how much of that was setup from the start, and how much of it &#8220;evolved&#8221; as the team progressed through their 60 months of development together?</p>
<p>To take the analogy used above, whilst it is important to have a team vision in place and to follow best practices where ever possible, I firmly believe that it is best to create the stick-man from day one, and get him running in an agreed direction, rather than spend too much time thinking and planning the 6-foot robot that potentially is only capable of taking a few steps at a time, and hopefully, in the right direction.</p>
<p>That being said, our team is in a good place. We are positioned nicely and are moving forward as a unit. Hopefully the discussions that our team have had, and the conclusions drawn here, can help you position and setup your own team.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2009/12/01/two-approaches-to-setting-up-an-agile-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Journey to planet Android</title>
		<link>http://www.mihswat.com/2009/09/28/my-journey-to-planet-android/</link>
		<comments>http://www.mihswat.com/2009/09/28/my-journey-to-planet-android/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 09:11:17 +0000</pubDate>
		<dc:creator>Bradley Wells</dc:creator>
				<category><![CDATA[mobile]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[SWAT]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=838</guid>
		<description><![CDATA[Coming from a Flash Developer background I have had no experience with mobile application development. From the time I saw the first phone to run Android, the G1, I have been itching to get into Android development. So when I was recently given the go-ahead to take this journey into the Android world, plus a [...]]]></description>
			<content:encoded><![CDATA[<p>Coming from a Flash Developer background I have had no experience with mobile application development. From the time I saw the first phone to run Android, the G1, I have been itching to get into Android development. So when I was recently given the go-ahead to take this journey into the <a title="Android" href="http://www.android.com/" target="_blank">Android</a> world, plus a shiny new Android phone <img src='http://www.mihswat.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  , I was both excited and nervous<span id="more-838"></span> . Why nervous? Firstly, I had never developed for a mobile device before, secondly I had never written  a Java application before and lastly because I had no idea how the Android framework actually worked . But this is what we as SWAT employees love, new territory to conquer ! If you havent seen a Android device yet, see the video below of the new HTC Hero.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="295" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/FKTDSfbcbBU&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="400" height="295" src="http://www.youtube.com/v/FKTDSfbcbBU&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Nowadays it&#8217;s almost impossible to write an article about mobile phones without mentioning the very successful<a title="iPhone" href="http://www.mihswat.com/2009/09/22/i-dont-like-the-iphone/" target="_self"> iPhone</a>. <a title="Apple" href="http://www.apple.com" target="_blank">Apple</a> had practically turned the mobile  industry upside down with its touch screen device. Some people will argue to the death about how the iPhone, or the &#8220;Jesus Phone&#8221; as some call it, is the best thing since sliced bread &#8211; and nobody can argue against how successful this device has become. But I am predicting a total onslaught of Android devices within 2 years. The Android army of phones will be everywhere you look and you will not be able to visit any cellphone store without running into at least 50 different phones running this OS. OK &#8211; maybe that is going a bit far but I think you get the message and already we are seeing signs of it. At the time of writing this article there are 16 official Android devices. How will this army of Android devices be created you ask ? Enter the Open Handset Alliance.</p>
<p>The <a title="Open Handset Alliance" href="http://en.wikipedia.org/wiki/Open_Handset_Alliance" target="_blank">Open Handset Alliance</a> was formed in 2007 and currently has 47 members. It is a consortium of technology and mobile companies all dedicated to bringing us better mobile experiences, with Android being their first project . There are some big names amongst the 47 members, including Google, Intel, Nvidia, HTC, Asus, SonyEriccson, LG, Ebay. With so many big names dedicated to Android development, it is bound to be amongst the top mobile device OS&#8217;s. You can read more about this <a title="before" href="http://www.mihswat.com/2008/10/07/why-android-will-win-or-iphone-in-the-long-run/" target="_self">argument here</a>, let me get to the Android architecture.</p>
<p>Android is a Linux based software stack. On top of the Linux kernel layer lies a layer for the system libraries such as SQLite, SSL, OpenGL, etc. This layer also houses the Android runtime, which runs the Dalvik Virtual Machine. On top of this there&#8217;s the Application Framework, housing the managers like the Activity Manager, Window Manager, etc. Then finally there is the application layer, which is the layer we are most interested in.</p>
<p><img class="alignnone size-full wp-image-844" title="system-architecture" src="http://www.mihswat.com/wp-content/uploads/2009/09/system-architecture.jpg" alt="system-architecture" width="428" height="307" /></p>
<p>Android applications can consist of different sections, namely Activities, Services, Broadcast Recievers and Content Providers. Activities form the User Interface(UI) part of the application, Services run in the background similar to RSS feed readers checking for updates. Broadcast Receivers just listen for particular system broadcasts, for example , when the battery is low. Content Providers just provide content to any asking application , for example your application asking the contact book to provide the users contacts for use within your application. We will mostly be concerned with Activities.</p>
<p>Activities were designed to be totally integrated with one another. What I mean is that Activities can call one another and pass data to one another, basically  like an event driven system, but on a system wide level. An application is thus a group of Activities passing Intents to one another. It is then possible to include , lets say, a Google Maps Activity into your application by passing a Google Maps Intent to it and waiting for a result from it. It would seem to the end user that you created a Google Maps section to your app. I think this is pretty powerful.</p>
<p>To get started with creating these applications you need the free <a title="Android SDK" href="http://developer.android.com/sdk/1.6_r1/index.html">Android SDK</a>, Apple iPhone developers need to register first($99!). Then you going to need an IDE, there is an Eclipse plugin, the <a title="Android Development Tools" href="http://dl.google.com/android/ADT-0.9.3.zip">Android Development Tools</a>(ADT) plugin that has everything including the latest stable SDK. You don&#8217;t immediately need a phone to test on as ADT comes with an Android emulator that you can debug and test with but you will eventually need a phone to properly test with. ADT is pretty awesome as it comes with many tools to tell you exactly whats happening on the phone, which threads are running,it has code completion, wizards to quickly create sub classes and much more. It took me less than 30 minutes to get a  &#8220;Hello World&#8221; application running on the Android emulator from the time I installed the ADT!</p>
<p>Since ActionScript 3 is a lot like Java I could easily jump in even though there were a few syntax differences &#8211; but after about 2 days and the help of ADT I had a basic application drawing a ball bouncing round the screen. But that was only the beginning and have rewritten sections of the game many times. Now after two weeks of lots of learning I have created the game and have it running on my phone. It is still a prototype and even though it needs weeks more spit and polish, after demonstrating the game I have gotten the thumbs up to turn it into a real game which we will be registering in the Android market.  There is still a lot to learn from this wonderful framework but the <a title="Android Groups" href="http://groups.google.com/group/android-beginners">Android groups</a> have been great help, as well as all the <a title="Android forums" href="http://www.anddev.org/" target="_blank">Android forums</a> and of course, <a title="developers guide" href="http://developer.android.com/guide/topics/graphics/2d-graphics.html">the Reference guide</a> which ships with the SDK. It has been a challenge to get to grips with this entirely new development area but it was far easier than imagined it would be. I spent about 10 times longer getting to know Flash, and that was with people available to help me.</p>
<p>What about my experience using the phone? I can honestly say I am now more connected than ever before. My email, both gmail and exchange, is pushed to the phone. My Twitter application runs in the background constantly fetching  tweets, while my Facebook application gets all my buddies&#8217; status updates to me as often as I want to see them. News and weather is updated all the time. My calendar and contacs are synchronised between my phone and my mobile. I never get lost anymore, maps are always available and my Gtalk status is always &#8220;available&#8221; and running in the background, unlike on some other phones <img src='http://www.mihswat.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Oh, and it makes phone calls as well.</p>
<p>I will follow up with another article of my findings, good and bad, this time focusing on the actual Android game development.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2009/09/28/my-journey-to-planet-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>New features of PHP 5.3</title>
		<link>http://www.mihswat.com/2009/01/23/new-features-of-php-53/</link>
		<comments>http://www.mihswat.com/2009/01/23/new-features-of-php-53/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 08:02:36 +0000</pubDate>
		<dc:creator>Guilherme Blanco</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PHP 5.3]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=547</guid>
		<description><![CDATA[Almost every PHP developer is tracking the changes that will be present in the next release of the language. For those who have not been tracking the changes, or who have lost track of them &#8211; I am here to expose to you everything that PHP 5.3.0 is going to make possible. The 5.3 release [...]]]></description>
			<content:encoded><![CDATA[<p>Almost every PHP developer is tracking the changes that will be present in the next release of the language.<br />
For those who have not been tracking the changes, or who have lost track of them &#8211; I am here to expose to you everything that PHP 5.3.0 is going to make possible.</p>
<p>The 5.3 release of PHP is the most important release ever, and adds a lot of new features &#8211; leading to a delay in its release date. We will look at the most important feature enhancements from version 5.2 to version 5.3.<br />
<span id="more-547"></span></p>
<p>Let&#8217;s first look at the enhancements from PHP 5.1.X to PHP 5.2.0:</p>
<ul>
<li> Memory optimizations</li>
<li> Filter extension</li>
<li> JSON extension</li>
<li> ZIP extension</li>
<li> File upload progress hooks</li>
<li> DateTime and DateTimeZone objects</li>
<li> A couple of others small ones</li>
</ul>
<p>While these changes were interesting, (especially the first one, which lead PHP 5 to run quicker than PHP 4), they were not very visible and  &#8220;hype&#8221; changes.<br />
Now, let&#8217;s take a look at what PHP 5.3 will offer, and let&#8217;s try to judge the extent of the upgrade.</p>
<p><strong>PCRE, Reflection and SPL functions are always enabled</strong><br />
It sounds obvious, but some libraries rely on Reflection/SPL to be able to work. One example is Doctrine ORM, which enables you to work at the OO level when using databases as storage medium.<br />
PCRE is a faster library than POSIX RegEx, which may help you to write faster code when dealing with regular expressions.<br />
Also, I am helping with the re-implementation of the spl_object_hash function,  to solve some collisions and also to improve performance.</p>
<p><strong>NOWDOC and HEREDOC syntax</strong><br />
While HEREDOC syntax has been available for quite a while, it has some interesting optimizations that will allow it to behave as fast as a normal string declaration. HEREDOC uses the same syntax as a normal string declaration with double-quotes.</p>
<p><code>$author = 'Guilherme Blanco';</code></p>
<p><code>$msg = &lt;&lt;&lt; EOT<br />
This is \x41 message from $author!<br />
EOT;</code></p>
<p><code>$msg2 = "This is A message from $author!";</code></p>
<p><code>// $msg1 === $msg2<br />
echo $msg1; // Prints: This is A message from Guilherme Blanco!</code></p>
<p>NOWDOC is a new inclusion to the language, which behaves exactly like a normal string declaration with single-quotes. This means it doesn&#8217;t convert the variables and symbol codes to their correspondent values.</p>
<p><code>$author = 'Guilherme Blanco';</code></p>
<p><code>$msg = &lt;&lt;&lt; 'EOT'<br />
This is \x41 message from $author!<br />
EOT;</code></p>
<p><code>$msg2 = "This is A message from $author!";</code></p>
<p><code>// $msg1 !== $msg2<br />
echo $msg1; // Prints: This is \x41 message from $author!</code></p>
<p><strong>?: operator</strong><br />
Quick alias for those that have to do this all the time:</p>
<p><code>// PHP &lt; 5.3.0<br />
$data = isset($var) ? $var : 'default';</code></p>
<p><code>// PHP &gt;= 5.3.0<br />
$data = isset($var) ?: 'default';</code></p>
<p><strong>__DIR__ constant and error modes E_USER_DEPRECATED, E_DEPRECATED</strong><br />
These two error modes are quite simple. They have been introduced to inform the user of stuff being scheduled for removal in future PHP versions.</p>
<p>The __DIR__ constant is a nifty feature for those who are not happy with include paths.<br />
For many years, I personally had to work around directory mismatches by checking the directory of the current file.</p>
<p>Now we&#8217;ll be able to use this new constant (which is much faster):</p>
<p><code>// PHP &lt; 5.3.0<br />
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'File.php';</code></p>
<p><code>// PHP &gt;= 5.3.0<br />
require_once __DIR__ . DIRECTORY_SEPARATOR . 'File.php';</code></p>
<p><strong>__callStatic(), __invoke() and dynamic access to static members</strong><br />
One awesome feature that PHP 5 introduced was the magic methods: __set, __get, __call were quite useful for developers who wanted to control access to their objects. But one missing feature was the ability to control static method calls. To fix that, PHP 5.3 will introduce the __callStatic magic method, which will allow it to handle static method calls, like Foo::bar();</p>
<p>With a new implementation of <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">lambdas and closures</a> that I&#8217;ll detail later, more dynamic behaviour will be required from the OO side. To make us &#8211; PHP developers &#8211; more comfortable, PHP 5.3 will introduce the possibility to call an instance of a class as a function. This support was included under the magic method __invoke(). Sounds weird, but I&#8217;ll show you a quick example:</p>
<p><code>class Foo<br />
{<br />
public function __construct()<br />
{<br />
echo "Calling from constructor...\n";<br />
}</code></p>
<p><code> public function __invoke()<br />
{<br />
echo "Calling from invoke...\n";<br />
}<br />
}</code></p>
<p><code>$foo = new Foo(); // Prints: Calling from constructor...<br />
$foo(); // Prints: Calling from invoke...</code></p>
<p>For those who do not know hebrew, the<a href="http://en.wikipedia.org/wiki/Paamayim_nekudotayim"> PAAMAYIM NEKUDOTAYIM</a> is not more difficult to be found. Now it&#8217;ll be possible to do some weird calls such as $var::staticMethod(); and it&#8217;ll work!</p>
<p><strong>Garbage Collector</strong><br />
After a lot of discussion and a Google Summer of Code project, David Wang devised a very good garbage collection mechanism that deals perfectly with cyclical references for PHP.<br />
This means that PHP will use MUCH LESS resources on the server, consuming much less memory, not throwing memory exhausted exceptions any more when importing things.</p>
<p>This extension is built-in, and as far as I have been able to determine, it cannot be disabled. The only way to prevent the Garbage Collector from collecting lost cyclical references, is by calling gc_disable. The other gc_* functions will always be available. This means that you will be able to enable/disable GC through functions gc_enable(), gc_disable(). When it becomes necessary to remove non-referenced objects, simply call gc_collect_cycles(), and PHP will perform its magic for your server.</p>
<p><strong>Late Static Binding</strong><br />
Currently, static references to the current class, like self or __CLASS__ are resolved using the class in which the function belongs, as in where it was defined:</p>
<p><code>// PHP &lt; 5.3<br />
class A<br />
{<br />
public static function who()<br />
{<br />
echo __CLASS__;<br />
}</code></p>
<p><code> public static function test()<br />
{<br />
self::who();<br />
}<br />
}</code></p>
<p><code>class B extends A<br />
{<br />
public static function who()<br />
{<br />
echo __CLASS__;<br />
}<br />
}</code></p>
<p><code>B::test(); // A</code></p>
<p>Static references to the current class like self:: or __CLASS__ are resolved using the class in which the function belongs, as in where it was defined, so when we call the test() method on class B it will call the who() method of class A.</p>
<p>LSB tries to solve that problem by introducing a keyword that references the class that was initially called at runtime. Basically, a keyword that would allow you to reference B from test() in the previous example.</p>
<p>It was decided not to introduce a new keyword but rather use &#8220;static&#8221;, which was already reserved.</p>
<p><code>// PHP &gt;= 5.3<br />
class A<br />
{<br />
public static function who()<br />
{<br />
echo __CLASS__;<br />
}</code></p>
<p><code> public static function test()<br />
{<br />
static::who();<br />
}<br />
}</code></p>
<p><code>class B extends A<br />
{<br />
public static function who()<br />
{<br />
echo __CLASS__;<br />
}<br />
}</code></p>
<p><code>B::test(); // B</code></p>
<p>Some people describe static:: as the $this-&gt; resolution for static calls, this is not true as $this-&gt; follows the rules of inheritance while static:: doesn&#8217;t.</p>
<p><strong>Namespaces</strong><br />
After months of discussions and a lot of issues that had to be fixed, the namespaces implementation has  finally been incorporated,  and is already available under alpha 3.<br />
The namespace separator doesn&#8217;t please everyone especially those that do not use english keyboard layouts. These people will suffer due to the lack of &#8220;\&#8221; char on keyboard.</p>
<p>Here is an example usage of this new feature of PHP 5.3:</p>
<p><code>// File1.php<br />
namespace Foo;</code></p>
<p><code>class Bar<br />
{<br />
public function test()<br />
{<br />
try {<br />
do_some_stuf();<br />
} catch (Exception $e) { // Refers to Foo\Exception<br />
// Special handling of Foo Exception<br />
} catch (\Exception $e) { // Refers to PHP Exception<br />
// Special handling of Exception<br />
}<br />
}<br />
}</code></p>
<p><code>// File2.php<br />
$b = new Foo\Bar();<br />
$b-&gt;test();</code></p>
<p><code>// OR...</code></p>
<p><code>use Foo\Bar as Baz;</code></p>
<p><code>$b = new Baz();<br />
$b-&gt;test();</code></p>
<p><strong>Lambdas Functions/Closures</strong><br />
This can be considered to be an important new feature of PHP, as important as namespace support.</p>
<p>From now on, it&#8217;ll be possible to do this:</p>
<p><code>$func = function ($str) { echo $str; }</code></p>
<p><code>$func('Hello World!'); // Prints: Hello World!</code></p>
<p>Certain situations arose where variables from an outer scope should be allowed internally too. That was a limitation of PHP (variable scope), but it was fixed by the usage of new syntax when defining the lambda function:</p>
<p><code>$first = "Guilherme";<br />
$second = "Blanco";</code></p>
<p><code>$func = function () use (&amp;$first, $second)<br />
{<br />
$first = "Hello";<br />
$second = "World";</code></p>
<p><code> echo $first . ' ' . $second; // Prints: Hello World<br />
};</code></p>
<p><code>$func();</code></p>
<p><code>echo $first . ' ' . $second; // Prints: Hello Blanco</code></p>
<p><strong>New SPL classes</strong><br />
A lot of work has been done,  especially by Etienne on SPL (the Standard PHP Libraries). There is a bunch of new data structures that will be available to users starting on PHP 5.3.<br />
Until now, no updated documentation has been made available, but looking at the source it is easy to figure out how to use these new structure.<br />
Here are the new data structures which will become available:</p>
<ul>
<li> SplObjectStorage (added ArrayAccess support + new features)</li>
<li>SplDoublyLinkedList</li>
<li>SplStack</li>
<li>SplQueue</li>
<li>FilesystemIterator</li>
<li>GlobIterator</li>
<li>SplHeap</li>
<li>SplMinHeap</li>
<li>SplMaxHeap</li>
<li>SplPriorityQueue</li>
<li>SplFixedArray</li>
<li>RecursiveTreeIterator</li>
<li>MultipleIterator</li>
</ul>
<p><BR/><br />
<strong>mysqlnd</strong><br />
This is a replacement library (and it&#8217;s not an extension) for libmysql, offering a lot of advantages over it the latter. While libmysql was developed primarily for C and C++, mysqlnd is optimized for PHP, taking advantage of the Zend Engine.</p>
<p>These advantages are:</p>
<ul>
<li> Tight integration with Zend Engine</li>
<li> Faster execution</li>
<li> Lower memory</li>
<li> Easier compilation of PHP,since it&#8217;s native now (libmysql was bundled with MySQL Server)</li>
<li> Usage of PHP stream API</li>
<li> Statistical Data Collection</li>
<li> Client-side (PHP userland) Query Cache</li>
<li> License compatibility</li>
<li> Easy to introduce future improvements (prepared statement cache, built-in profiling, automatic load balancing, etc)</li>
</ul>
<p><BR/><strong>Fileinfo</strong><br />
This great PECL extension is now enabled by default in PHP to replace mime_magic.<br />
It is possible to pick the right content-type of files, giving you more secure code and preventing some security issues the previous library allowed, such as uploading a PHP script as a GIF file for example.</p>
<p>Here is a piece of code that shows how to use this extension:</p>
<p><code>$fileinfo = new finfo(FILEINFO_MIME);<br />
echo $fileinfo-&gt;file('/path/to/file/to/be/checked.jpg'); // Prints: image/jpg<br />
$fileinfo-&gt;close();</code></p>
<p><strong>Phar</strong><br />
How do you share your library? How do you share all the source code?<br />
While other languages provide a nifty packaging system, PHP until now had not features to support anything like this.<br />
With PHP 5.3, phar has been included for all of us.</p>
<p>You may not be aware of this &#8211;  but I work on my spare time on the Doctrine ORM project. Let&#8217;s use Doctrine as an example.</p>
<p>First we want to pack our entire project into a single file called &#8220;doctrine.phar&#8221;.</p>
<p><code>$phar = new Phar('doctrine.phar', 0, 'doctrine.phar');<br />
$phar-&gt;buildFromDirectory('/path/to/doctrine/lib');<br />
$phar-&gt;setStub($phar-&gt;createDefaultStub('Doctrine.php', 'Doctrine.php'));</code></p>
<p>It&#8217;ll generate a &#8220;doctrine.phar&#8221; file that we can distribute to people.</p>
<p>Once you have the phar file, you would have to do the following to load the library:</p>
<p><code>include '/path/to/doctrine.phar';</code></p>
<p><strong>Improved Windows support</strong><br />
As a member of the PHP Windows team, I cannot finish this article without mentioning that some PHP developers are working extremely hard to be able to provide a lot of *NIX only features for Windows server too.<br />
Two days ago Pierre finished the link() support, which creates symbolic links (shortcuts for Windows users) through PHP. Currently there is a list of functions for which support on Windows is planned &#8211; this list can be accessed via URL: http://wiki.php.net/internals/windows/todo</p>
<p>Also, I worked on a PHP webpage at http://windows.php.net which provides customized Windows builds of PHP. It&#8217;s possible to pick a snapshot or a VC9 compiled version. </p>
<p>I hope you all enjoy it! =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2009/01/23/new-features-of-php-53/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crossing the divide &#8211; the move to open source</title>
		<link>http://www.mihswat.com/2009/01/13/crossing-the-divide-the-move-to-open-source/</link>
		<comments>http://www.mihswat.com/2009/01/13/crossing-the-divide-the-move-to-open-source/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 09:51:04 +0000</pubDate>
		<dc:creator>Jacques van Niekerk</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[Jacques van Niekerk]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[platforms]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=306</guid>
		<description><![CDATA[Last year brought many changes to our team &#8211; and not all of these changes have been of a positive nature. Nevertheless there were positive outcomes, not the least of which has been changing our development platform of choice away from Microsoft technology. Let me provide some background. The majority of our team members, both [...]]]></description>
			<content:encoded><![CDATA[<p>Last year brought many changes to our team &#8211; and not all of these changes have been of a positive nature. Nevertheless there <em>were</em> positive outcomes, not the least of which has been changing our development platform of choice away from Microsoft technology.</p>
<p><span id="more-306"></span>Let me provide some background. The majority of our team members, both in South Africa and Brazil, had been Microsoft .Net developers at some point in their careers, and some had never been anything else. We used to hire people based &#8211; in part &#8211; on their expertise with Microsoft development tools.</p>
<p>As a business unit, SWAT comes into contact with a large number of organisations from around the globe that are members of the MIH group. In our interaction with these companies we were experiencing a great deal of resistance to implementing Microsoft software.</p>
<p>The reasons for this resistance were varied but often based on cost &#8211; both the cost of the software and the cost of the people who are skilled in the use of Microsoft tools. Cost was not the only consideration &#8211; the general perception out there is that the Web is built on open source software, and that open source is where the best developers want to place their efforts and build their reputations.</p>
<p>It was very clear that we had to cross the great divide if we wanted to stay relevant in the markets where the group operates.</p>
<p>Although we had never been a pure Microsoft shop &#8211; we used Flash technologies, Javascript , CSS and their kin, as well as various tools for mobile development &#8211; our core development tools were Microsoft Visual Studio, using C# with .Net and ASP.Net, and the challenge was to change our primary development platform.</p>
<p>Our greatest concern was what the reaction of the team members would be &#8211; I mentioned earlier that the majority of people in the team at that time were skilled in Microsoft technology, and we were worried that the re-skilling that would be required would present us with a very steep (and costly) learning curve. A further concern was that the changeover may cause people to leave the team, rather than lose the skills they have already acquired in Microsoft technologies.</p>
<p>Once the decision had been made to shift our focus to open source development, we had to choose a platform. The obvious choice was PHP 5.0. &#8220;Obvious&#8221; because of the wide popularity of the language within the group, the wide support for PHP and the vibrant PHP community. An additional consideration was that PHP is fairly similar to C#, in terms of syntax and in terms of being a &#8220;traditional&#8221; object oriented language. Although we considered options such as Ruby, we concluded that PHP would represents the best option for migrating to open source.</p>
<p>It has been more or less a year since we finally phased out Microsoft tools, and here&#8217;s the summary of our experience:</p>
<ul>
<li>Great programmers do not care about the language. We lost no-one because they wanted to work only on Microsoft platforms.</li>
<li>The web IS built with open source tools &#8211; and using open source tools gave us a wider audience.</li>
<li>Costs for software development tools have plummeted to virtually zero.</li>
<li>The Microsoft Visual Studio <a href="http://en.wikipedia.org/wiki/Integrated_development_environment" target="_blank">IDE</a> is one of the best (if not the best) development environments available.</li>
<li>If you are going to use open source, you must be willing to change and adapt <em>all the time</em>. Frameworks, tools and methodologies are continuously changing in the open source world &#8211; forget about well-planned migration routes for technology. Be pragmatic, and use what works. We still use Microsoft tools when our clients require it.</li>
<li>Because it is open source, it is possible to look into the code to find why things do not work as expected. Often it is very hard to find the solution, and there is hardly ever a helpdesk which you can call. But you can look if you want &#8211; the option is there.</li>
<li>Microsoft is not bad. In our experience it is simply a matter of choosing the most appropriate tool for the job, and the Microsoft tools are more suited for enterprise development. Although of course the platform CAN be used for web development.</li>
</ul>
<p>In summary &#8211; the decision to go open source was the best decision for our team, and I would encourage every team that does web development to do the same thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2009/01/13/crossing-the-divide-the-move-to-open-source/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Good software modularity. What exactly is it?</title>
		<link>http://www.mihswat.com/2008/11/27/good-software-modularity-what-exactly-is-it/</link>
		<comments>http://www.mihswat.com/2008/11/27/good-software-modularity-what-exactly-is-it/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 12:41:14 +0000</pubDate>
		<dc:creator>Otavio Ferreira</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[modularity]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=408</guid>
		<description><![CDATA[This post might be considered academic, but it offers a good overview of what I believe to be the guiding principles in terms of software modularity. Let’s start with a little bit of background. Sometimes the way businesses are modeled are constrained by the available technology, which may block innovation, change and even growth in [...]]]></description>
			<content:encoded><![CDATA[<p>This post might be considered academic, but it offers a good overview of what I believe to be the guiding principles in terms of software modularity.<span id="more-408"></span></p>
<p>Let’s start with a little bit of background. Sometimes the way businesses are modeled are constrained by the available technology, which may block innovation, change and even growth in the business. Instead of establishing barriers, technologists should keep pushing for the evolution of technology, and keep fighting people who are against this evolution.</p>
<p>You may be fortunate enough to live in a better world, where software is built according to real business goals, bringing real value to the company. Great! However, this is not quite enough yet. Business models keep changing quickly, which means that the software in place ought to be <strong>flexible</strong> enough to support these changes, and also <strong>expansible</strong> enough to support that always desirable growth.</p>
<p>The real problem here is the following: How can we simultaneously achieve flexibility, expansibility, and maintainability in software architecture? This is a very tough question, but the answer is rather simple: &#8220;Achieve this by using high modularity levels&#8221;. Unfortunately, this cannot be achieved by some sort of magic, but only by dint of a focused architectural effort, as described below.</p>
<p>I like thinking of a <strong>module </strong>as just a block of code &#8211; this block of code can vary from being a method to being a class, a component, and a (web) service. Now, the <strong>modularity level</strong> evaluates the usage of modules in a given software architecture, mainly when it comes to <a href="http://en.wikipedia.org/wiki/Encapsulation_(computer_science)">encapsulation</a>, <a href="http://en.wikipedia.org/wiki/Coupling_(computer_science)">coupling</a>, and <a href="http://en.wikipedia.org/wiki/Cohesion_(computer_science)">cohesion</a>. Several authors have written about modularity, but my personal choice is <a href="http://se.ethz.ch/~meyer/">Bertrand Meyer</a>. His study on Object-Oriented Software Construction presents five criteria as a guide to evaluating modularity.</p>
<ol>
<li><em>Modular Decomposability</em> – A software construction method satisfies Modular Decomposability if it helps in the task of decomposing a software problem into a small number of less complex sub-problems, connected by a simple structure, and independent enough to allow further work to proceed separately on each item.</li>
<li> <em>Modular Composability</em> – A software construction method satisfies Modular Composability if it favors the production of software elements which may then be freely combined with each other to produce new systems, possibly in an environment quite different from the one in which they were initially developed.</li>
<li> <em>Modular Understandability</em> – A software construction method satisfies Modular Understandability if it helps produce software which a human reader can understand each module without having to know the others, or, at worst, by having to examine only a few of the others.</li>
<li> <em>Modular Continuity</em> – A software construction method satisfies Modular Continuity if, in the software architectures that it yields, a small change in the problem specification will trigger a change of just one module, or a small number of modules.</li>
<li> <em>Modular Protection</em> – A software construction method satisfies Modular Protection if it yields architectures in which the effect of an abnormal condition occurring at run time in a module will remain confined to that module, or at worst will only propagate to a few neighboring modules.</li>
</ol>
<p>Mr. Meyer also presents the following six principles.</p>
<ol>
<li><em>Linguistic Modular Unit</em> – Modules must correspond to syntactic units in the language used.</li>
<li> <em>Few Interfaces</em> – Every module should communicate with as few other modules as possible.</li>
<li> <em>Small Interfaces</em> – If two modules communicate at all, then they should exchange as little information as possible.</li>
<li> <em>Explicit Interfaces</em> – When two modules communicate, this fact must be obvious.</li>
<li> <em>Information Hiding</em> – All information about a module should be private to that module unless it is specifically declared public.</li>
<li> <em>Open &amp; Closed</em> – A module should be open for small changes (with no impact on its interface), and closed in terms of readiness.</li>
</ol>
<p>Both lists are quite self-explanatory, aren’t they?</p>
<p>From my point of view, software modularity is an overused expression, and people are usually not familiar with any criteria or principles for evaluating the level of modularity, such as the ones listed above. This post aims to provide a means whereby the  often misunderstood concept of modularity is made explicit, while providing a foundation for designing truly <strong>loosely-coupled modules</strong>. I hope you find it useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2008/11/27/good-software-modularity-what-exactly-is-it/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Dependency Inversion: Killing Gorillas and Butterflies</title>
		<link>http://www.mihswat.com/2008/10/21/dependency-inversion-killing-gorillas-and-butterflies/</link>
		<comments>http://www.mihswat.com/2008/10/21/dependency-inversion-killing-gorillas-and-butterflies/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 10:05:15 +0000</pubDate>
		<dc:creator>Otavio Ferreira</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[dependency]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technique]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=309</guid>
		<description><![CDATA[In a previous post we met object orientation’s worst enemy (i.e. strong, unplanned dependencies among classes). It is now time to have a closer look at Dependency Inversion, which is one of the most efficient OOP techniques available with which to fight our adversary.Our aim with this discussion is to avoid having the already discussed [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous post we met <a href="http://www.mihswat.com/2008/10/14/the-object-orientations-worst-enemy/" target="_self">object orientation’s worst enemy</a> (i.e. strong, unplanned dependencies among classes). It is now time to have a closer look at <em>Dependency Inversion</em>, which is one of the most efficient <a href="http://en.wikipedia.org/wiki/Object-oriented_programming" target="_self">OOP</a> techniques available with which to fight our adversary.<span id="more-309"></span>Our aim with this discussion is to avoid having the already discussed Domino Effect, Butterfly Effect, and Banana-Gorilla Effect. Please refer to the <a href="http://www.mihswat.com/2008/10/14/the-object-orientations-worst-enemy/" target="_self">initial article</a> if you are unfamiliar with these concepts. The following concrete example makes use of <a href="http://uml.org/" target="_self">UML</a>, and addresses a real-case scenario within the e-commerce domain.</p>
<p><a href="http://www.mihswat.com/wp-content/uploads/2008/10/diagram1.gif"><img class="alignnone size-medium wp-image-323" title="diagram1" src="http://www.mihswat.com/wp-content/uploads/2008/10/diagram1.gif" alt="" width="288" height="48" /></a></p>
<p>Obviously, the schema presented here is just part of a complete software architecture &#8211; for the purposes of this discussion we assume that all orders issued are stored in a <a href="http://en.wikipedia.org/wiki/Relational_database" target="_self">relational database</a> instance (<a href="http://www.mysql.com/" target="_self">MySQL</a> more specifically). The natural way of thinking leads the architect to model a dependency from Order to MySQL, mainly because the former class is the one responsible for deciding when database transactions begin. However, the resulting dependency leads to at least three undesirable consequences, as follows:</p>
<ul>
<li><strong>Business objects and rules start depending on purely technical matters such as database manipulation.</strong> We all know that what is cutting-edge technology at the moment, is likely to become obsolete in a few month&#8217;s time. Business concepts, on the other hand, tend towards stability &#8211; an order will always be an order, potentially keeping the same attributes in the long-run. It’s important to notice that the undesirable direction of the dependency may force the developers to change business objects whenever the database technology they are using changes.</li>
<li><strong>The architecture assumes that storage will always be handled by a specific relational database.</strong> This is a risky assumption, since the development team may decide to swap out the database provider. Moreover, alternative storage mechanisms like the file system itself may come up as a viable option in the future.</li>
<li><strong>Unit testing becomes painful.</strong> This sort of dependency makes it difficult to use the <a href="http://en.wikipedia.org/wiki/Mock_object" target="_self">mock objects</a> technique, which is quite common within <a href="http://en.wikipedia.org/wiki/Unit_testing" target="_self">unit testing</a> methods.</li>
</ul>
<p>We can address these issues by placing an interface between the classes, and therefore inverting the related dependency. As demonstrated below, we have just succeeded in decoupling storage manipulation from business objects.</p>
<p><a href="http://www.mihswat.com/wp-content/uploads/2008/10/diagram2.gif"><img class="alignnone size-medium wp-image-324" title="diagram2" src="http://www.mihswat.com/wp-content/uploads/2008/10/diagram2-300x37.gif" alt="" width="300" height="37" /></a></p>
<p>The dependency inversion technique has addressed all the problems we identified. People usually think of an interface as just a simple set of common functions, but it’s not. Instead, a strategically applied interface contributes desirable outcomes such as mobility, flexibility, reusability, and maintainability.</p>
<p>OK, but wait a minute, the business object <em>Order</em> still needs to send messages to the data access layer, doesn’t it? Yes, it does, but interfaces do not exist at runtime, only objects do. Therefore, IStorage is replaced by an object defined by a class that realizes this interface, the MySQL class in our example. It’s now clear that we could also have realizations to other database providers and storage mechanisms (<a href="http://www.oracle.com/technology/software/products/database/" target="_self">Oracle</a>, <a href="http://www.microsoft.com/sqlserver/" target="_self">MSSQL</a>, <a href="http://www.postgresql.org/" target="_self">PostgreSQL</a>, and File System).</p>
<p>Visualizing the dependency inversion is even easier when we deal with components, instead of classes. The first <a href="http://en.wikipedia.org/wiki/Component_diagram" target="_self">component diagram</a> below does <span style="text-decoration: underline;">not</span> take advantage of the technique we just learned.</p>
<p><a href="http://www.mihswat.com/wp-content/uploads/2008/10/diagram3.gif"><img class="alignnone size-medium wp-image-325" title="diagram3" src="http://www.mihswat.com/wp-content/uploads/2008/10/diagram3-300x107.gif" alt="" width="300" height="107" /></a></p>
<p>Unlikely the previous diagram, the following schema turns over the dependency between the components, making the business component independent, and enabling new data providers.</p>
<p><a href="http://www.mihswat.com/wp-content/uploads/2008/10/diagram4.gif"><img class="alignnone size-medium wp-image-326" title="diagram4" src="http://www.mihswat.com/wp-content/uploads/2008/10/diagram4-300x192.gif" alt="" width="300" height="192" /></a></p>
<p>The <a href="http://en.wikipedia.org/wiki/Black_box" target="_self">black-box notation</a> makes things even clearer:</p>
<p><a href="http://www.mihswat.com/wp-content/uploads/2008/10/diagram5.gif"><img class="alignnone size-medium wp-image-327" title="diagram5" src="http://www.mihswat.com/wp-content/uploads/2008/10/diagram5.gif" alt="" width="288" height="48" /></a></p>
<p>Again, the dependency inversion:</p>
<p><a href="http://www.mihswat.com/wp-content/uploads/2008/10/diagram6.gif"><img class="alignnone size-medium wp-image-328" title="diagram6" src="http://www.mihswat.com/wp-content/uploads/2008/10/diagram6.gif" alt="" width="288" height="56" /></a></p>
<p>Techniques such as the one presented by this post prevent the <a href="http://en.wikipedia.org/wiki/Active_record_pattern">Active Record</a> pattern from being a complete failure. Now I bet you realize how powerful dependency inversion is, right? So back to your dashboard and take your interfaces to the next level!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2008/10/21/dependency-inversion-killing-gorillas-and-butterflies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Object Orientation’s Worst Enemy</title>
		<link>http://www.mihswat.com/2008/10/14/the-object-orientations-worst-enemy/</link>
		<comments>http://www.mihswat.com/2008/10/14/the-object-orientations-worst-enemy/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 14:29:10 +0000</pubDate>
		<dc:creator>Otavio Ferreira</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[dependencies]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[object orientation]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[uml]]></category>
		<category><![CDATA[up]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=242</guid>
		<description><![CDATA[Strong dependencies among classes (or components) are definitely the villains within a software architecture. The opposite of strong dependencies, ie completely decoupled architectures, do not exist however, because such a utopian schema would actually result in no messages being exchanged among objects at all. Architects should focus on minimizing strong dependencies, designing only well-planned ones. [...]]]></description>
			<content:encoded><![CDATA[<p>Strong dependencies among classes (or components) are definitely the villains within a software architecture. The opposite of strong dependencies, ie completely decoupled architectures, do not exist however, because such a utopian schema would actually result in no messages being exchanged among objects at all. Architects should focus on minimizing strong dependencies, designing only well-planned ones. I refer to the latter as healthy dependencies, and they undoubtedly bring a lot of benefits to a system.<span id="more-242"></span></p>
<p>Successful development processes such as <a title="UP" href="http://en.wikipedia.org/wiki/Unified_Process" target="_self">UP</a> (<a title="Unified Process" href="http://www-01.ibm.com/software/awdtools/rup/" target="_self">Unified Process</a>) are usually defined as architecture-centric, which basically means that development iterations are guided by the evolution of the architecture,  and by architectural artifacts such as <a title="UML" href="http://en.wikipedia.org/wiki/Unified_Modeling_Language" target="_self">UML</a> (<a title="Unified Modeling Language" href="http://uml.org/" target="_self">Unified Modeling Language</a>) diagrams. Therefore, the architect is responsible for establishing a high level of modularity in order to achieve both expandibility and maintainability potentials. Nicely designed modules connected by healthy dependencies have the power to minimize three undesired, internal properties: Rigidity, Fragility, and Immobility. Let’s have a closer look at each one.</p>
<p>The Rigidity property states that maintenance in a specific point in the architecture may oblige the developer to also change directly related points, generating a maintenance chain. I like calling it the <a title="Domino Effect" href="http://en.wikipedia.org/wiki/Domino_effect" target="_self">Domino Effect</a>. If you don’t enjoy reading Wikipedia articles, you can just read the following extract: “The Domino Effect is a simple chain reaction that occurs when a small change causes a similar change nearby, which then will cause another similar change, and so on in linear sequence”. It’s pretty clear, isn’t it?</p>
<p>The Fragility property, in its turn, states that maintenance in a specific point in the architecture may force the developer to change a point indirectly related to or far from the former point. We will call the consequence of ths property the <a title="Butterfly Effect" href="http://en.wikipedia.org/wiki/Butterfly_effect" target="_self">Butterfly Effect</a>. Again, another Wikipedia snapshot: “The Butterfly Effect is a phrase that encapsulates the more technical notion of sensitive dependence on initial conditions in chaos theory. Small variations of the initial condition of a dynamical system may produce large variations in the long term behavior of the system”. I am sure the meaning is clear.</p>
<p>Finally, the Immobility property takes place when a developer tries to reuse an existing component, but then gets blocked by other component’s classes that the desired ones depend on. I usually call this the Banana-Gorilla Effect, funny huh? This is because whenever you try to get just the banana, the gorilla comes after it. There’s no way of running away from the big animal, and you suddenly lost one of the major features of the object orientation tenet, <a title="code reuse" href="http://en.wikipedia.org/wiki/Software_reuse" target="_self">code reuse</a>.</p>
<p>OK, enough talking, let’s get back to business. How can we avoid having these three bad properties? How can we design only healthy dependencies? Quick answer: Using <a title="Interfaces" href="http://en.wikipedia.org/wiki/Interface_(computer_science)" target="_self">Interfaces</a> for <a title="dependency inversion" href="http://en.wikipedia.org/wiki/Dependency_inversion_principle" target="_self">dependency inversion</a>. An Interface is a partial description of a domain concept, and is certainly an invaluable ally for any software architect. Technically speaking, it’s a bunch of method signatures that allow further specialization. <a title="Erich Gamma" href="http://en.wikipedia.org/wiki/Erich_Gamma" target="_self">Erich Gamma</a> et al wrote an entire (best-seller) <a title="book" href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1223960343&amp;sr=1-1" target="_self">book</a> called “Design Patterns: Elements of Reusable Object-Oriented Software”, which provides a full set of solutions that address common object-oriented software problems. The solutions are divided in three categories (namely Creational, Structural, and Behavioral), and all of them take advantage of interfaces (holy thing!).</p>
<p>In the next post I’ll illustrate the discussion using a graphical, concrete example. Cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2008/10/14/the-object-orientations-worst-enemy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone Development Rants</title>
		<link>http://www.mihswat.com/2008/10/06/iphone-development-rants/</link>
		<comments>http://www.mihswat.com/2008/10/06/iphone-development-rants/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 09:03:02 +0000</pubDate>
		<dc:creator>Chester do Nascimento</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.mihswat.com/?p=25</guid>
		<description><![CDATA[When we talk about Apple, mankind is pretty much divided into three camps: lovers, haters and developers. Seriously, I never thought the day would come when I&#8217;d say such a thing, but the fact is: Apple needs the other Steve. No, not Woz (he is on-and-off there, but that&#8217;s another story). I mean our our [...]]]></description>
			<content:encoded><![CDATA[<p>When we talk about Apple, mankind is pretty much divided into three camps: lovers, haters and developers. Seriously, I never thought the day would come when I&#8217;d say such a thing, but the fact is: Apple needs the other Steve. <span id="more-25"></span>No, not <a href="http://www.woz.org/">Woz</a> (he is on-and-off there, but that&#8217;s another story). I mean our our sweaty, chair-throwing, monkey-dancer friend Steve Ballmer:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="src" value="http://www.youtube.com/v/ftsByyqazF0&amp;hl=en&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/ftsByyqazF0&amp;hl=en&amp;fs=1" allowfullscreen="true"></embed></object></p>
<p>You can say anything you want about Microsoft &#8211; but one thing is undeniably true: they treat third-party developers as their most valuable resource. Since the first ages of 16-bit Windows consolidation, it was clear that as long as their platform was the mainstream software-running machine (and the minimum bar for hardware support in the PC world), their reign would be safe.</p>
<p>And that translates into treating their developers well. Yes, they have to pay some fees here and there, but they are rarely left behind. <a href="http://msdn.microsoft.com">MSDN</a> and <a href="http://blogs.msdn.com/oldnewthing/default.aspx">competent MS staff</a> reveal all you need to know to develop any sort of application for Windows; backwards compatibility is taken to extremes; and all sorts of developers (from corporate form cut-and-pasters to low-level hackers) are treated as first-class citizens.</p>
<p>In contrast, no matter how sexy the platforms are that Apple makes available for your software to run on, they make it painstakingly clear that users are number one. Cupertino doesn&#8217;t mind at all if a tiny minor new feature creates one or a dozen <a href="http://blog.wired.com/gadgets/2008/07/interview-brent.html">hurdles</a> for developers every other week. This is not &#8220;right&#8221; or &#8220;wrong&#8221; (and both approaches have shown their results), but it <strong>is</strong> something to be aware of when you consider developing for an Apple platform.</p>
<p>This was not seen as much of a problem for most developers, since Apple has always been a niché market (even with Mac OS X putting the Macintosh onto the radar for people outside the Mac cult). However, January 2007 saw the announcement of the iPhone, and since then the handset has received  pretty much all types of review &#8211; from the Apple fanboy praise (blind to the most obvious flaws and limitations) to the most radical states of denial that ignore the (r)evolutionary aspects of the platform.</p>
<p>In the end, however, the number of iPhones on the market (no one has the exact real number, but it can be extrapolated to be at least 4 million after the worldwide 3G expansion) was the only important thing for developers &#8211; those numbers turn it into a big enough market to be considered by anyone that wants to deploy sophisticated mobile software applications.</p>
<p>(J2ME possibly beats those numbers, but having a unified platform for development is an advantage that Jobs has pushed since the early days of the first Macintosh &#8211; even <a href="http://folklore.org/StoryView.py?project=Macintosh&amp;story=Diagnostic_Port.txt">when it was almost against common sense</a>).</p>
<p>Development was not allowed by Apple during the first year of the iPhone&#8217;s existence, but developers found ways to bend the rules, using <a href="http://code.google.com/p/iphone-dev/">alternative ways</a> to build their apps. Distribution was, however, the main hurdle: users needed to &#8220;jailbreak&#8221; their devices to get applications via alternative channels such as <a href="http://iphone.nullriver.com/beta/">Installer.app</a> (a simple, yet fragile distributed system) and <a href="http://www.saurik.com/id/1">Cydia</a> (a wrap-up of the <a href="http://en.wikipedia.org/wiki/Advanced_Packaging_Tool">apt</a> distribution system, which is one of the backbones of software distribution in the Linux world).</p>
<p>The introduction of the App Store (Apple&#8217;s official distribution system) changed the landscape, not only by introducing a legal (and ubiquitous) alternative for developers to distribute apps, but also by giving them a nice opportunity to piggyback on iTunes as a distribution channel. This approach of not having a middle man is an enabling factor for thousands of small-scale developers: one little dirty secret of the mobile application world is that mobile operators (which own the distribution and revenue channel) rarely talk to small developers &#8211; they have to market their apps by means of &#8220;publishers&#8221;, which pretty much stifle innovation and initiative in this field.</p>
<p>Even if you want to distribute your application for free, there are operators and handset makers that will make it hard (if not impossible) for users to download your app or transfer it via Bluetooth from other devices. Apple&#8217;s App Store distributes free content for free (well, you have to pay $99 for the iPhone Developer Membership, but it&#8217;s a fixed, once-off cost).</p>
<p>It&#8217;s not all roses, however: Apple imposes all sorts of restrictions &#8211; ranging from technical ones (you can&#8217;t let an application do background processing) to operational (registration as a developer takes some time to be processed; your app can&#8217;t duplicate functions on Apple&#8217;s apps; if they don&#8217;t like it you are out; you must submit source code to their approval, and nobody knows for sure <a href="http://diveintomark.org/archives/2008/03/07/iphone-gpl">how compatible with licenses such as GPL</a> their model is). Besides that, the code signing process can be a burden to developers not used to it (even if you decide to <a href="http://www.saurik.com/id/8">ignore Apple</a> and limit yourself to jailbroken iPhones).</p>
<p>It is a &#8220;my way or the highway&#8221; situation &#8211; but recently the first handset with Android (Google&#8217;s operating system for mobiles) <a href="http://www.alleyinsider.com/2008/9/live-google-unveils-android-gphone-g1-goog-">hit the market</a>. Some consider it underpowered, but others are excited by the <a href="http://www.youtube.com/watch?v=CO7Yxyux1_k&amp;feature=related">tricks</a> it has on its own (while some even <a href="http://blog.wired.com/gadgets/2008/09/g1-android-phon.html">question</a> its openness). It is a welcome addition not only for users/developers who won&#8217;t be interested on Apple&#8217;s offerings, but also gives iPhonophiles the hope that competition will put some pressure on the Big Cupertino Brother to force it to relinquish some of the grip it has on the market.</p>
<p>I have high hopes that this will happen. But even if it doesn&#8217;t, it won&#8217;t stop a legion of developers (myself included) from working working on my $0.99 app, in the hopes that will be useful for one million people &#8211; and that its success will contribute to their own retirement. That is a really hard argument to beat, and it will keep the iPhone going for a long time. But unless we start to see some retired iPhone Developers on their yachts, Apple would do themselves a favor by treating iPhone developers a little bit better &#8211; or they will jump ship at the first opportunity &#8211; be their destination may be Android or otherwise.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mihswat.com/2008/10/06/iphone-development-rants/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
