<?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>Peter Martin</title>
	<atom:link href="http://blogs.adobe.com/pmartin/feed" rel="self" type="application/rss+xml" />
	<link>http://blogs.adobe.com/pmartin</link>
	<description>TECHNOLOGY &#38; EXPERIENCE INNOVATION</description>
	<lastBuildDate>Tue, 03 Jan 2012 16:36:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>My blog has moved</title>
		<link>http://blogs.adobe.com/pmartin/2012/01/my-blog-has-moved.html</link>
		<comments>http://blogs.adobe.com/pmartin/2012/01/my-blog-has-moved.html#comments</comments>
		<pubDate>Tue, 03 Jan 2012 16:36:18 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/?p=87</guid>
		<description><![CDATA[I&#8217;ve been working on a new blog called Experience Craftsmanship. For here on in that&#8217;s where I will be blogging, so jump over and join me there.]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been working on a new blog called <a href="http://experiencecraftsmanship.com">Experience Craftsmanship</a>. For here on in that&#8217;s where I will be blogging, so jump over and join me there.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2012/01/my-blog-has-moved.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MAX 2010 &#8211; Day 1 &#8211; It&#8217;s all about the screen</title>
		<link>http://blogs.adobe.com/pmartin/2010/10/max-2010-day-1-its-all-about-the-screen.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/10/max-2010-day-1-its-all-about-the-screen.html#comments</comments>
		<pubDate>Tue, 26 Oct 2010 15:50:05 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[MAX]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/?p=83</guid>
		<description><![CDATA[It&#8217;s all about the screen. There is an explosion of new devices and screens. The desktop, phone, tablet and TV. Multiply that by the various screen sizes and we have a challenge confronting us, but the opportunity for innovation is &#8230; <a href="http://blogs.adobe.com/pmartin/2010/10/max-2010-day-1-its-all-about-the-screen.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s all about the screen. There is an explosion of new devices and screens. The desktop, phone, tablet and TV. Multiply that by the various screen sizes and we have a challenge confronting us, but the opportunity for innovation is endless. Specifically, it is interesting to see the various tablets coming on to the market and the different screen sizes. Who got it right or is there room for a range of sizes?</p>
<p>I am blown away by how well Adobe is positioned to own the screen. Flash really is everywhere. The product team has done a tremendous job making it available on all these devices and  adapting and optimizing it for the hardware.</p>
<p>Where&#8217;s there is Flash there is AIR. If Flash is our trojan horse then AIR is our army. Its ever expanding APIs make it easy to develop applications that are specific for the device by allowing us to leverage their individual capabilities.</p>
<p>It&#8217;s just so easy!</p>
<p>You can start building multi-screen applications today by downloading <a href="http://labs.adobe.com/technologies/flashbuilder_burrito/">Flash Builder &#8220;Burritto&#8221;</a>. </p>
<p>There are also significant improvements for designer-developer workflow, which you can use in <a href="http://labs.adobe.com/technologies/flashcatalyst_panini/">Flash Catalyst &#8220;Panini&#8221;</a>. </p>
<p>. </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/10/max-2010-day-1-its-all-about-the-screen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My First Mosaic Application</title>
		<link>http://blogs.adobe.com/pmartin/2010/10/my-first-mosaic-application.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/10/my-first-mosaic-application.html#comments</comments>
		<pubDate>Sat, 16 Oct 2010 00:25:06 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[Mosaic]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/2010/10/my-first-mosaic-application.html</guid>
		<description><![CDATA[Adobe LiveCycle Mosaic is a recent addition to the LiveCycle family that offers some interesting possibilities in the enterprise. As many of us experience when developing large enterprise applications we need to start thinking about modularization for performance or to &#8230; <a href="http://blogs.adobe.com/pmartin/2010/10/my-first-mosaic-application.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Adobe LiveCycle Mosaic is a recent addition to the LiveCycle family that offers some interesting possibilities in the enterprise. As many of us experience when developing large enterprise applications we need to start thinking about modularization for performance or to segment the application to allow  development teams to work on independent areas.</p>
<p>To get an application in to production for the first time requires a lot of resources, especially if compliance is required, for example FDA software validation.  However, we rarely stop once the application go-lives. We want to release new features and modules, but we don&#8217;t want to re-test the whole application. There is a new version of the Flex SDK that we want to use, but we don&#8217;t want to migrate the entire codebase. So we think about using the Marshall Plan.</p>
<p>We are dealing with a lot of complexity and big architectural decisions. Mosaic helps to remove the complexity by providing an application framework for building and deploying composite applications.&#160;It&#160;also provides tooling for Flash Builder to improve developer productivity.</p>
<p>What follows is three steps to walk you through building your first Mosaic application. From there you can  explore Mosaic in more depth so you can start using it as part of your enterprise architecture for building scalable and extensible Rich Internet Applications (RIAs).</p>
<h2><strong>Prerequisites</strong></h2>
<ul>
<li>Flash Builder 4 (I recommend using the Eclipse plugins with Eclipse for Java EE Developers)</li>
<li>Apache <a href="http://ant.apache.org/">Ant</a>		    </li>
</ul>
<h2><strong>Step 1: Getting Mosaic running</strong></h2>
<ul>
<li><a href="http://www.adobe.com/devnet/livecycle/trial.html">Download</a> the Mosaic trial</li>
<li>Extract the Mosaic download (if not auto extracted)</li>
<li>Open a command prompt and change directory to where you extracted Mosaic (&lt;MOSAIC_HOME&gt;)</li>
<li>Change directory to &lt;MOSAIC_HOME&gt;/standalone</li>
<li>Create a logs directory (e.g. mkdir logs)</li>
<li>Change directory to &lt;MOSAIC_HOME&gt;/standalone/bin</li>
<li>Run startup.sh / startup.bat (if running Mac OS X or Linux you may need to change the permissions on your files &#8211; chmod 755 *.sh)</li>
<li>Start a browser and open <em><strong>http://localhost:8080/mosaic/about</strong></em>, when promoted to log in enter designer/password</li>
<li>If you see the Adobe copyright and Mosaic version then Mosaic is running!</li>
</ul>
<h2><strong>Step 2: Install and run the samples</strong></h2>
<ul>
<li>At the command prompt change directory to &lt;MOSAIC_HOME&gt;/samples</li>
<li>Run ant (enter <strong>ant</strong> at the command line)</li>
<li>Ant should run for ~9 seconds and you should see BUILD SUCCESSFUL</li>
<li>In your browser open <em><strong>http://localhost:8080/mosaic/#/applications/Basic</strong></em><strong></strong></li>
<li>You should see your first Mosaic application</li>
<li>Now try the AIR client, run &lt;MOSAIC_HOME&gt;/bin/release/Mosaic.air</li>
<li>Take the time to explore the other samples, the table at the bottom of <a href="http://help.adobe.com/en_US/LiveCycleMosaic/9.0/getStart/WSc07293f6c9641ff71d48961e1240b65ecdd-8000.html">this</a> page has all the URLs</li>
</ul>
<h2><strong>Step 3: Build your first Mosaic application</strong></h2>
<ul>
<li><a href="http://labs.adobe.com/technologies/lcmplugin/">Download</a> the Mosaic ES2 plugin for Flash Builder 4</li>
<li>Start Flash Builder (Eclipse)</li>
<li>Go to <em><strong>Help &gt; Install New Software&#8230;</strong></em><strong></strong></li>
<li>Press the <strong><em>Add&#8230;</em></strong> button</li>
<li>Enter a name e.g. Mosaic</li>
<li>Press the <strong>Local&#8230;</strong> button and select the folder containing your Mosaic plugin folder (assuming your download was auto extracted) </li>
</ul>
<p><img src="http://blogs.adobe.com/pmartin/files/2010/10/Screenshot2010-10-15at3.51.54PM.png" width="484" height="193"></p>
<ul>
<li>Press the <strong><em>OK</em></strong> button</li>
<li>Check <em><strong>Adobe LiveCycle RIA Tooling</strong></em></li>
</ul>
<p><em><strong><img src="http://blogs.adobe.com/pmartin/files/2010/10/Screenshot2010-10-15at4.00.10PM.png" width="630" height="455"></strong></em></p>
<ul>
<li>Press the Next<em><strong></strong></em> button and follow the wizard to install the plugin</li>
<li>Create a new Flex Application (<em><strong>File &gt; New &gt; Flex Project</strong></em>)</li>
<li>Create a new MXML Tile (<em><strong>File &gt; New &gt; MXML Tile</strong></em>)</li>
</ul>
<p><img src="http://blogs.adobe.com/pmartin/files/2010/10/Screenshot2010-10-15at4.08.47PM.png" width="478" height="340"></p>
<ul>
<li>Press the <em><strong>Finish</strong></em> button</li>
<li>When prompted to <strong><em>Confirm Project Changes</em> </strong>press the <em><strong>Yes</strong></em> button</li>
</ul>
<p><img src="http://blogs.adobe.com/pmartin/files/2010/10/Screenshot2010-10-15at4.10.03PM.png" width="483" height="292"></p>
<ul>
<li>Update your tile to show the obligatory Hello World:</li>
</ul>
<p><img src="http://blogs.adobe.com/pmartin/files/2010/10/Screenshot2010-10-15at4.21.53PM.png" width="558" height="211"></p>
<ul>
<li>Open the Run Configurations (<em><strong>Run &gt; Run Configurations&#8230;</strong></em>)</li>
<li>Select <em><strong>Mosaic Launcher</strong></em></li>
<li>Press the <em><strong>New</strong></em> button</li>
<li>Make sure your Project and Tile are selected</li>
</ul>
<p><img src="http://blogs.adobe.com/pmartin/files/2010/10/Screenshot2010-10-15at4.38.15PM.png" width="630" height="567"></p>
<ul>
<li>You should now see your first Mosaic application!</li>
<li>You will find more details of using the plugin and debugging <a href="http://download.macromedia.com/pub/labs/lcmplugin/lcmplugin_gettingstarted.pdf">here</a></li>
</ul>
<h2>Additional Resources</h2>
<ul>
<li><a href="http://www.adobe.com/products/livecycle/mosaic/">Adobe LiveCycle Mosaic home page</a></li>
<li><a href="http://help.adobe.com/en_US/LiveCycleMosaic/9.0/getStart/index.html">Adobe LiveCycle Mosaic 9.5 Help</a></li>
<li><a href="http://www.adobe.com/products/livecycle/pdfs/mosaic_portfolio.pdf">Adobe LiveCycle Mosaic portfolio</a> (which includes a technical guide)</li>
<li><a href="http://blogs.adobe.com/livecycledocs/2009/12/livecycle_mosaic_es2_ships.html">Adobe LiveCycle Mosaic ships blog</a> (which includes other getting started resources)</li>
<li><a href="http://blogs.adobe.com/LiveCycleMosaicTeam/">Adobe LiveCycle Mosaic Team blog</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/10/my-first-mosaic-application.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe wins Blue Button through User Experience</title>
		<link>http://blogs.adobe.com/pmartin/2010/10/adobe-wins-blue-button-through-user-experience.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/10/adobe-wins-blue-button-through-user-experience.html#comments</comments>
		<pubDate>Wed, 13 Oct 2010 19:20:54 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/?p=58</guid>
		<description><![CDATA[The Adobe User Experience team created the vision demo that won the Blue Button challenge for managing health records. You can read more about Adobe and Blue Button here.]]></description>
				<content:encoded><![CDATA[<p>The Adobe User Experience team created the vision demo that won the Blue Button challenge for managing health records.</p>
<p><a class="lightbox"  title ="Adobe Blue Button" href="http://blogs.adobe.com/pmartin/files/2010/10/Screen-shot-2010-10-13-at-11.48.35-AM.png"><img src="http://blogs.adobe.com/pmartin/files/2010/10/Screen-shot-2010-10-13-at-11.48.35-AM-300x182.png" alt="" title="Adobe Blue Button" width="300" height="182" class="aligncenter size-medium wp-image-59" /></a></p>
<p>You can read more about Adobe and Blue Button <a href="http://blogs.adobe.com/adobeingovernment/2010/10/adobe-wins-top-honors-for-the-v-a-blue-button-solution-for-health-records.html">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/10/adobe-wins-blue-button-through-user-experience.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LCDS Security</title>
		<link>http://blogs.adobe.com/pmartin/2010/10/lcds-security.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/10/lcds-security.html#comments</comments>
		<pubDate>Wed, 13 Oct 2010 17:50:14 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[LCDS]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/?p=44</guid>
		<description><![CDATA[Every major release of LCDS goes through an external security audit, you can view the report in the LCDS product PDF portfolio (the portfolio also includes a great performance brief). The LCDS attack surface is very small, but there are &#8230; <a href="http://blogs.adobe.com/pmartin/2010/10/lcds-security.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Every major release of LCDS goes through an external security audit, you can view the report in the LCDS product PDF <a href="http://www.adobe.com/products/livecycle/pdfs/data_services_portfolio.pdf">portfolio</a> (the portfolio also includes a great performance brief).</p>
<p>The LCDS attack surface is very small, but there are a number of things to consider:</p>
<ul>
<li>Use AMF in production (also consider AMF for performance as it is better at handling large complex Object graphs).</li>
<li>If you are using AMFX use LCDS 3.1, which fixes a number of known XML vulnerabilities. If you are unable to upgrade to LCDS 3.1 then you should apply <a href="http://www.adobe.com/support/security/bulletins/apsb10-05.html ">this</a> security patch.</li>
<li>Use secure channels (refer to <a href="http://help.adobe.com/en_US/LiveCycleDataServicesES/3.1/Developing/lcds31_using.pdf">Using LiveCycle Data Services ES2 Version 3.1</a>).</li>
<li>If you are using the proxy service then secure it as per  <a href="http://www.gdssecurity.com/l/b/2010/03/17/penetrating-intranets-through-adobe-flex-applications/ ">this</a> post.</li>
<li>If you are concerned about XSS attacks then validate incoming client data using a custom queue processor (refer to <a href="http://help.adobe.com/en_US/LiveCycleDataServicesES/3.1/Developing/lcds31_using.pdf">Using LiveCycle Data Services ES2 Version 3.1</a>).</li>
<li>Try to ensure end users are on the latest Flash player.</li>
<li>Ensure RDS is not enabled in production (comment out the RDSDispatchServlet in web.xml).</li>
<li>Make sure your app server is secure per best practices of the vendor (you should also look at <a href="http://help.adobe.com/en_US/livecycle/es/securityHardening.pdf">Hardening and Security for LiveCycle ES</a>, which provides some general recommendations).</li>
</ul>
<p>There are a number of useful resources that discuss securtiy:</p>
<ul>
<li><a href="http://www.adobe.com/devnet/flex/articles/flex_enterprise_security.html">Enterprise security for Flex</a></li>
<li><a href="http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps.html">Creating more secure SWF web applications</a></li>
<li><a href="http://www.owasp.org/index.php/Category:OWASP_Flash_Security_Project ">OWASP Flash Security Project</a></li>
<li><a href="http://www.adobe.com/content/dam/Adobe/en/devnet/flashplayer/pdfs/flash_player_10_security.pdf">Adobe Flash Player 10 Security</a></li>
<li><a href="http://help.adobe.com/en_US/air/html/security/air_html_security.pdf">Adobe AIR HTML Security</a></li>
</ul>
<p>The following tools can be used to help find and fix security vulnerabilities:</p>
<ul>
<li><a href="http://www-01.ibm.com/software/awdtools/appscan/">IBM Rational AppScan</a></li>
<li><a href="https://h30406.www3.hp.com/campaigns/2009/wwcampaign/1-5TUVE/index.php?key=swf">HP SWFScan</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/10/lcds-security.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clean Code Starts in Sprint 1</title>
		<link>http://blogs.adobe.com/pmartin/2010/03/clean_code_star.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/03/clean_code_star.html#comments</comments>
		<pubDate>Tue, 30 Mar 2010 20:53:09 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[clean_code]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/2010/03/clean_code_star.html</guid>
		<description><![CDATA[From my experience whatever you do in Sprint 1 dictates the success of your project. If you opt for a running start and ignore practices such as TDD, Pair Programming, Automation, and Refactoring then your velocity won&#8217;t account for them. &#8230; <a href="http://blogs.adobe.com/pmartin/2010/03/clean_code_star.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>From my experience whatever you do in Sprint 1 dictates the success of your project. If you opt for a running start and ignore practices such as TDD, Pair Programming, Automation, and Refactoring then your velocity won&#8217;t account for them. You face a similar challenge if you have a herculean Sprint 1. Whatever you do sets an expectation with the customer &#8211; the velocity achieved in Sprint 1 sets an expectation of what can be achieved in future Sprints. It is incredibly difficult to reset that expectation as your velocity will dip if you decided to start Refactoring or doing TDD or working a 40 hour week.</p>
<p>As professionals we have a responsibility to write clean code from the start. The customer may feel we are moving slowly but we are investing in the future maintainability of the software. Through TDD we are building testable software and providing the team with the confidence to Refactor. In turn Refactoring allows us to evolve our design so they remains simple. The story is similar for the other practices of professional software engineering.</p>
<p>As the software grows the teams has pride in the software they are engineering. The quality is high and its easy to change the software as new requirements are implemented. In the end customer satisfaction is high, why wouldn&#8217;t you practice TDD and Refactoring from day-1?</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/03/clean_code_star.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use of Stage Events</title>
		<link>http://blogs.adobe.com/pmartin/2010/03/use_of_stage_ev.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/03/use_of_stage_ev.html#comments</comments>
		<pubDate>Wed, 10 Mar 2010 11:46:55 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[removedfromstage addedtostage stage]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/2010/03/use_of_stage_ev.html</guid>
		<description><![CDATA[**The Problem** I was recently asked to look at an application problem around stage events. The problem we were seeing is when the application was resized the **removedFromStage** event and the **addedToStage** event were being fired. This was causing unexpected &#8230; <a href="http://blogs.adobe.com/pmartin/2010/03/use_of_stage_ev.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>**The Problem**<br />
I was recently asked to look at an application problem around stage events. The problem we were seeing is when the application was resized the **removedFromStage** event and the **addedToStage** event were being fired. This was causing unexpected behavior in the application as there was application logic attached to these events.</p>
<p><span id="more-41"></span><br />
**The Cause**When the application is started in its default size there are no scrollbars. If the user resizes the application to be smaller then scrollbars are added. If you look in the **Container** class there is a function called **createContentPane()**. This function is called prior to adding the scrollbars. Its responsibility is to create a content pane (a **FlexSprite**). When it creates the content pane it reparents all the children i.e. it adds each child to the content pane and then tells the child that its parent has changed by calling **parentChanged()**. The net result is we see **removedFromStage** and **addedToStage** fired. On subsequent resizing the content pane remains, once it is created it is never removed or recreated.**Workarounds**I found a couple of workarounds. The first is to put a guard condition in your event handlers for the **removedFromStage** event and the **addedToStage** event. The guard condition can check the **creatingContentPane** property on the parent Container.The second workaround is to create the content pane up-front. The **createContentPane()** function is in **mx_internal** namespace so you can override **createChildren()** on the Container and call **createContentPane()**.The downside to creating the content pane up-front is you will increase the memory footprint, the size of this increase will depend on the size of your application.**Recommendations**My recommendation would be to discourage attaching logic to the **removedFromStage** event and the **addedToStage** event. As was shown here they weren&#8217;t expected on resize and unexpected behavior was introduced in to the application. There are workarounds but you need to consider how you enforce the workaround within the team. If you can&#8217;t enforce them, then don&#8217;t do it.**Test Harness**For the purpose of understanding the behavior and testing the workaround I created the following test harness.
<pre><code>=</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/03/use_of_stage_ev.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Come work for Adobe</title>
		<link>http://blogs.adobe.com/pmartin/2010/03/come_work_for_a.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/03/come_work_for_a.html#comments</comments>
		<pubDate>Fri, 05 Mar 2010 12:43:31 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[jobs adobe flex livecycle]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/2010/03/come_work_for_a.html</guid>
		<description><![CDATA[This is a really exciting year for Adobe Professional Services as we are growing! We are building out a Solution Center in San Jose, which requires a team of talented Software Engineers and Quality Engineers. You will be part of &#8230; <a href="http://blogs.adobe.com/pmartin/2010/03/come_work_for_a.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>This is a really exciting year for Adobe Professional Services as we are growing! We are building out a Solution Center in San Jose, which requires a team of talented Software Engineers and Quality Engineers. You will be part of a co-located team in a fantastic office space that has been purposely designed to foster teaming and collaboration. You will get the opportunity to work on some of the most exciting and challenging projects that fuse user-experience design with great technology implementation. During my time at Adobe I have had the opportunity to work on projects for clients such as NATO where we built a Mission Support System for AWACS that supports the real-time synchronization of map data.</p>
<p><span class="mt-enclosure mt-enclosure-image"><img class="mt-image-none" src="http://blogs.adobe.com/pmartin/images/screenshot.png" alt="screenshot.png" width="504" height="341" /></span></p>
<p>If you are a talented software craftsman who has a strong background in enterprise software engineering then we want to hear from you. There is no prerequisite to know Adobe&#8217;s technology, although it would be nice, if you are steeped in OO and advocate practices such as Test Driven Development and Refactoring then we will train you in Flex/AIR, LiveCycle Data Services and LiveCycle ES.</p>
<p>We also want to hear from you if you are a leader in Quality Engineering, we need people who can lead the team on process and practice. Ideally you will have strong hands-on experience of all aspects of Quality Engineering such as black-box testing, white-box testing, automation, performance testing and load testing.</p>
<p>In both the above roles a working knowledge of Scrum is a huge plus.</p>
<p>If you want to be part of our team then drop an email to &#8220;pmartin@adobe.com&#8221;:mailto:pmartin@adobe.com.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/03/come_work_for_a.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The pyramid approach to quality software</title>
		<link>http://blogs.adobe.com/pmartin/2010/03/the_pyramid_app.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/03/the_pyramid_app.html#comments</comments>
		<pubDate>Wed, 03 Mar 2010 07:46:46 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/2010/03/the_pyramid_app.html</guid>
		<description><![CDATA[**Introduction** I recently read a blog post from Mike Cohn on &#8220;The Forgotten Layer of the Test Automation Pyramid&#8221;:http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid. I thought this was a great way to conceptualize the different forms of testing and their combined value. **Unit Testing**Unit testing &#8230; <a href="http://blogs.adobe.com/pmartin/2010/03/the_pyramid_app.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>**Introduction**</p>
<p>I recently read a blog post from Mike Cohn on &#8220;The Forgotten Layer of the Test Automation Pyramid&#8221;:http://blog.mountaingoatsoftware.com/the-forgotten-layer-of-the-test-automation-pyramid. I thought this was a great way to conceptualize the different forms of testing and their combined value.</p>
<p><span id="more-39"></span><br />
**Unit Testing**Unit testing is your foundation for quality, it requires pragmatism and you don&#8217;t need a 100% coverage for it to make a difference. I have also found from my own experience it is not necessarily about catching bugs in the future (which it does help) but more about driving out good design and giving engineers the confidence to refactor in the future. Don&#8217;t underestimate the value in the latter point, you wrote the code so you understand it, but will someone joining the project in 6 months time have the confidence to change your code?**Integration Testing**The next layer up is integration testing. Before I go any further I want to interject at this point and briefly discuss semantics. A unit test should test the smallest possible piece of software, normally a single class, without any dependancies. An integration test should test a component or a service with its dependancies, for example a call to a remote service or a local database. I tend to reserve integration tests for when there is an infrastructure dependancy. My preference is also to differentiate between the two and put them under different source packages. The intent is different so be explicit.Back on subject. I have found integration tests to be invaluable. They provide you with a huge amount of confidence if you can test a call to a service and assert the expected result. It also helps problem determination if you can isolate the data tier of your application and run the integration test suite. There is a higher cost to integration testing though. The actual test in itself is often easier to write than a unit test, but their dependancies, set-up and tear-down introduce complexity. For example, consider a call to the database, for the test to be repeatable you need to start with a known state, when you complete you need to revert back to that state. You also find your tests are more susceptible to the order in which they run. For example, what if I have a service for creating a user, another for adding a project and third for permissions on a project. You will need to run them in that sequence if they are going to pass. Take a look at the &#8220;Cairngorm Persitence Library&#8221;:http://opensource.adobe.com/wiki/display/cairngorm/How+to+Use+the+Cairngorm+Persistence+Library for an example of unit tests and integration tests.**Functional Testing**The top of the pyramid is functional testing. If we can automate our functional tests we have huge opportunity to quickly assert the system is working as expected and to catch bugs early.  Functional testing requires a lot of manual effort and time from a Quality Engineering team. If we can automate we get a payback on that effort and are able to reduce the testing cycle. When investing in functional testing is also worth considering the customer satisfaction. I am sure we have all been in the position where we deliver a working feature only for it to break it in the next release. This often erodes confidence with the customer who can&#8217;t understand why you broke something that was previously working. If we have a repeatable mechanism for running our test suite we can apply a consistent level of testing. The downside to functional testing is typically the cost, the tooling costs (although there are opensource alternatives) and there is the investment in time. I would encourage all projects to invest in functional testing from day-1. Too many projects don&#8217;t start with automated functional testing as &#8220;they don&#8217;t have enough time&#8221;. As they reach a critical mass of functionality the value becomes apparent and they do a u-turn. At this stage you are playing catch-up and it difficult to realize the value &#8211; it&#8217;s often too late. Quality is an investment. Your velocity will be slower at the start but you will gain momentum and you will see payback in terms of effort, a reduction in defects, higher quality and ultimately a happier customer.**Summary**High quality comes from a strategy that combines unit testing, integration testing and functional testing. Doing one on its own doesn&#8217;t assure quality. 100% test coverage comes the aggregate.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/03/the_pyramid_app.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design by Contract</title>
		<link>http://blogs.adobe.com/pmartin/2010/03/design_by_contr.html</link>
		<comments>http://blogs.adobe.com/pmartin/2010/03/design_by_contr.html#comments</comments>
		<pubDate>Tue, 02 Mar 2010 10:27:30 +0000</pubDate>
		<dc:creator>Peter Martin</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[dbc design_by_contract assert]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/pmartin/2010/03/design_by_contr.html</guid>
		<description><![CDATA[I first read about Design by Contract in the book &#8220;Object-Orientated Software Construction by Bertrand Meyer&#8221;:http://www.amazon.co.uk/Object-oriented-Software-Construction-Prentice-Hall-Resource/dp/0136291554/ref=sr_1_1?ie=UTF8&#38;s=books&#38;qid=1219866553&#38;sr=8-1. Chapter 11 discusses Design by Contract: building reliable software: _&#8221;Assertions and the associated concepts, explained in this chapter, provide some of the answers. Although &#8230; <a href="http://blogs.adobe.com/pmartin/2010/03/design_by_contr.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I first read about Design by Contract in the book &#8220;Object-Orientated Software Construction by Bertrand Meyer&#8221;:http://www.amazon.co.uk/Object-oriented-Software-Construction-Prentice-Hall-Resource/dp/0136291554/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1219866553&amp;sr=8-1. Chapter 11 discusses Design by Contract: building reliable software:</p>
<p>_&#8221;Assertions and the associated concepts, explained in this chapter, provide some of the answers. Although not foolproof, the mechanisms presented below provide the programmer with essential tools for expressing and validating correctness arguments. The key concept will be Design by Contract: viewing the relationship between a class and its clients as a formal agreement, expressing each party&#8217;s rights and obligations. Only through such a precise definition of every module&#8217;s claims and responsibilities can we hope to attain a significant degree of trust in large software systems.&#8221;_</p>
<p>I also want to cite another great book that has gained favor with many of my peers, &#8220;Clean Code: A Handbook of Agile Software Craftmanship by Robert C. Martin&#8221;:http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1267554535&amp;sr=8-1. Chapter 7 discusses Error Handling and promotes that we don&#8217;t return null from methods and nor should we pass null to methods as both invite errors. As it says in the book _&#8221;all it takes is one missing null check to send an application spinning out of control&#8221;_.</p>
<p>I first used Design by Contract in the late 90&#8242;s and the results were dramatic. We saw a big improvement in code quality as we were thinking about the contract between a method and its caller. In the Java world we now have a number of mature Design by Contract libraries such as Contract4J. Take a look at it discusses the theory in more detail than I am.</p>
<p>A while back I created an over-simplified library for ActionScript. It&#8217;s really, really simple. There is one main class, Contract, that you can use to assert pre and post-conditions.</p>
<p>It works off a compiler argument (**-define=CONFIG::debugging,true**), for development set it to **true** and your assertions will be checked. For production, set it **false** and your assertions are not checked.</p>
<p>It&#8217;s simple but effective. Download it &#8220;here&#8221;:http://blogs.adobe.com/pmartin/code/Contract.zip.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/pmartin/2010/03/design_by_contr.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
