<?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>FrontEndConsultant.com. Flex Development / Flex Architecture , ExtJS, AngularJS</title>
	<atom:link href="http://frontendconsultant.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://frontendconsultant.com</link>
	<description>Fine UI Craftsmanship</description>
	<lastBuildDate>Mon, 30 Apr 2012 20:18:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Understanding the Viability of the Browser Plugin in a Changing World</title>
		<link>http://frontendconsultant.com/thoughts-on-flash/</link>
		<comments>http://frontendconsultant.com/thoughts-on-flash/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 06:34:15 +0000</pubDate>
		<dc:creator>David Francis Buhler</dc:creator>
				<category><![CDATA[About Me]]></category>

		<guid isPermaLink="false">http://davidbuhler.org/?p=461</guid>
		<description><![CDATA[The Announcement With the recent announcement from Adobe that Flash Player for Mobile Web Browsers would not be further developed, there has been quite a bit of concern among Flash and Flex Developers about the viability of the Flash platform<span class="ellipsis">&#8230;</span> <a href="http://frontendconsultant.com/thoughts-on-flash/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<h3>The Announcement</h3>
<p>With the recent announcement from Adobe that Flash Player for Mobile Web Browsers would not be further developed, there has been quite a bit of concern among Flash and Flex Developers about the viability of the Flash platform moving forward. Companies who have millions invested in Flex Applications are now worried that Adobe may not support Desktop Flash moving forward; leaving these companies with products they won&#8217;t be able to distribute to their customers.</p>
<p>The emerging, long-term concern about Flash Player availability is due to:</p>
<ul>
<li>browser vendors choosing not to support the Flash Plug-in, or&#8230;</li>
<li>Adobe choosing not to evolve the Flash Platform, creating an anemic pool of developer resources, a lack of documentation, tooling, and a lacking eco-system.</li>
</ul>
<p><strong>Customer Reach</strong></p>
<p>How do you reach your customers when you are limited to Desktop and Laptop machines for browser-based Flex applications? While you can create an AIR application to target Mobile Devices, companies now have to  maintain a separate code-base if they need to target smaller Form Factors.</p>
<p>Most companies who need to support multiple Form Factors (Mobile Phones, Tablets and Desktop Browsers) will choose HTML5. <a href="http://pcip.gov/hrip">Public Sector applications</a> will have to move to HTML5 to ensure they can reach as many citizens as possible, including those on the least expensive computers (such as phones and tablets).</p>
<p>Now, forgive me if you stumbled upon my blog with the hopes that I would have something positive to say about Flash on multiple form factors. I remain indifferent about supporting multiple form factors, because most of the projects I work on are monolithic, enterprise applications with highly complex client-side logic. I care most about Doctors and Executives who carry around laptops or sit at their desk entering information into 1000s of fields. I care <a href="http://news.cnet.com/8301-1035_3-20118380-94/mobile-devices-driving-nearly-7-percent-of-web-traffic/" target="_blank">about the traffic</a> that comes primarily from Desktop and Laptop computers My concerns are solely focused on the future of Flash on the Desktop.  And if you share my concerns, stay with me, because I will propose what I believe is the biggest factor that contributes to the staying power of Flash in the Browser.</p>
<p>Before we begin, let&#8217;s begin by talking about why I don&#8217;t want to become an HTML5/Javascript developer. Let&#8217;s talk about why I&#8217;m fighting what others suggest is a <em>natural</em> evolution:</p>
<h3>The Career Impacts of moving to HTML5 from Flex</h3>
<p>As a Flex Developer, I have my own concerns about moving to HTML5. While Actionscript and Javascript both descended from the same EcmaScript standard, Actionscript surpassed Javascript by offering a static, compile-time language that grew more robust than it&#8217;s sister (picture, if you will, Marcia Brady vs. Jan Brady, first, as infants, and then as we remember them best).</p>
<p>Actionscript offered accessor types, packages / namespaces, and strong-typing. The aforementioned are important when you&#8217;re building Object-Oriented, scalable, monolithic enterprise software.</p>
<p>Most organizations (and I do mean most), would prefer to add less-experienced, less-OOP-centric, less-expensive labor to a large project. It&#8217;s not usually by choice, either. As a manager, I learned that it was often a necessity to add low-talent labor because it&#8217;s <em>really</em> difficult to find senior developers and architects for the client-side of an enterprise stack. The senior developers and architects you do find are often unlikely to show any enthusiasm for building cutting edge technologies that offer magazine layouts, smooth transitions, video, and the visual feedback that drive the user to the conversion goal your marketing people have been focused on for the quarterly sales-goal (sounds a little clinical, doesn&#8217;t it?).</p>
<p>HTML5, and some of the beautiful libraries like EXT and JQuery, offer companies choice and flexibility, not just choice in how their products are distributed, but also in terms of their labor-pool.</p>
<p>As a Software Engineer, moving to a dynamic, typeless, non-object oriented language, with a lower barrier of entry, I&#8217;d be facing competition from a greater number of less experienced developers, with less applicable enterprise experience (a greater language divide between the Java Developers and Client-side developers). I&#8217;d be working in a larger team of client-side developers,  with more hands in the cookie-jar, more opinions, more coding styles, and less ownership over key decisions. I&#8217;d make less money. I&#8217;d have less influence. I&#8217;d enjoy my job less.</p>
<h2>Understanding the Future</h2>
<h3>HTML5. The Great Equalizer of Public Perceptions</h3>
<p>One of the current hopes is that the death of Flash will bring about a more civilized Web. A web where advertisements with animations no longer distract and taunt the user. Once the web matures and more people have browsers capable of supporting HTML5, the advertisements that intrude on the user-experience with videos and animations will move to HTML5. Some tools, such as <a href="http://labs.adobe.com/technologies/edge/" target="_blank">Adobe Edge</a> and <a href="http://developer.apple.com/iad/iadproducer/" target="_blank">Apple&#8217;s iAd Producer</a>, will help designers at ad agencies to create Flash-Like ads in HTML5. The annoying YouTube videos with ads that disrupt your favorite Top Gear clips will move to HTMl5, and come with advertisements as well. I mention this not to detract from everything HTML5 will offer, but to remind Flash Developers that the great equalizer is upon us: The loathing of Flash among the general public will lessen when HTML5 offers the distractions and annoyances that people associate with Flash in general.</p>
<h3>What is the Future of Flash as a Browser Plug-in?</h3>
<p>It&#8217;s hard to imagine companies investing in a platform for large, transactional applications when there&#8217;s always an underlying concern about plug-in Support from the Browser vendors. Adobe is taking the right approach by trying to create public demand for the Flash Player by offering a compelling web-platform for gaming. Mozilla is looking to <a href="https://wiki.mozilla.org/Paladin" target="_blank">provide a 3D gaming platform</a> as well, which suggests Mozilla believes the Desktop market will continue to stay a dominant player in gaming. With Adobe&#8217;s move to a <a href="http://labs.adobe.com/technologies/flashplatformruntimes/flashplayer11-2/" target="_blank">multi-threaded video player</a>, support for <a href="http://www.engadget.com/2011/10/03/flash-11-and-air-3-landing-tonight-and-delivering-7-1-surround-s/" target="_blank">Dolby 7.1</a>, and <a href="http://www.adobe.com/products/flashaccess/" target="_blank">improvements to their DRM</a>, they are likely to remain a dominant force in video-delivery, and likely to grow their share of the gaming market on the Desktop. <a href="http://www.hbogo.com/" target="_blank">Content distributors </a>wo want to <a href="http://www.hulu.com/" target="_blank">control their content</a> and offer an excellent experience will continue to use Adobe Flash.</p>
<p>So, Adobe has helped to ensure there&#8217;s likely to be consumer demand. But the viability of the Plug-in depends on far more than just great gaming and video. Ensuring Browser vendors and Operating System vendors continue to support Flash is crucial, and many developers and companies are now anxious that Apple might not support Flash on OSX going forward, and there&#8217;s concern about the long-term accessibility of Flash on the well-reviewed Windows 8, since Flash will not be accessible on Metro (although the Flash plug-in will still be accessible on Windows 8 through Internet Explorer).</p>
<h3>What is the Future of the Enterprise Client-Side Platform?</h3>
<p>A few languages have emerged that emulate Java and Actionscript. These languages offer a strongly-typed approach to development, and they try to cover for various browser quirks. <a href="http://code.google.com/webtoolkit/overview.html" target="_blank">Google&#8217;s GWT</a> and <a href="http://jashkenas.github.com/coffee-script/" target="_blank">CoffeeScript</a> are two such examples. GWT allows you to write client-side code in Java that gets compiled down to Javascript. There are frameworks emerging that allow Enterprise developers to create HTML5 projects with greater ease. If you&#8217;re an Enterprise Flex Developer, looking for an alternative, some alternatives exist. Since these languages compile down into HTML5, developers can build <span style="text-decoration: underline;"><em>relatively</em></span> complex client-side software, and deploy to multiple operating systems and form-factors.</p>
<p>So, given solid alternatives to Flex for building robust, client-side software, and the probability that HTML5 will eventually catch-up to Flash in terms of 3D Gaming, DRM, and High-Quality Video delivery, it&#8217;s only a matter of time before the Browser plug-in is axed, right?</p>
<p>Maybe. But there&#8217;s one more, long-term hope. A hope, for all plug-ins who wish to secure a fair-shot at giving companies and users choice regarding what content they choose to produce and consume.</p>
<h3>What is the Future of the Browser Plug-in?</h3>
<p>A quick history lesson is in order. So bare with me for a second.</p>
<p>Adobe made many concessions with the Actionscript language in order to gain acceptance of the platform as the foundation for the upcoming EcmaScript (read JavaScript) standard known as &#8220;Harmony&#8221;. Back in August of 2008, the  Javascript Standard&#8217;s Body <a href="https://mail.mozilla.org/pipermail/es-discuss/2008-August/003400.html" target="_blank">rejected</a> Adobe&#8217;s proposal in favor of small, incremental changes to JavaScript. Adobe proposed a standard that was more robust than the one agreed to by the Standard&#8217;s Body. With Adobe&#8217;s proposal rejected, Actionscript and the Flash Platform became part of a propietary platform. And it wasn&#8217;t just Adobe who likely felt snubbed by the decision to make small, incremental changes to the EcmaScript Spec&#8230;</p>
<h3>How Languages Affect Revenue-Generating Products</h3>
<p>Google wants to compete with Microsoft&#8217;s Office Suite of products. <a href="http://www.nytimes.com/2011/06/28/technology/business-computing/28soft.html" target="_blank">There is a lot of money in the Enterprise</a>. Once an organization has bought into a technology stack, or changed to a service provider, they rarely change course, and the revenue is consistent. In order to offer products that can compete with Microsoft&#8217;s best, Google needs to offer a few gargantuan, rich internet applications that look and behave just like they would on the desktop. Google needs to offer products that rival what Microsoft has fine tuned into wonderful tools, such as Outlook, Word, Excel, and PowerPoint. These products have to be so amazing, and so impressive, that users forget they&#8217;re actually using a web browser. Unfortunately, <a href="https://docs.google.com" target="_blank">they&#8217;re</a> not quite there, yet, and it&#8217;s not known how close Google will be able to get to producing wonderful software on the web using HTML5 and Javascript.</p>
<p>So what to do?</p>
<p>Google has embarked on a quest to offer a platform that exceeds the capabilities of both GWT and HTML5 with <a href="http://www.dartlang.org/docs/technical-overview/index.html#goals" target="_blank">Dart</a>. <a href="http://markmail.org/message/uro3jtoitlmq6x7t">An internal Google document</a> from October 2010 provides some insight about Google&#8217;s future strategy with Dart (allow me to spare you the long-read and paraphrase). Just like Flash, <a href="http://www.dartlang.org/" target="_blank">Dart</a> would <a href="http://blog.chromium.org/search/label/dart" target="_blank">run as a VM in the browser</a> (albeit, with the option of translating Dart into Javascript). Dart would have syntax familiar to Enterprise Java Developers, and Enterprise Flex Developers. As a VM, Dart would overcome many of the limitations that are part of the current EcmaScript standard.</p>
<p>If Google is successful with getting other Vendors to adopt Dart as a VM, it bodes well for the future of Browser plug-in support. Yet, some may argue that there&#8217;s no compelling reason for Mozilla, Apple and Google to offer Dart as a plug-in.</p>
<p>But a problem awaits for browser vendors who choose not to offer plug-in support and move to an agreed-upon, &#8216;pure standards based, completely open&#8217; platform. If other vendors choose not to support Dart, Google would be able to [presumably] offer products that meet the basic needs of most Office Users, while always giving a gentle nudge (if you haven&#8217;t seen the &#8216;nudge&#8217;, try opening up google.com with Internet Explorer. Google prompts you to update to their Chromium Browser) to adopt Chromium, where users would then be able to experience the Full-Featured version of their product that Dart offers. By not offering Dart as a VM, other browser vendors would risk users abandoning their browsers in favor of &#8220;tools&#8221; that do offer &#8216;premium&#8217; content.</p>
<p>It&#8217;s rare for users to switch browsers. Most users use the default browser that came with their system, and those users are often unfamiliar with how to switch to &#8220;another internet&#8221;. Users can be &#8216;<a href="http://www.amazon.com/Nudge-Improving-Decisions-Health-Happiness/dp/0300122233" target="_blank">nudged</a>&#8216; from one browser to the another browser that suits their personal needs. That&#8217;s pretty easy. And for the rest of the users whose browser suits their personal needs just fine, companies may help make the decision for them. Given the price difference between Google Docs and Microsoft Office per employee, the savings could be considerable to the enterprise.</p>
<p>The <a href="http://techcrunch.com/2010/11/18/state-of-mozilla/" target="_blank">referrals for advertising dollars</a> that come from using a specific vendor&#8217;s browser creates a compelling case to offer the very best browser, with the absolute best support for content that users actually want. This is likely to be a big reason why FireFox, a browser built on contributions from the developer community, is working so hard to become a major player for 3D gaming.</p>
<p>The type of content that each browser is capable of delivering will influence which browsers flourish and which browsers parish. That drive to offer the best content will drive the browser vendors to <a href="http://tech.slashdot.org/story/11/05/24/2326250/mozilla-rejects-webp-image-format-google-adds-it" target="_blank">pursue</a> <a href="http://www.zdnet.com/blog/perlow/googles-h264-decision-its-all-about-youtube-costs/15529" target="_blank">their own interests</a>, splintering the HTML5 community, and creating openings for write-once, deploy-on-any-browser VMs, which standardize development.</p>
<p>If Google Chrome <a href="http://blog.chromium.org/2010/03/bringing-improved-support-for-adobe.html" target="_blank">continues to seamlessly offer</a> one VM which provides first-class video and 3D gaming, and can provide another VM that offers desktop-quality office software, other browser and OS vendors will either follow suit and offer a plug-in capable solution, or they will risk losing the treasures that come with <span style="text-decoration: underline;"><em>not</em></span> being the user&#8217;s default browser.</p>
<p>Flash development may be dead on the Mobile Browser battlefield, but the Desktop Browser war is still undecided, and there are billions of dollars at stake.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://frontendconsultant.com/thoughts-on-flash/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Loggee &#8211; A Simpler, Prettier Approach to Logging &amp; Debugging in Flash &amp; Flex</title>
		<link>http://frontendconsultant.com/flash-flex-logger-debugger-tool/</link>
		<comments>http://frontendconsultant.com/flash-flex-logger-debugger-tool/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 04:04:54 +0000</pubDate>
		<dc:creator>David Francis Buhler</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[Loggee]]></category>

		<guid isPermaLink="false">http://davidbuhler.org/?p=85</guid>
		<description><![CDATA[What is It? Loggee is a light-weight, easy-to-learn, Flex logging tool. Sample code is available to help get you started. Why should I use it over other Loggers? There&#8217;s less to learn to get Loggee up and running, but more<span class="ellipsis">&#8230;</span> <a href="http://frontendconsultant.com/flash-flex-logger-debugger-tool/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<h3><strong>What is It?</strong></h3>
<div id="_mcePaste">Loggee is a light-weight, easy-to-learn, Flex logging tool. Sample code is available to help get you started.</div>
<h3>Why should I use it over other Loggers?</h3>
<p>There&#8217;s less to learn to get Loggee up and running, but more importantly, Loggee is meant to give you a quick visual about how your application is doing, much like the gauges and lights inside your car.  <span style="font-size: 13.3333px;">And if you need more information about a particular problem, it&#8217;s available.</span></p>
<p>You can use Loggee in place of throwing error messages and faults to get additional information about the issue, including the order of method calls that took place prior to an issue, the severity, and the error itself as an exposed, complex object.</p>
<p><span id="more-85"></span></p>
<h3>What does Loggee do?</h3>
<p>Loggee:</p>
<div>
<ol>
<li>Displays each log in a &#8216;quick-glance&#8217; format, including:
<ol>
<li>row number</li>
<li>class name</li>
<li>method name</li>
<li>developer-defined message</li>
<li>level type</li>
<li><em>on row selection</em>
<ol>
<li>a complex object. Loggee allows you to pass in complex objects that are hidden until an item is  selected. The results can be copied to your clipboard for further  examination and shared with colleagues. Loggee adds <em>quick-glance</em> data to the output to save you from having to add detail to bug-trackers.</li>
</ol>
</li>
</ol>
</li>
<li>Logs all message or a specific level. Loggee logs the following  levels: <em>fatal</em>, <em>info</em>, <em>debug</em>, <em>warning</em>, or <em>error</em> messages.</li>
<li><span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">Filters logs based on one or more class names.</span></span>
<ol>
<li><span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">Remembers logs and filters the grid the next time your  applications loads</span></span></li>
</ol>
</li>
<li>Show your current version number, helping you and your team to determine if SWFs shown are the most recent version.<span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;"> </span></span></li>
<li><span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">Can clear a list of logs.<br />
</span></span></li>
<li><span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">Can </span></span><span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">stop and restart logging.</span></span></li>
<li><span style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">Shows the current memory usage.</span></span></li>
<li>Logs information in a Flex TitleWindow that can be conveniently hidden to the side and opened again when needed.</li>
<li><span style="font-size: 13.3333px;">Logs</span> messages to a grid where the items are easy to sort based on execution order, message type, method name, or class name.</li>
<li>Allows logging locally (with a debug swf) by setting the show-log property to true, or in production (with a release SWF) by passing in a URL parameter.</li>
<li><span style="font-size: 13.3333px;">Shows color-coded rows based on the message level.</span></li>
<li>Automatically scrolls the list to the most recent log.</li>
<li>Comes with source-code and as a library SWC.</li>
</ol>
</div>
<h3>How do I use it?</h3>
<p><!-- HTML generated using hilite.me --></p>
<div style="overflow: auto; width: auto; color: white; background: none repeat scroll 0% 0% black; padding: 0.2em 0.6em;">
<table>
<tbody>
<tr>
<td>
<pre style="margin: 0; line-height: 125%;"> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55</pre>
</td>
<td>
<pre style="margin: 0; line-height: 125%;"><span style="color: #ff0007; font-weight: bold; font-style: italic; background-color: #0f140f;">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span style="color: #fb660a; font-weight: bold;">&lt;mx:Application</span> <span style="color: #ff0086; font-weight: bold;">xmlns:mx=</span><span style="color: #0086d2;">"http://www.adobe.com/2006/mxml"</span>
                <span style="color: #ff0086; font-weight: bold;">layout=</span><span style="color: #0086d2;">"absolute"</span>
                <span style="color: #ff0086; font-weight: bold;">creationComplete=</span><span style="color: #0086d2;">"handleCreationComplete(event)"</span><span style="color: #fb660a; font-weight: bold;">&gt;</span>

    <span style="color: #fb660a; font-weight: bold;">&lt;mx:Script&gt;</span>
        <span style="color: #0086d2;">&lt;![CDATA[</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">mx.events.FlexEvent;</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">mx.managers.PopUpManager;</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">org.davidbuhler.logger.Loggee;</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">org.davidbuhler.logger.LoggeeClassLevel;</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">org.davidbuhler.logger.LoggeeEventLevel;</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">static</span> <span style="color: #fb660a; font-weight: bold;">const</span> <span style="color: #ffffff;">RUN_APPLICATION_DELAY:</span><span style="color: #cdcaa9; font-weight: bold;">uint</span> <span style="color: #ffffff;">=</span> <span style="color: #0086f7; font-weight: bold;">2000</span><span style="color: #ffffff;">;</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">static</span> <span style="color: #fb660a; font-weight: bold;">const</span> <span style="color: #ffffff;">SHOW_LOGGER:</span><span style="color: #cdcaa9; font-weight: bold;">Boolean</span> <span style="color: #ffffff;">=</span> <span style="color: #fb660a; font-weight: bold;">true</span><span style="color: #ffffff;">;</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">var</span> <span style="color: #ffffff;">logger:</span><span style="color: #cdcaa9; font-weight: bold;">Loggee</span><span style="color: #ffffff;">;</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">var</span> <span style="color: #ffffff;">timeoutDelayID:</span><span style="color: #cdcaa9; font-weight: bold;">uint</span><span style="color: #ffffff;">;</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">function </span><span style="color: #ff0086; font-weight: bold;">beginLogging</span><span style="color: #ffffff;">():</span><span style="color: #cdcaa9; font-weight: bold;">void</span>
            <span style="color: #ffffff;">{</span>
                <span style="color: #ffffff;">logger</span> <span style="color: #ffffff;">=</span> <span style="color: #fb660a; font-weight: bold;">new</span> <span style="color: #cdcaa9; font-weight: bold;">Loggee</span><span style="color: #ffffff;">(LoggeeEventLevel.</span><span style="color: #ff0086; font-weight: bold;">ALL</span> <span style="color: #ffffff;">,</span> <span style="color: #ffffff;">LoggeeClassLevel.</span><span style="color: #ff0086; font-weight: bold;">ALL</span><span style="color: #ffffff;">);</span>
                <span style="color: #ffffff;">Loggee.</span><span style="color: #ff0086; font-weight: bold;">isLoggingEnabled</span> <span style="color: #ffffff;">=</span> <span style="color: #ffffff;">isLoggingEnabled();</span>
                <span style="color: #fb660a; font-weight: bold;">if</span> <span style="color: #ffffff;">(isLoggingEnabled())</span>
                <span style="color: #ffffff;">{</span>
                    <span style="color: #ffffff;">mx.</span><span style="color: #ff0086; font-weight: bold;">managers</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">PopUpManager</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">addPopUp</span><span style="color: #ffffff;">(logger</span> <span style="color: #ffffff;">,</span> <span style="color: #fb660a; font-weight: bold;">this</span><span style="color: #ffffff;">);</span>
                    <span style="color: #ffffff;">PopUpManager.</span><span style="color: #ff0086; font-weight: bold;">centerPopUp</span><span style="color: #ffffff;">(logger);</span>
                    <span style="color: #ffffff;">logger.</span><span style="color: #ff0086; font-weight: bold;">isPopUp</span> <span style="color: #ffffff;">=</span> <span style="color: #fb660a; font-weight: bold;">false</span><span style="color: #ffffff;">;</span>
                    <span style="color: #ffffff;">timeoutDelayID</span> <span style="color: #ffffff;">=</span> <span style="color: #ffffff;">setTimeout(runApplication</span> <span style="color: #ffffff;">,</span> <span style="color: #ffffff;">RUN_APPLICATION_DELAY);</span>
                <span style="color: #ffffff;">}</span> <span style="color: #fb660a; font-weight: bold;">else</span>
                <span style="color: #ffffff;">{</span>
                    <span style="color: #fb660a; font-weight: bold;">this</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">runApplication</span><span style="color: #ffffff;">();</span>
                <span style="color: #ffffff;">}</span>
            <span style="color: #ffffff;">}</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">function </span><span style="color: #ff0086; font-weight: bold;">handleCreationComplete</span><span style="color: #ffffff;">(event:</span><span style="color: #cdcaa9; font-weight: bold;">FlexEvent</span><span style="color: #ffffff;">):</span><span style="color: #cdcaa9; font-weight: bold;">void</span>
            <span style="color: #ffffff;">{</span>
                <span style="color: #fb660a; font-weight: bold;">this</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">beginLogging</span><span style="color: #ffffff;">();</span>
                <span style="color: #ffffff;">Loggee.</span><span style="color: #ff0086; font-weight: bold;">log</span><span style="color: #ffffff;">(</span><span style="color: #fb660a; font-weight: bold;">this</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">className</span> <span style="color: #ffffff;">,</span> <span style="color: #0086d2;">'handleCreationComplete'</span> <span style="color: #ffffff;">,</span> <span style="color: #0086d2;">'message'</span> <span style="color: #ffffff;">,</span> <span style="color: #ffffff;">LoggeeEventLevel.</span><span style="color: #ff0086; font-weight: bold;">INFO</span> <span style="color: #ffffff;">,</span> <span style="color: #ffffff;">event);</span>
            <span style="color: #ffffff;">}</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">function </span><span style="color: #ff0086; font-weight: bold;">isLoggingEnabled</span><span style="color: #ffffff;">():</span><span style="color: #cdcaa9; font-weight: bold;">Boolean</span>
            <span style="color: #ffffff;">{</span>
                <span style="color: #fb660a; font-weight: bold;">return</span> <span style="color: #ffffff;">Boolean(mx.</span><span style="color: #ff0086; font-weight: bold;">core</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">Application</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">application</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">parameters</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">showLogger</span><span style="color: #ffffff;">)</span> <span style="color: #ffffff;">||</span> <span style="color: #ffffff;">SHOW_LOGGER;</span>
            <span style="color: #ffffff;">}</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">function </span><span style="color: #ff0086; font-weight: bold;">runApplication</span><span style="color: #ffffff;">():</span><span style="color: #cdcaa9; font-weight: bold;">void</span>
            <span style="color: #ffffff;">{</span>
                <span style="color: #008800; font-style: italic; background-color: #0f140f;">// begin loading data</span>
            <span style="color: #ffffff;">}</span>
        <span style="color: #0086d2;">]]&gt;</span>
    <span style="color: #fb660a; font-weight: bold;">&lt;/mx:Script&gt;</span>
<span style="color: #fb660a; font-weight: bold;">&lt;/mx:Application&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<h3>Where can I get Loggee?</h3>
<p>The SVN Repository is hosted on code.google.com, <a href="http://loggee.googlecode.com/svn/trunk/" target="_blank">here</a>:</p>
<address><span style="font-family: monospace; line-height: normal;"><strong>Trunk</strong>: http://loggee.googlecode.com/svn/trunk/<br />
<strong> SWC</strong>: <span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13.3333px; line-height: 22px;">http://loggee.googlecode.com/svn/trunk/libs/Loggee.swc</span></span></address>
<p><span style="font-family: monospace; line-height: normal;"> </span></p>
<h3 style="font-size: 1.17em;">Is there a bug tracker?</h3>
<p>Yes. Log issues <a href="http://code.google.com/p/loggee/issues/list" target="_blank">here</a>.</p>
<h3>Additional Information</h3>
<p><span style="font-size: 13.3333px;">This project gains inspiration from the <a href="http://logging.apache.org/chainsaw/" target="_blank">Apache Chainsaw</a> project. Chainsaw is, and was, a visual improvement over <a href="http://logging.apache.org/log4j/1.2/" target="_blank">Log4J</a>.  Loggee is meant to improve upon the standard <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=logging_09.html" target="_blank">Flex Logging Framework</a> by offering additional features and visual cues that improve developer productivity and reduce application errors, both in development and production.</span></p>
<h3>Want to help improve Loggee?</h3>
<p>If there are enhancements you&#8217;d care to suggest, feel-free to comment below.</p>
<h3>Development Schedule</h3>
<p>Loggee is evolving daily from April of 2010.</p>
]]></content:encoded>
			<wfw:commentRss>http://frontendconsultant.com/flash-flex-logger-debugger-tool/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flex Form &amp; Function: Validators with Formatters in a Stateful Form</title>
		<link>http://frontendconsultant.com/flex-form-function-v0-1-validators-with-formatters-in-a-stateful-form/</link>
		<comments>http://frontendconsultant.com/flex-form-function-v0-1-validators-with-formatters-in-a-stateful-form/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 20:00:04 +0000</pubDate>
		<dc:creator>David Francis Buhler</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[FormAndFunction]]></category>
		<category><![CDATA[Flex Form Validation]]></category>
		<category><![CDATA[Flex Formatters]]></category>
		<category><![CDATA[Form & Function]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://davidbuhler.org/?p=6</guid>
		<description><![CDATA[I&#8217;ve released a Flex project called Form &#38; Function. In a nutshell, what does it do? Form &#38; Function reminds a user that their time-investment matters to you and your organization by giving the best possible experience when filling out a<span class="ellipsis">&#8230;</span> <a href="http://frontendconsultant.com/flex-form-function-v0-1-validators-with-formatters-in-a-stateful-form/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve released a Flex project called <em>Form &amp; Function.<br />
</em></p>
<p><strong>In a nutshell, what does it do?</strong><em><br />
Form &amp; Function </em>reminds a user that their time-investment matters to you and your organization by giving the best possible experience when filling out a form.</p>
<p><strong>In </strong><em><strong>brief</strong></em><strong> technical jargon, what does it do?</strong><em><br />
</em><em>Form &amp; Function creates the relationship between</em> a validator, a formatter, and a restrictor for the most popular form types, and then notifies the developer and user about a form&#8217;s validity.</p>
<p><strong>Who does it </strong><em><strong>help?</strong></em></p>
<ol>
<li>For developers, it simplifies building complex forms.</li>
<li>For users, it helps them complete long forms.</li>
<li>For project managers, it&#8217;s a milestone met.</li>
<li>For user experience designers, it&#8217;s a starting place for a conversation.</li>
</ol>
<p>Where can I find <em>Form &amp; Function</em>?<br />
The code base is hosted on code.google.com. Feel free to <a title="download the latest" href="http://code.google.com/p/formandfunction/" target="_blank">download the latest</a> version of <em>Form &amp; Function</em> from the Subversion trunk. Over the next few months, the project will be in a &#8220;Bleeding-Edge&#8221; release, and should <em>not</em> be considered backwards compatible from day-to-day.</p>
<p>What problems can <em>Form &amp; Function</em> solve with my Flex Project?</p>
<p><span id="more-7"></span></p>
<p><strong>Problem 1: The standard Flex Validators are too generi</strong>c<br />
Let&#8217;s start from the top and talk about the Adobe Flex validators. The types of validators Flex currently offers are:</p>
<ul>
<li>CreditCardValidator</li>
<li>CurrencyValidator</li>
<li>DateValidator</li>
<li>EmailValidator</li>
<li>NumberValidator</li>
<li>PhoneNumberValidator</li>
<li>RegExpValidator</li>
<li>SocialSecurityValidator</li>
<li>StringValidator</li>
<li>Validator</li>
<li>ZipCodeValidator</li>
</ul>
<p>Adobe gives you all the hooks you need to build your own validators using the Validator class and the RegExpValidator class (and both are used liberally with <em>Form &amp; Function</em>).</p>
<p>The more specific validators, such as the <a href="http://livedocs.adobe.com/flex/3/langref/mx/validators/CreditCardValidator.html">CreditCardValidator</a>, won&#8217;t validate credit-card security codes, only credit-card numbers). While a Merchant may not require the user enter a security code, the ability to validate against a security-code that&#8217;s tied into the card-type, should have been there all along, along with a <em>CreditCardFormatter</em> for user legibility.</p>
<p>Form &amp; Function has validators that either improve upon, or plain-old, don&#8217;t exist in the latest Flex SDK.</p>
<p><strong>Problem 2: Some Form Items require a linear Work Flow</strong><br />
Some form items require a linear workflow. For example, the mx:CreditCardValidator doesn&#8217;t force a linear workflow, because it&#8217;s left to the developer to implement a  workflow, most likey using <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=using_states_3.html">States</a>, but I prefer <a href="http://en.wikipedia.org/wiki/Convention_over_configuration">Convention over Configuration</a>, and strongly prefer a consistent approach that 99% of developers are going to implement. In short: A user should be forced to select a card-type before he&#8217;s validating a credit-card-number (or the credit-card-security-code) against a null credit-card-type.</p>
<p>With your own application, I expect you may have similar workflow needs: The user shouldn&#8217;t be able to select one type of field until he&#8217;s selected another type of field, because there&#8217;s a dependency (maybe you have to load data for a &#8220;Region&#8221; only after the &#8220;Country&#8221; is selected).</p>
<p><em>Form &amp; Function</em> has &#8216;hooks&#8217; on the FormItem level, as well as the Form level, to make implementing a linear workflow a relatively straight-forward process.</p>
<p><strong>Problem 3: The Field restrictions aren&#8217;t implemented for popular Field-Types</strong><br />
When you use one of the Adobe Flex validators, you&#8217;ll notice there&#8217;s no association between the input-restrictions and the validation-routines. For example, a user should never be warned that the name of the event he&#8217;s posting exceeds the maximum length allowed. It&#8217;s better to just limit the number of characters he can enter, and if the name of the event has to be pretty short, give him a character countdown (<em>4 more [characters] allowed&#8230;</em><em>3 more [characters] allowed</em>). A user is going to be pretty frustrated to see an error the developer let slide in the first place (&#8220;Why are you wasting my time letting me enter bad data? Just stop it from happening in the first place and let me finish my task so I can go back to doing something I actually enjoy!&#8221;).<em></em></p>
<p>If you have two views with the same field-type, <em>Form &amp; Function</em> takes care of all the sub-classing for you, so you and the other developers know that the password field on your &#8216;Registration&#8217; page has the exact same requirements as the password on your &#8216;Update Password&#8217; page. I&#8217;ve seen many cases where developers may have re-used a validator, but they differed on the character restrictions, and the users couldn&#8217;t update their password once they registered because the &#8216;old&#8217; password was invalid.</p>
<p><em>Form &amp; Function</em> restricts character limits and character types, using the most popular standards (and you can override these limitations to suit your own needs in a granular or global fashion). To add a password to your Form, you&#8217;ll only need to specify the type=&#8221;password&#8221;. That&#8217;s it. Form &amp; Function takes care of the validation routines, the character restrictions and the maximum character limits.</p>
<p><strong>Problem 4: The Flex Validators aren&#8217;t associated with the Flex Formatters</strong><br />
With the Adobe Flex forms, there is no association between the field-formatter and the field-validator. If the developer is going to require data-entered be in a specific format, the field-formatter&#8217;s value has to be the same as the format value of the field-validator. For example, if your phone formatter is formatting to <em>(###) ###-####</em> and the validator is validating against <em>(###) ### ####</em>, problems for the developer, business and the user start to bubble up.</p>
<p><em>Form &amp; Function</em> tries to help the lack-of-association-problem by using a single touch point (the same format property) for the validator and formatter, and restricting characters that aren&#8217;t allowed as part of the format.</p>
<p><strong>Problem 5: It&#8217;s not easy to know when a Form is Valid or Dirty</strong><br />
There is no simple approach to tracking an entire form&#8217;s validity. As a developer, you typically have to run a long operation to test the validity of each control, based on whether the field is, or isn&#8217;t, required, and add the error messaging. I&#8217;ve typically seen this done in an array of concatenated strings, and for a long form, the operation might be 100s of lines long.</p>
<p>Then, there&#8217;s the dirty-flag. A developer needs to know when the form is modified from the original state. If the form is different, you&#8217;re going to want save the data (either in intervals, or based on milestones) and only so many times.</p>
<p>Form &amp; Function is going to help you by offering a built in validity checker and dirty flag handler for each form item that you specify is required.</p>
<p><strong>Problem 6: The Long Form has disappeared (and users liked the Long Form)</strong><br />
I&#8217;ve worked primarily on large &#8216;transactional&#8217; applications using Flex, and in most of our user-experience studies, we&#8217;ve found that users prefer one, long form to a wizard. Why? Well, for starters, the Flex Wizards actually made form entry more daunting, because the user doesn&#8217;t know how tedious the next form is going to be. Think of it like &#8220;Let&#8217;s Make a Deal&#8221;, where the contestant stands up and guesses correctly twice, and then he gets to door number 3 and can either quit and go home, or take the mystery prize. It could be a donkey, or it could be a new car. When you see a form longer than the one you just spent 10 minutes working on, you feel like you just won a the donkey. You worked through two challenges, and on the third challenge, you been slapped down.</p>
<p><strong>Problem 7: The standard Flex Forms Layout isn&#8217;t easy to read</strong><br />
Users look at a form and they use visual reference points to determine what needs to be done. If the visual reference points aren&#8217;t there, users lose track of what they need to do next. Form &amp; Function provides a symmetrical grid, so labels, controls, format hints and colors are consistent from line to line.</p>
<p><strong>Problem 8: Users aren&#8217;t working against a milestone</strong><br />
So why not just build a long form? Well, to begin with, long-forms are harder to develop. You end up with one form that has to account for so much logic, with so many validators and formatters, that the code becomes unwieldy. Those same problems make a long-form hard to test and debug, too.<em> Form &amp; Function</em>encapsulates this logic, giving  you a simple tag-based approach to building a robust, long-form.</p>
<p>From a user-perspective, a long form needs to provide even more feedback about how far along the user is in the completion process, and what&#8217;s wrong as they go along. The user may have scrolled so far down the form after a few minutes that he never notices the &#8220;First Name&#8221; field is incomplete.</p>
<p><em>Form &amp; Function </em>also gives a visual hint within its own field-column. Basically, if a social security number has to be entered in a specific format,<em> </em><em>Form &amp; Function</em>provides an example that should be visually recognizable as an example. If you need to add more information, you can omit the example and replace it with a built-in &#8220;More Info&#8221; link. Consider the  &#8220;More Info&#8221; link as a very tiny help center for each field. The link either opens up a simple text file that you specify, or you can have Flash open a new HTML Window if you have considerably more information to specify.</p>
<p>More importantly, <em>Form &amp; Function </em>is a Graphical Feedback Tool. It incorporates a Graphical Animated Feedback Indicator (GAFI), as well as form items that change their color based on their validity-state. So users are always aware which form items are valid, which are invalid, and which items haven&#8217;t had any interaction yet. And the GAFI keeps the user aware how many items he has left to complete.</p>
<p>For Adobe, and most companies for that matter, it would be hard to dictate all the field types for the various languages and locales used throughout the world. But I&#8217;m less concerned with an internationalized product, and more concerned with building something that ensures 50% of my user-base is going to complete the task at hand, and 100% are going to complete it with confidence. And for me, 99% of my user-base comes from the old US of A (and if you&#8217;re not using the project for the en_US locale, it&#8217;s easy to tailor it to suit your own needs).</p>
<ul>
<li><strong>What Does Form &amp; Function Do for Users? </strong>
<ul>
<li>It helps them keep a sense of state. As users enter data in a field, the surrounding background color changes to reflect the form item&#8217;s validity.</li>
<li>Small visual clues hint to the necessary data format.</li>
<li>There&#8217;s a visual reward system. As users move along, a progress indicator gives the user a graphical and numeric indicator, letting them know how much more work they have to do before they&#8217;re done.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>What Does Form &amp; Function Do for Developers </strong>
<ul>
<li>It saves time. As a developer, you no longer have to write a validator, formatter, restrictor, character limits, dirty flag handlers, or multiple form item names.</li>
<li>It&#8217;s adopted Convention over Configuration. The accessing of data, the setting of data, and the field types are all straight forward. If you want to change the behavior, you can, but for the most part, everything is straight-forward, using the most conventional approach to development.</li>
</ul>
</li>
<li><strong>What types of fields does Form &amp; Function support? </strong>
<ol>
<li>Address 1</li>
<li>Address 2</li>
<li>Captcha</li>
<li>CheckBox</li>
<li>ComboBox</li>
<li><em>American Express</em>, <em>Discover</em>, <em>Diner&#8217;s Club</em>, <em>Visa</em>, <em>MasterCard</em>
<ul>
<li>Credit Card Expiration Date</li>
</ul>
<ul>
<li>Credit Card Number</li>
</ul>
<ul>
<li>Credit Card Security Code</li>
</ul>
<ul>
<li>Credit Card Type</li>
</ul>
</li>
<li>Currency</li>
<li>Date</li>
<li>Email</li>
<li>File Manager (including the previewing of image files)</li>
<li>First Name</li>
<li>Last Name</li>
<li>Generic Input</li>
<li>Numeric Stepper</li>
<li>Password</li>
<li>Phone Number</li>
<li>Radio Button Group (confirming the user Selected 1 choice)</li>
<li>Rich Text Editor</li>
<li>Social Security</li>
<li>Time</li>
<li>Website</li>
<li>Zip Code (with or without Extension)</li>
</ol>
</li>
</ul>
<ul>
<li><strong>How Can I customize </strong><em><strong>Form &amp; Functio</strong></em><em><strong>n?</strong></em>
<ol>
<li>Most methods that makes up the Base FormItem Class can be overridden. There&#8217;s also a generic input that allows you to specify generic string restraints &amp; requirements. I&#8217;ll be working to add some interfaces to help you along for performing extensions, along with sample code.</li>
<li>The styles are externalized so you can easily change the feedback colors, form-item colors, and more.</li>
<li>The Graphical Animated Feedback Indicator (GAFI) is optional.</li>
</ol>
</li>
</ul>
<p><a title="Download Form &amp; Function from the SVN Trunk" href="http://code.google.com/p/formandfunction/" target="_blank">Download the latest version of <em>Form &amp; Function</em> from Subversion</a></p>
<p>And the above is created with as little code as:<br />
<!-- HTML generated using hilite.me --></p>
<div style="overflow: auto; width: auto; color: white; background: none repeat scroll 0% 0% black; padding: 0.2em 0.6em;">
<table>
<tbody>
<tr>
<td>
<pre style="margin: 0; line-height: 125%;">  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173</pre>
</td>
<td>
<pre style="margin: 0; line-height: 125%;"><span style="color: #ff0007; font-weight: bold; font-style: italic; background-color: #0f140f;">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span style="color: #fb660a; font-weight: bold;">&lt;mx:Application</span> <span style="color: #ff0086; font-weight: bold;">height=</span><span style="color: #0086d2;">"100%"</span>
                <span style="color: #ff0086; font-weight: bold;">width=</span><span style="color: #0086d2;">"100%"</span>
                <span style="color: #ff0086; font-weight: bold;">layout=</span><span style="color: #0086d2;">"absolute"</span>
                <span style="color: #ff0086; font-weight: bold;">xmlns:containers=</span><span style="color: #0086d2;">"org.davidbuhler.formandfunction.containers.*"</span>
                <span style="color: #ff0086; font-weight: bold;">xmlns:controls=</span><span style="color: #0086d2;">"org.davidbuhler.formandfunction.controls.*"</span>
                <span style="color: #ff0086; font-weight: bold;">xmlns:formandfunction=</span><span style="color: #0086d2;">"org.davidbuhler.formandfunction.*"</span>
                <span style="color: #ff0086; font-weight: bold;">xmlns:mx=</span><span style="color: #0086d2;">"http://www.adobe.com/2006/mxml"</span>
                <span style="color: #ff0086; font-weight: bold;">xmlns:vo=</span><span style="color: #0086d2;">"org.davidbuhler.formandfunction.vo.*"</span><span style="color: #fb660a; font-weight: bold;">&gt;</span>

    <span style="color: #fb660a; font-weight: bold;">&lt;mx:Style</span> <span style="color: #ff0086; font-weight: bold;">source=</span><span style="color: #0086d2;">"/assets/styles/Styles.css"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

    <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseForm</span> <span style="color: #ff0086; font-weight: bold;">autoSaveEnabled=</span><span style="color: #0086d2;">"true"</span>
                              <span style="color: #ff0086; font-weight: bold;">autoSaveInterval=</span><span style="color: #0086d2;">"10000"</span>
                              <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"baseForm"</span><span style="color: #fb660a; font-weight: bold;">&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;controls:FormHeader</span> <span style="color: #ff0086; font-weight: bold;">errorsCount=</span><span style="color: #0086d2;">"{baseForm.errorsCount}"</span>
                             <span style="color: #ff0086; font-weight: bold;">title=</span><span style="color: #0086d2;">"Form &amp;amp; Function"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"email"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"email"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"password"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"password"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"radioButton"</span>
                                      <span style="color: #ff0086; font-weight: bold;">radioButtonList=</span><span style="color: #0086d2;">"{radioButtonList}"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"radioButtonGroup"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;controls:BaseHRule/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">formatHint=</span><span style="color: #0086d2;">"Jane's 5K Run"</span>
                                      <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"textInput"</span>
                                      <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"Event Name"</span>
                                      <span style="color: #ff0086; font-weight: bold;">maxLength=</span><span style="color: #0086d2;">"50"</span>
                                      <span style="color: #ff0086; font-weight: bold;">minLength=</span><span style="color: #0086d2;">"5"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"textInput"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"firstName"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"firstName"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"lastName"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"lastName"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"address1"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"address1"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"address2"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"address2"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"comboBox"</span>
                                      <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"State"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"comboBox"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"zipCode"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"zipCode"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"phoneNumber"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"phoneNumber"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"date"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"date"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"time"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"time"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"socialSecurity"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"socialSecurity"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;controls:BaseHRule/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">excludeDinersClub=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"creditCardType"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"creditCardType"</span>
                                      <span style="color: #ff0086; font-weight: bold;">whatsThisURL=</span><span style="color: #0086d2;">"Legal.html"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"creditCardNumber"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"creditCardNumber"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"creditCardSecurityCode"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"creditCardSecurityCode"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"creditCardExpirationDate"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"creditCardExpirationDate"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"numericStepper"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"numericStepper"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"currency"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"currency"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"uri"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"uri"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"checkBox"</span>
                                      <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"I agree"</span>
                                      <span style="color: #ff0086; font-weight: bold;">openLinksInNewWindow=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"checkBox"</span>
                                      <span style="color: #ff0086; font-weight: bold;">whatsThisURL=</span><span style="color: #0086d2;">"Sample.html"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"captcha"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"captcha"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;formandfunction:BaseFormItem</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"richTextEditor"</span>
                                      <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"Profile"</span>
                                      <span style="color: #ff0086; font-weight: bold;">required=</span><span style="color: #0086d2;">"true"</span>
                                      <span style="color: #ff0086; font-weight: bold;">type=</span><span style="color: #0086d2;">"richTextEditor"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;containers:BaseControlBar</span> <span style="color: #ff0086; font-weight: bold;">width=</span><span style="color: #0086d2;">"100%"</span><span style="color: #fb660a; font-weight: bold;">&gt;</span>

            <span style="color: #fb660a; font-weight: bold;">&lt;controls:ClearButton</span> <span style="color: #ff0086; font-weight: bold;">enabled=</span><span style="color: #0086d2;">"{baseForm.isFormDirty}"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

            <span style="color: #fb660a; font-weight: bold;">&lt;controls:SaveButton</span> <span style="color: #ff0086; font-weight: bold;">click=</span><span style="color: #0086d2;">"saveForm(event);"</span>
                                 <span style="color: #ff0086; font-weight: bold;">enabled=</span><span style="color: #0086d2;">"{baseForm.isFormDirty &amp;amp;&amp;amp; baseForm.isFormValid}"</span>
                                 <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"saveButton"</span>
                                 <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"{saveButton.enabled &amp;amp;&amp;amp; baseForm.autoSaveEnabled?'Save':baseForm.lastSavedLabel}"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>
        <span style="color: #fb660a; font-weight: bold;">&lt;/containers:BaseControlBar&gt;</span>
    <span style="color: #fb660a; font-weight: bold;">&lt;/formandfunction:BaseForm&gt;</span>

    <span style="color: #fb660a; font-weight: bold;">&lt;mx:Array</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"checkBoxList"</span><span style="color: #fb660a; font-weight: bold;">&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;vo:CheckBoxVO</span> <span style="color: #ff0086; font-weight: bold;">selected=</span><span style="color: #0086d2;">"true"</span>
                       <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"Large"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;vo:CheckBoxVO</span> <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"Medium"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;vo:CheckBoxVO</span> <span style="color: #ff0086; font-weight: bold;">selected=</span><span style="color: #0086d2;">"true"</span>
                       <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"Small"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>
    <span style="color: #fb660a; font-weight: bold;">&lt;/mx:Array&gt;</span>

    <span style="color: #fb660a; font-weight: bold;">&lt;mx:Array</span> <span style="color: #ff0086; font-weight: bold;">id=</span><span style="color: #0086d2;">"radioButtonList"</span><span style="color: #fb660a; font-weight: bold;">&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;vo:RadioButtonVO</span> <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"Male"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>

        <span style="color: #fb660a; font-weight: bold;">&lt;vo:RadioButtonVO</span> <span style="color: #ff0086; font-weight: bold;">label=</span><span style="color: #0086d2;">"Female"</span><span style="color: #fb660a; font-weight: bold;">/&gt;</span>
    <span style="color: #fb660a; font-weight: bold;">&lt;/mx:Array&gt;</span>

    <span style="color: #fb660a; font-weight: bold;">&lt;mx:Script&gt;</span>
        <span style="color: #0086d2;">&lt;![CDATA[</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">mx.controls.Alert;</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">mx.events.FlexEvent;</span>
            <span style="color: #fb660a; font-weight: bold;">import</span> <span style="color: #ffffff;">org.davidbuhler.formandfunction.utils.Utils;</span>

            <span style="color: #fb660a; font-weight: bold;">private</span> <span style="color: #fb660a; font-weight: bold;">function </span><span style="color: #ff0086; font-weight: bold;">saveForm</span><span style="color: #ffffff;">(event:</span><span style="color: #cdcaa9; font-weight: bold;">Event</span><span style="color: #ffffff;">):</span><span style="color: #cdcaa9; font-weight: bold;">void</span>
            <span style="color: #ffffff;">{</span>
                <span style="color: #ffffff;">mx.</span><span style="color: #ff0086; font-weight: bold;">controls</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">Alert</span><span style="color: #ffffff;">.</span><span style="color: #ff0086; font-weight: bold;">show</span><span style="color: #ffffff;">(</span><span style="color: #0086d2;">'Values: '</span> <span style="color: #ffffff;">+</span> <span style="color: #ffffff;">baseForm.</span><span style="color: #ff0086; font-weight: bold;">formValues</span><span style="color: #ffffff;">);</span>
            <span style="color: #ffffff;">}</span>
        <span style="color: #0086d2;">]]&gt;</span>
    <span style="color: #fb660a; font-weight: bold;">&lt;/mx:Script&gt;</span>
<span style="color: #fb660a; font-weight: bold;">&lt;/mx:Application&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://frontendconsultant.com/flex-form-function-v0-1-validators-with-formatters-in-a-stateful-form/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>How to Survive Becoming a Flex Developer</title>
		<link>http://frontendconsultant.com/how-to-become-and-maybe-even-stay-a-flex-developer/</link>
		<comments>http://frontendconsultant.com/how-to-become-and-maybe-even-stay-a-flex-developer/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 06:48:00 +0000</pubDate>
		<dc:creator>David Francis Buhler</dc:creator>
				<category><![CDATA[Software Industry]]></category>
		<category><![CDATA[Burnout]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://davidbuhler.org/?p=4</guid>
		<description><![CDATA[In the movie Rustlers&#8217; Rhapsody, Tom Berenger&#8217;s character tells the locals in the town he&#8217;s come to, that all saloon towns are the same: each town, he tells them, has a town-drunk, each town has a town-prostitute, and each saloon town<span class="ellipsis">&#8230;</span> <a href="http://frontendconsultant.com/how-to-become-and-maybe-even-stay-a-flex-developer/"><div class="read-more">Read more &#8250;</div><!-- end of .read-more --></a>]]></description>
			<content:encoded><![CDATA[<p>In the movie <a href="http://www.youtube.com/watch?v=4OaA3LZHbQs">Rustlers&#8217; Rhapsody</a>, Tom Berenger&#8217;s character tells the locals in the town he&#8217;s come to, that all saloon towns are the same: each town, he tells them, has a town-drunk, each town has a town-prostitute, and each saloon town has a black-hat cowboy (and the black-hat cowboy can&#8217;t win in a gunfight because he&#8217;s a bad guy). How does the nomadic white-hat cowboy know all this? Because he goes from town-to-town and he&#8217;s seen the same scenario play out over and over again.</p>
<p><strong>The State of Flex Developers</strong></p>
<p>As a Nomadic Software developer who has worked on the Flash Platform for the past ten years, let me tell you something: most software companies are pretty-much the same, from town to town. At each company, you&#8217;ll see some of the following types of Flex Developers:</p>
<ul>
<li>There&#8217;s one Flex developer who does 80% of the work, and then spends the rest of his time getting caught up on the latest technology (which requires the rest of his conscious time).</li>
<li>There are a few developers who were hot when AS1 was the rage and they&#8217;re almost ready to move to AS2. But in the meantime..</li>
<li>There are the Flex developers who somehow got moved from Java Development to working on the client-side (and they didn&#8217;t consider this change to be promotion).</li>
<li>There are the Flex developers eager to learn something new, but they have no idea how to go about it.</li>
</ul>
<p>In short, I see people who are burnt-out, not-interested, not-interested and unhappy, or interested and frustrated.<br />
<span id="more-6"></span></p>
<p><strong>Things Have Gone Wrong</strong></p>
<p>There are always a lot of jobs opening up in Development, and I rarely see developers much older than I am (I&#8217;m only 33). Neither one is a good sign for career prospects, but what does that say about the Software that IS out there? How experienced are the people who are building the software that impacts our lives when they all seem to be so young, and worse, young and (see categories above)? Well, I&#8217;m glad you&#8217;ve asked!</p>
<p>To all of the developers out there who wake up and think, &#8220;I will never learn how to do this. I will never learn all the stuff I need to learn to become really good at Flex Development and have a life&#8221;, put down your whiskey-glass and pay attention.</p>
<p><strong>The Software Industry is a cut-throat business</strong></p>
<p>Most saloon towns (and yes, I am going to stick with the Wild-West metaphors for the rest of this post) only have enough room for a few cowboys, and there&#8217;s another one riding-in with a fancier gun and a faster horse.</p>
<p>If you lose your job working in one of the smaller towns, you&#8217;re either going to have to relocate, market yourself so aggressively you can work remotely from home, or look for a new line of work. In a big city with a focus on technology (like Raleigh-Durham or New York City), the competition for software jobs can be fierce. Software is one of the highest paying fields that doesn&#8217;t require an advanced college degree, and that is a major draw for a lot of people who have the basics down, and are willing to go to any length to have the salary of a medical doctor in less time than it takes to finish medical school.</p>
<p><strong>Software is a new business and it changes fast.</strong><br />
The processes for building a physical structure, like a town-hall, have been around for 1000s of years. The processes for building software have been around for 40 years, and web-programming only took-off around 1996. For the past few years, people have been coming out with proposals for processes that are then tried, proven and refined, or tried, proven false, and tossed out. We&#8217;re STILL figuring out what works and what doesn&#8217;t work, and software development is still in its infancy. You should expect things to change rapidly over the next few decades. Roll with the changes. You need to know how technology changes. You need to learn what to follow and what not to follow. You need to know how to stay ahead of the curve. You need to do it in a way that is efficient so you can have a job and have a life. If you don&#8217;t keep up, you&#8217;re going to walk into the street one day at high-noon for a show-down and find out that the other cowboy standing at the end of the road has a bullet-proof vest beneath that duster.</p>
<p><strong>You Won&#8217;t Learn Much At Work</strong></p>
<p>Companies aren&#8217;t going to pay to train you. It&#8217;s not in their best-interest to &#8216;hope&#8217; their financial investment in your education is going to pay dividends in profit for their next fiscal quarter. Unless you possess some special product knowledge, it&#8217;s cheaper to replace you with someone who already knows how to solve a complex coding problem, because that person is going to come up with elegant solutions that won&#8217;t just save time coding, but will make it easier for Mary and John in Quality Assurance to test other areas of the product, and it means Susan and Phil in Marketing can start selling the product sooner and it means Jenny in User Experience is going to have plenty of time to fine-tune the interface. And besides, even if your company DID train you, what&#8217;s going to prevent you from leaving once your skills have grown? Now that you&#8217;re more marketable with a higher earning potential, it&#8217;s time to open on Monster.com and begin anew!</p>
<p><strong>Software Developers Have a LifeCycle, too</strong><br />
Software Developers are only valuable if the skill they&#8217;re bringing to the table is in demand. The <a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3">Flex SDK</a>s evolve every few months. A new Flex IDE comes out  every 2-3 years. And the tools and approaches begin a Sea Change about once each year. With such an enormous learning curve, it doesn&#8217;t take much to fall behind.</p>
<p>How soon can you become irrelevant?</p>
<ul>
<li>You can become irrelevant in 2 years at a small company.</li>
<li>You can become irrelevant in 4 years at a Fortune 500 company.</li>
</ul>
<p><strong>How Can You Mitigate the Dreaded Fall-Behind?</strong></p>
<p><strong>Propose a Radical Change (or just do it)</strong><br />
I&#8217;ve been to a lot of meetings with people that have lots of industry experience. I&#8217;ve sat around tables with managers who have MBAs, developers who have advanced degrees in Computer Science, and the kind of documentation that makes you believe the enterprise-application we&#8217;re about to launch has been carefully thought-out. Then, after a few weeks (or a couple months if I&#8217;m new to a company, their people, culture and processes), it becomes clear that the people are well-intentioned, but they are missing major pieces in their development process (and they all know it, too).</p>
<p>I may walk into a company and say, &#8220;You have no automated build process. You spend 2 days each week doing the same thing. You have developers with different environments, so they spend a solid day each week trying to figure out why an issue in QA can&#8217;t be replicated on Bart&#8217;s workstation, but it can be replicated on Wyatt&#8217;s workstation with ease.&#8221;</p>
<p>Then, I ask, &#8220;Why not add an Automated Build Process?&#8221;</p>
<p>The answer is always the same: &#8220;We don&#8217;t have enough time.&#8221;</p>
<p>The answer is going to be the same whether we&#8217;re talking about refactoring a code-base to design patterns, adding a version-control system, implementing a framework, or adding an automated build process.</p>
<p>By default, your boss is going to tell you &#8220;No.&#8221;</p>
<p><strong>The Unspoken Truth about Your New Enterprise Approach</strong></p>
<p><em>Enterprise practices will probably</em><em> absolutely save you time on your next big project (and all projects grow in complexity and become &#8216;big&#8217;, anyways). </em>Enterprise practices help to ensure projects get completed. Enterprise practices keep morale high and prevent resources people from quitting in the middle of the morning Scrum resigning at the end of the project. Enterprise practices reduce tension and friction between team-members. Enterprise practices will help to ensure you go home by 8pm, 7pm,6pm, 5pm (going home at a reasonable hour ensures mothers and fathers see their kids and the enterprise practices ensure loved ones see their significant others. Going home at a reasonable hour means you&#8217;ll probably workout and eat a healthy dinner and watch a movie).</p>
<p>It&#8217;s NOT cool to talk about these &#8216;desires&#8217; at the next Business Requirements meeting. IT IS COOL to talk about how amazing the project is going to be when it&#8217;s done and how valuable you&#8217;ll all be!</p>
<blockquote><p><strong>Steps If you&#8217;re In the beginning of a project</strong>:</p></blockquote>
<blockquote>
<ol>
<li>Find a process that is popular and would apply to your project.</li>
<li>Implement 1 new enterprise practice into your project (and act like it was totally expected if anyone asks). From this,
<ul>
<li>You will benefit</li>
</ul>
<ul>
<li>Your company will benefit</li>
</ul>
<ul>
<li>Your team will benefit</li>
</ul>
</li>
<li>Immerse yourself in the new practice over the next two weeks, and then tinker with it for an hour or two a day.</li>
</ol>
</blockquote>
<blockquote><p><strong>Steps If You&#8217;re In the Middle of a Project</strong>:</p>
<ol>
<li>Find a process that is popular and would apply to your project.</li>
<li>Memorize the buzzwords.</li>
<li>Understand intimately how the process applies to your project.</li>
<li>Understand intimately why the process was never implemented or suggested. You may end up attacking someone&#8217;s competency or your own, so be prepared to vigorously defend your newly-held beliefs.</li>
<li>Propose a new approach. Tell your boss that your company MUST implement a _______.</li>
<li>Prepare for the rebuttal of, &#8220;We don&#8217;t have enough time to implement _______&#8221;. Explain why implementing the process will save you time, money, and a loss in morale.&#8221;</li>
<li>Repeat the proposal as a <a href="http://en.wikipedia.org/wiki/Mantra">Mantra</a>.
<ol>
<li>If the company elects not to use your approach, show them as the project moves forward that you could have saved time (and money) by using your idea with specific examples in the moment. I often use, &#8220;I guess we could have been out having beers instead of doing this again [bonus points for a dead-pan delivery].&#8221; Don&#8217;t let your proposal be forgotten.</li>
</ol>
</li>
</ol>
</blockquote>
<p><strong>Choose the right company and learn on the job</strong><br />
The processes a small company adopts are centered around a development approach that produces a more robust product in less time, with fewer developers, even if that means rapidly learning something new. You could be working on Flex one day, and Silverlight the next. You could be working on JavaFX and then back on Flex. The small companies are not bound to the same constraints as a huge company. Small companies have flexibility and choice. You can walk into a small company and propose a development approach you&#8217;re interested in learning, and your boss may let you run with it. And by &#8220;propose&#8221;, I&#8217;m talking about going out to Starbucks with your boss and proposing the adoption of LiveCycle or agreeing to migrate to a new SDK while he&#8217;s adding extra ice to his Venti Iced-Coffee.</p>
<p>At a small company, you&#8217;re going to need to learn new platforms on the job, which often means you have to request to be moved to projects that offer you the opportunity to learn new things. Show initiative and be very honest if you feel like you&#8217;re not being put on a project that will make you more marketable (if you think there are other options).</p>
<p>A Fortune 500 company is slow-moving, and it&#8217;s usually one major platform (or 2) behind in each release cycle. The Fortune 500 company has a major perk if you&#8217;re a Self-Starter: if the code you&#8217;re working on has reached a milestone earlier than expected, you&#8217;ll have time to <a href="http://labs.adobe.com/">download</a> and experiment with the latest languages, methodologies, and application servers on the company dime while you wait for the others to catch-up (and remember, your goal is to look busy so you don&#8217;t make your boss look like he&#8217;s not managing. He knows what you&#8217;re doing. Just don&#8217;t bring your start-up to the office).</p>
<blockquote><p><em>In Old-West Speak</em>: There&#8217;s a big difference between Tombstone, Arizona and Tucson, Arizona. Choose the town that gives you the best opportunity to learn new things.</p></blockquote>
<p><strong>Learn how to be resourceful</strong><br />
In 2003, the project I was working on was winding down. I had finished the programming and I was bored out of my mind. I was still an entry-level programmer and I wasn&#8217;t learning anything new. So I joined <a href="http://www.ultrashock.com/forums/" target="_blank">UltraShock</a>, a Flash forum. I would go through the posts with questions I didn&#8217;t know the answer to, and I would search out the answer, write the code, test the code, and the post the solution.</p>
<p>I received lots of emails and posts thanking me for helping someone solve a problem, but I was really helping to advance my own skill-set. I also taught myself something very valuable: I am fully capable of finding a solution to ANY programming problem. I learned the true skill-sets of my peers (what they were good at solving even if they didn&#8217;t enjoy solving the problem), how to search through live-docs, and I learned the power of networks (someone always seemed to know someone who had special knowledge of a topic).</p>
<blockquote><p><em>In Old-West Speak</em>: Prove to yourself that you can setup camp between any two saloon-towns and survive based on your resourcefulness. Can&#8217;t find the instructions for setting up your tent? Can&#8217;t read the instructions for setting up your tent? You need to prove to yourself that you can find someone in the next town who can teach you.</p></blockquote>
<p><strong>Work with someone smarter than you</strong><br />
In 2004, I took a job in Jacksonville, Florida. After having worked a contract in San Diego and having enjoyed the weird, transient lifestyle that is Reno, Nevada, I wasn&#8217;t exactly keen on moving to Jacksonville. My girlfriend at the time was interested in moving back to her hometown, and my boss was pretty honest that the product we launched wasn&#8217;t selling and I was a drain on payroll.</p>
<p>I was assigned to work in R&amp;D as  a Flex Developer. My team-lead was exceptionally bright, and he taught me Object-Oriented Programming, Object Relational Mapping, and Frameworks. He moved me away from the world of procedural programming that I had found to be comfortably familiar, and helped me to transition into real software development. He helped me over a hurdle that was difficult to learn on my own by mentoring me.</p>
<p>Just remember, if you&#8217;re an entry-level developer, that&#8217;s okay. I&#8217;ve always been amazed how perceptive managers are when it comes to understanding the competency of their employees (even when they pretend to be incompetent). If you don&#8217;t know how something works, open up and be honest about your confusion. Whatever you do, don&#8217;t pretend to know something. In Software, you get a gauge on someone&#8217;s competency pretty quickly.</p>
<blockquote><p><em>In Old-West Speak</em>: Find the first School-house you can, and listen carefully to the school-teacher. Sit closer if it helps, and don&#8217;t worry about what the other kids say about you being the teacher&#8217;s pet (you probably won&#8217;t be working with them in a few years anyhow).</p></blockquote>
<p><strong>Learn from Blogs, but Filter out the Noise</strong><br />
Most blog aggregators feed off the blogs of thousands of developers. Most of the bloggers don&#8217;t contribute much to your learning. Follow the handful of developers who are going to give you a glimpse of their experiences with the latest in Flex Development. Don&#8217;t waste time reading the blogs of people who aren&#8217;t going to offer valuable insight. You can learn a lot from a small group of people, like <a href="http://jessewarden.com/" target="_blank">Jesse Warden</a>, <a href="http://www.webappsolution.com/wordpress/" target="_blank">Brian Riley</a>, and <a href="http://www.stevensacks.net/" target="_blank">Steven Sacks</a>.</p>
<p>If you&#8217;re not eagerly looking forward to the next post a blogger writes, you shouldn&#8217;t be reading the blog. If you&#8217;re thinking about buying the blogger a Christmas present because he or she has taught you something that has enriched your professional career, you&#8217;re on the right blog.</p>
<blockquote><p><em>In Old-West Speak</em>: A lot is said down at the Saloon. Strangers like to talk and share stories. Ignore almost everything you hear in that saloon, unless it comes from the mayor or the sheriff.</p></blockquote>
<p><strong>Build a Small-Scale, Enterprise-Application</strong><br />
One of the beautiful and terrifying parts about technology is how massive milestones have reduced job-security. When I was starting out as a programmer in 2000, the DBAs were the highest paid positions with the most job security. By the time <a href="http://en.wikipedia.org/wiki/Hibernate_%28Java%29">Hibernate</a> evolved and became common-place, DBAs were no longer the foundation of all projects. With Adobe LiveCycle Dataservices and the Fiber Modeling Plug-in, most of the work that was done on the client by a Flex Developer has become the &#8216;domain&#8217; of the Java Developer. Much of the work that the DBA used to do will now be done starting in the Model that drives the DB creation. Much of the work the Java developer used to do is now done based on services the Model generates. It&#8217;s awe-inspiring to see how much quality code Fiber can generate, but Flex Developers will soon need to know more about Model-Driven Development (Including Hibernate and Java) if they&#8217;re going to stay relevant.</p>
<p>It&#8217;s important to build a product you&#8217;re passionate about. It doesn&#8217;t need to be enormous, and it can be a product that does very little, but it needs to utilize an entire enterprise-stack. By building and evolving this project, you&#8217;re going to learn languages, platforms and application servers you never knew about, and you&#8217;re also going to learn how those things work together.</p>
<ul>
<li>Learn a tool that makes life easier. Try <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm+Libraries">Cairngorm 3 Validation</a></li>
<li>Learn a mainstream framework. Try <a href="http://www.spicefactory.org/parsley/">Parsley</a></li>
<li>Improve the quality of your code using a Code Quality tool. Try <a href="http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD">FlexPMD</a></li>
<li>Learn a unit-testing framework. Try <a href="http://opensource.adobe.com/wiki/display/flexunit/FlexUnit">FlexUnit 4</a></li>
<li>Make all of the above work with an automated build-process. Try <a href="http://ant.apache.org/">Ant</a></li>
<li>Learn some Java. The support for Java and Flex integration is excellent, the language and the OOP concepts are similar to Actionscript, and the tools for Enterprise development are robust. Try a<a href="http://java.sun.com/docs/books/tutorial/java/index.html"> Java Tutorial</a>.</li>
</ul>
<blockquote><p><em>In Old-West Speak</em>: Build your own Saloon Town that can stand the test of time, even if each building is the size of an outhouse.</p></blockquote>
<p><strong>Look Into the Future of Trends (and position yourself accordingly)</strong></p>
<blockquote><p><strong>Frameworks</strong></p>
<p>In 2004, Caringorm was the standard framework for Flex development. It was also the only choice. Last year, most of the contracts I was working on used PureMVC, and two of the client courtships required PureMVC experience. By the end of 2009, most of the contracts I was courting were using or moving towards Mate or Parsley. Now, RobotLegs is gaining some momentum and Cairngorm libs are being coupled with Parsley as the framework of choice.</p>
<p>You can&#8217;t learn every framework. Worse, when you&#8217;re out there interviewing for that next great Flex job, you may find that the team interviewing you is dead-set on finding someone who knows the framework they&#8217;re using. Don&#8217;t feel like you&#8217;re incompetent because you&#8217;re not familiar with every Flex framework.</p>
<p>A framework is an <a href="http://en.wikipedia.org/wiki/Architectural_pattern_%28computer_science%29">Architectural Design Pattern</a>, and all Architectural Design Patterns look to solve the same problem: <em>An architectural pattern expresses a fundamental structural organization schema for a <a title="Software system" href="http://en.wikipedia.org/wiki/Software_system">software system</a>, which consists of subsystems, their responsibilities and interrelations.</em></p>
<p>Rather than jump on the framework-of-the-week bandwagon, look at where the time, energy and money is being spent by examining the <a href="http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/">Trunk of Adobe&#8217;s Open-Source Project</a>. Don&#8217;t worry about learning every framework, but always be familiar with the direction of large teams who shape and mold the future of technologies.</p>
<p><strong>Don&#8217;t worry about the next Flash-Killer</strong><br />
You&#8217;re going to see a danger to your livelihood quite often. You&#8217;ll see competing skills required in &#8220;Wanted:Flex-Developer&#8221; job postings. You&#8217;ll think you&#8217;re falling behind or you&#8217;ll think the world hates Flash. Focus on what you enjoy and if you ever need to make a switch, you should see the writing on the wall about 2-4 years ahead of time, and when you do know, rest-assured there will always be jobs to tide you over until you learn something new.</p>
<p><strong>Automate quality on Friday. AKA: </strong><em><strong>Friday is for Refactoring</strong></em><br />
Projects grow in their complexity very quickly and the best way to know you&#8217;re moving a project forward is to know you&#8217;re contributing to the growth of the code-base, not duplicating it or obfuscating the code.</p>
<p>You&#8217;re going to meet developers who are going to tell you that you&#8217;d be just as good as them, if only you worked harder to &#8220;just get it done.&#8221; You&#8217;re going to see developers who show you how to do something in ColdFusion, JavaScript, and PHP that can be done in just 10 lines of code[!]. Developers are going to tell you that with Actionscript and Java, you&#8217;re going to be writing 100 lines of code for every 10 they would write in another language. Remember that a Robust product is never measured in the sheer number of lines of code. The ability to output a variable in fewer lines of code doesn&#8217;t reflect the integrity of the code when there are new conditions applied.</p>
<p>I&#8217;ve had clients who wanted to measure my productivity by the number of lines of code I&#8217;d written. Yet, I&#8217;ve helped Fortune 30 companies to move a stalled product from stagnation into production by refactoring a project to a fraction of the size it once was.</p>
<p>You should obsess over the idea of writing code that is reusable. Tools like FlexPMD and FlexCPD can help to ensure you&#8217;re writing quality code. Books like Martin Fowler&#8217;s <a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1266692964&amp;sr=8-1">Ractoring</a> will help you to write better code.</p>
<p>Set-aside every Friday to refactor the code you&#8217;ve written all week using the latest tools and proven methodologies. Write less code.</p>
<p><strong>RPCs</strong></p>
<p>In 2004, ColdFusion with Flash Remoting was still the standard in two companies where I was working. Both companies have since moved to Java with a Flex Client. By 2007, WebServices was the norm with Java. By 2009, most of the companies were using Java with BlazeDS. Next year, I suspect most of the projects are going to be incorporating Adobe&#8217;s beautiful LiveCycle Data Services with the Fiber plug-in for Model Driven Development.</p>
<blockquote><p><strong>Learn RemoteObjects</strong></p></blockquote>
<blockquote><p>Don&#8217;t worry about learning every single RPC as a Flash or Flex Developer. I&#8217;m going to take it one step-further and encourage you to skip-over WebServices altogether. Don&#8217;t bother with JSON, XML, or HTTP.</p></blockquote>
<blockquote><p>Most of the companies I&#8217;ve worked for have used one or all of the above to get their software up and running. Those same companies are working on Legacy platforms. When you work with real entities through BlazeDS/LCDS/AMF/GraniteDS, you have the opportunity to work with real-objects that have a direct correlation to identical (or slightly transformed) objects on the client.</p></blockquote>
<blockquote><p>Model-Driven Development with Flash Builder 4 and LCDS represents something more than a simple-code-generator. MDD with Fiber and LCDS gives small companies and enterprise organizations a starting point to eliminate hundreds of tasks developers used to implement manually.</p></blockquote>
</blockquote>
<p><strong>Programming is a Living. Programming is not Living</strong>.<br />
Six years ago, I was driving in my truck with a good friend. It was late in the evening and we had just finished unloading some boxes of furniture I had given him as I prepared to move to Atlanta. I brought up work, and my friend asked, &#8220;Why is it that whenever software developers get together, we always talk about work? I miss talking about R/C airplanes.&#8221;</p>
<p>My friend had a valid point: Software Development requires so much time and energy, that it&#8217;s hard to leave work at the office. Some of the problems are so complicated and so multidimensional, it&#8217;s hard not to leave the cubicle and ponder the possible solutions. Now, looking back at the past 10 years, I can honestly tell you that I haven&#8217;t solved many problems thinking about them after-hours.</p>
<p>Worse, I haven&#8217;t really had any conversations evolve after I answered the notorious question of, &#8220;So what do you do for a living?&#8221;</p>
<p>People have a frame of reference for &#8220;Software Developers&#8221;. And the second someone hears you&#8217;re a &#8220;Programmer&#8221;, they have visions of you sitting in your mother&#8217;s attic for three years without any friends, trying to reassemble the Atari you disassembled, just to prove to yourself you could put it back together again.</p>
<p>If you hang-out with coworkers after work, you&#8217;ll tire of your job much more quickly. Social-skills come from regular interaction, and experimentation. These same social skills are important at work, and they&#8217;re important to having a real-life. You are not your job, even if you&#8217;re at the office more than you are at the house. Each time I have an ad-agency as a client, I&#8217;m reminded how charismatic the designers and marketing people tend to be. Each time I have a software consultancy as a client, I&#8217;m amazed how introverted developers tend to be, with no inflection, a rapid speech rate, slumped shoulders, and poor eye-contact. Their body-language and speech patterns often reflect their self-confidence.</p>
<p>Don&#8217;t let software become your life. If you become a Flex Developer and Stay a Flex Developer, come up with a plan to keep learning, while you explore other interests and find new friends. Get on <a href="http://www.meetup.com/find/?keywords=Horseback+Riding" target="_blank">meetup.com</a> and find something else to do, but do things to remind yourself that writing solutions to solve complex problems can be a great way to make a living. But it&#8217;s not living.</p>
]]></content:encoded>
			<wfw:commentRss>http://frontendconsultant.com/how-to-become-and-maybe-even-stay-a-flex-developer/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.544 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-01 05:12:08 -->
<!-- Compression = gzip -->
