Steve Jobs and Promoting Insanely Great Software Quality

“You can’t just ask customers what they want and then try to give that to them. By the time you get it built, they’ll want something new.” (Steve Jobs, 1989)

“You‘ve got to start with the customer experience and work back toward the technology – not the other way around.” (Steve Jobs, 1997)

“[If you’re lucky, when you grow up you’ll discover one simple fact: Everything around you that you call life was made up by people that were no smarter than you and you can change it, you can influence it, you can build your own things that other people can use.” (Steve Jobs, 1994)


Few people in recent history have made the impression Steve Jobs did. He was a thunderous, hypersonic force in a world of (relatively speaking) slow-motion quiet, leaving behind a vibrant legacy of astonishing dimensions and changing not only the way people communicate, but the very way people think about communicating in the world of information interchange.

The first two quotes highlight the difficulty of transforming a process/idea into mass-marketable software. Further, they show that for the past twenty years or so, the process of building software has not changed appreciably. One can search the Internet, scanning for the one definitive article that outlines the perfect strategy and methodology for software development, marketing and deployment. With the millions of people working diligently the past twenty-plus years in the tech world to codify any and all matters, it seems that would be doable. OK. Go ahead and look. I’ll wait. And, if the past is any indicator of future performance, twenty years from now I’ll still be waiting and you’ll be howling, foaming-at-the-mouth mad, surrounded by seriously alarming piles of used, fermenting pizza boxes and empty soda bottles. And the only one who will still love you is your Mom. Maybe. Software development can be likened to being chased by a rabid Rottweiler while trying to catch an over-amped cat jonesing for tuna when you have one leg in a cast and the cat isn’t inclined to be caught and the Rottweiler seriously wants to turn your good leg into its new, favorite chew toy, you know? Continue reading

7 Principles for Creating a Successful Digital Workplace

ImageSource has partnered with dozens of customers of every size and across all industries to fine-tune our unique ECM-Ecosystem offering. This powerful engagement helps organizations to clearly understand where they are underserved by their current content management technologies, what their optimal content management objectives should be, and lays out a series of steps to get customers on track with a meaningful content management strategy. The five steps to the ImageSource ECM-Ecosystem are:

1. Understand the business problem/challenge
2. Identify gaps and opportunities for improvement
3. Provide a business vision
4. Define technology requirements
5. Define the business value

I recently ran across a great article by Elizabeth Marsh wherein she lays out 7 key principles in creating a successful “digital workplace” strategy. These same principles are woven throughout the ImageSource ECM-Ecosystem but Elizabeth did such a good job describing them that I thought I would share them here. So later this week, grab a slab of leftover turkey and pile of stuffing, cozy up to a warm fire, and share these insightful tidbits with family and friends – they’ll be glad you did!

Build Digital Workplaces Fit for the Future
By Elizabeth Marsh  |  Nov 25, 2014

Randy Weakly
VP of Software Development
ImageSource, Inc.

How to run SQL code against an Oracle databse

Context: ILINX Capture, ILINX Release and Oracle IPM 11g

Problem: A customer wanted the ability to run some custom SQL code against an Oracle database after a doc has been released to Oracle IPM 11g.

Solution: Place the built-in DatabaseLookup IXM after Release and use the return value from Release to call Oracle. Below is a screen shot of the workflow:


Phong Hoang
Development Manager
ImageSource, Inc.

Defining Batch Profiles in ILINX Capture

In ILINX Capture, the most basic unit is a batch profile. A batch profile is a container that includes batch fields, one or more document types and a workflow. It is unique, self-contained and completely independent from each other. In general, you would want to create a batch profile for each unique workflow process in the system.

If you have multiple doc types that mostly follow the same process, you should think about creating a single batch profile to hold all the doc types. With this setup, you can then use permissions to give users access to their specific doc types. Furthermore, within the workflow designer you want to break your workflow logic into common processes, shared by all doc types and specific doc type sub-flows. If you find that you need to create too many sub-flows, re-evaluate the relationship between a batch and doc types and see if you can fix the problem.

The goal is to create unique workflow processes so that system maintenance is easy; and one way to deal with that is to avoid duplicating batch profiles that are performing the same tasks.

Phong Hoang
Development Manager
ImageSource, Inc.

Web Content Management System Checklist

Web Content Management (WCM) is the practice of creating, controlling and publishing web content using specialized tools.  The specialized tools are collectively know as a Web Content Management System or WCMS.   Most entities (business, municipalities, hospitals, etc) these days have some form of web presence, which is typically a dedicated website.  Most people think of a website as a collection of static web pages.   This was the case five or six years ago, but today most websites have functional requirements that go well beyond a simple What You See Is What You Get (WYSIWYG) website.   I have worked with several customers who still use technology that is focused on simply creating and publishing web pages.  However, the customer’s needs always go well beyond simply pushing HTML pages onto the web. This post is intended to provide a checklist of features you should keep in mind, before deciding on a WCM solution.

Continue reading

IPM Process Scripts Tips and Tricks

Process workflow scripts, the very mentioning can make a developer shudder.  However, scripts are the unsung heroes of the Process workflow and have been an integral part of ImageSource’s Customer Solutions.  While the Oracle IPM Process workflow now supports using .NET dlls as script events, that was not always the case.  VBScript code was originally used to handle workflow events and that option for such is still around.  There are a few reasons why you might still need to code a process script in VBScript, either because it is an upgrade of legacy code, the system is a pre 7.7 version of IPM or if the required custom functionality is so small that writing a script is much quicker than a full blown .NET Module.

Below are some helpful tips and tricks if you find yourself writing a VBScript workflow event.

Write Logs That Make Sense
While flagging parts of the code as A, B and C might make sense to you while developing the script, trying to remember what they meant years down the line (like for an enhancement or bug fix) will be a futile exercise.  Better yet, try explaining cryptic log messages to the Systems Engineer or another developer.  After they’ve finished giving you annoyed looks, it might be time to make the logging messages understandable to another human being.  When writing logs, output something useful like current field values, sql parameters or the result of conditional operations.  Just make sure not to log sensitive data and also provide an option to turn logging off if it is not needed.

Error Handling Is Key
By default, IPM scripts use the following option: On Error Resume Next.  This means that if an error occurs in the code, it will continue operating until the error is handled or the code finishes.  Normally, error handling code is put after code like SQL calls, file system operations and usage of the IPM SDK. However, sometimes developers can get lazy and forget to put error handling in the code where it would be useful, only to have it handled later on with an error log message that does not make sense.  For example take a look at the following code:

oCon.Open "File Name=C:\process\connection.udl"
oRS.Open "select * from DATA_TABLE_1 where ID=" & iId, oCon, Readonly, Readonly
If Not oRS.EOF Then
    iValue = oRS("VALUE_1")
End If

oCon.Execute  "insert into DATA_TABLE_2 (VALUE_1) values (" & iValue & ")"
If Eval("Err.Number <> 0") Then
     objExecutionContext.ErrorDescription = objExecutionContext.ErrorDescription & _
          "Example Script: Error inserting data into DATA_TABLE_2 - " & Err.Description & vbCrLf
     Set oCon = Nothing
     Exit Sub
End If

If an error were to occur at either the open connection or select data steps, the error log would still report that there was an error inserting data into DATA_TABLE_2.  A better solution would have error handling checks after the open connection and sql select lines of code.

Remember To Set Objects
Working in the .NET environment, you tend to forget some of the nuances of writing unmanaged code.  One of these is remembering to set objects when they are assigned in VBScript.  This can be the source of much unneeded frustration when the code continually errors out without a very helpful reason why.  Always keep in mind that when not assigning a primitive variable, always use Set.

Clean Up After Yourself
Another thing to keep in mind when writing scripts is to clean up your variables when you are done using them.  This is especially important for preventing memory leaks in the script, which might have to run 24/7.  Always remember to set your objects to nothing, to close all sql connections and recordsets, and even clear string values when they are not needed.

Be Careful With String Concatenation
VBScript string concatenation has an N-Squared cost.  Repeatedly concatenating a string within a loop is a very expensive operation.  While okay for small strings, it is not recommended for building out long strings, like from database information.  The suggested alternative to the built in concatenation is to preallocate memory for the concatenation operation.  A more detailed solution can be found at Microsoft’s support site.

Hopefully this advice will help you in the world of IPM Process script writing.

Richard Franzen
ImageSource, Inc.

Share on Twitter