(not) Working in spite (because) of its best efforts

<originally published on Medium on 24 Aug. 2017>

Pokemon Go is just a damned mess, maybe Lord of The Damned Mess

So while I am possessed of a love of hyperbole, I have to say that in many ways, Pokemon Go is one of the worst UI/Accessibility experiences ever. As in barely better than Lotus Notes. (Those of you who know me understand the depths of my hatred for Lotus Notes, an app that once had the copyright symbol in a menu as a command-key equivalent.) (Also, I take that back. This game is far worse than Notes. Notes at least performs its core competency in a reliable fashion that is buggered by an awful UI. Pokemon Go is incapable of reliable operation for more than a few hours at a time.)

In the interests of clarity and transparency, I have no formal training in either UI/UX design, nor accessibility. But I have decades of experience dealing with applications as an IT person, aka helping others use them. I’m also, for the purposes of this post, going to use UI/Accessibility somewhat interchangeably, because if your UI is hard to use for people with no special needs at all, then the chances of it being nice to use for people who need a bit more help are pretty slim.

I just celebrated my 50th birthday, so accessibility issues that weren’t pressing some decades ago now have greater meaning to me.

Also, I play the hell out of Pokemon Go. In spite of its best efforts to make me stop. Aside from the early days of “we don’t know how to size a server farm”, which has by and large been fixed, it is remarkable how relentless this game is in making one hate the physical act of playing it, of interacting with it. Every interaction with Pokemon Go is an example of what I like to call “being nibbled to death by baby ducks”.

In addition, none of this is based on “inside knowledge”. This is just a list of things I see and experience regularly, if not constantly, while playing this game, coupled with a couple decades of knowledge from being a sysadmin. I don’t work on Pokemon Go, but I’m not new to “the biz” as it were.

Finally, I am well aware that Niantic et al have, to their minds, good reasons for every thing I’m about to complain about. But that doesn’t make it okay. That just means there was at least, in theory, some thought behind the decision. The difference is important. Oh, and this is all based on the iOS version of Pokemon Go. No idea about the Android version whatsoever.

Failing Gracefully is for Suckers

One of the most egregious annoyances of Pokemon Go (aka “PokeGo”), is how it is completely and utterly incapable of handling network transitions gracefully. If you are in a situation where you’re walking in and out of WiFi coverage on a regular basis, say a college campus, you’re experiencing the minor hell that is the white spinning pokeball of “you’re not doing anything”.

Venonat Sups On Your Screams

Tap on a pokestop while it’s up? Yeah, right, nothing happening. Try to get into a gym? Right, not happening. Even better, you get “network error” red bars because for some reason, PokeGo just cannot handle the idea that on a mobile device, the network environment is changing constantly. It’s even worse if the WiFi in question is slow or heavily loaded. (Even better? The game queues the “network error” messages, so even when you’re in a stable environment, you’ll get 2–3 more because…reasons. Error messages they can cache. Nothing useful, but that? Sure.)

This is not hard to manage, other apps, even Facebook manage this issue with far more grace than PokeGo. I cannot remember the last time I saw an app so incapable of handling reality in a mobile environment. YouTube handles this better. In fact, PokeGo is literally incapable of functioning sans an active, fairly clean network connection. Don’t believe me? Put your phone in airplane mode. You cannot interact with it at all. You can’t even pivot the screen. Whatever is on the screen stays there, and it gives us a guess as to what is cached. But you can’t tap, touch, drag or do anything. You can’t even pull up your own statistics.

As to why? The only guess I can come up with (after a fascinating Twitter convo about this), is that for as much space as PokeGo takes, it’s basically a very complicated web page. As we can see by PokeGo’s behavior when disconnected and by some other things, this is not the worst theory ever.

PokeGo may be a “fat” app, but it acts like a very rotund web page.

But really, this is one of those “I don’t care why” things. PokeGo runs on a phone. Phones are mobile, the networking environment is dynamic as all get out, heck, there are people living in places where GPRS is luck, much less LTE. Given all the local data Niantic has available to it for almost any player in the US, if not the world, it’s just ridiculous that this game is so dysfunctional when it comes to network issues.

Then there’s the “network error” hell. That’s where you’ll be battling at a gym, or just walking around, good strong connection over WiFi or Cellular and…“Network Error”. As best I can tell, there is no way to recover from this. None. The best you can do is restart the game until the error stops. This may take a few minutes, it may take days. As I write this, I’m in a multi-day version.

For a game so completely dependent on a network connection, I’m agog at how fragile that code seems to be. I’m unsure how Niantic tests any of this, and at this point, I’m 50% certain they never actually test in the real world. They just pass the Agile tests and release. Microsoft Outlook 98 handled network issues better.

Where in the hell am I?

I feel we can’t talk about PokeGo without talking about it’s inspired use of GPS. By which I mean constant, to the point that I wonder if they’re getting paid by the packet. I really wish it was easier to track what apps are doing in iOS, because I’d love to see PokeGo’s network traffic. As near as anyone can tell, and again, this is conjecture, but not completely uninformed conjecture, PokeGo seems to ignore Core Motion and rely exclusively on Core Location and the GPS, and it beats the GPS like it was a lippy British sailor sailing on “The Bounty” right after Capt. Bligh discovered he was out of jam.

People complain about Facebook draining a battery, hah! PokeGo doesn’t just drain a battery, it murders it. Drags it down to the basement, dresses like a clown and murders it. If the great merger between computers and humans ever happens, PokeGo will be the most wanted criminal on 5 continents, and as near as anyone can tell, it’s this constant banging on the GPS that’s doing it. Which means that PokeGo is literally, and deliberately doing this wrong. Because there’s no need.

How do I know this? Because I can sit at my desk, and watch my avatar, at random, suddenly run at high speed across an area that is about 3 miles in diameter. My wife can sit in the theatre she works at and watch her avatar run five miles down the road, hang out long enough for her to hit nearby pokestops before running back. That’s a GPS, because it can’t be anything else. The phone would have to be in motion for it to be anything else.

Let us pretend that PokeGo was not a wrapper around an overcomplicated web page. Here’s how this should work. When the game is launched, or returns to the front after <some time> in the background, PokeGO gets an initial location via GPS to set up the initial map. From there, it stops talking to the GPS and starts using Core Motion. If the various motion sensors don’t indicate any movement, there’s no need to hit the GPS, the device has not moved. Minor movement, say, within a few hundred yards can all be handled via Core Motion.

Basically, this is all inertial navigation, and inertial navigation can be very accurate, ask anyone who flew planes prior to GPS. The best part is, it doesn’t require GPS at all. As long as you know exactly where you’re starting from (which is the initial GPS hit on app launch or coming back to the foreground), inertial nav., (the other INS), will handle your location just fine, and if you’re in a building or there’s really bad weather, it will actually be better than GPS. It will also reduce the “run o’er the land” thing that happens with PokeGo. I’ve gotten, while sitting perfectly still, the “YOU’RE GOING TOO FAST” dialog that one should only get while in the car.

It should, from what I can tell drastically reduce the battery hit. What gets me is that it’s not like PokeGo needs GPS to achieve the desired level of accuracy. Doesn’t need that at all. Maybe someone decided “until all are one, we shall only use the GPS”? Dunno, and at this point, don’t care. It’s something that makes the game less enjoyable than it should be. Case in point. I pick up my phone and move it the 4″ needed to play the game and interact with a gym. PokeGo’s amazing location system decides I have in fact just walked ten yards. Location tracking, UR DOIN IT RONG.

You Get Nothing, Good Day Sir!

The worst part about PokeGo’s dependence on network connections, GPS, and the awful implementations of the same is that at no point does any of that make things better for the player. It actually makes it worse. As I write this, I’m in the second day of nigh-constant network errors that make doing anything other than walking around impossible.

“Oh a Pokestop…network error”
“Oh, a gym…network error”
“Oh, I’m in the middle of a battle…network error”

That last one doesn’t even make sense. Why do I need an active network connection for a gym battle to work at all. At the beginning? Sure. At the end? Okay. You could even make a case for needing one after an individual battle (in a series) is over. But why the hell do I need a network connection to have something throw rocks at something else? Battle information can ALL be cached. It’s just entries in a database, and given the size of PokeGo anyway, the worst that would happen would be that it would needfully bloat the app.

The GPS thing doesn’t make anything more accurate, in fact, it makes it worse. There’s no valid reason that I can even remotely begin to see for any of the behaviors I’ve listed above other than it allows the highest level of codebase reuse. Since Android phones are notoriously unreliable in terms of featureset, by removing as many platform-unique features as possible, you can run on the widest number of devices. But it that’s what you’re going to do, then screw it, make it a web page with minimal local caching and be done with it.

None of the above makes the app better to play. None. of. it.

But wait, there’s more, because now it’s time to dive into the bog of infinite stench that is PokeGo’s interface.

UX and UI are for losers

So yeah. The UI. God, where to begin. Well, lets start with how it actively lies to you. No, really, it shows you things that are not true. For example, according to this, I am standing in a featureless plane with some roads and no pokestops or gyms anywhere:

Hello? Is there anybody in there.

This of course, is a lie. Here’s another view of the same damned area, only after a restart of the game:

I See You Teddiursa

Remember what I said about PokeGo’s misuse of network connections for its functionality doesn’t actually help? Yeah, that’s a prime example. There’s actually a few things in that screenshot, but we’ll get to that later. Here, another example of the Game UI lying to you (apologies for how busy the picture is):

NO POKESTOP FOR YOU

For those of you unversed in PokeGo (and why ARE you reading this if you have never played, it must be dreadful boring), that white circle is critical, as it’s the limits of your “effect” as it were. If a gym or Pokestop is inside that white circle at it’s farthest expanse (it pulses out as you play about once per second, like how people think radar works) you can interact with it, i.e. get stuff, battle, that kind of thing. If it is not, then you can’t.

The Pokestop that has the white circle cutting through its base is in what a player would recognize as “ready” position. The one at the top of the image, that’s about a half-mile away in the real world is not. So, in theory, I tap on the closer Pokestop, the one in “ready” configuration, and I should be able to use it to get stuff, right?

Nope. Here’s what you see when you try:

Your mom wants to use a Pokestop

Nope, you’re not close enough. Why? Because the base of the pokestop is not completely in the white circle of interaction. Here, a closeup:

Well, that’s as clear as mud

See how the circle cuts through the base? No Pokestop for you. In and of itself, that would be fine, but the Pokestop is showing “ready”, not “you’re too far away. If the avatar isn’t close enough, don’t show the Pokestop as ready when it clearly is not.

This kind of thing is astoundingly frustrating, and it’s not just here. Keep in mind, tapping on things is the only way to interact with them. Now, another shot of that same gym and pokestop, but from a different angle:

Oh, this again

(Told you there was more than one thing in that screenshot)

Now, if you want to interact with the gym, you’re going to tap on the center of mass, right, aka the middle of the spinning red thing. That will bring up the gym.

Hah!

What will actually happen is that because there is something behind it, the game will decide you really wanted to tap on the Pokestop behind it (the light blue bit you can barely see), and that is what you will access. The only reliable way to access the gym in this situation is to tap the base of the gym (aka the tiny red circle). How do you know this? Nothing in the UI tells you, it makes you think that tapping the body of the gym will work, because when there is nothing behind it that you could also be tapping on (i.e. it too is “under” your finger), tapping the body of the gym works.

Again, the UI has lied to you. Oh, good luck tapping on that teddiursa or the spinarak beneath the pokeball. You mightbe able to get to teddi without pivoting your view or moving, but that spinarak? Man, the pokeball intercepts all taps.

Two instances of the same thing (object B “underneath” object A as it were, and they behave in the exact opposite way. Because whomever did the UI coding either didn’t test for consistency of behavior, or just didn’t care. But either way, the UI here is lying to you, twice in one screenshot! I mean, it’s efficient, but it also makes you hate the game, which one would think is not the actual goal here.

Tap detection and discernment are just awful throughout the game, and it’s pretty obvious that z-axis collisions are not even close to a priority for PokeGo. No really, here:

What we got back didn’t live long…fortunately

Were this Star Trek, this would be an example of a transporter accident gone horribly wrong. For the uninitiated, what my avatar is looking on at, in horror just before the non-euclidian horror beast in front of him drives him forever mad, is a teddiursa right next to, (and I mean RIGHT next to) a Sentret and a Spinarak occupying the exact same space. (The Sentret is the flying squirrel looking one. It evolves into a ferret-looking thing. Pokemon is weird AF.) So, what happens if you tap on the beast with two bodies?

Dunno. You may have to try to catch the Sentret, you may have to try to catch the Spinarak, hell, you may think you were tapping on the thing from beyond, but actually, as far as the game is concerned, you were tapping on the teddiursa, or, the game may display the ever popular “error” message, and you discover that one or both of the Dunwich Horrors there weren’t even supposed to be there, but thanks to the game’s amazing use of the internet for literally everything, the game hadn’t gotten around to actually removing them.

I lost track of how many lies in one screenshot. But there’s a few there. However, that screenshot lets me segue nicely into the next complaint: The UI is kind of useless at being a reliable indicator of what’s going on. For example, we don’t actually know what’s going to happen when we tap. There’s too many options, and only one will be “correct” for our needs. Unfortunately, there’s no good way to tell. Here, another example:

Which one will you get? Beats me!

So in this screenshot, there’s only one thing you can tap on with any reliability, the Pidgey kind of standing off by itself. If you tap on the base of the Pokestop and aren’t precise enough, well, you may get the Pokestop, you may get the Natu (the green bird), you may get the Bulbasaur (Frog with very large tumor. There’s a lot of cancer in Pokemon), hell, if you tap high, you may even get the gym, and there’s no reliable way to know without being VERY precise.

Because in a game that lives and dies by the tap, who needs good tap detection!

Oh, wait, this just happened. So just now, I picked up my phone to get another screen shot, and I’d been in the gym feeding my Pokemon (it’s a thing in the game, if you don’t play, that’s not important.) When you do this, you tap on the fruit icon on the left, then on the fruit to feed your Pokemon. So it looks like this:

I’m obviously a Beavis & Butt-head fan

So I leave the gym and come back to keep writing this thing, and I pull up PokeGo for a second and I see this:

SHIP IT!

This literally should never happen. It’s two completely different modes of the game. The game is now crossing the streams. Why? How? beats me. But then I see a pokemon I want to catch, so I tap on it:

Hey, Skarmory RULES

So this sort of looks like the “feed the pokemon you’re trying to capture a candy to get better results” screen, except in that case, you shouldn’t see the pokeball. Oh, and also at this point, the UI is now completely unresponsive and I have to restart the game.

I caught the Skarmory after the restart, so that’s okay.

If this was the only bug in PokeGo, given it’s the first time I’ve seen it, I’d not care. But it’s not, not even close, so screw it, I’ll sledge the game with this too. It’s not like Niantic seems to care either way.

Okay, so going back to the tap detection bit, this brings up yet another serious issue with PokeGo: It’s pretty much unplayable if you have any problems with precise motor control.

Accessibility? If you’re not perfectly able, we don’t want you playing

Wait, no, not “pretty much”. Completely. It’s an accessibility mess.

Take a look at the tap issues I highlighted earlier. Those are a pain to deal with when you have good motor control, correctable vision, etc. Take away any of those? Good. Luck. It’s even worse catching a pokemon. Hold on, another screen shot:

you wish you could throw this straight

So here’s the basic capture screen with a Rattata (aka “JESUS CHRIST, DID THE RATS EAT ALL THE OTHER POKEMON?”) The ball in the bottom is the thing you’re throwing. The icon on the left is for throwing fruit at the Pokemon to modify their behavior, (make them easier to catch, less twitchy, get more candies. Admittedly, you hit me in the face with a raspberry as big as I am, I’m going to be real easy to catch.) The icon on the right lets me choose different pokeballs to presumably make it easier to catch the Pokemon. Good luck on that, it’s a random dice roll. I miss more, per capita, with higher end balls than I do with the generic Pokeballs. I can’t even rant about that, it’s just too depressing, but the tl;dr is none of this really matters, it’s all luck. The different candies and balls are just a way to get you to give Niantic money.)

Note the red arrow. that’s the only path that will get you a “straight” throw, i.e. one that doesn’t curve off to one side. It’s not a wide path, and I may have actually drawn it wider than it really is. Now, curves are not bad, if you capture a Pokemon with a curve, you get more experience points. The problem is, it’s ridiculously easy to curve. Too easy, especially given the tendency to play PokeGo one handed.

Rattatas are pretty easy even then, because they’re so “close” that curves don’t really affect much. But something like a Zubat that you have to fling a ball into practically the next county to catch? Yeah, then the overly restrictive “straight” is not your friend. Nor is the amount of speed you need to fling a ball at a more distant Pokemon. The faster you drag your finger, the more likely it is to not be a perfectly straight drag.

So again, people with not great vision and especially people who have less than amazing fine motor control? Yeah, good luck on that. And it’s never been fixed or even improved. Niantic may not directly say “we only want perfectly-abled people playing”, but the design of the game; janky tap targets, the UI lying to you, the no margin for error Pokeball throwing all send that message loud and clear.

The worst part is, there’s no reason for the curves to behave that way, there’s a dedicated gesture for curves. Seriously, you put your finger or whatever digit you use on the ball and twirl it. After a few spins, you’re in curve mode, you even get little sparkles to show you that. The really odd thing is that this gesture is actually pretty-well thought out. You don’t have to spin it fast, you can spin in rather wide circles, the curve sets nicely to how much you spin, etc. It’s such a well-though-out option that I’m surprised it made it into the game or hasn’t been brutally nerfed to suck as much as the rest of the UI.

If you need accessibility consideration, this is not the game for you.

What To Do

None of this is unfixable.

  1. Stop machine-gunning the GPS and use Core Motion properly. Battery life will improve as will the playability of the game. Inertial Nav works really well, use it. The number of stupid annoyances this will fix are not small. No game designed around walking needs that many GPS fixes.
  2. Stop making this game completely non-functional without a network connection. It is not unreasonable to say, on game load, to cache everything within say an eighth of a mile of the phone. The game servers have all that data, this is not some impossible task. It won’t make the game usable at full capacity in a non-networked situation, but it will at least be usable. Then just update it periodically if the phone moves. It’s not like this game is small now. At least this way, some of that multi-hundred-megabyte code will make the game nicer to play.
  3. In a mobile environment, network connection transitions are real and common. Being unable to gracefully deal with this common thing is completely inexcusable.
  4. Stop. Lying. To. The. User. If a Pokestop is not usable, don’t make it look like it is. Fix the friggin’ tap interception code. Read up on axis collision avoidance and stop dropping multiple Pokemon in the same place. Don’t show Pokemon that aren’t “really” there.
  5. Make your game playable to more users. There is no reason a game like PokeGo can’t have better usability for all users, regardless of how able they are. Make the game better to play one handed. Accessibility isn’t just the right thing to do, it makes you money. (Estimated numbers. 1.3 million legally blind people. 400,000 with MS. 764,000 folks with Cerebral Palsy. 1 in every 7250 males between 5–24 years of age have some form of Muscular Dystrophy. There’s a lot of people y’all are excluding via bad design and play mechanics.)

Now, before it starts, none of this is “easy” in the “takes ten minutes” sense. It’s not even vaguely impossible, but it’s not easy either. Fortunately, it doesn’t have to be done all at once. The ocean doesn’t need to be boiled here. Fix this issue, then fix that issue and eventually, you’re running low on issues. Isn’t that the idea behind all this Agile joy?

I mean, I’m really sure the people coding PokeGo want people to enjoy playing the game, and more people playing period. Maybe it’s time Niantic actually focused on that.