<?xml version="1.0" encoding="utf-8"?>
			
			<rss version="2.0">
			<channel>
			<title>Webapper.net Blog</title>
			<link>http://www.webapper.net/index.cfm</link>
			<description>Webapper posts information here covering the full spectrum of technologies that comprise Web-based applications, with a focus on ColdFusion, Java/J2EE, and Flash/Flex.</description>
			<language>en-us</language>
			<pubDate>Tue, 18 Nov 2008 22:15:31 -0500</pubDate>
			<lastBuildDate>Mon, 20 Oct 2008 19:07:00 -0500</lastBuildDate>
			<generator>BlogCFC</generator>
			<docs>http://blogs.law.harvard.edu/tech/rss</docs>
			<managingEditor>blog@webapper.net(Patrick Quinn)</managingEditor>
			<webMaster>blog@webapper.net(Patrick Quinn)</webMaster>
			
			
			
			
			
			<item>
				<title>Subversion hook to verify unit testing?</title>
				<link>http://www.webapper.net/index.cfm/2008/10/20/Subversion-hook-to-verify-unit-testing</link>
				<description>
				
				Ever since last year, we&apos;ve setup subversion to require comments are added before a file can be committed to our SVN repositories. Even just small comments on file commits is helpful.

But what I REALLY want is a subversion hook that requires a file is unit tested before it can be submitted to the repository. Think of the power of that. In fact let me say that again...

Before you can commit a file, you HAVE TO TEST IT LOCALLY. 

That&apos;s one of the things I&apos;ve been working on with my &lt;a href=&quot;http://www.webapper.net/index.cfm/2008/10/20/The-Return-of-the-ColdFusion-Debugger&quot;&gt;inline CFML debugger&lt;/a&gt;. So far it&apos;s pretty simple, I&apos;ve added an attribute to the cffunction tags in my unit tests called TestApproved which can either be 1 or 0. So when you run a unit test the inline debug gives you a form to approve the test. If the test itself doesn&apos;t throw an error you have decide if the results of the code are correct. Then you just approve.

I just got that working yesterday, this week I&apos;ll play with the SVN pre-commit hook. I think that&apos;s what I want. Basically I&apos;m just going to have the pre-commit hook search for those TestApproved attributes. I&apos;m going to make it fudgeable on purpose.

Has anyone out there ever done a pre-commit hook with subversion?
				
				</description>
				
				<category>ColdFusion</category>
				
				<pubDate>Mon, 20 Oct 2008 19:07:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/10/20/Subversion-hook-to-verify-unit-testing</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>The Return of the ColdFusion Debugger</title>
				<link>http://www.webapper.net/index.cfm/2008/10/20/The-Return-of-the-ColdFusion-Debugger</link>
				<description>
				
				I think around the time of ColdFusionMX 6, the inline CF debugger went downhill. It became incredibly slow to the point of being unusable on many applications. It became common knowledge to simply disable it because it could very quickly bog down a CF server.

A couple years ago I wrote my own version of the inline debugger and have been using it locally ever since. What I found is that the reason it is so slow is the file/function tree. It&apos;s a recursive tree that on sites with tons of method calls can very easily have hundreds, sometimes thousands (no joke) of nodes in the tree. Specifically in applications with frameworks containing &apos;core files&apos;. It really wasn&apos;t the debugger itself that is slow, IMO, it just happens to be slow on pages that have an enormous number of code dependencies.

But I have found that the file tree really didn&apos;t help me debug anything at all. So I&apos;ve scraped that in the version I&apos;ve been using. On the other hand, one of the truly useful things in the out of the box debugger are the list of queries run on a given page. What&apos;s NOT useful about the queries are listing out the cfqueryparams outside of the SQL. Commonly when I&apos;m trying to figure out why something isn&apos;t working, I like to copy/paste a sql statement into sql server&apos;s enterprise manager or sqlyog for mysql. But it&apos;s a big pain to do that with a bunch of query params. So in the one I&apos;ve been using I added some string parsing to replace the ?s with the actual values. I also added a tabbed user interface and collapsible queries and a few other minor fixes for annoyances.

I&apos;m bringing this up because I started working on my debugging template again. I&apos;m going for a ton of new functionality. One of the first things I&apos;m going to tackle is to incorporate unit testing right into my inline debugger. I find both cfunit and cfcunit are fair, but I&apos;ve never been thrilled with either. They are missing a lot of obvious (to me) low hanging fruit and some other not-so-obvious but important tools for testing. 

I haven&apos;t thought this through, but I like the idea of adding a tasks tab to the inline debugger. Maybe one that&apos;s connected to FogBugz. Maybe a project scheduler. Who knows. 

Anyway, I thought I&apos;d throw this post out to the world. I might make this an open source project, but that tends to be a lot of work. We&apos;ll see.
				
				</description>
				
				<category>ColdFusion</category>
				
				<pubDate>Mon, 20 Oct 2008 12:21:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/10/20/The-Return-of-the-ColdFusion-Debugger</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>ColdFusion SQL Injection</title>
				<link>http://www.webapper.net/index.cfm/2008/7/22/ColdFusion-SQL-Injection</link>
				<description>
				
				Seems there&apos;s a lot of ColdFusion sites out there getting hit by an automated SQL Injection attack, which adds a &quot;&amp;lt;script&amp;gt;&quot; tag to varchar fields using a bit of SQL Server t-sql.

Many years ago, I wrote a script that would find and automatically &amp;lt;cfqueryparam&amp;gt; queries (which has been at &lt;a href=&quot;http://www.cfprimer.com&quot; target=&quot;_blank&quot;&gt;Daryl&apos;s ColdFusion Primer&lt;/a&gt;.  I&apos;ve dug that up and updated it slightly to handle INSERT statements and not parameterize cached queries.  (The latter will be highlighted in red.)

(For more information about avoiding SQL Injection in the first place, see my &lt;a href=&quot;http://www.cfprimer.com/style.cfm&quot; target=&quot;_blank&quot;&gt;Paranoia 101&lt;/a&gt; page at the aforementioned Primer.)

Place the script (temporarily) in your webroot and run it.  It will show you all of the queries in that directory tree and give you checkboxes next to each that will allow you to choose which queries to parameterize.  It will also show you what the result of parameterization will look like.

Remember-- it&apos;ll show you what it plans to do before it does anything.  So you &lt;em&gt;can&lt;/em&gt; run it once (and not click the &quot;submit&quot; button) simply to see what files contain unparameterized queries.

Caveats:

This will probably break some queries, especially if you do things like &lt;b&gt;WHERE date &gt; &apos;#dateFormat(d)# #timeformat(d)#&apos;&lt;/b&gt; or &lt;b&gt;WHERE NAME LIKE &apos;#searchname#%&apos;&lt;/b&gt;.  &lt;font color=red&gt;&lt;b&gt;USE WITH CAUTION!&lt;/b&gt;&lt;/font&gt;  It&apos;s best to test the changes before moving them into production.  Remove the &quot;.old&quot; files once the site is confirmed as working well.

&lt;a href=&quot;http://www.cfprimer.com/download.cfm?ffFile=_parameterizeQueries.cfm&quot;&gt;Download the Script&lt;/a&gt;
				
				</description>
				
				<category>ColdFusion</category>
				
				<category>Databases</category>
				
				<category>General Development</category>
				
				<pubDate>Tue, 22 Jul 2008 07:25:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/7/22/ColdFusion-SQL-Injection</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>How to make the full path appear in the finder title (OS X)</title>
				<link>http://www.webapper.net/index.cfm/2008/7/10/How-to-make-the-full-path-appear-in-the-finder-title-OS-X</link>
				<description>
				
				In Windows, the Explorer window shows the full path of the folder in the address bar. It&apos;s very handy if you&apos;re moving files around with multiple Explorer windows open. It&apos;s also very handy to know if you&apos;re in the right folder named if multiple folders share the same name. (Like &quot;bin&quot;.)

But in Mac OS X, the Finder window doesn&apos;t show the full path. Yes, you can add the Path button, and you can add a status bar to show the path, which is clickable. But this is not ideal since in both of those cases, it shows the &quot;friendly&quot; path, not the real path, in the case of mounted volumes. (Of which I deal frequently.)
				 [More]
				</description>
				
				<category>General Development</category>
				
				<category>Macintosh</category>
				
				<pubDate>Thu, 10 Jul 2008 00:36:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/7/10/How-to-make-the-full-path-appear-in-the-finder-title-OS-X</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Questions about Subversion (and some answers)</title>
				<link>http://www.webapper.net/index.cfm/2008/7/3/Question-about-Subversion-and-some-answers</link>
				<description>
				
				A friend pinged me on IM today with some questions about Subversion and instead of just answering him directly, I thought it might be helpful to answer him here, and solicit feedback from others.

&lt;i&gt;1. How easy is it to set up? Is any additional software needed? (E.g. Apache)&lt;/i&gt;

Subversion is very easy to set up. The Tigris.org site for Subversion has Windows binaries available for download. I&apos;m only speaking about Windows setup as I&apos;ve not done it anywhere else. You run the installer, and choose the SVN daemon mode, where it runs as it&apos;s own Windows service and on its own port (3690). I think this is the easiest way to install it.

You can however, install it with Apache support. Doing it this way will route traffic over port 80, and uses an Apache module to handle SVN traffic over the web server. I have no experience with this.

&lt;i&gt;2. Must you &quot;check in&quot; a file in order to test it, or can you test it before you &quot;check in/merge&quot; a file?&lt;/i&gt;

There are a couple things going on here. I&apos;ll try my best. First off, the developers I work with always develop locally. That means that you&apos;re testing while you&apos;re developing. But we also use CruiseControl which is a Continuous Integration utility, hooked up to CFCUnit. That way, when you &quot;check in&quot; (called a Commit in SVN) any files, a suite of unit tests is run by CruiseControl. That way, we have automatic testing of the entire application any time anyone commits a change to the repository.

The second thing that needs mention is that SVN is a source code database. It isn&apos;t the source code itself. You can have the SVN daemon running on your staging server, but you don&apos;t have to. And just having it running on your staging server doesn&apos;t mean that code you commit to the repository will get onto the staging server&apos;s webroot. The way you push changes to the repo to other servers (for testing) is either using CruiseControl (which involves a lot of setup and uses ANT) or a post-commit hook. Example post-commit hooks are available in the default SVN installation and include commands to copy the changes (the commits) from the repository to another server. This way, you can have a central staging server that is an up-to-the-minute copy of the code in the repo.

&lt;i&gt;3. Have you used it with the Eclipse client? Does it work nice with CFEclipse?&lt;/i&gt;

I have only briefly used it with the Eclipse client, called Subclipse. It worked okay, but for Windows, I always found myself using TortoiseSVN (which is absolutely fantastic). Now I&apos;m on a Mac, so I&apos;m using SCPlugin, which is similar to TortoiseSVN (it bolts onto the Finder) as well as Versions, a new Mac SVN client. I don&apos;t use Eclipse any more myself.

Subclipse and CFEclipse work great together due to Eclipse&apos;s plug-in architecture.

Does anyone have anything to add?
				
				</description>
				
				<category>General Development</category>
				
				<pubDate>Thu, 03 Jul 2008 09:32:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/7/3/Question-about-Subversion-and-some-answers</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Stop and start ColdFusion on Mac OSX without a script</title>
				<link>http://www.webapper.net/index.cfm/2008/6/24/Stop-and-start-ColdFusion-on-Mac-OSX-without-a-script</link>
				<description>
				
				I&apos;m a recent switcher, having used Windows for, well, ever. So far, the switch has been painless, and I&apos;m only using XP in VMWare for SQL Server 2000 and 2005, including the studio tools.

But it&apos;s the little daily things that are tripping me up. I learned ifconfig as the replacement for ipconfig, I&apos;m getting comfortable with the Network Configuration util and the Activity Monitor.

Today&apos;s problem was that I didn&apos;t know how to bounce the ColdFusion service. In Windows, it&apos;s as simple as using the Services panel or running the &quot;net start&quot; &quot;net stop&quot; commands on the command line. I did figure out how to restart CF on the Terminal, but I wanted something to click, since I don&apos;t usually keep a terminal window open, and I can&apos;t remember the syntax for it.

I started trying to make a script I could keep in the dock to bounce the CF service, but I bailed on that pretty quickly when I discovered the ColdFusionLauncher.app, which is included in CF for Mac OSX since version 7. It&apos;s located in the main ColdFusion folder (for me it was /Applications/ColdFusion8. Just fire up that puppy to start or stop your instance, along with running the wsconfig applet. All very helpful, and not immediately visible on Google searches.

Check it out here: &lt;a href=&quot;http://kb.adobe.com/selfservice/viewContent.do?externalId=b50acd43&amp;sliceId=1&quot;&gt;http://kb.adobe.com/selfservice/viewContent.do?externalId=b50acd43&amp;sliceId=1&lt;/a&gt;
				
				</description>
				
				<category>ColdFusion</category>
				
				<pubDate>Tue, 24 Jun 2008 11:52:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/6/24/Stop-and-start-ColdFusion-on-Mac-OSX-without-a-script</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Reviving the Lost Craft of Writing Specification Documents</title>
				<link>http://www.webapper.net/index.cfm/2008/6/20/Spec-Doc-Template</link>
				<description>
				
				My CFUnited presentation went very well - the room was pretty full and I had a bunch of great questions from the audience. If you were there, thank you for showing up!

Here are the materials:
				 [More]
				</description>
				
				<category>General Development</category>
				
				<category>Conferences</category>
				
				<pubDate>Fri, 20 Jun 2008 06:22:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/6/20/Spec-Doc-Template</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Come On In, Rails-The Water&apos;s Warm</title>
				<link>http://www.webapper.net/index.cfm/2008/5/8/Come-On-In-RailsThe-Waters-Warm</link>
				<description>
				
				There&apos;s an article in the latest eWeek magazine, entitled &quot;Scaling Ruby on Rails&quot;, that&apos;s instructive for those of us in the ColdFusion community. RoR is going through that time-honored rite of passage experienced by any programming language that gains wide adoption. Namely, so-called critics are questioning its scalability and its suitability for mission-critical applications. Sound familiar?

One supporter of Rails notes the following:

&quot;The critiques we hear about Rails is it&apos;s not scalable, that it&apos;s not well-suited for mission-critical applications. I think those critiques are similar in nature to what we heard about Java in the mid-90s.&quot;

And my favorite retort to the scalability questions comes from Rails creator David Heinemeier:

&quot;This is the known as the &apos;last stance&apos; defense. When you have nothing left of substance to argue with, you draw the &apos;but does it scale?&apos; card.&quot;

Awesome. Amen, my brother. I couldn&apos;t have said it better myself. And the exact same response applies to ColdFusion, just as it did to Java and many others over the years. Once you&apos;ve tuned a few hundred queries in your career from 3000ms to 30ms, you come to know that the scalability question is almost always a red herring. To paraphrase a quip from politics, &quot;It&apos;s the code, stupid!&quot;

Our co-founder and former CTO, Mike Brunt, tells a great story about when he was onsite doing some of our famed tuning work some years ago. He had been applying our tuning efforts on a system well into the night during an engagement, and around 6am the next morning, when user traffic ramped up dramatically every day, he got a frantic call from the CEO, breathlessly saying that the servers were all down. And why did he think this? Because the traffic monitoring graphs had all dropped to sub-1-second response times, such that they looked so different than &quot;normal&quot; that that he concluded there must not be any traffic on the servers. In true British form, Mike said something along the lines of &quot;Bollox to you and your bad code--the servers are fine!&quot; Again, &quot;It&apos;s the code, stupid!&quot;

So, to all ColdFusion compatriots--don&apos;t fall for this nonsense. Ever. If you hear it, smile. It&apos;s just a reflection of the prominence of your platform. And if you&apos;re stuck on performance problems, contact us--we&apos;ve never NOT tuned a system we&apos;ve been engaged to tune.

To our brethren in the Rails community--welcome to the party. Come on in, the water&apos;s warm. Now that you&apos;re hearing all the same &quot;last stance&quot; questions that ColdFusion has been dispatching for years, we wish you all the growth that ColdFusion has experienced!
				
				</description>
				
				<category>Performance</category>
				
				<category>General Development</category>
				
				<category>ColdFusion</category>
				
				<category>Business of Software</category>
				
				<pubDate>Thu, 08 May 2008 09:07:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/5/8/Come-On-In-RailsThe-Waters-Warm</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Shan&apos;s Simple Examples: File uploads with Flex and ColdFusion</title>
				<link>http://www.webapper.net/index.cfm/2008/4/27/Shans-Simple-Examples-File-uploads-with-Flex-and-ColdFusion</link>
				<description>
				
				Someone in #flex was talking about how there were no good examples for doing uploads with Flex and ColdFusion. Sounded like an excellent topic to cover here. Now this example is a tiny bit more complex than previous examples, because I needed to cover two methods of functionality: single file uploads and multi-file uploads. Both processes are very similar, and in my code they actually share a method.

Here&apos;s the MXML application:
&lt;code&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; creationComplete=&quot;init()&quot; layout=&quot;absolute&quot;&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.controls.Alert;
			private var myFileList:FileReferenceList;
			private var myFile:FileReference;
			private var uploadTarget:URLRequest = new URLRequest(&quot;upload.cfm&quot;);
			
			private function init():void {
				myFileList = new FileReferenceList();
				myFileList.addEventListener(Event.SELECT,fileListSelected);
				
				myFile = new FileReference();
				myFile.addEventListener(Event.SELECT,fileSelected);
			}
			
			private function fileListBrowse():void {
				// we only want to allow images to be uploaded
				var imagesFilter:FileFilter = new FileFilter(&quot;Images&quot;, &quot;*.jpg;*.jpeg&quot;);
				myFileList.browse([imagesFilter]);
			}
			
			private function fileBrowse():void {
				// we only want to allow images to be uploaded
				var imagesFilter:FileFilter = new FileFilter(&quot;Images&quot;, &quot;*.jpg;*.jpeg&quot;);
				myFile.browse([imagesFilter]);
			}
			
			private function fileListSelected(e:Event):void {
				// here we could do whatever we want, but we&apos;re just going to
				// upload right away
				uploadFromList();
			}
			
			private function fileSelected(e:Event):void {
				// here we could do whatever we want, but we&apos;re just going to
				// upload right away
				uploadFile(myFile);
			}
			
			private function uploadFromList():void {
				if (myFileList.fileList.length &gt; 0) {
					// if there are still files left to upload, continue
					myFile = myFileList.fileList[0] as FileReference;
					uploadFile(myFile);
				} else {
					// if there are no more files, stop
					return;
				}
			}
			
			// NOTE: this method is used for one or multiple files
			private function uploadFile(f:FileReference):void {
				// here we build out the other form items
				var urlVars:URLVariables = new URLVariables();
				urlVars.myFirstValue = 1;
				urlVars.myOtherValue = &quot;something else&quot;;
				
				// add the form items to the request
				uploadTarget.data = urlVars;
				// set request the method to POST
				uploadTarget.method = URLRequestMethod.POST;
				
				// add the event listeners
				// DataEvent.UPLOAD_COMPLETE_DATA only fires if data is returned and the flash player supports it
				// otherwise, use Event.COMPLETE
				f.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,onDataComplete);
				f.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
				f.addEventListener(ProgressEvent.PROGRESS, progressHandler);
				
				// show the progress bar
				myProgress.visible = true;
				
				// start the upload
				f.upload(uploadTarget,&quot;myUploadFieldName&quot;);
			}
			
			private function ioErrorHandler(e:IOError):void {
				// there was some error, you&apos;ll want to tell someone
				Alert.show(&quot;Error occured, oops!&quot;,&quot;I/O Error&quot;);
			}
			
			private function progressHandler(e:ProgressEvent):void {
				// update the ProgressBar
				myProgress.setProgress(e.bytesLoaded,e.bytesTotal);
			}
			
			private function onDataComplete(e:DataEvent):void {
				// here we could handle whatever was returned by the server. XML is probably your best bet.
				// var myResult:XML = XML(e.data); // would work for XML
				var myResult:String = e.data;
				
				// if there were multiple files, delete the one we uploaded and try another
				if (myFileList.fileList.length &gt; 1) {
					// remove what we just uploaded
					myFileList.fileList.splice(0,1);
					// go upload another another
					uploadFromList();
				} else {
					// if this was the last of a multiple file upload, remove it
					if (myFileList.fileList.length &gt; 0) {
						myFileList.fileList.splice(0,1);
					}
					
					// we&apos;re done uploading
					myProgress.visible = false;
					return;
				}
			}
		]]&gt;
	&lt;/mx:Script&gt;
	&lt;mx:VBox height=&quot;100%&quot; width=&quot;100%&quot; horizontalAlign=&quot;center&quot; verticalAlign=&quot;middle&quot;&gt;
		&lt;mx:Button label=&quot;Choose One File to Upload...&quot; click=&quot;fileBrowse()&quot;/&gt;
		&lt;mx:Button label=&quot;Choose Multiple Files to Upload...&quot; click=&quot;fileListBrowse()&quot;/&gt;
		&lt;mx:ProgressBar id=&quot;myProgress&quot; mode=&quot;manual&quot; label=&quot;Uploading&quot; visible=&quot;false&quot;/&gt;
	&lt;/mx:VBox&gt;
&lt;/mx:Application&gt;
&lt;/code&gt;

The comments point out all the nuances you need to know about. It does the major features, including passing more data with the file, what you can do with the progress event, how to do an upload queue, rather than uploading all selected files at the same time, and how to handle responses from the upload script. This code will work with any backend processor, not just ColdFusion.

Here&apos;s the ColdFusion file:
&lt;code&gt;&lt;cfsetting enablecfoutputonly=&quot;true&quot;&gt;
&lt;!--- this will upload the file ---&gt;
&lt;cffile action=&quot;upload&quot; fileField = &quot;myUploadFieldName&quot; destination=&quot;#expandPath(&quot;./&quot;)#uploads/&quot;&gt;

&lt;!--- note that all formfields including FORM.myFirstValue and FORM.myOtherValue ---&gt;
&lt;cfscript&gt;
	myVal1 = FORM.myFirstValue;
	myVal2 = FORM.myOtherValue;
&lt;/cfscript&gt;

&lt;!--- here you can send stuff back to flex, only if the flash player is 9.0.28.0 or later ---&gt;
&lt;cfoutput&gt;&lt;myXML&gt;
	&lt;file uploadedAs=&quot;#cffile.serverFile#&quot;&gt;
&lt;/myXML&gt;&lt;/cfoutput&gt;&lt;/code&gt;

It doesn&apos;t do much, but you can see how to get non-file data passed from flex, and how to send a response. Make sure that, when sending a response, you don&apos;t send any whitespace before what you intend to send back to Flex. Also, note that your users need the Flash Player version 9.0.28.0 or later in order to send responses back to flex.
				
				</description>
				
				<category>Flex &amp; Flash</category>
				
				<category>ColdFusion</category>
				
				<category>Shan&apos;s Simple Examples</category>
				
				<pubDate>Sun, 27 Apr 2008 14:18:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/4/27/Shans-Simple-Examples-File-uploads-with-Flex-and-ColdFusion</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>CFUnited 2008 Preview: Crash Patterns</title>
				<link>http://www.webapper.net/index.cfm/2008/4/15/cfunited-crash-patterns-server-down</link>
				<description>
				
				Move over design patterns, here come crash patterns! I&apos;ll be talking about this concept in my &lt;a href=&quot;http://cfunited.com/go/topics/2008#topic-1572&quot; target=&quot;_blank&quot;&gt;&quot;Server Down&quot; CFUnited 2008 presentation in June&lt;/a&gt;. As many of you know, we here at Webapper have gotten loads of &quot;server down&quot; calls and emails over the years, so the purpose of my talk is to organize all of what we&apos;ve seen into best practices for preventing performance and stability problems, and also for what to do when problems do arise. And one way we&apos;ve started to organize this information is with the concept of &quot;crash patterns&quot;. It&apos;s modeled after the familiar idea of design patterns, but applies instead to common/recurrent causes of performance and/or stability problems (the two usually go together). And, as with design patterns, once you come to understand crash patterns (both in general, and those that are specific to your applications), you can use them to make your life a whole lot easier. And when it comes to performance and stability, that means using the knowledge of crash patterns to avoid these problems in the first place, and it also means having optimal steps to take when/if problems do arise on your production systems.

I hope to see tens of thousands of you packed into the room in D.C! In the meantime, if you have any thoughts/comments/questions, please send them along, as I&apos;d love to incorporate even more community/attendee input into my presentation.
				
				</description>
				
				<category>ColdFusion</category>
				
				<category>Databases</category>
				
				<category>JVM &amp; Java</category>
				
				<category>Performance</category>
				
				<category>SeeFusion</category>
				
				<pubDate>Tue, 15 Apr 2008 10:03:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/4/15/cfunited-crash-patterns-server-down</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Shan&apos;s Simple Examples: Start to Finish, using Ant with Flex for the first time</title>
				<link>http://www.webapper.net/index.cfm/2008/4/14/Shans-Simple-Examples-Start-to-Finish-using-ANT-with-Flex-for-the-first-time</link>
				<description>
				
				&lt;p&gt;&lt;i&gt;Disclaimer: This post is not about best practices or anything of that sort. This is just a recount of my first attempt at using Ant with an open-source Flex library project.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Here are the steps I went through (well, minus the steps that did nothing) to get my first Ant build script up &amp;amp; running;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Ant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There were a few steps to get a Flex Builder standalone install up to speed to do stuff with Ant. Eclipse users might or might not need to do these steps.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Install Ant (&lt;a href=&quot;http://www.judahfrangipane.com/blog/?p=193&quot; target=&quot;_blank&quot;&gt;Thanks, Judah!&lt;/a&gt;)&lt;/li&gt;
    &lt;ol&gt;
    	&lt;li&gt;In Flex Builder, go to Help &gt; Software Updates &gt; Find and Install&lt;/li&gt;
        &lt;li&gt;Search for new features to install&lt;/li&gt;
        &lt;li&gt;Select &quot;The Eclipse Project Updates&quot;&lt;/li&gt;
        &lt;li&gt;Select The Eclipse Project Updates &gt; Eclipse 3.3.2 &gt; Eclipse Java Development Tools...&lt;/li&gt;
        &lt;li&gt;Finish the installation process, including restarting Flex Builder&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li&gt;Install SVNAnt (&lt;a href=&quot;http://www.phillnacelli.net/blog/index.cfm/2007/1/28/Ant-Builds-and-Subversion-SVN&quot; target=&quot;_blank&quot;&gt;Thanks, Phill!&lt;/a&gt;)&lt;/li&gt;
    &lt;ol&gt;
    	&lt;li&gt;Download the SVNAnt binary from &lt;a href=&quot;http://subclipse.tigris.org/svnant.html&quot; target=&quot;_blank&quot;&gt;http://subclipse.tigris.org/svnant.html&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;Unzip the download, place all the .jar files in /lib/ in your Ant Install directory, which for Flex Builder is Flex Builder 3/plugins/org.apache.ant_${version_number}/lib/&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li&gt;Add needed libraries for FTP features&lt;/li&gt;
    &lt;ol&gt;
    	&lt;li&gt;Download the &lt;a href=&quot;http://commons.apache.org/net/index.html&quot; target=&quot;_blank&quot;&gt;Apache Commons Net&lt;/a&gt; and &lt;a href=&quot;http://jakarta.apache.org/oro/&quot; target=&quot;_blank&quot;&gt;Jakarta-ORO&lt;/a&gt; binaries&lt;/li&gt;
        &lt;li&gt;Unzip both downloads, place all the .jar files in /lib/ in your Ant Install directory (same as above)&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li&gt;Finish configuring Ant&lt;/li&gt;
    &lt;ol&gt;
    	&lt;li&gt;Go to Window &gt; Preferences &gt; Ant &gt; Runtime&lt;/li&gt;
        &lt;li&gt;Click the Ant Home... button&lt;/li&gt;
        &lt;li&gt;Choose your Ant Install directory (Flex Builder 3/plugins/org.apache.ant_${version_number}/). Be sure to &lt;b&gt;NOT&lt;/b&gt; select the lib directory&lt;/li&gt;
    &lt;/ol&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Your Build Script&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So you&apos;ve got everything configured, now what? Let&apos;s start with a build script. Explainations are in the comments. Keep in mind that these directory paths are for OS X, so Windows users will need to switch operating systems or use Windows paths. Probably easier to switch your OS.&lt;/p&gt;

&lt;ol&gt;
        &lt;li&gt;Create a build.xml in your project. Populate it with your build code (see my code exmaple below)&lt;/li&gt;
        &lt;li&gt;Add the Ant view by going to Window &gt; Other Views &gt; Ant&lt;/li&gt;
        &lt;li&gt;In the new Ant tab, right click and select Add Buildfiles. Select your build.xml file.&lt;/li&gt;
        &lt;li&gt;Now, whenever you want to make a push, just hit the run button in the Ant tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;code&gt;&lt;project name=&quot;MyProject&quot; default=&quot;svn.live&quot; basedir=&quot;.&quot;&gt;
	&lt;!-- set the taskdef&apos;s --&gt;
	&lt;taskdef resource=&quot;svntask.properties&quot;/&gt;
	&lt;taskdef resource=&quot;flexTasks.tasks&quot;/&gt;
	
	&lt;!-- set some properties --&gt;
	&lt;property name=&quot;TEMP_DIR&quot; value=&quot;/tmp/MyProject_Temp/&quot;/&gt;
	&lt;property name=&quot;FLEX_HOME&quot; value=&quot;/Applications/Adobe Flex Builder 3/sdks/3.0.0/&quot;/&gt;
	&lt;property name=&quot;APP_ROOT&quot; value=&quot;~/Documents/Flex Builder 3/MyProject/&quot;/&gt;
	
	&lt;target name=&quot;svn.live&quot;&gt;
		&lt;!-- clear out the temp dir --&gt;
		&lt;delete dir=&quot;${TEMP_DIR}&quot;/&gt;
		
		&lt;!-- let&apos;s get the latest build from SVN to a temp directory --&gt;
		&lt;svn&gt;
			&lt;export srcUrl=&quot;http://svn.mysite.com/MyProject/trunk/&quot; destPath=&quot;${TEMP_DIR}MyProject/&quot;/&gt;
		&lt;/svn&gt;
		&lt;echo&gt;SVN Export Complete&lt;/echo&gt;
		
		&lt;!-- build the ASDocs from the source --&gt;
		&lt;exec executable=&quot;${FLEX_HOME}/bin/asdoc&quot; failonerror=&quot;true&quot;&gt;
			&lt;arg line=&quot;-source-path ${TEMP_DIR}MyProject/&quot;/&gt;
			&lt;arg line=&quot;-doc-sources ${TEMP_DIR}MyProject/&quot;/&gt;
			&lt;arg line=&quot;-exclude-classes com.adobe.serialization.json.JSON com.adobe.serialization.json.JSONDecoder com.adobe.serialization.json.JSONEncoder com.adobe.serialization.json.JSONParseError com.adobe.serialization.json.JSONToken com.adobe.serialization.json.JSONTokenizer com.adobe.serialization.json.JSONTokenType&quot;/&gt;
			&lt;arg line=&quot;-main-title &apos;My Big Project Docs&apos;&quot;/&gt;
			&lt;arg line=&quot;-output ${TEMP_DIR}MyProject/docs/&quot;/&gt;
		&lt;/exec&gt;
		&lt;echo&gt;Docs Created&lt;/echo&gt;
		
		&lt;!-- build the latest swc from the source --&gt;
		&lt;exec executable=&quot;${FLEX_HOME}/bin/compc&quot; failonerror=&quot;true&quot;&gt;
			&lt;arg line=&quot;-source-path ${TEMP_DIR}MyProject/&quot;/&gt;
			&lt;arg line=&quot;-include-sources ${TEMP_DIR}MyProject/&quot;/&gt;
			&lt;arg line=&quot;-output ${TEMP_DIR}MyProject/bin/MyProject.swc&quot;/&gt;
		&lt;/exec&gt;
		&lt;echo&gt;SWC Built&lt;/echo&gt;
		
		&lt;!-- create zip files to upload --&gt;
		&lt;mkdir dir=&quot;${TEMP_DIR}zip/&quot;/&gt;
		&lt;exec executable=&quot;zip&quot; dir=&quot;${TEMP_DIR}&quot;&gt;
			&lt;arg line=&quot;-r ${TEMP_DIR}zip/MyProject.zip MyProject/&quot;/&gt;
		&lt;/exec&gt;
		&lt;echo&gt;Source Zip Created&lt;/echo&gt;
		&lt;exec executable=&quot;zip&quot; dir=&quot;${TEMP_DIR}MyProject/bin/&quot;&gt;
			&lt;arg line=&quot;${TEMP_DIR}/zip/MyProject.swc.zip MyProject.swc&quot;/&gt;
		&lt;/exec&gt;
		&lt;echo&gt;SWC Zip Created&lt;/echo&gt;
		
		&lt;!-- upload files --&gt;
		&lt;ftp server=&quot;ftp.mysite.com&quot;
			userid=&quot;username&quot;
			password=&quot;password&quot;
			passive=&quot;true&quot;
			remotedir=&quot;path/to/upload&quot;
		&gt;
			&lt;fileset dir=&quot;${TEMP_DIR}zip/&quot;/&gt;
		&lt;/ftp&gt;
		&lt;echo&gt;Zip Files Uploaded&lt;/echo&gt;
		&lt;ftp server=&quot;ftp.mysite.com&quot;
			userid=&quot;username&quot;
			password=&quot;password&quot;
			passive=&quot;true&quot;
			remotedir=&quot;path/to/upload/docs&quot;
		&gt;
			&lt;fileset dir=&quot;${TEMP_DIR}MyProject/docs/&quot;/&gt;
		&lt;/ftp&gt;
		&lt;echo&gt;Zip Files Uploaded&lt;/echo&gt;
	&lt;/target&gt;
&lt;/project&gt;&lt;/code&gt;

&lt;p&gt;
I&apos;m not going to cover asdoc/compc/mxmlc command line options here, there&apos;s plenty of &lt;a href=&quot;http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;file=compilers_123_05.html&quot; target=&quot;_blank&quot;&gt;great docs out there&lt;/a&gt;. 
You can also read more about the &lt;a href=&quot;http://subclipse.tigris.org/svnant/svn.html&quot; target=&quot;_blank&quot;&gt;svn task&lt;/a&gt;, &lt;a href=&quot;http://ant.apache.org/manual/CoreTasks/exec.html&quot; target=&quot;_blank&quot;&gt;exec task&lt;/a&gt; and &lt;a href=&quot;http://ant.apache.org/manual/OptionalTasks/ftp.html&quot; target=&quot;_blank&quot;&gt;ftp task&lt;/a&gt; at their respective documentation pages.
&lt;/p&gt;

&lt;p&gt;Now that you&apos;ve got a start to finish example, go forth and Ant!&lt;/p&gt;
				
				</description>
				
				<category>Shan&apos;s Simple Examples</category>
				
				<pubDate>Mon, 14 Apr 2008 20:01:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/4/14/Shans-Simple-Examples-Start-to-Finish-using-ANT-with-Flex-for-the-first-time</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Dont have a scope? Need a fixed bid?</title>
				<link>http://www.webapper.net/index.cfm/2008/4/14/Dont-have-a-scope-Need-a-fixed-bid</link>
				<description>
				
				Here&apos;s another section from &lt;a href=&quot;http://cfunited.com/go/topics/2008#topic-1537&quot;&gt;my presentation at CFUnited&lt;/a&gt;:

//

This segues into the question of what to do when the customer needs an &quot;estimate&quot; or requires a &quot;fixed bid&quot;? I think I just answered that one - you write a thorough spec doc, break it down into tasks and provide an estimate based on your anticipated schedule. Submitting a bid without a spec doc in hand is, frankly, suicide. If you submit a bid at, let&apos;s imagine, $1000 for a project, and oh-my-gosh, you actually come in at that budget, you weren&apos;t right. You were wrong in your estimate since you didn&apos;t know what you were estimating and just happened to come in at the same amount for the development. It&apos;s like back in math class when you had to write out your solution on tests because the teacher wanted to know you did the problem right, not just guessed at the answer. It&apos;s the process of breaking out a spec doc into tasks that lets you come close in your estimates. (Estimating is another gigantic topic in its own right, and I&apos;m not going to get into it here.)

There is one little snafu with this plan. Many customers want that fixed bid before they&apos;re willing to drop any coin. They won&apos;t accept a ballpark range/time-and-materials budget for the development of the spec doc without any idea how much their total outlay is going to be, including the coding. This is a total catch-22. I can&apos;t commit to a project cost until I know what the scope is, but the customer won&apos;t let me determine the scope until I commit to a project cost.

Sometimes in the &quot;real world&quot;, I can&apos;t always convince a client that they need blueprints and house plans plans before they can get a bid on the construction of a house. What do I do in this situation? Quite simply, I must determine the scope before committing to a price. Anything else is a guess. Here are some tricks I try:

&lt;ol&gt;
   &lt;li&gt;Walk away. There are other customers out there, waiting for me, who know that demanding a fixed price without a spec doc is foolish. These are the customers who have been burned in the past.&lt;/li&gt;
   &lt;li&gt;Hire a fancy salesman in a $1000 suit to smooth-talk the customer into waiting for a fixed bid until a &quot;discovery phase&quot; is complete. Don&apos;t call it a &quot;spec doc&quot;, call it &quot;discovery&quot;. Maybe I eat the time spent on the spec doc and jack up the prices on the coding phase to cover your losses.&lt;/li&gt;
   &lt;li&gt;Offer the customer a fixed bid based on just the spec doc process. When you&apos;re building a house, you first pay just the architect, right? When your car is broken, you take it to the mechanic for a flat-rate diagnostic fee, right? In order to swing this solution, I craft the customer relationship into an ongoing series of agreements to get from one phase to the next. At the end of every phase, the customer can pull the plug and still have value with the deliverables provided by the previous stage. After all, the final software is just the deliverable from the coding phase, right?&lt;/li&gt;
   &lt;li&gt;Insist that we never work on fixed bids. This is more of a meta-solution. Since we never entertain the idea of working on a fixed bid, we never have to figure out what to do about a customer who needs one.&lt;/li&gt;
   &lt;li&gt;Employ the used-car-salesman approach. When a customer walks onto the lot, a good used-car salesman will sell them something, anything. He takes their money and makes sure they drive off the lot. If the customer must have a total price firmly fixed before we do any work, then I can certainly guarantee that something will be delivered within that budget. What that something is, is the scope of the project, something no one yet knows, but we get to determine it by working until the customer&apos;s budget is dried up. This is roughly what the iterative development folks do, but can create big troubles because of unrealistic customer expectations.&lt;/li&gt;
   &lt;li&gt;Educate the customer by encouraging them to perform their own initial discovery phase. I show them a template of a previously-completed Statement of Work or Preliminary Project Plan and have them create the first draft of it. Some customers are capable of producing this kind of document. We may end up giving away some services assisting them with creating the document, but when I have it in hand, I have a good idea of how much work it will take to perform the spec doc process.&lt;/li&gt;
&lt;/ol&gt;

In all these cases, what I&apos;m trying to do is nail down the scope of the application. By determining the scope, I answering many of the big, hard questions and provide a direction and some details to the project. This is the only way to produce a fixed bid without wildly guessing.
				
				</description>
				
				<category>General Development</category>
				
				<pubDate>Mon, 14 Apr 2008 15:25:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/4/14/Dont-have-a-scope-Need-a-fixed-bid</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>New Job Title: Front End Engineer</title>
				<link>http://www.webapper.net/index.cfm/2008/4/10/New-Job-Title-Front-End-Engineer</link>
				<description>
				
				There&apos;s a pretty good article about job titles in the current ColdFusion Developer&apos;s Journal: 

&lt;blockquote&gt;&lt;a href=&quot;http://cfdj.sys-con.com/read/535798.htm&quot;&gt;Are the Job Titles &quot;Web Designer&quot; and &quot;Web Developer&quot; Too General?&lt;/a&gt; - There are a lot of professions that have emerged from the web: designers, developers, strategists, search engine optimists, information architects, usability and accessibility consultants, the list goes on... Today, I&apos;d like to talk about the first two. I wouldn&apos;t go so far to say that the titles should be considered harmful by any means, rather we have just outgrown our job titles!&lt;/blockquote&gt; 

My favorite part is where the author, at his most recent job, gave himself the title &quot;Front End Engineer&quot;, because it seemed to fit what he was doing. As it happens, just yesterday Nat (Papovich, Lead Architect here) and I were having a discussion about how, with the recent evolution of rich applications in the Web development realm, it&apos;s time for a more-or-less official title of UI Developer. There&apos;s no doubt now that the proliferation of development tools/languages/frameworks/etc. that are solely focused on producing better UIs means that there&apos;s a whole lot more programming that happens just in the UI layer of an application. Just taking one tool as an example--Flex--requires proficiency in a range of skills, including OO development (ideally, but not required), CSS, Actionscript, MXML, and more. 

In our development practice, we certainly see this playing out. We typically have several developers working solely on the UI layer, be it AJAX (in its million different forms), Flex, etc. 

On a related note, I recently read about the new workflow integrations between Flex and design tools, which is a great thing. What I find interesting about the &quot;UI Developer&quot; role is that, on average, I think it entails developers learning better graphic design, usability, and other &quot;designer&quot; skills more so than it entails designers learning to program. But that&apos;s a side note to the whole store. The bottom line is, the fact that we have Front End Engineers, or even the possibility of them, is great for users, and it&apos;s another sign of the maturing of the Web as a platform for business computing.
				
				</description>
				
				<category>User Interface</category>
				
				<category>General Development</category>
				
				<category>Flex &amp; Flash</category>
				
				<category>ColdFusion</category>
				
				<category>Business of Software</category>
				
				<pubDate>Thu, 10 Apr 2008 09:15:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/4/10/New-Job-Title-Front-End-Engineer</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>Three Phases of Programmer Development</title>
				<link>http://www.webapper.net/index.cfm/2008/4/9/Three-Phases-of-Programmer-Development</link>
				<description>
				
				I was reading with some amusement &lt;a href=&quot;http://www.dougboude.com/blog/1/2008/03/For-Your-Entertainment-Only-CF-is-Dead--Dialogue.cfm&quot;&gt;Doug Boude&apos;s retort&lt;/a&gt; to a Java purist that was dismissing ColdFusion for being too... simple? to be considered a &quot;real&quot; language, and I was reminded of a topic I commonly rant on.  It&apos;s what I call the Three Phases of Programmer Development.

Phase One

A novice programmer is happy to get anything to work.  Eventually, the novice programmer becomes a journeyman programmer, and is able to not just get things to work, but to start to create some truly complicated programs.

Phase Two

Here, a journeyman programmer starts to develop their chops.  They can take a complicated problem and build applications with a level of complexity equal to (or greater than) the problem at hand.

Phase Three

Programmers usually find Phase Three when they&apos;ve been asked to go back and maintain some Phase Two code they wrote six months or two years ago... and all they can think was &quot;WTF was I doing /here/?&quot;  &quot;What&apos;s /this/, now?&quot;  &quot;Geez, did /I/ write this?  Wow.&quot;

The epiphany that leads a programmer to Phase Three is the realization that the hallmark of the professional programmer is not in the complexity of the code they produce, but rather in the simplicity.  When you can take a complex problem, and solve it with simple code, you are a professional programmer.  A lot of people that are die-hard ColdFusion fans are Phase Three programmers, who use it because it allows them to produce simpler, more maintainable code.  And a lot of ColdFusion&apos;s detractors are Phase Two programmers, who think that anything /that/ simple must be for novices/children.

Note that frameworks of all types can often be categorized into Phase Two or Phase Three frameworks.  The question to ask is, &quot;in the long run, does this framework (or design pattern) make this application simpler, or more complex?&quot;  Or, &quot;Will this framework make troubleshooting errors or performance problems nightmarish?&quot;  Or, &quot;do I have to use this whole bloated framework for this problem, or can I just use a few of tastier bits to address this issue at hand?&quot;  If the use of a framework or design pattern makes the solution simpler, or at least more maintainable, great.  If not, it may be good to evaluate whether you&apos;re using it for Phase Two or for Phase Three reasons.  I suppose it bears mentioning that &quot;resume-building&quot; is never a valid reason for the use of a pattern or framework.  That being said, having at least a passing familiarity with many patterns and frameworks is good, so that when you start designing something that does fit an existing solution well, you know to use it.

[n.b. I often recommend that people new to ColdFusion or Java (or any other language) read the description of *every* function or JDK library method.  Not for the sake of memorization, but so when you run into a problem that&apos;s already solved, the voice in back of your head can say, &quot;Hey, I think I saw something that does that...&quot;]

Code complexity is like an infestation; it tends to spread to all areas that touch it.  When you find code for a problem growing overly complex, STOP.  Take a moment to understand where the complexity is coming from, and refactor it to something more simple; don&apos;t let complexity sprawl and infest the rest of the system.  I tend to dislike &lt;a href=&quot;http://en.wikipedia.org/wiki/Object-relational_mapping&quot;&gt;ORM&lt;/a&gt; implementations, because they tend to reduce &lt;a href=&quot;http://en.wikipedia.org/wiki/Cohesion_(computer_science)&quot;&gt;object cohesion&lt;/a&gt; and often require you to write more code in support of the ORM than writing simple loadFromDB(id)/loadFromResultSet() methods would require, and I&apos;ve found performance (for other than basic CRUD applications) to be anywhere from unpredictable to abysmal.  I know this makes me something of a heretic, and there are bound to be people that insist I was doing something wrong or &quot;just don&apos;t GET it&quot;, but when I recently ripped Hibernate out of a Java application, the code size shrunk by about 30%, and the performance improved by an order of magnitude.  (For the record, I was the one who put it in there in the first place, because I bought into the hype.  Now I understand better what it&apos;s good for, and what it&apos;s less good for.)

It bears repeating: the hallmark of the professional programmer is not the complexity of the code they produce, but rather the simplicity.  Whenever you see code getting complex, stop and ask yourself if there&apos;s a way to do it simpler/better.
				
				</description>
				
				<category>JVM &amp; Java</category>
				
				<category>General Development</category>
				
				<category>ColdFusion</category>
				
				<pubDate>Wed, 09 Apr 2008 10:12:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/4/9/Three-Phases-of-Programmer-Development</guid>
				
			</item>
			
		 	
			
			
			<item>
				<title>What About Data-Centric Applications?</title>
				<link>http://www.webapper.net/index.cfm/2008/3/26/What-About-DataCentric-Applications</link>
				<description>
				
				I&apos;ve been working on my CFUnited presentation titled &quot;Reviving the Lost Craft of Writing Specifications&quot; and want to publish another teaser that might make it into the final version. This is raw, rough, uncut and unedited so beware.

// 

What About Data-Centric Applications?
Early in the project, you need to determine whether this is a data- centric application or a UI-driven application. If it&apos;s a data- centric application, then you should get into the existing data, or the creation of the ERD very early in the process. I believe that &quot;version 2 rewrites&quot; are data-driven applications. These kinds of applications may require some kind of data importer or massager if the database schema changes and importers can be one of the most costly parts of a software application and can, in some extreme examples, make requirements on the rest of the application by highlighting relationships among data objects. Also, if your data-centric application has a poorly-organized database schema which is unable to handle and manipulate the data set, the entire application (UI and all) will fall apart very quickly and may generally be unrecoverable. But the opposite is not true - a UI-driven application with a crappy database isn&apos;t necessarily a recipe for instant failure. There are many large commercial applications with atrocious underlying data-storage mechanisms.

If the application is a UI-driven application or is a version 1 application or has no existing data to import, the database schema can be ignored until later in the project. But in either case, the prototype/wireframe must be created early and often. These two classes of applications are the only types of applications I&apos;m talking about here. I don&apos;t know anything about writing device drivers or scientific analysis programs, but I&apos;ll bet dollars to donuts that those classes of applications also make use of spec docs in some format.
				
				</description>
				
				<category>General Development</category>
				
				<pubDate>Wed, 26 Mar 2008 10:38:00 -0500</pubDate>
				<guid>http://www.webapper.net/index.cfm/2008/3/26/What-About-DataCentric-Applications</guid>
				
			</item>
			
		 	
			</channel></rss>