"Most people have the will to win, few have the will to prepare to win."
- Bobby Knight





Bye bye Waterfall, Hello Agile

Come Monday I'll be starting the envisioning phase of a 4 month project aimed to enhance the overall user experience in one of our flagship applications. I'm definitely excited about the project not only because there will be some really cool components to build but also because the project will be run using an Agile methodology. For the past several years I've been working on high dollar(long running), complex business apps that followed the Waterfall approach. Each of these projects adhered to the phases of your standard Software Development Life Cycle (SDLC) and at times seemed to drag on in the least exciting phases.

Agile development is definitely different than your traditional waterfall based project, not only from a structure point of view (phases and such) but also in it's principles, which are;

  • Individuals and interactions over processes and tools
  • Working software over comprehensive documentation
  • Customer collaboration over contract negotiation
  • Responding to change over following a plan


Surprise Presentation from a CF_Celebrity

Last week my work brought in a CF consultant from Universal Mind to help evaluate the performance of our flagship application and offer suggestions for improvement. On Tuesday this consultant was set up to give us a presentation on CFMX performance, and like most learning opportunities I attended the session. To my surprise, the consultant was Brandon Purcell... holy sh*t... I have been reading his blog for a few years now and regard him as being a CF rockstar along with the usual names.

Brandon was really cool and dropped some interesting tips on performance, some of which I had never considered before like using with an isolation level of read_uncommited to speed up SELECT statements. Of course this only applies to queries where the returned results don't have to 110% accurate as the drop in the isolation level will curtail around locks from INSERTs and UPDATEs. I never thought of using for anything other than managing 'atomic' transactions that included writing to the db.

Another interesting tip that he pointed out was the use of logging run time metrics directly to the screen but using HTML comments to hide them from the users. I think in non-MVC frameworks this would well and never really considered dumping runtimes to the display in a production environment, but I guess it's a quick way to see how well a page is rendering without going through hoops to get that info (in a large corp. environment where not everyone is privy to accessing production logs without waiting for someone else to get them for you).

Brandon had a ton of other great performance tuning tips, most of which I already knew about, but it was still cool to hear it from someone who has been around CF as long as he has. I really need to start going to more conferences and getting involved in some type of Users Group.


Working with Milliseconds in Coldfusion

Now that the development and SIT phases of my current project are coming to an end, I've been focusing on preparation for Performance and Load testing. The application that I've been working on was written in Java and runs completely behind the scenes, so using Mercury Loadrunner or some other load testing tool for metrics gathering was out of the question.

The approach that I decided to take was to write a tool in CF that would parse the log files produced by the application (via log4j), aggregate the runtimes for various classes and method and then produce a graph to show average runtimes for various components. Most of the components that I will be measuring execute in an order of milliseconds so immediately I knew that I would have to tap into Java for working with time on that scale. The log files that I am working with output timestamps that look like this, 11/30/2007 13:01:59,123 (MM/dd/yyyy hh:mm:ss,zzz where z is milliseconds).

In the course of building my metrics tool, I wrote the following UDF to aid in calculating time differences in milliseconds. ** variables.runDate is set on instantiation of the object that this udf sits in.

<cffunction name="getMillis" access="public" returnType="numeric" output="false">
      <cfargument name="ts" type="string" required="true">
      <cfset var local = structNew()>
      <cfset local.xms = listLast(arguments.ts,",")>
      <cfset local.tparts = listToArray(listFirst(arguments.ts,","),":")>
      <cfset local.ntime = CreateDateTime(year(variables.runDate), month(variables.runDate), day(variables.runDate), local.tparts[1], local.tparts[2], local.tparts[3])>
      
      <cfset local.ms = local.ntime.getTime() + javaCast("long",local.xms)>
      
      <cfreturn local.ms>
   </cffunction>


Dot Bomb 2.0 ?

Just about a month ago, I saw this Wired article and had thoughts of jumping off the roof instead of taking the stairs down to my car (figuratively speaking of course).

I couldn't believe what I was reading, Microsoft had just paid $240 million dollars for a 1.6% share of Facebook. Thats just absolutely ridiculous, it places Facebooks's value at $15 billion dollars!?!? Facebook has less than $200 million in annual revenue. How in the world could Microsoft believe that they could valued that much? Even with a 20% increase in annual revenue every year, it would take them 15-16 years before they earned 15 billion. Either Microsoft payed way too much money or we are headed towards another Dot Bomb.

Here is a small follow-up to that article.


Go Dad!!

I've had a copy of this video on my machine for a while and thought that I would post a link to it. It's one of the coolest videos around not only because you hear the kids rooting for their dad but also because he's racing a minivan and smokes a Camaro!! Enjoy.


Productivity with ColdFusion

With recent articles proclaiming Coldfusion to be dead or dying, there have been several 'rebuttal' posts by members of the CF community defending it from misinformation that every author seemed to have (go figure). Many of those posts did a really good job of showing the readers that CF is alive and kicking and talked about some of Coldfusion's amazing qualities. One of those qualities that seemed to come up in almost every post was that Coldfusion enables you as a developer to be more productive. This is a completely true statement (as you will see) and I totally agree with the authors when they say it. The problem however is that none of the statements made those posts, were backed up with examples.

I think it's really hard to drive home the point of Coldfusion and productivity to non-CF developers without throwing concrete examples in front of them to see first hand. Many of the skeptical readers won't spend the time to figure out on their own if that statement is true or not, most will probably see it as "my language is better than your language" flame bait. I don't blame them for thinking that way given the pretense of the article and no examples to prove it.

My attempt with the rest of this post is to help back up the claim that CF enables you to be more productive. I tried to choose examples of task that are sometimes trivial but also part of the average everyday development.

<More>


Updated Photo Gallery

Last night I decided to update the Photo Gallery to look a little nicer and provide an image from my latest galleries. The change wasn't a major overhaul or anything but definitely an improvement from what it was before. I hope in the future to figure a better more interactive way to deliver the few photos that I take...

For some really cool photography, check my buddy Dave's site, Seinberg.net


Switching from PVCS and ANT to Subversion and Maven2

A few months ago there was a collaborative effort from the developers at my work to get rid of our then current version control software, PCVS and excruciating Build Test Deploy strategy using Ant and AntHillPro. Although it took many months of convincing and proving out to senior leadership, we were successful in transforming our environment to use Subversion for version control, Maven2 and CruiseControl. The effort in establishing an enterprise ready environment for ourself was large but it was completed and is running smooth.

Although we still have PVCS and AnyHillPro for some existing (legacy) projects the goal is to have all new Java development done with the new tools. Being that, that is the case the new release of my project (Collision Prevention Program) has begun the development stagegate and one of the tasks assigned to me was to get our project ported over to the new environment. So for the past few days I have been slowly getting our project and developer workspaces up to speed so that in another few days the rest of the team can hit the ground running.

There are a few developers (2 to be exact) at my work that have a deep understanding of Maven so it has been critical that I learn as much as I can so that I can assist my team (and others) on questions if those resources are unavailable. As fate would have it, those resources for the most part have been unavailable during my journey to get us ported. I have had some definite headaches in getting everything set up, but in the end they have been resolved and my project and team are entirely set up for the months of development to come.

This experience (like many) has really enforced my confidence an aptitude in picking up new technology. I feel that I'm at a point with Maven and Subversion that I could handle most situations if they arise. I am by far no expert on each matter but I would consider that I have a strong working knowledge of our new environment. Hopefully in the weeks\months to come I will continue to learn and increase my understanding of the products and processes and if time permits I hope to blog about the experience.


CF Haters, Please Read

This post is in response to the recent bashing and false claims made about Coldfusion, Flash and Adobe. To get an idea (if you aren't already familiar) with what I'm talking about read the comments left on digg, ColdFusion 8 Launches. I know that the vast majority of digg readers are high school students, but regardless of age I think that people should do research and put some merit behind their claims. Here is what I have to say in response to them:

  1. If a company (or government agency) can afford to purchase it, they (typically) can afford to pay you top dollar.

  2. If you can't afford the one time payment of $1300 to purchase a license, then chances are you can't afford to run a dedicated box anyways. Where is the benefit in using a free alternative then? Shared hosting for CF can be found for the same price as any other language.

  3. Some people have mentioned that CF has been "re-written" (meaning, released a new version) every few years. I didn't realize that constantly improving performance and adding more language features was a bad thing. When was the last time your language was refactored?

  4. How come no one has bashed on JSP yet? At the end of the day CF is just like JSP (if not a more enhance version of it), it provides a markup syntax, an ecma like syntax alternative, can run in a J2EE container and gets compiled into Java byte code. Sounds like there is very little difference to me.

  5. Flash = 90%+ market penetration, meaning 90%+ browsers are Flex enabled. Funny how some think that translates in a dead or dying technology. Where is the animated vector graphic support in DHTML or server side data pushing in Ajax?

  6. All of the talk about CF and increased productivity is true. What other language can you expose any functionality in a SOAP enabled web service with one tag attribute (access="remote")? Read the live docs if don't believe me.

  7. Adobe provides enterprise support services, when was the last time you asked a question and didn't receive a snide remark from someone who was too uber or 1337 to help you? Relying on community support is great until you hit a snag under deadline thats going to cut into someones WOW or 2nd life play time.

  8. When you finally graduate high school and/or migrate from your parent's basement, you will realize that you need to earn a living and that the vast majority of the jobs you find coding in PHP\Ruby are no more lucrative than working as a delivery driver full time (however there are many exceptions to that statement). Your misconception of corporate greed and business economics will soon fade when you know that you make a great living if only you had decided to at least learn that other "dead language".


How to estimate a project

The other day a buddy of mine who is still fresh in his career, emailed me about a possible side job that he had for building a small forum type application. In his email he asked me how much I would charge for the application, sending along a URL to a similar site. I started to write back with a long winded explanation but ended up cutting it short. I pretty much told him that the best thing he could do was to try and get a gauge of how much they were willing to spend based on several different 'decision points'. My answer was based on the mental notes that I had walked through when writing him back. Given the description of his client and the type of project they were looking for, I kind of figured that they were not looking to build a business off their idea but were more or less a group of guys that were looking to have some fun.

I thought it would be worth while to share some of the "questions" that I keep in mind when determining how I should bid out a project. Keep in mind that following isn't appropriate for all situations and/or might come as common sense for some.

What type of client are they, are they an an established company, are they large or small, what kind of seed capital to they have (if applicable)?
The idea really is to find out what type of financial state they are in. Typically if they are an establish co. or a startup with capital, they are willing to pay a premium (for a quality application of course). The simple economics of the matter would tell you that a company with more money, can afford to spend more for their business endeavours. The idea here is not to take advantage of their financial status but rather use it to get a gauge of how much to charge so that you don't under bid yourself. I have had several friends lose out on projects simply because their estimates were too low.

Is the client doing this for profit or for fun?
Chances are if the client is a business, then they aren't doing the project for fun. If they are, chances again would tell you that they are benefiting from it one way or another (pr, marketing\advertising, larger user community, ect...). In either cases, if the client is a business I would revert back to my first point in trying to get a gauge of a pay scale to use. On the other hand if the client isn't a business or forming a business, then I would step back and try to think about how I could offset my profitability in other ways than money. You never know, you could be building the next YouTube!

Is the project new development, or enhancements to an existing app?
New development in almost all cases means that your estimates won't be dissuaded by unexpected technical issues. While there is still the chance that something that you didn't account for (in technical terms) could go wrong, the fact that you are building from the ground up means that you won't have to deal with someone else's laziness, hacks or inexperience. I've worked on projects where the previous developers were unskilled and\or flat out lazy, causing me lots of unexpected fixing and figuring out of logic that just happened to work by coincidence. No body writes an application the same way that you do, so if you are asked to bid out enhancements to an existing app, make sure you get to see some of the source first before you give an estimate.

If it's new development, do you have a similar project (or can find a less expensive alternative) that can be tweaked to fit their needs?
Using an existing project and\or buying a lesser expensive alternative for tweaking, will in most cases provide the largest room for profit. For obvious reasons the simple fact that some or all of the 'code is already written for you', means that you can spend less time in completing the project. Again if you purchase something, you might run into the scenario that I described above about having unexpected technical issues. Writing an app from the ground up is usually more time consuming except if have (or have written) a really good set tools for code generation. Code generation lets your code work for you, people like Peter Bell are able to build hundreds of customized apps a year simply because he's built tools to automate much of the core code.

Would you be willing to do the work for less money than what you make now?
I mention this point because when it comes down to the end of the day, you should at least (imo) try and earn as much as you would as if you were working at your full time job. I try and calculate my hourly rate by taking my annual salary and dividing it by 2000 (40hours/week x 50 weeks/year). Using this as a basis, you can find out what the project would cost (at a minimum) to be worth your time. If you think you are overpaid or work for a client unlike the one for the side project, then you might have to be prepared to bill at a lesser rate.

Do you want the work?
The last point I usually consider is, how much do I really want the work. Like most people, if I don't want the work I might put in a high bid or just simply tell them that I'm not interested.  I try not to be insulting with my quoted dollar figure and/or with a decline of a project but ultimately you shouldn't do something you don't feel is worth your time. In the odd change that they willing to compensate you nicely for the work, then it might be worth considering.


Start-Up Reading Material

The past couple of days I been doing a lot reading on start-ups and VCs and happened to stumbled across a few good sites like Venture Hacks and Ask The VC. It started when I was reading the owner bios of Pownce, some new web 2.0 communication app made most by digg employees and Kevin Rose himself (that kid never stops does he?). Anyways, going through the sites I found, I landed on a few good blog post that are definitely worth reading, like The Pmarca Guide to Startups, part 1: Why not to do a startup written by one of the co-founders of Netscape, and Lucky or Smart from the guy that sold Tripod for $58M to Lycos in 1997 only to have then have sold his shares at the peak of the bubble in 1999 (cha-ching).


More Entries