forge

Connect the Dots: Developing Products

Let me start in a rather odd way.  I don’t have all the answers about developing products.  Frankly, I probably have only the slightest sliver of understanding of what is needed to develop products.  Having been stuck at the phase where I have completed products that I haven’t been able to release to the market – I’m focused on thinking about the problem and trying to find solutions.

My son is at the stage where he likes dot-to-dot puzzles.  He connects each dot not knowing what the end result will be.  He carefully connects one dot and then the next and then the next and doesn’t take the time to step back until he’s completed.

It strikes me that this isn’t much different than the process of creating a product.  I realize that there are lots of dots – most of which need to be connected – to make the complete picture – the product.  I’m sure (because I’ve not managed to make my product sales what I would call successful) that I’m missing a few, but I wanted to share what I’ve figured out thus far.

Developing the Product

Perhaps the easiest part of the process for me is developing the solution.  I’ve spent the last 15 years of my professional career creating solutions for clients.  Writing the program and understanding how to make it reusable isn’t something I really struggle with any more.  If you look in my source control system you’ll find dozens of testing harnesses and tools designed to perform reusable operations – and that doesn’t even include the things that I’ve packaged to be products.

Documentation

Also in the easy category for me is writing.  I’ve spent the last several years writing articles and books.  Writing isn’t something I dread (very often).  It’s just another thing to do.  Once I have working and tested code, it’s off to write some documentation that will help people understand how to use it.  The trick here, if there is one, is writing the documentation to spark the user’s creativity on how the tool can solve problems other than the one it was intended to solve.

Installation Package

Ouch.  This one hurts.  Every experience I have had making anything but the most trivial installation package has ended in disaster.  However, a good solution to the need to get the software installed is an essential part of the overall solution.  I bias strongly towards programs that require little or no installation – but that’s honestly because my experience with installers has been so bad.

Licensing

Somewhere in this process you have to integrate a licensing engine.  As much as I hate to say it software piracy runs rampant in the world.  People don’t quite understand the intellectual property which is wrapped up in the software and the need to compensate the author for that intellectual property.  I like to ignore this but I’m painfully reminded by my friends and colleagues that I cannot.

Store Front

I learned that in the publishing world there’s not a lot that matters other than shelf space.  Good authors, good books, and good ideas have died a slow death because they were never provided the shelf space in the book stores that they required.  A product is the same way.  The product needs a home.  It needs a place for people to come to find it.  It needs a place that describes it and explains how it works, what the values are, and the cost.  Without this place no one will know the product exists – or they won’t be able to find it if they do know it exists – and you won’t get any sales.

By the way, this is the point where I’m stuck.  I, in part, build commercial grade eCommerce solutions for large organizations.  My threshold for the system to deliver my products is really, really high.  That means that some of the traditional options for Micro-ISVs just don’t just make me feel comfortable presenting my solutions there.  I haven’t yet invested the time to get my platform up and running personally… so I am stuck.

Commerce Enabled

Once you have a store front and people have a way to know that they want to buy the solution, it’s important that you have a way to take their money.  Honestly, this part has become much simpler over the last few years.  With credit card processors owned by large banks now supporting web service calls to authorize transactions, and the services offered by PayPal, there are real options for conducting commerce over the web.  Credit Cards are not quite universal; however, they are pervasive enough that they are an effective payment mechanism.  The real challenges here are managing fraud and dealing with “returns.”

Support

Supporting a product once it’s in the market is critical to long term success, but how does a small software vendor cope with the time that supporting customers requires?  Support is one part about preparing – so you can track defects, customer satisfaction, etc., but more than anything else it is about creating and preserving timely communications with the users trying to use the product.  Not an easy task for most organizations.  Perhaps this is why so many software companies struggle with support today.

Marketing

Build it and they will come doesn’t work.  You need to let people know that your product exists.  For most folks this means buying advertising.  It is money out of your pocket to get people to look at, think about, and perhaps even evaluate your product.  The folks that I know who are successful at selling products all talk about how their advertising relates to product sales.  They don’t see a one-to-one relationship – but they definitely see an impact on sales.  So your product (and perhaps your company) needs some sort of a marketing strategy.

v.NEXT

The final part of developing a product is developing a lifecycle for the product.  What will the next version of the product do?  When will you make the investment in the next version of the product?  Planning for the next revision is as much a part of the total solution as any other part of the process.

Conclusion

I don’t know what all of these dots make when connected.  I’m pretty sure it’s not a bunny rabbit, but beyond that I haven’t a clue what to expect.  When you’re looking at putting together a product ask yourself if you can connect all of these dots – or not.

1 reply
  1. labhesh
    labhesh says:

    i have following error what is the solution for thsi.
    sorry for large copypaste
    expected WinWF Internal Error, terminating workflow Id# 53490952-4485-42d3-b68c-08404cb0f8b4
    02/24/2010 19:13:36.76 w3wp.exe (0x0E50) 0x0C98 Windows SharePoint Services Workflow Infrastructure 98d4 Unexpected System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. —> System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.SharePoint.Workflow.SPWorkflowUtility.StrUrlDispFormTask(SPWeb web, SPList list, String strID) at Microsoft.SharePoint.Workflow.WorkflowTaskUpdateMailUtil.StrInstructionEditTask(Boolean fDownLevel, Boolean fRequestAccess) at Microsoft.SharePoint.Workflow.WorkflowTaskUpdateMailUtil.StrTaskInstructionsCommon(Boolean fDownLevel) at Microsoft.SharePoint.Workflow.WorkflowTaskUpdateMailUtil.StrRow3(Boolean fOffsite) at Microsoft.SharePoint.Workflow.WorkflowTaskUpdateMailUtil.GenerateEmailBody() at Microsoft.SharePoint.Workflow.WorkflowTaskUpdateMailUtil.GenerateEmailBod…
    02/24/2010 19:13:36.76* w3wp.exe (0x0E50) 0x0C98 Windows SharePoint Services Workflow Infrastructure 98d4 Unexpected …yForNewTask(SPListItem item, SPUser author) at Microsoft.SharePoint.Workflow.SPWinOETaskService.UpdateTaskInternal(Guid taskId, SPWorkflowTaskProperties properties, Boolean fSetWorkflowFinalize, Boolean fCreating, HybridDictionary specialPermissions) at Microsoft.SharePoint.Workflow.SPWinOETaskService.CreateTaskWithContentTypeInternal(Guid taskId, SPWorkflowTaskProperties properties, Boolean useDefaultContentType, SPContentTypeId ctid, HybridDictionary specialPermissions) at Microsoft.SharePoint.Workflow.SPWinOETaskService.CreateTaskWithContentType(Guid taskId, SPWorkflowTaskProperties properties, String taskContentTypeId, HybridDictionary specialPermissions) — End of inner exception stack trace — at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object…
    02/24/2010 19:13:36.76* w3wp.exe (0x0E50) 0x0C98 Windows SharePoint Services Workflow Infrastructure 98d4 Unexpected …[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at Syst…
    02/24/2010 19:13:36.76* w3wp.exe (0x0E50) 0x0C98 Windows SharePoint Services Workflow Infrastructure 98d4 Unexpected …em.Workflow.Activities.CallExternalMethodActivity.Execute(ActivityExecutionContext executionContext) at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext) at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(Activity activity, ActivityExecutionContext executionContext) at System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime) at System.Workflow.Runtime.Scheduler.Run()
    02/24/2010 19:13:37.45 w3wp.exe (0x0E50) 0x09C0 Windows SharePoint Services General 0 Unexpected ERROR: request not found in the TrackedRequests. We might be creating and closing webs on different threads. ThreadId = 6, Free call stack = at Microsoft.SharePoint.SPRequestManager.Release(SPRequest request) at Microsoft.SharePoint.SPSite.Close() at Microsoft.SharePoint.SPSite.Dispose() at Microsoft.SharePoint.Workflow.SPWorkflowAutostartEventReceiver.AutoStartWorkflow(SPItemEventProperties properties, Boolean bCreate, Boolean bChange, AssocType atyp) at Microsoft.SharePoint.Workflow.SPWorkflowAutostartEventReceiver.AutoStartWorkflow(SPItemEventProperties properties, Boolean bCreate, Boolean bChange) at Microsoft.SharePoint.Workflow.SPWorkflowAutostartEventReceiver.ItemAdded(SPItemEventProperties properties) at Microsoft.SharePoint.SPEventManager.RunItemEventRec…
    02/24/2010 19:13:37.45* w3wp.exe (0x0E50) 0x09C0 Windows SharePoint Services General 0 Unexpected …eiver(SPItemEventReceiver receiver, SPItemEventProperties properties, SPEventContext context, String receiverData) at Microsoft.SharePoint.SPEventManager.RunItemEventReceiverHelper(Object receiver, Object properties, SPEventContext context, String receiverData) at Microsoft.SharePoint.SPEventManager.<>c__DisplayClass8`1.b__0() at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state) at Microsoft.SharePoint.SPSecurity.RunAsUser(SPUserToken userToken, Boolean bResetContext, WaitCallback code, Object param) at Microsoft.SharePoint.SPSecurity.RunAsUser(SPUserToken userToken, CodeToRunElevated code) at Microsoft.SharePoint.SPEventManager.InvokeEventReceivers[ReceiverType](SPUserToken userToken, RunEventReceiver runEventReceiver, Obj…
    02/24/2010 19:13:37.45* w3wp.exe (0x0E50) 0x09C0 Windows SharePoint Services General 0 Unexpected …ect receivers, Object properties, Boolean checkCancel) at Microsoft.SharePoint.SPEventManager.InvokeEventReceivers[ReceiverType](Byte[] userTokenBytes, RunEventReceiver runEventReceiver, Object receivers, Object properties, Boolean checkCancel) at Microsoft.SharePoint.SPEventManager.HandleEventCallback[ReceiverType,PropertiesType](Object callbackData) at Microsoft.SharePoint.Utilities.SPThreadPool.WaitCallbackWrapper(Object state) at System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state) at System.Threading.ExecutionContext.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.ExecutionContext.RunInternal(Execu…
    02/24/2010 19:13:37.45* w3wp.exe (0x0E50) 0x09C0 Windows SharePoint Services General 0 Unexpected …tionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack) at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state) , Allocation call stack (if present) null
    02/24/2010 19:1

Comments are closed.