Code for UML sequence diagram extract from ABAP for plantUML

Well after a bit of umming and erring, I’ve decided that the safest way for me to share the code that I developed to extract the UML diagrams from SAP is to share it here. I could have potentially used GitHub, but an entire repository for one file that I doubt I’ll ever change again seemed like overkill.

It’s worth referencing this recent post by Nigel James and the responses to it:

http://scn.sap.com/community/abap/blog/2013/08/16/share-and-share-alike

This code is shared under an Apache Licence version 2.0 http://www.apache.org/licenses/LICENSE-2.0

class ZCL_XU_SEQUENCE_DIAGRAM definition
 public
 inheriting from CL_ATRA_UML
 create public .
public section.
* Copyright 2013 Chris Paine
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
 methods IF_ATRA_UML_TOOL~CREATE_UML_DATA
 redefinition .
 methods IF_ATRA_UML_TOOL~GET_XMI
 redefinition .
protected section.
private section.
data _T_CALL_STACK type TY_CALL_STACK_TAB .
interface IF_ATRA_UML_TOOL load .
 methods ADD_CALL
 importing
 !IV_DIAGRAM type STRING
 !IS_DETAILS type IF_ATRA_UML_TOOL=>TY_SAT_RECORD
 !IV_CALLER type I
 !IV_CALLED type I
 returning
 value(RV_DIAGRAM) type STRING .
 methods ADD_PARTICIPANT
 importing
 !IV_DIAGRAM type STRING
 !IS_OBJECT type TY_OBJECT
 !IT_OBJECTS type TY_OBJECT_TAB
 !IV_FIRST_TIME type BOOLE_D
 returning
 value(RV_DIAGRAM) type STRING .
 methods ADD_RETURN
 importing
 !IV_DIAGRAM type STRING
 !IV_RETURN_TO type I
 returning
 value(RV_DIAGRAM) type STRING .
 methods FILL_GAPS
 importing
 !IT_WITH_GAPS type IF_ATRA_UML_TOOL~TY_SAT_TAB
 returning
 value(RV_FILLED_GAPS) type IF_ATRA_UML_TOOL~TY_SAT_TAB .
 methods GET_SEQUENCE_DIAGRAM
 returning
 value(RV_DIAGRAM) type STRING .
ENDCLASS.

CLASS ZCL_XU_SEQUENCE_DIAGRAM IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_XU_SEQUENCE_DIAGRAM->ADD_CALL
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_DIAGRAM TYPE STRING
* | [--->] IS_DETAILS TYPE IF_ATRA_UML_TOOL=>TY_SAT_RECORD
* | [--->] IV_CALLER TYPE I
* | [--->] IV_CALLED TYPE I
* | [<-()] RV_DIAGRAM TYPE STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD add_call.
DATA: lv_call TYPE string,
 ls_call_stack TYPE ty_call_stack,
 lv_text TYPE string,
 lv_prefix TYPE string.
IF iv_caller = iv_called AND is_details-caller <> is_details-called.
 lv_text = is_details-called && '->' && is_details-called_mod.
 ELSE.
 lv_text = is_details-called_mod.
 ENDIF.
CASE is_details-id.
 WHEN 'F'.
 lv_prefix = 'Perform'.
 WHEN 'U'.
 lv_prefix = 'Call FM'.
 WHEN 'm'.
 lv_prefix = 'Call method'.
 WHEN 'R'.
 lv_prefix = 'Create instance of class'.
 lv_text = is_details-called.
 WHEN 'X'. "skip over SAP code
 lv_prefix = '<b>Skipping over SAP code until calling'.
 lv_text = is_details-called_mod && '</b>'.
 ENDCASE.
lv_call = iv_caller && ` -> ` &&
 iv_called && `: ` &&
 lv_prefix && ` ` &&
 lv_text && cl_abap_char_utilities=>cr_lf &&
 `activate ` && iv_called && cl_abap_char_utilities=>cr_lf.
IF is_details-id = 'X'.
 lv_call = lv_call && `note over ` && iv_caller && ',' && iv_called && cl_abap_char_utilities=>cr_lf &&
 'Standard SAP code has called some custom code' && cl_abap_char_utilities=>cr_lf &&
 'end note' && cl_abap_char_utilities=>cr_lf.
 ENDIF.
ls_call_stack-code = iv_called.
 ls_call_stack-sap_code = is_details-aus_ebene.
 APPEND ls_call_stack TO _t_call_stack.
rv_diagram = iv_diagram && lv_call.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_XU_SEQUENCE_DIAGRAM->ADD_PARTICIPANT
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_DIAGRAM TYPE STRING
* | [--->] IS_OBJECT TYPE TY_OBJECT
* | [--->] IT_OBJECTS TYPE TY_OBJECT_TAB
* | [--->] IV_FIRST_TIME TYPE BOOLE_D
* | [<-()] RV_DIAGRAM TYPE STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD add_participant.
DATA: lv_participant TYPE string,
 lv_name TYPE string,
 ls_object TYPE ty_object,
 lv_counter TYPE i,
 lv_create_or_not TYPE string.
CASE is_object-object_type.
 WHEN 'CLAS'.
 IF is_object-instance = 0.
 lv_name = 'Static Methods of Class\n' && is_object-object.
 ELSE.
* check how many other instances of same class exist.
 LOOP AT it_objects INTO ls_object
 WHERE object = is_object-object
 AND object_type = is_object-object_type
 AND instance <> 0.
 lv_counter = lv_counter + 1.
 IF ls_object-instance = is_object-instance.
 EXIT. "leave the loop.
 ENDIF.
 ENDLOOP.
 lv_name = `Instance ` && lv_counter && ` of Class\n` &&
 is_object-object.
 ENDIF.
 WHEN 'FUGR'.
 lv_name = `Function Group\n` && is_object-object+4.
 WHEN OTHERS.
 lv_name = is_object-object_type && '\n' && is_object-object.
 ENDCASE.
IF iv_first_time = abap_true.
 lv_create_or_not = 'participant "'.
 ELSE.
 lv_create_or_not = 'create "'.
 ENDIF.
 lv_participant = lv_create_or_not &&
 lv_name && `" as ` &&
 is_object-code && cl_abap_char_utilities=>cr_lf.
rv_diagram = iv_diagram && lv_participant.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_XU_SEQUENCE_DIAGRAM->ADD_RETURN
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_DIAGRAM TYPE STRING
* | [--->] IV_RETURN_TO TYPE I
* | [<-()] RV_DIAGRAM TYPE STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD add_return.
DATA: ls_call_stack_from TYPE ty_call_stack,
 ls_call_stack_to TYPE ty_call_stack,
 lv_stack_pointer TYPE i,
 lv_return TYPE string.
 lv_stack_pointer = lines( _t_call_stack ).
 rv_diagram = iv_diagram.
IF lv_stack_pointer > 0.
 READ TABLE _t_call_stack INTO ls_call_stack_from INDEX lv_stack_pointer.
 WHILE ls_call_stack_from-sap_code >= iv_return_to.
 READ TABLE _t_call_stack INTO ls_call_stack_to INDEX ( lv_stack_pointer - 1 ).
lv_return = ls_call_stack_from-code && ` --> ` && ls_call_stack_to-code && cl_abap_char_utilities=>cr_lf &&
 `deactivate ` && ls_call_stack_from-code && cl_abap_char_utilities=>cr_lf.
 rv_diagram = rv_diagram && lv_return.
DELETE _t_call_stack INDEX lv_stack_pointer.
 lv_stack_pointer = lv_stack_pointer - 1.
 IF lv_stack_pointer = 0.
 EXIT.
 ENDIF.
 READ TABLE _t_call_stack INTO ls_call_stack_from INDEX lv_stack_pointer.
 ENDWHILE.
 ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_XU_SEQUENCE_DIAGRAM->FILL_GAPS
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_WITH_GAPS TYPE IF_ATRA_UML_TOOL~TY_SAT_TAB
* | [<-()] RV_FILLED_GAPS TYPE IF_ATRA_UML_TOOL~TY_SAT_TAB
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD fill_gaps.
 DATA: lt_without_gaps TYPE if_atra_uml_tool=>ty_sat_tab,
 ls_previous_line TYPE if_atra_uml_tool=>ty_sat_record,
 ls_gap TYPE if_atra_uml_tool=>ty_sat_record,
 ls_line TYPE if_atra_uml_tool=>ty_sat_record.
LOOP AT it_with_gaps INTO ls_line.
 IF ls_previous_line IS NOT INITIAL.
 IF ( ls_line-caller <> ls_previous_line-called
 OR ls_line-caller_inst <> ls_previous_line-called_inst
 OR ls_line-caller_type <> ls_previous_line-called_type ) AND
 ls_line-aus_ebene > ls_previous_line-aus_ebene.
* need to insert a new line into the table at this point to link the two together.
 ls_gap-caller = ls_previous_line-called.
 ls_gap-caller_inst = ls_previous_line-called_inst.
 ls_gap-caller_type = ls_previous_line-called_type.
 ls_gap-called = ls_line-caller.
 ls_gap-called_inst = ls_line-caller_inst.
 ls_gap-called_type = ls_line-caller_type.
 ls_gap-aus_ebene = ls_previous_line-aus_ebene.
 ls_gap-id = 'X'. "skip
APPEND ls_gap TO lt_without_gaps.
 ELSE.
 ls_previous_line = ls_line.
 ENDIF.
 ELSE.
 ls_previous_line = ls_line.
 ENDIF.
APPEND ls_line TO lt_without_gaps.
 ENDLOOP.
rv_filled_gaps = lt_without_gaps.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_XU_SEQUENCE_DIAGRAM->GET_SEQUENCE_DIAGRAM
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RV_DIAGRAM TYPE STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD get_sequence_diagram.
 DATA: ls_line TYPE if_atra_uml_tool=>ty_sat_record,
 ls_object TYPE ty_object,
 ls_last_call TYPE if_atra_uml_tool=>ty_sat_record,
 lv_next_object TYPE i,
 lv_first_time TYPE boole_d,
 ls_first_call TYPE ty_call_stack,
 lt_objects TYPE ty_object_tab.
FIELD-SYMBOLS: <ls_caller> TYPE ty_object,
 <ls_called> TYPE ty_object.
rv_diagram =
 '@startuml' && cl_abap_char_utilities=>cr_lf &&
 'hide footbox' && cl_abap_char_utilities=>cr_lf &&
 'autonumber' && cl_abap_char_utilities=>cr_lf.
* first of all, lets get all the objects
LOOP AT if_atra_uml_tool~sat_tab INTO ls_line.
IF ( ls_line-caller(1) = 'Z' OR ls_line-called(1) = 'Z' )
 AND ls_line-caller IS NOT INITIAL.
 ls_object-object = ls_line-caller.
 ls_object-object_type = ls_line-caller_type.
 ls_object-instance = ls_line-caller_inst.
IF ls_object-instance <> 0.
 READ TABLE lt_objects TRANSPORTING NO FIELDS
 WITH KEY instance = ls_object-instance.
 ELSE.
 READ TABLE lt_objects TRANSPORTING NO FIELDS
 WITH KEY object = ls_object-object
 instance = ls_object-instance.
 ENDIF.
 IF sy-subrc <> 0.
 APPEND ls_object TO lt_objects.
 ENDIF.
ls_object-object = ls_line-called.
 ls_object-object_type = ls_line-called_type.
 ls_object-instance = ls_line-called_inst.
IF ls_object-instance <> 0.
 READ TABLE lt_objects TRANSPORTING NO FIELDS
 WITH KEY instance = ls_object-instance.
 ELSE.
 READ TABLE lt_objects TRANSPORTING NO FIELDS
 WITH KEY object = ls_object-object
 instance = ls_object-instance.
 ENDIF.
 IF sy-subrc <> 0.
 APPEND ls_object TO lt_objects.
 ENDIF.
*we do special handling for construction - but don't want to show twice in diagram
 IF ls_last_call-id = 'R'. "constructor
 IF ls_line-called_mod = 'CONSTRUCTOR'
 AND ls_line-called = ls_last_call-called
 AND ls_line-called_inst = ls_last_call-called_inst.
* this line is a duplicate of the previous line
 DELETE if_atra_uml_tool~sat_tab.
 ENDIF.
 ENDIF.
ELSE.
* this line does not concern code that we are concerned about documenting
 DELETE if_atra_uml_tool~sat_tab.
 ENDIF.
ls_last_call = ls_line.
 ENDLOOP.
* now there will possibly be some gaps in the sequence if custom code calls standard SAP code
* that calls custom code.
if_atra_uml_tool~sat_tab = fill_gaps( if_atra_uml_tool~sat_tab ).

* ok now have all objects, let's go through and put together the diagram
 ls_last_call-aus_ebene = - 1.
 lv_first_time = abap_true.
 LOOP AT if_atra_uml_tool~sat_tab INTO ls_line.
* is this an implicit return?
 IF ls_line-aus_ebene <= ls_last_call-aus_ebene.
rv_diagram = add_return( iv_diagram = rv_diagram
 iv_return_to = ls_line-aus_ebene ).
 ENDIF.
* does caller object already exist?
 READ TABLE lt_objects ASSIGNING <ls_caller>
 WITH KEY object = ls_line-caller
 instance = ls_line-caller_inst.
IF <ls_caller>-code IS INITIAL.
 lv_next_object = lv_next_object + 1.
 <ls_caller>-code = lv_next_object.
* add participant
 rv_diagram = add_participant( iv_diagram = rv_diagram
 is_object = <ls_caller>
 it_objects = lt_objects
 iv_first_time = lv_first_time ).
 lv_first_time = abap_false.
ENDIF.
* handle the case of very first call
 IF ls_first_call IS INITIAL.
 ls_first_call-code = 1.
 ls_first_call-sap_code = ls_line-aus_ebene.
 APPEND ls_first_call TO _t_call_stack.
 rv_diagram = rv_diagram && 'activate 1' && cl_abap_char_utilities=>cr_lf.
 ENDIF.
* does called object already exist?
 READ TABLE lt_objects ASSIGNING <ls_called>
 WITH KEY object = ls_line-called
 instance = ls_line-called_inst.
IF <ls_called>-code IS INITIAL.
 lv_next_object = lv_next_object + 1.
 <ls_called>-code = lv_next_object.
* add participant
 rv_diagram = add_participant( iv_diagram = rv_diagram
 is_object = <ls_called>
 it_objects = lt_objects
 iv_first_time = abap_false ).
ENDIF.
rv_diagram = add_call( iv_diagram = rv_diagram
 iv_caller = <ls_caller>-code
 iv_called = <ls_called>-code
 is_details = ls_line ).
 ls_last_call = ls_line.
 ENDLOOP.
rv_diagram = add_return( iv_diagram = rv_diagram
 iv_return_to = ls_first_call-sap_code ).
rv_diagram = rv_diagram && '@enduml' && cl_abap_char_utilities=>newline.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_XU_SEQUENCE_DIAGRAM->IF_ATRA_UML_TOOL~CREATE_UML_DATA
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_SAT_TAB TYPE IF_ATRA_UML_TOOL=>TY_SAT_TAB
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD if_atra_uml_tool~create_uml_data.
* rebuild to export data as UMLet compatible source
 if_atra_uml_tool~sat_tab = it_sat_tab.

DATA: lv_filename TYPE string,
 lv_path TYPE string,
 lv_fullpath TYPE string.
cl_gui_frontend_services=>file_save_dialog(
 EXPORTING
 window_title = 'Save As PlantUML data' " Window Title
 default_extension = '.txt'" Default Extension
* default_file_name = " Default File Name
* with_encoding =
* file_filter = " File Type Filter Table
* initial_directory = " Initial Directory
* prompt_on_overwrite = 'X'
 CHANGING
 filename = lv_filename " File Name to Save
 path = lv_path " Path to File
 fullpath = lv_fullpath " Path + File Name
* user_action = " User Action (C Class Const ACTION_OK, ACTION_OVERWRITE etc)
* file_encoding =
 EXCEPTIONS
 OTHERS = 0 ).
if_atra_uml_tool~fname = lv_fullpath.
if_atra_uml_tool~generate_xmi_file( ) .
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_XU_SEQUENCE_DIAGRAM->IF_ATRA_UML_TOOL~GET_XMI
* +-------------------------------------------------------------------------------------------------+
* | [<---] C_DATA TYPE REF TO DATA
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD if_atra_uml_tool~get_xmi.
DATA lv_ref_xstr TYPE REF TO xstring.
 FIELD-SYMBOLS <lv_xstr> TYPE xstring.
CREATE DATA lv_ref_xstr.
 ASSIGN lv_ref_xstr->* TO <lv_xstr>.
TRY.
 <lv_xstr> = cl_bcs_convert=>string_to_xstring( iv_string = get_sequence_diagram( ) ).
 CATCH cx_bcs. "#EC NO_HANDLER
* if this happens we're buggered. not much to do really
ENDTRY.
 c_data = lv_ref_xstr.
ENDMETHOD.
ENDCLASS.

 

 

Twitter tightrope

Influence this you <removed>

Walking on a tightrope with the birds

Recently I passed the completely arbitrary mark of 1000 twitter followers. Yeah! Woohoo! Well done me! (Please note points with exclamation mark are meant to be dripping with sarcasm.)

And around the same time, I unfollowed – shock horror – two folks I had been following for quite some time. Now, I know I’m not the social media guru who can use twitter perfectly with lots of lists, following back people and then analysing where the links in my post have been successful and all that bs. But, I stopped to think about what I was doing, why I was doing it, and whether the same could/should be done to me by the wonderful bunch of idiots people that follow my twitter handle.

Unfollow 1 – Where is my personal space?

The first person I unfollowed, is great at sharing interesting content, and has some really useful things to say about some stuff that I’m interested in. However, they also have a LOT to say about politics. It might even be a political view that I agree with and sometimes I’ve had fun following some of those links. However, sometimes it went beyond fun and started getting nasty. Now, I strongly support people’s right to have a political viewpoint (I have one) however, if I’m going to include you in my feed of people that I want to listen to, please don’t make me uncomfortable by going all extreme on me, regularly.

Unfollow 2 – Wake me up to smell the coffee!

The second person I unfollowed was the polar opposite. They tweeted some interesting stuff occasionally. But generally their sharing of info was following the company line so intently that I never had the view that the stuff they were sharing was more than their company’s carefully edited press releases. I decided that in balance, press releases disguised as personal viewpoints was just a bit too boring, and I didn’t really want them in my timeline.

Walking a tightrope

Clearly, being too extreme is bad, but being too timid, is just as bad. So where one earth does one go? And this is the tightrope I guess that we walk. I’m certainly not pretending to know the answer and if one analyses the question it’s clear I’ve made some perhaps unsupportable assumptions. Is it really that bad if your audience is tightly aligned your viewpoints? If you’re gaining kudos in the eyes of your employer, is that a bad thing?

From my POV

I think in the end, the tightrope you walk is the one of your own making. It’s the choices that you make to go in the direction you want to go and associate with the people that you want to associate with. So for me, that means being slightly (but hopefully not offensively) irreverent, and keeping a T-shaped focus on the stuff I share. What it also means to me is that some things that I do care quite deeply about, for example climate change and the way that our generation is screwing the planet for my kids, I’m probably a LOT quieter about that I sometimes wish I was. Self censoring is a pain in the butt, however, it might just get me along the tightrope I want to walk. Just grab me after a few beers, and then I’ll tell you what I really think. 🙂

I hate doco

It’s kinda a mantra that I live a reasonable part of my life to. I think the above image is a not unjustifiable representation of my feelings about documentation:

But there are many good reasons that I should be doing doco. Most of them are supposed to save the customer money in the long run. And occasionally by doing the doco, I even find some small errors in my code that I hadn’t seen before.

 InnoJam Sydney 2011

Before InnoJam had any of that fun fluffy design thinking aspect to it, we ran one in Sydney. It was good fun, and people could build whatever the heck they wanted.

In staying true to my aversion for writing doco, I came up with an idea about auto-generation UML diagrams from SAP code.

Here’s a video of the solution we came up with:

here’s a link to the Prezi that I presented in that video:

http://prezi.com/zri5q-ib4vzp/?utm_campaign=share&utm_medium=copy&rc=ex0share

I wrote a blog post about it:

https://scn.sap.com/blogs/chris.paine2/2011/08/10/programmers-are-lazy–innojam-them

But it was long time ago and the move to a new version of SCN has kinda buggered it up.

Anyway, in short – Rui never managed to get the terms and conditions of CodeExchange changed to a level where I’m happy to support it and put code in there. I’m pretty sure he tried though. So I didn’t do anything with the code.

 

Fast forward 3 years

I have a whiteboard in the office covered in post-it notes. They all represent at least one development that I’ve done for the current project I’m working on. At the beginning of the project, I was very good, and did all my doco as I went along. Then the poo hit the fan, and everyone wanted everything done yesterday, and didn’t care about doco.

So I now have a whiteboard full of post-it notes that represent potentially weeks of doco hell for me. So in my “free time” in the evening I decided to see if I could recreate the solution that we’d built in Sydney, and perhaps make it a little nicer.

 

UML output

The first thing I decided, was that I was NOT going to try to build the graphical output myself. Having had lots of fun in Sydney trying to make Gravity do something it really wasn’t designed for I thought I’d research how else I could get my interaction diagrams created.

If in doubt Wikipedia

http://en.wikipedia.org/wiki/List_of_UML_tools

There were loads there, and I’d pretty much decided on UMLet when I discovered something about interaction diagrams. Basically, interaction diagrams are supposed to show interaction between objects. Bit bloody obvious really. However, the thing is, if I’m documenting my code, I’d really like to show the interaction within my objects too. I.e. if I make a call to a private method of my class, I’d really like that to show up in my diagram. Given that interaction diagrams are only supposed to show external interaction it’s not surprising that most of the tools for creating the diagrams don’t really support this idea of internal object calls.

So a bit of browsing later and I found PlantUML. It has some awesome functionality for creating sequence diagrams, actually, most UML diagrams it seems, but it was the sequence diagrams that I was interested in.

Here’s a simple example:simple_example

 

 

See how it’s quite possible to show “internal” calls of an instance and also show the life time of those calls. This feature I didn’t find on the other free UML tools that I looked at. There are a bunch of other formatting features that can be used too. If you’re interested check out their website: http://plantuml.sourceforge.net/sequence.html

 

Intercepting the SAP standard UML generation

So in transaction SAT there is the possibility to generate your own JNet UML sequence diagram (this exists as standard.)

press the button

 

However, it does not allow you to do things like filter out standard SAP routines (as far as I know! If anyone can tell me how to do this (without needing to list every method I call, please let me know!) When I was looking at one of my examples, where I ran a program to generate a performance review document for an employee, there were over 100,000 different routines called. Only about 400 of those calls involved my code, so you can imagine generating a UML diagram for the whole 100,000 calls would be a bit of overkill (not to mention an impossible to read diagram).

In customer systems there is a function module  ATRA_UML_DECIDER  that has been purposely handicapped. One does have to wonder why this has been done, but nevertheless it has.  It allows the user to chose from a list of potential UML extraction routines. All of these routines implement the IF_ATRA_UML_TOOL interface. There are classes for extracting to JNet, Borland Together and Altova. Now, I’m sure that Borland and Altova have good products, it’s just that I don’t really want to spend money on then when there are perfectly good (for my tasks) free and open source products out there.

There is a factory class/method CL_ATRA_UML_FACTORY  that creates an instance of a class implementing the interface. I overrode this method to use my particular extractor if it was me running the code. In the future, I might enhance this to check for a user role, or perhaps a user parameter, that’s trivial, the main point will be to allow others to access this logic too.

The guts of the code

Simply my implementation of the interface reads the table of data that is passed to the interface, removes all calls that aren’t to or from custom code and then builds a PlantUML representation of that code.

Here’s a very simple output that generates the diagram above.

@startuml
hide footbox
autonumber
participant "Instance 1 of Class\nZCL_HR_EMPLOYEE" as 1
1 -> 1: Call method GET_HELD_QUALIFICATIONS
activate 1
1 -> 1: Call method ZCL_HR_OBJECT->GET_RELATIONSHIPS
activate 1
create "Static Methods of Class\nCL_HRBAS_READ_INFOTYPE" as 2
1 -> 2: Call method GET_INSTANCE
activate 2
2 --> 1
deactivate 2
create "Instance 1 of Class\nCL_HRBAS_READ_INFOTYPE" as 3
1 -> 3: Call method IF_HRBAS_READ_INFOTYPE~READ_PLAIN_1001
activate 3
3 --> 1
deactivate 3
1 --> 1
deactivate 1
create "Instance 1 of Class\nZCL_HR_QUALIFICATION" as 4
1 -> 4: Create instance of class ZCL_HR_QUALIFICATION
activate 4
4 -> 4: Call method ZCL_HR_OBJECT->CONSTRUCTOR
activate 4
create "Function Group\nRHS0" as 5
4 -> 5: Call FM RH_GET_ACTIVE_WF_PLVAR
activate 5
5 --> 4
deactivate 5
4 --> 4
deactivate 4
4 --> 1
deactivate 4
deactivate 1
@enduml

 

 A slightly less trivial example

The following code does some pretty simple stuff, it finds who is my manager, and finds out what required qualifications my position/job has.

DATA: lo_emp TYPE REF TO zcl_hr_employee,
lt_managers TYPE ztthr_employee_objects,
lt_required_quals TYPE ztthr_qualifications.

TRY.
lo_emp = zcl_hr_employee=>get_employee_by_user_id( sy-uname ).

lt_managers = lo_emp->get_position( )->get_managers_recursive( ).
lt_required_quals = lo_emp->get_position( )->get_required_qualifications( ).

CATCH zcx_hr_no_managing_pos_found  ” No managing position found
zcx_hr_no_holders_found  ” no holders for position found.
zcx_hr_no_position_found    ” no position found
zcx_hr_user_id_not_found.  ” cannot find user id for employee
ENDTRY.

So I thought I’d trace it:

it works out at around 200,000 different routines being called. 62 of those are my code, the rest standard.

run through 1

First of all, I need to schedule a trace for myself…

run through 2

 

run through 3

 

Need to know which session I will be recording. If I left it as “Any” it will start recording this session, not very useful!

run through 4

 

Session 2 it is!

run through 5

run through 6

actually run it now!

and the schedule status changes to executed.

run through 7

 

I now need to delete the scheduled measurement. Despite the intimidating words, this does not delete my measurement, just the scheduling of it.

run through 8

 

now swapping to the “Evaluate” tab in SAT I can see my measurement, and I can click to output to UML

run through 9

 

 

Clicking on the button triggers a bit of a pause whilst the system code chugs away and does loads of stuff it doesn’t need to do…

 

Then

run through 10

Save the data and PlantUML starts converting it immediately:

run through 11

 

and the result:

example

Would probably have been a little bigger if my employee had a job assigned to their position, but you can see how incredibly easy this now makes documenting the functionality I’ve built.

I’m still considering how to make the code publicly available. I’m sure someone else would be happy to post it to CodeExchange, so perhaps I’ll let them.

Who is this real ME?

This post is a response to the thought provoking post that Raj Sundarason posted on SCN – Identifying the Real Value of ME

In that post Raj talks about how:

“We need to embrace the concept of the “IDENTITY of ME.

Step 1: We need to recognize the different elements of My Identity (ME)

Step 2:  To scale and be successful we must find a way to tap into the value of ME

Step 3:  The Complete ME requires an integrated enabling infrastructure”

That grab of the bullet points of his post does not do it justice – go and read it yourself! But it will work as a nice framework for my response.

Recognising the social or not ME

I would suggest that the layers that make up an individual are very varied. In the same way that we see ridiculous personality profiling:

personality graph1

We can generate similar breakdowns on the factors of their identity:

personality graph2

 

You should note that these graphs were generated using random numbers in a spreadsheet, and mean absolutely nothing! But I bet you could recognise some people you knew looking at the data there if you looked. And here is where we have to be very, very careful. We take into any discussion about what makes up identity some very strong views of what defines identity is that are heavily influenced by the people that we surround ourselves with. A person who spends much of their time online (like myself) will naturally be more inclined to think about the online social interactions that take place. A person who is never online (yes, there are a few of those left) is more likely to think about person to person interaction. Even what makes up an identity is very much up for debate, is your community credibility part of your identity? (probably) or is it a result of the social and professional contributions? (probably). Whilst the 5 big personality traits are pretty well agreed (although putting them in a radar graph is a complete abuse) the points that make up an employee’s identity aren’t quite so well understood (as far as I know. There are probably hundreds of PhDs in sociology which discuss that and they probably even have some sort or acronym that is universally accepted to represent the different factors… But I don’t know about it so we’ll just assume that it doesn’t exist for the sake of a good story 😉 )

So to my point here. When we consider leveraging the power of an employee’s identity we need to consider that for different people this will need to be achieved in different ways. Whilst I think and agree that in many situations the general result is the same, if a strategy only addresses one aspect of an employee’s identity then the end result will vary wildly in the same way that identities are made up in wildly different ways.

Getting to the value of identity

So how do we actually use identity to give our business value? Well firstly I think we need to consider what we would loose if we do not recognise the value that an employee brings that is above and beyond their mandated position description. Perhaps this is what people talk about when they blather on about “cloud DNA” and how worried they are that Lars is leaving SAP. Personally I think that’s tummy-rot and one person will rarely have such an impact, no matter how strong their identity. But it does give a nice example of how we need to value and assign value to our employees by thinking about their identity in the wider sense.

So the next question must be, if we can see value in identity, how can we grow that value? To answer that question with another, does all identity growth equal value? Certainly in some areas, but not in others. If your employee is a passionate political advocate, they may well be growing their identity but also at some point you may find that the passion/identity conflicts with your business growth. I’ll use myself as an example. I’m quite passionate about environmental issues, I fear for the legacy we are leaving our children in the way that our planet is being abused. It’s quite possible that this will conflict with potential work that my company might partake in.

Identity has value, but it also has risks, leveraging one and recognising the other will take skill. Which brings me nicely to the final point.

Integrated analysis environment

I agree with Raj that by figuring out which parts of an employee’s identity can be leveraged towards business growth a company has the opportunity to create great wins. An employee who feels that their whole identity is supported by the company is going to be far more loyal and likely to produce results/recommendations/inspire others than one who feels that their company just doesn’t understand them.

To this point companies will need to be very careful in attempting to leverage the identities of their employees. Again I will use myself as an example: If my company asked me to start tweeting references to a new solution that we were marketing I would be very resentful. Why? Just read my thoughts on anti-social social media. I would move camp very quickly from feeling that my company was supporting me and was aware of what I was doing that was helpful to a view of “you just don’t understand!”

It’s like the return to work legislation here in Australia, you don’t encourage your employees to return to work, you support them. In the RTW situation it’s due to legal nuances that can stop you getting fined millions of dollars, but in general terms if you can support your employees to leverage their identity for your business cause, rather than putting any pressure (intended or not) then you’re on a winner. Supported employees are less likely to feel that you misunderstand them and more likely to join in (even if it’s not something they would have done without the support.)

But before you can offer support, you’d better understand where your people are and what they do and what makes up that diverse mix of identity in your population of employees. Thus the need for, rather than infrastructure to enable, infrastructure to analyse. Helping your people to be great online bloggers for your company makes no sense if your people aren’t interested in being near a computer once they leave the office. Likewise, targeting your employees to help recruitment at the next trade conference they attend is pointless if they will be avoiding any social contact whilst they are there.

In the race to use the connectedness and influence of our employees towards the good of the company, the first companies that are able to effectively analyse where their employees are at will have a huge advantage. I agree with Raj that we must also measure the effectiveness and dollar returns of the methods and processes that are put in place to leverage the identities, but this is pointless without understanding the base that we are manipulating  supporting.

To the end of analysing the identity make up of your employees, we are entering a phase where social network analysis is a real possibility within a company. Whether this analysis is through scanning email conversations for semantic meaning and the senders, recipients and cc’s used as nodes in an influence map. Or it’s through direct analysis of outside-of-enterprise relations with employees encouraged supported to upload their contact lists into gamified social referal solutions. The challenges with privacy will be the first obvious hurdle, but if Facebook has over a billion users then there are at least a few people who don’t care that much… Look out for the social media disclosure statement in your next employment contract, and I’ll bet your employer will be doing a lot more with your details than just monitoring your Klout score!

Summary to a long winded ramble that could have been composed in a pub on a Friday evening (but wasn’t)

Raj, I hope I added some value/response to your post! In summary, yes I agree, leverage the identities of your employees to a) build a better workplace for them and b) return better result for your company. And yes, I think that companies that will be able to do this will have a huge advantage. But I think the first and more important step is to start understanding who your people are outside of their current work personas. Understand the identities that you actually have, and once you have that information you will be in a better place to start thinking about how or even if you can use that information.

 

 

Building a card robot

Today was a very relaxing day, where I tried not to involve myself in any work related stuff at all.

So I asked the kids what they wanted to do this morning. They said, build a robot.

Robots made from construction paper

So we did. Unfortunately, they (the kids) are probably still a little to small to get into Lego Mindstorms or programming and wiring my Raspberry Pi to run some servos, so we went for the next best thing. Cardboard.

robots made from paper

I made some nets (a net here being a 2d diagram for a 3d shape) for the different parts of a robot, we printed them out onto some card, cut them out and stuck them together. The kids decorated the robots with some great creative flair.

It was a great fun day that I would recommend to anyone who finds the weather not suitable for playing outside and want to do something a little different.

Just in case there is anyone else out there in a similar situation I have attached (linked below) the print-outs that we used to build the robot. Cut the solid lines and fold (in most cases) the dotted lines. I printed these onto construction paper and it worked really well. Scoring the to be folded lines using a ball point pen and a ruler is highly recommended to ease making the folds in the right places. A decent quick drying glue is a good idea too – glue sticks just don’t work for this stuff.

card robot legs net card robot head net card robot body net card robot arms net

They look like:

net for constructing a set of legs for my paper robots - see PDF for high quality version

I’ve licensed the the plans/net/images (however you want to refer to them!) under the a very unrestrictive creative commons license so you use them and play around with the safe in knowledge that I’m cool with that.

Creative Commons License
These works by Chris Paine are licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

Although the linked PDF versions are higher quality 🙂 They are designed for printing out onto A4 paper. Although you could/can fit two of the head nets onto one piece of A4 if you fiddle with it.

I hope someone, somewhere, sometime reads this and finds it of use. I know I tried searching the Internet for “robot card net”, “paper robot diagram”, “build your own paper robot” and other such in the hope that someone else had already done the hard work. Perhaps with the magic of Google someone else will search and find this… (if you do, please send me a note, I’d be most happy to find out! 🙂 )

Cheers!

Keeping it real

Anti-Social social media

As many of you who might read this know, I like social media. I spend a reasonable amount of my spare time following and trying to keep up with the information that is available about SAP, cloud and HCM topics. Many of these social media discussions (a majority I’d suggest) take place over twitter. Now recently I’ve found a few tweets that have really got me irritated. But before I explain what got my back up, it’s probably worth pointing out that there is a simple option for me, and it’s put the phone/tablet down and walk away. This really isn’t that serious! Secondly, don’t ask me to name names, I won’t and I don’t think it’s helpful anyway, and I’ll get to why not later.

What’s wrong?

I’ve seen two types of behaviour that I’ve disliked. Firstly has been where people have been using social media as a tool to strike up a conversation. But rather than continuing with the conversation, just make a couple of snide remarks and tried to spark up a fire. In some cases these have been extreme storm in the teapot scenarios, where some information misunderstood, or not at all researched or understood has been used to derive wild scenarios that are great link-bait but do not actually help drive the conversation forward. Conversations are two-sided, if you refuse to engage in a manner that engenders discussion then you don’t have a conversation, you have a battle. In battles the only people that win are the arms manufacturers.

The second type of behaviour is where people represent themselves as “individuals” but start broadcasting what can only be described as advertisements for the products that the company that they work for sells. Now this is a fine line as you’d expect people to be interested in and excited about the products that they company that they work for sells. But when it is done across a whole group of employees and sometimes with a common message/format  then it really starts to smell bad. Even worse when people start tweeting info and then add link to some sales website or their company twitter handle when the content of the tweet isn’t about that! It’s like they are branding their tweets! But when they then refuse to engage on the marketing type tweets to clarify details (possibly because some of the marketing bs is actual bs?) it gets really irritating.

The problem.

Well my real issue is that the response I want to give the tweets of the second type would just make me an asinine tweeter of the first type. Keeping it real and respecting myself involves not walking either of these two paths. And that’s tricky. Not to mention frustrating! This is why I don’t what to name, it’s just behaving like a spoilt brat and isn’t doing anyone any favours. Don’t be evil!

My solution – not “the” solution

I believe that I shouldn’t take myself too seriously, it’s one of the reasons I still keep the ridiculous twitter image that I have whilst pretty much all those that I engage with have sensible portraits. To remind myself not to think overly of my skills, abilities or influence, as I’m just a silly looking guy who’s biggest achievement was becoming a father. Remembering what is important and valuable to me then drives my behaviour. Yes I’ll post this up to vent a little, but the anti-social social media that winds me up, hopefully you won’t see that coming from this direction. 🙂

Seriously, don’t take yourself too seriously. Photo was taken at my son’s 1st birthday party.

ABAP Code Naming Conventions

Ok, you can probably guess that I’m not the most conventional person. I probably don’t fit the mould of the stereotypical developer either. I’m certainly not what one would call an introvert.

So please take this with the necessary pitch of salt. (especially if you’re one of the people who writes the code naming conventions that I have to follow from time to time 😉 )A pinch of salt required

<rant>

Why on earth does every SAP project I go to insist on such inane naming standards for the code? The SAP editor is a wonderful IDE (caveat I did not say it was the best IDE) that allows you to see the definition of any variable with a simple double click – so why on earth are you so worried that I should prefix all my local variable definitions with an ‘l’? What on earth potential benefit can this have on the code readability? Perhaps it helps if you’re still one of my nemesis developers who are passing all your variables between methods through the use of global variables and/or singletons. Perhaps one needs to look at a piece of code, see lots of l’s and that gives satisfaction? The use of Hungarian Notation in ABAP code seems to be universal, although never it seems implemented in the same way.

Then when I define a structure, I must prefix it with a “S” just so you can be sure that it isn’t actually a table or a single field, or so help me, a woolly mammoth. When I look in the IDE view of the package I am developing, all of these different things are arranged in a tree so you can easily tell one from the other. Again a single double-click can bring me to the definition if it is ever referred to in a piece of code. Perhaps it might save some time looking at a variable definition to see if it is a table, a structure, object reference or a variable – but if I’m in the code, it should be pretty damn obvious! If I’m appending or inserting into it, it’s a table. If I’m referencing a sub-field of it, it’s a structure. If I’m assigning a value to it it’s a variable, if I’m creating an instance of it, it better be an object reference. There again may be cases of my nemeses developers still using tables with header lines and confusing the heck out of me. But I’m hoping that the code inspector might weed at least that out.

Searching outside of the SAP world the use of Hungarian Notation within code is not universally disliked, but with such a clear list of disadvantages and such luminaries as Uncle “Bob” Martin and Linus Torvalds against it, you’d have to proclaim yourself a pretty die-hard supporter of “doing it the old way” not to just think a little – “is this really useful? Or is it even potentially bad?”.

Then there comes the requirement that every object should reference the area of use it is intended for. Thus the forth and fifth characters of the object name must be “HR” or “PA” or “XX” or whatever. The use of Positional Notation for implicit metadata about a component is, however not something I’ve seen outside of SAP projects except for the COBOL example given in the linked Wikipedia page. At this point when reading the naming convention guide, I casually check if there is any mention of packages and package hierarchies and hope upon hope, package interfaces. When there isn’t, I sigh again and just bite my tongue again. Because SAP has provided a wonderful way of helping us see what use a component is put to – as every component must belong to a package, and that package can (and should) have an application component defined. And to give even more clarity, the package can have a super-package, thus grouping all like component together, whatever types they are and where ever in their object names they have a ridiculous two character code. The package interface can even tell you if the object is safe for use outside of the package. What a great concept!

So instead of spending time thinking about whether the components we are building are truly reusable, and what the scope of that reuse is. We spend hours checking if we have the first n characters of our our objects correct according to the development standard book.

</rant>

One day someone will be silly enough to let me do it my way, I’ll confuse the bejeebers out of all the guys who’ve only been coding ABAP badly for the last 10 year and the project will potentially fail because I’ll spend my entire time looking for enough of a development team that can understand that following a rigid way of doing things isn’t always the best way to do it…. <sigh>

Elasticity

 or   or 

(Hooke’s Law for expressing elasticity of an object in various degrees of complexity)

The equations above get pretty complex pretty quickly! And that’s when we deal with equations that have been known about for hundreds of years. When we start using elasticity to describe cloud computing, it gets even worse.

The topic was brought up the other day when I was looking at purchasing some space on the SAP HANA Cloud to run an application that we’re developing in-house. I was checking the price for this.

http://scn.sap.com/thread/3350483

I got quite confused.

Then the conversation moved to twitter and we started discussing not just the price of going to the cloud but also how it should be priced. And then even onto how it could be made multi-tenant (which is a bit beyond the scope of this post, but it was interesting nevertheless.

I think the conversation is worth preserving so I’ve made a copy of it with a little help from Aaron’s Twitter Viewer and a lot of cutting and pasting so I could do without the CSS (if anyone knows how to add custom CSS to a single WordPress post, I’d be interested.)

Have a read, it’s not a bad collection of thoughts, and interjections (by the one and only Dennis H) and I’ll recap on my thoughts at the end:

wombling
Chris Paine
Feeling slightly confused by SAPStore pricing for #saphanacloud if you understand it pls help me scn.sap.com/thread/3350483

2 days ago
1 retweets
#

rhirsch
Dick Hirsch
@wombling compare price to other #saphanacloud packages in #sapstore – all have similar structure

2 days ago
#

wombling
Chris Paine
@rhirsch I understand the free ones but still confused what calculation is for rest, why show pm price when only pa purchase possible?

2 days ago
#

rhirsch
Dick Hirsch
@wombling a good question for #sapstore and #saphanacloud team – another reason to always read the small print

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@rhirsch @wombling it will get rationalized soon . @aiazkazi has plans for it

2 days ago
#

rhirsch
Dick Hirsch
“@vijayasankarv: @rhirsch @wombling it will get rationalized soon . @aiazkazi has plans for it” >> hope you guys are working on cloning him

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@rhirsch @wombling hehehe @aiazkazi is one of a kind – but he has a team behind him too to help with scale 🙂

2 days ago
#

vlvl
Yariv Zur
@vijayasankarv @rhirsch @wombling @aiazkazi Pricing is presented as PM because this is how it was defined in official price list (cont)

2 days ago
#

vlvl
Yariv Zur
@vijayasankarv @rhirsch @wombling @aiazkazi (cont) however min. Contract length for all cloud subscriptions is 1 yr. hence the mess.

2 days ago
#

wombling
Chris Paine
@vlvl @vijayasankarv @rhirsch @aiazkazi certainly not the clearest situation. But then again probably simple than onPrem pricing

2 days ago
#

esjewett
Ethan Jewett
@wombling @vlvl @vijayasankarv @rhirsch @aiazkazi Minimum 1-year subscriptions are not very cloudy. Are add-on resources more flexible?

2 days ago
#

wombling
Chris Paine
@esjewett @vlvl @vijayasankarv @rhirsch @aiazkazi had one potential customer only needed 3-4 months every yr. They didn’t sign up 🙁

2 days ago
#

wombling
Chris Paine
@esjewett @vlvl @vijayasankarv @rhirsch @aiazkazi cloud ideal for flexibility, but not so much in this case

2 days ago
#

esjewett
Ethan Jewett
@wombling @vlvl @vijayasankarv @rhirsch @aiazkazi Really, I’d argue that it’s not even cloud if it requires a 1-year commitment. Hosting.

2 days ago
1 retweets
#

wombling
Chris Paine
@esjewett @vlvl @vijayasankarv @rhirsch @aiazkazi different times for use-cases SuccessFactors 3yr contract. But wld like more flexible PaaS

2 days ago
#

esjewett
Ethan Jewett
@wombling @vlvl @vijayasankarv @rhirsch @aiazkazi Indeed, but for IaaS and PaaS I’d argue “cloud” involves elasticity. The NIST agrees 🙂

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @wombling @vlvl @rhirsch @aiazkazi other than on iaaS (rhymes with aiaz) , I doubt perfect elasticity will happen for any vendor

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling @vlvl @rhirsch @aiazkazi Every PaaS I’m aware of provides it. Elastic Beanstalk, Heroku, CloudBees come to mind.

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @wombling @vlvl @rhirsch @aiazkazi maybe PaaS will get there too at some point , but seriously doubt SaaS will

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling @vlvl @rhirsch @aiazkazi Agree though that it’s not as key for applications. But we’re talking about PaaS, I think?

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @wombling @vlvl @rhirsch @aiazkazi PaaS ideally should have no lock in – just a question of how much scale justifies it

2 days ago
#

wombling
Chris Paine
@vijayasankarv @esjewett @vlvl @rhirsch @aiazkazi GApps, Azure, CloudBees PaaS are monthly, why not #saphanacloud?

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling @esjewett @vlvl @rhirsch @aiazkazi elasticity is definitely something on top of the agenda . Question – is monthly good enough?

2 days ago
#

wombling
Chris Paine
@vijayasankarv @esjewett @vlvl @rhirsch @aiazkazi Simple fixed CPU/data monthly makes sense, more elastic, then GApps style usage payment

2 days ago
#

dahowlett
Dennis Howlett
@wombling Isn’t the fundamental qu something like: ‘Why does #SAP find it necessary to invent new ways to confuse?

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling @vlvl @rhirsch @aiazkazi Daily or hourly would be better, but one step at a time.

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling @vlvl @rhirsch @aiazkazi Each decrease in granularity enables different scenarios. E.g. daily helps w/ month-end.

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @wombling @vlvl @rhirsch @aiazkazi what is your absolute best case granularity ? And is monthly a good enough alternative ?

2 days ago
#

wombling
Chris Paine
@vijayasankarv @esjewett best case is on demand pay as you use eg cloud.google.com/pricing/ low base price (monthly) then as needed – elastic

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling @vlvl @rhirsch @aiazkazi Hourly is kind of industry standard, though monthly is fairly common for PaaS.

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling @vlvl @rhirsch @aiazkazi With PaaS, the case could be made for value in even more granular metering than hr.

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling @vlvl @rhirsch @aiazkazi But I’d say if you can get it to hourly that’d be great.

2 days ago
#

vlvl
Yariv Zur
@esjewett @vijayasankarv @wombling @rhirsch @aiazkazi one more point – full elasticity is good for techies but hard on the CFO. (Cont)

2 days ago
#

vlvl
Yariv Zur
@esjewett @vijayasankarv @wombling @rhirsch @aiazkazi they need the ability to forecast expenses. So for DEV we have full elasticity (free!)

2 days ago
#

vlvl
Yariv Zur
@esjewett @vijayasankarv @wombling @rhirsch @aiazkazi for PROD you pay in advance for 1 yr, becoming acceptable for CFO #hanacloudportal

2 days ago
#

esjewett
Ethan Jewett
@vlvl @vijayasankarv @wombling @rhirsch @aiazkazi Good point, and I think makes sense for apps but not for the PaaS itself.

2 days ago
#

vlvl
Yariv Zur
@esjewett @vijayasankarv @wombling @rhirsch @aiazkazi PaaS is for running apps. “How much is the new supplier portal gonna cost me?”

2 days ago
#

esjewett
Ethan Jewett
@vlvl @vijayasankarv @wombling @rhirsch @aiazkazi But usually PaaS is for dev to run apps. SAP’s take seems to be that cust manages PaaS.

2 days ago
#

vlvl
Yariv Zur
@esjewett @vijayasankarv @wombling @rhirsch @aiazkazi IT manages PaaS, but the app is for the cust. Not for the DEV guy 🙂

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @vlvl @wombling @rhirsch @aiazkazi there are 2 broad uses – 1. custom development by a customer for their use and ..

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @vlvl @wombling @rhirsch @aiazkazi ..and 2. An ISV or developer building something for selling to others. different needs for them

2 days ago
#

wombling
Chris Paine
@vijayasankarv @esjewett @vlvl @rhirsch @aiazkazi and don’t forget customers with seasonal/fluctuating demand. (Repeating myself, sorry)

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling @esjewett @vlvl @rhirsch @aiazkazi yes agreed – needs to be solved absolutely, either at IaaS level and/or at PaaS level

2 days ago
#

rhirsch
Dick Hirsch
@vijayasankarv @wombling @esjewett @vlvl @aiazkazi 2 sides to consider — shop & platform – both need to support diff models

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @vlvl @wombling @rhirsch @aiazkazi Exactly. Much clearer than me :-). I hope SAP covers both. Right now, focus seems on #1.

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @vlvl @wombling @rhirsch @aiazkazi which brings up multi tenancy topic . Do u expect it as platform feature or leave it to apps?

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @vlvl @wombling @rhirsch @aiazkazi Yeah, very good point. Too complicated for twitter, and I need to sleep 🙂

2 days ago
#

wombling
Chris Paine
@vijayasankarv whilst @esjewett is sleeping 😉 how do you think from a PaaS viewpoint multi-tenancy could be delivered as a feature? (cont)

2 days ago
#

wombling
Chris Paine
@vijayasankarv @esjewett (cont) by building into the security/roles/authorisations of standard IDM solution? Extend to social login?

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling that could be a solution. but fundamentally a principle need to be agreed whether platform needs to even support multitenancy

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling it could also be that apps might want control of how to implement multitenancy without platform dictating it

2 days ago
#

wombling
Chris Paine
@vijayasankarv The worry is leaving it to app developers means potential embarrassment < but at least app developers fault not SAP!

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling it is like C++ and Java 🙂 I didnt like java for a long time thinking it took away my ability to fully control what I am building

2 days ago
#

wombling
Chris Paine
@vijayasankarv Be glad you never had to code Web Dynpro Java then 😉 Or if you did, then I can see yr point very well

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling I was already out of full time dev role by the time WD was widely used – but yes, did a little bit when it came out

2 days ago
#

esjewett
Ethan Jewett
@wombling @vijayasankarv If SAP is going to certify apps as multi-tenant, it’s going to require a manual audit. No pure tech solution.

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @wombling rather left field question – do u think a model where apps are not certified by platform provider is feasible ?

2 days ago
#

wombling
Chris Paine
@vijayasankarv @esjewett feasible yes, q: is the value to partner to have SAP logo stamped onto app worth the investment? probably yes

2 days ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling Sure, but then customer has to trust app dev. You can provide tools, but no way to guarantee data isn’t mixed.

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@esjewett @wombling not a lot a platform provider can really certify beyond some minimum things like ” won’t crash, meets usability reqs” 🙂

1 day ago
#

esjewett
Ethan Jewett
@vijayasankarv @wombling Yup. Multi-tenancy is not offered by any PaaSes as far as I know.

1 day ago
#

wombling
Chris Paine
@vijayasankarv partners will build multi-tenancy solutions (I’m trying now) but social login means can’t leverage IDM solution anyway

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling yes – but do you think a hybrid of social login and traditional MDM can solve it elegantly?

2 days ago
#

wombling
Chris Paine
@vijayasankarv personally I find that too many frameworks complicate solutions rather than making them easier. Eg what happened to SOAP

2 days ago
#

vijayasankarv
Vijay Vijayasankar
@wombling 100% agree – and that is at least partly because very few developers think highly of other developers IMO. Too quick to dismiss 🙂

2 days ago
#

wombling
Chris Paine
@vijayasankarv still, would not be surprised if logic to allow multi-tenancy was delivered as is natural extension of current user mgt

2 days ago
#

esjewett
Ethan Jewett
@vlvl @vijayasankarv @wombling @rhirsch @aiazkazi That’s what I mean by different. Bot sure if it’ll work, or the implications. Interesting.

2 days ago
#

esjewett
Ethan Jewett
@vlvl @vijayasankarv @wombling @rhirsch @aiazkazi Though, SAP seems to take a diff approach to PaaS than other PaaSes. Need to think on it.

2 days ago
#

rhirsch
Dick Hirsch
@wombling related question would be if whether all the plumbing is there to deal with subscriptions #saphanacloud

2 days ago
#

 My thoughts

A couple of days later and my question has be answered on SCN, but I’ve also had a few moments to think about this.

Drinking your own Champagne

Firstly, to my own need for a productive license to some very minimal use of the SAP HANA Cloud.

With the reasonably low price point that SAP is putting on Cloud Partner status, it certainly seems that they are trying to attract small companies to develop content for them. If you add to this, the “we drink our own champagne” marketing message that has been broadcast very well by the ex-CIO there is a obvious marketing proposition.

If companies that signed on as partners for SAP then submitted an application to the SAP Store for resale, they could be allowed to use it productively themselves, they would have an excellent sales pitch “we drink our own champagne”. A limit on the sizing of the used solution might be in order (but probably wouldn’t be an issue with small companies), but it would be very cool for small companies to do this. It would certainly encourage companies like the one I work for to go the extra step of putting the application into the SAP Store. A win for both the developers and SAP.

Annual fixed storage/cpu isn’t elastic, isn’t cloudy for a PaaS

Probably the clearest idea in the thread above is that PaaS shouldn’t be billed annually. Where we are talking SaaS (like Yariv Zur’s SAP HANA Cloud Portal (which is kinda SaaS and PaaS, but I’d argue definitely both)) then there is a different view, but for a PaaS, the beauty of the solution is in its ability to scale up as demand dictates.

I was talking to BCO6181 – Tony de Thomasis’ uni course this evening about the use case where you have a wonderfully capable server that has 10 CPUs running at 1-2% utilisation all year. And you have a policy that no-one gets a pay rise unless they complete their annual performance review. Guess what, on the afternoon before the cut-off, the system is running at 100% capacity and people are complaining about how slow and poor performing it is. In the cloud you shouldn’t have to deal with that. But if you have to buy your cloud compute units annually, you are going to be in exactly the same space.

On the plus side, it looks as if this might be addressed soon. I really hope so, as I see a big potential for SAP HANA Cloud to be the next big thing in enhancing SAP’s cloud SaaS solutions, but if it’s just a glorified hosting arrangement, then it starts to loose some of that PaaS shine.

Thanks to all those who posted their thoughts publicly for me to capture in this blog. I hope you don’t mind me reposting, let me know if you’d like anything redacted.

 

 

 

 

On building your own brand

Today I was lucky enough to attend a SAP Mentors web meeting where someone from SAP (I’m not sure if they want to be named so I’ll leave them their anonymity) presented about building your own brand.

It was an excellent session, but probably raised more questions for me than gave me answers.

 

I am lucky enough to be in a position where I directly influence how the company I work for is run. As such I would like to think that internally we do not (yet) have the need for employees to need to raise their own profile in order to get noticed and rewarded. If we end up in that space, we should probably start looking at our talent management processes as a matter of urgency. And if that comes to pass, I will be doing just that. (Hopefully by then using something like SuccessFactors will be a possibility for small to medium businesses beyond what the current Professional Edition offers).

However, perhaps self promotion is needed whatever size your company? Even if there are just two of you! I’ll discount the single person companies, if you don’t know what you’re doing yourself you’re in trouble! Whatever size you are unless you effectively communicate what you are doing to the others in your company, you are doing yourself (and the company) a disservice. But is effective communication about what you’re doing the same as self promotion? I’d guess, Yes and No.

I think there is a fair bit more to self branding – which is why I started writing this blog outside of the SCN space. But I think it’s important not to confuse that with ensuring your company has effective talent management processes and encourages communication.

Anyway, better do some work.