A format for Strengths Based Feedback

This is a format that we used when I was working with my Leadership Coach Stacey Sargent. I use it often and have found that it normally leads to an insightful, constructive discussion, and it’s so much more interesting than “what did I do well and what can I do better”.

Strengths based feedback:
(a) what do I do really well that I should capitalise on more, and never stop doing?
(b) If I shift one thing, that would be the biggest leverage point, what would I focus on?

Why do I like this format so much?

It still conforms to the effective feedback principles of strengthening confidence and increasing effectiveness.

I’ve found that in part (a), people often come up with things that you take for granted and “just do without thinking”, but actually, these are your super powers, you should embrace them and build on them. You  might also find that people point out reasons that they value you that you wouldn’t have even noticed or realised.

Part (b) is about what can you focus on to grow. I like the word “leverage”, to me it implies that sometimes the smallest adjustment can have the biggest difference. What is that one thing?  Maybe it’s some new behaviour that you haven’t shown before, maybe its building on something that you are already strong in, but taking it to the next level. Notice also that it doesn’t use the word ‘change’, but instead “shift”, which seems like a much more reasonable ask.

The other thing I love about this is it is written in the style of a conversation. Rather than writing feedback in a way for others to consume, it is written to the person you are giving feedback to. I feel it changes the tone of the feedback and becomes much easier to write and to consume.

Love to hear if you’ve used a format like this before and how you got on?

Anne’s Top Tips for Enablement – Lessons from being an Agile Coach

Often at ThoughtWorks we will be asked to help train and up-skill the client’s team members whilst we co-deliver projects. We call this enablement.  These are some lessons that I learnt whilst being an agile coach and from having 1:1 coaching sessions with clients, that are worth thinking about if find yourself on the “consulting” or “coaching” side of a relationship.

Tip #1: Understand the expectations from the start

What kind of engagement is it?

Think about what kind of situation you are in.  Are you there to  “just deliver x”? Are you working closely with a client team?  Are you there in more of a coaching or consulting capability? It could be something anywhere along that spectrum. Wherever you land on that spectrum there will always be some degree of influencing, education and support of the client needed.  You will need to bring people along with you, whether it’s a single stakeholder or a team of developers, this to me, is enablement.

Pick technologies and techniques that the client can support

More often than not, we will be leaving behind some software or hardware that we are expecting the client to be able to maintain or support to some degree.  Really think about this when picking technologies, designing your software, and evolving your process.   How different is this to what the client has done before?  What are their core skills in, and what’s reasonable progress from that?  Often the newest, coolest techniques are not going to be easily learnable in the time that we have with them. Think about your choices and don’t leave them with something they won’t be able to look after. Do the right thing by the client.

Talk about it often

At an account level, make sure you talk about what degree of enablement you are expecting, ensure that it’s planned in from the start, and check that you are progressing, revisit decisions and assumptions regularly.

Tip #2: Put yourself in their shoes

Work on courage and confidence

People’s confidence can often take a huge hit when they are transitioning to a new skill set. For example between waterfall and agile or from one technology to another. Until the person can work out how to adapt their current skills to meet the needed skills, they can often feel like they have no skills at all, they might feel they no longer have anything to bring the table and that they are the only ones feeling like this. Multiply this phenomenon by the fact that it’s not just one new thing thing they are experiencing, it could be their whole working environment, how they collaborate, how they contribute, the people round them and it can spiral quickly.  It is really hard to stay confident and courageous with all this going on.  At the beginning focus on doing everything you can to help people grow in confidence and courage, so that they can throw themselves into learning.

Consider learning agility

Learning Agility, the ability to learn, adapt, and apply ourselves in constantly morphing conditions, is something that as consultants, is a required skill. In some larger, more traditional environments, this is not something that employees have a chance to practice and develop often, so their learning agility levels might be quite low. This doesn’t mean they can’t learn, but that the process might be a lot slower that someone who is more practiced. It’s quite a different mindset, so think about how reasonable it is that we expect someone with lower learning agility to “just pick up” tens of new tools and practices at a fast pace. Really think about how patient you are being, slow down, cover basics and practice fundamentals often. It takes time to develop the skills of learning, but helping people build these skills can make such a radical difference in the future.

Show your vulnerability

It can be very intimidating to learn from an “expert”, someone might feel like this “expert” can do no wrong, that they never make mistakes, that they are always confident, that you don’t have anything to add.  Try sharing stories of times that you have struggled to pick things up, or situations you have felt scared in. We all feel unconfident at times, admit that to them, you’ll see a massive difference. Make sure to ASK for their input don’t just expect them to speak up without encouragement.

Make sure you cover the basics

Don’t forget to cover the basics, explain the dynamics and responsibilities when pairing, cover basic TDD and red, green, refactor, go into the finer details of how to write stories and plan work. Always remember to explain WHY. Keep repeating this basics, when you are new to anything it takes a lot of mileage and repetition until you start to understand the nuances.

Tip #3: Get to know the people you are working with

Build rapport

Rapport is one of the most important things when coaching. There needs to be trust and respect between both parties.  You might want to ask how they got into what they do, what their experience is at the company, find out what they do for fun, look for common ground.

Talk about goals and aspirations

Take time to ask and listen about what their goals and aspirations are, you are more likely to find you have a motivated pair if you can help find them opportunities that they would enjoy. One idea that someone had which I thought was great, at the start of pairing or at the start of the day the pair should talk about what learning or knowledge they want to gain out of the activity. This will help you work out when to take more time over particular concepts, and when it’s ok to go at a higher level of understanding.

Value them and their skills

It doesn’t matter what experience or background people have, everyone has skills to offer, everyone will bring different perspectives. Your clients will have the best domain knowledge, and they know their own systems better than anyone. They are software professionals, probably with a lot of experience. Value and embrace this diversity in thinking.

Open the feedback conversation

It’s important to create an environment where feedback is encouraged and accepted. This might not be something that currently exists, it is our job to create that space. Make it a place where they are comfortable enough to be able to feedback to you about how they learn and what helps them.


I hope that you have been able to take away some tips that you can apply in your next enablement situation.  Please reach out to those around you and ask for help, and make sure the team is talking about enablement and how it is progressing. Developing the empathetic skills I’ve talked about above will make a huge difference in creating a successful enablement situation.

Where have I been?!

Well, it would seem a year has gone by….

Most of that year was spent commuting back and forth to Glasgow from London each week for ThoughtWorks. I was working with a client up there from late April 2014 to early March this year, first as a developer and then as an Agile Coach, leading the enablement stream on a transformation programme. It was the most amazing experience being a full time coach again and has given me lots of fodder to share my learnings and ideas around. Scotland is beautiful and I made some great new friends and colleagues. Stay tuned.

I’m now back based in London, and have taken on a new role, working in a supporting role to the senior techie groups at ThoughtWorks and our CTO. So far it’s been fascinating, and am looking forward to getting into that more. One of the things that I have just put together in that role is this, the ThoughtWorks Technology Radar! More about that at some point.

I’ve been back for another round of amazing leadership coaching from Stacey Sargent of Connect Growth and Development, it was my last session today, and really made me realise that I should get back to writing. So will be working on a round up of my learnings soon.

Oh, I’ve been in a book! My good friend and colleague wrote a book called “Talking with Tech Leads” which is a bunch of interviews and insights from tech leads on various stages of their journeys. One of them is me!

I’ve been on some fun trips, we spent Christmas with the Canadian half of our family, got lots of skiing in, had weekends up in Scotland, sunny weekends in Devon, hung out in Munch and Venice last autumn, friend’s weddings, and just got back from my first time to South America, I spent a week working in São Paulo, Brazil.

I ran my first 10K race and even spent and evening learning Curling (it was amazing, do it!)…

So, here’s to making the space to returning to blogging!

– Anne

Leadership coaching – the best investment I have made in myself.

I have just wrapped up 6 months of coaching with Stacey Sargent from Connect Growth and Development, and it was such a great experience. I wanted to capture some of my feelings so that I could always remember how much of a difference it made.

Why do leadership coaching?

I was lucky enough to be given a yearly budget from my company ThoughtWorks to use for personal development. Some people spend theirs on a far flung conference or books or the odd workshop, and I’d been pretty rubbish at using mine at all in the last few years.

Right now I’m in that middle zone of transitioning to a “leader” on my teams, no longer content with not being able influence the direction of the project and the people on it and starting to feel brave enough to dip my toe in the responsibility that is official leadership roles. I needed a push!

I wanted to focus on my own growth and development. Spend time thinking “What it is that I want?”, and “How to get the best out of myself?” so that I could get the best out of the people and the situations around me.

I have quite a high EQ but sometimes it can be overwhelming, so I wanted help learning how to manage this. I wanted to know how to be a calm, confident leader that people can look to in times of stress and uncertainty. Most of the time I project a very positive, passionate and energetic persona, whilst sometimes I’m actually feeling panic, doubt and uncertainty on the inside. I wanted to feel on the inside what I seem like on the outside.

I wanted to be able to have the tough conversations that I need to have with people to build good relationships, I shied away from personal confrontation.

To work on these things I figured I needed dedicated effort and practice to do so!

How to find a great one?

Find someone who knows what they are doing, and that you have great rapport with. You need to be able to trust this person enough that you will be able to be honest with them, and not be afraid to say the things that maybe you haven’t said out loud before.

For me it was helpful that Stacey did not work for the same company I did. It really provided some unbiased outside perspective.

Work out if you feel like you would need to physically meet up with your coach or if you would be able to be build your coaching relationship remotely, over Skype or some other tool.

I actually had been lucky enough to attend two sessions that Stacey had run at a couple of the Grace Hopper Celebrations that I had been at, and knew that she now runs a coaching company. So called her up and asked.

How did it work?

We would meet twice a month, on Stacey’s suggestion. My first thought was “how am I going to find the time?!” But actually, that frequency provides you with enough focus and reminders to be constantly thinking about how you can be growing.

As I live in London and my coach was in Seattle, we managed to find a time that suited as both, I chose Monday evenings as it helped me start the week off right. We would Skype for an hour or so. I think neither of us were sure how coaching remotely would go, but actually it worked out better than either of us had expected. I’m not sure it would have worked so well over just the phone. With the camera on it was much easier for Stacey to see my physical reactions and to see me squirm when I wasn’t giving an honest answer to myself!

There were days when I was grumpy and upset, and there were days that I was super energised and positive. Sometimes we would work on helping out my immediate situation and other times a more long term high level look at my goals and growth.

What did I learn?

I got an enormous amount out of these 6 months. I think the headline is that I know so much more about myself now.

Having a better understanding of what my strengths and values are gives me something to always check my trajectory with.  This helps me know when and how to push myself. If I’m in a situation I’m uncertain about or wondering if I’ve pushed too far, I can do a sanity check to see if I’m still holding true to my values, and if I am then to be brave and keep going!

We spent quite a lot of time coming up with the goals for my growth. It took many iterations, but what we came out with in, really hit all the key areas and may not have been what I was originally thinking they might be. Having these goals will help me be more intentional about the choice that I make.

One of my goals was to have an answer to “What do you want to do? What to you enjoy doing?”. So I looked back at my previous experiences with a very open mind and thought about what the things were that motivated me, or that I really enjoyed, what did I not enjoy so much, and I came out with 4 things that create an environment that I can really thrive in. This has really helped me to have conversations about how my company and I can put me into situations where they will get the best out of me. A benefit for both them and me! Having these concrete ideas and showing the process that I did to come up with them, has helped me start very rational objective discussions.

Training your brain to be more introspective. It takes a while to get used to analysing why you do what you do. Getting into the habit of it takes practice. During the start of my 6 months coaching, Stacey would have to ask a lot of questions before I would finally realise what the underlying motivations were to a certain situation. By the end, I could almost complete the whole loop before the problem statement had even come out of my mouth.

Along these similar lines, I have always had a bit of a self deprecating tendency. I often slip back into it when going into new situations. Again though, by the end of our sessions I could normally catch myself and consciously turn it more positive. The next step is to not even think it!

We also would work on more tactical aspects when needed. If I was experiencing a particularly tough situation or relationship at work, we would talk through in depth. Thinking about why it was happening, what could I do about, how best to approach it.

I have gotten better at being brave enough to have conversations that I might be afraid of. Approaching them with more structure, thinking about them, and practicing them before I have them.

I am a fairly emotional person, but can also be quite rational. These two sides of my brain were at war with each other. I thought that I needed to be more rational and try and squash my emotional side. I realised though, these sides combined are who I am. It is what makes me me. It is also, often, what makes me very effective. So I am trying not to react but to be intentional with my conversations and actions.

What helped?

  • I love learning
  • I am happy to throw myself into uncomfortable situations and to doing things in a different way to help myself grow.
  • My coach and I had a great rapport and high levels of trust
  • Stacey was not afraid to call me out if I was slipping back  into old habits
  • Regular contact kept me focused

In conclusion…

I feel like I know myself much better than I did before.  I have much more confidence in who I am. I understand and have come to terms with what I bring to the table on a team.

I’ve realised that to be the best leader that I can be I have to be my own unique self and work hard to work out what that is. I can lead with my own style while staying true to what I value in both myself and others.

As I am in the early stages of my leadership journey, my learning is currently more focused on myself. I’m hoping that soon, after I have more practice, I can have another go and change my growth focus to how to get the best out of the people that I am leading.

It was a truly great experience and I am thankful for having the opportunity.  I am very grateful to Stacey and all her hard work, understanding, passion and patience.

I would very much recommend making this investment in yourself if you want to grow into a great leader.

Speaking Event – The Science of Diversity

Myself and two of my colleagues will be talking about the science of diversity and whether diverse teams are better than non diverse teams….
If you are in London please come along! http://www.thoughtworks.com/events/science-diversity
ThoughtWorks would like to invite you to meet with us at an upcoming event. Please share!
ThoughtWorks deliver software to people with ambitious missions and we’re looking for talented techies to join us. We value diversity and on 18th November we are hosting an evening with our CTO Rebecca Parsons who will be taking a scientific and technical approach to answer the question ‘are diverse teams better?’ 
There will also be an opportunity to network and find out about careers with ThoughtWorks. 
You can register here – we look forward to meeting you!
Please contact Katie kpartridge@thoughtworks.com @katielisa52 for more details.Inline images 1

Creating C# .Net Websites in IIS with a Powershell Script

I created this little script to automate the creation of websites in IIS. It’s written in powershell.

You will need to run this script in powershell thats running in Administrator Mode.

You will need to have .net installed.

Step 1 Loading the Web Administration Module

This script is using the WebAdministration module to do the creation and removal of websites. To be able to load this module before it runs my powershell script I create a .cmd file that I would call that would load this module and then call my main powershell script.


powershell -executionpolicy remoteSigned -command import-module .\PSCommon\WebAdministration;.\install_website.ps1

Step 2 Creating the main .ps1 script

Create a new script, I called mine install_website.ps1. I put mine next to my install_website.cmd.


C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

$website_name = "MyWebsite"
$website_source_directory = resolve-path "..\MyWebsite"
$website_virtual_directory = "IIS:\Sites\MyWebsite"

$app_pool_name = "MyWebsite_AppPool"
$app_pool_virtual_directory = "IIS:\AppPools\MyWebsite_AppPool"

$sub_application_name = "SubApplication"
$sub_application_source_directory = resolve-path "..\MyWebsite.SubApplication"

Function CreateWebsite {
 New-WebAppPool $app_pool_name
 Set-ItemProperty $app_pool_virtual_directory managedRuntimeVersion v4.0
 New-Website -Name "$website_name" -PhysicalPath $website_source_directory -ApplicationPool "$app_pool_name" -Port 8082 -Force
 New-WebApplication -Name "$sub_application_name" -Site "$website_name" -PhysicalPath $sub_application_source_directory -ApplicationPool $app_pool_name

Function RemoveWebsite($app_pool_virtual_directory, $site_virtual_directory, $website_name){
 if (Test-Path $app_pool_virtual_directory){
   $webSite = Get-Item $site_virtual_directory
 if ((Get-WebsiteState -Name "$website_name").Value -ne "Stopped") {
 $poolName = $webSite.applicationPool
 $pool = Get-Item "IIS:\AppPools\$poolName"
 if ((Get-WebAppPoolState -Name $poolName).Value -ne "Stopped") {
 Remove-Website -Name "$website_name"
 Remove-WebAppPool -Name $poolName

RemoveWebsite $app_pool_virtual_directory $website_virtual_directory $website_name

As you can see I have two functions. One creates my website and associated app pool, the other removes it if it already exists. So I can run my script multiple times without a problem.

CreateWebsite, first sets up a new app pool, sets its ManagedRuntimeVersion to v4.0, creates a new website and then we also needed a sub application below that, so also sets that up.

Automating WebPageTest with a Ruby Script

WebPageTest is a great tool for seeing how well your website is performing. I was just on a project where the speed of a particular results page loading was the focus. How long the server took to respond, how long the UI took to render, what it was rendering, and where there were places for optimisations. We also wanted to measure the users’ perceived page load time.
We wanted to create an automated test that would run regularly so that we could track changes in page load over time.

Reasons why we picked WebPageTest

  • Ability to test any URL we wanted (ourselves, competitors, etc.)
  • Multiple browsers that can be used to test pages
  • Multiple locations and line speeds to test from
  • Can be automated (they have a REST API)
  • Ability to pin point a particular DOM element to measure load time of. For example we might consider the user perception of the page load as when there are 10 results on the page.
  • Provides a waterfall of all the objects loaded onto the page so that we can look for optimisations.

We set up the following to prototype (read: not production quality)  a top line measurement tool that the business could use to see how performance was tracking from a users perspective. With only a week of these tests running we found 3 issues that had been causing major problems with the page load time.

Where to start?

WebPageTest provide a RESTful API that we can use to interact with them. You will however have to host your own  private instance of WPT to be able to automate public URLs. You will also have to set up an agent for that instance to talk to.

Follow this guide for more information Setting up a Private Instance of Web Page Test. We set up  a couple of Amazon EC2 boxes for ours. (Make sure you pick at least Small rather than Micro)

Once you have that setup you should have a private instance of WebPageTest and URL that you can use to start manually testing your website.

For the purposes of this example I am going to test the BBC news website… I also used Ruby for this script. This was my first ever time creating a Ruby script for something like this, so keep that in mind!

These are some steps you can follow to build up a scripted test, and then store the results in a MongoDB for analysis later.

Step 1:

Call your instance of WebPageTest with your URL of choice and get back a 200 response

#!/usr/bin/env ruby
require "net/http"
require "uri"

test_url = "http://www.bbc.co.uk/news/"
baseurl = "http://[WEB PAGE TEST SERVER]/runtest.php?runs=1&f=xml&fvonly=1&url=#{test_url}"

response = Net::HTTP.get(URI(baseurl))
puts response

At this point you should get a response that looks something like this:

<!--?xml version="1.0" encoding="UTF-8"?-->

    http://[WEB PAGE TEST SERVER]/xmlResult/130723_9Y_BM/
    http://[WEB PAGE TEST SERVER]/result/130723_9Y_BM/
    http://[WEB PAGE TEST SERVER]/result/130723_9Y_BM/page_data.csv
    http://[WEB PAGE TEST SERVER]/result/130723_9Y_BM/requests.csv
    http://[WEB PAGE TEST SERVER]/jsonResult.php?test=130723_9Y_BM/

WebPageTest will asynchronously run the tests and dump the results into the locations returned above. As you can see there are lots of different formats that you can consume for the results data. Everything that I needed was in the summaryCSV.

Step 2:

Parse the URL to get the summaryCSV and then poll that until the results appear (as we have no idea of knowing when they will appear I checked every 5 seconds until I no longer got a 404 response). I then parse the CSV response into a 2 dimensional array, where the first array are the headers, and the second is their values. You can then see all the results that come back and which ones might be interesting for you.

#!/usr/bin/env ruby

require "net/http"
require "uri"
require "nokogiri"
require "csv"

test_url = "http://www.bbc.co.uk/news/"
baseurl = "http://[WEB PAGE TEST SERVER]/runtest.php?runs=1&f=xml&fvonly=1&url=#{test_url}"

response = Net::HTTP.get(URI(baseurl))
doc  = Nokogiri::XML(response)

csv_url = doc.at_xpath('//summaryCSV').content

uri = URI.parse(csv_url)
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)

while((csv_content = http.request(req)).class == Net::HTTPNotFound)
	sleep 5

raw_results = CSV.parse(csv_content.body, {:headers => true, :return_headers => true, :header_converters => :symbol, :converters => :all})

puts raw_results

Step 3:

Great! Now I have test results coming back and I want to save the ones I’m interested in so that I can visually represent them later and look at the changes in performance over time.
I’m going to use mongoDB to store the results of the tests. I created a class called TestResult with the fields that I am interested in from my WebPageTest results.
At this point you will need mongoDB up and running and you will also need a .yml file to define your mongoDB setup.

      database: web_page_test_results
        - localhost:27017

My scripts now looks like this:

#!/usr/bin/env ruby

require "net/http"
require "uri"
require "nokogiri"
require "csv"
require "mongoid"
require "chronic"

Mongoid.load!("mongoid.yml", :development)

class TestResults
	include Mongoid::Document

	field :timestamp_of_test, type: Time
	field :load_time, type: Integer
	field :time_to_first_byte, type: Integer
	field :csv_url, type: String

test_url = "http://www.bbc.co.uk/news/"
baseurl = "http://[WEB PAGE TEST SERVER]/runtest.php?runs=1&f=xml&fvonly=1&url=#{test_url}"

response = Net::HTTP.get(URI(baseurl))
doc  = Nokogiri::XML(response)

csv_url = doc.at_xpath('//summaryCSV').content

uri = URI.parse(csv_url)
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)

while((csv_content = http.request(req)).class == Net::HTTPNotFound)
	sleep 5

raw_results = CSV.parse(csv_content.body, {:headers => true, :return_headers => true, :header_converters => :symbol, :converters => :all})

	:timestamp_of_test => Chronic.parse(raw_results[1][:time]),
	:load_time => raw_results[1][:load_time_ms],
	:time_to_first_byte => raw_results[1][:time_to_first_byte_ms],
	:csv_url => csv_url

And my mongoDB happily contains the result of my first test, which will look something like this

{ "_id" : ObjectId("51eef7cee055e6cee5000001"), "timestamp_of_test" : ISODate("2013-07-24T21:38:04Z"), "load_time" : 3566, "time_to_first_byte" : 317, "csv_url" : "http://[WEB PAGE TEST SERVER]/result/130723_RW_CN/page_data.csv" }

What next?

If I had had a chance to extend this, I would of loved to of added visualisation, using a graphing framework and deploying the results to a web service so that everyone can see the change over time and drill down into any of the suspicious looking results.