I Wanna Be The Very Best!
How a Pokémon themed Slackbot helped me with motivation and learning… through the power of emoji! ✨
That’s me, admitting on national TV that I watch Eurovision. You see, I’m a very competitive person and I get a rush of excitement upon buzzing in and getting a question right. In this case, “Name the Eurovision 2014 winning singer or song in this musical clip”.
In psychology, it’s called extrinsic motivation — being motivated by things outside yourself (you can read more about it on Wikipedia). For me, it’s that feeling of achievement I get when I get the answer right, I get points, and people clap for me. It turns out that it’s enough to make me broadcast my love of terrible European pop music to living rooms across New Zealand.
Being motivated like this is great if you’re trying to win a quiz show. It’s also useful while you’re a student and have lots of tests and assignments, because you get constant external feedback of your performance. It makes it really easy to care about your grades and do well.
Unfortunately, it becomes a problem if, say, you become a junior developer and you have to deal with getting things wrong 90% of the time while you’re working. Or at any level really — this feeling will follow you throughout your entire career.
That’s where I found myself, about a month into my first job as a software engineer. I was getting frustrated at all the things I didn’t know, and often found it hard to keep going as I kept getting things wrong.
As the newest member of the team, I found it incredibly difficult to find the value in my work. Why should anyone give me things to do when a senior engineer could do it better and faster? What could I do better than anyone else on my team when the next least-experienced person in engineering still had 5 years of experience? It was hard not to feel like I was putting a lot of effort into going nowhere.
But I wasn’t actually sitting there doing nothing every day. Even though some days I wouldn’t produce anything tangible, I was still learning. Every time I failed, I was learning new ways how not to do things. But how could I motivate myself with that?
As developer, it turned out the answer was to write a program.
If I had a way to note down all the things I said I’d do that day and mark them off, I could look back at it and feel like I’d gotten something done; it would be like doing quests in an RPG. And if I learnt something new, I could write that down too, and that would be loot or EXP, and then I could level up.
The first iteration of the Pokébot wasn’t even a bot. It was an HTML page which, if you put in a very carefully formatted todo list, it would generate a list where each item on it was a random emoji.
The random part is important. The tl;dr is that behavioural psychologist B.F. Skinner (famous for putting rats in boxes with levers), found that adding variability to rewards makes positive reinforcement last longer and work better. It’s the same principle behind why slot machines are so addictive, and it’s used a lot in free to play games and MMOs. You can read more about it in Wikipedia.
Every morning, I would copy and paste this formatted list into my own personal Slack channel (#watch-sana-level-up). As I’d finish tasks, I would edit the message to change the emoji to a pokéball to show that it had been “caught”, i.e. done. I’d add new tasks throughout the day, and the cycle would continue.
By having something external providing me with little, randomised rewards of cute emoji (even though I made it and control it), I was able to take advantage of my tendency towards extrinsic motivation. Every time I crossed something off my list, I felt like I was achieving things. It was working!
But I could do better.
Having to format my post exactly, and having to edit the post every time to update it was really annoying. Plus my workplace really likes Slackbots — we use them to handle our deployment queue, to remind us about our technical debt and code reviews, to nag us to finish our post-mortem mitigations… and so on. So it just made sense to add 🤖.
I used Botkit, an open source Node library for building bots, which is also the same library used by the bot that managed the deployment queue where I worked. The library gave me a wrapper around the Slack API and handled the authentication side for me so I could concentrate on the functionality of the bot.
I had some basic commands:
- .todo — add an item to the list
- .side — add a side quest
- .catch — record a task as done
I could type these into the channel to modify the task list. And it also helped me by focusing myself every morning on what I would set out to achieve.
And like v0.1, each task has random emoji.
In addition, there is the command .til . TIL stands for “Today I Learned”. #til was also a Slack channel at my workplace, where people say if they’ve learned something new. I knew that if I posted in there every single time I learned something, it would just be a channel of me posting, so I decided to stick to my own channel.
The TIL command was the key to changing my motivation. By rewarding myself for learning new things, I could encourage myself to change my thinking in a way that would change my motivation style to intrinsic. By marking each new thing learned as an achievement with an associated reward, I could feel accomplished by the development I’d made personally, rather than measuring myself against others.
So I set myself a goal of recording at least one new thing learnt a day, even if that thing was completely unrelated to coding or was silly. Then every Monday I would put them all together in one Slack post to get a weekly review of the things I’d learnt in the previous week. And at the beginning of every month I would paste all of those into a spreadsheet.
Over the course of May 2016-June 2017, I notched up just under 400 new things learnt.
The top 5 rewards were:
- 🍜 Ramen noodles
- 🍫 Chocolate bar
- 🍹 Tropical drink
- 🍧 Shaved ice
- 🎀 Ribbon
Rewards that were only given once were: 👠 🍩 🐶 🍮 ☕️ 🐱 📚 🍻
Here are a few of my favourites:
- ✨ Asking the right question at the right time can be useful for other people, not just me
- 🔔 Cake for breakfast sounds like a better idea than it actually is
- 💰 SingleOrDefault() in C# gets two behind the scenes to make sure that it is, in fact, single
- 🍪 The way things are stored in the database may not be usable categories by actual human beings in a UI
- ⚔ Why you don’t store hashes of strings generated with String.GetHashCode() in databases (because the hashes can have different values for different versions of the CLR)
- 🍗 Don’t use emoji in branch names because it makes Teamcity sad
This experiment was hugely successful for me while I was a junior developer. It helped me value my own progress, it helped me learn more Node, and it made my learning more visible to other people I worked with too. It also helped me remember what I was doing so I could actually tell people at standups.
I’ve open sourced the bot on Github — it’s available as bigshika/pokebot-tracker. Feel free to fork and customise. Go out and learn! I can be found on Twitter as @bigshika too, if you want to ask me why I did things a particular way or if I considered feature [x].
I haven’t set it up at my current job because it feels like it’s served its purpose. But I still have a daily Slack reminder set to ask me at 4pm every weekday:
“What did you learn today?”