<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>gokubi.com</title>
	
	<link>http://gokubi.com</link>
	<description />
	<lastBuildDate>Fri, 06 Nov 2009 18:07:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/gokubi" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Nonprofit Salesforce Users – you need to get to Dreamforce</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/LrsaTLl7C2o/nonprofit-salesforce-users-you-need-to-get-to-dreamforce</link>
		<comments>http://gokubi.com/archives/nonprofit-salesforce-users-you-need-to-get-to-dreamforce#comments</comments>
		<pubDate>Fri, 30 Oct 2009 18:28:51 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=946</guid>
		<description><![CDATA[Metcalfe&#8217;s Law states that the value of a network is proportional to the square of the number of connected users. Network value isn&#8217;t additive&#8211;it&#8217;s geometric.
Right now we&#8217;re at 115% of the number of registrants from last year. Following Metcalfe, and if Dreamforce was tomorrow, that means it would be 128% move valuable this year than [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Metcalfe's_law">Metcalfe&#8217;s Law</a> states that the value of a network is proportional to the square of the number of connected users. Network value isn&#8217;t additive&#8211;it&#8217;s geometric.</p>
<p>Right now we&#8217;re at 115% of the number of registrants from last year. Following Metcalfe, and if Dreamforce was tomorrow, that means it would be 128% move valuable this year than it was last year. You can&#8217;t argue with math. <img src='http://gokubi.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>But Dreamforce isn&#8217;t tomorrow&#8211;it starts November 17. If you come, you nonprofit user who hasn&#8217;t registered yet, you who has great ideas and insight to share with others, you who has so much to learn, the power of our network increases amazingly quickly.</p>
<p><strong>If we can get to double last year&#8217;s attendance, we will acheive 4 times the value of last year&#8217;s Dreamforce! It&#8217;s true&#8211;Metcalfe is right!</strong></p>
<p>This year will be my 4th Dreamforce conference. Every year has been much better than the previous. Every nonprofit organization that has taken the time and effort to use Salesforce.com to help manage their operations should find a way to send at least one staff member to the conference. The information, relationships, and experience will pay off many times the costs of traveling and registration.</p>
<p>If you&#8217;re at a Nonprofit using Salesforce.com, or thinking about using it, we currently have a $199 registration rate for you. To get the promotion code, email <a href="mailto:crmdonation@salesforce.com">crmdonation@salesforce.com</a>.</p>
<p>Come be a part of network power. See Metcalfe&#8217;s Law up close and personal! Join us in November!</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/nonprofit-salesforce-users-you-need-to-get-to-dreamforce/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/nonprofit-salesforce-users-you-need-to-get-to-dreamforce</feedburner:origLink></item>
		<item>
		<title>Small steps to a larger goal</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/kQSNVQ-lh7g/small-steps-to-a-larger-goal</link>
		<comments>http://gokubi.com/archives/small-steps-to-a-larger-goal#comments</comments>
		<pubDate>Mon, 26 Oct 2009 21:24:42 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=943</guid>
		<description><![CDATA[On a recent trip to the Bay Area, I had a chance to share a dinner with an amazingly productive and visionary friend who works in the social change field. In the midst of dinner she asked me a very interesting question,
&#8220;When your goal is very long-term, how do you decide what to do today? [...]]]></description>
			<content:encoded><![CDATA[<p>On a recent trip to the Bay Area, I had a chance to share a dinner with an amazingly productive and visionary friend who works in the social change field. In the midst of dinner she asked me a very interesting question,</p>
<blockquote><p>&#8220;When your goal is very long-term, how do you decide what to do today? What is your process for making choices about what gets done first?&#8221;</p></blockquote>
<p>Really, really interesting question that is at the heart of my work, and at the heart of all self-directed knowledge work. With knowledge work, we often aren&#8217;t told what to do, or even what our outcomes should be. We have to start with a long-term vision and walk back to tangible tasks to do and real systems to build.</p>
<p>In the course of our conversation some cool things came out.</p>
<p>First, I tend to prefer tasks that get others unstuck. If people can&#8217;t get some of their work done because of a bug or bad process, I want to address that as soon as I can. A key thing about knowledge work&#8211;so much of what gets done gets done by other people. We&#8217;re almost always in teams, and unsticking teammates is crucial to team success.</p>
<p>Another thing about getting other people unstuck is it shows you are listening. Addressing a piece of work that others have raised shows you respect the needs and input of others. That will bank good will for when you need it in the future.</p>
<p>Second, I like to do things that overtly show movement in the right direction. People love incremental improvement they can see. It&#8217;s much better to take many small steps toward a goal, and let people see them happen, than to take a giant leap that happens behind closed doors. <a href="http://salesforce.com">Salesforce.com</a> has done an exceptional job at this over the years. There is a faith among the customer base that all problems will be eventually resolved, because they&#8217;ve seen progress every 3 months for years now, even if there isn&#8217;t faith they will be all addressed tomorrow.</p>
<p>Third, do things that don&#8217;t create a big support tail for you. When you work with a community of users or customers, their requests can easily overwhelm you. Don&#8217;t jump to do work that creates an untenable support load. Analyze all work you&#8217;re considering with this lens. It&#8217;s not always clear if you&#8217;re setting yourself up for a big tail, so be careful. Doing things without a tail will allow you to move on to the next task with all you&#8217;ve got.</p>
<p>Fourth, think about how you would undo or improve the work you just accomplished. If you are implementing a process that thousands of people will interact with, you want to get it right the first time because changing that in the future may involve re-training all those people. But if you&#8217;re designing how a request from that system is handled behind the scenes, it might not affect many users to swap out a new way to handle that request. If you&#8217;re abstracted from the end users, with technology or personal processes, things will be easier to change. And if things are easy to change in the future, you can move more quickly now, and get more done.</p>
<p>Finally, don&#8217;t make any decisions today that you can<del datetime="2009-10-28T22:20:58+00:00">&#8216;t</del> put off to tomorrow. This may sound like procrastination, but it&#8217;s not. You will usually have more information tomorrow than you do today, so if you can make progress without locking yourself into something, you&#8217;re better off.</p>
<p>I hope this helps you think about the knowledge work you&#8217;re doing every day. We all make this kind of analysis innumerable times subconsciously in our work. It was great to have my friend raise the question and get me thinking about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/small-steps-to-a-larger-goal/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/small-steps-to-a-larger-goal</feedburner:origLink></item>
		<item>
		<title>ONE/Northwest is hiring a CRM consultant</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/XjVuViOD6sg/onenorthwest-is-hiring-a-crm-consultant</link>
		<comments>http://gokubi.com/archives/onenorthwest-is-hiring-a-crm-consultant#comments</comments>
		<pubDate>Mon, 26 Oct 2009 15:08:13 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=939</guid>
		<description><![CDATA[Anyone who asks me has heard the story&#8211;ONE/Northwest was an absolutely fabulous job with amazing people. I loved my time there&#8211;the technical challenges, the freedom to lead, the opportunity to shape the strategy. I won&#8217;t ever stop talking about ONE/Northwest, and the folks I shared that time with will always have a place in my [...]]]></description>
			<content:encoded><![CDATA[<p>Anyone who asks me has heard the story&#8211;ONE/Northwest was an absolutely fabulous job with amazing people. I loved my time there&#8211;the technical challenges, the freedom to lead, the opportunity to shape the strategy. I won&#8217;t ever stop talking about ONE/Northwest, and the folks I shared that time with will always have a place in my heart.</p>
<p>So good news for you! <a href="http://www.onenw.org/about/jobs/CRM-Consultant">ONE/Northwest is hiring a CRM consultant</a>. You could deliver cutting-edge Salesforce solutions to groups that will change the world with your work. Check out the job description and see if you&#8217;re up for some of what I think is the most fulfilling work around! </p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/onenorthwest-is-hiring-a-crm-consultant/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/onenorthwest-is-hiring-a-crm-consultant</feedburner:origLink></item>
		<item>
		<title>MyBallard recognized nationally for community collaboration</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/VD_VuTNR6UY/myballard-recognized-nationally-for-community-collaboration</link>
		<comments>http://gokubi.com/archives/myballard-recognized-nationally-for-community-collaboration#comments</comments>
		<pubDate>Sun, 04 Oct 2009 14:25:59 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Civics]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=936</guid>
		<description><![CDATA[Seattle continues to be a national leader in the post-newspaper world. MyBallard.com, our local neighborhood news blog, just got recognized nationally. I know more about the goings on in my neighborhood than I ever have, and MyBallard is a big part of that. All my friends read it, because it is throughly awesome.
We’re excited to [...]]]></description>
			<content:encoded><![CDATA[<p>Seattle continues to be a national leader in the post-newspaper world. <a href="http://www.myballard.com/">MyBallard.com</a>, our local neighborhood news blog, just got recognized nationally. I know more about the goings on in my neighborhood than I ever have, and MyBallard is a big part of that. All my friends read it, because it is throughly awesome.</p>
<blockquote><p>We’re excited to announce that My Ballard has <a href="http://journalists.org/news/31016/Publish2-My-Ballard-and-Gotham-Gazette-recognized-with-inaugural-Online-Journalism-Awards.htm">just won</a> an Online Journalism Award for community collaboration, edging out the LA Times and Miami Herald. This is an incredible and surprising honor, and the accolades go to you, our Ballard neighbors who have made this site a special place.</p>
<p>We’ve said from the beginning that My Ballard and the rest of the <a href="http://www.nextdoormedia.com/">Next Door Media</a> sites are powered by the neighborhood, not by us. While many journalists over the years have found that idea to be inferior to traditional news coverage, tonight My Ballard was applauded by a packed ballroom of journalists who recognize a new kind of community-powered news that gives the neighborhood a voice. And we have you to thank for your contributions and support.</p></blockquote>
<p>The only downside with MyBallard is that the comment threads can have great info but can also turn into troll-fests. I think this might have something to do with them reaching an audience who hasn&#8217;t participated online in this way before. Or maybe it&#8217;s just the way the world works.  DailyKos and Slashdot sometimes devolve similarly. Both have developed systems to dampen trolls. It might just be there isn&#8217;t a large enough signal to drown out the noise in a neighborhood audience.</p>
<p>Kudos to MyBallard. I love the reportage, and I&#8217;m really glad they were recognized nationally.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/myballard-recognized-nationally-for-community-collaboration/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/myballard-recognized-nationally-for-community-collaboration</feedburner:origLink></item>
		<item>
		<title>Force.com User Group starting in Seattle</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/BvQ1WEBkHwA/force-com-user-group-starting-in-seattle</link>
		<comments>http://gokubi.com/archives/force-com-user-group-starting-in-seattle#comments</comments>
		<pubDate>Tue, 22 Sep 2009 21:28:44 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=931</guid>
		<description><![CDATA[I just heard from Val that the Seattle Force.com Developer User group will kick off on October 1st. If you&#8217;re near Seattle and code in Apex and VisualForce, come join the group. I&#8217;m really excited about it.
Want to take a deeper dive into the technical capabilities of Salesforce? Would you like to meet other Force.com [...]]]></description>
			<content:encoded><![CDATA[<p>I just heard from Val that the Seattle Force.com Developer User group will kick off on October 1st. If you&#8217;re near Seattle and code in Apex and VisualForce, come join the group. I&#8217;m really excited about it.</p>
<blockquote><p>Want to take a deeper dive into the technical capabilities of Salesforce? Would you like to meet other Force.com developers in the Seattle area? Interested in learning about new/different tools that will help you create and develop better solutions? A new Salesforce user group will be starting up on Thursday Oct 1. Meetings will be held on the first Thursday of every month.</p>
<p>We will try to cover a different range of topics at these monthly meetings such as:</p>
<ul>
<li>Summary of new functionality in the upcoming release</li>
<li>Project spotlight where someone will demo their project and the technical details</li>
<li>Best Practices</li>
<li>3rd Party development and integration tools</li>
<li>Apex and VisualForce</li>
<li>Open session to discuss specific questions you may have regarding your current projects</li>
</ul>
<p>Time: 8-9am<br />
Date: Oct 1, 2009<br />
Location:</p>
<p>West Monroe Partners<br />
1215 4th Ave Suite 1010<br />
Seattle, WA 98161</p>
<p>Please contact Val Grasparil (<a href="mailto:vgrasparil@westmonroepartners.com">vgrasparil@westmonroepartners.com</a>) or Andrew Brown (<a href="mailto:abrown@westmonroepartners.com">abrown@westmonroepartners.com</a>) if you have any questions.</p>
<p>Since it is in the morning, coffee and snacks will be provided. Please RSVP if you are planning on attending so we can make sure to have enough food for everyone.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/force-com-user-group-starting-in-seattle/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/force-com-user-group-starting-in-seattle</feedburner:origLink></item>
		<item>
		<title>Awesome talk on how wrong we are about motivation</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/I81uEV2vSiI/awesome-talk-on-how-wrong-we-are-about-motivation</link>
		<comments>http://gokubi.com/archives/awesome-talk-on-how-wrong-we-are-about-motivation#comments</comments>
		<pubDate>Fri, 11 Sep 2009 21:40:34 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=927</guid>
		<description><![CDATA[I love this talk about how wrong business is, especially in combination with the Netflix presentation.
]]></description>
			<content:encoded><![CDATA[<p>I love this <a href="http://www.ted.com/talks/dan_pink_on_motivation.html">talk about how wrong business is</a>, especially in combination with the <a href="http://gokubi.com/archives/netflix-culture-how-to-be-creative-powerful-and-big">Netflix presentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/awesome-talk-on-how-wrong-we-are-about-motivation/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/awesome-talk-on-how-wrong-we-are-about-motivation</feedburner:origLink></item>
		<item>
		<title>Apex Architecture</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/UqSz6kg9fUE/apex-architecture</link>
		<comments>http://gokubi.com/archives/apex-architecture#comments</comments>
		<pubDate>Tue, 08 Sep 2009 16:55:32 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=918</guid>
		<description><![CDATA[My post on Friday spawned some great discussion, even over the Labor Day weekend. If you were off enjoying summer&#8217;s last gasp, go back and check it out. In this post, I want to follow up on that and try to take the Apex architecture discussion to the next level of depth.
As I&#8217;ve said many [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gokubi.com/archives/two-interesting-ways-to-architect-apex-triggers">My post on Friday</a> spawned some great discussion, even over the Labor Day weekend. If you were off enjoying summer&#8217;s last gasp, go back and check it out. In this post, I want to follow up on that and try to take the Apex architecture discussion to the next level of depth.</p>
<p>As I&#8217;ve said many times on this blog, I&#8217;m not a computer scientist, so I&#8217;m backing into architecture and often the concepts from CS-101 are new to me. I know I&#8217;m not the only one, so I&#8217;d like to make explicit some of the assumptions that top-notch developers are making every day. I surely am not an expert, and love to have developers set me straight&#8211;life is about continuous learning.</p>
<p>I&#8217;m going to lay things out as I understand them&#8211;if you think I&#8217;m making poor assumptions, please comment and set me straight. Also know that one of the reasons I love coding is that it is a creative act. It&#8217;s an amazing combination of a highly analytical process and one of inspiration and experimentation. I bet most programmers love that aspect of the job, and so I don&#8217;t believe there is a right way to do things, and I hope this may help to unleash creativity, rather than be seen as laying out any kind of Apex dogma that must be followed for fear of wearing the scarlet &#8216;no software&#8217; mark on your breast.</p>
<h2>#1: How hard should you work to have your triggers be absolutely minimal?</h2>
<p>I&#8217;ve written a bunch of Apex code and also gotten to maintain Apex code written by others. I think writing software for maintainability should be one of the top goals of all coders. I think the most maintainable way to write Apex triggers is to have as little logic in them as possible. If you are trying to figure out how some code works, or doesn&#8217;t work, it&#8217;s a lot easier to know that the trigger can safely be ignored because it&#8217;s only job is to call the class methods that get things done.</p>
<p>But how hard should we try to do that? Should we make sure our trigger has no logic in it at all? If so, it could look something like this:</p>
<pre class="brush: java">
trigger MyTrigger on MyObject__c (before insert, before update, after insert, after update) {
    MyObjectClass triggerSet = new MyObjectClass(Trigger.new, Trigger.old, Trigger.isBefore, Trigger.Context);
    triggerSet.process();
}
</pre>
<p>This signature would only have to change if we decide to have this trigger fire in different contexts, like UNDELETE. Of course, it&#8217;s not possible now, because there is no Trigger.Context to pass the enum value of the DML context. But, if <a href="http://gokubi.com/archives/two-interesting-ways-to-architect-apex-triggers#comment-189233">Jon gets his way</a> and this enum value is created, we have minimized the trigger to 2 lines of code.</p>
<p>But I think there is an efficiency hit. We&#8217;re going to instantiate the MyObjectClass no matter what the trigger set includes. If we only want to process records when a certain value changes, wouldn&#8217;t it be more efficient to move some logic to the trigger, and only instantiate the object if some of the records in the trigger set need to be processed?</p>
<p>Or is it a negligible difference we shouldn&#8217;t worry about?</p>
<h2>#2: When should we use static methods vs. object-oriented design?</h2>
<p>The trigger above is object-oriented design where an object is instantiated and variables and methods exist for that instance of the object. But the trigger could be written this way too:</p>
<pre class="brush: java">
trigger MyTrigger on MyObject__c (before insert, before update, after insert, after update) {
    boolean success = MyObjectClass.invoke(Trigger.new, Trigger.old, Trigger.isBefore, Trigger.Context);
}
</pre>
<p>So which is better? That&#8217;s something I&#8217;ve never been clear on&#8211;George made some great comments on my previous post along these lines.</p>
<p>The static method approach seems to make sense when your methods are straight-forward and you aren&#8217;t trying to maintain context across a number of actions. I like static methods for &#8220;utility&#8221; type functions:</p>
<p>utilities.getRecordTypeName(Id recordTypeId);</p>
<p>utilities.submitMyObjectForApproval(List<MyObject__c> my Objects);</p>
<p>I personally like the object-oriented approach when invoking a trigger. I think it makes sense to instantiate the object that is going to handle the trigger set, and then kick that off with various methods based on the context and timing of the invocation. It seems to me that writing the code to collect all the data from the trigger is best written once, in the constructor. Here&#8217;s some pseudocode for a such a class:</p>
<pre class="brush: java">
public class MyObjectClass {
     public MyObjectClass()
     {
     }

     public boolean triggerIsBefore;

     public enum context {Insert, Update, Insert, Upsert}

     public context contextPassedFromTrigger;

     public List&lt;MyObject__c]]&gt; triggerOldSet = new List&lt;MyObject__c]]&gt;();

     public List&lt;MyObject__c]]&gt; triggerNewSet = new List&lt;MyObject__c]]&gt;();    

     public MyObjectClass(MyObject__c[] myObjects, MyObject__c[] myOldObjects, boolean isBefore, context triggerContext)
     {
          triggerIsBefore = isBefore;
          contextPassedFromTrigger = triggerContext;

          triggerOldSet = myOldObjects;
          triggerNewSet = myObjects;
     }

     public process()
     }
          // BEFORE INSERT
          if (contextPassedFromTrigger==context.Insert&amp;&amp;isBefore)
          {
               someBeforeInsertMethod()
          }

     {

}
</pre>
<p>The main difference between static and object-oriented functionality is that you can have multiple independent instances of an object, but not of a static variable. So, if you wanted to deal with 4 different opportunities at once, and maintain data or variables for each and then do some processing, object-oriented is probably the way to go.</p>
<p>Each trigger invocation is it&#8217;s own universe. scope-wise, so you don&#8217;t have to worry about static invocations conflicting across trigger invocations.</p>
<h2>#3: What should go in a static Utils class?</h2>
<p>I like object oriented design, and I always compliment that with static classes for &#8220;utility&#8221; type methods and variables. I think each module of functionality you write should have it&#8217;s own utility class that services the other classes you&#8217;ve got in that module. I gave the example of the getRecordTypeName() method. Also, all your references to Custom Labels and other strings can be placed in this Utils class, and then they can be accessed statically from your other methods.</p>
<h2>#4: What are the limits of class proliferation?</h2>
<p>This is a tough one. Let&#8217;s say I&#8217;ve got some complex functionality. It wouldn&#8217;t be at all out of the realm of possibility to have the following:</p>
<p>MyProcess.trigger &#8211; my trigger to handle DMLs<br />
MyProcessClass &#8211; my main class for handling the trigger<br />
MyProcessUtils &#8211; my utils class supporting all this functionality<br />
MyProcessException &#8211; a class to extend the exception class for this functionality<br />
MyProcessTest &#8211; tests supporting all this code<br />
Other classes for functions that should be instantiatable on their own<br />
VisualForce controllers for any necessary UI</p>
<p>With complex functionality it can get to be a lot of files. So how is this balanced with maintainability? Aren&#8217;t more files and more dependencies harder for a maintainer to track down?</p>
<p>It is true that the more classes you&#8217;ve got, the harder it will be for someone to find everything and get their head around it. Naming conventions are key to finding related functionality. Everything I write that is related to this process will be started with &#8216;MyProcess&#8217;. Things can get confusing where processes meet and overlap&#8211;there isn&#8217;t anything we can do about that other than document things well with process maps and other tools.</p>
<p>I think that while there may be a lot of classes in this architecture, and findability my suffer, changability can be enhanced. By <a href="http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)">encapsulating</a> key functions in their own classes or in well-written methods in existing classes, changes can be more easily made. One thing I&#8217;ve learned about writing code is to &#8216;encapsulate that which is likely to change.&#8217; In the short-term that may seem like a lot of infrastructure for relatively simple code, but when it needs to change it may be a lot easier.</p>
<p>So my main takeaways from this foray into thinking about Apex architecture are:</p>
<ol>
<li>Move most of your logic out of Apex Triggers and into Apex classes. Don&#8217;t stress out if your Triggers have some logic in them, but the less the better in most cases</li>
<li>Decide where you fit on the spectrum between everything static and everything object oriented, and then be consistent. Maintainability will suffer if you&#8217;re changing up all the time for similar functions</li>
<li>Use a static utilities class, and be mindful about what goes in there</li>
<li>Don&#8217;t stress out about class proliferation as long as your doing it to encapsulate that which may change later, and aren&#8217;t forgetting about making things finadable</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/apex-architecture/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/apex-architecture</feedburner:origLink></item>
		<item>
		<title>Two interesting ways to architect Apex triggers</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/aktLZ_3DHVM/two-interesting-ways-to-architect-apex-triggers</link>
		<comments>http://gokubi.com/archives/two-interesting-ways-to-architect-apex-triggers#comments</comments>
		<pubDate>Fri, 04 Sep 2009 22:36:50 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=906</guid>
		<description><![CDATA[I&#8217;ve been writing Apex triggers for a while, and recently I ran across two ways to architect triggers that are different from how I used to do things. Both methods have one main benefit&#8211;they push all your logic to your classes, and allow the trigger to do just one job&#8211;invoke code on data change.
Here&#8217;s a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been writing Apex triggers for a while, and recently I ran across two ways to architect triggers that are different from how I used to do things. Both methods have one main benefit&#8211;they push all your logic to your classes, and allow the trigger to do just one job&#8211;invoke code on data change.</p>
<p>Here&#8217;s a trigger architected the first way:</p>
<pre class="brush: java">
trigger MyTrigger on MyObject__c (before insert, before update, after insert, after update) {

    if(trigger.isBefore){
        if(trigger.isInsert){
            MyObjectInsertBefore myInsertBefore = new MyObjectInsertBefore(Trigger.new);
        }
        if(trigger.isUpdate){
            MyObjectUpdateBefore myUpdateBefore = new MyObjectUpdateBefore(Trigger.old,Trigger.new);
        }
    }

    if(trigger.isAfter){
        if(trigger.isInsert){
            MyObjectInsertAfter myInsertAfter = new MyObjectInsertAfter(Trigger.new);
        }
        if(Trigger.isUpdate){
        	MyObjectUpdateAfter myUpdateAfter = new MyObjectUpdateAfter(Trigger.old,Trigger.new);
        }
    }
}
</pre>
<p>As you can see from the trigger, all that we&#8217;re doing is invoking the correct class based on the starting criteria&#8211;are we an insert or an update, and are we before or after? We&#8217;ve got a separate class for each of the four cases.</p>
<p>Here&#8217;s what two of those classes might look like:</p>
<pre class="brush: java">
public class MyObjectInsertBefore {

	//create your variables and data structures

    //constructor
    public MyObjectInsertBefore(){

    }

    //constructor accepting a list of myObjects
    public MyObjectInsertBefore(MyObject__c[] myObjects){
        //call whatever methods you need to get the job done
        someMethod(myObjects);
        .
        .
        .
    }
}
</pre>
<pre class="brush: java">
public class MyObjectUpdateBefore {

	//create your variables and data structures

    //constructor
    public MyObjectUpdateBefore(){

    }

    //constructor accepting a list of myObjects
    public MyObjectUpdateBefore(MyObject__c[] myOldObjects,MyObject__c[] myNewObjects){
        //call whatever methods you need to get the job done
        someMethod(myOldObjects,myNewObjects);
        .
        .
        .
    }
}
</pre>
<p>Key to making this efficient is to have shared methods in a MyObjectUtil class, so that similar operations can be reused across your classes.</p>
<p>Here&#8217;s a trigger invoked the second way:</p>
<pre class="brush: java">
trigger MyTrigger on MyObject__c (before insert, before update, after insert, after update) {

	public enum triggerAction {beforeInsert, beforeUpdate, afterInsert, afterUpdate}

    if(Trigger.isInsert &amp;&amp; Trigger.isBefore){
        MyObjectClass process = new MyObjectClass(Trigger.new, Trigger.old, triggerAction.beforeInsert);
    }
    if( Trigger.isAfter &amp;&amp; Trigger.isInsert ){
        MyObjectClass process = new MyObjectClass(Trigger.new, Trigger.old, triggerAction.afterInsert);
    }
    if(Trigger.isUpdate &amp;&amp; Trigger.isBefore){
        MyObjectClass process = new MyObjectClass(Trigger.new, Trigger.old, triggerAction.beforeUpdate);
    }
    if( Trigger.isAfter &amp;&amp; Trigger.isUpdate ){
        MyObjectClass process = new MyObjectClass(Trigger.new, Trigger.old, triggerAction.afterUpdate);
    }
}
</pre>
<p>This trigger sends the old and new sets over to a class and passes the way that this was invoked via an enum value (look up enum in the Apex docs if you haven&#8217;t used them&#8211;I had to). There is only one class, and then the class sorts out what should happen based on the data:</p>
<pre class="brush: java">
public class MyObjectClass {

	public MyObjectClass()
	{
	}

	public enum triggeredAction {beforeInsert, beforeUpdate, afterInsert, afterUpdate}

	public MyObjectClass(MyObject__c[] myObjects, MyObject__c[] myOldObjects, triggeredAction ta)
	{	

		// BEFORE INSERT
		if (ta==triggeredAction.beforeInsert)
		{
			someBeforeInsertMethod()
		}

		// BEFORE UPDATE
		if (ta==triggeredAction.beforeUpdate)
		{
			someBeforeUpdateMethod();
		}

		// AFTER INSERT
		if (ta==triggeredAction.afterInsert)
		{
			someAfterInsertMethod()
		}

		// AFTER UPDATE
		if (ta==triggeredAction.afterUpdate)
		{
			someAfterUpdateMethod();
		}

	}
}
</pre>
<p>You can see that you&#8217;re basically accomplishing the same thing&#8211;getting the class to invoke the right methods based on the invocation, but that we&#8217;re doing it in two different ways. In the first example, we&#8217;ve got a proliferation of classes, and each class is very simple. In the second example, we&#8217;ve got one class that is more complex as it has to handle many types of invocation.</p>
<p>I ran across the second example in the spring and really liked it. Then I ran across the first example last month and now it&#8217;s my favorite. I&#8217;m going to try to write new triggers that way and see how they go.</p>
<p>Thanks to Matt and Mike for architecting your code in these really interesting ways! I hope you, like me, love seeing how other people do things&#8211;it can really improve the way you code so very quickly. </p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/two-interesting-ways-to-architect-apex-triggers/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/two-interesting-ways-to-architect-apex-triggers</feedburner:origLink></item>
		<item>
		<title>Netflix Culture: how to be creative, powerful, and big</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/OQPi-kFaeTc/netflix-culture-how-to-be-creative-powerful-and-big</link>
		<comments>http://gokubi.com/archives/netflix-culture-how-to-be-creative-powerful-and-big#comments</comments>
		<pubDate>Wed, 05 Aug 2009 16:00:19 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=902</guid>
		<description><![CDATA[I was blown away when I read through this internal slide deck from Netflix. This is the blueprint for a creative culture that values employee effectiveness, freedom, and results. It&#8217;s a plan for growth that can avoid the institutionalization and ossification that comes with risk-aversion. As I read this, I realized this is as close [...]]]></description>
			<content:encoded><![CDATA[<p>I was blown away when I read through this internal slide deck from Netflix. This is the blueprint for a creative culture that values employee effectiveness, freedom, and results. It&#8217;s a plan for growth that can avoid the institutionalization and ossification that comes with risk-aversion. As I read this, I realized this is as close a description of the culture in which I want to work as I&#8217;ve ever seen. I am exceedingly impressed with Netflix for doing this kind of thinking and staying true to it. Bravo.</p>
<div style="width:425px;text-align:left" id="__ss_1798664"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/reed2001/culture-1798664" title="Culture">Culture</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=culture9-090801103430-phpapp02&#038;stripped_title=culture-1798664" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=culture9-090801103430-phpapp02&#038;stripped_title=culture-1798664" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/reed2001">reed2001</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/netflix-culture-how-to-be-creative-powerful-and-big/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/netflix-culture-how-to-be-creative-powerful-and-big</feedburner:origLink></item>
		<item>
		<title>Using Sites to easily publish data out of Salesforce</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/pwLLxY2nD5k/using-sites-to-easily-publish-data-out-of-salesforce</link>
		<comments>http://gokubi.com/archives/using-sites-to-easily-publish-data-out-of-salesforce#comments</comments>
		<pubDate>Wed, 24 Jun 2009 17:45:13 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=868</guid>
		<description><![CDATA[I want to show you a quick and easy way to take live data from Salesforce.com and post it on your website using Salesforce Sites. You can see lots of hard-core examples of how to use sites. Those are cool, absolutely no doubt. People are building amazing things.
There also are opportunities for very targeted uses [...]]]></description>
			<content:encoded><![CDATA[<p>I want to show you a quick and easy way to take live data from Salesforce.com and post it on your website using Salesforce Sites. You can see lots of <a href="http://developer.force.com/sitesgallery">hard-core examples</a> of how to use sites. Those are cool, absolutely no doubt. People are building amazing things.</p>
<p>There also are opportunities for very targeted uses of Sites. With these micro-sites, the investment-to-value ratio can be really high. Here&#8217;s an example of one such use case.</p>
<h3>The Use Case</h3>
<p>A nonprofit wants to have a page on it&#8217;s website acknowledging all sponsors who supported events in 2007. They want a simple list of organizations, leaving out any who have asked not to be thanked publicly.</p>
<h3>The Data</h3>
<p>Sponsorships are tracked as Opportunities connected to the relevant Account. Here&#8217;s the Opportunity related list from the relevant Account:</p>
<p><img src="http://gokubi.com/images/donors_opp.png" alt="screenshot" class="centered"/></p>
<p>I have created a rollup summary field on the Account to sum up all Opportunities from 2007:</p>
<p><img src="http://gokubi.com/images/donor_rollup.png" alt="screenshot" class="centered"/></p>
<p>And I&#8217;ve created a checkbox to flag Accounts that want to stay anonymous. You can see both fields on the account detail page:</p>
<p><img src="http://gokubi.com/images/donors_account-1.png" alt="screenshot" class="centered"/></p>
<h3>The Display</h3>
<p>I want to show a simple list of donors that gave in 2007 and aren&#8217;t anonymous. To do this, I need to create a VisualForce page with a simple Apex controller so I can grab the right data, and then display it correctly</p>
<p>Here&#8217;s the Apex controller where I&#8217;m grabbing the data that I want. You can see from my SOQL statement that I&#8217;m only getting Accounts where the rollup field is greater than zero and the anonymous field isn&#8217;t checked. I&#8217;ve named it donorListing:</p>
<pre class="brush: java">
public with sharing class donorListing {
	List&lt;Account&gt; accounts;
	public List&lt;Account&gt; getAccounts(){
		accounts = [select name from account WHERE X2007_Giving_Total__c &gt; 0 AND Anonymous_Sponsor__C = false ORDER BY Name];
		return accounts;
	}
}
</pre>
<p>Here&#8217;s the VF Page where I display the data. I point to the Apex I created via the controller attribute of the page. I also turn off the Header, so that I don&#8217;t see all the Salesforce navigation elements. Then I just list out the sponsors.</p>
<pre class="brush: html">
&lt;apex:page controller=&quot;donorListing&quot; showHeader=&quot;false&quot;&gt;
	&lt;apex:dataList value=&quot;{!accounts}&quot; var=&quot;account&quot; id=&quot;theList&quot;&gt;
		&lt;apex:outputText value=&quot;{!account.name}&quot;/&gt;
	&lt;/apex:dataList&gt;
&lt;/apex:page&gt;
</pre>
<p>And here is what the VF page looks like in my browser when I&#8217;m logged in to Salesforce.com:</p>
<p><img src="http://gokubi.com/images/donor_page.png" alt="screenshot" class="centered"/></p>
<p>OK, looks great. But I want it visible to people not logged into Salesforce. To do that, I need to create a Salesforce Site.</p>
<h3>The Site</h3>
<p>You can create a Salesforce site at Setup | Develop | Sites. Create a site, and give it a name. It will show you the URL for this site. That&#8217;s the URL people can hit from anywhere on the web to see your VisualForce pages.</p>
<p>You associate VisualForce pages with a Site on the Site detail page. You&#8217;ll see here my donorlist page is a part of this site:</p>
<p><img src="http://gokubi.com/images/donor_pages.png" alt="screenshot" class="centered"/></p>
<p>Next, I want to make this page visible to the public&#8211;I don&#8217;t need people to login to see it. That&#8217;s done by modifying the public access settings:</p>
<p><img src="http://gokubi.com/images/donor_site_detail.png" alt="screenshot" class="centered"/></p>
<p>Make sure your pages <del datetime="2009-06-24T19:08:11+00:00">and classes</del>(classes used by VisualForce pages are added automatically) are associated with the site:</p>
<p><img src="http://gokubi.com/images/donor_guest_access.png" alt="screenshot" class="centered"/></p>
<p>OK, now we&#8217;re ready to hit the page at it&#8217;s external location. For this example, the URL is:</p>
<p><a href="http://smsdev-developer-edition.na6.force.com/sms/donorlisting">http://smsdev-developer-edition.na6.force.com/sms/donorlisting</a></p>
<h3>The end product</h3>
<p>Now that we can see the page publicly, we can embed it anywhere on the web using something called IFRAME. It&#8217;s a part of the HTML that runs the web, and has been around for a long time. Here&#8217;s the code for embedding this page in my website:</p>
<pre class="brush: html">
&lt;iframe src=&quot;http://smsdev-developer-edition.na6.force.com/sms/donorlisting&quot; width=&quot;100%&quot; height=&quot;150&quot; frameborder=0&gt;
</pre>
<p>The nonprofit can now paste that IFRAME code into it&#8217;s website content management system. I&#8217;ve done just that in this post&#8211;you can see the sites page embedded right here:</p>
<p><iframe src="http://smsdev-developer-edition.na6.force.com/sms/donorlisting" width="100%" height="150" frameborder=0><br />
</iframe></p>
<p>When you hit this page, you&#8217;ll see the live data. If I get new sponsors or I flag sponsors as anonymous, they&#8217;ll appear or disappear accordingly. Just manage your data through your normal process and the public acknowledgement just happens.</p>
<p>Heck, you could even put workflow on the Account that automatically sends an email to the Account when they make this list. That email could contain a link to the acknowledgement page. That&#8217;s a pretty nice thank you experience for the sponsor, I think.</p>
<h2>The challenge</h2>
<p>This is a very simple example meant to get you thinking about what&#8217;s possible. What do you want to do with Sites? Come up with your own use cases and implement them in a developer org. As you can see, there isn&#8217;t much code involved to get it working. Show your boss what&#8217;s possible with an example. Tell them how long it took you to get data shared on your organization&#8217;s website. Modify the data in Salesforce.com and then hit refresh in the browser. Astound and amaze! And then build Sites into your business process for quick and easy publishing of your Salesforce.com data.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/using-sites-to-easily-publish-data-out-of-salesforce/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/using-sites-to-easily-publish-data-out-of-salesforce</feedburner:origLink></item>
		<item>
		<title>Drip campaigns with Summer ‘09</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/72PIh4NaOrA/drip-campaigns-with-summer-09</link>
		<comments>http://gokubi.com/archives/drip-campaigns-with-summer-09#comments</comments>
		<pubDate>Wed, 17 Jun 2009 16:45:37 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=864</guid>
		<description><![CDATA[John Kucera is posting an awesome series about doing complex engagement work with Campaigns and the new enhancements in Summer &#8216;09. This is killer stuff John!
]]></description>
			<content:encoded><![CDATA[<p>John Kucera is posting an awesome series about doing <a href="http://blogs.salesforce.com/marketing/2009/06/automated-multiwave-campaigns-in-salesforce-marketing-summer-09-part-2.html">complex engagement work with Campaigns and the new enhancements in Summer &#8216;09</a>. This is killer stuff John!</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/drip-campaigns-with-summer-09/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/drip-campaigns-with-summer-09</feedburner:origLink></item>
		<item>
		<title>Nonprofit Starter Pack is now an Open Source Project</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/Gok9iXuvWWc/nonprofit-starter-pack-is-now-an-open-source-project</link>
		<comments>http://gokubi.com/archives/nonprofit-starter-pack-is-now-an-open-source-project#comments</comments>
		<pubDate>Mon, 15 Jun 2009 15:10:09 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=861</guid>
		<description><![CDATA[I just posted over on the Salesforce.com Nonprofit blog that we are releasing the Nonprofit Starter Pack as an open source project!
The post tells the full story and provides links to all the relevant resources: project site, issue tracker, code base, and documentation.
Come join us in this effort!
]]></description>
			<content:encoded><![CDATA[<p>I just posted over on the Salesforce.com Nonprofit blog that <a href="http://blogs.salesforce.com/nonprofit/2009/06/open-s.html">we are releasing the Nonprofit Starter Pack as an open source project</a>!</p>
<p>The post tells the full story and provides links to all the relevant resources: <a href="http://code.google.com/p/npsp/">project site</a>, <a href="http://code.google.com/p/npsp/issues/list">issue tracker</a>, <a href="http://code.google.com/p/npsp/source/browse/">code base</a>, and <a href="http://wiki.developerforce.com/index.php/Nonprofit_Starter_Pack">documentation</a>.</p>
<p>Come join us in this effort!</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/nonprofit-starter-pack-is-now-an-open-source-project/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/nonprofit-starter-pack-is-now-an-open-source-project</feedburner:origLink></item>
		<item>
		<title>Digging Into Inherited Code</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/CFGo51k3MKU/digging-into-inherited-code</link>
		<comments>http://gokubi.com/archives/digging-into-inherited-code#comments</comments>
		<pubDate>Mon, 01 Jun 2009 22:42:59 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=854</guid>
		<description><![CDATA[I inherited a code base when I started at the Salesforce.com Foundation. If you&#8217;re a Salesforce.com Admin or consultant, you may find yourself in the same position. What&#8217;s the best way to come up to speed on a new code base? It can be a daunting process.
In one of my last projects at ONE/Northwest I [...]]]></description>
			<content:encoded><![CDATA[<p>I inherited a code base when I started at the Salesforce.com Foundation. If you&#8217;re a Salesforce.com Admin or consultant, you may find yourself in the same position. What&#8217;s the best way to come up to speed on a new code base? It can be a daunting process.</p>
<p>In one of my last projects at ONE/Northwest I started working on a very complex Salesforce implementation someone else built. There wasn&#8217;t any Apex or VisualForce, but the config was really gnarly. Getting my head around the record types, custom objects, and fields was a real bear. I saw some things I don&#8217;t like to talk about&#8230;</p>
<p>With my new job, the config isn&#8217;t particularly complex. There are relatively few objects and no record types. But there is Apex and some VisualForce. Here are the steps I&#8217;m undergoing to get my head around the code:</p>
<p><strong>Put out any fires</strong></p>
<ul>
<li>Make sure the code is under source control.</li>
<li>Deal with any mission critical bugs, but remember you don&#8217;t really know what&#8217;s going on yet.</li>
<li>Set up an issue tracker and get it ready to collect issues you discover in this process</li>
</ul>
<p><strong>Schedule a demo so that you have a short-term goal</strong></p>
<ul>
<li>I was asked to demo the NPSP for the Boston user group only a week after I started. I said yes because I knew it would force me to get comfortable with it.</li>
<li>If you can&#8217;t demo to real users, demo to someone who will ask tough questions and understands the business process well enough to make you sweat.</li>
<li>If you can, build out your own demo org rather than using one that&#8217;s already built. You&#8217;re code may not be packaged, so this might not work for you.</li>
</ul>
<p><strong>Understand the application flow</strong></p>
<ul>
<li>Read any user documentation you&#8217;ve got</li>
<li>Talk to anyone available who was involved in the design so you can try to understand the intent of the application flow.</li>
<li>Click through the UI to see what happens
<ul>
<li>Take the time to document the application flow in a flowcharting program, like Visio or Omnigraffle&#8211;writing it down forces you to fill in the blanks</li>
</ul>
</li>
<li>Discover all the button overrides
<ul>
<li>Find out where cool stuff is happening with Triggers and where it&#8217;s happening with a VisualForce page</li>
</ul>
</li>
</ul>
<p><strong>Dig into the code and see how that application flow is accomplished</strong></p>
<ul>
<li>Look at existing Workflow to see what processes are handled there</li>
<li>Look at the code
<ul>
<li>Start with triggers, this is where the action happens</li>
<li>Take notes &#8211; update the application flow diagram with markers where Triggers fire</li>
<li>Look at the existing tests for nods toward key behaviors</li>
</ul>
</li>
<li>Go back to workflow
<ul>
<li>If your workflow is complex, write detailed tests to prove the functionality</li>
<li>Just because you can write Workflow by pointing and clicking doesn&#8217;t mean it will be easy to understand the behavior without testing</li>
</ul>
</li>
</ul>
<p><strong>Document what you now know by heart</strong></p>
<ul>
<li>Someone will be inheriting this code from you, so think about what you just went through and be kind.</li>
</ul>
<p>For me it feel like probing in the dark with little parts of the picture slowly becoming illuminated. Follow your instincts about what to dig into, but don&#8217;t go to ground in any one area until you have a shallow understanding of the whole thing. Probe into the darkest corners until there is enough light to know how scary it is, and then move on, shooting for the whole room to reach dusk, and eventually, bright light.</p>
<p>I think it&#8217;s fun, this process of discovery. It&#8217;s much more fun when the code you are inheriting is well-designed, like this code is. When it&#8217;s rationally designed, your life is much easier. You&#8217;ll still have lots of work to do, but it won&#8217;t feel like a giant tangle of yarn for very long.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/digging-into-inherited-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/digging-into-inherited-code</feedburner:origLink></item>
		<item>
		<title>Ramping up</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/4d6gfefmuxI/ramping-up</link>
		<comments>http://gokubi.com/archives/ramping-up#comments</comments>
		<pubDate>Fri, 22 May 2009 20:32:51 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=849</guid>
		<description><![CDATA[I just finished a week down in San Francisco, trying to come up to speed on the Salesforce.com Foundation and what I&#8217;ll be doing here. I had four main goals in coming down:

Meet my new co-workers face to face (the ones in HQ, anyway)
Get a better read on the culture of the Foundation&#8211;that&#8217;s hard to [...]]]></description>
			<content:encoded><![CDATA[<p>I just finished a week down in San Francisco, trying to come up to speed on the Salesforce.com Foundation and what I&#8217;ll be doing here. I had four main goals in coming down:</p>
<ul>
<li>Meet my new co-workers face to face (the ones in HQ, anyway)</li>
<li>Get a better read on the culture of the Foundation&#8211;that&#8217;s hard to do remotely</li>
<li>Spend time with Steve Wright working through what my main areas of focus should be</li>
<li>Connect with folks at Salesforce.com the company and learn how best to leverage their knowledge and systems in serving nonprofits</li>
</ul>
<p>I felt like my trip was a great success in all of those categories. I have great co-workers and it was so nice to spend time with them in meetings, at happy hour, etc. It was really cool to connect with some great people at the Company. The Foundation is a small nonprofit, but we&#8217;re connected to this massive software company.</p>
<p>I&#8217;ll be at the Foundation filling all sorts of roles that have whole teams at the Company&#8211;product management, sales engineering, internal process work, partner support. I&#8217;ve already gotten great tips and suggestions from Company employees about how best to get this work done. It&#8217;s really exciting.</p>
<p>So I&#8217;m feeling good, if overwhelmed. Starting a new job is always a lot to absorb. It&#8217;s a bit daunting hearing how the Product Management team gathers requirements, interfaces with developers, and tracks progress, and then realize that I&#8217;ll be doing all that by myself! Setting expectations of what we can get done will be key&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/ramping-up/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/ramping-up</feedburner:origLink></item>
		<item>
		<title>I am moving on from ONE/Northwest</title>
		<link>http://feedproxy.google.com/~r/gokubi/~3/UXY5lqy_SIQ/i-am-moving-on-from-onenorthwest</link>
		<comments>http://gokubi.com/archives/i-am-moving-on-from-onenorthwest#comments</comments>
		<pubDate>Wed, 15 Apr 2009 17:09:52 +0000</pubDate>
		<dc:creator>Steve</dc:creator>
				<category><![CDATA[CRM]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://gokubi.com/?p=844</guid>
		<description><![CDATA[It is with a mix of sadness and excitement that I announce my departure from ONE/Northwest to join the Salesforce Foundation. I&#8217;ve had a great 4 years building out the CRM consulting program, and the time was right for me to take a very exciting opportunity. I get to work at the source of the [...]]]></description>
			<content:encoded><![CDATA[<p>It is with a mix of sadness and excitement that I announce my departure from <a href="http://onenw.org">ONE/Northwest</a> to join the <a href="http://salesforcefoundation.org">Salesforce Foundation</a>. I&#8217;ve had a great 4 years building out the CRM consulting program, and the time was right for me to take a very exciting opportunity. I get to work at the source of the force behind the growth of the Salesforce platform in the nonprofit sector.</p>
<p>It&#8217;s difficult for me to leave ONE\Northwest. It is hands-down the best environment in which I&#8217;ve worked. It&#8217;s an incredibly talented team that thrives on respect and shared purpose. It was a tough decision to leave such a great team, and such great friends.</p>
<p>I started at ONE/Northwest in 2005 with the goal of starting a CRM consulting program. The team is now 5 staff, cranking on 10 simultaneous projects. We have a very sophisticated set of consulting practices, some pretty slick code, and a <a href="http://www.onenw.org/portfolio/database">track record of happy customers</a>. I&#8217;m very pleased with where we&#8217;ve gotten to in the last 4 years. What a ride it&#8217;s been!</p>
<p>While I have been the most visible face of the ONE/Northwest CRM team, each member of the team is a strong performer in his/her own right. Most of our best code and practices were suggested and developed by my colleagues, not by me, and I thank them for the great years working together. I&#8217;ve learned a lot from these folks, and I&#8217;ll miss working with them every day. It has been a real joy.</p>
<p>I&#8217;m very excited to join the team at the Salesforce Foundation I&#8217;ve come to know over the last 4 years. If you&#8217;ve worked with them you know they are great people. I look forward to being able to work toward the mission of getting Salesforce into the hands of nonprofits around the world. That&#8217;s a reach I can&#8217;t really fathom quite yet.</p>
<p>I am the first overtly technical hire at the Foundation, so I&#8217;m sure they&#8217;ve got lots for me to do. There are a number of areas where technical expertise will come in handy&#8211;the Nonprofit Starter Pack, working with the <a href="http://groups.google.com/group/npsf">NPSF community</a>, working with partners who are looking to create nonprofit solutions, partnering with large NGOs who are pushing the platform to new places, and the list goes on. I can&#8217;t wait to get started!</p>
<p>To those of you who know me in person or on the web, I don&#8217;t suspect you&#8217;ll notice too much different. I&#8217;m staying in Seattle and I&#8217;ll be remaining active in all the fora I currently frequent. I look forward to seeing you there in my new role!</p>
<p>Thanks to everyone at ONE/Northwest who helped make the last 4 years a great experience, and to the folks at the Foundation who have given me this new opportunity! I&#8217;ll keep you all posted along the way.</p>
]]></content:encoded>
			<wfw:commentRss>http://gokubi.com/archives/i-am-moving-on-from-onenorthwest/feed</wfw:commentRss>
		<slash:comments>59</slash:comments>
		<feedburner:origLink>http://gokubi.com/archives/i-am-moving-on-from-onenorthwest</feedburner:origLink></item>
	</channel>
</rss>
