menu

Alumni Blogs

Lots of our people have lots of opinions. Here are just a few of them

ThoughtWorks embraces the individuality of the people in the organization and hence the opinions expressed in the blogs may contradict each other and also may not represent the opinions of ThoughtWorks.

Python: Look ahead multiple elements in an iterator/generator

As part of the BBC live text scraping code I’ve been working on I needed to take an iterator of raw events created by a generator and transform this into an iterator of cards shown in a match. The structure of the raw events I’m interested in is as follows: Line 1: Player booked Line […]

Mark Needham
28 May 2015

Original Link

From "make it work, make it right, make it fast" to "rules of simplicity"

"Make it work, make it right, make it fast" is Kent Beck's formulation of a design philosophy of the "Unix Way".

You can see this in his subsequent formulation of the 4 rules of simple design:

  1. Passes all the tests ("make it work")
  2. Contains no duplication ("make it right")
  3. Expresses all the ideas you want to express (aka reveals intention) ("make it right")
  4. Has no superfluous thoughts (aka fewest elements) (aka minimises classes and methods for OO languages) ("make it right")
What's missing in the newer design guidance is the equivalent of "make it fast".

Jason Yip
28 May 2015

Original Link

Neo4j: The foul revenge graph

Last week I was showing the foul graph to my colleague Alistair who came up with the idea of running a ‘foul revenge’ query to find out which players gained revenge for a foul with one of their own later in them match. Queries like this are very path centric and therefore work well in […]

Mark Needham
26 May 2015

Original Link

7 Strategies to Facilitate "Working Out Loud"


I spent the greater part of the weekend mulling over the practice of working out loud, what makes some folks adopt the habit with ease while others struggle, and what could be some of the possible enabling factors that support working out loud. The more I thought about it, the more it seemed to me that it is one of the fundamental blocks of building a community of practice. A community grows around a domain where practitioners share their insights, knowledge and doubts, the work processes. A community grows through conversation, collaboration, and showcasing of work in progress.

noreply@blogger.com (Sahana Chattopadhyay)
26 May 2015

Original Link

Python: Joining multiple generators/iterators

In my previous blog post I described how I’d refactored some scraping code I’ve been working on to use iterators and ended up with a function which returned a generator containing all the events for one BBC live text match: match_id = "32683310" events = extract_events("data/raw/%s" % (match_id))   >>> print type(events) The […]

Mark Needham
24 May 2015

Original Link

Python: Refactoring to iterator

Over the last week I’ve been building a set of scripts to scrape the events from the Bayern Munich/Barcelona game and I’ve ended up with a few hundred lines of nested for statements, if statements and mutated lists. I thought it was about time I did a bit of refactoring. The following is a function […]

Mark Needham
23 May 2015

Original Link

Working Out Loud 101 | Some Thoughts


My posts are usually pretty detailed, researched, and long. I am trying to move to a mode where I'll write shorter posts more regularly on specific topics, questions posed to me, or an aspect of modern workplace learning that interests me. I will keep my longer posts for topics I am researching on and deep diving into. These will probably be one per fortnight or so... 

Today's post is triggered by a question a colleague asked me yesterday. I happened to mention "working out loud" as a practice that is fundamental to social and collaborative learning, and drew

noreply@blogger.com (Sahana Chattopadhyay)
22 May 2015

Original Link

Docker Container Orchestration

In the first post on how we moved our application to Docker on AWS I described the reason for us to do it, and how we set up the servers. This post describes how we've organized the different Docker containers.

Container Setup On AWS

Our setup on AWS looks like this:

Qwaya AWS Setup

We use an EC2 load balancer to route traffic to our web hosts. This is an easy way to setup clustering, but you should be aware that EC2 does not allow for any alternative route or html page if no hosts are available. This means that if all…

Marcus Ahnve
22 May 2015

Original Link

Você desenvolve software? De que jeito?

Trabalhar com desenvolvimento de software pode ser feito de duas formas: Divertida e profissional Medrosa e amadora Na primeira, existe um ambiente que trabalha para o desenvolvimento das pessoas. Que puxa do time um comportamento de responsabilidade, humildade e foco na prevenção e melhoria contínua. Ser um profissional assim desenvolvendo software significa fugir do “padrão” […]

dwildt
22 May 2015

Original Link

Python: UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\xfc’ in position 11: ordinal not in range(128)

I’ve been trying to write some Python code to extract the players and the team they represented in the Bayern Munich/Barcelona match into a CSV file and had much more difficulty than I expected. I have some scraping code (which is beyond the scope of this article) which gives me a list of (player, team) […]

Mark Needham
21 May 2015

Original Link

Turning Bazel back into Blaze for monorepo nirvana

The short answer (at least for the piece I’m interested in) is to recreate gcheckout.sh that Google didn’t open-source. Refer how Googlers Subset their Trunk

At the time of writing, there are no issues for the Bazel Github project that talk about modifying a checkout based on needs or intents that are codified in BUILD files (here’s an example). Of course that’s not a universal SCM feature. Git has “sparse checkout”, but not sparse clone, and it’s impossible to use this in a monorepo configuration. Perforce and Subversion could do it. Perforce has client specs, and Google’s internal…

Paul Hammant's blog
20 May 2015

Original Link

Neo4j: Finding all shortest paths

One of the Cypher language features we show in Neo4j training courses is the shortest path function which allows you to find the shortest path in terms of number of relationships between two nodes. Using the movie graph, which you can import via the ‘:play movies’ command in the browser, we’ll first create a ‘KNOWS’ […]

Mark Needham
19 May 2015

Original Link

Don't Bother Scaling Excellence

99 out of 100 attempts to scale excellence will fail. That's a radical opinion to hold. This is my reaction to some in the industry who want to scale Agile or believe in setting up centers of excellence, which they are not. Just sample the meetups, conferences, and consulting sales pitches and you'll find as many varieties of snake oil as you like.

Lack of fear and an appetite to learn are the two most critical components of excelling at anything. Notice how we learn language or skills such as bike riding. Not surprisingly, our workplaces are too often flush with: 

noreply@blogger.com (Rajeev Singh)
19 May 2015

Original Link

Neo4j: Refactoring the BBC football live text fouls graph

Yesterday I wrote about a Neo4j graph I’ve started building which contains all the fouls committed in the Champions League game between Barcelona & Bayern Munich and surrounding meta data. While adding other events into the graph I realised that I’d added some duplication in the model and the model could do with some refactoring […]

Mark Needham
17 May 2015

Original Link

Neo4j: BBC football live text fouls graph

I recently came across the Partially Derivative podcast and in episode 17 they describe how Kirk Goldsberry scraped a bunch of data about shots in basketball matches then ran some analysis on that data. It got me thinking that we might be able to do something similar for football matches and although event based data […]

Mark Needham
16 May 2015

Original Link

Moving a Single Server App To Docker on AWS

Last fall, we moved the Qwaya Facebook ads tool from a single host on Rackspace to a clustered Docker based environment on AWS. This is the first blog post of hopefully more that I'm writing to remember what we did. I've planned two more posts, one on how we handle CI and one on container orchestration.

Docker Logo

Why Docker?

The task at hand was not "Move to docker", it was "get out of single host hosting". The old deployment consisted of some quite complicated Fabric scripts that was run from an arbitrary developers laptop. The source code repository did not match…

Marcus Ahnve
15 May 2015

Original Link

Same Old Architecture - Best of Ramblings

Architects can often be found commenting that many things in IT are the same old stuff in new packaging, created by marketing departments who were in need of a new buzzword. For example, aren't microservices really just SOA done right? And the whole reactive movement seems to have re-discovered callbacks. Maybe there is some truth in this as at the recent SATURN conferences I found myself saying more often than I had expected "I blogged about this". So let's see which of my past ramblings are still relevant these days.

Enterprise Integration Patterns: Gregor's Ramblings
14 May 2015

Original Link

R: ggplot – Displaying multiple charts with a for loop

Continuing with my analysis of the Neo4j London user group I wanted to drill into some individual meetups and see the makeup of the people attending those meetups with respect to the cohort they belong to. I started by writing a function which would take in an event ID and output a bar chart showing […]

Mark Needham
14 May 2015

Original Link

"Taylorism"? I don't think that means what you think it means...

There's a tendency for people in the Agile community to throw around the word "Taylorism" as a synonym for evil.

It's worth remembering how work was seen before Taylor and "scientific management":

  • Work is not worthy of study
    • If you miss quota, you're incompetent... dock pay; if you beat quota, you must have been sandbagging previously... dock pay
  • No rest breaks
  • Workers are all the same
  • Improvements only benefit owners
Some of the ideas advocated by Taylor were significant improvements:


  • Work is worthy of scientific study
  • People should get rest breaks; fatigue exists!
  • People are different, which means some…

Jason Yip
14 May 2015

Original Link

Dealing with Flaky Tests using Data

I recently wrote a sbt plugin that produces tabular test reports. My motivation was to get better insights into the reliability of our test suite. Due to good discipline most failures that occur are caused by flakiness of tests that … Continue reading

Felix Leipold
12 May 2015

Original Link