Author Archives: Chris

Stack ranking, one of the worst ways to approach an already flawed idea

There’s a pattern here, Vijay posts up something on HR and I feel compelled to reply but end up writing far more opinionated rubbish than I should…

Nice post Vijay! But I will disagree.

Comparative employee rating (also known as stack ranking, vitality curves, rank and yank…) does not IMNSHO lead to useful or helpful results. In the case where enough employees are available to make bell curves a statistical likelihood (which I think would mean a huge number of employees and a huge variation in management and employee prowess which would most likely indicate a failed recruitment process, rather than a diverse company) then the likelihood that it would be possible to accurately compare one employee with another is very limited, Stack ranking only (doesn’t) works when it is possible to compare the employees. Which means the employees likely know each other, which means it’s probably in their own interests to screw each other’s performance. Check out the well publicised story at Microsoft – – under heading “The Bell Curve”.

“If you were on a team of 10 people, you walked in the first day knowing that, no matter how good everyone was, two people were going to get a great review, seven were going to get mediocre reviews, and one was going to get a terrible review,” said a former software developer. “It leads to employees focusing on competing with each other rather than competing with other companies.”

As I have previously mentioned I think the whole idea of performance reviews and ratings does nothing to help the employees, rather it just helps identify where good and bad management is occurring in the organisation. When we start linking review scores to payment, it gets even worse. Why? Because employees then start linking (even more strongly than they do already) their salary with their perceived self worth. Then when for whatever reason a large pay increase is not possible, the employee values themselves less. In the worst cases of this I have come across organisations where the employee contracts state that a performance review rating of 5 equates to n% of salary bonus payment, whilst a 4 is slightly less, and so on. The organisations have fixed salary/bonus budgets, so in order to pay out, they adjust the employees’ performance rating down (very rarely up!) so that the budget is met. Excellent employees are told that they are just “good” because there isn’t the budget to pay them if we tell them that they really are excellent.

I believe that there is a place for strongly objective reviews of employees, it’s the dark side of performance management. It’s that work that you need to do to be able to fire a disruptive or underperforming employee without having your arse hauled through the courts for unfair dismissal. Probably not an issue in the US I hear, but certainly a consideration in countries where the law is a little more friendly to employees. However, to drag all employees through a similar procedure when you don’t intend to fire them in the end, is not ideal methinks.

crystal ball


Peering into the future, short and longer term

Given my thoughts (and of course I haven’t a lot to back that up) that the only real positive value of current performance reviews is to evaluate the effectiveness of the management teams, I suggest that we remove the soul crunching and mainly pointless reviews and replace them with alternative ways of checking manager effectiveness. Google appears to have been doing a good job of this with its Project Oxygen and 360 reviews of managers – read the excellent HBR article an excerpt which quotes one of the Google manager which illustrates the value of the program is below:

“I was surprised that one person on my team didn’t think I had regularly scheduled one-on-one meetings. I saw this person every day, but the survey helped me realize that just seeing this person was different from having regularly scheduled individual meetings. My team also wanted me to spend more time sharing my vision. Personally, I have always been inspired by Eric [Schmidt], Larry, and Sergey; I thought my team was also getting a sense of the company’s vision from them. But this survey gave my team the opportunity to explain that they wanted me to interpret the higher-level vision for them. So I started listening to the company’s earnings call with a different ear. I didn’t just come back to my team with what was said; I also shared what it meant for them.”

This approach appears to be working at Google. Perhaps too well! A Google full of managers rather than leaders would be almost as bad a place to work as Yahoo for me. However, the concept of 360 reviews providing actionable areas for improvement, I think, is something that isn’t quite so blue sky. This is an idea we’d be better off implementing right now. I think there is a clear difference between “management” telling you that you could do better in areas compared to the team that you manage telling you that you could improve.

Looking to the longer term, I think it will not be far off where we can use data that we would not have considered analysing previously (social network graphs, semantic and sentiment analysis of work communication, external to enterprise group and social sentiment, etc.) to give us hints as to whether employees are more or less productive, motivated, stretched, likely to leave, etc. What is more, predictive analytics will improve in the HR space (hello HANA and comparing huge sets of data across multiple organisations available due to SaaS set up of the HR tools and therefore comparable data sets). We should start to be able to get that data and the predictions about how an employee is going to act in time to do some real time/preventive management (hopefully). This is going to be far more valuable than the formalised soul destroying performance appraisal process happening once every n months.

I’d go as far as to suggest formal reviews only exist because we have this feeling that we need to have something “objective” to use to manage our people. However, in reality the best/happiest/most productive workplaces are going to be those where the subjective views of the employees are that they are being well and fairly treated. I think we can do an awful lot more in our workplace to help our employees be happy and productive. And most of that improvement isn’t going to come from paying our employees more or telling them where on a scale of 1 to 5 they scored this year. Perhaps we like to think that an objective review feeds a subject view, I don’t think it does (or if it does, it’s rarely going to be positive.)

Edit – to try to clarify a few points here I wrote yet another post  To rank or not to rank, ‘cos that won’t work in the real world will it?


Lies to Children – Simplification for the sake of easy explaination

simplicityI was so close to tweeting this:

The earth & sun orbit around their combined centre of gravity. simply explanation isn’t the same as accurate, just a lot easier to explain

It even fits in 140 characters, but I don’t think it does justice to the point I wanted to make.

Michael wrote:

and I commented:

Michael replied:

I lol’d.

However, it raises a point I’d like to address, we often hear some very compelling stories about how thing are. One of those stories is about the earth orbiting the sun. If you look closely at the details, what the earth orbits is the sum total of gravitational influence in the solar system. It happens that sum total is pretty much smack bang centered on the sun, but it certainly isn’t always.

The simple story is compelling, and it may even be true for most use cases, but were I trying to calculate the trajectory of an asteroid potentially on a collision course with earth it wouldn’t be.

Likewise if Michael took my story about SaaS meaning the end of upgrades to his business it would be a very compelling and simple one. After all, someone else is managing that in a SaaS world aren’t they?

Look into the detail however and you might find things like APIs that you’re using for integration getting depreciated over time, certainly you’ll hope to find that the UI/UX changes, and so your training documentation will need updating. New functionality will come along and you may well adopt it.

Beware any simple and seemingly logical statement – especially if it comes from someone trying to sell you something.



Organisational Charts, is there a better way forward?

What does your company’s organisational chart look like?

a) the Eiffel Tower,

b) a bowl of spaghetti?

SuccessFactors Professional Edition – a thought provoking trial

I’ve been trying out the SuccessFactors Professional Edition (SMB market) software recently (and no, this is not a review of it, that’s coming later (maybe).) It gave me a moment’s pause to think. Does the organisational structure at my company actually resemble a tree (an upside down one I guess) at all? The SuccessFactors software has a great organisational structure visualisation tool (far nicer than the Nakisa one IMNSHO), but it’s all about visualising a traditional hierarchical organisational structure.

Different types of structures

At the same time I was thinking about this, I happened to read the supposed “Valve Handbook for New Employees“. On page 4 (I’ve included the link, if you haven’t read it, I can recommend it, fascinating stuff and far more than just the bit I’m talking about here) it describes the structure of the organisation.


It makes a point:

 “Hierarchy is great for maintaining predictability and repeatability. It simplifies planning and makes it easier to control a large group of people from the top down, which is why military organizations rely on it so heavily.”

Like Valve, I don’t see the organisation that I work for being particularly militaristic. I grew up as an “army brat” and therefore have a very healthy (in my eyes) disregard for any kind of imposed authority. Someone telling me that I must do something in a certain way, is almost a guarantee that I’ll try to find a different way of doing it. I try to treat the people I work with like I would like to be treated. Telling someone to do something is pointless, explaining to them why they should do something – that’s more like it.

I’ll digress from my main point here for a little bit, because a random memory has just sparked, and it’s sort of relevant. When I was a new grad starting out in the big wide world of SAP HR consulting all those years ago, my boss at the time hauled me out of the clients where I was shadowing and learning, and into the office. For one week I helped the office admin team file expense reports, collate time sheets and put together invoices After that, although I may never have been the best at getting my expenses in on time, when they did get in, they were very clearly and neatly arranged. Why? because I had learnt that doing so was a simple task for me, but made the life of the admin person so much easier. Because someone had taken the time to show me why I should do something in a certain manner, I was very happy to do it.

Hierarchy and innovation, not great mates

In their employee handbook Valve go on to say:

“But when you’re an entertainment company that’s spent the last decade going out of its way to recruit the most intelligent, innovative, talented people on Earth, telling them to sit at a desk and do what they’re told obliterates 99 percent of their value. We want innovators, and that means maintaining an environment where they’ll flourish.”

I’ll put my hand up right now and admit that Discovery is not an entertainment company, despite it sometimes being very entertaining to work here, yet I’ll completely agree with the sentiment of it being an absolute innovation killer to tell people exactly what they must and must not do. To me to provide the sort of environment that people are going to thrive in means everyone having a say and everyone moving forward.

Such a dynamic (yes my description and substitute whatever smanky term you want to use instead) way of doing things cannot, I believe, have a non-dynamic organisational backbone.

So let me try to put that on paper for you

I tried to draw a simple map of the relationships between a few of the employees in our company (disclaimer, I didn’t stop to think too long about who is linked to who very hard here, so if you’re on this chart and I didn’t link you correctly, sorry, it isn’t a real org chart because there wasn’t a whiteboard involved.)


when I tried to add just one more employee (Karsten) it just got far too messy:


My point is, that as a small company, we just don’t fit into the traditional hierarchical organisational structure. And to follow on from the point made by Valve, I don’t think it is in the best interests of our organisation or staff that we do.

Scientific interlude to counter excess HR fluffiness

Another digression (sorry) even evolution (Darwin’s tree of life) isn’t consider a tree these days, it has been recognised that due to the transfer of genetic information from and through viruses and bacteria there is an awful lot of our genome that doesn’t come from our direct ancestors, but from other species. It’s called horizontal gene transfer (HGT) and has been found to play a major role in forming species. To use this analogously, I should suggest that who you are working with, who influences you and who you influence are more important to who you are than the person that you supposedly report to.

Back to HR (or HCM, or whatever…)

Now I don’t think that either Discovery or Valve (or Dawin’s web(?) of life)  are unique in this. I think the days of the hierarchy are numbered, and what is more, we are inventing and deploying the tools right now that will be its undoing.

Tooling up for the revolution

Enterprise social networking, whether using tools like Jam, Streamwork, Yammer, Google+ (we use this a LOT internally, it’s free, simple and powerful!) or even going more external with tools like Twitter, LinkedIn, and, so help you, Facebook is clearly in vogue. It should be a simple matter to leverage these tools (along with email ) to find out who is talking to who. From this we would have a clearer picture of who is talking to who, how often and in what formats. We could use this data to help us consult the right people. We already do this in many ways, but imagine having a system that could help us. In the same sort of way that GMail prompts you to include certain people in an email based on your past emails but that would also check the content of your message (I know this sound horrendous to some of you, but I’m just imagining stuff here, not planning for an actual solution, bear with me). The possibilities of how we could capture and utilise the connections between our employees to add value to the business are only just starting to be explored.

I’d push the analogy that I’m trying to make so far as to say that communities of interest are the new org units of enterprise. Although you might not send a leave request to be approved by your local ketchup appreciation group (I used to read the USENET alt.ketchup group at uni for a laugh, how the world has changed! I can’t even find a link to it now.) You are more likely to check that your vacation isn’t going to leave the project teams you are working with in the lurch, rather than checking with the team with whom you are theoretically assigned but haven’t worked with for the last 6 months.

When it comes to handling career goal planning, I think that we need to be encouraging everyone to be part of the process.  (I happen to agree with Prof. Culbert about the usefulness of performance reviews, but strongly believe that goal setting is a great way to understand how to get to the next level, in a positive way.) 360 type reviews (where we reference and review with the people we are working with, rather than an arbitary “manager”) of the goals that we are setting allow ourselves allows us to help ourselves and our teams understand where are heading,  without the soul-sucking negativity associated with most performance reviews. For such a distributed process, there is no benefit to a rigid structure where person A conducts the review for person B, C and D. Again I see great potential in the use of social communication tools to share and organise and optimise these processes.

Full circle

So back to my original musing, what does my organisation look like? I don’t think I know yet, but I think it’s going to be fluid. If I want to be part of a successful innovative company (and who doesn’t) I think it need to be able to change shape depending on how and why I’m looking. And my view of the organisation should be able to change that shape without me needing spend days of constant restructuring.

And to finally relate that to something SAP

Returning to my thoughts about the SuccessFactors Professional Edition product and its use of strict hierarchical structures. I don’t think that these do fit with how many SMB companies are choosing to operate today. Yet, I can see how a SaaS solution that is planning to integrate “social” into everything they do (one of the strong messages from SuccessConnect) will possibly get me there a lot quicker than an onPremise solution will. I hope that by posting this up people will read this and start to think about how we can start to leverage the tooling that SAP is providing to be more creative, dynamic and successful. SuccessFactors people, you have a real opportunity to create something in this space, please let’s build something awesome.

As per always, these are my own personal views, and do not necessarily represent those of the company I work for. I purposely take a line which is at times controversial and contrary to many people’s beliefs. I don’t think I’m correct, it’s just that no-one has convinced me otherwise yet. This blog was originally published at but I thought it really ought to be here too. Partly inspired by Vijay’s blog about talent being unmanageable, and my thoughts on what does that mean about talent being managers. What I’d want to point out is that I see a future coming where out HRIS system may mean the end of people managers as we know then – thus solving the conundrum of how do we manage talent and/or should talent be managers.



References: in a list to make life easier for you

Valve Handbook for New Employees (my own adaption),


Should you be a manager?

A response to “Talent cannot be managed” by Vijay Vijayasankar.

I read Vijay’s excellent post about how talent should be lead and not managed.

It seems to have had a stratospheric response, with lots of people loving it. I had to pause for a moment and wonder why.

My first thoughts – involve a little set logic


Of all the people that are out there in the world, there are PLENTY that are unmanageable. (n.b. I do realise I spelt that wrong in whiteboard sketch, some reason there isn’t a spell check on whiteboards (now that’s a cool idea for a future demojam)). There are also plenty that out there that desire leadership more than they like being managed. Of that group there is a small subgroup that are “talent”. I’ve drawn a bigger overlap with “desire leadership over management” for talent as I agree more with this, but the overlaps aren’t really supposed to indicate % of overlap, more that there is some.

Vijay defines some other things about “Talent”: Loyalty, requirement for trust, lack of scalability, need for direction, these are all other things I could have drawn on the diagram. In all cases, there would be an overlap with the other areas (although not being very good and drawing n-dimensional diagrams on a whiteboard I didn’t attempt it.)

The point I’d make is although Vijay states (and I’d tend to agree) that talent possess these attributes, these attributes do not define who is a “talent”.

However, I’m pretty sure that anyone that read the article would be able to identify with two or more of those attributes. Unless the reader had particularly great self awareness, then the “logical” jump is “if I have these attributes, I must be a talent”. Result – instant warm fuzzy feeling. Next result – share warm fuzzy feeling with as many other people as possible. Result, lots of reposting.

Ok, I’m being a little  😉 cynical here, but I don’t think I completely off. Vijay has written a lot of other articles that have been just as good, and many of them have been less subjective. But perhaps haven’t addresses such emotional areas. This article has had a huge response and I think in part (and compared to his other excellent blogs) it’s because of the group identity emotional response trigger that it pulls.

I’m waiting for his next blog “Actually, you’re not a talent” and see if that gets the same response 😉

But that wasn’t the post title – it was “Should you be a manager?”

When I read Vijay’s post it did trigger some thoughts though, primarily, if someone were to identify with these points and consider themselves a “talent” should they really be in the manager role? Now, in most companies in the world, it’s impossible to rise to the top unless you take on some people management skills. But should we, could we, reasonably expect a “talent” that by Vijay’s definitions, “doesn’t mix with non-talent” to effectively manage a team of anyone other than “talent”? Given how rare “talent” is to find, could we even expect such a team to ever exist?

Do we need to think about special training for our “talent” to make then a little more accepting? Or do we risk taking them out of that talent space if we start burdening them with management responsibilities? Or perhaps there are special “talents” that exist who’s talent is people management? What does it say about the career progression and potential of talent if we can’t make them people managers?

One of the comments that I made on reading the post was:

Management is distinct from leadership – Talent leads, that is clear, but can/should it manage? That’s my question back to you Vijay 🙂

Thanks for such a great post.




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:

This code is shared under an Apache Licence version 2.0

class ZCL_XU_SEQUENCE_DIAGRAM definition
 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
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* See the License for the specific language governing permissions and
* limitations under the License.
 redefinition .
 redefinition .
protected section.
private section.
interface IF_ATRA_UML_TOOL load .
 methods ADD_CALL
 !IV_CALLER type I
 !IV_CALLED type I
 value(RV_DIAGRAM) type STRING .
 value(RV_DIAGRAM) type STRING .
 methods ADD_RETURN
 value(RV_DIAGRAM) type STRING .
 methods FILL_GAPS
 value(RV_DIAGRAM) type STRING .

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_XU_SEQUENCE_DIAGRAM->ADD_CALL
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_CALLER TYPE I
* | [--->] IV_CALLED TYPE I
* +--------------------------------------------------------------------------------------</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.
 lv_text = is_details-called_mod.
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>'.
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.
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.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</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.
 IF is_object-instance = 0.
 lv_name = 'Static Methods of Class\n' && is_object-object.
* 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.
 lv_name = `Instance ` && lv_counter && ` of Class\n` &&
 lv_name = `Function Group\n` && is_object-object+4.
 lv_name = is_object-object_type && '\n' && is_object-object.
IF iv_first_time = abap_true.
 lv_create_or_not = 'participant "'.
 lv_create_or_not = 'create "'.
 lv_participant = lv_create_or_not &&
 lv_name && `" as ` &&
 is_object-code && cl_abap_char_utilities=>cr_lf.
rv_diagram = iv_diagram && lv_participant.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_RETURN_TO TYPE I
* +--------------------------------------------------------------------------------------</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.
 READ TABLE _t_call_stack INTO ls_call_stack_from INDEX lv_stack_pointer.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_XU_SEQUENCE_DIAGRAM->FILL_GAPS
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</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.
 ls_previous_line = ls_line.
 ls_previous_line = ls_line.
APPEND ls_line TO lt_without_gaps.
rv_filled_gaps = lt_without_gaps.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</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.
 WITH KEY instance = ls_object-instance.
 WITH KEY object = ls_object-object
 instance = ls_object-instance.
 IF sy-subrc <> 0.
 APPEND ls_object TO lt_objects.
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.
 WITH KEY instance = ls_object-instance.
 WITH KEY object = ls_object-object
 instance = ls_object-instance.
 IF sy-subrc <> 0.
 APPEND ls_object TO lt_objects.
*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.
* this line does not concern code that we are concerned about documenting
 DELETE if_atra_uml_tool~sat_tab.
ls_last_call = ls_line.
* 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 ).
* 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.
* 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.
* 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 ).
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.
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.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</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.
 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'
 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 =
 OTHERS = 0 ).
if_atra_uml_tool~fname = lv_fullpath.
if_atra_uml_tool~generate_xmi_file( ) .
* <SIGNATURE>---------------------------------------------------------------------------------------+
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</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>.
 <lv_xstr> = cl_bcs_convert=>string_to_xstring( iv_string = get_sequence_diagram( ) ).
* if this happens we're buggered. not much to do really
 c_data = lv_ref_xstr.



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:

I wrote a blog post about it:–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

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:


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.

hide footbox
participant "Instance 1 of Class\nZCL_HR_EMPLOYEE" as 1
activate 1
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
activate 5
5 --> 4
deactivate 5
4 --> 4
deactivate 4
4 --> 1
deactivate 4
deactivate 1


 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.

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

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…



run through 10

Save the data and PlantUML starts converting it immediately:

run through 11


and the result:


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! 🙂 )


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.