Cover photo
Michael Mahemoff
Works at Player FM
Attended University of Melbourne
Lives in London
Make, Speak, and Listen
What do I put here?
  • Player FM
    Chief Experience Officer, 2011 - present
  • Google
    Developer Relations, 2010 - 2011
  • Osmosoft, BT
    Senior Architect championing Open Source and Web Standards, 2007 - 2010
  • Enterprise Java, PHP, Rails Web Dev
    Various enterprises/startups, 1997 - 2007
Map of the places this user has livedMap of the places this user has livedMap of the places this user has lived
It's so just cloud
It's So Just Cloud! Xoogler making podcasts cool again at Player FM.

Full-stack developer, former Googler, and writer/speaker/loudmouth on all things tech, with a focus on web, user experience, developer experience, and open source. Here on the plus, I manage +Player FM and +Developer Experience pages, moderate Hacker News and Podcasting communities, and share funny-sounding goat videos.


Left gainful employment at Google 2 days after Plus went public. Nothing personal, notice had already been given I assure you :). Did some consulting and public speaking work, made some micro-apps I'd been planning (e.g. and then went full-time on Player FM, something I've been dreaming about since podcasting began in 2004, when I made the gorgeously-styled FAQ at! Previously wrote Ajax Design Patterns (O'Reilly 2006) and blogged for Ajaxian.

These are a few of my favourite things on G+:
  • Web/HTML5/Android/Rails development
  • UX
  • DX (Developer Experience)
  • Podcasting
  • Shiny
A few things I've worked on in the past ...

Web apps:
And a few single-serving sites for a laff:

Chrome apps/extensions: Humans.txt extension (, also a Chrome Boilerplate (, etc.

Content: Blogging at, wrote Ajax Design Patterns for O'Reilly (, some older stuff at Also blogged for Ajaxian and guest blogged on

PhD: Called "Design Reuse in Software Engineering and Human-Computer Interaction", my PhD considered the role of design patterns (a new topic in software at the time!) in improving user experience. for proof there was a time when people stuck postscript files on the web.

As well as front-end web development, I've done my my share of Java and J2EE in various small and large organisations. Since around 2005, I've mostly been running Rails, PHP, Node, and Python on the  back-end.

User Experience: I've been fortunate to perform several user experience roles (helps to get one's foot in the door as a developer first ;). In financial services, I was able to visit trading rooms and redesign a front-end market-maker app. In medicine, I spent time in an Intensive Care Unit to design a mobile (Palm Pilot!) app to support medical decision-making ( I lectured Human-Computer Interaction for a semester at the University of Melbourne's Department of Information Systems.

About Circling You Back: ("Awkward ♫")
There are people who I should have circled, but haven't, including some who've circled me. Now some of you don't care much about that and others of you are Visually Pleasant Spambots from the Planet SocialMedium, in which case you don't need to, or - contingent on your crawling algorithm - will not, read this. But if you do care about being followed back, please read on ...

I'm probably not following you because there's no good, time-efficient, tools for this yet. I do use the suggestion tool and keep an eye on people who are circling me, but it's certainly possible I'll miss you. Especially if we haven't met, we don't have "N people in common", you don't work anywhere I recognise, or your avatar doesn't insanely stand out, since those are the only clues that G+ provides for now in the "circled you" interface. Those are not very strong signals and I'm sure I'd follow many people outside those criteria.

So if I happen to miss you when you circle me, I'm more likely to see you again if you leave a comment or share my story. I'm not saying that to bait for those things, it's just that right now there's not much other way to notice someone. Beyond that, what would make me follow you are the usual suspects: you contribute interesting content here and engage with people. I do hope this is an area where G+ improves.
Bragging rights
Made the favicon come alive
  • University of Melbourne
    PhD, 1997 - 2001
    User Experience Patterns ("Design Reuse in Software Engineering and Human Computer Interaction")
  • University of Melbourne
    B. Sc. (Hons), 1992 - 1996
    Psychology major
  • University of Melbourne
    B. Eng., 1992 - 1996
    Software Engineering major Non-technical electives: Linguistics, Marketing, Accounting
Basic Information


Michael Mahemoff

Shared publicly  - 
At some point, a single database instance starts to creak as more objects are added to it, even with read-only replication. A battle-proven strategy here is to scale horizontally via sharding, however there be dragons. Here are general design principles on sharding with relational databases such as MySQL and Postgres.

These are some good case studies on MySQL sharding:

* Sharding Pinterest: How we scaled our MySQL fleet (+ Hacker News thread on this).
* Sharding & IDs at Instagram

Only shard when you have to. Premature optimisation is, after all, the root of all evil. Sharding adds more servers to build, maintain, failover, and backup; and it makes apps more complex.

Each object/record has its own GUID to uniquely identify it across all servers. The GUIDs indicate the shard this object lives in. When requests come in, they specify a GUID which the server can then map to a particular shard. Instagram Engineering has a good overview on GUID generation, there are various options with pros and cons.

Use many virtual shards and distribute evenly between them. It’s best to assign each object to one of thousands of virtual shards, and then map those to physical shards (ie database instances running on a particular host). e.g. You might assign an object to shard 1331 out of a possible 10,000 shards, using a simple random number or modulo function to ensure each shard has approximately the same quantity. This virtual shard its permanent home and will never change. You then map 1331 to “database server 3”. The reason for this indirection is so you can easily split up data as the system grows.

Related content lives in the same shard. Typically, content owned by a single user/team/company should live together on the same (virtual) shard. For many applications, the main queries that need a quick user response are all within the same object graph, ie some kind of join between a company, its workers, and their content. It makes sense to store all of this in the same shard, so if you have a natural hierarchy, ensure each class’s shard is initialised with that of the root class (e.g. each “sale” is assigned to the same shard as the shard of the “salesperson” who made them, and each “salesperson” is assigned to the same shard as the “company” they work for).

Slave replication is only for backup/failover. This is advocated by he Pinterest paper. Replication can cause weird “time travel” bugs, where an application reads stale data from a slave and then uses it to update the master. Sharding is sufficient to replace the performance benefits of reading from multiple slaves, so replication should only be used for backup and failover purposes. Each shard (and any central database) gets its own slave.
Add a comment...

Michael Mahemoff

Shared publicly  - 

Occasionally one team is incentivised to lose a game, but what happens when both sides are trying to throw a game, and it's on the Olympics stage no less? #nowplaying
Add a comment...

Michael Mahemoff

Shared publicly  - 

via r/programmerhumor
Philippe Lhoste's profile photoMichael Mahemoff's profile photoTore Julø's profile photoRon K Jeffries's profile photo
Above average! 
Add a comment...

Michael Mahemoff

Shared publicly  - 
TIL a New York skyscraper had a 1 in 16 chance of collapsing every year, until an undergrad student informed the engineers. Even weirder, she went unknown and never even knew about her contribution until a BBC documentary 2 decades later.

99% Invisible covered it

(Discovered via
Roman Mars’ podcast 99% Invisible covers design questions large and small, from his fascination with rebar to the history of slot machines to the great ...
Add a comment...

Michael Mahemoff

Shared publicly  - 

We are pleased to announce Player FM 3.6!

Player FM 3.6 is now available on Google Play.

This update will help new podcast users and even the seasoned podcast junkies manage their daily podcast habit. You can now organise subscriptions into categories and they will sync across Android and web apps. Player FM rethinks the podcast experience for the modern era, and categories are no exception. We aim to make categories “smart” with features like Suggested Categories when you subscribe to any series, recommendations to help you build up your categories, and Social Sharing.

Smart categories for your subscriptions

Rare is the “casual podcast user” … most people who get into podcasts quickly find themselves devouring hundreds of them! To help you organise all your subscriptions, Player FM 3.6 introduces categories, so you can keep a list of “news podcasts”, “morning commute” podcasts, and so on – create whatever categories fit your lifestyle. You’ll see categories as sub-tabs in your subscriptions screen and similarly in web app navigation. In addition, they have several unique features:

When you subscribe to any series, the app will automatically suggest a category among your existing categories making it a breeze for you to follow any new show. This is based on various cues, from our curated catalogue to publishers’ metadata. If there’s no good choice, it will still suggest some categories and let you immediately create the category and add the series, all in one tap.

Each category shows recommendations to help you fill out the category,. The recommendations are powered by a combination of curation, publisher metadata, and usage trends.

You can make any category public. The category URL will open in the app if the user has it installed, allowing other users to subscribe and play. More importantly, it will also work as a regular web page for anyone not using the app.

Series settings

Related to smart categories, per-series settings has been updated. You now have a single popup dialogue allowing you to set categories, unsubscribe, and set preferences like notifications, playback settings, view sort order, and download order (can be used for downloading “binge-worthy” series from the start). A new setting will let you see the dialog whenever you subscribe.

Enhanced Search

The search interface has been redesigned to use the familiar “dial” interface used elsewhere in the app. As well as searching over 300,000 available series, there are tabs for: episodes – allowing full shownote and title search of over 16 million episodes; series you’re subscribed to; and topics. The topics is a list of over 500 curated catalogue topics to explore, and will expand in the future to include categories users have made public.

Custom Artwork

Many podcasters go the extra mile and provide custom artwork for each new episode. We’re pleased to finally be able to showcase these efforts. Player FM will extract artwork from episode files as well as artwork linked in publisher feeds. You’ll see this appear on episode lists, in the lock screen, and the full screen player. In addition, both series and episode detail screens have been updated to show you large images. Popular shows using custom artwork are TED Talks, No Agenda, and KCRW’s Left, Right & Center.

Sleep timer

Aside from setting the sleep timer at a specific time, the sleep timer can be set to stop at the end of your favorite episode.


If you want fine-grained control over your podcast experience and use apps like Tasker and IFTTT, try Player FM intents. We’ve added two new intents to let you choose when podcasts download: fm.player.update.conditional and fm.player.update.unconditional.”conditional” will respect your app settings (e.g. only download on wifi and while charging), “unconditional” will always sync and download according to your limits, so you will probably be choosing the conditions from the external app if using that. More on intents in the FAQ at

Downloads management

If a podcast app didn’t have any downloads, was it a podcast app at all? As well as the downloads-only toggle, we know some users still like to delve into their completed downloads and browse them directly. This screen now has sub-sections for All, Manual, Subscriptions, Play Later downloads. See total size and number episodes for any type of download and delete all in one tap.

User interface updates and settings

We’ve been busy cleaning up the interface since v3.5. As well as the above updates, here are a few other things you’ll notice:

Main settings screen now has more color and icons on the left to give each section a unique identifier. Gone are check boxes, replaced by toggles.
If you are using a custom theme, you’ll see more consistent styling in that theme. e.g. With purple theme, Downloads screen header will now be purple instead of the standard green. This is particularly important for night mode, where you’ll no longer see colored header bars. To explore themes, check out Display Settings, or just tap on the Player FM logo in the side menu.

You now have flexible series thumbnail layout. For phones, choose between 3, 4, or 5 thumbs per row.

For lock screen purists, you can now disable lock screen podcast artwork in Display Settings.

Notification settings has been redesigned and simplified, so you can turn everything on or off with a single tap. You’ll also see icons for each show in the notifications list.

Say goodbye to empty boring screens. We’ve added a friendly radio guide indicating when there are no search results or no downloads.

One more thing! That Icon!

After 4 years of the red mic icon, it was time for an icon that didn’t lead people to think this app lets you record top 40 singles. We’ve been getting feedback on several icon options in recent months and we’re happy to settle on this one. Users can now rejoice that they will see the same icon on Google Play and on their homescreen!
We are pleased to announce Player FM 3.6! This update will help new podcast users and even the seasoned podcast junkies manage their daily podcast habit. You can now organise subscriptions into categories and they will sync across Android and web apps. Player FM rethinks the podcast experience ...
2 comments on original post
Add a comment...

Michael Mahemoff

Shared publicly  - 
A CDN asked me why they should respect the HTTP “vary” header. My reply was this. “vary” is needed because the app uses “PJAX” architecture used by many dynamic web apps and embraced in frameworks like Rails’ TurboGears. Simply put, all links are…
Dor Kleiman (configurator)'s profile photoMichael Mahemoff's profile photo
The server responds with requested-with: XMLHttpRequest (if it's a partial) and vary: requested-with. So the cache should key on that requested-with value, not just the URL.
Add a comment...

Michael Mahemoff

Shared publicly  - 
Was hoping for a mid/high-end 10" Android tab w/ micro SD card to replace the Nexus 9 on this Black Friday, but didn't see too much. (I'm struggling with a 16GB device lacking external storage, embrace the cloud is great until you jump on a train and now you're paying £6/MB roaming fees or wonderfully free but stupidly slow data roaming).

Anything I missed?

Best value I could find was Lenovo A10-30 though shipping w/ Lollipop doesn't float my boat and not sure it will be much improvement over the N9. Certainly seems like value though at £120.
Robert T. Best's profile photoDan Trevino's profile photoMichael Mahemoff's profile photo
+Dan Trevino Will be a good option if it really runs apps as an Android device would.
Add a comment...

Michael Mahemoff

Shared publicly  - 
Required comedy feature on all VR headsets
Angelia Phillips (femmeflashpoint)'s profile photoDor Kleiman (configurator)'s profile photo
Add a comment...

Michael Mahemoff

Shared publicly  - 
Wow, Tesla moves fast 💨

From a tweet to an enforced policy in six days.

It takes most companies their size six days to bounce their no-reply emails back to anyone leaving feedback.
Shawn Drape's profile photoJohn Mueller's profile photoMichael Mahemoff's profile photo
Very possible :D
Add a comment...

Michael Mahemoff

Shared publicly  - 
This is probably the last js blogging of MIT licensed code I'll do in quite a while, as I am about to join a company that is a bit... ...control freak:ish, on that front.

Thanks to +Michael Mahemoff and +Dmitry Sorin for Control Freak! :-) I love it. Grab and CDN the on.user.js lib at will, anyone, if you want to make its UX gentler by having it covered by Control Freak's library presets.
After Google Chrome discontinued native user script support in the shipping default build, I ran TamperMonkey for a while, a pretty full featured extension similar to Firefox's Greasemonkey for my user scripting. And then at some point, I stumbled upon Control Freak, a minimalist solution for ...
View original post
Add a comment...

Michael Mahemoff

Shared publicly  - 
From the dept of Devop Horrorshow 🙈
Dor Kleiman (configurator)'s profile photo
This is why you shouldn't hire lunatics. 
Add a comment...

Michael Mahemoff

Shared publicly  - 
I might just do that then.
You can finally take Netflix with you onto a plane or the subway. Today the company announced that it’s launching offline playback for "many of your favorite streaming series and movies." Right...
Add a comment...
Michael's Collections