Gary Joyhttp://garyjoy.postach.io/feed.xml2021-01-02T11:19:28.484000ZWerkzeugTaking Stock with Sownatahttps://garyjoy.postach.io/post/taking-stock-with-sownata2021-01-02T11:19:28.484000Z2021-01-01T10:08:55ZGary Joy<div><br /></div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/85e4f5a8-479b-cb4a-a1eb-9ed2da9c6622/ca6f857a-5a54-187d-c27f-3d717efaaa6c.png" style="--en-naturalWidth:2559; --en-naturalHeight:1440;"/><div>I made the visualisation above to post on Reddit (<a href="https://www.reddit.com/r/dataisbeautiful/comments/klotv0/my_2020_in_data_oc/?utm_source=share&utm_medium=web2x&context=3" rev="en_rl_none">r/dataisbeautiful</a>). It didn't do as well as I hoped. I know it's not everyone's cup of tea but I'm gong to assume that posting on Reddit is a bit like dropping 2p coins into those coin pusher arcade machines..</div>
<div>2020 has been an eventful year. I'm grateful for stable work and for all the wonderful people in my life (in particular my amazing wife).</div>
<div><b>So how did I do in 2020...</b></div>
<div>I think my <i>Watch</i> events (the top row) were OK but fall short of where I would like to be. I watch way too much YouTube and the channels I watch the most are not particularly meaningful or educational. I binge-watched a few (very good) Netflix shows this year and I also rewatched some great shows. I need to ration my viewing a little more.</div>
<div>My <i>Exercise</i> and <i>Consume</i> events (middle row) are a little better. It took me a while to find a new normal when it comes to exercising but I can probably run and cycle further and faster than at any other point in my life right now . My diet has been consistently healthy, if a little boring. I need to make good use of the various cookbooks on my bookshelf and I also need (not shown in the charts above but available in the data) to double down on the last 5% of meals to achieve an animal-free diet. </div>
<div>My digital <i>Interact</i> events (i.e. social media) are pretty similar to last year. I recently watched the Social Dilemna and I'm aiming to reduce these numbers (along with my YouTube numbers) in 2021. My physical <i>Interact</i> events have been pretty good. Spending more time at home has given me more free time and in any given week there are usually a few opportunities to catch up with people outdoors etc.</div>
<div><br /></div>
<div><b><span style="font-size: 12px;">Notes</span></b></div><ul><li><div><span style="font-size: 12px;">Data for the <i>Watch</i> events is imported from files that you can download from YouTube and Netflix. </span></div></li><li><div><span style="font-size: 12px;">Data for the <i>Exercise</i> events is imported directly from HealthKit and Strava.</span></div></li><li><div><span style="font-size: 12px;">Data for the <i>Consume</i> events was manually entered (usually by Siri).</span></div></li><li><div><span style="font-size: 12px;">Data for the digital <i>Interact</i> events is imported from files that you can download from Facebook and Instagram (the Twitter data is imported directly).</span></div></li><li><div><span style="font-size: 12px;">Data for the physical <i>Interact</i> events was manually entered (usually by Siri).</span></div></li></ul>Your data is for life, not just for Christmas..https://garyjoy.postach.io/post/your-data-is-for-life-not-just-for-christmas2020-12-24T10:06:56.363000Z2020-12-23T12:10:15ZGary Joy<div>The year end is, even in the strangest of years, a natural time to reflect on the year past and contemplate the year ahead. Many common platforms take the opportunity to provide a consolidated view of the last 12 months.</div>
<div>Here's an example from Strava:</div><table width="380px" style="width:380px;border-collapse:collapse;"><colgroup><col style="width: 190px;" /><col style="width: 190px;" /></colgroup><tbody><tr><td style="border-color:#ccc;border-width:1px;border-style:solid;padding:10px;"><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/fc492ea3-723c-21dd-e101-68a5bc6a3508/7559a2bd-561d-9dd8-93c8-d894a7ff4934.png" style="--en-naturalWidth:828; --en-naturalHeight:1792;"/></td><td style="border-color:#ccc;border-width:1px;border-style:solid;padding:10px;"><div><br /></div></td></tr></tbody></table><div>Users must find these visualisations interesting, otherwise they wouldn't make them, but I wonder how many users will look at them and want more. It's interesting that my top sport is running but I'd like to know what that really means and if it varies throughout the year.</div>
<div>Here's a journey you can take around the same data in Sownata in around the same time it takes to watch the two minute presentation from Strava:</div><table width="190px" style="width:190px;border-collapse:collapse;"><colgroup><col style="width: 190px;" /></colgroup><tbody><tr><td style="border-color:#ccc;border-width:1px;border-style:solid;padding:10px;"><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/fc492ea3-723c-21dd-e101-68a5bc6a3508/4ac9896e-3ce2-5c3d-993b-8585060b709b.png" style="--en-naturalWidth:1792; --en-naturalHeight:828;"/></td></tr></tbody></table><div>This is a good place to start; how many Strava workouts did I do in 2020? <i>43.</i></div><table width="190px" style="width:190px;border-collapse:collapse;"><colgroup><col style="width: 190px;" /></colgroup><tbody><tr><td style="border-color:#ccc;border-width:1px;border-style:solid;padding:10px;"><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/fc492ea3-723c-21dd-e101-68a5bc6a3508/3e4e2a71-d47f-2082-573d-a0987c46cf7c.png" style="--en-naturalWidth:1792; --en-naturalHeight:828;"/></td></tr></tbody></table><div>Tapping on "..." and selecting group by "Activity" yields some insights into my different activity types. <i>22 runs, 14 bike rides and 7 walks.</i></div><table width="190px" style="width:190px;border-collapse:collapse;"><colgroup><col style="width: 190px;" /></colgroup><tbody><tr><td style="border-color:#ccc;border-width:1px;border-style:solid;padding:10px;"><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/fc492ea3-723c-21dd-e101-68a5bc6a3508/1987eddd-f573-add9-b471-2fa912f5540f.png" style="--en-naturalWidth:1792; --en-naturalHeight:828;"/></td></tr></tbody></table><div>A zoom gesture on the chart switches to a monthly breakdown. This reveals that I only started recording in Strava in August and that I cycle less often in the winter months.</div><table width="190px" style="width:190px;border-collapse:collapse;"><colgroup><col style="width: 190px;" /></colgroup><tbody><tr><td style="border-color:#ccc;border-width:1px;border-style:solid;padding:10px;"><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/fc492ea3-723c-21dd-e101-68a5bc6a3508/bbd8372a-78d7-e0f6-9294-409d86808a9b.png" style="--en-naturalWidth:1792; --en-naturalHeight:828;"/></td></tr><tr><td style="border-color:#ccc;border-width:1px;border-style:solid;padding:10px;"><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/fc492ea3-723c-21dd-e101-68a5bc6a3508/6a26a0ac-5e02-b463-097f-a8d9334117ef.png" style="--en-naturalWidth:1792; --en-naturalHeight:828;"/></td></tr></tbody></table><div>Tapping on "events" you can select either "minutes" or "km". Cycling is my dominant activity for both measures. My runs are getting longer in December.</div>
<div>For more information (and an instructional YouTube video) take a look at: <a href="https://sownata.com/user-manual/import/strava">https://sownata.com/user-manual/import/strava</a>/</div>
<div>Sownata understands data from various popular platforms (Facebook, Instagram, Netflix, Twitter, YouTube, Strava and HealthKit). It's not something you'll use every day but it's there, all year round, whenever you want it.</div>
<div><br /></div>
<div><i>Just to be clear; I love Strava. The application is great, the community is overwhelmingly positive and the API is comprehensive and easy to work with.</i></div>
Sownatahttps://garyjoy.postach.io/post/sownata2020-04-18T19:51:30.044000Z2020-01-29T16:00:00ZGary Joy<div>I haven’t blogged in a while. I have still been doing cool things at work but my free time has been taken up with something else..</div>
<div><br /></div>
<div>I made in iOS application. It’s called Sownata.</div>
<div><br /></div>
<div><a href="https://itunes.apple.com/us/app/sownata/id1459041043?ls=1&mt=8"><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5ce41986-d7be-4955-9c04-911000fadf69/c93be32c-5dbf-4946-8857-919b26fb931e.png" /><br /></a></div>
<div><br /></div>
<div>It’s been around for a while but I haven’t really promoted it until now because I wanted to be sure that it was good enough. There is still room for improvement (and I have lots of great ideas of how it can grow) but I think now is the time to find out if it’s worth the time and effort that’s gone into it.</div>
<div><br /></div>
<div>There’s a website (<a href="http://www.sownata.com/">www.sownata.com</a>) with information for the broader audience but if you’re reading this blog then I think I can give a better overview than <span style="font-style: italic;">Sownata is a structured digital diary that keeps track of the little things so that you can see the bigger picture</span>.</div>
<div><br /></div>
<div>I loved my first job. It was a great company (www.metapraxis.com) full of great people. I will always be grateful for my time there as a graduate. When I think about my work-related strengths it is often easy to draw a line back to what I learnt as a young developer at Metapraxis.</div>
<div><br /></div>
<div>I think that, even with all the advances in technology over the last 20 years, there is still a lot of scope to leverage the effective visualisation of data to make the world a better place, particularly outside the world of business.</div>
<div><br /></div>
<div>One of the things I learned back then was to ask tangible questions that could be answered with tangible data to yield real insights. These insights often yield new questions (and so on) until you are thinking on a whole other level. In my opinion, that’s when you start winning at stuff…</div>
<div><br /></div>
<div>That’s what Sownata is for, <span style="font-style: italic;">it’s BI but for people</span>. It’s giving you access to a perspective that some people (including you) might not want you to see but that can be used to help reach your goals.</div>
<div><br /></div>
<div>The biggest challenge has been to make the cost of data collection as low as possible. It is easier in 2020 to get access to your data than it was in 2010 but for many popular services it’s still not particularly easy.</div>
<div><br /></div>
<div>Sownata as it stands today can understand data from Google (YouTube), Facebook and Netflix (although you have to do some of the work). I made it as easy as I could to add data manually (including support for Siri). It is my hope that I have done enough to prove the concept.</div>
<div><br /></div>
<div>If you have an Apple device, please give it a go. Any and all feedback will be gratefully received.</div>
<div><br /></div>
<div>If you like it, please share it with anyone in your network that you think will be interested. I have a feeling that I am about to discover that making the application is the easy part…</div>
<div><br /></div>
<div>If you’re still reading this.. <span style="font-weight: bold;">Thank You!</span></div>
Something for your Post-Development, Pre-Production Checklisthttps://garyjoy.postach.io/post/something-for-your-post-development-pre-production-checklist2018-07-17T09:59:45.784000Z2018-07-17T09:50:00ZGary Joy<div>A few years ago, a very clever guy wrote a blog about IBM BPM Caching Using WebSphere DynaCache (<a href="http://blog.edwardborner.com/2014/07/ibm-bpm-caching-using-websphere.html">http://blog.edwardborner.com/2014/07/ibm-bpm-caching-using-websphere.html</a>). I’ve always assumed that this blog entry was the seed that grew into the caching properties of Ajax Services in IBM BPM.</div>
<div><br /></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/7d527506-73d3-4834-ae64-b74b9fc1b9ce/4e61ea92-2451-4abc-a011-613f632eda55.png" /><br /></div>
<div><br /></div>
<div>In more recent versions (2017.06+) of IBM BPM this capability has been expanded to both General System Services and Integration Services. In my view, this feature is under-rated and under-used (or at least ineffectively used) in the majority of IBM BPM implementations.</div>
<div><br /></div>
<div>It is a real quick win; spend a little time thinking about the data in your Services, tick a few boxes and enter some numbers and you're done. You’ve just saved every user a second or two every time they run a Task or halved the number of integration calls to lookup some metadata.</div>
<div><br /></div>
<div>Review every Service in your process application and make a conscious decision about caching. Hopefully your artefact naming convention makes it easy to pick the best candidates. Use @tags (and Smart Folders) to track Services with caching enabled.</div>
<div><br /></div>
How to do Automated Testing for IBM BPM (Part III) - Process Flow Testinghttps://garyjoy.postach.io/post/next-how-to-do-automated-testing-for-ibm-bpm-part-iii2018-04-09T16:34:01.588000Z2018-03-30T13:33:00ZGary Joy<div>Let’s talk about Process Flow Testing..</div>
<div><br /></div>
<div>A general rule of thumb for automated testing is that tests should be as explicit as possible. Implicit process flow testing (e.g. using Selenium) is not a good idea (primarily because of performance and stability reasons).</div>
<div><br /></div>
<div>Your process flow tests should be simple atomic checks that all follow this basic pattern…</div>
<div><br /></div>
<div><i>- Given a process instance in a given state</i></div>
<div><i>- When something happens</i></div>
<div><i>- Then the process instance is in a new state</i></div>
<div><br /></div>
<div>You should think of process flow testing as testing individual transitions in your business process, ensuring that they behave as you expect them to.</div>
<div><br /></div>
<div>Here's an example (using the process from here):</div>
<div><br /></div>
<div><i>Given an instance of the "Request Something" process at the "Review Request" step called "$testIdentifier"</i></div>
<div><i>When the "Review Request" task matching "$testIdentifier" is completed with decision “Approve" by a “Manager"</i></div>
<div><i>Then a “Provision Request" task matching "$testIdentifier" is ready for an “Operator"</i></div>
<div><br /></div>
<div>This looks (and is) pretty simple. The supporting glue code uses the REST API to do all the hard work. Let’s expand on the example…</div>
<div><br /></div>
<div><i>1. Given an instance of the "Request Something" process at the "Review Request" step called "$testIdentifier"</i></div>
<div><br /></div>
<div>There are a few ways that you can approach this one, the end result should be an instance in the desired state. One way to do it is as follows:</div>
<div>- Prepare the data (as JSON) using a loaded test fixture that is customised as necessary (e.g. do something with the $testIdentifier and make sure that the data is correct for the step).</div>
<div>- Start the process (with the data) by calling a Service via the REST API.</div>
<div>- Use the Move Token REST API to jump to the desired step.</div>
<div><br /></div>
<div>I have mentioned before that sometimes a little development is necessary to facilitate automated testing. This is a good example of this. My top level process contains something like this:</div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/29e19953-4cf7-468c-be40-b69694b6129a/03b6521e-3b6e-44a6-b8ee-bb132c4c32f7.png" /></div>
<div><br /></div>
<div>The post-script on the start event is just to create a log entry. The timer lasts for 10 minutes (in case something goes wrong I want the instance to end) but I expect the token to be moved before the timer fires.</div>
<div><br /></div>
<div>There are other approaches (I once used conditional activities throughout my process to support automated testing) but I think that moving the token is probably the best approach.</div>
<div><br /></div>
<div><i>2. When the "Review Request" task matching "$testIdentifier" is completed with decision “Approve" by a “Manager"</i></div>
<div><br /></div>
<div>This one’s pretty simple:</div>
<div>- Prepare the data (as JSON) using a loaded test fixture that is customised as necessary (e.g. inject the decision).</div>
<div>- Complete the task (with the data) via the REST API (link).</div>
<div><br /></div>
<div><i>3. Then a “Provision Request" task matching "$testIdentifier" is ready for an “Operator"</i></div>
<div><br /></div>
<div>This one’s equally straight-forward:</div>
<div>- Search for a task matching the $testIdentifier for the specified user/team using the REST API.</div>
<div><br /></div>
<div>I’m currently using this REST API for my searching. It’s deprecated though so I will have to change things soon…</div>
<div><br /></div>
<div>I haven’t included any Java code (please let me know if you need to know how to do any of this stuff in Java) but it’s all pretty simple. It’s important to make things robust so, for example, I have a function called waitForTaskToBeAvailable(…) that wraps my search for a task and then uses a fluent-wait pattern to keep checking (up to a specified time limit) for the expected task. One of the biggest challenges I faced in all of this work was creating glue code that is robust and reliable. It is worth the effort.</div>
<div><br /></div>
<div>I found the following libraries extremely helpful (they significantly reduced the amount of code I had to write):</div>
<div><br /></div>
<div>Rest Assured (<a href="http://rest-assured.io">http://rest-assured.io</a>)</div>
<div>JSON Path (<a href="https://github.com/json-path/JsonPath">https://github.com/json-path/JsonPath</a>)</div>
<div><br /></div>
<div><br /></div>
<div>Tracking Test Coverage</div>
<div><br /></div>
<div>People always ask about test coverage, it’s not easy in IBM BPM. Here’s what I have so far...</div>
<div><br /></div>
<div>I use the following Tags…</div>
<div><br /></div>
<div>@testable</div>
<div>@tested</div>
<div><br /></div>
<div>…and the following Smart Folders…</div>
<div><br /></div>
<div>Tested</div>
<div>Needs Tests (e.g. @testable && ! @tested)</div>
<div><br /></div>
<div>I encourage developers to clear the @tested Tag when they are working on a component and ensure that the tests are updated before it is put back. It would be awesome if there was a way to clear the @tested Tag whenever a @testable Tag component is modified.</div>
<div><br /></div>
<div>This approach applies equally to all components (not just Processes) in IBM BPM. I just thought now was a good time to mention it.</div>
How to do Automated Testing for IBM BPM (Part VI) - Status Reportinghttps://garyjoy.postach.io/post/how-to-do-automated-testing-for-ibm-bpm-part-vi-status-reporting2018-03-09T15:10:37.298000Z2018-03-09T15:05:00ZGary Joy<div>Don’t Panic! You haven’t missed anything. I’ve just decided to “go Star Wars"…</div>
<div><br /></div>
<div>I think there is something of a snowball effect when it comes to continuous integration. The more you do, the more cool stuff becomes available to you. I guess it’s a bit like owning an Apple product.</div>
<div><br /></div>
<div>I expect that most readers are familiar with some degree of instability across environments/integrations and it recently crossed my mind that I should “make it a tangible thing" instead of just complaining about it.</div>
<div><br /></div>
<div>I would like to share a simple (once you’ve done the hard work of creating an automated test framework and implementing a robust log analysis platform) approach to Status Reporting.</div>
<div><br /></div>
<div>Here is a feature file describing some Endpoint Tests…</div>
<div><div> </div></div><div><script src="https://gist.github.com/de0a0fa65f74b48eafb6e58f73ddcab5.js"></script> </div>
<div><br /></div>
<div>These tests are scheduled to run in Jenkins (other tools are available) every ten minutes.</div>
<div><br /></div>
<div>Here’s a Splunk (other tools are available) dashboard from the resultant data…</div>
<div><br /></div>
<div><div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/f7b0fc4f-c7be-48e4-87dc-b62260e9af2b/714dc307-16f0-46d0-b5ff-a18a44027596.png" /><br /></div></div><div><br /></div>
<div>So the cost of my nice new report (beyond my original “spend") was the time taken to i. create a feature file, ii. schedule a job and iii. craft a search. I think that’s pretty good “value for money".</div>
<div><br /></div>
<div><br /></div>
<div>I learnt a new Splunk command along the way. It’s called xyseries (<a href="https://docs.splunk.com/Documentation/Splunk/7.0.2/SearchReference/Xyseries">link</a>). You should check it out.</div>
<div><br /></div>
Sharing the Shared Modelhttps://garyjoy.postach.io/post/sharing-the-shared-model2018-02-13T10:35:56.471000Z2018-02-13T10:30:29ZGary Joy<div>Back when 8.x was 6.x and the developers worked in a garage somewhere, all you had to do was right-click to get hold of an image for a process diagram. Nowadays the images are used here and there in the platform but it's neither obvious nor easy to get hold of an image you can use elsewhere.</div>
<div><br /></div>
<div>I strongly encourage you to make your process diagrams part of the shared model in BPM. They should be an integral part of communication with stakeholders. This means it's likely that you'll want some raw images to play with. You can get these from the REST API...</div>
<div><br /></div>
<div>To start with you need some information so find an instance (for the process you want) and query it:</div>
<div><br /></div>
<div><a href="https://www.ibm.com/support/knowledgecenter/SSFPJS_8.5.0/com.ibm.wbpm.ref.doc/rest/bpmrest/rest_bpm_wle_v1_process_instanceid_get.htm">https://www.ibm.com/support/knowledgecenter/SSFPJS_8.5.0/com.ibm.wbpm.ref.doc/rest/bpmrest/rest_bpm_wle_v1_process_instanceid_get.htm</a></div>
<div><span style="font-style: italic;">GET /rest/bpm/wle/v1/process/{instanceId}[?parts={string}]</span></div>
<div><span style="font-family: "Courier New";">e.g. https://myserver/rest/bpm/wle/v1/process/123?parts=all</span></div>
<div><br /></div>
<div>This will give you the Snapshot ID (starts with 2064), Branch ID (starts with 2063) and Project ID (starts with 2066).</div>
<div><br /></div>
<div>It should also give you a bunch of BPD IDs (that start with 25.). If you look inside the diagram section of the results you should be able to find the one that corresponds to the process/sub-process that you are interested in.</div>
<div><br /></div>
<div>Now you can ask for the diagram:</div>
<div><a href="https://www.ibm.com/support/knowledgecenter/SSFPJS_8.5.0/com.ibm.wbpm.ref.doc/rest/bpmrest/rest_bpm_wle_v1_visual_processmodel_bpdid_get.htm">https://www.ibm.com/support/knowledgecenter/SSFPJS_8.5.0/com.ibm.wbpm.ref.doc/rest/bpmrest/rest_bpm_wle_v1_visual_processmodel_bpdid_get.htm</a></div>
<div><span style="font-style: italic;">GET /rest/bpm/wle/v1/visual/processModel/{bpdId}[?snapshotId={string}][&branchId={string}][&projectId={string}][&image={boolean}]</span></div>
<div><span style="font-family: "Courier New";">e.g. https://myserver/rest/bpm/wle/v1/visual/processModel/25.eb24dd09-1a08-4cf2-ac84-7c4b2134d1c5?snapshotId=2064.f5b027bb-604b-43c8-8bd9-ba5cf41e6cd8&branchId=2063.8f87387e-da1b-427c-aa51-88a993634213&projectId=2066.f0e78d4c-30b6-44aa-b5ce-60419df051cbaa&image=true</span></div>
<div><br /></div>
<div>This will give you a raw image that you can use wherever you want. </div>
<div><br /></div>
<div>Happy Sharing!</div>
How to do Automated Testing for IBM BPM (Part II) - Service Testinghttps://garyjoy.postach.io/post/how-to-do-automated-testing-for-ibm-bpm-part-ii-service-testing2018-01-29T15:02:36.984000Z2018-01-29T14:18:00ZGary Joy<div>Thanks to everyone that provided any kind of feedback on Part I. It is reassuring to know that automated testing is a focus for so many people. Please nudge IBM at any available opportunity to provide a clearer vision on, and better support for, automated testing.</div>
<div><br /></div>
<div><span style="font-weight: bold;">Service Testing</span></div>
<div><br /></div>
<div>Service Testing is essentially unit testing for IBM BPM. It’s by Developers and for Developers (whereas Process Flow Testing would be by Users for Developers).</div>
<div><br /></div>
<div>There are many ways to create, manage and execute unit tests in IBM BPM. In isolation, the approach I will outline here seems a little contrived but (in my view) it’s more than justified by the benefits of having all my automated tests (i.e. including the other types of automated test) defined, executed and reported on in a unified manner.</div>
<div><br /></div>
<div>So, looking back at the example from Part I, here’s a Service:</div>
<div><br /></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/ca0a154c-5c2e-475b-9086-f29bb6793777/9012fb0a-ea07-4407-b249-b28744107628.jpg" /><br /></div>
<div><br /></div>
<div>The interface looks something like this:</div>
<div><div><br /></div><table style="border-collapse: collapse; min-width: 100%;"><colgroup><col style="width: 219px;" /><col style="width: 218px;" /></colgroup><tbody><tr><td style="border: 1px solid rgb(219, 219, 219); width: 219px; padding: 8px;"><div><span style="font-weight: bold;">Input</span></div></td><td style="border: 1px solid rgb(219, 219, 219); width: 218px; padding: 8px;"><div><span style="font-weight: bold;">Output</span></div></td></tr><tr><td style="border: 1px solid rgb(219, 219, 219); width: 219px; padding: 8px;"><div>{</div>
<div> requestValue: ?,</div>
<div> requestCategory: ?,</div>
<div> requestor: ?</div>
<div>}</div></td><td style="border: 1px solid rgb(219, 219, 219); width: 218px; padding: 8px;"><div>{</div>
<div> approvalRequired: ?</div>
<div>}</div></td></tr></tbody></table><div>Here is a test:</div></div><div><br /></div>
<div><span style="font-family: "Courier New";">When I call “My Service" with “{requestValue: 10.00, requestCategory: A, requestor: User 1}" I get “{approvalRequired: false}"</span></div>
<div><br /></div>
<div>Here are a bunch of tests:</div>
<div><br /></div>
<div><span style="font-family: "Courier New";">When I call “My Service" with “{requestValue: 10.00, requestCategory: A, requestor: User 1}" I get “{approvalRequired: false}"</span></div>
<div><span style="font-family: "Courier New";">When I call “My Service" with “{requestValue: 100.00, requestCategory: A, requestor: User 1}" I get “{approvalRequired: true}"</span></div>
<div><span style="font-family: "Courier New";">When I call “My Service" with “{requestValue: 10.00, requestCategory: A, requestor: User 2}" I get “{approvalRequired: true}"</span></div>
<div><span style="font-family: "Courier New";">When I call “My Service" with “{requestValue: 100.00, requestCategory: A, requestor: User 3}" I get “{approvalRequired: false}"</span></div>
<div><br /></div>
<div>Finally, here is some glue code for the statement above:</div>
<div><br /></div>
<div><script src="https://gist.github.com/86be8ab9dedc723a9a5aa4f466c29b32.js"></script></div>
<div><br /></div>
<div>It’s very simple. For a given input, I expect a certain output. It might not really be the “done thing" to use JSON in Gherkin but, like I said before, these tests are by Developers and for Developers.</div>
<div><br /></div>
<div>Sometimes, Services are more stateful (and require a slightly different approach). I will talk about this in a future blog about Integration Testing.</div>
<div><br /></div>
<div>It’s important to build and design services with testability in mind. Try to avoid tightly coupling stateless atomic operations with more stateful ones e.g. don’t embed code to record the outcome of the decision service above directly into the decision service itself. You want to be able to test your decision logic without invoking the recording mechanism.</div>
<div><br /></div>
<div><span style="font-weight: bold;">Why Bother</span></div>
<div><br /></div>
<div>It’s an appealing line of thought to question the value is of creating these tests. Many of them can seem mundane to create and you might expect that they will never fail. You may be right that some will never fail but I personally promise you that, if you follow this path, it will not be long at all before an automated test helps you out; either by finding a bug early or by giving you the confidence to undertake some refactoring that you might have otherwise avoided.</div>
<div><br /></div>
<div>Developers are lazy (I say this as a Developer). Smarter developers realise that automated testing provides <a href="http://garyjoy.postach.io/post/delayed-gratification">delayed gratification</a>. </div>
<div><br /></div>
<div>My advice to Lead Developers is this…</div>
<div><br /></div>
<div><span style="font-style: italic;">You need to work hard to minimise the effort required to create and maintain automated tests. Rather than legislate the approach, make it the easier and better option. If you build it, they will come.</span></div>
<div><br /></div>
<div><span style="font-weight: bold;">Wouldn’t It Be Nice</span></div>
<div><br /></div>
<div>It should be super-cool if Watson could turn it’s attention to my IBM BPM process server and take some notes on the execution of services and the data flowing in and out. Then, after some thought, it would check out my feature file and update my tests to reflect it’s observations.</div>
<div><br /></div>
<div><br /></div>
<div><br /></div>
Why BPM (and Scrum)?https://garyjoy.postach.io/post/why-bpm-and-scrum2017-10-06T15:10:34.523000Z2017-10-06T15:06:22ZGary Joy<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/43faef80-9c37-42e7-ad7a-08ed36bd0f1d/ceb0d666-a0ce-4630-a81e-ed2ae931a77a.png" /></div>
<div>I created this today for work. I’m sure they will not mind if I share it with you. Constructive feedback is welcomed.</div>
How to do Automated Testing for IBM BPM (Part I)https://garyjoy.postach.io/post/how-to-do-automated-testing-for-ibm-bpm-part-i2017-09-02T09:51:18.900000Z2017-08-20T12:59:00ZGary Joy<div>After years of not being sure, I have recently decided that it is in fact possible to do (and I mean <span style="font-weight: bold;">really</span> do) automated testing for IBM BPM. I still haven’t seen it done properly but, I am working on it…</div>
<div><br/></div>
<div>It’s a big topic so it will span a few blogs (probably five) but this one will outline how (I think) you should do it.</div>
<div><br/></div>
<div><span style="font-weight: bold;">Imagine a simple Process Application</span></div>
<div><br/></div>
<div>1. Our process application has one process. It is called <span style="font-style: italic;">Request Something</span> and it allows <span style="font-style: italic;">Employees</span> to <span style="font-style: italic;">Request</span> (e.g. new hardware or software). Requests are <span style="font-style: italic;">Reviewed</span> by <span style="font-style: italic;">Managers</span> and <span style="font-style: italic;">Provisioned</span> by <span style="font-style: italic;">Operations</span>.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c53c012-e501-4e9a-aff3-6f3b5527c143/730d8dba-6754-4c5a-b291-283065d0f2c9.png" /><br/></div>
<div><br/></div>
<div>2. In the request activity, employees can select one or more items of hardware and provide a text justification for the request. In the review and provision activities the users can review the request, add comments and take actions.</div>
<div><br/></div>
<div>3. A list of hardware is retrieved via a Web Service. </div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c53c012-e501-4e9a-aff3-6f3b5527c143/9d4dc7fa-a76f-4d1c-a241-8f0dd1867f76.png" /><br/></div>
<div><br/></div>
<div>4. A Service is used to determine if it is necessary for a manager to approve a request. </div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c53c012-e501-4e9a-aff3-6f3b5527c143/7cd7bed6-5f1b-4358-a732-69594a149bd7.png" /><br/></div>
<div><br/></div>
<div><span style="font-weight: bold;">How to best achieve complete (automated) test coverage</span></div>
<div><br/></div>
<div>The good news is that there are a bunch of great tools and technologies for automated testing. The not-so-good news is that IBM BPM needs some persuasion to work with these tools and technologies.</div>
<div><br/></div>
<div>I will go into more detail in the subsequent blogs but, to make this work, you are going to need to:</div>
<div><br/></div><ul><li>make extensive use of the REST API</li><li>do implementation work (in IBM BPM) to support testing</li></ul><div><br/></div>
<div>I have tried (more than once) to do automated testing without these things and I found that the coverage, reliability and effort required were all unsatisfactory.</div>
<div><br/></div>
<div>So here is the “meat on the bones" for this introductory blog: you should be creating four types of test script to give you complete (and effective) test coverage:</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c53c012-e501-4e9a-aff3-6f3b5527c143/f8f0a97a-5555-435b-80d6-ce4dd4d66c22.png" /><br/></div>
<div><br/></div>
<div>1. Process Flow Testing</div>
<div>I will go into this in more detail in a future blog but in here you should be using the REST API to validate that your process diagrams are correct and that, for given data, they behave the way your expect them to. In my example above one test might be to check that a rejected request is not sent for provisioning.</div>
<div><br/></div>
<div>2. Activity / UI Testing</div>
<div><br/></div>
<div>I will go into this in more detail in a future blog but in here you should be checking all aspects of the user experience. The primary focus is on the activities (in isolation) and that the UI behaves the way that you expect it to. In my example above one test might be to check that the employee is not able to submit a request without selecting something to request.</div>
<div><br/></div>
<div>3. Integration Testing</div>
<div><br/></div>
<div>I will go into this in more detail in a future blog but in here you should be making sure that your integration services are working. It’s not your job to test the systems you are integrated with but, if you application makes assumptions about the data that is returned, you should check that those assumptions are correct. In my example above one test might be to check that a list of items to request is being returned by the external system.</div>
<div><br/></div>
<div>4. Service Testing</div>
<div><br/></div>
<div>I will go into this in more detail in a future blog but in here you should be executing input/output-style unit tests against the Services you have created in IBM BPM. In my example above one test might be to check that the automated approval logic works as expected for a number of different example inputs.</div>
<div><br/></div>
<div><span style="font-weight: bold;">What technologies am I using?</span></div>
<div><br/></div>
<div>I have tried my best to avoid mentioning technologies but I imagine that any reader taking inspiration from this post will want these details. Here is a list of tools and technologies (with some supporting comments) that I am currently using:</div>
<div><br/></div>
<div>Gherkin / Cucumber (people have mixed opinions about this one but I like it)</div>
<div>Java</div>
<div>Selenium (you don’t have any real alternative but use it sparingly and <span style="font-weight: bold;">only</span> for Activity / UI Testing)</div>
<div>REST Assured (this is my new favourite thing, it’s awesome)</div>
<div><br/></div>
<div><span style="font-weight: bold;">So, what about manual testing?</span></div>
<div><br/></div>
<div>There is a time and place for manual testing. In fact there are two:</div>
<div><br/></div>
<div>The first is for exploratory testing (where you get people with very specific character traits to mess around with you application and try to break it or make it do something weird).</div>
<div><br/></div>
<div>The second is for acceptance testing (where you allow <span style="font-weight: bold;">real</span> users to have a go in a non-production environment).</div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
Keyboard Shortcuts in IBM BPM Web Process Designerhttps://garyjoy.postach.io/post/keyboard-shortcuts-in-ibm-bpm-web-process-designer2017-06-14T13:40:01.418000Z2017-06-14T13:33:24ZGary Joy<div>I've been spending quite a bit of time in the Web Process Designer lately and the inevitable consequence is a push to use it as effectively as possible. </div>
<div style="text-align: start;">It has taken me a couple of months to un-learn the CTRL-SHIFT-O Eclipse shortcut (which, incidentally switches to the Inspector View in the Web Process Designer) when I want to open a new artifact. </div>
<div style="text-align: start;">As far as I can tell, the new way to achieve this is...</div>
<div style="text-align: start;"><ul><li>CTRL-SHIFT-L (switch focus to the library)<br/></li><li>Up/Down Arrow (focus on the artefact type that you're interested in)<br/></li><li>Enter (open the search)<br/></li><li>Type (e.g. "My Cool Coach View") (to search)<br/></li><li>Enter (to open)</li></ul></div>
<div style="text-align: start;">It's a couple of extra keyboard strokes, but it's still preferrable to reaching for the mouse.</div>
<div style="text-align: start;">All the keyboard shortcuts are listed here:</div>
<div style="text-align: start;"><a href="https://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/topics/rcf_hsaccessibility.html">https://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/topics/rcf_hsaccessibility.html</a></div>
<div>Add your most useful keyboard shortcut (for IBM BPM Web Process Designer) in the comments below...</div>
Fluent Wait - The Right Type of Lazyhttps://garyjoy.postach.io/post/fluent-wait-the-right-type-of-lazy2017-03-30T13:41:33.232000Z2017-03-29T17:50:11ZGary Joy<div>There are usually many ways to solve a problem.The mental workout of finding good solutions to problems is probably one of the things that keeps me happy at work. I want to share one such example…</div>
<div><br/></div>
<div>The problem is that our automated tests don’t behave consistently (for an unchanged target). The underlying issue is one of timing. The tests run at full speed and (sometimes) the application under test can’t keep up and assertions start to fail.</div>
<div><br/></div>
<div>It’s not unreasonable to reason that the automated tests aren’t realistic. Users don’t work at full speed. However, the next link in that particular chain of thought is that you can just pepper your code with statements like:</div>
<div><br/></div>
<div><span style="font-family: 'Courier New';">driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);</span><br/></div>
<div><br/></div>
<div>Don’t do this. I will think less of you.</div>
<div><br/></div>
<div>The main problem with this approach is that you are merely increasing your chances of success (rather than ensuring success), at the cost of both performance and complexity.</div>
<div><br/></div>
<div>There is a pattern called Fluent Wait (it’s used extensively behind the scenes in frameworks like Selenium) that provides a much better solution:</div>
<div><br/></div>
<div><font face="Courier New"><font style="font-family: 'Courier New';"> // Waiting 30 seconds for an element to be present on the page, checking</font></font></div>
<div><font style="font-family: 'Courier New';"> // for its presence once every 5 seconds.</font></div>
<div><font style="font-family: 'Courier New';"> Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)</font></div>
<div><font style="font-family: 'Courier New';"> .withTimeout(30, SECONDS)</font></div>
<div><font style="font-family: 'Courier New';"> .pollingEvery(5, SECONDS)</font></div>
<div><font style="font-family: 'Courier New';"> .ignoring(NoSuchElementException.class);</font></div>
<div><br/></div>
<div><font style="font-family: 'Courier New';"> WebElement foo = wait.until(new Function<WebDriver, WebElement>() {</font></div>
<div><font style="font-family: 'Courier New';"> public WebElement apply(WebDriver driver) {</font></div>
<div><font style="font-family: 'Courier New';"> return driver.findElement(By.id("foo"));</font></div>
<div><font style="font-family: 'Courier New';"> }</font></div>
<div><font style="font-family: 'Courier New';"> });</font><font face="Courier New"><br/></font></div>
<div><br/></div>
<div>No doubt many people would consider everything that I have said above to be obvious. I consider myself to be “the right type of lazy" (i.e. I want to make my life easier in the <i>long run</i>, even if it means extra work now) but there are still plenty of people in the workplace that are (in my view) “the wrong type of lazy" and they will ignorantly plaster over the cracks of life.</div>
<div><br/></div>
<div>If you’re interested, there is a much more in-depth discussion of this topic (involving people much smarter than me) here:</div>
<div><br/></div>
<div><a href="http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/">http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/</a><br/></div>
<div><br/></div>
<div><a href="https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html">https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html</a><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
InterConnect 2017https://garyjoy.postach.io/post/interconnect-20172017-03-30T13:41:28.363000Z2017-03-21T17:21:53ZGary Joy<div>I always think of the Chairman’s Address at Interconnect (<a href="http://www-03.ibm.com/press/us/en/pressrelease/51881.wss">http://www-03.ibm.com/press/us/en/pressrelease/51881.wss</a>) as the corporate equivalent to the WWDC Keynote. It provides a good view of the direction and focus of IBM and helps me to understand how my working life might change over the coming years.</div>
<div><br/></div>
<div>If you have a couple of hours you can watch it here:</div>
<div><br/></div>
<div><iframe width="480" height="270" src="https://www.youtube.com/embed/ANC90HNMdQU?feature=oembed" frameborder="0" allowfullscreen></iframe></div>
<div><br/></div>
<div>Alternatively, if you only have a couple of minutes, you can read my summary below…</div>
<div><br/></div>
<div>Unsurprisingly (at the Cloud and Cognitive conference) Ginni Rometty opens strongly with her view on how Cloud is changing both business and society and how it is becoming *the* platform for the next era of business. I like to think that the focus on these more holistic values can be attributed (at least in part) to the influence of a BPM culture (via people like Phil Gilbert) within IBM.</div>
<div><br/></div>
<div>In the interview with Bruce Ross they talk about the culture at the Royal Bank of Canada and he declares that if the line of sight between an activity and a tangible business outcome is lost then the need for the activity is immediately reviewed. At another point in the address Ginni talks about a segment of the IT market being $1.4 trillion but corresponding decision management market being over $2 trillion. The take away here is that IBM view Cloud and Cognitive as the bridge from IT (where IBM used to live) into the rest of organisations (where IBM want to go).</div>
<div><br/></div>
<div>So what is Cloud and Cognitive? Everything needs to have a name but these are both vague and broadly interpretable words. Ginni described three tenants (“pillars of the Cloud"):</div><ul><li>Enterprise Strong - The fundamentals (security, performance, scalability, integrations). All the IT stuff working the way that you want it to.</li><li>Data First - The resources (from a range of sources: public, licensed and proprietary) all subject to the fundamentals (e.g. security).</li><li>Cognitive at it's Core - This is foundational (and embodied in Watson). It is about making better decisions (goes beyond IT) using the two other tenants.</li></ul><div><br/></div>
<div>The remainder of the address comprised five interviews:</div>
<div><br/></div>
<div><i>Randall Stephenson, Chairman and CEO, AT&T </i><i>(Enterprise Strong)</i></div>
<div>AT&T and IBM enjoy a mutually beneficial partnership and this interview showed how (at good companies) many of the fundamentals are becoming ubiquitous. I liked the description of the shift to a mindset where access to data is now noticed by it’s absence (like air). Randall talked about tremendous growth (in everything from data point generation by sensors to video downloads on mobile) and how the Cloud is the only way to keep up. Of the future, he said: "whoever uses the data best wins".</div>
<div><br/></div>
<div><i>Marc Benioff, Chairman and CEO, Salesforce</i><i> (Data First)</i></div>
<div>IBM and Salesforce have overlapping visions and values. The partnership should enable something that is greater than the sum of its parts. Salesforce have a world-class CRM platform (i.e. data) and are looking to augment their AI (called “Einstein") with the broader capabilities of Watson (including it’s strength in domain-specific knowledge and learning). I’m finding it hard to summarise this interview and yet it was probably my favourite one. Marc and Ginni are really thinking about the future of the world and the science fiction geek in me is captivated by the prospect of the changes that might unfold in my lifetime as a result of these endeavours.</div>
<div><br/></div>
<div><i>Bill Cobb, President & CEO, H&R Block (Cognitive)</i></div>
<div>This was a nice case study about an ambitious company that are using using Cognitive (Watson) in the way that IBM envisage it will be used, to augment man and machine. It’s a good story; people pay less tax because they get the worlds best AI to help give a level of attention and detail that you couldn’t get before.</div>
<div><br/></div>
<div><i>Bruce Ross, Group Head, Technology & Operations, Royal Bank of Canada (Holistic Values</i><i>)</i></div>
<div>This interview covered all the tenants but my takeway quote was: “lifestyles not products". Royal Bank of Canada have (with IBM) created an engineering culture with the following values: i. focus on business outcomes, ii. transformation is a way of life and iii. innovation (plan three years ahead). I guess, as a closing interview the message here is that, if you want to succeed moving forward (and lead in your market) you need to change how you work.</div>
<div><br/></div>
<div><i>Reshma Saujani, Founder and CEO, Girls Who Code (IBM Values)</i></div>
<div>IBM are committed to a better, fairer world.</div>
<div><br/></div>
<div><br/></div>
<div>For more news from the conference you should look at: <a href="https://www-03.ibm.com/press/us/en/pressreleases/recent.wss">https://www-03.ibm.com/press/us/en/pressreleases/recent.wss</a></div>
<div><br/></div>
<div>The new developer tools for financial services looks interesting. As does the stuff on blockchain and the hyperledger.</div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><font face="Helvetica Neue"/></div>
<div><br/></div>
You Can't Argue With Thathttps://garyjoy.postach.io/post/you-cant-argue-with-that2017-02-26T23:02:39.089000Z2017-02-17T15:00:55ZGary Joy<div><b>I</b><b>’</b>m pretty confident that most of the people reading this will be able to relate to a scenario in which you are tasked with resolving a vaguely defined, intermittent problem with a system. These problems are a sure fire way to lose user confidence and interest and the phrase “it works fine for me" is equally likely to alienate.</div>
<div><br/></div>
<div>Things like...</div><ul><li>sometimes the screen doesn’t load and</li><li>the lookup isn’t working</li></ul><div>…are no good to anyone. What you need is...</div><ul><li>0.6% of requests (for information from an external system) do not recieve a response</li><li>7.2% of requests take more than 2000ms</li><li>more than 10 requests yesterday took more that 30000ms</li></ul><div><br/></div>
<div>Charts are even better...</div>
<div><b><br/></b></div>
<div><b>Chart 1.</b></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/4db2762f-03a7-439e-8713-1a03369544ea/665f8685-7178-4e2e-8048-eaa628f76f00.png" /><br/></div>
<div>Chart 1. shows the number of requests to and responses from my fictional external system. There should be the same number of requests and responses. It is a little difficult to read the chart because sometimes the response comes in a few seconds later and so it is in the next bar. An example of lost requests is at 10:00. 12 requests are made but only 10 responses are received. Subsequent bars are equal so the responses did not come in later.</div>
<div><b><br/></b></div>
<div><b>Chart 2.</b></div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/4db2762f-03a7-439e-8713-1a03369544ea/693ef3c1-960a-48e9-b4e5-7de98bbd5ed5.png" style="font-family: arial, helvetica, sans-serif; font-size: 14px;"/><br/></div>
<div><br/></div>
<div>Chart 2. shows the response times for my fictional requests. I’d challenge anyone to look at this chart and tell me that they don’t need to take a closer look at what’s going on.</div>
<div><br/></div>
<div>I’ve talked about this topic many times before but it really is very easy to make your life easier. In IBM BPM (and probably any other technology stack) it is best practise (and almost trivial) to instrument your integrations. Don’t wait until there is a problem, make it part of your implementation work, *every* time.</div>
<div><br/></div>
<div>I guess the other requirement is having a capability to interrogate the resultant data in a meaningful way. Thankfully, tools for this are increasingly available in the technology stacks of most enterprises.</div>
<div><br/></div>
<div><br/></div>
Exposing a Client Side Human Service via a URLhttps://garyjoy.postach.io/post/exposing-a-client-side-human-service-via-a-url2017-02-03T15:36:02.180000Z2017-02-03T15:10:03ZGary Joy<div>This is a quick one. I have a couple of longer ones that are 80% complete but in the meantime here’s some information that I needed recently and couldn’t find anywhere on the Internet…</div>
<div><br/></div>
<div>If (in IBM BPM 8.5.7) you have a Client Side Human Service (CSHS) that you want to expose via a URL *and* you are generating the URLs in another CSHS then you will need some environment-specific logic to get things working on both Process Centres and Process Servers (using the correct version of your CSHS).</div>
<div><br/></div>
<div>Here's some JavaScript…</div>
<div><br/></div>
<div><script src="https://gist.github.com/7d385d3758bffc8eebf8be41a9b5e726.js"></script> <br/></div>
<div><br/></div>
<div>Some supporting comments…</div>
<div><br/></div>
<div><ul><li>The main piece of information here (that I couldn’t find anywhere else) is that you need Branch ID on a Process Centre and Snapshot ID on a Process Server. On a Process Centre it will (as far as I can tell) always use the Tip (latest version) of the specified Branch (but it always needs the Branch, even if you only have one active one). On a Process Server there isn’t really a concept of Branches (only Snapshots), so it needs the Snapshot identifier.</li><li>My exposed CSHS has an input parameter called <i>processInstanceId</i> and I’m getting the value from the Coach View configuration that this script is in.<br/></li></ul></div>
<div><br/></div>
<div>That’s it. Told you it was a quick one. There is a nice REST API that you can use on a given server to get the details of exposed Services (including URLs)…</div>
<div><br/></div>
<div><a href="https://www.ibm.com/support/knowledgecenter/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/rest/bpmrest/rest_bpm_wle_v1_exposed_type_get.htm">https://www.ibm.com/support/knowledgecenter/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/rest/bpmrest/rest_bpm_wle_v1_exposed_type_get.htm</a><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
BPM System Wishlisthttps://garyjoy.postach.io/post/bpm-system-wishlist2017-01-02T17:01:58.356000Z2017-01-01T12:15:49ZGary Joy<div>Neil Miller has written a great post entitled “My 10-Point BPM System Wishlist". If you have a few minutes, go and read it now. I strongly agree with pretty much every word.</div>
<div><br/></div>
<div><a href="http://www.bpmleader.com/2016/12/27/10-point-bpm-system-wishlist/">http://www.bpmleader.com/2016/12/27/10-point-bpm-system-wishlist/</a></div>
<div><br/></div>
<div>I frequently declare that the soft components (e.g the team and the approach) are more important than the choice of technology / BPMS but I can’t dispute that I’m usually happiest at work when I’m flowing downstream with the BPMS.</div>
<div><br/></div>
<div>I’d like to add an item to the list...</div>
<div><br/></div>
<div><b>11. DevOps Friendly</b></div>
<div><br/></div>
<div>I want seamless, complete and transparent integration with whatever source control, deployment and testing components I have chosen to use. I would very much like, before I retire (so we have a few years to get there), to work for an organisation that routinely deploys atomic features into production on their BPMS. </div>
<div><br/></div>
<div>There is a mild irony to the fact that the operational processes around many BPMS leave much room for improvement. More often than not (in my circles at least) there are low value, error prone, easily automated but still manual activities in the SDLC processes.</div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
The Always Up-To-Date Essential Links for an IBM BPM Consultanthttps://garyjoy.postach.io/post/the-always-up-to-date-essential-links-for-an-ibm-bpm-consultant2018-03-09T15:12:19.636000Z2016-11-11T08:01:55ZGary Joy<div>More than once in the last few weeks I have found myself searching for something IBM BPM-related with Google e.g.</div>
<div><br /></div><ul><li>the latest version of the GEX Toolkit</li><li>information on Governance Process implementation</li><li>reference material to implement coach views that inherit parent visibility</li><li>list of REST API methods for IBM BPM</li></ul><div><br /></div>
<div>I found that it wasn’t always trivial to find what I’m looking for and so I have compiled a compendium...</div>
<div><br /></div>
<div>New Forum = <a href="https://developer.ibm.com/answers/topics/bpm/">https://developer.ibm.com/answers/topics/bpm/</a></div>
<div>Old Forum = <a href="https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000002382&ps=25">https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000002382&ps=25</a></div>
<div><br /></div>
<div>Smarter Process Community = <a href="https://hub.jazz.net/user/spcommunity">https://hub.jazz.net/user/spcommunity</a></div>
<div><br /></div>
<div>IBM BPM Knowledge Centre = <a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS">http://www.ibm.com/support/knowledgecenter/en/SSFPJS</a></div>
<div><br /></div>
<div>BP3 Help Centre = <a href="https://support.bp-3.com/hc/en-us">https://support.bp-3.com/hc/en-us</a></div><table style="table-layout: fixed; border-collapse: collapse; min-width: 100%;"><colgroup><col style="width: 199px;" /><col style="width: 199px;" /><col style="width: 199px;" /><col style="width: 199px;" /><col style="width: 199px;" /></colgroup><tbody><tr><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><br /></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>7.5.1</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>8.0.1</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>8.5.7</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>8.6</div></td></tr><tr><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>Documentation</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_7.5.1/com.ibm.wbpm.main.doc/ic-homepage-bpm.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.0.1/com.ibm.wbpm.main.doc/ic-homepage-bpm.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.7/com.ibm.wbpm.main.doc/kc-homepage-bpm.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="https://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.6.0/com.ibm.wbpm.main.doc/kc-homepage-bpm.html">link</a></div></td></tr><tr><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>Reference</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/SSFPJS_7.5.1/com.ibm.wbpm.ref.doc/topics/rref_pgmiinfo.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.0.1/com.ibm.wbpm.ref.doc/topics/cbpm_reference.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/topics/cbpm_reference.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="https://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.6.0/com.ibm.wbpm.ref.doc/topics/cbpm_reference.html">link</a></div></td></tr><tr><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>Dojo</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>v1.6.1</div>
<div><a href="https://dojotoolkit.org/reference-guide/1.6/releasenotes/">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>v1.7.3</div>
<div><a href="https://dojotoolkit.org/reference-guide/1.7/releasenotes/">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>v1.10.4 / v1.10.5</div>
<div><a href="https://dojotoolkit.org/reference-guide/1.10/releasenotes/1.10.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>?</div></td></tr><tr><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>REST API</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/developerworks/websphere/library/techarticles/1108_thaker/1108_thaker.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.0/com.ibm.wbpm.ref.doc/covw_bspace_ref.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/covw_bspace_ref.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="https://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.6.0/com.ibm.wbpm.ref.doc/covw_bspace_ref.html">link</a></div></td></tr><tr><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>Javascript API</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/SSFPJS_7.5.1/com.ibm.wbpm.ref.doc/javascript/JSAPI.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.0.1/com.ibm.wbpm.ref.doc/ae/doc/JSAPI.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/ae/doc/JSAPI.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="https://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.6.0/com.ibm.wbpm.ref.doc/ae/doc/JSAPI.html">link</a></div></td></tr><tr><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div>Coach API</div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="https://www.ibm.com/support/knowledgecenter/en/SSFPJS_7.5.0/com.ibm.wbpm.wle.editor.doc/modeling/topic/building_human_service.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/SSFTBX_8.0.1/com.ibm.wbpm.wle.editor.doc/develop/topics/coachref.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="http://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.5.7/com.ibm.wbpm.ref.doc/topics/rcoachapi.html">link</a></div></td><td style="border: 1px solid rgb(211, 211, 211); width: 199px; padding: 8px;"><div><a href="https://www.ibm.com/support/knowledgecenter/en/SSFPJS_8.6.0/com.ibm.wbpm.ref.doc/topics/rcoachapi.html">link</a></div>
<div><a href="https://www.ibm.com/support/knowledgecenter/en/SSFTBX_8.5.7/com.ibm.wbpm.ref.doc/topics/spk_ui_tkit_an_overview.html">another link</a></div></td></tr></tbody></table><div><br /></div>
<div>I tip my hat to any readers that already have all these bookmarks in place and I would ask that you add a comment if I have missed any important ones...</div>
<div><br /></div>
iFrames, "Frame-Contexts" and IBM BPMhttps://garyjoy.postach.io/post/iframes-frame-contexts-and-ibm-bpm2017-11-22T10:34:52.634000Z2016-10-28T08:54:38ZGary Joy<div><b>NOTE: The DOM changed in CF2017.06 (<a href="https://developer.ibm.com/bpm/2017/06/ibm-bpm-8-5-7-cf2017-06-now-available/">https://developer.ibm.com/bpm/2017/06/ibm-bpm-8-5-7-cf2017-06-now-available/</a>) and the text below only applies to versions <i>before</i> CF2017.06.</b></div>
<div><br/></div>
<div>My current project has a pleasing focus on quality and a longer term view than many I have worked on. It’s probably just a co-incidence that the project isn’t based in the UK. In any event, I have been spending some quality time with Cucumber, Selenium, Java and Jenkins (for IBM BPM automated testing).</div>
<div><br/></div>
<div>My previous, less mandated, endeavours in this area never really reached maturity, or an acceptable level of robustness. One of the reasons for this was always the highly translucent box that is IBM BPM’s use of iFrames. When Selenium tests are running they always have a single “frame-context" i.e. you can only interact with controls in your current “frame-context".</div>
<div><br/></div>
<div>Here is a summary of my learnings (I’m working with the out-the-box Portal in v8.5.7):</div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/b9268fec-d913-47de-b97c-a906e70fbf6e/c149714b-65af-4867-ba59-66146cd498e6.png" style="height: auto;"/><br/></div>
<div>There is *always* a single top-level frame with Title=Portal (marked “Navigation" and coloured green in the diagram). This is the iFrame that you need to be in to interact with the Navigation Menus.</div>
<div><br/></div>
<div>=> Navigation is [Root, 0] or [Root, Title=Portal]</div>
<div><br/></div>
<div>The first child of this iFrame is the content that pertains to the current selection in Title=Portal. It's Title will be the name of the Navigation Item. The content (marked “Service / Dashboard" and coloured blue in the diagram) will live inside another child iFrame and it's Title will be the Coach name.</div>
<div><br/></div>
<div>=> Inbox is [Root, 0, 0, 0] or [Root, Title=Portal, Title=Work, Title=Work]</div>
<div>=> Gary's Cool Service is [Root, 0, 0, 0] or [Root, Title=Portal, Title=Gary's Cool Service, Title=Coach]</div>
<div><br/></div>
<div>The second child (of Title=Portal) is for the Active Task. It's Title will be the Task Subject. The content (marked “Task" and coloured red in the diagram) will live inside another child iFrame and it's Title will be the Coach name.</div>
<div><br/></div>
<div>=> Some Task is [Root, 0, 1, 0] or [Root, Title=Portal, Title=Some Task, Title=Coach]</div>
<div>=> Some Other Task is [Root, 0, 1, 0] or [Root, Title=Portal, Title=Some Other Task, Title=Coach]</div>
<div><br/></div>
<div>These are only three "frame contexts" that you ever need to worry about. Below is some Java code to help you on your way. It also includes a method to explicitly specify an iFrame by Title (which can be helpful in certain situations).</div>
<div><br/></div>
<div><script src="https://gist.github.com/7d041723379e1352cdccc0073e36001e.js"></script></div>
<div><br/></div>
<div>IBM BPM projects seem well behind the industry when it comes to the use of automated testing but if you consider yourself as an IBM BPM Developer, you will need this particular tool in your repertoire one day soon...</div>
<div><br/></div>
Tools of the Tradehttps://garyjoy.postach.io/post/tools-of-the-trade2016-09-08T13:48:16.435000Z2016-09-08T13:43:51ZGary Joy
<div>
<div>Every day, in and out of work, we make dozens of small (often implicit) decisions about how best to go about our lives. Over time, these decisions can have a significant impact on our ability to effectively achieve goals.</div>
<div>I want to talk about a few in particular, <span style="color: rgb(4, 51, 255);"><span style="font-size: 34px;"><b>W</b></span></span>, <span style="color: rgb(0, 249, 0);"><span style="font-size: 34px;"><b>E</b></span></span> and <span style="color: rgb(255, 251, 0);"><span style="font-size: 34px;"><b>Z</b></span></span>.</div>
<div><br/></div>
<div>It’s 2016 and the ubiquitous Microsoft Office lingers, entrenched in the enterprise like a corporate comfort blanket.</div>
<div><br/></div>
<div>If your aim is too produce (in isolation) a good quality, single use artefact that is a medium to large sized document or low complexity piece of analysis then Word or Excel are acceptable tools to use.</div>
<div><br/></div>
<div>If however, you are looking to publish, distribute, and collaborate on your artefact, they most certainly are not.</div>
<div><br/></div>
<div>At first glance, this might sound like a trivial or even petty complaint but, in my view, it’s a significant barrier to the adoption of more effective delivery within organisations.</div>
<div><br/></div>
<div>Here are a few examples (based on my own experiences in recent years)...</div>
<div><br/></div>
</div>
<table style="-evernote-table:true;border-collapse:collapse;width:100%;table-layout:fixed;margin-left:0px;">
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div><b>Bad</b></div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div><b>Good</b></div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>E-mail a Zip file containing Java code for review</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>Approve a Pull Request</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>Word Document to Deploy Application</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>Automated Deployment Pipelines</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>Excel for Test Script Design and Execution</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>Automated Testing (and Reporting)</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>100+ Requirements Documents in Word</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>Team Collaboration Software</div>
</td>
</tr>
</table>
<div>
<div><br/></div>
<div>I’m sure that you have your own examples. Please share them in the comments below...</div>
<div><br/></div>
</div>
<div>Companies that offer products in this not-so-new-anymore space (e.g. Atlasssian) are thriving and while it’s easy to blame Enterprise Architecture for problems, I believe that everyone should lead by example and always be mindful of chasing the best tool for the job.</div>
End-to-End PoCs in No Timehttps://garyjoy.postach.io/post/end-to-end-pocs-in-no-time2016-08-19T08:12:12.266000Z2016-08-12T15:21:48ZGary Joy<div>This blog started out (over two years ago) with a desire to share something that I did at work (that I thought was cool) with the world (even if the world wasn’t really listening). This entry is another one of those.</div>
<div><br/></div>
<div>I find that, at a given meeting (presentation, demo etc.), the participants all have a finite amount of energy (imagination, patience etc.) that they are willing to put into the <i>purpose</i> of the meeting. For a meeting that I have an interest in the purpose of, the more I can do to prevent wasted energy, the better things will be.</div>
<div><br/></div>
<div>My first suggestion is pretty simple: <b>Press F11!</b> If people are watching your screen (via a projector etc.), make sure that <b>everything</b> that is on your screen is what you want them to be thinking about. If you want them to idly review your bookmarks, ponder the contents of your background tabs/applications or contemplate switching to your browser of choice then that’s fine (it’s not fine). Otherwise, it’s usually pretty straightforward to hide away distractions and save some of that imagination/patience/energy for something more important.</div>
<div><br/></div>
<div>My second suggestion is (if you use IBM BPM) to keep an improved Default Human Service in your toolkit so that you can build better PoCs by minimising the amount of imagination that’s required to imagine your PoC as the real thing.</div>
<div><br/></div>
<div>Here’s mine (you can get it, along with some other cool stuff, at <a rev="en_rl_minimal" href="https://github.com/garyjoy/enjoyingbpm">https://github.com/garyjoy/enjoyingbpm</a>)...</div>
<div><br/></div>
<div>The improvements are:</div>
<div><br/></div>
<ul>
<li>Responsive Comments Control</li>
<li>Simple Decision-based Usage Pattern</li>
<li>Improved UI</li>
</ul>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/6d2f7554-3708-41b4-b6c8-b696aeb69426.png" style="height: auto;"/></div>
<div>Nothing new in the Diagram.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/475bbb25-502a-4dea-9b14-ab26003d496d.png" style="height: auto;"/></div>
<div>Added some (optional) Input and Output Variables (and a couple of Private Variables).</div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/83fa6464-1e7c-4cfa-996b-d0b9139721b6.png" style="height: auto;"/></div>
<div>The Narrative is front-and-centre and there are Tabs for Decisions and Comments.</div>
<div><br/></div>
<div>Using my improved Default Human Service you can build end-to-end process flows with working decisions, instructions and user-contributed data (all from a single process diagram).</div>
<div><br/></div>
<div>Here’s a short video of the user experience and some screenshots of the process diagram:</div>
<div><br/></div>
<div><iframe width="480" height="360" src="https://www.youtube.com/embed/lG9RcfNeRRo?feature=oembed" frameborder="0" allowfullscreen></iframe></div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/34ff63f5-4168-4af5-8883-6326174e4c9e.png" style="height: auto;"/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/45f3877a-f6ee-4141-ac81-306dfc7c1c83.png" style="height: auto;"/></div>
<div>When using the improved Default Human Service you should make sure you have a meaningful Task Subject and also a Narrative that will explain to the user what you want them to do (it will handle carriage returns in the text).</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/39a86508-0afe-4f7a-a4c6-e954167e5d96.png" style="height: auto;"/></div>
<div>Every time you use the improved Default Human Service you should pass in a list of Strings that represent the options for the user. It will return the selected one (that you can use in Decision Gateways).</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/565c3244-986d-4576-bdde-f85cc7fb2e76.png" style="height: auto;"/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/c6994e29-5e5d-467a-9bf0-cb65e530adbe/1365ac0e-b8f3-4dd8-a9e8-e934c6d80a79.png" style="height: auto;"/></div>
<div><br/></div>
<div>Just beneath the surface of the improved Default Human Service is a Comments Coach View that is pretty cool in it’s own right. You can just drop it into a Coach and you will get responsive access to the out-the-box comments in all of your Coaches.</div>
<div><br/></div>
<div>One final suggestion: don’t build disposable PoCs. If I were king your PoC would be the Sprint 1 deliverable and at the end of Sprint 2 it would do something extra that your customers think is awesome.</div>
<div><br/></div>
Use the Expression Evaluator to Identify and Terminate Process Instanceshttps://garyjoy.postach.io/post/use-the-expression-evaluator-to-identify-and-terminate-process-instances2016-06-30T07:50:08.543000Z2016-06-29T22:17:56ZGary Joy<div>It’s vaguely interesting that one of my lazier posts (<a href="http://garyjoy.postach.io/post/javascript-to-re-assign-a-task-in-ibm-bpm">http://garyjoy.postach.io/post/javascript-to-re-assign-a-task-in-ibm-bpm</a>) is one of the most read, even two years after it was written.</div>
<div><br/></div>
<div>I recently found myself solving a different problem in a similar way and figured that I should share this with the world as well.</div>
<div><br/></div>
<div>A pet peeve of mine is the use of “All Users" in IBM BPM and the consequential untidiness that it’s use generates. I don’t want to see obscurely named tasks or meaningless (to me at least) exposed services when using the portal, even in the development environment.</div>
<div><br/></div>
<div>The following javascript expressions can be used in the Process Inspector to identify (and terminate) the Process Application for a given Process Instance ID:</div>
<div><br/></div>
<div><i>tw.system.findProcessInstanceByID(12345).processApp.acronym;</i></div>
<div><i>tw.system.findProcessInstanceByID(12345).abort();</i></div>
<div><br/></div>
<div>If the expressions above saved you time in tracking down the sandbox that was leaking into your portal please consider forwarding a link to my blog to the owner of said sandbox. It’s win-win!</div>
<div><br/></div>
<div>If you have any expressions that you frequently use please share them in the comments below...</div>
<div><br/></div>
<div><br/></div>
BPMN Guidelines (for Dummies)https://garyjoy.postach.io/post/bpmn-guidelines-for-dummies2016-06-05T13:06:08.280000Z2016-06-03T14:30:59ZGary Joy<div>I enjoy the opinion that my job is 50% Science, 50% Art and that neither Dysfunctional Beauty nor Awkward Technical Perfection is good enough. The room for movement in both the Science and Art of a solution is where the two come together and create something great (like the <a href="https://en.wikipedia.org/wiki/Anglepoise_lamp">Anglepoise Lamp</a>).</div>
<div><br/></div>
<div>Here are some rules for BPMN models, you shouldn’t go too far wrong if you stick to them...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/64e90b83-0f2e-430d-913f-f83721b40f57/f361d7e1-58e9-4f7d-b2e8-cac289fa4766.png" style="height: auto;"/></div>
<div><br/></div>
<ul>
<li>Activities are <b>Verb Noun</b></li>
<li>Decisions are <b>Concise Questions?</b></li>
<li>Decision Flows are <b>Concise Answers</b></li>
<li>Events are <b>Noun Verb</b></li>
<li>No Crossing Lines</li>
<li>(General) Flow Top-Left to Bottom-Right</li>
<li>Consistent and Meaningful use of Colour</li>
</ul>
<div><br/></div>
<div>I can’t stress enough how important it is to get your top level processes right. They form the bedrock of your entire BPM endeavours, they engage the business and they empower the developers.</div>
<div><br/></div>
<div>You should strive for “process completeness" and, when you’re done, the end result should be worthy of a frame and a place on the wall.</div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
Back to Workhttps://garyjoy.postach.io/post/back-to-work2016-05-30T14:11:34.396000Z2016-05-30T14:09:13ZGary Joy
<div>
<div>I start my new (IBM BPM) contract tomorrow. It’s going to be a challenge but I hope it will keep me busy (and happy) for a while.</div>
<div><br/></div>
<div>Thanks to all my friends and colleagues that helped me find something. I guess it was kind of inevitable that I would end up working with one of the best companies in the business.</div>
<div><br/></div>
</div>
<div>Once my recent (job hunting) experiences have marinated a little I will probably blog about them...</div>
Custom HTML in Coaches and Coach Viewshttps://garyjoy.postach.io/post/custom-html-in-coaches-and-coach-views2016-05-18T19:16:10.055000Z2016-05-18T19:02:03ZGary Joy<div>I came across the <a href="https://www.ibm.com/support/knowledgecenter/#!/SSFPJS_8.5.0/com.ibm.wbpm.wle.editor.doc/buildcoach/topics/ccontrols.html">following information</a> about Custom HTML in my recent travels...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/8f33ec1e-8477-44f6-9eb9-c7ff2a4d4ea4/c7d0a834-fb42-4a33-bf77-eb96f4f53143.png" style="height: auto;"/></div>
<div><br/></div>
<div>It’s <i>almost</i> as if <span style="font-family: 'Courier New';">{{…}}</span> is the equivalent of <span style="font-family: 'Courier New';"><#=…#></span> before v8.x of IBM BPM. You should probably be cautious of your use of <span style="font-family: 'Courier New';">{{…}}</span> but there will be times that it will make it simpler to do something simple.</div>
<div><br/></div>
<div>It’s a little frustrating that you can’t do something like <span style="font-family: 'Courier New';">{{tw.resource.MyBundle.MyResource}}</span> in a Coach View (it will work fine in a Coach). I like to use Resource Bundles and I like to use Coach Views, it would be nice if they worked a little better together.</div>
Feedback Custom Coach Viewhttps://garyjoy.postach.io/post/feedback-custom-coach-view2016-05-16T12:28:17.246000Z2016-05-16T12:27:00ZGary Joy
<div>
<div>I’ve always been a vocal advocate of engaging users in process improvement and I firmly believe that direct feedback from users is one of the most import input channels for any development backlog. </div>
<div><br/></div>
<div>We’re going to create (in IBM BPM v8.5.7) a Feedback Custom Coach View that can be included in all of your Coaches.</div>
<div><br/></div>
<div>The core design objectives for the Feedback Custom Coach View are:</div>
<div><br/></div>
<ul>
<li>It should be unobtrusive yet always available</li>
<li>It should automatically collect context information</li>
<li>It should be simple and quick to submit feedback</li>
</ul>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/a4adc893-df14-4c11-965f-da87094c7348.png" style="height: auto;"/></div>
<div><br/></div>
<div>Let’s get into it...</div>
<div><br/></div>
<div>You can get everything I have done on <a href="https://github.com/garyjoy/enjoyingbpm">github</a>. It’s a lightweight toolkit that will hopefully grow over time and include some useful stuff. It’s open for anyone to use but please do let me know if you use it.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/b6e056f9-3812-4238-996b-8aaf65325089.png" style="height: auto;"/></div>
<div><br/></div>
<div>If you’re just skimming this, you might want to jump to the <i>Feedback</i> custom Coach View under <b>Core Components</b> further down the page. Everything between here and there is all the supporting stuff.</div>
<div><br/></div>
<div><b>Supporting Components</b></div>
<div><br/></div>
<div><i><a href="https://github.com/garyjoy/enjoyingbpm/blob/master/Enjoying_BPM%20-%201.0.0/files/61.47fdaf7b-f1c8-4079-9de2-85071e47da61/9620f184-79b9-44fc-819c-2b9f77c9a350">AMD.js</a></i> (github link)</div>
<div><a href="https://en.wikipedia.org/wiki/Asynchronous_module_definition">Asynchronous Module Definition</a> (AMD) will take care of efficiently and effectively loading all the javascript components that you use. Chances are that you already have something in place. I’m using the latest versions of jQuery and jQuery UI. </div>
<div><br/></div>
<div><i><a href="https://github.com/garyjoy/enjoyingbpm/blob/master/Enjoying_BPM%20-%201.0.0/files/61.94792c72-b3ae-4fc5-a8cf-d3a503a92d18/bb186885-de1b-49c3-b943-1473c72b4be6">joyLogging.js</a></i> (github link)</div>
<div>I have chosen to record and expose the feedback via the application logging framework and this server side Javascript adds some value on top of the basic logging API (e.g. "log.error()"). It essentially the same script that I used <a href="http://garyjoy.postach.io/post/application-logging-in-ibm-bpm-using-splunk">here</a>.</div>
<div><br/></div>
<div><i>Log Action</i></div>
<div>System Service wrapper around logAction() in <i>joyLogging.js</i>.</div>
<div><br/></div>
<div><i>Log Feedback</i></div>
<div>AJAX Service wrapper around <i>Log Action</i>. This is the server-side component that our custom Coach View will send the feedback to. You can replace it with whatever suits you.</div>
<div><br/></div>
<div>
<div><i>Test Harness for CSHS Feedback</i></div>
</div>
<div><i>Test Harness for HHS Feedback</i></div>
<div>A couple of test harnesses for the custom Coach View. I would encourage you to look after your test harnesses. If they are only to be used during development then delete them when the work is done. If they are expected to live on them treat them the same as the other artefacts (e.g. ensure the documentation is good and that they are kept up to date). I generally use Tag and Tag Groups but I also like to prefix testing-based artefacts with “Test".</div>
<div><br/></div>
<div><b>Core Components</b></div>
<div><br/></div>
<div><i>feedback.png</i></div>
<div>It’s my opinion that the BPM Developers (myself included) don’t make particularly good designers. Projects that have more than half a dozen developers should consider leveraging a dedicated designer (if you want to build something great). Here’s my attempt at an image for the custom Coach View...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/50c4ef9e-c5a5-4c9c-b29e-a8ab0aa472f4.png" style="height: auto;"/></div>
<div><br/></div>
<div><i>Feedback</i> (custom Coach View)</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/8d6a682a-4a09-4a2f-8695-8f165927fd86.png" style="height: auto;"/></div>
<div>There’s nothing very interesting in the Overview Tab. I have used the image as both a Palette Icon and a Layout Image. No Boundary Events are fired and I think I prefer it without a Label.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/7ebb83fc-8afe-4e57-9ab5-3434ab55ae72.png" style="height: auto;"/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/96de7b52-9c10-4af0-98fc-4752b838a675.png" style="height: auto;"/></div>
<div>Add the AMD.js script in Included Scripts and then create entries in AMD Dependencies.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/b7a6f04a-73a8-442f-baef-bcbe0936be11.png" style="height: auto;"/></div>
<div>Import the jQuery UI CSS and ensure that the Feedback text area uses the available width.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/2377739d-6850-4562-b06d-bd4e382cc005.png" style="height: auto;"/></div>
<div>The load event handler is where all the logic lives. The script content is as follows:</div>
<div><br/></div>
<div><script src="https://gist.github.com/208e274da9dfee221c929777f05795ae.js"></script></div>
<div><br/></div>
<div>I’m not completely sold on the way that openScript and closeScript work (comments and suggestions are appreciated). It probably worth highlighting the way that _context allows me to access the context object in my click event handler (which is called outside of the regular event handlers and lifecycle). I considered using data binding and shoe-horning my Ajax call into the change event handler but I think I prefer this approach.</div>
<div><br/></div>
<div><i>NOTE: The view and change event handlers only contain console.log() statements.</i></div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/bc27737e-d391-47b0-8d2b-9454de8e47e8.png" style="height: auto;"/></div>
<div>Add the Log Feedback Ajax Service as a Configuration Service. This is what allows me to write "_context.options.LogFeedback()" in my JavaScript load event handler.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5c4c6e8d-7285-4536-96a3-77466cd6049d/71464913-0f08-4ce1-af4f-5a28e5f741f0.png" style="height: auto;"/></div>
<div>The markup is pretty simple. The only real points of note are that we assign unique IDs to the DIV that’s used to create the dialog and the TEXTAREA that’s used to input the feedback. I don’t really envisage multiple feedback coach views in a single coach but it feels like a better approach to always be explicit.</div>
<div><br/></div>
<div>I’m hoping to make the Joy Toolkit (on Github) a Thing. My backlog currently includes:</div>
<div><br/></div>
<ul>
<li>Supporting Anonymous Feedback</li>
<li>Support Coach View Configuration Options</li>
<li>Implement Confirmation of Feedback </li>
<li>Move Feedback Text into Localisation Resource</li>
<li>Automated / Unit Tests</li>
</ul>
<div><br/></div>
</div>
<div>If you have any suggestions please let me know. If you’d like to contribute (I’m hoping that storing the expanded export file on Github will facilitate distributed contributors) then hit me up on LinkedIn.</div>
Client Side Human Serviceshttps://garyjoy.postach.io/post/client-side-human-services2016-05-12T20:22:46.500000Z2016-05-10T15:39:41ZGary Joy<div>I imagine that the Custom HTML control that was part of the original Teamworks product was a begrudging addition to provide a last-resort safety net to accomodate user requirements and that the designers back then would wince at the technical knowledge that’s now required to build user interfaces in the latest evolution of the product.</div>
<div><br/></div>
<div>I, on the other hand, started out my working life misusing the Custom HTML control to try and create the type of rich and intuitive interfaces that inhabit the technological mainstream nowadays. Notwithstanding the inevitable technical teething problems, Client Side Human Services are (in my opinion) the <i>Way Forward</i>. It would be nice though, if IBM could provide some kind of assurance that IBM BPM v9.x will not introduce another entirely new UI paradigm...</div>
<div><br/></div>
<div>If you work with IBM BPM and you haven’t looked at Client Side Human Services then you need to go and watch this video:</div>
<div><br/></div>
<div><iframe width="480" height="270" src="https://www.youtube.com/embed/j5bCvffQZbY?feature=oembed" frameborder="0" allowfullscreen></iframe></div>
<div><br/></div>
<div>Neil Kolan is like a Stephen Fry of the IBM BPM world and I think that IBM would do well to empower more (of his style of) evangelism of their platforms. The video is 53:19 long and although it may seem a little slow at times I wouldn’t remove any of the content. It will give you a solid foundation to start building Client Side Human Services (and hopefully highlight any areas where you need to learn more).</div>
<div><br/></div>
<div>In an effort to add something to the video above I thought I would replicate Neil’s example using AngularJS instead of JQueryUI...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/b884b1c5-af72-478f-abb7-dcd11f43dfcc/bad8676e-4da1-432d-b5d2-aac494f6fcf1.png" style="height: auto;"/><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/b884b1c5-af72-478f-abb7-dcd11f43dfcc/296a74f4-be11-4cf3-a208-728328071bca.png" style="height: auto;"/><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/b884b1c5-af72-478f-abb7-dcd11f43dfcc/5d95f11e-dc39-4875-b565-1ed878cdb900.png" style="height: auto;"/></div>
<div><br/></div>
<div>To create the Angular-based Dialog Custom Control...</div>
<div><br/></div>
<div>1. Create a new Coach View called <b>angular Dialog</b></div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/b884b1c5-af72-478f-abb7-dcd11f43dfcc/36e3d982-dd7c-4d87-8c9f-6856142f5558.png" style="height: auto;"/></div>
<div><br/></div>
<div>2. In Overview check <b>Supports a Label</b></div>
<div><br/></div>
<div>3. Create a <b>Web File</b> using the latest Angular javascript (<a href="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.js">http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.js</a>)</div>
<div><br/></div>
<div>4. Create a <b>Web File</b> called <b>angularDialog.js</b> with the following contents:</div>
<div><script src="https://gist.github.com/413513cf6d09601a2831ef8ad305c42f.js"></script></div>
<div><br/></div>
<div>5. Add both scripts (as <b>Script Tag in HTML</b>) in order to <b>Included Scripts</b> in the <b>Behaviour</b> tab of your Coach View</div>
<div><br/></div>
<div>6. Add the following CSS to the <b>Inline CSS</b> in the <b>Behaviour</b> tab of your Coach View:</div>
<div><script src="https://gist.github.com/8432fd8a9af2ad36cfdbde2a2b3668a2.js"></script></div>
<div><br/></div>
<div>7. Add the following Javascript to the <b>Load Event Handler</b> in the <b>Behaviour</b> tab of your Coach View:</div>
<div><script src="https://gist.github.com/630fad9478792567b4b22860e24f1d74.js"></script></div>
<div><br/></div>
<div>8. Add the following Javascript to the <b>Change Event Handler</b> in the <b>Behaviour</b> tab of your Coach View:</div>
<div><script src="https://gist.github.com/b54a6b6da49287066c8ac046181d414f.js"></script></div>
<div><br/></div>
<div>9. Create a <b>Boolean Business Variable</b> called <b>visible</b> (just as you did with the jQuery Custom Coach View)</div>
<div><br/></div>
<div>10. Create a similar Layout to the jQuery Custom Coach View using the following markup (spread over two Custom HTML controls with a Content Box in the middle):</div>
<div><script src="https://gist.github.com/c1ea5e2e59531f7248bace2959851f1c.js"></script></div>
<div><br/></div>
<div>11. Embed the Custom Coach View in a Coach in your Human Service</div>
<div><br/></div>
<div>I tried to replicate the design of Neil’s jQuery control (i.e. using a Content Box sandwiched between to Custom HTML controls) but this isn’t a natural fit with the way that either UI Bootstrap or Angular Material work (they either use inline content or external URLs, not existing DOM nodes). This is a real shame because both of those frameworks are very cool. I hope to write another blog when I figure out the best practices and how these rich UI frameworks can be better leveraged.</div>
<div><br/></div>
<div>I believe that v8.5.7 provides better support and integration for all things Angular. I have been playing around with v8.5.5 (which can be a little quirky in the Case Designer web-based IDE).</div>
<div><br/></div>
What Can You Do With WebSphere Log Codes?https://garyjoy.postach.io/post/what-can-you-do-with-websphere-log-codes2016-05-09T21:04:54.277000Z2016-05-09T20:05:23ZGary Joy<div>I’m finally getting back into IBM BPM and it seems that my memories of slow-boating along the Mekong River have squeezed out one or two things that I used to know inside-out. Evernote is my favourite solution to this problem and it’s my hope that this post will serve as a reminder to someone else one day.</div>
<div><br/></div>
<div>I’ve been playing around with an IBM BPM virtual machine and with my usual obsession around digital cleanliness I wanted to get the Process Server startup time down to long enough to make a cup of tea (rather than having time to drink it as well).</div>
<div><br/></div>
<div>I’m a big fan of operational visibility <a href="http://garyjoy.postach.io/post/application-logging-in-ibm-bpm-using-splunk">using tools like Splunk</a> and (prior to visiting Laos) have built reports to provide good visibility of key operational metrics.</div>
<div><br/></div>
<div>In this instance I don’t have Splunk installed (yet) and I just want to get the total startup time from the logs.</div>
<div><br/></div>
<div>It turns out that IBM are <a href="http://www.ibm.com/support/knowledgecenter/?lang=en#!/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/welc_ref_trb_msg.html">nicely disciplined around log codes</a> and that WebSphere churns out some entries that <a href="http://www.ibm.com/support/knowledgecenter/#!/SSAW57_8.5.5/com.ibm.websphere.messages.doc/com.ibm.ws.runtime.runtime.html?cp=SSAW57_8.5.5%2F1-18-8-459">contain the information that I need</a>.</div>
<div><br/></div>
<div>The files that I’m interested in are in the <b>install_root/profiles/profile_name/logs/server_name</b> directory and called <b>SystemOut.log</b>, <b>SystemErr.log</b>, <b>startServer.log</b> and <b>stopServer.log</b>.</div>
<div><br/></div>
<div>I can watch the logs in Windows using a simple PowerShell command:</div>
<div><br/></div>
<div><span style="font-family: 'Courier New';">Get-Content -Path C:\IBM\WebSphere\AppServer\profiles\qbpmaps\logs\server1\SystemOut.log -Tail 1 –Wait</span></div>
<div><br/></div>
<div>I’m really only interested in the following entries...</div>
<div><br/></div>
<ul>
<li><span style="font-size: 11px;"><i>[5/5/16 22:03:09:906 EST] 00000001 ManagerAdmin I <b>TRAS0017I</b>: The startup trace state is *=info.</i></span></li>
<li><span style="font-size: 11px;"><i>[5/5/16 22:07:44:093 EST] 00000001 WsServerImpl A <b>WSVR0002I</b>: Server server1 open for e-business</i></span></li>
<li><span style="font-size: 11px;"><i>[11/29/15 4:37:41:297 EST] 00000038 ServerCollabo A <b>WSVR0024I</b>: Server server1 stopped</i></span></li>
</ul>
<div><br/></div>
<div>So I can run...</div>
<div><br/></div>
<div><span style="font-family: 'Courier New';"><i>Get-Content -Path C:\IBM\WebSphere\AppServer\profiles\qbpmaps\logs\server1\SystemOut.log | where { $_ -match “WSVR0002I|TRAS0017I" }</i></span></div>
<div><br/></div>
<div>This is all very basic but it was enough for me to quickly learn that giving my VM 8Gb or RAM instead of 4Gb was enough to reduce the startup time by 25%.</div>
<div><br/></div>
<div>Hopefully it’s an easy exercise for the reader to see how much value could easily be added using a tool like Splunk e.g.</div>
<div> </div>
<ul>
<li>Generate alerts when the server stops.</li>
<li>Automatically generate server uptime charts and statistics.</li>
<li>Report on error frequency (grouped by code).</li>
</ul>
<div><br/></div>
<div><i>NOTE: I don’t work for Splunk but I do think it’s awesome. I’m reasonably confident that Sumo Logic (and probably a bunch of other tools) could do all of this just as easily. I’m pitching the approach, not the tools.</i></div>
<div><br/></div>
<div>Here’s a table (that I will endeavour to add to - please make suggestions in the comments) of noteworthy log entry codes:</div>
<div><br/></div>
<table style="-evernote-table:true;border-collapse:collapse;width:100%;table-layout:fixed;margin-left:0px;">
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div><b>Code</b></div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div><b>Description</b></div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>TRAS0017I</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>The Process Server has <i>started</i> starting.</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>WSVR0002I</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>The Process Server has <i>finished</i> starting.</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>WSVR0024I</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:50%;">
<div>The Process Server has stopped.</div>
</td>
</tr>
</table>
<div><br/></div>
Achieving Cognitive Business Operations with IBM Smarter Processhttps://garyjoy.postach.io/post/achieving-cognitive-business-operations-with-ibm-smarter-process2016-03-29T21:06:53.799000Z2016-03-29T21:03:55ZGary Joy
<div>
<div>If you’re not already aware, you can watch many of the sessions from IBM Interconnect over at IBM GO (<a href="https://ibmgo.com">https://ibmgo.com</a>). I’d encourage anyone with an interest in IBM BPM (or even just BPM) to take a look at the Business Process Keynote (Achieving Cognitive Business Operations with IBM Smarter Process) from the conference last month.</div>
<div><br/></div>
<div>(Free) Registration is required for IBM GO but the actual videos are hosted on YouTube.</div>
<div><br/></div>
<div>Here’s a direct link to the keynote:</div>
<div><br/></div>
<div><iframe width="480" height="270" src="https://www.youtube.com/embed/YwBD7pNxCNQ?feature=oembed" frameborder="0" allowfullscreen></iframe></div>
<div><br/></div>
<div>It’s 60 minutes long. The first half contains some customer stories. You can jump in around 25:30 if you just want to pickup the keynote part.</div>
<div><br/></div>
<div><i>You really need to watch the video before you read any more...</i></div>
<div><i><br/></i></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/5ee61327-3308-4342-87e9-b7f890c59451/68803764-759a-40b4-9932-4af9bf27473f.png" style="height: auto;"/></div>
<div><br/></div>
<div>It’s an interesting and thought-provoking pitch. I studied artificial intelligence at university and it’s been on my job wish list for many years. On one hand I was a little disappointed at the lack of sophistication but upon reflection I think that <a href="https://en.wikipedia.org/wiki/Weak_AI">Weak AI</a> is very much where technology is right now and that the modularised architecture tied together with a common (albeit proprietary) platform is actually quite a compelling offering.</div>
</div>
<div><br/></div>
<div>It almost feels like an challenge for companies to see what they can do with it. It’s my view that this kind of approach will make it easier for big companies to provide the same quality of customer experience that is usually associated with small companies (or allow small companies to become big companies without losing anything along the way).</div>
<div>
<div><br/></div>
<div>If you’re reading this and you’ve got this far you’ve obviously got five minutes to spare. Have a think about how “cognitive assistance" could improve your world (and post your ideas in the comments below).</div>
<div><br/></div>
<div>The last process that I worked on was delivering change into a data warehouse. Cognitive assistance in identifying changes (and specific components of changes) that warrant manual review would allow the knowledge workers to spend more time adding value and less time finding value to add.</div>
<div><br/></div>
</div>
<div><br/></div>
Knowing When to Take a Step Backhttps://garyjoy.postach.io/post/knowing-when-to-take-a-step-back2016-03-20T15:47:41.808000Z2016-03-20T15:32:35ZGary Joy
<div>
<div>Hello Again! I have another story for you. I’ll return to some more technical blogs soon. I’ve nearly got a job now...</div>
<div><br/></div>
<div>A couple of weeks ago I acquired a car; a Skoda Yeti. 50% of the cars I have ever owned have been handed down from my Dad. I’m not really into cars. I <i>am</i> into technology, gadgets and music. Project “In Car Music Experience" was underway long before I had even driven the car. It turns out that muscle memory applies equally to our brains and I instinctively found myself defining solutions in the same way that I would at work (as illustrated in this diagram by <a href="https://www.crisp.se/konsulter/henrik-kniberg">Henrik Kniberg</a>).</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/40f74533-68ec-4745-9403-36d6108a8e03/c2f21d4e-deb1-4c5e-9ba5-6d1f67c87bc2.jpg" style="height: auto;" alt="url.jpg"/></div>
<div><br/></div>
<div><br/></div>
</div>
<div>My initial analysis indicated that it would cost £300 to have bluetooth installed (by Skoda) and about £200 to install (myself, using parts from eBay and help from YouTube) some MDI connections. Here are my solutions (I have articulated all of this in retrospect, my OCD tendencies aren’t quite that severe yet):</div>
<div>
<div><br/></div>
<table style="-evernote-table:true;border-collapse:collapse;margin-left:0px;table-layout:fixed;width:100%;">
<tr>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:11.919831223628693%;">
<div><i>#</i></div>
</td>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:87.9746835443038%;">
<div><i>Solution</i></div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>1</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>Tune the radio and find six decent CDs (£0)</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>2</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>Obtain a 3.5mm audio cable and use my iPhone (£5)</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>3</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>Obtain (and fill with music) an SD card (£20)</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>4</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>Install an MDI connection (£200)</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>5</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:33.33%;">
<div>Have bluetooth installed (£300)</div>
</td>
</tr>
</table>
<div><br/></div>
<div>Now the first two solutions are pretty trivial but they sufficed for a few days. The third solution was really my <a href="https://en.wikipedia.org/wiki/Minimum_viable_product">MVP</a>, there is a decent touchscreen interface in the car and there is no need to plug and unplug things every time I get in and out the car.</div>
<div><br/></div>
<div>Fast forward a few weeks and the last two solutions are still on my backlog (I’d recommend <a href="https://www.omnigroup.com/omnifocus">OmniFocus</a> but the tool is far less important than the discipline around it’s use). I’m happy with my current experience and there’s a decent chance that I’ll change cars before these solutions are picked up. </div>
</div>
<div><br/></div>
<div>The stereo system in the car is only capable of playing MP3s (opposed to AAC etc). I have more than enough MP3s to fill the SD card (the capacity of which is also limited by the stereo system) but they are intermingled with non-MP3 files on my computer. In solving this problem, I trod a path that I’m sure many people can relate to...</div>
<div>
<div><br/></div>
<div>I turned to Google in an attempt to find a terminal command that would copy all of the MP3 files and folder hierarchy under a specified directory. I ventured well beyond the first page of search results but still couldn’t find anything that fitted my exact requirements. I was convinced it was possible but it was just out of reach, given my limited knowledge of terminal commands.</div>
<div><br/></div>
<div>At this point, I figured I had three options:</div>
</div>
<div><br/></div>
<div>1. Manually copy the files.</div>
<div>2. Keep searching for (and trying) terminal commands that might do what I want.</div>
<div>3. Take a step back. Fill the required gaps in my knowledge such that I can work out how to solve the problem myself.</div>
<div><br/></div>
<div>I can’t claim to have immediately and without hesitation taken a step back but I did get there eventually.</div>
<div>
<div><br/></div>
</div>
<div>In my view, good companies encourage employees (and empower managers to encourage employees) to take a step back. It’s my experience that the best people have a far greater tendency to do so. </div>
<div><br/></div>
<div>...</div>
<div>
<div><br/></div>
<div>If you’re interested, the command was:</div>
<div><br/></div>
<div><i>find . -iname \*.mp3 -exec rsync -R {} /Users/Gary/Music/iTunesMP3/ \;</i></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
</div>
<div><br/></div>
Ingestible Data Facilitates Process Improvementhttps://garyjoy.postach.io/post/ingestible-data-facilitates-process-improvement2016-08-05T01:06:07.461000Z2016-03-07T17:24:08ZGary Joy
<div>
<div>I recently came across this gem on LinkedIn (the original source being TFL - <a href="http://content.tfl.gov.uk/walking-tube-map.pdf">http://content.tfl.gov.uk/walking-tube-map.pdf</a>)...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/073f63ed-2724-4897-aabd-08551a23abfd/f09a5141-2a42-4a69-8e2d-779523b4b079.jpg" style="height: auto;" width="1086" height="822"/></div>
<div><br/></div>
<div>It was particularly pertinent as I had just spent a day bouncing around London and I’m a little ashamed to say that <a href="https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm">Edsger Wybe Dijkstra</a> would be turning in his grave if he saw my solution to the <a href="https://en.wikipedia.org/wiki/Travelling_salesman_problem">Travelling BPM Consultant</a> problem.</div>
<div><br/></div>
<div>I spend more time than most thinking about the most effective way to go about my everyday life and it’s my view that the journey never ends and that the pursuit of increased effectiveness is a fun thing to do.</div>
</div>
<div> </div>
<div>From a content perspective, there’s nothing revolutionary in the visualisation above. In fact, it’s all pretty trivial and I could probably have filled in a few of those numbers myself. What I find interesting (with this and with any good visualisation) is that it puts the data at your fingertips and engenders further questions e.g.</div>
<div>
<div><br/></div>
<div><i>What are the average corresponding tube journey times?</i></div>
<div><i>What are the average transfer times between lines at all multi-line stations?</i></div>
<div>
<div><br/></div>
<div>One day (happy to take wagers on this) you’ll be able to ask Siri:</div>
</div>
<div><br/></div>
<div><i>What’s likely to be the quickest way for me to get to my meeting at Ludgate Hill?</i></div>
<div><br/></div>
</div>
<div>And, of course, the answer will depend on the weather.</div>
Wireless Signal Quality on a Machttps://garyjoy.postach.io/post/heres-one-i-wrote-earlier-im-in-laos2016-03-07T17:26:17.902000Z2016-01-17T10:40:48ZGary Joy
<div>
<div>Towards the end of my time in Sydney I was dependent on a budget Internet connection provided via a cheap, five year old modem/router to which I had no physical access.</div>
<div><br/></div>
<div>I’ll skip over the first-world complaints and jump straight to the (hopefully) helpful bit, how you can easily check the quality of your connection to a wireless network (from a Mac). This approach didn’t immediately jump out from my Google searches, probably because there are many other factors (e.g. channel selection) that can impact your overall experience that are more likely to be the source of your problem.</div>
<div><br/></div>
<div>You need to launch the <b>Wireless Diagnostics</b> application...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/d3a8a1cd-eabf-4e32-9d6c-3219a34a5f84/eabe93e8-71ba-4efd-82d6-e0067f862fa2.png" style="height: auto;"/></div>
<div><br/></div>
<div>You don’t actually want this, you want the <b>Performance</b> utility that it gives you access to...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/d3a8a1cd-eabf-4e32-9d6c-3219a34a5f84/6d6b4e42-c7ec-41b1-a7b5-5b8f3759bad9.png" style="height: auto;"/></div>
<div><br/></div>
<div>If you let this run for a while you should see something like this...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/d3a8a1cd-eabf-4e32-9d6c-3219a34a5f84/051e45c7-0e8b-4064-b548-20b228f6c074.png" style="height: auto;"/></div>
<div><br/></div>
<div>Google will be able to tell you more about what these all mean but for now you should just focus on <b>Quality</b>. The value really needs to be more than 30. If it is less than this your Internet experience will almost certainly suffer.</div>
<div><br/></div>
<div>It’s interest to wander around (assuming you have a laptop) and see how this value changes.</div>
<div><br/></div>
<div>Wireless network configuration used to be a mystery known only to network engineers. It has become a little more accessible to the technically savvy but, in my view, still has a little way to go...</div>
<div><br/></div>
</div>
<div><br/></div>
Changing Employment Providershttps://garyjoy.postach.io/post/changing-employment-providers2015-12-31T03:43:10.998000Z2015-12-31T03:42:39ZGary Joy
<div>
<div>Not that long ago (or maybe I’m getting old) you (as a consumer of almost any ongoing service / goods) had to frequently change suppliers in order to get the best deal. The boards of companies imposed narrow minded KPIs on their executives with a heavy focus on new customer numbers and the result was often that new customers (e.g. of an energy supplier) ended up getting a much better deal than loyal, longstanding customers. Things seem to have righted themselves at least a little in recent years and the current focus seems to be more around customer satisfaction.</div>
<div><br/></div>
<div>Sadly, this shift (which I am considering to be a Very Good Thing) hasn’t propagated very deeply into the world of employment. Specifically, it often seems necessary to change jobs in order to secure the best salary or career prospects. Even worse (in my opinion - because it demonstrates acknowledgement of exploitation) is when you secure a superior job only to have your current employer offer to “match" the offer.</div>
<div><br/></div>
<div>If you (as an employer) aren’t adjusting your employees salary on a yearly basis in line with cost of living changes in the region that operate or changes in the market then you are failing (as a company if you can’t afford it and as an employer if you can). I’m not talking here about pay rises. These are something else and should generally correspond to an increases in capability or a change in role and responsibility.</div>
<div>
<div><br/></div>
</div>
<div>I really believe that everyone wins in this scenario. The employee feels valued and is paid what they’re worth (rather than as little as the employer can get away with). The employer has a happy (and consequently more productive) employee as well as a reputation that will give them access to the best employees.</div>
<div><br/></div>
</div>
<div>It makes me very sad every time I hear about companies only conceding to a salary adjustment when the employee has gone through the process of finding a new job. I would encourage anyone that takes the time to read my blog to take a look at the Netflix Culture Deck (<a href="http://www.slideshare.net/reed2001/culture-1798664">http://www.slideshare.net/reed2001/culture-1798664</a>). It’s a great example of how successful companies view their employees.</div>
Super Chickenshttps://garyjoy.postach.io/post/super-chickens2015-12-05T08:05:36.989000Z2015-11-24T06:17:10ZGary Joy<div>So... I'm moving back to the UK (early next year) and I find myself reflecting on my time in Australia. I often shrug off enquiries about working in Australia with something along the lines of "work is work, wherever you are in the world" and, while that's kinda true, my experiences in Australia have helped to shape my view of how to achieve success at work.</div>
<div><br/></div>
<div>I recently watched a TED Talk about "Super Chickens":</div>
<div><br/></div>
<div><iframe width="480" height="270" src="https://www.youtube.com/embed/Vyn_xLrtZaY?feature=oembed" frameborder="0" allowfullscreen></iframe></div>
<div><br/></div>
<div>It really resonated with me and I feel that the team I am leaving is a very good example of these theories in practice.</div>
<div><br/></div>
<div>Our team comprises six individuals. Each with a voice, an opinion and experience to bring to bear. We each have different preferences and motivations but, like most people, we want to do a good job because it gives meaning to our efforts.</div>
<div><br/></div>
<div>As I look back over the last few months I can easily pick out times when the team has helped to steer itself, where one individual with a good vision has taken counsel from the team and delivered something great.</div>
<div><br/></div>
<div>These things are also true of my basketball team out here as well. Three years ago we were a very tenuously connected bunch of guys that liked basketball but now we're a tightly knit group of friends. Much as Lebron's Fab Five exceeded the sum of their parts, our chemistry regularly helps us win matches that we might not otherwise.</div>
<div><br/></div>
<div>I'm optimistic that this is a global trend and not just an Australian thing. I hope to become part of a great team in the UK and my decision making process will reflect this priority.</div>
Riding an XSLT Bikehttps://garyjoy.postach.io/post/riding-an-xslt-bike2016-08-05T01:06:07.582000Z2015-11-11T05:39:36ZGary Joy<div>I might be the only one but I've always found that XSLT is <i>nothing like</i> riding a bike; either I've been doing it lately and it's my friend or I haven't and it makes my head hurt.</div>
<div><br/></div>
<div>I'm kinda into XML as a data transport format (JSON is cool too) right now. We've been writing transforms to produce some user friendly windows into our data warehouse CI process.</div>
<div><br/></div>
<div>Not for the first time in my life, I find my self constrained to v1.0 but wanting to do some stuff that's much easier in v2.0. Hopefully the example below will help someone out one day (even if it's me in a year or two)...</div>
<div><br/></div>
<div>I want to create a simple table from the following XML:</div>
<div><br/></div>
<div><script src="https://gist.github.com/a207b16ce2843c5a685b.js"></script></div>
<div><br/></div>
<div>I want to replace "Gary" with "John" and I want to inject links to the (conveniently) wrapped file names.</div>
<div><br/></div>
<div>Here's my transform:</div>
<div><br/></div>
<div><script src="https://gist.github.com/d85e9b33356c3abc6851.js"></script></div>
<div><br/></div>
<div>Here's (a screenshot of) the output:</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/87e0f533-074a-4dc5-89f6-b49378fb107b/e3dbcd79-933a-416e-94e4-4c81c27805ee.png" style="height: auto;"/></div>
<div><br/></div>
<div>The following are worth pointing out:</div>
<div><br/></div>
<div>1. The use of "copy-of" (instead of "value-of") whenever my "thing" contains markup that I want to keep as markup</div>
<div>2. The use of "xsl:attribute name=" to allow me to inject values into node attributes</div>
<div>3. The use of recursion for multiple replacements</div>
<div>4. The use of variables (in "tidyUp") to stack transformations</div>
Writing Automated Tests is a Learned Skillhttps://garyjoy.postach.io/post/writing-automated-tests-is-a-learned-skill2015-10-16T04:11:33.641000Z2015-10-16T03:24:00ZGary Joy<div>The chart below represents the first 800 builds of our process automation tool set (around six months work). The green dots represent the number of test cases passing for each build and the red vertical lines indicate that a build has failed one or more test case.</div>
<div><br clear="none"/></div>
<div>We try and do test driven development but it’s usually just on a local branch so the way I choose to think about this chart (which is from our build server) is that every red line is an instance in which automated testing has made my life easier. There are over 200 red lines. That's +200 in our Delivery Balance Sheet. Our current unit test coverage is 91%.</div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/4d19bf45-8f3b-46d0-8712-3355c4c5fae8/c274e0de-a1b8-443c-8ede-a8017bb4daf3.png" style="height: auto;"/></div>
<div>In the last six months I have learnt a lot (by experience - always the best way) about writing unit tests and next time I’m interviewing someone (for a vaguely relevant role) I will definitely ask a question about how how to write good unit tests. I hope that the answer will demonstrate experience rather than just knowledge.</div>
<div><br clear="none"/></div>
<div>Anyway, to the useful bit. There’s a bunch of stuff on the Internet about Mocking in Python (lots of it good too) but, as a complete beginner I had to fumble about a little to i. get it working and ii. do it properly. The code below demonstrates a simple class and an associated unit test.</div>
<div><br clear="none"/></div>
<div><script src="https://gist.github.com/920b3cfdc2c9a7be2bb2.js"></script></div>
<div><br clear="none"/></div>
<div><script src="https://gist.github.com/1e3679c58d0b5c726c28.js"></script></div>
<div><br clear="none"/></div>
<div>I'd like to quantify the exact point at which point during the last six months the time and effort spent on unit tests became justified by the time saved on defect fixing but any attempt would be a little contrived.</div>
<div><br clear="none"/></div>
<div>Instead I’ll pitch it this way:</div>
<div><br clear="none"/></div>
<div>I (and the members of my team) are significantly happier working in an environment with comprehensive unit tests in place. I feel confident to develop and refactor code as necessary to ensure that my current design is the best it can be for my current understanding of the requirements.</div>
<div><br clear="none"/></div>
<div>I have confidence (and take pride) in the new code that we develop and writing unit tests has truly become just a part of development. I know that I am more than a little late to the party but I’m pretty sure that I’m not the only one. If I have learnt three things over the last six months they are that:</div>
<div><br clear="none"/></div>
<div>Quality centric features are essential in technology selection.</div>
<div>Automated unit tests make developers happy.</div>
<div>Happy developers make everyone else happy.</div>
<div><br clear="none"/></div>
<div>Go and write some automated unit tests. Keep trying to get better at it. It will make you happy.</div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
Gamification of the Magic Quadranthttps://garyjoy.postach.io/post/gamification-of-the-magic-quadrant2015-10-16T03:31:09.732000Z2015-08-19T03:35:22ZGary Joy<div>The figure below charts the development (in the eyes of Gartner) of six leading BPMS from 2009 through 2015.</div>
<div><br clear="none"/></div>
<div>Can you identify which line belongs to which vendor? If you can get more than four (without cheating and without using the clue at the bottom of this page) you’re officially a BPM expert and, if I don’t already know you, I’d love to catch up for a coffee sometime.</div>
<div><br clear="none"/></div>
<div><img src="https://cdn-images.postach.io/683c13c5-711f-46f7-b6f3-62cfbfe5f98c/ff19cd60-4590-48f5-a5bb-6a56d422aa92/33c01132-83e4-48ae-aed1-84547cbd05a1.png" style="height: auto;"/></div>
<div>This is just intended as a bit of fun. I’m aware that this view of the data may be so fundamentally flawed (definitions change every year) that it’s useless but I have a curious mind (and I spend two hours a day on a bus). </div>
<div><br clear="none"/></div>
<div>Green’s obviously a good one, dancing around in the winners corner. Red looks like the one to watch, maybe I should get into Red. The rest of them all seem to be heading down (towards Visionary).</div>
<div><br clear="none"/></div>
<div>My interpretation of this trend is that the vendors are doing stuff (a bunch of which is probably good) but they aren’t making it succeed and, critically, they aren’t bringing their customers along with them on their vision.</div>
<div><br clear="none"/></div>
<div>This brings me to my point. BPM should be a verb and not a noun. The S in BPMS is the least important letter. If a company tells you that they <strong>have</strong> BPM (rather than they <strong>do</strong> BPM) then you have found your first problem to solve.</div>
<div><br clear="none"/></div>
<div>I generally claim the job title of BPM Consultant and I haven’t really touched a BPMS in the six months since starting my current role. Despite that fact, I entirely consider the work I’m doing to be BPM and I consider what’s been achieved so far to have been a real success, with regular tangible benefits having been delivered. We will get to the S when it distills its way up our backlog.</div>
<div><br clear="none"/></div>
<div>I think that’s enough text to keep the clue off the page. The BPMS are Appian, IBM, Oracle, Pega, Software AG and Tibco.</div>
Naming Snapshots in IBM BPMhttps://garyjoy.postach.io/post/naming-snapshots-in-ibm-bpm2015-08-14T03:29:29.388000Z2015-08-14T03:23:26ZGary Joy<div><div style="font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div style="color: #000000; font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">I have recently enjoyed the “put your money where your mouth is" experience of leading some greenfield process improvement work and it’s my newly held view that best practices work best when they're baked into the way that everyone on the team thinks (otherwise it’s too hard to remember everything).</span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">I want to make some suggestions around version (snapshot) labelling in IBM BPM based on my own experience: </span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Use a three numbered approach e.g. x.y.z (majorVersion.minorVersion.snapshotCounter).</span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Try and define versions from a business perspective (e.g. create a new major/minor version for a set of features).</span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">*Always* stick to the convention. For every single snapshot.</span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Treat the description as you would a commit message (<a shape="rect" href="http://chris.beams.io/posts/git-commit/">http://chris.beams.io/posts/git-commit/</a>).</span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Put some explicit logging into your deployment services so that you can keep track of deployment dates and times across environments (you are using something like Splunk aren't you?).</span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Some branching-based scenarios:</span><br clear="none"/><br clear="none"/><em><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Scenario 1</span></em><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Imagine that you release 1.1.59 into Production.</span><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">You then start working on 1.2.1 for your next release.</span><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">A defect is discovered that needs to be addressed immediately so you create a hotfix ("1.1") branch from 1.1.59 and call the next snapshot 1.1.60 (making sure that you implement any fixes in the main branch as well).</span><br clear="none"/><br clear="none"/><em><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Scenario 2</span></em><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">You have finished development on 1.2.19.</span><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">The next version has some big changes in so you create a "1.2" branch to support testing etc. while the new work (on 2.0.1) continues in the main branch.</span><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">Fixes in the "1.2" branch must also be made in the main branch.</span><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">When "1.2" (let's say it's 1.2.24) goes into production you should archive any old branches (e.g. "1.1").</span><br clear="none"/><br clear="none"/><span style="font-family: verdana, helvetica, sans-serif; font-size: 14px;">There's a bunch of stuff on the Internet (e.g. <a shape="rect" href="http://semver.org/">http://semver.org/</a>) about all of this.</span></div></div>
</div>How Not To Become a Blinkered Gatekeeperhttps://garyjoy.postach.io/post/how-not-to-become-a-blinkered-gatekeeper2015-08-14T03:30:30.949000Z2015-07-22T07:05:08ZGary Joy<div>I received this in an e-mail recently:<br clear="none"/><br clear="none"/><em>"Automated deployment to Production in ???? will never be allowed and ???? security policies also enforce that only administrators can perform ???? changes to Production."</em><br clear="none"/><br clear="none"/>My desk neighbour was the recipient on the ensuing rant but I want to do more than rant here. I want to understand how I can make sure that I never become the sender of that e-mail.<br clear="none"/><br clear="none"/>[In my opinion] The rate of technology-driven change in all aspects of our lives is increasing. To draw parallels between our mechanical evolution and technological evolution I would estimate my phone reminding me to buy milk when I go to the store is the equivalent of a crudely fashioned bronze blade. <br clear="none"/><br clear="none"/>There are some famous quotes in recent history for which retrospect has demonstrated that it is not wise to use the word "never". I think it's much safer to just assume that everything will change over time.<br clear="none"/><br clear="none"/>If you've ever spent time trying to solve complex (e.g. <a shape="rect" href="https://en.wikipedia.org/wiki/NP-hard" target="_blank">https://en.wikipedia.org/wiki/NP-hard</a>) problems you've probably learned the hard way that how you define your objectives (e.g. your fitness function) is at least as important as the computing power you put into finding a solution. The same is true of less abstract, real-world problems.<br clear="none"/><br clear="none"/>I think that the sender of the e-mail above has some very legitimate objectives but that they have tightly coupled their problem and it's solution. I guess that's what I need to try and avoid...</div>
Blogging is Hardhttps://garyjoy.postach.io/post/blogging-is-hard2015-07-22T07:06:34.434000Z2015-07-22T07:04:26ZGary Joy<div>Some new work projects have taken priority for the last few months but I'm pleased to report that my day job has settled into a decently-oiled machine and, hopefully, I can get back into to it now.<br clear="none"/><br clear="none"/>There may be less of a focus on IBM BPM (I've been doing Data Warehouse DevOps for the last few months) which will probably lose me 80% (four) of my readers but that's OK.</div>
Three Challenges facing BPMhttps://garyjoy.postach.io/post/three-challenges-facing-bpm2015-03-05T14:02:18.896000Z2015-01-28T04:55:33ZGary Joy<div>I originally wrote this over two years ago but never got around to posting it. It's mildly depressing that it's still pretty pertinent today:</div>
<div><br/></div>
<div><strong>1. Placing greater emphasis on the business process</strong></div>
<div><br/></div>
<div><strong>Opinion</strong></div>
<div><br/></div>
<div>In an ideal world, business processes would be thoughtfully and iteratively reviewed by any and all stakeholders. Modeled processes should reflect the operational realities of an organisation but also capture any process aspirations and goals.</div>
<div><br/></div>
<div><strong>Challenge</strong></div>
<div><br/></div>
<div>The challenge is to not "finish" capturing the business process too soon (if at all) but to retain a focus on it at all times. The business process should be a primary factor in any technical (e.g. architecture, implementation) decisions that are made.</div>
<div><br/></div>
<div><strong>Mistake</strong></div>
<div><br/></div>
<div>One of the most common mistakes that I see are business process diagrams that can’t readily be understood and leveraged by business users.</div>
<div><br/></div>
<div><strong>Comparison</strong></div>
<div><br/></div>
<div>I would argue (based on experience) that an excellent Process Architect and mediocre Developers will produce something with a higher ROI (if that's the ultimate measure of BPM success) than a mediocre Process Architect and excellent Developers.</div>
<div><br/></div>
<div><strong>2. Establishing and nurturing process ownership</strong></div>
<div><br/></div>
<div><strong>Opinion</strong></div>
<div><br/></div>
<div>The business process (including it’s tangible representation on a BPM platform) should be wholly owned by the process owner. Process owners mustn’t be reluctant participants in BPM activities and their involvement and interest should not dwindle over time.</div>
<div><br/></div>
<div><strong>Challenge</strong></div>
<div><br/></div>
<div>The challenge is to implement a cultural change whereby the business processes *belong* to a process owner and where the process owners lead any discussions about changes to the business process. It is critical that appropriate and empowered process owners are engaged.</div>
<div><br/></div>
<div><strong>Mistake</strong></div>
<div><br/></div>
<div>You are not making the most of BPM when the process owner does not drive and is not directly engaged in changes (however small) to the business process.</div>
<div><br/></div>
<div>Equally, you are not a "process owner" if it's just an arbitrary label that's hesitantly or reluctantly assigned to an individual at the start of a BPM project.</div>
<div><br/></div>
<div><strong>Comparison</strong></div>
<div><br/></div>
<div>I would argue that an engaged process owner with a non-optimal process will enjoy an easier life (especially as time passes) than a disinterested process owner with a process that has been "optimised" by a third-party (e.g. an Implementation Team).</div>
<div><br/></div>
<div><strong>3. Leveraging the benefits of BPM platforms</strong></div>
<div><br/></div>
<div><strong>Opinion</strong></div>
<div><br/></div>
<div>BPM Platforms are inherently collaborative and intentionally agile. It takes literally seconds to start mapping processes and, in most cases, only minutes to build simple user interfaces. You should be making regular and non-trivial changes to your processes (especially during the early stages).</div>
<div><br/></div>
<div><strong>Challenge</strong></div>
<div><br/></div>
<div>The challenge is to help the stakeholders understand that their role has changed. They are now active and ongoing participants in defining and building the operational tools of the business. Their role is no longer just to review but to contribute.</div>
<div><br/></div>
<div><strong>Mistake</strong></div>
<div><br/></div>
<div>If early process mapping or user interface prototyping sessions yield few changes then either these sessions have been over-prepared (and the wrong people have been making decisions) or the stakeholders haven’t been properly engaged and they think that they've just seen a demo, rather than a prototype (a subtle but important distinction).</div>
<div><br/></div>
<div>Placing too much pride in a prototype is a common mistake for Developers.</div>
<div><br/></div>
<div><strong>Comparison</strong></div>
<div><br/></div>
<div>I would argue that quickly produced but discarded (or changed beyond all recognition) process diagrams and user interfaces can be more valuable than carefully constructed prototypes that evolve into the final solution.</div>Kick On Schedulehttps://garyjoy.postach.io/post/kick-on-schedule2015-08-14T03:38:31.101000Z2015-01-07T00:43:01ZGary Joy<div>It's been my experience that using IBM BPM is a little like solving a Rubik's Cube:</div>
<div><br clear="none"/></div>
<div>* Everyone can attempt it. <br clear="none"/>* Most people can achieve something that is pretty close. <br clear="none"/>* It's extremely cool when you nail it.<br clear="none"/>* Knowledge and discipline are the key to getting it right.</div>
<div><br clear="none"/></div>
<div>One such nugget of knowledge relates to performance in test environments:</div>
<div><br clear="none"/></div>
<div>A couple of months ago I was asked to investigate the fact that a UAT environment was "really slow". I opened with my well-rehearsed lines on how important it is to capture tangible metrics to measure performance. These were patiently received before I sat down with the testers and discovered that the environment was indeed really slow. Specifically it took a very long time for Instances to flow through the process and for the next Task to become ready (even thought there was very little else going on).</div>
<div><br clear="none"/>Fortunately, I had seen something similar before and it turned out to be the same thing. It’s definitely worth having a high level understanding of how the Event Manager works in IBM BPM.<br clear="none"/><br clear="none"/><a shape="rect" href="http://www-01.ibm.com/support/docview.wss?uid=swg21439613" target="_blank">http://www-01.ibm.com/support/docview.wss?uid=swg21439613</a><br clear="none"/><br clear="none"/><strong><span style="font-family: 'courier new', courier, monospace; font-size: 12px;">kick-on-schedule</span></strong><br clear="none"/><span style="font-family: 'courier new', courier, monospace; font-size: 12px;">When this parameter is set to true, a newly-scheduled task forces the Event Manager into an immediate poll of lsw_em_task, to reduce the time between when a new task is scheduled and when it will be executed. This parameter helps with latency - a newly-scheduled "right now" task is executed almost immediately - but hurts overall throughput, because the TaskLoader ends up being more active than it would be otherwise. If the kick-on-schedule is false, newly-scheduled tasks are not picked up until the next time the Event Manager polls lsw_em_task (up to the loader-long-period), which will increase latency. However it also increases overall throughput by reducing the chatter and contention on the lsw_em_task table For a system with heavily loaded Event Manager, this parameter should be set to false.</span><br clear="none"/><br clear="none"/>Tuning Performance is a big topic with many levers to operate and dials to read. But I maintain that knowledge and discipline are the key to getting it right.<br clear="none"/><br clear="none"/>It makes me sad that they lived with this for 12 months and yet it only took five minutes to address. It's also by no means the first time I've seen this type of thing (and sometimes the appropriate nugget of knowledge is far harder to come by). In this day and age (i.e. the Internet Age) the <a shape="rect" href="https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000002382&ps=25" target="_blank">IBM BPM forums</a> are home to a small but highly knowledgeable and very supportive group of individuals. If you use IBM BPM, I personally guarantee that reading / participating in the forums will make you better at your job.<br clear="none"/><br clear="none"/><br clear="none"/>NOTE: Go <a shape="rect" href="http://www.wikihow.com/Solve-a-Rubik%27s-Cube-%28Easy-Move-Notation%29" target="_blank">here </a>if you want to solve a Rubik's Cube or <a shape="rect" href="http://web.mit.edu/sp.268/www/rubik.pdf" target="_blank">here </a>if you want to understand how to solve a Rubik’s Cube.<br clear="none"/></div>
Tweaking Process Designerhttps://garyjoy.postach.io/post/ive-talked-about-this-before-but-the-more-i-use-non-bpm-ides-e-g-intellij-th2015-03-05T14:02:20.056000Z2014-12-12T05:08:52ZGary Joy<div><div>I've talked about this before but the more I use non-BPM IDEs (e.g. IntelliJ) the more frustrated I get with Process Designer. What's particularly disappointing is that stuff that Eclipse (which it is built on) is capable of is often locked down (e.g. the ability to detach views and run multiple windows across multiple monitors).</div>
<div><br/></div>
<div>I recently discovered (thanks to makvell on the IBM BPM forums) that there are a few Eclipse settings that you can change. If you press <b>Ctrl+Shift+L+L</b> you will get a slightly different Preferences Window to the one you get via the <b>File - Preferences</b> menu (if you've already opened <b>File - Preferences</b> you will need to restart Eclipse for <b>Ctrl+Shift+L+L</b> to work).</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/w600_dbe8d11e2b8861975b2adfae7a0b08f5.png" style="cursor: default;"/></div>
<div><br/></div>
<div>Using this window you can change the colour of Javascript comments, hide the grid background on Services, and expose the New Window functionality (this can cause it to get grumpy). I strongly suggest that you don't change the current theme.</div>
<div><br/></div>
<div>I think that the ability to detach views and run multiple windows across multiple monitors is the thing that I would like the most but my wish-list also includes:</div>
<div><br/></div>
<div>Improved Code Editors for Code (Javascript / HTML / CSS)</div>
<div>Formatting / Beautification (Code and Diagrams)</div>
<div>Quality Checking (i.e. Lint-style Tools)</div>
<div>Refactoring (Code and Diagrams)</div>
<div>Search (including Code)</div>
<div>In-Line Managed File Editors for Code</div>
<div><br/></div>
<div>This list is (intentionally) very developer-oriented. I will talk about business-focused improvements another day...</div>
<div><br/></div>
<div><br/></div><br/></div>You Get What You Pay Forhttps://garyjoy.postach.io/post/you-get-what-you-pay-for2015-03-05T14:02:20.590000Z2014-12-01T23:10:36ZGary Joy<div>I'm a big fan of all things Apple. It started many years ago when I began contracting and found myself in a position to choose my own devices. Over the years I have given them a fair amount of money and I'm very happy with what they've given me in return.</div>
<div><br/></div>
<div>It dawned on me recently (as I had some JayBird BlueBuds X Wireless Headphones replaced) that I have returned a bunch of stuff over the years (e.g. my first two iPhone 5s were replaced) but it hasn't really made a dent in my opinion of the brand. This is, in my view, entirely down to the after sales experience in Apple stores.</div>
<div><br/></div>
<div>This same mentality can be applied to the world of BPM consulting and delivery (just as it can to almost anything that is sold). Products and relationships transcend project timescales and, in the long run, it is better for both parties to take a holistic approach to provisioning.</div>
<div><br/></div>
<div>I know that pretty much anything I buy from an Apple store could be obtained cheaper elsewhere but I always go to Apple stores because what the extra money gets me is worth it to me. The BPM implementation / services industry has historically been dominated by project-based models but, led by companies like BP3 it feels like this is starting to change.</div>Javascript to Re-Assign a Task in IBM BPMhttps://garyjoy.postach.io/post/javascript-to-re-assign-a-task-in-ibm-bpm2016-09-03T18:56:10.679000Z2014-11-03T03:45:07ZGary Joy
<div>This is a quick one (and most people probably know it already). It's been a busy couple of weeks...<br/>
<br/>
Oftentimes, when testing processes in the development environment, you will need to use a series of user accounts to run different tasks. In an ideal world there will be test accounts that you can use (and the IDE will conveniently store the passwords for you) or you will just be able to use your own account to run any task.<br/>
<br/>
However, sometimes test accounts aren't permitted by an organisation and sometimes processes are modeled in such a way that process flow is impacted by group membership (so you can't really be in all groups).<br/>
<br/>
In these cases you can run a command like this in the in the Expression Evaluator to quickly re-assign a Task so that you can run it...<br/>
<br/></div>
<div><i>tw.system.reassignTask(12345, "USER:jsmith");</i><br/>
<br/></div>
<div>The Task ID (12345) can be read from the Task ID column in the Process Inspector and the User should be a value that would work with Custom Routing.</div>
<div><br/></div>
<div><br/></div>
<div><i>UPDATE (03.09.2106): In newer versions you can do the same thing with...</i></div>
<div><br/></div>
<div><i>tw.system.findTaskByID(12345).reassignTo("jsmith");</i></div>
Bookmarking in IBM BPM v7.5https://garyjoy.postach.io/post/bookmarking-in-ibm-bpm-v7-52015-03-05T14:02:21.960000Z2014-10-02T03:40:34ZGary Joy<div>I had a "prickly" PMR recently that pertained to the use of bookmarks in IBM BPM v7.5. It's not something that's really documented anywhere (or necessarily supported) but it is something that smart users will do and so it makes sense to i. understand how things work and ii. where possible, design solutions in such a way that users can work smart.</div>
<div><br/></div>
<div><strong>My Tasks (i.e. Saved Searches)</strong></div>
<div><br/></div>
<div>https://bpm.mycompany.com/portal/jsp/getSavedSearch.do?startsWith=0&search=5</div>
<div><br/></div>
<div>0 = what number (individual row) to start from</div>
<div>5 = search id (SEARCH_ID in LSW_SAVED_SEARCH) - will work even if you don't have access to the search</div>
<div><br/></div>
<div><em>Bookmarks generated from these links will not reference components in specific Snapshots and will work as the end users might expect when new snapshots are deployed.</em></div>
<div><br/></div>
<div><strong>My Scoreboards</strong></div>
<div><br/></div>
<div>https://bpm.mycompany.com/portal/jsp/viewScoreboard.do?id=2015.21545</div>
<div><br/></div>
<div>2015 = some kind of indicator that you're talking about a dashboard</div>
<div>21545 = FAVORITE_ID in LSW_FAVORITE</div>
<div><br/></div>
<div>As far as I can tell ITEM_TYPE in LSW_FAVORITE needs to be 13 for these links...</div>
<div><br/></div>
<div><em>Bookmarks generated from these links will reference components in specific Snapshots and will not work as the end users might expect when new snapshots are deployed. Even when the old snapshot is de-activated the links will still function (this was the subject of my "prickly" PMR) and point to the older snapshot.</em></div>
<div><strong><br/></strong></div>
<div><strong>My Projects</strong></div>
<div><br/></div>
<div>https://bpm.mycompany.com/portal/jsp/viewProjectPage.do?pageUrl=/jsp/runServiceLayout.jsp?processRef=/1.94dd71bd-da47-40e6-b6ef-0514386cbfec&favId=21516</div>
<div><br/></div>
<div>1.94dd71bd-da47-40e6-b6ef-0514386cbfec = ITEM_ID in LSW_FAVORITE and PO_ID in LSW_PO_VERSIONS (with "1." in front)</div>
<div>21516 = FAVORITE_ID in LSW_FAVORITE</div>
<div><br/></div>
<div>As far as I can tell ITEM_TYPE in LSW_FAVORITE needs to be 1 for these links...</div>
<div><br/></div>
<div><em>Bookmarks generated from these links will reference components in specific Snapshots and will not work as the end users might expect when new snapshots are deployed. When the old snapshot is de-activated the links will no longer function. When the old snapshot is not de-activated the links will continue to function but will still point to the older snapshot.</em></div>
<div><strong><br/></strong></div>
<div><strong>Manual URLs</strong></div>
<div><br/></div>
<div>https://bpm.mycompany.com/teamworks/executeServiceByName?processApp=[acronym]&serviceName=[service]&tw.local.myInput=[input]</div>
<div><br/></div>
<div>Take a look at the link below for more information on what [acronym], [service] and [input] should be.</div>
<div><br/></div>
<div><em>Bookmarks generated from these links will not reference components in specific Snapshots and may (they will reference the Default Snapshot) work as the end users might expect when new snapshots are deployed.</em></div>
<div><br/></div>
<div><hr/></div>
<div><br/></div>
<div>The following link provides some more information...</div>
<div><br/></div>
<div><a href="http://wiki.bpmwiki.com/display/commwiki/Lombardi+Edition+-+URLs+to+run+BPDs%2C+Services+and+Tasks">http://wiki.bpmwiki.com/display/commwiki/Lombardi+Edition+-+URLs+to+run+BPDs%2C+Services+and+Tasks</a></div>
<div><br/></div>Delayed Gratificationhttps://garyjoy.postach.io/post/delayed-gratification2015-08-18T03:51:33.809000Z2014-10-02T03:39:50ZGary Joy<div>I've always had an interest in social science. I think it's down to a particularly inspiring teacher at high school. In particular, I have always found the concept of delayed gratification (<a shape="rect" href="http://en.wikipedia.org/wiki/Delayed_gratification">http://en.wikipedia.org/wiki/Delayed_gratification</a>) to be a fascinating one and I really believe that almost any conceivable measure of success can be attributed in part to an approach or appreciation of delayed gratification.</div>
<div><br clear="none"/></div>
<div>In software development we need particular vigilance to reap the rewards of delayed gratification for two reasons:</div>
<div><br clear="none"/></div>
<div>1. There can be a significant amount of time between the instant gratification (e.g. "it works" or "I've finished") and the ultimate gratification of shipping a product that is robust and makes peoples lives better.</div>
<div><br clear="none"/></div>
<div>2. The instant gratification is more direct (i.e. it feels good to have finished or to demonstrate something) whereas the long term gratification can be indirect (i.e. the avoidance of a failed release or shorter testing cycles).</div>
<div><br clear="none"/></div>
<div>When I think of the best software developers that I have worked with it's always the ones that deliver these indirect benefits that I relish the idea of working with. </div>
<div><br clear="none"/></div>
<div>I would stress that this approach doesn't have to coincide with a reduction in innovation and I would encourage team leads and managers to make more noise about the indirect successes of their teams.</div>
<div><br clear="none"/></div>
<div><br clear="none"/></div>
An Overview of IBM BPMhttps://garyjoy.postach.io/post/an-overview-of-ibm-bpm2015-03-05T14:02:23.759000Z2014-09-18T05:46:38ZGary Joy<div><div>I gave a presentation the other day on IBM BPM. Here are my notes...</div>
<div><b><br/></b></div>
<div><b>1. BPM and BPMS</b></div>
<div><br/></div>
<div>Business process management (BPM) is a systematic approach to making an organization's processes more effective, more efficient and more capable of adapting to an ever-changing environment. A Business process management suite (BPMS) is a software platform on which BPM can be delivered.</div>
<div><br/></div>
<div><b>2. IBM BPM</b></div>
<div><br/></div>
<div>IBM BPM (formerly Lombardi Teamworks) is a BPMS. The following diagrams and text are intended to provide an overview of the architecture and key components of IBM BPM.</div>
<div><br/></div>
<div><table border="1" cellpadding="2" cellspacing="0" width="100%"><tbody><tr><td valign="top"><img src="https://cdn-images.postach.io/w600_68065b1f7956dd5c84ec71b96b20bdff.png" style="cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;"/><br/></td><td valign="top"><div>Each circle in the diagram above is a Server. There's a "special" Server (called the Process Center) that is for Development and all the others are Process Servers (e.g. UAT, Production). Process Applications are created on the Process Center and then (typically) pushed out sequentially to Process Servers (with Production being the last Process Server).</div></td></tr><tr><td valign="top"><img src="https://cdn-images.postach.io/w600_de523e7c6719788ae48cf452ceee2158.png" style="cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;"/><br/></td><td valign="top"><div>Each Server (Process Center or Process Server) comprises two main components, a Process Server (which does everything to do with Process i.e. most things) and a Performance Data Warehouse (which handles the performance data that's generated by the Process Server). Having a separate component for performance data helps to optimise the overall performance.</div>
<div><br/></div>
<div><i>NOTE: Please note the name-duplication of non-development servers (Process Server) and the process-related server component (Process Server).</i></div></td></tr><tr><td valign="top"><img src="https://cdn-images.postach.io/w600_7220f51e338bfb0ea7e41e15a40ea21b.png" style="cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;"/><br/></td><td valign="top"><div>Each Process Server (on a Process Center or a Process Server) comprises three main components, a BPD Engine, a Service Engine and an Event Manager. The whole thing is relatively stateless (everything lives in the database).</div>
<div><br/></div>
<div>The BPD Engine does all the orchestration work. It pushes cases (Instances) through the BPD models and hands off (via the Event Manager) work to the Service Engine. When these discrete chunks of work are complete, the Event Manager lets the BPD Engine know and it moves on to the next thing in the BPD.</div>
<div><br/></div>
<div>The Event Manager acts as a relay between the BPD Engine and the Service Engine. It picks up discrete pieces of work that are ready to run from the BPD Engine (e.g. System Tasks, Timers) and hands them over (complete with data etc.) to the Service Engine.</div>
<div><br/></div>
<div>The Service Engine is the part that actually does things. While the BPD engine provides the orchestration the Service Engine performs does all the tangible stuff e.g. sends E-mails, calls Web Services etc.</div></td></tr><tr><td valign="top"><img src="https://cdn-images.postach.io/w600_54a9f20e585b8dd9325376ce1ca319c7.png" style="cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;"/><br/></td><td valign="top"><div>Each Performance Data Warehouse (on a Process Center or a Process Server) comprises two main components, Tracking Data and Database Views.</div>
<div><br/></div>
<div>Tracking Data is created when the Performance Data Warehouse picks up data from the Process Server.</div>
<div><br/></div>
<div>Database Views sit on top of the Tracking Data and provide a richer data set for clients (typically reporting platforms e.g. Cognos).</div></td></tr><tr><td valign="top"><img src="https://cdn-images.postach.io/w600_6e8df2f816ae93943ee50212f1a071da.png" style="cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;cursor: default;"/>___________________________________</td><td valign="top"><div>Interacting with Process Centre / Process Server </div>
<div><br/></div>
<div><i>Process Designer (IDE)</i></div>
<div>Only present on Process Centers, the Process Designer is the Integrated Development Environment (IDE) for IBM BPM. It's where things are built. You would use the Process Designer to create a Business Process Diagram (i.e. to model a process) or an Integration Service (i.e. to connect to an external system).</div>
<div><br/></div>
<div><i>Process Center Console</i></div>
<div>Only present on Process Centers, the Process Center Console is where the things that are built are managed. You would use the Process Center Console to deploy a Process Application to a Process Server (e.g. to deploy into the UAT Environment).</div>
<div><br/></div>
<div><i>Process Portal</i></div>
<div>Present on both Process Centers and Process Servers, the Process Portal is where Users do things.</div>
<div><br/></div>
<div><i>Web-Sphere Console</i></div>
<div><br/></div>
<div>Application Server stuff e.g. defines JDBC connections, LDAP integrations etc.</div>
<div><br/></div>
<div><i>Admin Console (PS)</i></div>
<div><br/></div>
<div>Contains all the out-the-box administrations functions (e.g. Process Inpector, Manage EPVs etc.) and any user-defined Administration Services.</div>
<div><br/></div>
<div><i>Admin Console (PDW)</i></div>
<div><br/></div>
<div>There's very little to see here. It will tell you if there's a problem and give you some high level information about the volume of tracking data being generated.</div></td></tr></tbody></table><div><br/></div></div><div><i>NOTE: In the descriptions above, I have ignored Clustering. IBM are good at infrastructure. Suffice to say that the platform is tunable and scalable.</i></div>
<div><br/></div>
<div><b>3. Build a Simple Process</b></div>
<div><br/></div>
<div>At this point in a presentation I jumped into the product and built a simple process. It's surprisingly quick and easy to build something simple (yet surprisingly difficult to define real business processes simply - don't be oversold on what the platform does and doesn't do).</div><br/></div>The Value of Certificationshttps://garyjoy.postach.io/post/the-value-of-certifications2015-03-05T14:02:24.736000Z2014-09-03T05:54:22ZGary Joy<div>Here's a "checkpoint" question in some training material for an IBM BPM exam. It could easily be an exam question...</div>
<div><br/></div><b>True or False?</b><div><b><br/></b></div>
<div><b>In Business Process Manager, snapshots can be taken only in the Process Center.</b></div>
<div><b><br/></b></div>
<div>The stated correct answer is...</div>
<div><br/></div>
<div><b>False</b></div>
<div><b><br/></b></div>
<div><hr/></div>
<div><b><br/></b></div>
<div>I read this question a few times before I settled on an answer. It didn't quite feel right as a question (more on that shortly) but I ultimately assumed that it was asking me to demonstrate an understanding of the difference between a Process Center and a Process Server and the fact that artifacts are created on the former and pushed out (as snapshots) to the latter.</div>
<div><br/></div>
<div>So I answered True.</div>
<div><br/></div>
<div>In retrospect, what didn't feel right was the "in". With my line of thinking, it should have been an "on". However, the question didn't mean "Process Center" the <i>SERVER</i> it meant "Process Center" the <i>PORTAL</i>. In this case, "in" is right and the answer is false because you can also take snapshots in Process Designer (the IDE) and from the command line (using wasadmin).</div>
<div><br/></div>
<div>I know all of these things. I've lost count of the number of people that I've taught these things to over the years. I had found a peace between the duplicitous terms "Process Center" (which is both a Server and a Portal) and "Process Server" (which is both a Server and a component i.e. "the Process Center comprises a Process Server and a Performance Data Warehouse").</div>
<div><br/></div>
<div>I'm not really sure what my point is so I will settle on this...</div>
<div><br/></div>
<div>Asking people to talk in their own words about how something works provides a vastly superior insight (I concede it is more expensive) into knowledge and ability than a certificate. </div>
<div><br/></div>
<div>A corollary... </div>
<div><br/></div>
<div>If you are looking for a partner to work with you on your IBM BPM journey don't pick the guys that open with "all of our consultants are certified". Pick the guys that open with questions about your business processes or the ones that offer up real world examples of projects they have successfully delivered.</div>
<div> </div>A Brief History of IBM BPM (the BPMS formerly known as Teamworks)https://garyjoy.postach.io/post/a-brief-history-of-ibm-bpm-the-bpms-formerly-known-as-teamworks2017-11-01T19:41:29.005000Z2014-08-21T03:26:03ZGary Joy<div>August 2003 - v4.0 (Teamworks) Announced (<a href="http://www.ebizq.net/news/2573.html">link</a>)</div>
<div>October 2004 - v5.0 (Teamworks) Announced (<a href="http://www.businesswire.com/news/home/20041025005440/en/Lombardi-Software-Introduces-TeamWorks-5-Generation-BPM#.U_VujxH4Iqw">link</a>)</div>
<div>June 2005 - v5.5 (Teamworks) Announced (<a href="http://web.archive.org/web/20061026051305/http://www.lombardisoftware.com/press-release_6-6-05.php">link</a>)</div>
<div>May 2007 - v6.0 (Teamworks) Announced (<a href="http://web.archive.org/web/20070914054211/http://www.lombardisoftware.com/press-release_5-14-07.php">link</a>)</div>
<div>May 2009 - v7.0 (Teamworks) Announced (<a href="http://www.marketwired.com/press-release/lombardi-announces-teamworks-7-business-process-management-bpm-suite-1227393.htm">link</a>)</div>
<div><br/></div>
<div>Jan 2010 - IBM Acquires Lombardi (<a href="http://web.archive.org/web/20100318110438/http://www.lombardisoftware.com/ibm_acquires_lombardi.php">link</a>)</div>
<div><br/></div>
<div>April 2010 - v7.1 (Websphere Lombardi Edition) Announced (<a href="http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?subtype=ca&infotype=an&appname=iSource&supplier=897&letternum=ENUS210-154">link</a>)</div>
<div>October 2010 - v7.2 (Websphere Lombardi Edition) Announced (<a href="http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=an&subtype=ca&appname=gpateam&supplier=897&letternum=ENUS210-318">link</a>)</div>
<div>April 2011 - v7.5 (IBM BPM) Announced (<a href="http://www-01.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/2/897/ENUS211-092/index.html&request_locale=en">link</a>)</div>
<div>April 2012 - v8.0 (IBM BPM) Announced (<a href="http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?subtype=ca&infotype=an&appname=iSource&supplier=897&letternum=ENUS212-103">link</a>)</div>
<div>April 2013 - v8.5 (IBM BPM) Announced (<a href="http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?subtype=ca&infotype=an&appname=iSource&supplier=897&letternum=ENUS213-023">link</a>)</div>
<div>April 2014 - v8.5.5 (IBM BPM) Announced (<a href="http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=an&subtype=ca&appname=gpateam&supplier=897&letternum=ENUS214-141">link</a>)</div>
<div>February 2015 - v8.5.6 (IBM BPM) Announced (<a href="http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?subtype=ca&infotype=an&appname=iSource&supplier=877&letternum=ENUSZP15-0018">link</a>)</div>
<div>February 2016 - v8.5.7 (IBM BPM) Announced (<a href="http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=AN&subtype=CA&htmlfid=897/ENUS216-010&appname=USN">link</a>)</div>
<div>August 2017 - v8.6.0 (IBM BPM) Announced (<a href="https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=an&subtype=ca&appname=gpateam&supplier=897&letternum=ENUS217-379">link</a>) </div>
<div><br/></div>
<div>I've been "on the scene" since v5.5 and am generally pretty happy with how things have moved forward, although it never fails to disappoint me that many projects fail to fully exploit the BPM potential that IBM BPM provides.</div>
<div><br/></div>
<div>Moving forward, I don't think that the biggest challenges facing IBM BPM are technical (although technical aids may well help to move things along). </div>
<div><br/></div>
<div>I think that more emphasis needs to be placed on the <span style="font-weight: bold;">processes</span> supporting BPM.</div>
<div><br/></div>
<div>From a business perspective, Blueworks Live (in particular the frequent updates) does a great job of getting the business engaged in Process Modeling.</div>
<div><br/></div>
<div>However, the business need to stay engaged during each and every SDLC phase and the lines between business and IT become less distinguishable. I would like to see more consulting and collaboration and less developing (and far more judicious use of disconnected (often offshore) resources).</div>
<div><br/></div>
<div>From a technical perspective, the changes in recent versions (in particular the case-management stuff) provide an extremely powerful framework to align process models more closely to the way that businesses actually operate.</div>
<div><br/></div>
<div>However, the tools (mostly Process Designer / Intergration Designer) are well behind the rest of the industry. I would like to see things like Continuous Integration and Automated Testing baked directly into the platform.</div>
<div><br/></div>
<div><span style="font-style: italic;">UPDATE (</span><span style="font-style: italic;">02.01.2015</span><span style="font-style: italic;">): Checkout </span><a style="font-style: italic;" href="https://www.ibm.com/developerworks/community/forums/html/topic?id=eeb9505d-783b-4382-bfbb-bf9d57d72bbd&ps=25">this</a><span style="font-style: italic;"> thread on the IBM BPM forums for more information. On 02.01.2015 all the links worked. </span></div>
<div><br/></div>
<div><span style="font-style: italic;">UPDATE (</span><span style="font-style: italic;">07.03.2016</span><span style="font-style: italic;">): I’ve added some recent releases and checked all the links.</span></div>
<div><br/></div>
<div><span style="font-style: italic;">UPDATE (</span><span style="font-style: italic;">01.11.2017</span><span style="font-style: italic;">): I’ve added v8.6.0. The release strategy has changed a little. Click <a href="https://www-01.ibm.com/support/docview.wss?uid=swg21964995">here</a> for more information.</span></div>
<div><br/></div>
<div><br/></div>
Searching Your Code Base (in IBM BPM using Notepad++)https://garyjoy.postach.io/post/searching-your-code-base-in-ibm-bpm-using-notepad2015-03-05T14:02:25.772000Z2014-08-12T05:55:36ZGary Joy<div><div>You only need to spend an hour using something like Visual Studio or IntelliJ to realize just how developer-unfriendly the Process Designer for IBM BPM can be. Refactoring assistance (e.g. <a href="http://www.jetbrains.com/idea/features/refactoring.html">http://www.jetbrains.com/idea/features/refactoring.html</a>) is just a pipe-dream when you don't even have the ability to search for text across the entire code base.</div>
<div><br/></div>
<div>I have found that the "Find in Files" functionality in Notepad++ works particularly well with the export files that IBM BPM generates and that, used together, they can offer some compensation for the lack of functionality in Process Designer.</div>
<div><br/></div>
<div><i>NOTE: Other text editors can be probably be used as well. On Windows, my text editor of choice is Sublime, but it doesn't present the results from "Find in Files" quite as well (it's more work to track down the artifact name matching the search criteria).</i></div>
<div><br/></div>
<div>Here's a worked example:</div>
<div><br/></div>
<div>I have noticed a spelling mistake in a variable name and I want to correct it, ensuring that all usage is updated. The variable is called "tw.local.myVariable.myDaata" and should be called "tw.local.myVariable.myData".</div>
<div><br/></div>
<div><b>Step 1. Create a Snapshot</b></div>
<div><br/></div>
<div><a href="http://pic.dhe.ibm.com/infocenter/dmndhelp/v7r5m1/index.jsp?topic=%2Fcom.ibm.wbpm.main.doc%2Fmanaginglib%2Ftopic%2Fmanaging_snapshots.html">http://pic.dhe.ibm.com/infocenter/dmndhelp/v7r5m1/index.jsp?topic=%2Fcom.ibm.wbpm.main.doc%2Fmanaginglib%2Ftopic%2Fmanaging_snapshots.html</a> </div>
<div><br/></div>
<div><b>Step 2. Create an Export</b></div>
<div><br/></div>
<div>2.1. Find your snapshot in the Process Center view of Process Designer and click on "Export".</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/e7a5c69cce8c1cc383677b8431f3193c/8a1e830b37ea039afa3ef3dc7aa25d3d/w600_d4782374e1a6365d6eb51bcb18cdbfd1.png" height="643" style="cursor: default;cursor: default;cursor: default;" width="1013"/></div>
<div><br/></div>
<div>2.2. Select "IBM BPM export (.twx)" (it can take a few seconds for this dialog to appear).</div>
<div><img src="https://cdn-images.postach.io/e7a5c69cce8c1cc383677b8431f3193c/8a1e830b37ea039afa3ef3dc7aa25d3d/w600_a1feb208e801e3afa9508fcfe94689da.png" height="182" style="cursor: default;cursor: default;cursor: default;" width="623"/></div>
<div>2.3. Save the resultant file to you local file system.</div>
<div><br/></div>
<div><b>Step 3. Unpack the Files</b></div>
<div><br/></div>
<div>3.1. Rename the *.twx file as *.zip and open it up. </div>
<div><br/></div>
<div>3.2. Grab the "objects" folder and copy it to your file system. This folder contains the files we want to search...</div>
<div><br/></div>
<div><b>Step 4. Search the Files</b></div>
<div><br/></div>
<div>4.1. Open Notepad++ and select "Find in Files" from the "Search" menu.</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/e7a5c69cce8c1cc383677b8431f3193c/8a1e830b37ea039afa3ef3dc7aa25d3d/w600_76dadc7e6d7383f30a557cbae8011866.png" height="364" style="cursor: default;cursor: default;cursor: default;" width="567"/></div>
<div><br/></div>
<div><b>Step 5. Identify the Artefacts</b></div>
<div><br/></div>
<div>Each "file" corresponds to an IBM BPM artefact. </div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/e7a5c69cce8c1cc383677b8431f3193c/8a1e830b37ea039afa3ef3dc7aa25d3d/w600_324b4dcbb483e35d6dd6802b024f4623.png" height="463" style="cursor: default;cursor: default;cursor: default;" width="869"/></div>
<div><br/></div>
<div>5.1. Double clicking on matching text will open the file and scrolling to the top will give you the artefact name...</div>
<div><br/></div>
<div><img src="https://cdn-images.postach.io/e7a5c69cce8c1cc383677b8431f3193c/8a1e830b37ea039afa3ef3dc7aa25d3d/w600_4c1b86567eb97472adb3ecd6acec0617.png" height="732" style="cursor: default;cursor: default;cursor: default;" width="1037"/></div>
<div><br/></div>
<div>For complicated artefacts, it might help to take a closer look at the XML to help point you in the right direction as to where in the artifact the matching text can be found.</div>
<div><br/></div>
<div><hr/></div>
<div><br/></div>
<div>Here are a few examples of things that you might want to search for...</div>
<div><br/></div>
<div><b>defaultValue>"</b></div>
<div>This will give you a list of all the Services that have default values (that are Strings).</div>
<div><br/></div>
<div><b>log.error</b></div>
<div>This will tell you where in your code the out-the-box logging functions are used (I would recommend that you wrap these in you own Service rather than calling them directly).</div>
<div><br/></div>
<div><b>"ANY LITERAL VALUE"</b></div>
<div>We've all been there. You need to tidy up the use of literals in the code base...</div><br/></div>