"Nice" people can be racist, too

22 June 2014

“That guy just said something really racist* to me.”

“Really? ...but he seems so nice!”

[*Throughout this post, you can replace the word “racist” with basically any type of prejudice or discriminatory behaviour, and everything will still be relevant.]

I've had this conversation more times than I can count, upon telling someone I'm with about the behaviour of someone else around us.

Every time I hear this response, I'm filled with utter disbelief. Do people think that racist idiots somehow look or act different to the rest of us, most of the time? That they have green horns sprouting from their heads, or walk around with a sign on their head advertising their particular form of bigotry? Or that they begin all conversations by explicitly stating their prejudices?

Let me save you some time; they don't.

In fact, most of the time these people function as a regular, perfectly pleasant human beings in society. And, if you don't happen to fall into a group against whom they discriminate, it's highly likely that you might never have witnessed their ugly behaviour. It makes sense, doesn't it? For them, you may well be exactly the right skin colour to fit within their bigoted views – so, clearly, you'll be seeing their very best side ( in effect, the person that they could be to everyone, were it not for those prejudices – isn't that sad?).

To state the very, very obvious: you are likely never going to personally experience a type of discrimination which is manifested against people who don't look/seem/act/behave like you.

But, and this is crucial, the fact you haven't personally experienced it doesn't mean it didn't happen, and it definitely doesn't mean you shouldn't believe that it did happen.

If someone is telling you about an unpleasant experience they've gone through (which is undoubtedly what happened for them to have started a conversation like the one above) – please, never question them. Listen to them.

It's already awkward and difficult to have to be the one who points out that someone at the party you're at, or in the social group you're in, actually holds ugly and offensive views. It's even more horrible to be put immediately on the defensive once you do bring yourself to tell an ally about it, let alone to have someone you thought you could depend on then actually defend the person in question, using the utterly farcical argument of:

“But they've never behaved like that towards me!”

A personal aside: every time I hear this, inside I'm screaming OF COURSE THEY HAVEN'T, YOU'RE WHITE...and outside, I explain my inner screams in the most socially appropriate way I can. Because, realistically, that's probably the most constructive and pragmatic thing I can do, right?

If you find yourself on the responding side of the situation above, anything you're going to say that starts with “but....” is a bad idea. No “but's”, just, I'm sorry that happened to you. Ask if they need anything, or if they would like that person to leave, and do what you can to support them.

It's not the responsibility of the person who has been a victim of said discrimination to “convince” you of the veracity of what they're saying; if they are telling you this, it's also likely that they trust you, and you should trust them too. And for God's sake, get over the naïve idea that bigots will somehow be anything but regular people, just like you and me.

Read Post

Postcolonial feminism: a reading list

22 June 2014

I asked recently on Twitter if anyone had recommendations for reading material on the topic of postcolonial feminism; admittedly, a very general question, but sometimes it can be difficult to know where to start when you're new to a certain topic.

I got some great suggestions of reading material, and wanted to record them here for posterity, and in case they're useful to other people looking to learn more about the topic. I'm working my way through them now...

(Thank you to Chitra Nagarajan, Maya Ganesh, and Xeenarh for your suggestions! Any others – let me know.)

Essays and books

“Terrorist Assemblages: Homonationalism in Queer Times” by Jasbir Puar. She also has a range of other articles, including the wonderfully-titled “I'd rather be a cyborg than a goddess” and has some interesting-looking talks online, too. I'm keeping an eye on her 'Upcoming Events' for her next visit to Berlin...

Under Western Eyes:Feminist Scholarship and Colonial Discourses by Chandra Mohanty – this came up a lot, and seems to be a good place to start

Feminism without Borders: Decolonizing Theory, Practicing Solidarity, by Chandra Mohanty

Third World Women and the Politics of Feminism by Chandra Mohanty

Feminist Genealogies, Colonial Legacies, Democratic Futures by Chandra Mohanty

This Bridge Called My Back: Writings by Radical Women of Color – a feminist anthology edited by Cherríe Moraga and Gloria E. Anzaldúa – this sounds pretty wonderful, and is next on my 'to-read' list. (and it's available in Spanish, too)

Telling to Live: Latina Feminist Testimonios by Latina Feminist Group, Luz del Alba Acevedo(Editor), Norma Alarc (Editor), Celia Alvarez (Editor), Ruth Behar (Goodreads Author) (Editor), Rina Benmayor (Editor) – a set of autobiographic essays on the Latina experience

Black Body: Women, Colonialism, and Space by Radhika Mohanram

Woman, Native, Other: Writing Postcoloniality and Feminism by Trinh T. Minh-ha

But Some Of Us Are Brave: All the Women Are White, All the Blacks Are Men: Black Women's Studies, by Gloria T. Hull (Editor), Barbara Smith (Editor), Patricia Bell Scott (Editor)

Re-orienting Western Feminisms – Women's diversity in a postcolonial world, by Chilla Bulbeck

Challenging Imperial Feminism, by Valerie Amos and Pratibha Parmar

"Demarginalizing the Intersection of Race and Sex: A Black Feminist Critique of Antidiscrimination Doctrine, Feminist Theory, and Antiracist Politics by Kimberle Crenshaw

Can the subaltern speak? - Gayatri Chakravorty Spivak

“Age, Race, Class and Sex: Women Redefining Difference,” by Audre Lorde

Shorter articles

Femen's obsession with nudity feeds a racist colonial feminism, by Chitra Nagarajan

Why we need to dismantle the myth of 'Western' feminism,

Gay Nigerians targeted as 'un-African' - Chika Oduah

How not to study gender in the Middle East – by Maya Mikdashi

Less related, but interesting-looking things I came across during this search:

Making Face, Making Soul/Haciendo Caras: Creative and Critical Perspectives by Feminists of Color, by Gloria E. Anzaldúa – a collection of essays

Nehanda, by Yvonne Vera – a novel set in Zimbabwe, “the portrait of resistance and struggle, a tale of a people's first meeting with colonialism.”

The Nine Guardians by Rosario Castellanos

Read Post

An open letter to people/organisations I've criticised for a lack of diversity

15 June 2014

Below, in German.

Dear creators, curators, founders, employers, employees, anyone who is part of something that has been criticised for its lack of diversity,

I want to make sure you understand why we're criticising and calling you out in public. We're not trolling, I promise, we're trying to help.

I can imagine it might not be so nice for you, to launch a new [conference/organisation/company]* and be met with criticism from people you don't even know, about an issue you don't really care about, and perhaps one that you don't really think has anything to do with you.

You're wrong. It has everything to do with you, and your work.

I'm assuming here that you're a white male, judging from the 000s of examples I've seen. Let's say you have the best of intentions; you're determined to use your own (potentially, not inconsiderable) talents to change the world, and you're aware that you've benefited from opportunities that others might not have had.

So, you want to innovate, find new solutions, work with the most intelligent and talented people in your field, to make the world a better place. It just so happens that so many of those you know are, like you, white males. But so what? They, like you, have proven their colours – they've given up time to work on fascinating projects which you admire, and you'd relish the opportunity to work with them. Why shouldn't you?

Somewhere among your goodwill and desire to change the world and start something new, you're making a critical mistake. You're working with people who are just like you. You might disagree with them on a superficial level of certain topics, but essentially, your understandings of the world are exactly the same. You've all been treated in the same way by society, your worries and problems are largely the same, your priorities are the same.

What does this mean?

It means that the same stories/solutions/problems will jump out at you all. You'll focus on the same details – those that matter to you, and those around you (this example of how the Trayvon Martin case was covered in US media addresses this in far better detail). On a purely individual level, by surrounding yourself with people who are just like you, you're doing yourself a disservice – you're not giving yourself the chance to be challenged by different world views, by people who will argue with you and push you to be better at what you're doing. You're missing out on so much potential creativity that could be stimulated by getting to work with and understand people who've had entirely different life experiences to you.

And on a wider scale, you're missing out on a huge part of your audience. Outside of your bubble, people aren't like you, and they've been ignored for decades. Whatever you're doing, no matter how well you think you're doing it with all those intelligent white men around you, will never be able to address their needs as much as people who have lived similar experiences to them. In fact, by continuing to ignore them, you're simply maintaining the old status quo – anything but innovative, really.

A friend of mine recently told me that she's been trying to hire people who are “nothing like her, but who share the same passion”. It's not an easy way to do things, but it's bringing her and her team a huge amount of success; yes, there's disagreements, and debate, but if you're serious about challenging the way things are done at the moment, isn't that exactly what you want?

I'm hoping that all makes enough sense to you for you to be able to understand that initiatives like Gender Avenger, or 50 Prozent calling you out for a lack of diversity should be a wake up call to you; we're not rabbiting on about diversity simply for diversity's sake, but because having a diverse (and, let's be honest, interesting) work force, or conference line up, enriches whatever you're doing, and will help you do it better.

Listen to the people criticising you; we know that you can do better, and we're trying to help.

PS. There are so many other arguments to be made as to why diversity is needed; I just wanted to focus on a certain few here!


Auf deutsch- danke an Julien Simonet für die Übersetzung!

Liebe Errichter, Kuratoren, Gründer, Arbeitgeber, Arbeitnehmer, alle welche Teil sind von etwas was für seinen Mangel an Vielfalt kritisiert wurde,

ich will sicherstellen, dass ihr versteht, wieso wir euch an die Öffentlichkeit zerren und kritisieren. Wir wollen euch nicht schmähen, ich verspreche es, wir versuchen zu helfen.

Ich kann mir vorstellen, dass es unangenehm ist für euch, eine neue [Konferenz/Organisation/Firma] zu lancieren, um mit Kritik konfrontiert zu werden, von Leuten welche ihr nicht einmal kennt, über Aspekte welche euch nicht wirklich bekümmern, vielleicht über etwas worüber ihr denkt, dass es gar nicht wirklich mit euch zu tun hat.

Ihr denkt falsch. Es hat alles mit euch zu tun und eure Arbeit.

Aufgrund der x Beispiele die ich sah, vermute ich nun dass du ein weisshäutiger Mann bist. Lass uns annehmen dass du die besten Absichten hast; du bist entschlossen deine eigenen (potenzielle, nicht unbedeutende) Talente zu nutzen um die Welt zu ändern und du bist dir bewusst, dass du mit Möglichkeiten bevorteilt bist, über welche andere nicht verfügen.

Also, du willst innovativ sein, neue Lösungen finden, mit den intelligentesten und talentiertesten Leuten Arbeiten in deinem Gebiet, um die Welt zu einem besseren Ort zu machen. Zufälligerweise sind die meisten von diesen welche du kennst weisshäutige Männer. Aber was soll’s? Sie, wie du, haben sich bewährt - sie haben Zeit aufgewendet für faszinierende Projekte welche du bewunderst und du würdest die Gelegenheit geniessen, mit ihnen zu Arbeiten. Warum solltest du nicht?

Irgendwo zwischen deinem guten Willen und Wunsch die Welt zu verändern und etwas neues zu starten machst du einen kritischen Fehler. Du arbeitest mit Menschen welche sind wie du. Zwar widersprichst du ihnen vielleicht in gewissen oberflächlichen Aspekten gewisser Themen, aber eigentlich stimmt dein Weltbild exakt mit ihnen überein. Ihr wurdet von der Gesellschaft alle gleich behandelt, eure Sorgen und Probleme sind nahezu die gleichen, eure Prioritäten sind die selben.

Was bedeutet das?

Es bedeutet, dass die gleichen Geschichten/Lösungen/Probleme aus euch herauskommen werden. Ihr werdet alle auf die gleichen Details fokussieren - jene, die euch etwas bedeuten und jene die euch nahe stehen. Auf dich bezogen bedeutet dies, sich mit Menschen zu umgeben welche so sind wie du, dass du dir einen schlechten Dienst erweist - du verbaust dir die Chance, von verschiedenen Weltsichten herausgefordert zu werden, von Menschen welche Einwände anbringen können und dich vorwärts bringen um besser zu werden, in dem was du tust. Du verpasst so viel potenzielle Kreativität, in dem du darauf verzichtest mit Menschen zu Arbeiten welche komplett verschiedene Erfahrungen haben wie du.

Bezogen auf das was über dich hinausgeht, verzichtest du auf einen grossen Teil deines Publikums. Ausserhalb deiner Blase sind die Leute nicht wie du, und sie wurden über Jahrzehnte ignoriert. Was auch immer du machst, unabhängig davon wie gut du dich glaubst mit all diesen intelligenten weisshäutigen Männern um dich, wird nie in der Lage sein, ihre Bedürfnisse so gut abzudecken wie es Menschen täten, welche ähnliche Erfahrungen taten wie sie. Vielmehr, indem du sie weiterhin ignorierst, pflegst du den alten status quo - alles andere als innovativ, echt jetzt.

Eine Freundin von mir erzählte mir kürzlich, dass sie versucht hat Leute einzustellen welche „nicht sind wie sie, aber die selbe Leidenschaft teilen“. Es ist kein einfacher Weg, Dinge zu tun, aber es bringt ihr und ihrem Team haufenweise Erfolg ein; ja, da sind Meinungsverschiedenheiten, Debatten, aber wenn es dir damit Ernst ist, die Dinge wie sie im Moment sind herauszufordern, ist es nicht genau das was du willst?

Ich hoffe, dass alles genug Sinn ergibt für dich, damit du in der Lage bist zu verstehen, dass Initiativen, welche dich um einen Mangel an Vielfalt kritisieren, einen Weckruf für dich darstellen sollen. Wir labern nicht über Vielfalt einzig um der Vielfalt willen, sondern weil eine vielfältige (und, seien wir ehrlich, interessante) Arbeitnehmerschaft, oder Konferenzteilnehmerschaft das was auch immer du tust bereichert und dir helfen wird, es besser zu tun.

Höre auf Leute die dich kritisieren; wir wissen, dass du es besser machen kannst, und wir versuchen zu helfen.

PS Da sind so viele andere Argumente anzubringen, wieso Vielfalt nötig ist; ich wollte mich hier nur auf ein paar wenige konzentrieren.

Read Post

What works for me, won't work for you (but listen anyway)

08 June 2014

When I was starting off my professional career, I was lucky to receive a number of pieces of advice. I absorbed them gratefully, very conscious of my naivety and inexperience, but slowly realised that many of the tips just wouldn't work for me; not because of my inability to implement the hints, but because of circumstances beyond my (immediate) control.

For example, my first business trip saw me travelling in the Middle East, in a conflict zone (Libya, in September 2011; Tripoli was under rebel control, but Gadaffi had not yet been found).

“If you get into trouble, be as authoritative as you can.”

Okay, I thought. So – speak loudly, and try to be intimidating.

“If people in positions of authority – at border crossings, army checkpoints, or airports – question you, speak louder and don't show them you are intimidated. Try and project your own importance as much as possible- no weakness, and if you need to, get angry at them, and they won't question you.”

Right. Any unexpected questions by army men with guns, I should respond with... anger. Hmm.

“Never let on that you speak anything but English, especially not at border crossings. You're British, you have a British passport, you speak only English, and pretend you are always more important than they are.”

Project self-importance. Don't let on any understanding of local culture. Duly noted.

There were lots of wise words, from well-respected and experienced people; I noted them down carefully, and resolved to be as intimidating, angry and self-important as possible, if it came to that.

Only... for those of you who know me, associating me with those adjectives will probably bring a smile to your faces. I don't think I've ever been intimidating (all 5”3 of me) – and I hate confrontation. Still, though, I tried... and, of course, it didn't work. At first, I thought I was doing it incorrectly – I wasn't being angry or loud enough, I wasn't acting the part of self-important Brit convincingly enough, my English accent wasn't pronounced enough... but after a few (in retrospect, far too many) attempts, I realised it wasn't my fault that the advice wasn't working.

As it turned out, that kind of behaviour worked for some combination of physical traits that I, unfortunately, did not possess. For those people, it worked better than I could ever have imagined, and it was almost astounding, the inherent respect assigned to a kind of behaviour which to my mind was, in a way, obtrusive and rude – but there was no denying that it worked.

The way that I could get out of (luckily, the very few) tricky situations I found myself in was by playing to the judgements and preconceptions that people made based upon my physical appearance. I wore a ring on my ring finger, and made up a fictional husband; I smiled at potentially threatening looking men, and tried to disarm them with small talk of their sisters and mothers; I laughed far too much at unfunny jokes... and realised that I'd found my own 'wise words.'

But while doing so then, and now, I'm conscious that I am, in a way, strengthening the very judgements and perceptions which frustrate me so much. Clearly, me getting angry at an egotistical man at a border crossing is not going to get me anywhere; but is me smiling and laughing along with his awful, self-important jokes in order to play to his ego and get myself across the border, actually any better?

Sadly, pragmatically speaking, yes. It gets me safely out of that situation, and that (in this case) is the main thing.

But then, how to change their perceptions and judgements? I suspect the answer lies not in behaving differently in difficult situations – there, I stand by the tactic of doing whatever you can to get safely out of said situation – but through other means, coming from the culture in question itself, namely education and awareness.

Being aware of how different cultures react to different demographics, and bearing that in mind while receiving advice has been very valuable, though. In retrospect, it probably took me longer than it should have done to reach that conclusion rather than simply trying, trying and trying a failing method again.

It's also made me, I hope, a bit more conscious of what I say to whom when I'm attempting to impart advice upon people; the tactics I use would in many cases not work for other people from other demographics, with different physical characteristics. I'm not saying by any means that this is right, or this is the way it should be; but pragmatically speaking, giving and imparting advice needs to take into account external factors as to whether it would, or could, be relevant for the other person. 

Read Post

On being bicultural (or maybe just confused)

01 June 2014


Realising that not all of my friends had a “rice bin” in their kitchen was a revelation to my 11-year-old self. I had gone to fetch some orange juice from kitchen when my friend noticed the bin, and asked what it was; her astonishment at realising it was full of uncooked rice in turn astonished me.

It became a star attraction in my house when friends came over and in a way, I quite enjoyed the attention, despite not really understanding why it was such a big deal. My family bought rice in huge sacks, and immediately emptied it into the bin, and that's where my mum got it from when she cooked it every day for the family. How did the rest of my friends' families do it? Directly from the big sack of rice? That's not very practical, I imagined, they were hard to close once you'd cut the sacks open.

A-ha. They weren't eating rice every day! This revelation came later, when I realised that eating at friends' houses meant eating funny things like mashed potato, fish fingers and burgers. They were quite a novelty to me, and in all honesty, I felt a little sorry for my friends, not getting to eat rice and all the tasty things that came with it every day like I did.

There were other moments like this dotted throughout my childhood; realising that playing carrom was an activity to do when other Bangladeshi families were round, but not with my school friends; observing that some people had all of their family in the same country as them, or that they could name all of their cousins, and count them on just one hand!; my friends' amazement at seeing my mother's beautiful sari wardrobe, full of gold and bright colours and gorgeous silks; understanding that weddings in the UK were small affairs, over in just one day. (Those poor things, only getting to have a one-day-long party, I thought.)

When I was at university, I wrote essays on biculturalism and bilingualism, focusing on Latino communities living in the US, and looking into how the mix of languages helped them make sense of their split cultures. I loved, and still do, delving into the links between culture, language and behaviour.

But somehow, I never considered myself as part of that 'bicultural' tribe about whom I was writing. The city where I went to university was overwhelmingly white and middle class, as was the high school I attended, and the area I grew up in. I spoke English at home with my parents, I took part in all the same activities as my friends, I wore the same clothes as them, all of my friends were British, (or Irish). I wasn't 'between' two communities, as were the people in my studies of biculturalism, we were simply British, and that was that. I couldn't (and still can't) even hear my parents' Bangladeshi accents when they speak English – I was so surprised when people told me that they had an accent.

But then, of course, I left my little bubble, and began noticing, and appreciating, more of those little things that set me apart from my (white) British friends. I travelled around India, where I paid the same price as Indian nationals to get into the Taj Mahal, leaving my (white) friends to pay the 'foreigners' charge of 100 times the price. I moved to Spain, where people assumed I was Italian, or Brazilian, given my 'funny' Spanish accent. I travelled in the Middle East, where people spoke to me in Arabic, and ignored my (white) colleagues.

Perhaps most significantly, I moved to Germany, where I've had to self-identify as 'Bangladeshi' more than ever before. Maybe because of this, I spent time reading and learning about Bangladeshi culture and history, and chose to spend last winter there, with my extended family. And I realised that there's no denying I am 'bicultural' despite my thoroughly integrated childhood into white, middle-class Britain.

So many parts of Bangladeshi culture are familiar to me that would be alien to my British friends – and in some ways, I've managed to combine the two so I get the best of both worlds. On an entirely practical level, for example, most of the clothes I'll be wearing this summer were tailor made for me in Bangladesh, but look like regular European dresses. At the same time, though, so many parts of Bangladeshi culture are completely alien to me, especially the lack of independence I face there as a young, unmarried woman.

The best way I currently have of defining biculturalism, though, is different to how I did when I was thinking about it while at university. Back then, I thought of biculturalism as simply having two cultures present in one's life. Now, I'd define it as a paradox of feeling at home in two cultures, while not not really fitting in 100% in either.  

Read Post

Missing voices in the #YesAllWomen and #sexismturnedaround discussions

25 May 2014


This weekend, there were two hashtags that caught my eye on Twitter: #sexismturnedaround and #YesAllWomen. The former started as a discussion about women pastors, but soon got much wider, and the latter began as a response to the awful Santa Barbara shootings.

Both were important discussions- I'd strongly recommend checking them out on Twitter, and I'm sure there'll be more of both in coming days. It's powerful to see a community come together around a shared topic or interest, especially ones as close to my heart as these - but they also reminded me of something I've been realising over the past few months.

Since I began writing and talking more about feminism and discrimination, women – both friends, and new acquaintances – have been sharing their stories on similar topics with me. And it's made me realise that, sadly, I'm lucky to be able to be writing about my experiences, and talking about them openly; with all of the experiences I've written about thus far, I've been able to get out of situations where I've been faced with bigotry or discrimination within a few hours, or at most a couple of days. I've always felt like I'm in a safe space (both online and offline) by the time I'm writing about these experiences. This is not the case for so many women out there.

Women who I've spoken to are faced with sexism as part of their everyday professional lives; some are living with the threat (or reality) of domestic violence or abusive partners, but who are too scared to leave; and almost all of them know that if they call out or even mention the abuse they are facing, it will almost certainly lead to even more difficulties for themselves, without any such certainty that their abusers will face any kind of consequences. With odds like that, it's not hard to understand why they choose to stay quiet.

It's been truly eye-opening for me to realise how many people around me are faced with those kinds of situations, and I have no doubt it would shock most other people out there too. Men around me have commented on how they're surprised that I face discrimination so often, and while I take that primarily as a compliment that they're really paying attention to what I'm saying or writing, and I appreciate hugely the discussions that have come out as a result, I'd also like to explicitly point out that my experiences are a minuscule drop in the pond compared to what women around all of us are facing every day. This might sound obvious, but I think it's worth saying: the fact they're not talking about it doesn't mean it's not happening.

I truly love the fact that writing has opened up these conversations with women and men around me, and I've learned an incredible amount from them (and, I hope I will continue to for a long time!). Writing, for me at least, is also a very cathartic act – it gives me a space to get things off my chest, to share experiences, and to think through ideas. Sometimes, it's been a way for me to say what I wanted to say at the time, but I couldn't – through fear, or shock, or a mixture of both. Knowing that other women out there don't even have this kind of outlet, is painful to me.

So back to Twitter; it's inevitable, then, that the women writing on these hashtags and sharing their views are just a tiny, tiny proportion of the people who are faced with discrimination and sexism. Obviously, it's only those of us who feel safe enough to write without the threat of repercussions who are participating.

I'd suggest that the large majority of women who are faced with abuse on a regular basis feel compelled to stay quiet because of the unsafe space they are in. However depressing or shocking the online discussions might get- bear in mind that they're just a tiny glimpse into the wider societal problems being addressed.

Read Post

Newbie hacky coding tips

11 May 2014

As I've mentioned before on here, I'm in the middle of setting up a new website for my project, the Open Development Toolkit. I'm forking an already established site, Source, and customising it to the project needs, and, excitingly, it's almost ready to launch.

I've learned a lot of new stuff along the way, and I thought maybe some of the more general tips might be useful for other newbies to coding – for those of you who are old hands at this, I imagine a lot of this will sound incredibly obvious! Just trust me; it's not.

Context: I use GitX, Sublime, and Google Chrome, running on my MacBook Air. I'm trying to learn by doing, rather than starting at the beginning or with the basics...whether this is wise or not remains to be seen, but it's a lot of fun.


  • Don't panic: yes, this screen can look incredibly intimidating, full of multicoloured words and symbols, none of which make sense. That's fine! It doesn't all need to make sense – it doesn't even need to mostly make sense. You'll learn tiny little chunks at a time.

  • Focus on what you need, and expect to understand very little of the rest: the skill set needed here reminds me a lot of the skill set needed to do foreign language comprehension exercises. In those exercises, you're given a long text in a foreign language and asked some specific questions which test your understanding of it. To answer the questions, you really don't need to understand most of the text – you just need to know what you're looking for, and look out for the key words. Context is key – for example, a question about food means you need to look out for 'eating' or 'food' or 'meals'... it doesn't matter at all what the rest of the passage actually says.

    Apply the same logic when you're looking for something in code. If you want to change, say, a colour, you don't need to understand anything else in what you're looking for, apart from where that colour code is. I use the Chrome plugin 'Eye Dropper' to find out what the colour code is – search for it using “Find in Files” in Sublime, and then replace it with your desired colour. That is all you need. Save, refresh, and check you changed the correct thing.

  • Use your logic, before asking for help: this relies on the code you're looking at being well-written, which in my case is true. For example: I wanted to change the way in which articles were being displayed on the site when they're shown in a list, so I looked at article_list.html. I couldn't find the relevant aspect to change there, and I asked for help... whereupon I realised that the first line in that file was:

  • 	% extends "articles/_base_articles.html" %}

    Even without having a clue what the { or % do, the term extends is a fairly big clue. It appears to be building upon (ie. 'extending') base_articles.html, so I looked there, and found the aspect I wanted to change – which, more helpfully, changed it everywhere rather than just in that one place.

    • Change one thing at a time, and don't be afraid to get it wrong: especially when you're not really sure whether you're changing the right thing, this will help a lot. Make an educated guess as to what might be the relevant section based on the code around it, and have a go at changing it – at worst, you'll have to click 'Undo', and at best, you've found what you wanted! Changing one thing at a time allows you to understand which of your guesses was the right one, which will help you understand future problems.

    • Follow the breadcrumbs yourself: even if you're almost certain you have no idea what's going on, try to at least look at where bugs are coming from. For example, when I get errors on the site, the error message tells me which file the problem is in, and usually the line in question. Most of the time I'm fairly sure I'm not going to have a clue what's gone on, but I try to find the file in question and read through it. Slowly but surely, errors are becoming more obvious – and a lot of the time they're little semantic things that require only logic, like a missing </div>, or not closing brackets, rather than advanced coding knowledge. It's satisfying to fix!

    • Commit often, and with clear commit messages: I like using GitX because it becomes really clear what you've changed, and where. Once you've added a new feature, or modified a specific aspect, don't forget to commit it so you can always get back there, and try and be as specific as possible in the commit message. ie. No “Add new feature” but “Add 'training' to navigation menu” for example. Not only does it allow you to get back there if/when you break something, but it's also pretty cool to look at all the things you've added and changed! I really like this Git style guide, from GDS

    • Inspect Element” in Chrome is pretty much your best friend: when you want to change something, 'inspect' it to see what it looks like in code. You can modify things in the inspect element window to check that you're looking at the right thing, and you can see what line in the css affects how it looks. It's wonderful.

    • Online documentation (sometimes) has the answers – admittedly, sometimes it's written for the expert rather than the beginner, but try not to let the long words/chunks of code/general gibberish put you off. If there's a particular problem you're having, or feature you want to add, Google it first. Look at what other people have done, and in online fora where people might have asked similar questions, or in specific documentation. If there's a step by step guide, try the simpler steps yourself, and if there are terms in there that you don't understand, Google again. Rinse and repeat.

    • Keep an eye out for jargon – my best example of this was with 'white space'. For me, the term “white space” means blank space. I have a plugin installed on Sublime which turns this whitespace into pink space, to make it more obvious to see; so, I described it as “pink space”...which, it turns out, sounds funny to a lot of people. Moral of the story: there are lots of funny programming terms out there, and people you talk to might take many of them for granted, and expect you to understand. It's okay if you don't! 
    • From a pedagogical perspective – don't take people for granted. Just because someone has helped you make sense of a certain problem does not mean that they've signed up to hold your hand throughout your entire learning curve; do yourself (and them!) a favour, and try and get through as much as you can yourself before asking for help. It'll help a lot if you can explain the problem you're having along with your attempted solution – not only does it demonstrate that you're really trying to fix it yourself, but you might find some revealing holes or mistakes in your understanding of how it all works. Remember the first tip here- don't panic!

    • Another pedagogical one: try not to let other people type for you. It might sound silly, but having to do the steps yourself, rather than watching a more experienced person do it for you on your computer, can make a lot of difference. Even if they have to literally spell out what you need to type, typing it will help you internalise and remember it. Ask whoever is helping you to imagine that your keyboard is made out of lava – it's too hot for them to touch, so only you can touch it. (I can't remember who told me about the 'lava keyboard' teaching method – if it's you, remind me!)

    • Be realistic, and patient: you're new to this! Nobody learns a new (spoken) language in a day, and you're not going to learn a whole new (coding) language in a day, either. It'll come. My guess is you'll never stop coming across new things to learn, and that's half the fun, really.

    Any others to add? Let me know

Read Post

Customisation: first forays into Django and Python, and adding new tag fields

29 April 2014

Lots of the explanations here are Tryggvi's wise words; I thought they might be useful to others, so he kindly let me copy them over!

So, customisation. As I wrote about in my last post, I got the local instance of Source fired up, and next came the steps of playing around with it, and customising it for what I need for the toolkit.

As you can see from the Code section of Source, you can 'tag' items. On the Toolkit site, I'll be renaming the 'Code' section as 'Tools', and this will be how people can look through the recommended online tools on the site. From Source, the categories of tags are currently split into 'technology tags', or 'concept tags', but I wanted to have more categories- 'data source tags', so that people can search by data source, and 'skill level' tags, for each code.

I tried first looking at this page about custom tagging in the Django documentation, but it didn't make that much sense to me. So, with the help of my trusty tech mentor Tryggvi, I started off by creating the 'models', ie. how the tags will be represented in the database.

Explanation: Django is made up of “apps”; which have special purposes; here, there is an app called “source.tags”. So, in source/tags/ there is a file models.py which describes the tags models.

In source/tags/models.py, we can see the 'technology' and 'concept' tag models:

class TechnologyTag(TagBase):
class TechnologyTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(TechnologyTag, related_name="%(app_label)s_%(class)s_techtag_items")

class ConceptTag(TagBase):
class ConceptTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(ConceptTag, related_name="%(app_label)s_%(class)s_concepttag_items")

so, following the same CamelCase notion I added:

class DataTag(TagBase):
class DataTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(DataTag, related_name="%(app_label)s_%(class)s_datatag_items")

class SkillTag(TagBase):
class SkillTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(SkillTag, related_name="%(app_label)s_%(class)s_skilltag_items")

Next came migration, as the database needs to have everything defined before items get put in, and we had updated the database here.

To migrate the database to the newest version that includes both of the new tags, I activated my virtual environment, then ran:

python manage.py schemamigration --auto source.tags

from the root folder, where manage.py lives, which told it to migrate the app called source.tags.

I got:

+ Added model tags.SkillTaggedItem
+ Added model tags.DataTaggedItem
+ Added model tags.DataTag
+ Added model tags.SkillTag
Created 0002_auto__add_skilltaggeditem__add_datataggeditem__add_datatag__add_skillt.py. You can now apply this migration with: ./manage.py migrate source.tags

...which let me know that the migration for the database schema had been successfully created.

I added the new file ( 0002_auto__add_skilltaggeditem__add_datataggeditem__add_datatag__add_skillt.py ) to my git repo, too, but decided to wait before committing it.

Next, as mentioned above, I migrated the database to make it up to date with the newest modifications, with:

python manage.py migrate

which gave me:

Running migrations for tags:
- Migrating forwards to 0002_auto__add_skilltaggeditem__add_datataggeditem__add_datatag__add_skillt.
- Loading initial data for tags.
Installed 0 object(s) from 0 fixture(s)

which told me that the database is up to date. Next came some Django learning:

Django enforces a design pattern (a good solution to a common problem) which is called MVC, Model View Controller, which is about how to structure your code in such a way that it doesn't get messy and problematic when you change a few things. The idea is that you have the database stuff managed by one part (the model), computations and preparations by another (controller), and then user interface to show the results by the third (the view)

But, in Django specifically, other terms for the same design pattern are used; instead of MVC, it becomes MTV; Model, Template, View, where View in Django is Controller in MVC and Template in Django is the View in MVC.

What we've done so far as the 'model' part of the pattern, so next came the 'View'/ Controller part, and we started with the admin interface.

This happens in a file called admin.py, so in source/tags/admin.py, I found:

from .models import TechnologyTag, TechnologyTaggedItem, ConceptTag, ConceptTaggedItem

which is where the models are imported.

I added:

DataTag, DataTaggedItem, SkillTag, SkillTaggedItem

to import the new models that I'd created, and then I looked at how classes were created in admin.py. Here's an example:

class TechnologyTaggedItemInline(admin.StackedInline):
model = TechnologyTaggedItem

class TechnologyTagAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [

So following the same pattern, I added:

class DataTaggedItemInline(admin.StackedInline):
model = DataTaggedItem

class DataTagAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [

class SkillTaggedItemInline(admin.StackedInline):
model = SkillTaggedItem

class SkillTagAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [

and at the bottom of admin.py, also added the new tags in there:

admin.site.register(DataTag, DataTagAdmin)
admin.site.register(SkillTag, SkillTagAdmin)

and started up my server, to see that the new categories of tags were now added to the main admin interface!

But, although they now appeared in the main admin interface, they didn't yet appear in the 'Add new code' section; so, I couldn't add the tags to new 'tools' or 'code' that was being added to the site.

To do this, I opened up the code models, in source/code/models.py, which has two classes defined: LiveCodeManager and another one called Code. The relevant one here is Code, and the class defines some attributes, which is what I wanted to add more of.

So taking 'Data Source Tags' as an example, I added:

data_tags = TaggableManager(verbose_name='Data Source Tags', help_text='A comma-separated list of tags listing data sources', through=DataTaggedItem, blank=True)

By doing this, I created an attribute which followed the rules of 'TaggableManager' which, judging from the name, manages the tags.

So the way tags are probably managed here is that there is one collection (table) of code objects, and another collection of tag objects; a code object can have many tag objects, and each tag object can be assigned to many code objects, ie. a many-many relationship. The way that many to many is managed in SQL databases is via a table (collection) that connects them; each row in that table will have an identifier to the code and another identifier to the tag.

So, imagining a spreadsheet where each column is a field, it becomes impossible to add a random amount of tags (unless you have some weird delimiter inside the field) which is why they move it to another table, then instead of adding more columns and extending horizontally, they add more rows and extend vertically. The 'through' item mentioned above ( through=DataTaggedItem ) is a way of defining what in the table extends vertically.

But in order to get the classes of DataTaggedItem and SkillTaggedItem, which were created in tags/model.py, we have to import them here.

So, in source/code/model.py, we added the new Items to the line:

from source.tags.models import TechnologyTaggedItem, ConceptTaggedItem, DataTaggedItem, SkillTaggedItem

to tell python where the classes/tables live.

Then, I migrated the new database; but, the View/Controllers part wasn't yet updated, which meant that although the new tag categories appeared on the main admin interface, they weren't in the 'admin' part of the 'code' section.

So, in source/code/admin.py I added the new fields to 'fieldsets':

search_fields = ('name', 'description',)
fieldsets = (
('', {'fields': (('name', 'slug'), ('is_live', 'is_active', 'seeking_contributors'), 'url', 'source_code', 'documentation', 'tags', 'technology_tags', 'concept_tags', 'data_tags', 'skill_tags', 'screenshot', 'description', ('repo_last_push', 'repo_forks', 'repo_watchers'), 'repo_master_branch', 'repo_description', 'summary',)}),

which defines what we see on our admin page.

Then, I added:

data_tags_list = form.cleaned_data['data_tags']
skill_tags_list = form.cleaned_data['skill_tags']
merged_tags = technology_tags_list + concept_tags_list + data_tags_list + skill_tags_list
if merged_tags:

to line 40, underneath:

technology_tags_list = form.cleaned_data['technology_tags']
concept_tags_list = form.cleaned_data['concept_tags']

which describes what happens when we save tags in the admin interface,

Then, I added the new tag fields, to update the looks for these fields here in the controller (which, I'm informed, is bad practice– it should be updated in the template, rather than this function)

if db_field.name in ['url','source_code','documentation','tags','technology_tags','concept_tags','data_tags','skill_tags']:
field.widget.attrs['style'] = 'width: 45em;'

So, with that all done, I ran the server again; and the new tag fields now appear in both the main admin interface, and in the 'Code' admin interface, meaning I can add new tools (code) and tag them under 4 different categories.  

Read Post

Setting up a new website: user stories, installing Source locally, and lessons learned

27 April 2014

Over the past couple of weeks, I've been focusing my efforts at work on the online presence of my project, the Open Development Toolkit. I put up a holding page there at the start of the year, which runs on Jekyll and was forked from another site; I kind of love the site (you'll understand when you click the 'on' button in the top left hand corner), but it doesn't do everything I needed to do.

So, with the help of my lovely tech mentor Tryggvi, I began (and am still in) the process of restructuring things.

Firstly, to work out what I needed from the site, I wrote some user stories, thinking about the people who would be accessing the site, what they wanted to do, why they wanted to do it. I prioritised them in terms of the most important users down to the least important users, and tried to limit myself to just 6 different users, most of which have more than one story. From these, we worked out what feature they would need on the site to be able to do what they wanted to; it turns out that a few of them brought up the same feature, which was really helpful to see.

A couple of examples:

User: Journalist in aid-recipient country

I want to: find a tool to help them understand what projects the World Bank is running in their country

So that I can...investigate the relationship between the World Bank and my government

Feature: tools search function (tag: donor organisation)


User: Civil society activist/newcomer to accessing aid data

I want to: find a tool to help me understand aid flows to their country, + accompanying training materials to work through alongside

So that I can... have some support while beginning to explore the theme of aid data

Feature: tools and accompanying training materials presented together

One of the most important features was being able to clearly see, and filter through, different tools on the site, as well as having a clear online community around the toolkit which allows people to see who is out there, what they're working on, and what they've contributed to. Another was being able to link between tools and training materials in an easy way, to make it as easy as possible for users to find the resources they needed on a thematic basis.

Now, I've been assured that basically all of the features that I needed are entirely possible to create in Jekyll, the framework that I've been using so far; but I have fairly limited time, and I'm such a newbie that I imagine it would take a long time to set all of these things up! (though, I imagine, be a lot of fun.)

So, I started looking for sites which already do lots of the things I want my site to do, and one which came up pretty quickly is Source, from OpenNews. It's a community site, aiming to

amplify the impact of journalism code and the community of developers, designers, journalists, and editors who make it. 

It acts as a hub around journalism code, and seemed from first glances to do everything that I wanted the new Toolkit site to do.

To check, though, I went through my list of user stories and marked how the Source site would fulfil those requirements. I marked the ones that could be easily ticked off with the site 'as is' in green, those which would require some modification in yellow, and those which couldn't be met in red. Luckily, there were no red rows among my user stories! And the yellow ones were reasonably simple modifications.

So, having checked that, the next step was to install a local version of the site, for me to have a play with. I was really lucky to be introduced to the team behind Source at this stage, who were super kind and offered their help in anything I needed to get the site set up. It's been great having that as a back up when I've had questions, and the whole team have been really responsive and generous with their time; a brilliant example of the joys of the 'open' community. 

But to start with, I looked at Source on Github. Luckily for me, there's a pretty comprehensive 'Readme' section with installation instructions. Given my newbie status though, there were still a few things that I needed to install myself, or look up to understand fully. I'd also never used Python or Django before, so came across some pretty basic stuff for the first time. 

I started with the instructions as they read on the readme; I'd never used the command


before, so first I had to install that, and I followed the instructions here. I already had the other dependencies from having Homebrew installed previously.

I ran

pip-install funfactory

(what a lovely name!)

and then I used these instructions on forking the repo from Github's help section.

Then, I learned about what a virtual environment was here, and how to set it up for the first time, by running

pip install virtualenvwrapper

and activated it:

source venv/bin/activate

and changed directory into /code/source, which is where I'd saved the forked directory, before following the last step:

git submodule update --init --recursive

and getting all of the development requirements,

pip install -r requirements/dev.txt

Then, I carried on with the 'Configuration' instructions. I created my own 'HMAC_KEY' and SECRET_KEY in the file /source/source/settings/local.py (and was assured they could be as silly as I liked)

and I added:

'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'source_app.db',

to the same file.

I kept running into errors though, and then realised that I didn't have MySQL, which I had assumed would be there from Homebrew. So, I followed this good advice and ran:

$ brew install mysql

And then, once I had definitely got all the dependencies, I synced:

python manage.py syncdb

and migrated articles, code and people as in the Readme.

I couldn't get the test-articles set up, but I ran 

python manage.py runserver

anyway, and, to my delight, saw my own local version of it running at  http://localhost:8000/

It was so satisfying! I've no idea how recently other people had tried going through those steps, but I filed an issue about the test articles to let them know, and got a very prompt response, saying the test articles need to be updated. 

Ta-da. And that was that. Next has been learning how to customise it, and diving more into Python and Django... coming in another blog post.

Read Post

When an aid project goes wrong, who is responsible?

24 April 2014

When we talk about “open government”, it’s common to also hear talk of transparency and accountability alongside. At its simplest, a government being transparent and open about their actions is a necessary step for citizens to know what is happening in their country, and to understand what decisions are being made on their behalf. Having access to this information is also a necessary step for citizens to be able to hold government accountable for their actions, and citizens being able to take action through legal and official means when they feel a government has taken irresponsible actions is a crucial step in this chain.

So- what about in “open aid” or “open development”? One major focus of transparency in aid has been ensuring that aid projects are carried out in the most effective and efficient way; without wasting money, either through inefficient service delivery or corruption, or other means. Here, the chain of accountability that is addressed goes directly from the donor agency (eg. the UK’s Department for International Development, DFID) to their citizens (ie. UK citizens). In the case of large multilateral donors, the accountability mechanisms are perhaps more complicated, but still present.

This move towards transparency and accountablity within international development is, of course, a great development; but what about accountability to the people who are affected by aid projects? Those whose lives are completely changed by aid projects, and those who are most at need; if their lives are negatively affected by (whether intentionally or unintentionally) aid projects, where do they turn?

Read Post