<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>Embracing the Cloud</title>
  <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/" />
  <link rel="self" href="http://www.embracingthecloud.com/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2010-03-09T17:49:40.129375-06:00</updated>
  <author>
    <name>Mike Leach</name>
  </author>
  <subtitle>public String CloudThoughts{ get; set;}</subtitle>
  <id>http://www.embracingthecloud.com/</id>
  <generator uri="http://dasblog.info/" version="2.3.9074.18820">DasBlog</generator>
  <entry>
    <title>Salesforce Chatter - First Impressions</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/03/09/SalesforceChatterFirstImpressions.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,6300aae9-c3c1-428a-8510-acb13d530f5a.aspx</id>
    <published>2010-03-09T15:55:26.223-06:00</published>
    <updated>2010-03-09T17:49:40.129375-06:00</updated>
    <category term="Salesforce" label="Salesforce" scheme="http://www.embracingthecloud.com/CategoryView,category,Salesforce.aspx" />
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="html">&lt;p&gt;
If you just want the high level summary, I can spare you the time of reading this
lengthy blog article and summarize Chatter in the following image.
&lt;/p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Sliced_Bread.png" border="0" /&gt; 
&lt;p&gt;
&lt;a target=_blank href="http://www.salesforce.com/chatter/"&gt;Salesforce Chatter&lt;/a&gt; is
basically Facebook for the enterprise and one of the greatest things to come along
since sliced bread (besides &lt;a target=_blank href="http://en.wikipedia.org/wiki/Jack_Bauer"&gt;Jack
Bauer&lt;/a&gt;). Chatter is a collaboration platform that supports status publishing and
the ability to follow people and objects (Salesforce records). 
&lt;/p&gt;
&lt;p&gt;
After seeing a Tweet with instructions to email iwantchatter@salesforce.com to participate
in the pilot program, I contacted Salesforce and got on the waiting list. I executed
some standard legal agreements (Chatter is still considered pre-launch) and Chatter
was enabled in our Salesforce org within a couple days. I would suggest "selling"
your org in the body of your pilot program request with facts that might help the
already overwhelmed Salesforce staff determine which clients might make the best case
studies for using Chatter. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Account_Layout.png" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Chatter enables the new UI theme, which I've been requesting for several weeks since
the launch of Spring '10. Awesome news since this was not available with the initial
Spring 10 rollout. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Setup.png" border="0" /&gt; 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;b&gt;Setting expectations with users.&lt;/b&gt;
&lt;br /&gt;&lt; 10 users, this is no big deal. But I'm guessing a larger org may want to do a more methodical rollout.
&lt;/p&gt;
I was the eager admin excited to get my hands on new features, then it dawned on me
that other users might have questions about the change. In a company of 
&lt;p&gt;
After enabling Chatter I sent out an email to everyone simply stating "This is going
to rock. If you've used Facebook, then you'll understand what the new feature is about.
There's also a new theme activated." 
&lt;/p&gt;
&lt;p&gt;
Some Salesforce admins on Twitter have suggested just enabling the new UI, setting
off the fire alarm as a distraction, then running out of the building. Whatever works!
:-) My feeling is that there should be no delay enabling the new UI. The majority
of users will love it. 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;b&gt;Email Alerts&lt;/b&gt;
&lt;br /&gt;
One feature that really stands out is the ability to receive an email alert whenever
certain events occur. I think this is a smart move on Salesforce's part. Each user
has the new ability to enable/disable email alerts under Personal Setup "My Chatter
Settings". 
&lt;/p&gt;
&lt;p&gt;
As much as &lt;a target_blank href="http://wave.google.com/about.html"&gt;Google Wave&lt;/a&gt;,
Wikis, and other social business software may promote the benefits of replacing email
with collaboration platforms, it's just never really panned out. There are just too
many Outlook and Gmail users out there with investments in email filters and routing
rules for driving business process. I left these features enabled (the default setting). 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Personal_Preferences.png" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Based on past experience, I had a concern that Chatter emails might eventually overwhelm
my inbox (which I have a particular &lt;a href="http://www.davidco.com"&gt;GTD obsession&lt;/a&gt; for
managing), so before proceeding any further I created a GMail label and filtering
rule specifically for Chatter. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Gmail_Chatter_Filter.png" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
Now all emails from "Salesforce Chatter" automatically get tagged and sorted into
their own folder in GMail. The equivalent can be easily accomplished in Outlook Rules.
This might be a good tip for Salesforce Admins to share in their Chatter rollout email. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Label_Gmail_Arrow.png" border="0" /&gt; 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;b&gt;Chatter Settings and Feed Tracking&lt;/b&gt;
&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Admin_Setting_Options.png" border="0"&gt;
&lt;br /&gt;
Administrators can define which objects are enabled for Chatter collaboration and
which fields on those objects will trigger automatic Chatter updates. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Feed_Tracking_Settings.png" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
This is a very simple and easy to use 2 panel user interface with Objects on the left
and fields on the right. You select which fields will trigger a Chatter alert when
modified. The left panel has an excellent UI element that tells you how many fields
are being tracked on that particular object, so you don't have to drill down to each
object one at a time to identify feed tracking hot spots. 
&lt;p&gt;
&lt;p&gt;
If you've worked with object history tables in Salesforce, you'll be familiar with
what this interface is providing. Now with Chatter, in addition to logging history
changes, you're also posting messages to the Chatter stream. History table and Chatter
feeds are 2 completely separate features, athough they are semantically the same. 
&lt;/p&gt;
&lt;p&gt;
Some objects had feed tracking enabled by default. Most did not. Of the ones enabled,
they had 2-5 fields already pre-selected. I could not discern any particular pattern
as to how or why certain defaults were configured. I'd say the defaults look "balanced"
and it does appear that someone put some thought into a reasonable amount of feed
traffic on frequently used CRM object/field combinations. There is a "Restore Defaults"
link in the right panel of each object. Clicking these restores the defaults. 
&lt;p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;b&gt;People and Profile Tabs&lt;/b&gt;
&lt;br /&gt;
One final Administrative step is to add the People and Profile tabs to your main applications.
Just as you can view/manage your profile and find your friends in Facebook, Chatter
provides Profile and People tabs to accomplish similar tasks. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Colleagues.png" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Chatter will work without these tabs, but users will only be able to incrementally
discover other people who comment on particular objects. I added these 2 tabs to all
our applications to get the full benefit of Chatter and apply some consistency in
the UI. The People tab provides a list view of all "Colleagues" within the Salesforce
Org. The Profile tab allows users to define how they appear to other people; including
photo, status, and description. 
&lt;/p&gt;
&lt;p&gt;
The "Update Photo" feature with image cropper file is probably one of the first features
Chatter users will use on the Profile page.&lt;br /&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Image_Cropper.png" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
I found it interesting that I could, as a System Administrator, edit other peoples
profiles. That initially struck me as "big brother-ish" since I'm so accustomed to
passively &lt;i&gt;using&lt;/i&gt; social media platforms, and not actually administrating them.
The Chatter Profile pages also contain a link to the existing User Detail page template,
which I know Admins will appreciate. 
&lt;/p&gt;
&lt;p&gt;
One thing I really like about Chatter is that Salesforce didn't complicate the configuration
by providing a full access control list (ACL) wrapper with specific Read/Write permissions
per object. If you can view a object, you can jump right in and chime in on Chatter
without wondering if you only have read only permissions to watch what other people
are saying, but not be able to contribute yourself. 
&lt;/p&gt;
&lt;p&gt;
Granted somebody at some time likely raised the concern "But what if some CEO only
wants employees to read his status messages and not comment on them?". I'm glad Salesforce
resisted that level of access permissions in Chatter. 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;b&gt;Following&lt;/b&gt;
&lt;br /&gt;
The first introduction to "Following" will likely be on the People page where users
are given the opportunity to subscribe to what particular people are posting as their
status message. In such a small org, such as ours, you can follow everyone with just
a few clicks. But it made me wonder if a "Follow All" button might be handy for larger
orgs.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_People_With_Pics.png" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
Chatter uses what is commonly referred to as an "&lt;i&gt;&lt;a target=_blank href="http://www.redmonk.com/jgovernor/2008/12/05/assymetrical-follow-a-core-web-20-pattern/"&gt;asymmetric
follow&lt;/a&gt;&lt;/i&gt;" architecture. In other words, I can follow you but you don't necessarily
have to follow me. This is how Twitter works. Facebook, however, uses a &lt;i&gt;symmetric&lt;/i&gt; system
where we must both mutually agree to be friends to follow each others posts and activities. 
&lt;/p&gt;
&lt;p&gt;
It makes sense Salesforce would not want to use Facebook's symmetric following because
it's assumed right out of the box all users are colleagues in a single organization.
You only need to decide which colleagues activity you want in your stream. 
&lt;/p&gt;
&lt;p&gt;
Maybe one day when Chatter is enabled in a Salesforce-to-Salesforce configuration
it may be beneficial to limit who is following your activity (for example, would Michael
Dell want all his suppliers following his Chatter simply because a SForce-to-SForce
bridge was enabled? I'd guess not.... but only Michael can answer that question). 
&lt;/p&gt;
&lt;p&gt;
I can see dialogues taking place in the workspace along the lines of "Yeah, I track
that industry pretty closely. Follow me on Chatter if you want more information". 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;b&gt;Using Chatter&lt;/b&gt;
&lt;br /&gt;
I never really used the Salesforce Home page for much more than reviewing my Tasks
lists. 99% of my time in Salesforce has aways been working in records. But that now
changes with Chatter since the Home page is the central hub for aggregating all the
people and content you are following. The home page is now "the business stream" and
the potential opportunity for exploiting its power is huge. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Salesforce_Home_Chatter_Summary.png" border="0" /&gt; 
&lt;br /&gt;
(&lt;i&gt;Note about Screenshot: Yes, Chatter can be pretty boring when you're the first
person using it. Fortunately, I have the StanBot API User to keep me company (future
post) until adoption catches on with the others :-) &lt;/i&gt;) 
&lt;/p&gt;
&lt;p&gt;
The first time you drill down on any record details with Chatter feeds enabled you're
prompted with some next step options and the option to view a 2 minute video on Chatter. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.embracingthecloud.com/content/binary/Chatter_Account_Layout_001.png" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
As developer, we can all appreciate the detail that goes into not only developing
a new feature, but also deflecting support calls and questions with simple, easy to
understand tutorials and documentation. I give Salesforce 5 out of 5 stars here. 
&lt;/p&gt;
&lt;p&gt;
Chatter is so well designed and so very similar to Facebook and other social apps,
that I'd be surprised if 80% of Salesforce users couldn't click on "Close", skip the
tutorials, and figure out most of Chatter on their own. 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;b&gt;Collaboration and Development In The Cloud&lt;/b&gt;
&lt;br /&gt;
While there are many cool features in Chatter, the fact that this platform is hosted
in the cloud and can be extended to include pretty much any web service into the business
stream is what makes it so powerful. There is no software to install, any Admin can
setup Chatter in just a few minutes, and collaboration is baked into the platform
as a core feature (ie there's no additional license fee to use Chatter). 
&lt;/p&gt;
&lt;p&gt;
Part 2 of my Chatter review will get into the specifics of Chatter enabling existing
Salesforce apps and taking a peek into the Chatter API and new types of apps that
can be developed. Stay tuned! 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=6300aae9-c3c1-428a-8510-acb13d530f5a" /&gt;</content>
  </entry>
  <entry>
    <title>XP: What is "eXtreme" in 2010?</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/02/25/XPWhatIsEXtremeIn2010.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,aee65979-5b02-40f1-b257-269c18ce5360.aspx</id>
    <published>2010-02-25T14:08:06.118-06:00</published>
    <updated>2010-02-25T14:20:59.1233931-06:00</updated>
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <img border="0" src="http://www.embracingthecloud.com/content/binary/xpdx.jpg" />
        <p>
The eXtreme Programming Portland user group, <a target="_blank" href="http://xpdx.org/">XPDX</a>,
is going through some changes. Several members want to change the name to something
like the Portland Agile Developers Group to reflect the group's openness to a variety
of development methodologies. 
</p>
        <p>
I happen to love <a href="http://www.extremeprogramming.org" target="_blank">XP</a> and
have used it since 1999 as a general framework and reminder of key principles to keep
in mind on any software project. XP, Scrum, Kanban, and every other agile development
methodology I've researched have so much in common that I felt it was easier and more
pragmatic to just stick with a single name rather than appear to be chasing the latest
fad. 
</p>
        <p>
But Agile has become a very academic topic and apparently the minor differences between
the various methodologies are not to be dismissed lightly. 
</p>
        <p>
This forced me to reflect on why I, and many many other people, were initially attracted
to XP and why interest has waned. The answer suddenly became very obvious to me. 
</p>
        <p>
eXtreme Programming, at one time, promoted "extreme" ideas that challenged the status
quo. It was easy to fill a room with 50+ people who wanted a revolution. And the revolution
was successful. Most XP best practices are no longer "extreme". We take many XP and
Agile practices for granted now. In fact, Agile is now the new status quo! 
</p>
        <p>
It's actually pretty boring to attend or present at an agile group meeting and rehash
the same ideas. Attendance is way down. So, if changing a group name is a branding
effort to increase attendance, I don't believe that will succeed. Sure, it may draw
3-5 more people like an "Under New Management" sign outside an old restaurant, but
it won't change the fact that the same old stuff is on the menu. 
</p>
        <p>
An aura of infantilism is creeping into Agile. Agile Coaches and Practitoners now
seem more like parents than mentors. Agile meeting topics are increasingly about games
and tactics that have short term productivity gains of bringing teams around a single
purpose. When I ask presenters about the longevity of their agile teams or the software
they produced, it's rare to encounter an answer over 6 months, leading me to believe
many agile projects are getting by on the initial "honeymoon" inertia before reality
sinks in. <b>All</b> successful software projects are ultimately faced with what seems
like a daunting and unachievable task that puts tremendous pressure on the team. What
a team does at that inflection point is the true test of "agility". 
</p>
        <p>
In many cases, Agile practitioners don't even code or have not evolved their skills
beyond 1999 object oriented programming techniques. If practitioners spent more time
coding, they would have a sense of the new revolution and extreme ideas that are brewing. 
</p>
        <p>
OK. So that's out of the way. My intent is not to push people away, but to pull them
towards a new way of thinking. I titled this post to promote forward thinking, so
let's switch gears. 
</p>
        <p>
If XP was extreme in 2000 by virtue of challenging the status quo, then what is extreme
in 2010? Many of the following ideas may be tough to accept. If any of these ideas
make you feel uncomfortable, threatened or obsolete, then you may be part of the current
status quo. But trust me, these ideas are getting traction and are not going away.
The sooner we as a development community embrace these changes, the more relevant
our meetings will become. 
</p>
        <p>
          <b>"Feature Democratization"</b>
          <br />
XPs core tenet of achieving customer satisfaction through customer driven feature
stories has evolved in 2010 to make use of idea voting sites. The customer is now
the product manager and has become very involved with providing ideas, feature requests,
and UI mockups. 
</p>
        <p>
          <b>"The 24 Hour Iteration"</b>
          <br />
The recent launch of Google Buzz had millions of people up in arms over privacy concerns
while others applauded the new feature. Google had to act fast and update the software
within 24 hours in response to the first wave of customer feedback. This was not a
"patch". This was an extremely compressed iteration backed by a process that supports
this kind of change. Developing in the cloud is living on the extreme. 
</p>
        <p>
          <b>"Writers Write" </b>
          <br />
Software Development is not a 9 to 5 job. Many people go home then build websites
for their churches, contribute to open source projects, or just simply enjoy programming
over the weekends. A personal growth goal for some Developers is to develop their
own style, much like a literary writer. The days of seeking validation from a venture
capitalist to pursue an idea are over. We don't all need to conform to a universal
set of rules or conventions when writing software. 
</p>
        <p>
          <b>"No Outsourcing" </b>
          <br />
Great software development projects are not outsourced. No more than a great video
game title, movie, song, or book gets outsourced. Let's get over the false idea that
software development is an easily outsourced task and embrace the uniqueness and originality
any person or team can contribute. 
</p>
        <p>
          <b>"No SQL" </b>
          <br />
Many greenfield projects are breaking away from the long history of using relational
data stores. The NoSQL movement is developing applications faster and more scalable
by sacrificing relational features like JOIN. Many NoSQL projects have characteristics
similar to early object oriented database solutions. 
</p>
        <p>
          <b>"All Javascript All The Time" </b>
          <br />
A little Javascript in a product like Google Maps can go a long way. Taking this to
the extreme and developing entire products in Javascript, such as Google Apps and
Microsoft's upcoming Web Office 2010, requires a different approach to software development.
New layers of abstraction like GWT, Closure, and JQuery should be explored and embraced
by anyone working on web applications. 
</p>
        <p>
          <b>"See The Forest For The Trees"</b>
          <br />
Really not an extreme idea, but one I think has been lost. When agile discussions
quickly devolve into focusing on a small detail and make an academic issue out of
the process, the survivalist in me says "Yeah that's great, but let's not lose sight
of the big picture". Maybe the "big picture" just can't be coached. A good team needs
to internalize the value being received by the customers and, ideally, be a consumer
themselves of what they're developing. How do people discover software? What compels
them to try it? What is the install/config process like? Why would they stay engaged?
Can game mechanics can be added? How can the customer be given a voice and opportunity
to participate in the evolution of the software? For agile teams, this process is
"fun". For other teams, the Developers actually need to be told what to do, how to
do it, and when to deliver it. 
</p>
        <p>
          <b>"Work from home / Distributed collaboration" </b>
          <br />
The essence of pair programming is to collaborate with other Developers on a single
task. In reality, most software is not written with 2 Developers physically in the
same space. The Internet allows for more distributed collaboration opportunities in
2010. How are successful projects taking this to an extreme and using this to their
advantage? 
</p>
        <p>
          <b>"Quit Unit Testing and Write Better Code" </b>
          <br />
Unit testing is largely used in object oriented projects as a check on the side effects
and loose contracts inherent in OOP. Design by Contract and Functional Programming
have evolved (actually FP has been around quite awhile) to address these quality issues
up front. One extreme idea is to "not do unit testing" and actually improve the quality
of code by removing side effects with functional programming and using design by contract
for runtime enforcement. Several agile projects with tons of unit tests just end up
being "well tested crap". What's wrong? Unit testing is not a silver bullet. Let's
get that out on the table. 
</p>
        <p>
          <b>"Pair Programming Sucks"</b>
          <br />
Let's face it. When 2 people with compatible coding and social skills work together,
they'll produce something well beyond what they'd create on their own. If the pair
is not compatible, then the code will suffer and they'll possibly make life worse
for others around them. You can't "coach" people to work together. Dogmatic pairing
of programmers cannot be universally applied to all projects. Good teams and collaborations
take time to develop. 
</p>
        <p>
          <b>"Develop In The Cloud" </b>
          <br />
Do you really need to spend an iteration "0" setting up servers, getting everyone's
desktop on the same version, and installing a database? Once the project goes live
do you want to take a 3am call to address a load balancing bug? If you encounter any
measure of success, are you really prepared to scale and meet the demand of that success?
The status quo says "Yes, how else will get ROI from the datacenter we just built?".
The extreme programmer would say "No way. Writers write. You handle the rest". 
</p>
        <p>
          <b>"Federated Cloud" </b>
          <br />
We've all been conditioned to avoid "Vendor lock-in" when making a significant investment
in IT infrastructure, but are we making the same mistakes as more software development
moves to the cloud? Will all software eventually run on one of 4 large datacenters?
The cloud was built on open source. Now the open source movement needs to be revitalized
in the cloud, move beyond HTTP/SMTP, and federate a more abstract layer on the Internet
using open source. 
</p>
        <p>
          <b>"Bootstrap to Success" </b>
          <br />
How relevant is a Computer Science degree or VC funding in your decision to using
software? Anyone can develop great software and become financially independent using
proven bootstrapping techniques and the Internet as a distribution channel. 
</p>
        <p>
I've itemized just over a dozen extreme ideas here. There are many more. Do XP groups
need re-branding or does XP itself need to be redefined to take on new extremes? Should
we recalibrate and invoke XP's <a href="http://www.extremeprogramming.org/rules/fixit.html" target="_blank">FixIt
rule</a>? 
</p>
        <p>
If even one other person in Portland wants to discuss these ideas, I'd be happy to
meet over a Beer (or two) to explore the "new extremes" on a regular basis. 
</p>
        <p>
Comments? Ideas? Suggestions? 
</p>
        <img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=aee65979-5b02-40f1-b257-269c18ce5360" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Presenting "Developing In The Cloud" at PDXJS</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/02/22/PresentingDevelopingInTheCloudAtPDXJS.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,0171e696-f935-49c8-962c-d41b36b8a6f9.aspx</id>
    <published>2010-02-22T12:40:29.129-06:00</published>
    <updated>2010-02-22T12:40:29.129-06:00</updated>
    <category term="Java Script" label="Java Script" scheme="http://www.embracingthecloud.com/CategoryView,category,JavaScript.aspx" />
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I'm presenting "Developing In The Cloud" at the <a href="http://pdxjs.com/">Portland
JavaScript Admirers Group</a> this month. If you're in Portland this Wednesday, February
24th, 2010, <a href="http://calagator.org/events/1250458318">come check it out</a> 7pm-10pm!
</p>
        <p>
The talking points are below. There'll be several visual examples and live coding
demonstrations. 
</p>
        <iframe src="http://docs.google.com/present/embed?id=ddq7ddk8_97hm8m65dm" frameborder="0" width="410" height="342">
        </iframe>
        <img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=0171e696-f935-49c8-962c-d41b36b8a6f9" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Validating Credit Card Numbers in Apex</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/02/21/ValidatingCreditCardNumbersInApex.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,d51f2782-1564-458c-a749-192c9fd9efe9.aspx</id>
    <published>2010-02-21T14:15:00.535-06:00</published>
    <updated>2010-02-21T14:20:54.769625-06:00</updated>
    <category term="Apex" label="Apex" scheme="http://www.embracingthecloud.com/CategoryView,category,Apex.aspx" />
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
There are several bank specific rules for validating credit cards, but all card numbers
can be validated using the <a href="http://en.wikipedia.org/wiki/Luhn_algorithm">Luhn
algorithm</a>. The Luhn algorithm, aka the Luhn formula or "modulus 10" algorithm,
is a simple checksum formula used to validate a variety of identification numbers. 
</p>
        <p>
It is not intended to be a cryptographically secure hash function; it was designed
to protect against accidental errors, not malicious attacks. Most credit cards and
many government identification numbers use the algorithm as a simple method of distinguishing
valid numbers from collections of random digits. 
</p>
        <p>
Programmers accustomed to using '%' as a modulus operator need only to shift gears
slightly and use the Math.mod(int1, int2) library function when working with Apex. 
</p>
        <pre class="brush: java;">
public static boolean isValidCheckSum(List&lt;integer&gt; numbers){
	integer sum = 0;
	integer len = numbers.size();
	
	for (integer i = len - 1; i &gt;= 0; i--)
	{
		if (math.mod(i , 2) == math.mod(len,  2) )
		{
			integer n = numbers[i] * 2;
			sum += (n / 10) + ( math.mod(n, 10));
		}
		else
			sum += numbers[i];
	}
	return ( math.mod( sum, 10) == 0 );
}
</pre>
        <img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=d51f2782-1564-458c-a749-192c9fd9efe9" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Accessing Salesforce Spring '10 Features in Eclipse IDE</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/02/17/AccessingSalesforceSpring10FeaturesInEclipseIDE.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,36724699-ec78-430a-a683-17adcdf21519.aspx</id>
    <published>2010-02-16T20:28:19.318-06:00</published>
    <updated>2010-02-17T11:53:30.599625-06:00</updated>
    <category term="Apex" label="Apex" scheme="http://www.embracingthecloud.com/CategoryView,category,Apex.aspx" />
    <category term="Visualforce" label="Visualforce" scheme="http://www.embracingthecloud.com/CategoryView,category,Visualforce.aspx" />
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
I spent a few hours tackling this problem, so hopefully this blog post will spare
someone else the difficulty of using Salesforce Spring '10 features before it is broadly
released. 
</p>
        <p>
          <a href="http://developer.force.com/releases/release/Spring10">Spring '10</a>, aka
version 18, is a big release for Salesforce Developers. The current version of Eclipse <a href="http://wiki.developerforce.com/index.php/Force.com_IDE">Force
IDE</a> defaults to using the version 16 API. 
</p>
        <p>
Once Spring '10 was installed on my org (NA1) I committed to using the v18 features
on a couple new projects. Unfortunately the Spring '10 release hit a snag, so now
the release is being staggered over 30-45 days and the new Force IDE release has been
put on hold. 
</p>
        <p>
Fortunately, there are a couple workarounds to using the v18 API and features today. 
</p>
        <p>
          <b>Option 1)</b>
          <br />
a) Create an Apex class as you normally would in Eclipse and accept version 16 as
the default. 
<br />
b) Eclipse will create a second file next to the class with a 'meta.xml' extension.<br />
c) Edit the -meta.xml file by changing the version to 18 then save.<br /><img border="0" src="http://www.embracingthecloud.com/content/binary/Force_IDE_Meta.png" /></p>
        <p>
          <b>Option 2)</b>
          <br />
a) Create an Apex class through the Salesforce browser interface but do not accept
the default version 18. Instead, select version 16.<br />
b) Open the Salesforce project in Eclipse and confirm the Apex class is available
in the IDE (the current IDE apparently won't automatically sync with classes &gt; v16.
At least that was my experience).<br />
c) Back in the Salesforce browser, change the version from 16 to 18.<br /><img border="0" src="http://www.embracingthecloud.com/content/binary/force_browser_version.png" /></p>
        <p>
Finally, depending on which approach used, you'll need to synchronize the Eclipse
IDE with Salesforce servers using either the "Deploy to" or "Refresh from" server
options by right clicking on the class and selecting from the Force.com option. (Option
1 requires "Deploy to". Option 2 "Refresh from").<br /><img border="0" src="http://www.embracingthecloud.com/content/binary/force_sync.png" /></p>
        <p>
Hope this helps! 
</p>
        <img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=36724699-ec78-430a-a683-17adcdf21519" />
      </div>
    </content>
  </entry>
  <entry>
    <title>An Apex MultiPicklist Wrapper Class</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/02/02/AnApexMultiPicklistWrapperClass.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,82e27648-7bf4-423e-a1cf-25c34a8c35ed.aspx</id>
    <published>2010-02-02T14:23:21.513-06:00</published>
    <updated>2010-02-02T14:29:24.9825-06:00</updated>
    <category term="Apex" label="Apex" scheme="http://www.embracingthecloud.com/CategoryView,category,Apex.aspx" />
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="html">&lt;p&gt;
Every once in awhile I run into a requirement when using Apex where I think there
must be a real obvious way to do something, only to hit a wall and decide to develop
the functionality myself. 
&lt;/p&gt;
&lt;p&gt;
When this happens, the result either ends up being:&lt;br /&gt;
a) I later discover there actually &lt;i&gt;is&lt;/i&gt; a faster/better way to do something and
I feel stupid for taking the &lt;a target=_blank href="http://en.wikipedia.org/wiki/Not_Invented_Here"&gt;NIH
path&lt;/a&gt; (Not Invented Here).&lt;br /&gt;
b) The functionality really is missing and the effort invested turns out to be well
spent. 
&lt;/p&gt;
&lt;p&gt;
Let's just hope the time spent on this wrapper class is in the latter category :-) 
&lt;/p&gt;
&lt;p&gt;
In this use case, a custom database object is wrapped in an Apex class that abstracts
the underlying object properties and provides some methods. One of the properties
(a database custom field) is a multipicklist that is stored in semicolon delimited
format, but is better represented in object-oriented terms as a List. Methods for
Adding and Removing items from the list are also needed. 
&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
public class Foo{
	private Foo__c m_record = null;
	public Foo(Foo__c record){
		m_record = record;
	}

	private MultiSelectProperty m_categories = new MultiSelectProperty();
	public List&amp;lt;string&amp;gt; Categories{
		get{return m_categories.ToList(m_record.Category__c);}
	}
	public void AddCategory(string category){
		m_record.Category__c = m_categories.Add(m_record.Category__c, category);
	}
	public void RemoveCategory(string category){
		m_record.Category__c = m_categories.Remove(m_record.Category__c, category);
	}
}
&lt;/pre&gt;
&lt;p&gt;
The MultiSelectProperty class is defined here. The unit tests should help tell the
story on how it can be used and the assumptions it makes. 
&lt;/p&gt;
&lt;pre class="brush: java;"&gt;
//Manages semicolon-delimited multipicklist data. 
global class MultiSelectProperty {
	
	public List&amp;lt;string&amp;gt; ToList(string storedValue){
		List&amp;lt;string&amp;gt; values = new List&amp;lt;string&amp;gt;();
		if(storedValue == null || storedValue == '')
			return values;
		else{			
			string[] splitValues = storedValue.split(';');
			for(string v : splitValues){
				if(v != null &amp;&amp; v != '')
					values.add(v);
			}
			return values;
		}
	}
	
	public boolean Contains(string field, string value){
		List&amp;lt;string&amp;gt; values = this.ToList(field);
		for(string v : values){
			if(v==value){
				return true;
			}
		}
		return false;
	}
	
	public string Add(string field, string value){
		if(field == null)
			field = '';
		
		if(value == null || value == '')
			return '';
		
		if(this.Contains(field, value))
			return field;
		
		if(field.endsWith(';')){
			return field + value;
		}
		else
			return field + ';' + value;
	}
	
	public string Remove(string field, string value){
		if(field == null || field == '')
			return '';
		
		if(value == null || value == '')
			return field;
		
		if(!this.Contains(field, value))
			return field;
		
		List&amp;lt;string&amp;gt; values = this.ToList(field);
		string formattedFields = '';
		for(string v : values){
			if(v == value)
				continue;
			formattedFields += v + ';'; 
		}
		return formattedFields;		
	}
	
	@IsTest public static void tests(){
		final string SINGLE_VALUE_NULL = null;
		final string SINGLE_VALUE_EMPTY = '';
		final string SINGLE_VALUE = 'first option;';
		final string SINGLE_VALUE_EMPTY_TRAIL = 'first option';
		final string DOUBLE_VALUE = 'first option;second option;';
		final string TRIPLE_VALUE = 'first option;second option;third option;';
		
		MultiSelectProperty categories = new MultiSelectProperty();
		System.assert(categories.ToList(SINGLE_VALUE_NULL).size() == 0);
		System.assert(categories.ToList(SINGLE_VALUE_EMPTY).size() == 0);
		System.assert(categories.ToList(SINGLE_VALUE).size() == 1);
		System.assert(categories.ToList(SINGLE_VALUE_EMPTY_TRAIL).size() == 1);
		System.assert(categories.ToList(DOUBLE_VALUE).size() == 2);
		System.assert(categories.ToList(TRIPLE_VALUE).size() == 3);
		
		System.assert(categories.Contains(SINGLE_VALUE, 'first option') == true);
		System.assert(categories.Contains(SINGLE_VALUE, 'second option') == false);
		System.assert(categories.Contains(DOUBLE_VALUE, 'second option') == true);
		System.assert(categories.Contains(DOUBLE_VALUE, 'third option') == false);
		System.assert(categories.Contains(TRIPLE_VALUE, 'first option') == true);
		System.assert(categories.Contains(TRIPLE_VALUE, 'second option') == true);
		System.assert(categories.Contains(TRIPLE_VALUE, 'third option') == true);
		
		string fields = categories.Add(SINGLE_VALUE, null);	
		System.assert(categories.ToList(fields).size() == 0);
		fields = categories.Add(null, null);
		System.assert(categories.ToList(fields).size() == 0);
		fields = categories.Add(null, '');
		System.assert(categories.ToList(fields).size() == 0);
		fields = categories.Add(SINGLE_VALUE, '');
		System.assert(categories.ToList(fields).size() == 0);
		
		fields = categories.Add(SINGLE_VALUE, 'second option');
		System.assert(categories.ToList(fields).size() == 2);
		System.assert(categories.Contains(fields, 'second option') == true);
		
		fields = categories.Add(SINGLE_VALUE_EMPTY_TRAIL, 'second option');
		System.assert(categories.ToList(fields).size() == 2);
		System.assert(categories.Contains(fields, 'second option') == true);
		
		fields = categories.Add(DOUBLE_VALUE, 'second option');
		System.assert(categories.ToList(fields).size() == 2);
		System.assert(categories.Contains(fields, 'second option') == true);
		
		fields = categories.Remove(null, '');
		System.assert(categories.ToList(fields).size() == 0);
		
		fields = categories.Remove(null, null);
		System.assert(categories.ToList(fields).size() == 0);
		
		fields = categories.Remove(SINGLE_VALUE, '');		
		System.assert(categories.ToList(fields).size() == 1);
		
		fields = categories.Remove(SINGLE_VALUE, null);		
		System.assert(categories.ToList(fields).size() == 1);
		
		fields = categories.Remove(SINGLE_VALUE, 'second option');
		System.assert(categories.ToList(fields).size() == 1);
		System.assert(categories.Contains(fields, 'second option') == false);
		
		fields = categories.Remove(SINGLE_VALUE, 'first option');
		System.assert(categories.ToList(fields).size() == 0);
		System.assert(categories.Contains(fields, 'first option') == false);
		
		fields = categories.Remove(TRIPLE_VALUE, 'first option');
		System.debug('results from remove ' + fields);
		System.assert(categories.ToList(fields).size() == 2);
		System.assert(categories.Contains(fields, 'first option') == false);
		System.assert(categories.Contains(fields, 'second option') == true);
		System.assert(categories.Contains(fields, 'third option') == true);
	}
}
&lt;/pre&gt;&lt;img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=82e27648-7bf4-423e-a1cf-25c34a8c35ed" /&gt;</content>
  </entry>
  <entry>
    <title>Case Priority</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/01/31/CasePriority.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,f1164016-d297-446c-8b5f-9447b2144a05.aspx</id>
    <published>2010-01-30T18:27:09.951-06:00</published>
    <updated>2010-01-30T18:30:30.404375-06:00</updated>
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Have you ever wondered about the "priority" field on support Cases? It makes sense
for internal use, but I've never seen a priority other than "High" when the option
is given on customer portal Web-to-Case forms. :-) 
</p>
        <img src="http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef0120a82e3749970b-800wi" width="600" />
        <img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=f1164016-d297-446c-8b5f-9447b2144a05" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Embracing the Creative Commons</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/01/27/EmbracingTheCreativeCommons.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,bbdcf1c1-a56c-4ab2-add7-f189eedded38.aspx</id>
    <published>2010-01-26T18:03:30.111-06:00</published>
    <updated>2010-01-26T18:10:42.095625-06:00</updated>
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <i>(Note: This blog post is based on an
idea I have for setting up a non-profit dedicated to promoting the <a href="http://creativecommons.org/about/">Creative
Commons</a> licensing model for music using cloud infrastructure. I may revisit and
modify this post periodically as the model gets fleshed out.)</i>
        <br />
        <br />
As a musician growing up in the 80's, the "hip" thing to do was sampling other works
and incorporating them into new arrangements. It was, and still is, a very creative
and rewarding process that produces what are commonly referred to today as "mashups".
I typically used Jazz samples. Others, like <a href="http://en.wikipedia.org/wiki/Ice_Ice_Baby">Vanilla
Ice</a>, used more recognizable samples from artists like Queen and David Bowie. 
<br /><br />
The artists of the sample source rarely received royalties for the redistribution
of their work. Eventually, litigation started and a new precedence became established
that prevented the creation of new works from existing works without the owners consent.<br /><br />
I had no problem with the concept of attributing other peoples work or sharing in
any commercial success as a result of repurposing work into my own. I got in the habit
of working with the <a href="http://www.harryfox.com">Harry Fox Agency</a> before
pursuing such projects and budgeting appropriately for using samples. But still, artists
(and most their publishers) had to be "pulled" into remixing opportunities.<br /><br />
Some visionary artists, like Peter Gabriel, were going out of their way to re-mix
and "push" their samples to us and gave control of the faders to remix their songs
into new and unimaginable soundscapes.<br /><br />
Lawrence Lessig's work "<a href="http://remix.lessig.org/">Remix</a>" touched on the
very heart of this issue and several questions are being raised about the future of
music in light of the entertainment "cloud".<br /><br />
Is not the creative work of Danger Mouse's (probably not his real name) <a href="http://en.wikipedia.org/wiki/The_Grey_Album">Grey
Album</a> a brilliant piece of creative work and masterpiece in it's own right, even
though it is a mashup of existing digital media?<br /><br />
Should a parent be penalized for adding background music to the video of their childs
5th birthday and publishing it to YouTube?<br /><br />
Would a song like Chris Brown's 'Forever' had achieved such <a href="http://blog.nielsen.com/nielsenwire/online_mobile/viral-wedding-videos-10m-views-drive-chris-brown-buzz-and-sales/">stellar
commercial success</a> had it not been viewed on <a href="http://www.youtube.com/watch?v=4-94JhLEiN0">YouTube</a> over
40 million times in a non-commercial use?<br /><br />
There is a solution to this problem. The <a href="http://creativecommons.org">Creative
Commons</a> was established as a nonprofit corporation dedicated to making it easier
for people to share and build upon the work of others, consistent with the rules of
copyright.<br /><br />
They provide free licenses and other legal tools to mark creative work with the freedom
the creator wants it to carry, so others can share, remix, use commercially, or any
combination thereof.<br /><br />
To truly embrace the cloud and the Creative Commons involves:<br /><ul><li>
Artists and labels rethinking the publication of their works and undergoing a 2.0
release of their works as reusable samples for use in other works.</li><li>
Artists allowing non-commercial use of their works and defining the terms of commercial
use.</li><li>
Mashup artists attributing works to other artists and participating in the re-distribution
of works through both commercial and non-commercial channels.</li></ul>
There are those that oppose this model.<br /><ul><li>
Performance Rights Organizations (PROs) like BMI and ASCAP are entrenched in securing
performance royalties on-behalf of commercial artists. 
<br /></li><li>
The ability for artists to allocate ownership percentages to studio musicians and
other contributors threatens the traditional 50/50 Publisher/Artist model in common
use today and would displace traditional royalty accounting systems.<br /></li><li>
Commercial Music labels are wedded to decades-old formulas that control the 360 degree
image and distribution of an artists work.<br /></li></ul><br />
To make this work:<br /><ul><li>
New publishing and accounting systems are required that allow artists to offer the
equivalent of fully vested 'stock options' on works.</li><li>
New mashup publishing systems that allow original and mashup artists to negotiate
the percentile distribution of commercial redistribution revenue (for example, an
artist may use 5 samples in a song, giving each artist 10% and keeping 50% for the
new work. The other 5 artists should have a voice in accepting proposed terms).<br /></li><li>
Artists must consider bypassing traditional "record deals" and work with progressive
publishers.</li><li>
Artists must write-off the non-commercial use of their music as a marketing expense.</li><li>
Artists must package their work for convenient use by mashup artists and editors.</li><li>
Consumers and Mashup Artists must attribute use of all works to the original artist.</li><li>
It must be convenient for a Consumer or Mashup Artist to register their new works
for commercial use and revenue must be quickly, easily, and fairly redistributed.<br /></li></ul><p></p><img src="http://www.embracingthecloud.com/content/binary/CreativeCommons_Mashup_Model.jpg" border="0" /><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=bbdcf1c1-a56c-4ab2-add7-f189eedded38" /></div>
    </content>
  </entry>
  <entry>
    <title>Developing Fluent Interfaces With Apex</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/01/18/DevelopingFluentInterfacesWithApex.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,8910462e-9b6e-4b47-8cbe-8f3677b290e5.aspx</id>
    <published>2010-01-18T17:06:41.26-06:00</published>
    <updated>2010-01-18T17:09:36.323125-06:00</updated>
    <category term="Apex" label="Apex" scheme="http://www.embracingthecloud.com/CategoryView,category,Apex.aspx" />
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Apex is a <a href="http://wiki.developerforce.com/index.php/Apex_Code:_The_World's_First_On-Demand_Programming_Language">programming
language</a> supported by the <a href="http://www.salesforce.com/platform/">Force.com
platform</a>.
</p>
        <p>
A <a href="http://en.wikipedia.org/wiki/Fluent_interface">fluent interface</a> is
a way of implementing an object oriented API in a way that aims to provide for more
readable code. 
</p>
        <p>
An example of a fluent interface looks like:<br /></p>
        <pre class="brush: java;">
Contact c = new Contact();
ITransaction trx = new FluentTransaction()
		.Initialize(c, 5.0)
		.Validate()
		.Execute()
		.Log()
		.Finish();
</pre>
        <p>
Transactions are a good use case for implementing a fluent interface because they
often execute the repeated steps of initializing and validating input values, executing,
and logging data. An API designer can expressly define these methods in an interface
using Apex (very similar to Java and C# interfaces). When implementing a transaction
object, the compiler will check to ensure the proper interfaces are implemented. 
</p>
        <p>
A <i>fluent</i> interface is normally implemented by using method chaining to relay
the instruction context of a subsequent call. Generally, the context is defined through
the return value of a called method self referential, where the new context is equivalent
to the last context. 
</p>
        <p>
        </p>
        <pre class="brush: java;">
public class MethodChaining {
	
	public interface ITransaction{		
		ITransaction Initialize(Contact c, double d);
		ITransaction Validate();
		ITransaction Execute();		
		ITransaction Log();
		ITransaction Finish();
		boolean IsValid();
		boolean IsSuccessful();
	}
	
	public class FluentTransaction implements ITransaction{
		private Contact m_contact;
		private double m_amount;
		private boolean m_isSuccessful = false;		
		private boolean m_isValid = false;
		
		public ITransaction Initialize(Contact c, double d){
			m_contact = c;
			m_amount = d;
			return this;
		}
		
		public ITransaction Validate(){
			//Validate the m_contact and m_amount inputs
			//Setting this to false will instruct other execution chain methods to halt
			m_isValid = true; 
			return this;
		}
		
		public ITransaction Execute(){
			if(IsValid()){
				// Execute the transaction here
				m_isSuccessful = true;
			}
			return this;
		}
				
		public ITransaction Log(){
			if(IsValid()){
				//Add any transaction audit logging here
			}
			return this;
		}
		
		public ITransaction Finish(){
			if(IsValid()){
				//Finalize method. Manage any required cleanup
			}
			return this;
		}
		
		public boolean IsValid(){
			return m_isValid;
		}
				
		public boolean IsSuccessful(){
			return m_isSuccessful;
		}		
	}
	
	public MethodChaining(){
		Contact c = new Contact();
		ITransaction trx = new FluentTransaction()
			.Initialize(c, 5.0)
			.Validate()
			.Execute()
			.Log()
			.Finish();
		
		if(trx.IsSuccessful()){
			//Do something
		}
		else{
			//Do something else
		}
	}
}
</pre>
        <img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=8910462e-9b6e-4b47-8cbe-8f3677b290e5" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Resolution for 2010 : Create 3 More Jobs</title>
    <link rel="alternate" type="text/html" href="http://www.embracingthecloud.com/2010/01/09/ResolutionFor2010Create3MoreJobs.aspx" />
    <id>http://www.embracingthecloud.com/PermaLink,guid,1724731e-d5f3-4706-9184-bc7dc9ce0b3c.aspx</id>
    <published>2010-01-09T16:11:55.08-06:00</published>
    <updated>2010-01-09T16:13:43.065-06:00</updated>
    <category term="Apex" label="Apex" scheme="http://www.embracingthecloud.com/CategoryView,category,Apex.aspx" />
    <category term="Java Script" label="Java Script" scheme="http://www.embracingthecloud.com/CategoryView,category,JavaScript.aspx" />
    <category term="JQuery" label="JQuery" scheme="http://www.embracingthecloud.com/CategoryView,category,JQuery.aspx" />
    <category term="Visualforce" label="Visualforce" scheme="http://www.embracingthecloud.com/CategoryView,category,Visualforce.aspx" />
    <author>
      <name>Mike Leach</name>
    </author>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">With the economy being what it is, I can
think of no better resolution for a small business owner/entrepreneur than to focus
on creating jobs.<br />
Ideally these jobs will be created in the Portland, OR metro area, but we're accustomed
to operating with distributed teams and are happy to continue doing so.<br /><br /><b>Web Application Design / Development</b><br />
With our shift away from .NET and onto the Force.com platform, a person in this role
will need to be competent with:<br /><ul><li>
Salesforce API and custom/native objects</li><li>
Apex Controllers and Classes / Object modeling<br /></li><li>
Visualforce Pages / Eclipse</li><li>
Javascript / JQuery / AJAX<br /></li></ul><i>Possible job creation triggers:</i><br />
We're actively involved in re-architecting the i-Dialogue platform to run on Force
using the above technologies. This product will be launched on the AppExchange with
a Freemium business model. As we start to see adoption, the long-term strategy of
the product will be to develop and offer add-on premium application modules.<br />
Demand for custom module development, such as custom shopping carts or product configurators,
will also spark growth.<br /><br /><b>Professional Services Developer / Project Manager</b><br />
The Pro Service Developer is competent with what's available "out of the box" from
Salesforce and our core products, and offers last mile customization and development
services in direct response to customer and project requirements.<br /><br /><i>Responsibilities include:</i><br /><ul><li>
Custom Visualforce template design and branding</li><li>
Custom layout</li><li>
Configuration and implementation services</li><li>
Weekly progress meetings. Customer facing support and requirements gathering.<br /></li></ul><i>Desired skills:</i><br /><ul><li>
JQuery UI / Themeroller / Custom Themes</li><li>
HTML / Javascript</li><li>
Visualforce (UI emphasis - no custom controller development)<br /></li></ul><i>Possible job creation triggers:</i><br /><ul><li>
Clients and customers requiring custom branding of Salesforce Sites and Portal templates.</li><li>
Custom website, landing page, and portal development on Force.com<br /></li><li>
Multi-channel campaigns executed across email and landing page sites</li><li>
Integration projects involving Sites, Customer/Partner Portal, and Ideas<br /></li></ul><br /><b>Account / Sales Manager</b><br />
The AppExchange coupled with our concept of a Site Gallery will automate much of the
Sales and Marketing process, however an Account/Sales Manager will be required to
assist current and prospective clients assemble the right mix of software and services
for their solution and provide quotes.<br /><br /><i>Possible job creation triggers:</i><br />
Once the free version is released, we'll shift to offering premium add-on modules
within 2 months. 
<br /><br /><br /><b>Risks in 2010</b><br />
The freemium model is somewhat new to us. We're giving away significant value and
functionality in the free version, so it's very likely that only 5-20% of all customers
will require our premium services, which in turn will enable new job growth. However,
this model leverages the scalability and distribution of the cloud and requires no
additional effort on our part to provision new computing resources.<br /><br />
The Web Application Design and Development position requires a Software Engineering
approach to using Javascript. This is a common skill found in Silicon Valley, but
not so much in Portland, OR. It may be difficult to find just the right person(s)
for this role.<br /><br />
Most support functions are handled by Pro Service and Account Managers today, but
there may be a need for a specific support role in the future.<br /><br /><br /><b>Conclusion</b><br /><br />
The actual number of jobs in each position may vary, but these are the 3 primary job
functions we'll seek to create in 2010. The products and features we have planned
in 2010 are embracing the cloud in ways unimaginable a couple years ago and I'm very
excited to wake up each day in pursuit of these solutions. For me, software development
has always been about the journey, and surrounding myself with creative, innovative,
and passionate individuals on this journey is important.<br /><br />
If past success is any indicator of the future, then I think our new direction will
be successful. Of the 60,000+ customers on Salesforce, many are always seeking to
gain more value from their CRM investment by deploying Sites and Portals. By running
natively and offering services directly on the Force.com platform, rather than at
arms length in a hybrid configuration, we're now able to offer much richer applications
and solutions.<br /><br />
If you know of anyone in the Portland, OR area that has these particular skill sets,
please have them contact me at mike@cubiccompass.com.<br /><p></p><img width="0" height="0" src="http://www.embracingthecloud.com/aggbug.ashx?id=1724731e-d5f3-4706-9184-bc7dc9ce0b3c" /></div>
    </content>
  </entry>
</feed>