I have an unusual background; a Bachelor in Business and a Masters in Computer Science. Computers had always been my passion and business my curiosity. I decided to study business in university because at that age I had already gone through much of the curriculum for CS with some gaps that I didn’t care much about at that time, later on I filled these gaps, mostly, through my Masters and reading.

Given this background I tend to understand both worlds pretty well, the inherent psychology of the people involved, and the gaps (or lets say chasms) between them. Lets face it, most of us technologists think the business user is an annoyance to put it mildly. Need evidence? Here’s a typical occurrence:

Hotshot programmer Joe spends a week creating an algorithm that he believes to be living proof of his genius. While showing it to his prospective business users they all agree that the green button is a little too green and that a red button should be placed somewhere on the screen; Joe’s labour falls on deaf ears. Joe, in his inability to convey the genius of his labour concludes that business users are (insert your favorite stereotype here) and vows to defiantly plaster his Dilbert comics all over the wall of his cubical.

The problem here is that business users, at least most of them, cannot think in the same terms software people can. They just cannot imagine and/or extrapolate in the technology domain as us software people can. It’s just not the area of their experties. Plain and simple and has nothing to do with their IQ.

Historically this led to business systems being developed based on IT’s understanding of the business needs which is a disconnected process. Agile software development methodologies address these problems but are inherently limited due to the complexity and cost of prototyping. Of course a Ruby on Rails developer is much more agile and much more capable of cranking prototypes of features than, say, his Java counterpart, but eventually he won’t be able to do everything leaving nothing for his user’s imagination.

I’ve been working with salesforce.com for more than 8 months now and to be very honest, I was very skeptical at the beginning. I’ve been around enough to know that there are no sliver bullets (SOA or SOAP Webservices anyone?), and when I was introduced to salesforce.com my initial reaction was along the lines of “Yeah, cool, nice toy.. Lets see how soon I can make it break under its own weight of unfulfilled promises!.” To my chagrin, at the time, the platform continued to deliver at an alarmingly fast pace.

When I was working for BEA, it was typical for a pre sales cycle to extend for 6 months or even a year. At our local office in Toronto we had a small army of pre sales engineers that spent most of their time creating demos to illustrate how our products can address customer requirements.

These demos usually were very labour intensive, have absolutely nothing to do with the real project, and of very poor code quality (its just a demo! right?). This naturally led to the business users (and sometimes IT users as well), to take very important decisions based solely on their ability to imagine, extrapolate, and fill in the gaps. They had to somehow envision the final outcome. If you’re reading this and came that far then this is an all too familiar process. This almost always led to frustration for business users because what they saw in the demo has nothing to do with the final product, which usually also took 8 months to build and cost an arm and a leg!

With salesforce.com, we almost always engage business people (exclusively) who have business problems they want to solve. We interview them, understand their challenges and requirements, spend no more than a week building a salesforce.com prototype (using their own data!), then go back for a show & tell. In my experience so far, this bedazzles the business users and moves the sales process at velocities I’ve never experienced before.

Why does it work this way? Simple. Because with salesforce.com there’s no need to tell your prospective client to imagine anything. Whatever they want can 90% of the time be implemented and turned around very quickly. This creates confidence in their purchasing decision and makes the value of their investment immediately accessible.

Again, I still believe in the non-existence of Silver Bullets, and salesforce.com is no Silver Bullet too. It has its limitations and oversights like any other product. But right now they are pretty much ahead of the curve and they don’t seem to be slowing down at all. That doesn’t mean that Java, Groovy, Ruby, Rails, Grails, PHP, etc… are useless or dead, far from the truth in my opinion. It just means that certain class of enterprise development isn’t a fit for these paradigms any more. Try “Mashing Up” salesforce.com with any of the above and get the best of both worlds. Add EC2 or Google App Engine into the mix and you’ll begin to realize how the enterprise software development of tomorrow is very different from that of yesterday.

In a world facing a major economic crises, IT will continue to be viewed as a “Cost Center” and the days of multimillion dollar investments in what amounts to data entry and reporting systems are over.

The world is changing. Get over it quick or turn into the COBOL programmer of tomorrow.

I had to put together a salesforce demo recently in which I wanted a field to display a flag depending on the value of another field. Here’s the scenario:

If a certain checkbox is ticked, I wanted my field to show a green flag, otherwise I wanted it to show a red flag. Turns out its actually pretty easy with salesforce. Here’s how to do it:

Create a Formula Field of type TEXT where you want your flag to appear. In the body of the formula type the following:


IF (
	 Flag_Set__c,
	 IMAGE("/img/samples/flag_green.gif", "Green Flag"),
	 IMAGE("/img/samples/flag_red.gif", "Red Flag")
   )

What this code does is check if the custom field Flag_Set__c is checked. If it is it emits the HTML required to display a green flag, which is part of any stock salesforce org. If it is not checked a red flag will be displayed.

Add your field to your Page Layout and you’re done! Here are some screenshots:

Picture 4.pngPicture 5.png

You can extend this to display any image you want depending on whatever criteria as long as you can express it in the body of the formula. You’re also not limited to stock images as you can upload whatever you want to your salesforce instance or make your image tags point to wherever (flickr, S3, etc).

Yesterday I was creating a simple salesforce demo for one of our prospective clients. At the end of the day I decided it would be cool to show a google or live map of the account’s billing address. While it wasn’t really hard to put it together, it wasn’t also something that you could do with embedding a link in an S-Control.

Here’s are the steps:

  1. Create a new S-Control.
  2. Insert the code below into the S-Control.
  3. Change the Account layout page to include the SControl. I have mine at a 800 pixels wide so its better to create a single column section below the address (see the screen shots).
  4. Done!

I hope this helps someone :-).


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
Live Map
</title>
<script charset="UTF-8" type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&amp;amp;amp;amp;amp;mkt=en-us">
</script>
</head>
<body>
<div id='myMap' style="position:absolute; width:800px; height:400px;"></div>

<script type="text/javascript">
//<![CDATA[
function getLatLong(layer, resultsArray, places, hasMore, veErrorMessage)
{
var ll = places[0].LatLong;
AddPin(ll);
map.SetCenter(ll);

}

function AddPin(ll)
{
pin = new VEShape(VEShapeType.Pushpin,ll);
layer.AddShape(pin);
map.FindLocations(ll,null);
}

var map = new VEMap('myMap');
var layer = null;

map.SetDashboardSize(VEDashboardSize.Small);

map.LoadMap();
layer = new VEShapeLayer();
map.AddShapeLayer(layer);

var address = "{!Account.BillingStreet}" +
"{!Account.BillingCity}"   +
"{!Account.BillingPostalCode}" +
"{!Account.BillingCountry}";
map.Find(null, address, null, null, null, null, null, null, null,null, getLatLong);

//]]>
</script>
</body>
</html>

Here are some screen shots of the results: