<![CDATA[acmConsulting]]>https://www.acmconsulting.eu/https://www.acmconsulting.eu/favicon.pngacmConsultinghttps://www.acmconsulting.eu/Ghost 4.4Fri, 21 May 2021 10:56:57 GMT60<![CDATA[What makes something better is connection]]>https://www.acmconsulting.eu/post/what-makes-something-better-is-connection/60a7828806f39b41a8364473Fri, 21 May 2021 10:40:53 GMTThe QuoteWhat makes something better is connection

The title is the second half:

The truth is, rarely can a response make something better.
What makes something better, is connection. – Brené Brown

The quote comes as the final thought in this excellent RSA short:

The Source

I came across this as part of a presentation given by Didi Hirsch Mental Health Services about preventing suicide. Heavy. I know. But hard things are worth doing, and uncomfortable conversations about mental health and even suicide need to happen. We have to make the conversations about mental health and suicide safe to have, so if someone needs it, they can feel they are able to have it - the alternative is never having the chance to have the conversation.

The presentation by Didi Hirch was given with care, compassion, and it was surprisingly uplifting. I whole heartedly encourage people to explore getting training in suicide prevention, and/or to encourage awareness and discussion in your peer and professional groups. It's important. Didi Hirch offer sessions,  but I suspect there will be similar organizations locally to you - check them out.

It was an extremely thought provoking presentation. Both around the topic of suicide, which is one we need to talk more about. The quote stuck with me.

The wider application?

The quote is broad, it is presented in the context of empathy and mental health - but I wondered, does this apply more widely? Can it apply to problem-solving in general, to software development to business processes? Is this a general rule to live by? Perhaps.

As an optimistic and enthusiastic technologist, I find myself frequently slipping into "solution mode", sometimes earlier than I should, be that at work or in my personal life. This quote reminded me of that tendency, but also posed a radical alternative - that a response is actually not what you need. A solution isn't what you need. You need to empathize, to connect. That is the basis of any future solution.

When I find myself slipping into solutions mode, I catch myself, I pause, I listen, I ask questions, I give space - but the end goal is still the same, the solution. The quote offers an alternative, the goal isn't to find a solution, the goal is to find the connection. The solution is a by-product.

Empathy and connection should be the root of good problem-solving, perhaps that's what Bill Gates meant:

Techo fixes are not sufficient, but they are necessary
> Techo fixes are not sufficient, but they are necessary * Bill Gates, How To Avoid A Climate Disaster I love this. Quotes like this I find extremely useful way of keeping yourself ontrack - do you have any sayings or quotes that support or direct your day today? Bill made this statement in t…
What makes something better is connection
]]>
<![CDATA[Mental Commuting]]>https://www.acmconsulting.eu/post/mental-commuting/609baf8bfa5280c12372fa7fWed, 12 May 2021 10:52:32 GMT

Pre-Covid, many people had a commute, time taken to move your physical location from home to work, and back. Lots of people hate the wasted time spent on this daily grind, but some cherished elements of it - it's me time, listening to pod casts, reading, etc.

This separation of work and home, of mental states is something which, I think, deserves more attention and something we've lost when we lost our physical commute. For me at least, being able to compartmentalize those worlds has been a critical part of maintaining a health work/life balance and perspective.

How can you mentally commute?

Or to say it another way, how do you move headspace without moving physical space?

I think it's actually really simple, for me, it's and comes down to 2 things.

  1. Time
  2. Context

Both are about enabling a smooth and predictable transition, to let your brain, emotions and thoughts move from one state to another.

Time

Most people (myself included), need time to adjust. There are some among us who have a superpower, they are able to compartmentalize and switch extremely quickly - for everyone else, there is time.

How much time you need to settle after a day can depend on you and your day, but not spending time on this transition, risks the stresses or excitement from one area bleeding into the next. Turning the transition into a habit can also help reduce the time needed, in my experience.

Context

You work at work, and are at home at home. But when you work at home, things get tricky. So to help with separation, build context.

I'm lucky, in that I have a room I use as my home office, this means I can leave that room and "leave work" in that room too. But even without a room, you can tie your work context to something, a device (a work laptop), a position/chair dedicated to work or even the clothes you are wearing. Moving out of that context is a signal to you, your brain, those around you that you're not working any more.

Give yourself something to latch onto, as "work mode" and so an ability to deliberately switch out of it. Without it, you are always potentially "at work".

My routine

I use both time and context to keep my work and home life separated. I plan my day and schedule around these transitions has had a HUGE impact on my ability to focus at work and unwind after.

In my morning, I will take my kids to school, walking. When I get back to the house after dropping them, I enter my "office" and my day begins (with the bonus of a little exercise too).

At the end of my day, I schedule a 15 minute "decompression" time, it's in my calendar, as a meeting - I don't leave work (my room) till it's done. I use this time to take stock of the day, look at tomorrow and meditate. Its worth every second.

Experience Calm
Relax with Calm, a simple mindfulness meditation app that brings clarity and peace of mind into your life
Mental Commuting

To help me meditate I use the Calm app. I am fortune that my employer (BEN Group) who takes mental health seriously and offer a free calm subscription to all employees! If you are new to meditation (like me) I highly recommend the How to Meditate series, followed by Daily Trip (both by Jeff Warren). Each episode is about 10 minutes, perfect for the end of day decompression.

Meditation gives my brain permission (and time) to reset and re-calibrate before I leave my office, closing the door behind me, till the next day.

It's not perfect

Do I sometimes miss the decompression meeting - of course.
Have a sneaked back into the "office" later to do more work - yes.
Does it always work - no.

But its helped, a LOT. It might work for you, or it might not, but I'm sharing this as its helped me, and I want to help others - I hope it does.

]]>
<![CDATA[Microdosing wellness?]]>https://www.acmconsulting.eu/post/micro-dosing-wellness/60925bb49642b7475cd2fc20Wed, 05 May 2021 09:01:19 GMT

I've been reading quite a lot around team structure, growth and diversity, as a result I think the frequency illusion may have been kicking in - but its lead met to interesting places.

One place I found something interesting was in a blog post titled The Growth Equation: Stress + Rest = Growth where they quoted Matt Dixon a world-class triathlete and coach who said:

“Anyone can work their asses off,” ... “But it takes real courage to rest."
- Matt Dixon

This seems especially important as May is Mental Health Month in the US, and the next week (May 10th - 16th) is Mental Health Awareness Week in the UK.

This got me to thinking about a miss quoted idea from Gandhi:

Be the change you want to see in the world
- Not Gandhi

So what can I do? Be public about taking time off - absolutely. Remind my teams to do the same - yes. But what about others who are not in my teams, or what about situations where you just need a pause, a moment to collect yourself?

One area of stress, especially in a COVID world has been meetings, endless back to back calls. In a physical world, you have time between meetings even if it's just walking from meeting room A to B - you get time to switch context, grab a drink etc. With all meetings happening from your desk, that's no longer there. Back to back calls can mean not even getting up from the desk for hours.

Enter #firstfiveminutes

Microdosing wellness?
The idea is simple. When you start your meeting, give the first 5 minutes back.
First Five Minutes .club
Give the first 5 minutes back.
Microdosing wellness?

There are (of course) already tools to help with this, Outlook has a feature to start meetings late/end them early but only on Windows. Also, if there is a 10-minute gap in your calendar, someone could just schedule another meeting into that slot!

You could also try to end your meeting early - but, lets be realistic that is much harder than it seems, especially if the conversation is flowing. Fewer meetings, meeting free days/afternoons etc are all great options too - but sometimes or for some teams/people, that's just not an option.

I have decided to take matters into my own hands, to give people a microdose of calm, a moment to get water, stretch or take a bathroom break - seems silly, but the response so far has been extremely positive. I wonder if it's like giving thanks to make you happier, if giving wellness/mental health can make you healthier?

Can't hurt to try - right?

]]>
<![CDATA[Hate cookie banners? Want more privacy? Me too!]]>https://www.acmconsulting.eu/post/hate-cookie-banners-me-too/6086f5e4c8b58c9007b9dc4dTue, 27 Apr 2021 10:54:58 GMTRemember the good old days?Hate cookie banners? Want more privacy? Me too!

Back when the internet was young, you had hit counters, animated flames, under construction notices and so many GIFs and tables. Good times.

Hate cookie banners? Want more privacy? Me too!

You can revisit those good times via http://www.oocities.org or even download it from Bit Torrent.

But now we have GDPR pop-ups, CCPA, data leaks, scary big brother and all sorts of nasty hackers etc. Oh, how we pine for the simpler times.

Or not. It turns out being able to measure your audience, A/B test, segment and otherwise understand and how your app/website/tool is being used is extremely useful.

But, can you get all the wonderful measurement without impacting privacy and setting yourself up as a juicy hacking target? And most importantly, can you rid the internet of another cookie banner.

YES. YES YOU CAN!

Google Analytics without cookies?

Google Analytics is great, it's free, it works, and its extremely powerful - which is why so many people (me included) use it. But it has a cookie from one of the (if not THE) largest advertiser in the world, Google - but does it have to?

I don't want to track people around the Internet, I just want to know if people read my blog. Ideally, what pages, how long they read for etc. But can you do this without cookies?

Surprisingly, yes, you can make Google Analytics work without the cookies, and the implementation is actually really easy, as outline in the excellent blog post: https://helgeklein.com/blog/2020/06/google-analytics-cookieless-tracking-without-gdpr-consent/#other-platforms

<script>
const cyrb53 = function(str, seed = 0) {
   let h1 = 0xdeadbeef ^ seed,
      h2 = 0x41c6ce57 ^ seed;
   for (let i = 0, ch; i < str.length; i++) {
      ch = str.charCodeAt(i);
      h1 = Math.imul(h1 ^ ch, 2654435761);
      h2 = Math.imul(h2 ^ ch, 1597334677);
   }
   h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
   h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
   return 4294967296 * (2097151 & h2) + (h1 >>> 0);
};

let clientIP = "{$_SERVER['REMOTE_ADDR']}";
let validityInterval = Math.round (new Date() / 1000 / 3600 / 24 / 4);
let clientIDSource = clientIP + ";" + window.location.host + ";" + navigator.userAgent + ";" + navigator.language + ";" + validityInterval;
let clientIDHashed = cyrb53(clientIDSource).toString(16);

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'YOUR-GA-TRACKING-CODE', {
   'storage': 'none',
   'clientId': clientIDHashed
});
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
</script>

I've implemented it on this site already and so far, it seems to work exactly as you would hope/expect.

What about not using google at all?

Good question, at the end of https://helgeklein.com/blog/2020/06/google-analytics-cookieless-tracking-without-gdpr-consent they talk about a few solutions, some SaaS some self hosted and some really clever, like https://adwise.ch/blog/minimal-cookieless-web-analytics/ where you use serverless azure functions.

As a personal blog, I didn't want to spend money on analytics - but I did still want them. I also didn't want to spend much time/effort setting it up, so while interesting (and likely free) the azure server-less functions just seemed like more effort than I wanted to invest right now.

What about your CDN?

I use Cloudflare,  (I detail how I set things up here: https://www.acmconsulting.eu/post/hello-world/) mostly to provide an SSL certificate https://shyr.io/blog/free-ssl-for-github-pages-with-custom-domains - but it turns out they also offer free web analytics (https://www.cloudflare.com/en-gb/web-analytics/) which is privacy first.

Hate cookie banners? Want more privacy? Me too!

CDN based analytics is nice, as it doesn't need to drop a cookie -  But the free version is only at the site level, to get more you have to pay. Hence, why am still using Google Analytics.

A battle is won, what about the war?

No cookie banner on this website, excellent! One down, countless to go.

The bigger picture is considering why GDPR and rules like it exist in the first place:

This (...GDPR) should make it easier for EU citizens to understand how their data is being used, and also raise any complaints, even if they are not in the country where its located
https://www.privacytrust.com/gdpr/whats-the-real-purpose-of-the-gdpr.html

This sound reasonable to me.

May people (myself included) are concerned about what data is collected about me and how that data is used/stored. While GDPR and laws like it may have helped, I don't think they have won the war.

Sometimes, I accept I am providing data and attention as payment for a product, most often when using advertising funded platforms - and I'm OK with that trade, assuming it's done with respect and not misused. But that's not always the case.

Good adverts, like good content recommendations are actually better for me and enhance my experience while also offering the best results for everyone in the consensus triangle. Bad adverts are a waste of time, money and energy for everyone.

Targeting, tracking, measurement are all tools, if used well, for good, they can result in better outcomes for everyone - but it has to be done right.

A promising next step

If we do want to track, target and measure, we need to do so in a way the insures the rights, security and privacy of the people providing the data. Thankfully, some very clever people are working on a system to do exactly that - it's called differential privacy:

Differential privacy is a system for publicly sharing information about a dataset by describing the patterns of groups within the dataset while withholding information about individuals in the dataset.
Differential privacy - Wikipedia
Hate cookie banners? Want more privacy? Me too!

This is really clever, and it could (perhaps should) be the gold standard for metrics and measurement. It may end up doing what GDPR could not. Proving a way for business to collect data and understand their customers as trends while preserving the privacy of the individual.

A good explainer which goes into more detail is available here:

Explainer: what is differential privacy and how can it protect your data?
How should privacy be protected in a world where data is gathered and shared with increasing speed and ingenuity? Differential privacy, a new model of cyber security, provides a potential solution.
Hate cookie banners? Want more privacy? Me too!

For me, the most exciting part of this, is that differential privacy looks like it should work with AI/Machine Learning.

Ai Differential Privacy And Federated Learning
(Source: https://ai.googleblog.com/2017/04/federated-learning-collaborative.html)
Hate cookie banners? Want more privacy? Me too!

Microsoft with LinkedIn is leading the way on implementing differential privacy and I follow their progress with interest.

LinkedIn’s Audience Engagements API: A Privacy Preserving Data Analytics System at Scale
We present a privacy system that leverages differential privacy to protectLinkedIn members’ data while also providing audience engagement insights toenable marketing analytics related applications. We detail the differentiallyprivate algorithms and other privacy safeguards used to provide results…
Hate cookie banners? Want more privacy? Me too!

A better future is possible, and if you are reading this, its likely you are in a position to promote solutions like this, pushing for their implementation and delivery.

Be the change you want to see in your industry.

]]>
<![CDATA[API testing in the browser?]]>https://www.acmconsulting.eu/post/api-testing-in-the-browser/6082b7c4c8b58c9007b9dbdcFri, 23 Apr 2021 12:55:50 GMTYuk, why would you want to do that?API testing in the browser?

I know it sounds like a bad idea, but hear me out.

After trying many tools for integration testing of our web apps, we've found https://www.cypress.io, a great testing framework designed to be:

Fast, easy and reliable testing for anything that runs in a browser.

We liked it, and have adopted it for various needs. Its open source, developer friendly and generally a very useful tool. Its killer feature is being able to time travel, visually; to see actions as they take place and when a test fails, but also to move about in time, to the steps before a failure, which passed.

Being able to see the lead up to a failure really helps in identifying root causes, especially in the context of integration tests. It even records videos and takes screen shots if you run it headlessly (via the command line).

API testing in the browser?

We were sold!

But, the UI can be slow

Even something as basic as logging in, when done via the UI, is a multi step process, requiring quite a number of clicks, page loads, characters to be typed etc. The net result of all this is a request to an API login endpoint to get a bearer token.

As suggested in the cypress tutorials, you can speed up slow multi-step UI processes by using cy.request directly, skipping all the slow UI parts.

const options = {
  method: 'POST',
  url: 'http://auth.corp.com:7075/login',
  qs: {
	// use qs to set query string to the url that creates
	// http://auth.corp.com:8080?redirectTo=http://localhost:7074/set_token
	redirectTo: 'http://localhost:7074/set_token',
  },
  form: true, // we are submitting a regular form body
  body: {
	username: 'jane.lane',
	password: 'password123',
  },
}

// allow us to override defaults with passed in overrides
_.extend(options, overrides)

cy.request(options)

This works great.

It's a technique you can re-use in other areas, beyond login, as a way to speed up parts of a test which you are not actually testing. But, sometimes things fail - we are testing after all.

Using request like this is detailed well in the official documentation: https://docs.cypress.io/api/commands/request#Timeouts

API testing in the browser?

However, API requests are 2nd class citizens in cypress. You will see what failed (the expect), as shown above, but if it fails, you won't know why/see the data.

To see the data, you need to open the console, as shown below - which is fine when working interactively, but when headless, you miss out on all this information.

API testing in the browser?

Enter cypress-rest-graphql!

Inspired by cy-api we built cypress-rest-graphql to make working with REST and GraphQL end points easier and importantly, to display the data even in headless mode!

The cy-api module was good, but its focus was a little different and looked for tighter API integration / logging. We wanted something simpler, which didn't assume any API level integration. So we built cypress-rest-graphql. (We also created a test repository, so you can see it in action).

cypress-rest-graphql focuses on providing a few key commands:

/**
 * Helper to perform GraphQL queries on the API
 * Will display the query and response in the pane, for easy review.
 * Automatically uses cy.env('accessToken') for auth
 * @param  {graphQL} query - Query or Mutation graphQL
 * @param  {Object} variables - Key value pairs/object used as parameters to the query
 */
cy.graphql();

/**
 * Helper to periodically perform a graphQL query, checking the response against a condition.
 * 
 * @param  {graphQL} query - Query or Mutation graphQL
 * @param  {Object} variables - Key value pairs/object used as parameters to the query
 * @param  {Function} condition - Response data passed to this function, failed expects will trigger a loop. 
 * @param  {Number} wait=100 - Millisecond delay between polling
 * @param  {Number} maxTries=5 - Maximum number of retries before failing totally.
 */
cy.graphQLPolling()

/**
 * Wrapper to perform REST based API queries. Improved logging and review.
 * @param  {String} method='GET' - REST method to use
 * @param  {String} url - relative or absolute URL to hit
 * @param  {Object} postBody - Post body
 */
cy.rest()

/**
 * Helper to periodically perform a rest request, checking the response against a condition.
 * 
 * @param  {String} method='GET' - REST method to use
 * @param  {String} url - relative or absolute URL to hit
 * @param  {Object} postBody - Post body
 * @param  {Function} condition - Response data passed to this function, failed expects will trigger a loop. 
 * @param  {Number} wait=100 - Millisecond delay between polling
 * @param  {Number} maxTries=5 - Maximum number of retries before failing totally.
 */
cy.restPolling()

When these commands are called, as well as performing the request, the output is rendered to the UI, allowing you to see what may have caused an error/issue. Because it's rendered into the DOM, the time travel aspects also work really well

API testing in the browser?

Please check it out, me know what you think, PRs are encouraged.

I hope you find it useful.

]]>
<![CDATA[How do you structure status update meetings / emails?]]>With so much detail and so many moving parts, it can be hard to get the balance right between high level strategies / direction with low level tactics / details.

I find it depends a lot on the audience, but one thing I've found works at all levels is a

]]>
https://www.acmconsulting.eu/post/how-do-you-update-your-status/607ea1a075e3833129f0c1c3Tue, 20 Apr 2021 09:48:33 GMT

With so much detail and so many moving parts, it can be hard to get the balance right between high level strategies / direction with low level tactics / details.

I find it depends a lot on the audience, but one thing I've found works at all levels is a consistent pattern. By using the same questions/metrics/structure everyone knows what to expect which lets them focus on the change, not the structure.

An example of this is the 5:15 report (https://www.theglobeandmail.com/report-on-business/careers/management/cut-down-on-reports-with-the-5-15-method/article4106997/). The idea of this report is to create a status update which takes no more than 15 minutes to write, and no more than 5 minutes to read/understand. Repeatable format, easy to use.

I use 5:15 reports with my directs and manager as a way to get on the same page before a 1:1, so we can spend more time talking about things that need to be discussed.

I customized the 5:15 template, to work for me/my team. This the 1:1 template i use:

1. What personal accomplishments were made in the last week?
2. What are your personal priorities for the next week?
3. What blockers do you have, were overcome, do you see coming?
4. What would you like advice/guidance/help/more time to think about?
5. How are you feeling about work in general? Where is your head at?
6. What interesting/funny/clever thing caught your eye recently (can be non-work related)?

I really like the last 2 questions, as they can give a great jumping off point for the 1:1 and insight into how things are going.

I've also tried to use this format for group/team updates, but with less success.

Very interested to learn about other patterns or templates, especially for group / department or company wide levels. Please drop me a note on the usual channels if you have found things that work.

]]>
<![CDATA[Hello 👻 World]]>https://www.acmconsulting.eu/post/hello-world/6065a283a39bd264341534b2Tue, 06 Apr 2021 09:09:00 GMTBye bye TumblrHello 👻 World

I'm finally off Tumblr! I've moved to Ghost, a NodeJS based CMS/Blogging platform.

An interesting coincidence, just as I was doing my First Post to Tumblr, 8 years ago, Ghost was just starting out via a Kickstarter campaign - now, 8 years on they released a new version https://ghost.org/changelog/4/.

Why 👻?

The editor experience is really nice in Ghost, a what you see is what you mean style, with a very Markdown feeling editor. I liked it.

They have clearly been thinking about the publishing and editing experience, with a lot of nice features, without much bloat.

It supports scheduling, large number of integrations etc. A very polished first impression for sure.

I did consider other systems Gatsby.js+Contentful or Hugo, basically anything from the JAM stack trend. I was trying to avoid hosted solutions or massive PHP systems (WordPress/Drupal), no time for keeping up with patches.

Really, it came down to the editor experience in JAM style systems and Ghost won.

Moving

I had 8 years of post in Tumblr, over 110 posts, which I wanted to keep. Thankfully Tumblr has a great API, and I was able to extract the old posts out using a slightly modified version of Tumblr-to-ghost. I found the tags made things messy when re-importing to ghost, so modified the script to just assign a single tag (Tumblr) when importing.

I also found a few other tools, for getting data out, including a great post by Pollymath.net, and Tumblr2Markdown was really nice, but in the end the simple approach worked well for me.

Theme

I took a stock base theme called Edition, removed the membership features (which as of Ghost 4 are forced on you, somewhat controversially) and added a few other minor tweaks. It's on GitHub - https://github.com/a-c-m/Edition

I like it for now.

Issues

It has not been pain free, or even easy. I very nearly gave up at a few points. Many Yaks were shaved.

Problems I ran into:

1. Importing Markdown to Ghost is hard

  • I write a lot in Markdown, so wanted an easy way to import. Turns out there isn't a good one. Which is puzzling.
  • Copy/Paste into the MobileDoc based editor, works fine, but importing files as posts wasn't an option.
  • I explored various options, even starting to write my own converted. In the end I gave up and have legacy posts as embedded HTML

2. Routing / Custom URLs in Ghost is non-obvious https://ghost.org/docs/themes/routing/

3. Static hosting?

  • Given Ghost's history/pedigree from Gatsby, seems like a simple option for static hosting would have been a no-brainer. But it's not.
  • I really don't want to spend over $100 per year on hosting. Nor do I want to support/maintain a NodeJS server exposed to the internet. A static site seemed like the best solution.
  • Many options, most of them partial/not great.
  • Netlify perhaps? https://forum.ghost.org/t/how-do-i-create-a-free-ghost-blog-on-netlify/15662/2 - No, still got to host a public-ish node server.
  • Ghost Static Site Generator - https://github.com/Fried-Chicken/ghost-static-site-generator is what I went with - but really would have hoped something similar was built into Ghost from the start.

4. Redirects

  • So far, due to the static hosting and way I'm exporting/saving the site - I've not managed to get them to work, so will likely lose some SEO juice. But that's OK for now.

My solution

That's it. No ongoing server costs, I control the code, HTTPS, nice editor experience in Ghost. Works so far.

]]>
<![CDATA[Next Gen Note-taking / PKM]]>https://www.acmconsulting.eu/post/next-gen-note-taking/606594d5a39bd264341533fcThu, 18 Mar 2021 10:41:00 GMT

Anyone else using Roam Research or similar to take notes and create a Personal Knowledge Management system (PKM)?

I've recently discovered this way of taking notes, having been maintaining my own Markdown based notes for quite some time.

Roam seems to be the dominant player in the space, but their model of expensive SaaS and lack of data possession were big turn offs.

Because of this I've gravitated towards Obsidian.md, which seems great. I'm still in the early days however.

Really interested to learn from people who have adopted a Roam like system, then abandoned it.

Likely a fuller blog post will follow in a few days/weeks.

]]>
<![CDATA[#NoEstimates?]]>https://www.acmconsulting.eu/post/no-estimates/606596cda39bd26434153432Thu, 11 Mar 2021 11:00:00 GMTINDEX
  • TL;DR
  • Late to the party
  • Guilty by association
  • Inputs vs Outcomes
  • There is no cake
  • Are you OK?
  • How big is small?
  • Be Precise?
  • Do you trust me?

TL;DR

#NoEstimates?

Just my 0.02 units of currency - but :

  • Don't confuse estimation with setting a final project delivery date
  • Consider estimates as an input into a process, not an outcome/performance
  • Estimates can help the team plan their work and spot bottle necks/problems before they happen
  • Estimates can confirm and communicate a shared understanding
  • Velocity could be the answer - I'm not sure
  • Don't use estimates to measure output
  • Trust the team is working hard and the stakeholder isn't out to get you

LATE TO THE PARTY

Yup. But it does look like it's going on all night. The debate still rages, and who doesn't love a heated debate. https://twitter.com/search?q=%23NoEstimates

There are very smart people advocating for no estimates at all. There is a nice post by Malcom Isaacs, called "The #NoEstimate debate", which seems to hit a lot of the high notes and key players.

As I have come to understand it, the origin of this debate was trigged by a 2012 blog post titled No Estimate Programming Series by Woody Zuill, where he outlined the case for #NoEstimates.

No point me rehashing the debate, it's better if you read the debate summary and origin post above. Then I can dive into my own 0.02 units of currency on the topic.

Why am I sharing? Because I want to test my hypnosis. By sharing my thoughts and take on this, I am actively seeking contrary/other/agreeing points of view, so I can be better informed and make the right choices for my self and my team.

GUILTY BY ASSOCIATION

Some criticism of estimation, to me, seem to be linked to other processes people associate with estimation.

Using estimate to set hard delivery deadlines at the start of a project is very unpopular (rightly). Estimation is being associated with that bad practice, but it's not the process of estimation at fault - its how the estimate is being used.

Waterfall vs Scrum vs Kanban vs ?? It is another debate entirely, while making estimates can be a critical component of wider project management frameworks, I think its important we look at estimates on their own merits (or failures) and not taint estimation with our feeling of related (and/or dependent) processes.

INPUT VS OUTCOMES

I consider an estimates to be part of the input, not the output.

Accelerate Metrics have give us excellent ways to measure software development teams performance/Code Metrics, backed by some impressive research. They measure outcomes and there are a bunch of tools to help make this easy. None of the accelerate metrics, measure input, the book does talk a lot about the inputs - but they don't measure them.

If you start using inputs, as a measure of outcomes, you can get into an ugly place, fast. It sets up (and rewards) all sorts of bad behaviour, like padding estimates and/or you see Parkinson's Law kick in.

THERE IS NO CAKE

I admit, the idea of not doing an estimate is appealing.

Its less work, one less thing to do, before we get to the fun part of creating. It is easy to revert to #NoEstimate in times of stress or urgency - we don't have time, it doesn't add value, just get it done. Right?

But. From the Original Post that started it all:

Ask Boss to select one “small” thing that she felt was very important.

Quite a bit to unpack here:

  • "Small" is an estimate.
  • So now we are talking about degrees of estimation, not #NoEstimation. Right?
  • How does the team/pm/dev know what "small" is? Relative to other tasks? Relative to total time of the project?
  • Why pick a small thing? Why not just the very important thing?

Even in #NoEstimate, we still expect estimates.

Even if you remove the word "Small" and used any story without some kind of understanding of size, then there is the question of what's the right size for a story? How do you know when to break a story down more or leave it alone? What becomes our unit of work?

So we do estimate, the question is more about WHAT we do with the estimates.

ARE YOU OK?

If we do have estimates (and we do), what should they be used for? I would argue, as in input, they should be used to make sure the team members are OK.

By that I mean:

  • Is the team member stuck on their current task?
  • Does the team/team member have too much work?
  • Does the team/team member have enough work to be happy/busy?

It's hard to answer the above, without some metric or measure of input.

  • Looks like Mike has been on the same task for a week - is that OK?
  • Task was expected to be completed quickly = No, he may need help. We also may need to re-assess similar work in the future, what did we miss?
  • Task was expected to take a whole = OK, keep going, don't interrupt.
  • 5 tasks, no estimates, is that enough work for Jane for the next 2 weeks?
  • All tasks are small, expected to be completed quickly = Probably not, may need more - by why does she only have small tasks?
  • A mix of small/large = Yes, probably
  • All tasks are huge and complex = More than enough, perhaps we need to see about sharing out the work better?

If we use estimates as a way to keep teams happy and productive (not as a measure of output/outcomes), I think we can keep a lot of the value from estimation, its when estimates are used as a tool to measure output and/or fix deadlines, that we get into trouble.

HOW BIG IS SMALL?

"It depends" → "It doesn't matter"

But then why bother at all?

Because, I would argue, the value is in coming from an agreed group understanding on complexity/likely time to deliver. Doesn't really matter how you measure it: hours, story points or story count - it doesn't matter. The value here is in (as a team) exploring and communicating what needs to be done and how hard it might be to do it, before you start doing it.

The process of estimation is high value. Estimating work means dedicating time to understand it, agreeing on that understanding and then communicating that understanding in a standardized way.

That act of discussing, and then estimating can tease out unexpected or overlooked complexity, miss-understandings and gaps in understanding. If 3 devs agree, but one other has a very different estimate, that is something to be discussed.

Small? I've found that once a single task gets over a few days, all bets are off, so we should break it down and/or get more context. For me, an upper bound on tickets should be a few days.

What metric you use is much less important than the act of discussing and agreeing. And, once you have that agreement, that metric can be communicated to others, who can take it into consideration when deciding on the importance of any give task or group of tasks to achieve an outcome.

BE PRECISE?

Precise estimates and other logical fallacies.

Another key criticism of estimates is they are not accurate, and so they are not worth the time. As I discussed above, I don't think this is true. The value is in the process, as much as the output. Refining the accuracy of the estimates is useful in as much as it helps the team communicate and coordinate and better manage their own time/and input, not output.

They get even less precise if they are used as a measure of output, as they are easy to game, pad or otherwise manipulate.

WHY NOT VELOCITY?

In many #NoEstimate posts, they point to looking at velocity (tasks/stories completed) as an alternative to estimating.

Velocity is not without its drawbacks, it can be manipulated and may incentivize the wrong behaviour depending on how the metric is used.

But, even if you skip estimation and use velocity, you are still actually estimating on the front, to slice up the work into "small" story units to work on. But you lose resolution, A 1 line type-o fix in a field label vs adding a new database abstraction layer - both could be a single story, but with very different estimates and are not equal.

It feels like trying to measure an input, with an outcome. And you are going to miss out on the other benefits of estimation, if you skip the process. But perhaps its fine - I'm not sure.

DO YOU TRUST ME?

The final key criticism of estimates I want to consider, is fear. Fear that the estimate they create, will be used as a tool to punish or pressure them to do things that are unsustainable, unreasonable or unachievable and which then cause undue stress and disappointment.

Yes. This can (and does) happen. It shouldn't, but it does. Will abandoning estimations fix this? I don't think so. It might move the conversation from quantitative, to qualitative - which may buy time or give the louder voices a chance to control the narrative a bit. But, if the manager/business/client etc already doesn't trust a team, a number (or lack of one) isn't going to change that.

]]>
<![CDATA[Code Metrics]]>https://www.acmconsulting.eu/post/code-metrics/60659769a39bd2643415344aMon, 08 Mar 2021 10:51:00 GMTIndex
  • The 1st Question
  • The 2nd Question
  • The Background
  • The Metrics
  • The Tools
  • The Prices
  • The Conclusion

The 1st Question

"Q: How can we measure software development teams performance?"
"A: Metrics!"
Code Metrics

But, of course, then :

"Q: Which metrics?"
"A: ...?!"

Not so easy.

Metric Good/Bad/Ugly?
Lines Of Code Bad. We all know this. Too many lines = bloat, too few = complexity.
Commits Ugly. Could be gamed, very simply. Unclear value.
Velocity Ugly. Could be gamed. Is relative.
Utilization Ugly. 100% isn't a good thing.
Features Ugly. Lots of features being released isn't always what you want.

Etc. There are lots of bad ways to track software development performance.

Lucky for us, the hard-work (and hard research) has already been done by other people.

The 2nd Question

So we can, but...

"Q: Why are we measuring performance?"
"A: ...?"

So teams can improve, and so we have the tools to communicate the impact of changes and decisions on those teams.

  • Did the re-org last month help us?
  • How are we doing this month vs last?
  • Is code debt catching up to us?

Etc. Without metrics, it becomes a more subjective discussion. We love numbers.

Also, the right metrics can give engineers as a way to communicate harder to value root causes, technical debt, training, innovation, investments can be measured and valued - if we have the tools to do so.

The Background

A book, published in 2018 focuses on this question and answers it.

Code Metrics

Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations

It says good measures have 2 characteristics:

  1. They focus on global - so teams are not misaligned, they instead push towards the same goal.
  2. They focus on outcomes, not output - busy work isn't helpful.

The book has a LOT more than this, well worth reading if you haven't already.

The Metrics

Metric Description
Cycle Time Time it takes a task from the start of development to it being live in production.
Change Failure Rate (CFR) The percentage of deployments we have to rollback or apply a hotfix to.
Mean Time To Recovery (MTTR) Hours elapsed from the start of a service failure to system recovery.
Deployment Frequency How often we deploy to production.

The Accelerate book goes into a lot of detail about why these are good, how they correlate to high performing teams and benchmarks for team categorization. That's outside the scope here - step 1 is to track them.

Tracking and optimizing for these metrics can have a profound impact on product delivery. As well as being an excellent way to have those harder conversations with stakeholders around things like technical debt, re-platforming or other larger non feature lead work.

The Tools

OK great. How do we track this? It will depend. Each metric may need its own solution.

Option Opinion
Spreadsheet Can work, but it could be a lot of work.
Ticketing system To the extent they support it, its good, but likely you won't get exactly what you need.
Dedicated Solution Will give you the exact data, but you pay for it - is it worth it?

Spreadsheets

As a last resort only, instead look to automate things. Can be an OK place to start, or if tracking it any other way is even more time consuming. But generally, you want to avoid this.

Ticketing system

Can get quite close with the data it has. JIRA, for example, offers a range of reports (as would other tools). The closest in JIRA is the "Control Chart".

Code Metrics

You get cycle time, which is a lot of value and interesting (if a bit confusing) graphs. The other metrics require additional data (e.g. deployments, failures, etc) which this graph doesn't show and the tool itself may not have access to.

For some teams, the Control Chart + spreadsheet could be enough.

Dedicated Solutions

Accelerate metrics are popular, so people have built things to automate/improve/display the metrics.

There are quite a few companies which do this, most tie into your ticketing and source control systems, to extract the needed data. A quick survey of the marketplace gave me the following services:

Name URL Description
LinearB https://linearb.io/ We correlate and reconstruct Git, project and release data so you get real-time project insights and team metrics with zero manual updates or developer interruptions.
Haystack https://www.usehaystack.io/ Remove bottlenecks, optimize process, and work better together with insights from your Github data.
Plural Sight - Flow https://www.pluralsight.com/product/flow Accelerate velocity and release products faster with visibility into your engineering workflow. Flow aggregates historical git data into easy-to-understand insights and reports to help make your engineer teams more successful.
WayDev https://waydev.co/ Waydev analyzes your codebase, PRs and tickets to help you bring out the best in your engineers' work.
CodeClimate https://codeclimate.com/ Velocity turns data from commits and pull requests into the insights you need to make lasting improvements to your team’s productivity.

Plenty of options, they provide very similar services (with their own take/pros/cons).

They all provide some or all of the accelerate metrics, but their ability to fit your team is something you will need to test for yourself.

Luckily, integration with these services seems to be VERY fast, you hook up your version control and optionally ticketing system, and they provide instant value/data.

The Prices

Pricing isn't simple, each SaaS solution has different breaks and ways of pricing/scaling/segmenting - but all seem to price per dev.

For my needs, I'm thinking about total yearly cost, so I did some quick maths.

The following is based on a tier which includes being linked to a ticketing system to maximize the features/metrics available.

Code Metrics

Google sheet of costs

I went with a Fibonacci increment, to cover most cases, you can copy the sheet if needed.

As you can see, there is quite a difference in price, with the cheapest options depending on team size.

The Conclusion

  • Performance of software teams can and should be measured
  • Accelerate Metrics https://amzn.to/3e9EPcK are the industry standard
  • Tools can help, but won't cover ever case
  • Small teams can get services for free, with low adoption time
  • Larger teams should probably see if they get value, consider carefully TOC and start with a trial/cheapest option, before going all in on a large additional spend. It can add up FAST.

What did I do?

Currently, testing LinearB with several teams, which so far have seen good value from the data.

]]>
<![CDATA[Mini Eggs + microwave?]]>https://www.acmconsulting.eu/post/mini-eggs-microwave/60659b20a39bd26434153494Fri, 05 Mar 2021 11:07:00 GMTSteps:
  1. Get a few mini eggs
  2. Resist the urge of eating them right away
  3. Put them into a microwaveable plate/bowl (out of packaging)
  4. Microwave for 10-30 seconds (try in 10 second bursts, then taste test)*
  5. Enjoy!**
Mini Eggs + microwave?

* Warning, contents may be hot.
* WARNING, you may find yourself eating the entire bag.

This culinary innovation was brought to you by my co-workers in the Branded Entertainment Network London office, specifically @AbiMieszczak!

Happy Easter egg season.

Mini Eggs + microwave?
]]>
<![CDATA[Insightful videos/books]]>

What books or videos have you watched which were aha moments or step changes in your thinking? I’m specifically interested in software/management topic, but would love recommendations from across the spectrum.

For me, in the last year, one of my key aha moments came from this video:

]]>
https://www.acmconsulting.eu/tumblr/insightful-videosbooks/606592efa39bd2643415329fThu, 04 Mar 2021 09:16:52 GMTInsightful videos/books

What books or videos have you watched which were aha moments or step changes in your thinking? I’m specifically interested in software/management topic, but would love recommendations from across the spectrum.

For me, in the last year, one of my key aha moments came from this video:

And then the book by the author https://amzn.to/3kJxEcf - I found the video long after the original talk was given, but its still excellent.

Team topologies focuses on the idea of Conways law (“Organizations will build systems which are copies of the communications structure of the organization”) and trying to build software that fits in your head (optimize for cognitive load). It gives practical and actionable advice and after applying it, I’ve seen big improvements.

What was your aha of the last 12 months?

]]>
<![CDATA[Techo fixes are not sufficient, but they are necessary]]>

Techo fixes are not sufficient, but they are necessary

  • Bill Gates, How To Avoid A Climate Disaster

I love this. Quotes like this I find extremely useful way of keeping yourself on track - do you have any sayings or quotes that support or direct your day to day?

Bill

]]>
https://www.acmconsulting.eu/tumblr/techo-fixes-are-not-sufficient-but-they-are/606592efa39bd264341532a0Fri, 26 Feb 2021 15:00:32 GMT
Techo fixes are not sufficient, but they are necessary

Techo fixes are not sufficient, but they are necessary

  • Bill Gates, How To Avoid A Climate Disaster

I love this. Quotes like this I find extremely useful way of keeping yourself on track - do you have any sayings or quotes that support or direct your day to day?

Bill made this statement in the context of solving the climate crisis, which makes a lot of sense, but it also (for me) applies in my professional work. Like Bill, I’m a technophile, always looking for a solution with a technological solve, but while tech is the key, its not enough on its own. Of course i know this, but a pithy reminder like this helps keep it front of mind.

Got any other good ones?

]]>
<![CDATA[[HIRING] Javascript, full stack (HapiJS & ReactJS) - Remote position *...]]>[HIRING] Javascript, full stack (HapiJS & ReactJS) - Remote position • /r/remotejs

BEN is hiring again! Javascript full stack, remote position.

]]>
https://www.acmconsulting.eu/tumblr/hiring-javascript-full-stack-hapijs-reactjs/606592efa39bd264341532a1Tue, 04 Oct 2016 11:54:41 GMT[HIRING] Javascript, full stack (HapiJS & ReactJS) - Remote position • /r/remotejs[HIRING] Javascript, full stack (HapiJS & ReactJS) - Remote position *...

BEN is hiring again! Javascript full stack, remote position.

]]>
<![CDATA[Make Your React Components Pretty - WalmartLabs]]>Make Your React Components Pretty 💅 – WalmartLabs

Some nice tips in here, i disagree with some (e.g. we don’t use SFC) but the statement “Code is meant to be read by humans” is very true. Optimise for the humans.

]]>
https://www.acmconsulting.eu/tumblr/make-your-react-components-pretty-walmartlabs/606592efa39bd264341532a2Mon, 03 Oct 2016 08:17:42 GMTMake Your React Components Pretty 💅 – WalmartLabsMake Your React Components Pretty  - WalmartLabs

Some nice tips in here, i disagree with some (e.g. we don’t use SFC) but the statement “Code is meant to be read by humans” is very true. Optimise for the humans.

]]>