Jiaaro

…on life, the universe, and everything

What Makes a Good Game?

Fun is number one. Gaming is entertainment. Not a lifestyle, not a subculture.

Call me a filthy casual if you want. But do it quick, I heard Destiny raised their level cap again. Or can you skip the grinding with an in-app purchase now?

My other values largely follow from that.

Story Telling

Do it well or don’t do it at all. Script, voice-acting, and themes will be evaluated against the best from hollywood.

Yes, games require exponentially more content, and that is hard. But that’s not my problem. The story doesn’t care that the medium is expansive. It can be done, I’ve seen it done.

But, not all games need story. If the game is great fun without story, then toss it. Tacking on a crap story will only hurt the game.

Difficulty

Should match the player’s ability. Where possible it should dynamically adjust. Challenges should be achievable but, you know, challenging. If it’s too easy it’s boring, if it’s too hard it’s disenchanting.

Grinding

If the grind is fun, then the grind is the game (and, I’d say, it’s unfair to call it grinding probably). If the grind is not fun, then it’s unforgivable.

For those who only care about the trajectory of the story, you should be able to continue through the game without grinding, but of course there has to be some reward for doing the grind. That’s a balance that must be achieved.

In Borderlands 2 you can grind for better gear and stats, but you can also just power through without worrying much about it on an easier difficulty setting. That design worked pretty well (along with many other complementary game elements).

Novelty, gimmicks

Novelty is worth something. I won’t dismiss a game because it has a gimmick. Novelty wears off though.

Franchises

I appreciate the value of a deep universe and lore, but each game must stand alone. I not going to watch every Star Trek movie ever made before seeing this year’s blockbuster, and I won’t play all of a games predecessors before I start on it either. I just won’t.

If the game is great I may play the predecessors afterward. There may be spoilers in the sequels. I understand the risks.

Prices

Truly free games make me suspicious - I need to know why someone invested that much effort for no financial reward.

Free-to-play games should be free-to-win. Without a level playing field we’re really just playing a game of “who’s willing to spend the most money on a false sense of superiority?”

But, really, one way or another, I want to pay for games.

If you like games (check), and you want games to keep being made (check!), then the people who make games need a reward for their effort (e.g., to get paid).

It doesn’t matter if you, specifically, pay for games. Because guess what? The game makers who get rewarded will be the ones who make games for the people who pay.

The more you (and people like you) spend on games, the more developers are going to make games for people like you.

That also applies to in-app purchases. Every dollar you spend in Farmville is a vote for more games like Farmville (whether that’s good is up to you!)

Execution beats ideas

Really. Execution above all else. This is not exclusive to games, but it’s just as true for games as for all other products.

A good idea badly executed is still a bad game. A bad idea executed terrifically can sometimes reveal the idea to be quite good. Some ideas really are bad. You need both.

Maintainable CSS (or CSS the good parts)

CSS is kind of terrible. Everything affects everything. It’s impossible to refactor. Code is spaghetti from day one. And selectors are used to identify elements in scripts as well as applying styles, not to mention the semantic meaning of html tags themselves.

So. Some proposals…

Element ID

Don’t use ID. Don’t use getElementByID(). Don’t use element IDs in your CSS selectors. Just don’t. ID has no benefit over classes for use in CSS or JavaScript.

There is virtually no case where you can be 100% certain that a style will only ever need to be used on one element in the whole page. Even if you were certain, a class would work just as well!

There is only one acceptable use for id: to enable deep-links to specific elements (with the scroll behavior that entails).

Tag selectors

Don’t use tag selectors in javascript. In CSS only use them to provide the most basic reset and baseline styles. Never mix tag selectors with class selectors.

One class selectors

No nesting. If you need more behaviors on an element, add another class. If you need only some of the behaviors of a parent class and you want to override others, your parent class is probably doing too much. Try giving it less responsibility, or if you really can’t – no way, no how – just define a new class.

Really consider giving the parent class less responsibilities though. If you have to think about the order of the rules in a style block, there are probably too many.

Good:

.my-class {  }

Not great (but sometimes necessary):

.my-container .my-class {  }

Bad (just create a third class):

.my-class.other-class {  }

Very Bad (fully engaged in the precedence war):

.container .sub-element a.special-link.active {  }

Use Naming conventions

You should be able to tell roughly what a class is for (and you’re only using classes right?) by the name. Establish – at a minimum – a convention for classes that control layout, text styles, and javascript hooks.

JavaScript should not use the same classes as css.

That would be mixing presentation with logic.

Use rem (root em) units

em units are kind of crap because if they are nested they compound. Still, it’s great to set the font-size on the body and have everything work from there. And, rems are well supported (IE 9+).

Use lots of CSS files

You should have one main css file which uses @import to bring in everything else it needs. Break up your css so that each logical unit is in it’s own file. Got a custom dropdown widget? super-dropdown.css. What about persistent navigation at the top of each page? header-navbar.css. Login form? login-form.css.

If you have less than 5 CSS files you’re probably doing it wrong. If you have exactly one CSS file you almost definitely are.

ok, ok, ok. I know what you’re thinking: “James, I’ve been doing lots of these ‘wrong’ things and it’s been working fine for me.”

You see, it seems that way at first. IDs, specific selectors, using a class for styles and javascript. These things seem useful and “clean”. Why use two classes when one will do? Because you will not be able to refactor your code. That’s why. And if you let it go on long enough you won’t even be able to change your code without a full round of manual testing.

Most CSS code being written today is technical debt from the moment it’s created. And it’s the worst kind of technical debt: the kind you don’t know you have.

A Path to Fluency

Learning a language is a Good Idea. It makes you smarter, more creative, and empathetic, and more likely to recover from a stroke. Thinking it’s good idea doesn’t make it easy. The payoff is too far off, too abstract.

Recently though, I’ve been making some headway after giving up lots of times in the past. Some observations:

Learning a language because it’ll be “useful” probably won’t work out.
If you haven’t encountered any Chinese in the last 20 years, odds are you won’t in the next 20 years either. Any language is worth knowing, but, like exercise, most people run out of motivation before reaching their goals.

My advice? Pick one you have a personal reason for. I have Spanish-speaking family (including my wife), Mexico is right next door, and there’s Spanish language TV here in New York.

Duolingo is amazing.
If you’re not using Duolingo, you’re missing out.

Entertainment: You can trick yourself into learning.
Spanish tech news on twitter and RSS make it easier to practice every day without it feeling like work. I also picked up some translated graphic novels. Comics, graphic novels, and manga make it much easier to get the gist of the story without struggling too much. There are also “side-by-side” readers which have the same text in two langauges – English on the left, Spanish on the right.

Be careful of things that are too difficult for you. Feeling like you’re in over your head makes it hard to stay focused and it’s demoralizing.

TV and Movies are a siren song.
At least early on; I’m still not able to keep up. They seem like a great way to practice, but the pace is too fast and there are a lot of idioms.

Traditional methods don’t work (for me).
Stuff like Rosetta Stone, “Learn Spanish” books, podcasts, etc bore me to death. Motivation is as important as the information and exercises. You definitely won’t learn the language if you quit. And “I’ll know Spanish if I do this hard-ass work,” is not enough on it’s own.

Honestly, I don’t know how anyone learns language that way. ¯_(ツ)_/¯

Visiting Mexico was a huge motivator.
Really. Nothing makes me want grind through Spanish lessons like being surrounded by native speakers.

You can fly to Cancun for just over $150 each way on Jet Blue:

JFK to CUN for $315

…and rent a lovely place in Puerto Morelos for $220/mo (4000 pesos):

Puerto Morelos Apartment for $220/mo

note: I haven’t done that, I just took that photo of the apartment listing when I was in Cancun a few years ago.

That’s all I’ve got for now. Wish me luck!

Blocking Content Blocking

I can’t help but chuckle about all the hand-wringing over content blockers in iOS 9. Ad blockers have existed for some time. Not many people use them (as a percentage of overall web users). Plus, native advertising is mostly immune to content blocking anyway, and that’s where a lot (most?) of the money was going to end up anyway.

That’s old news. My favorite part is: it’s really not that hard to make nearly unblockable ads. If the publishers and ad networks worked together they could mostly nullify the effects of ad blockers in lots of ways.

  1. They could insert the ads server-side in a way indistinguishable from content. Then load the ad network’s javascript purely to mark the ads as “sponsored content” and handle tracking. This would make it so that people using ad-blockers would have more trouble telling where the ads are, but everyone would see the ads.

  2. Ad networks could build CDN-like infrastructure and insert their ads in pre-specified parts of the page (like how Vagrant builds pages). This approach lets everything come down from one domain but takes care of publisher accountability (publishers can’t screw the ad network).

    Alternatively, an actual CDN (like CloudFront) could provide hooks for publishers and Ad networks (again, like Vagrant) to insert ads into pages within the same domain, and do impression/click tracking on the same domain as well. This variant solves some of the incentive issues (publishers don’t have to trust the ad networks either) by moving trust on a third-party (the CDN). I prefer this variant in terms of incentives, but it requires more coordination, so it might be harder for a CDN to succeed in the marketplace with this approach.

  3. Ads can be sold on an average-traffic or pay-per-click basis (i.e. the Deck), but without any 3rd party javascript. The markup inserted by publishers is just a clickable hot linked image, and the ad is rotated by just changing the image served at that url, and changing the destination of the link’s redirect. Publishers would just have to insert a unix timestamp in the querystring of the image and link to invalidate caches, deal with fast ad rotations, and all sorts of other issues. This method is relatively blockable, but easily pairs with a CDN-like approach.

    What I like about this is the simplicity, and the fact that it represents a line in the sand. You can easily say, ads served as third-party images are OK, but not ads served as 3rd party javascript or 3rd party iframes.

Anyway, there are lots of details around all these approaches that would have to be worked out. And plenty of pros and cons of each one as well (for all parties involved, consumers, advertisers, publishers, and ad networks. And CDNs should they choose to get in the middle of all this.)

The Shortest Apple Watch Review

If you’re into two or more of these (or really into one), you should check out the Apple Watch:

  1. Personal fitness
  2. Watches
  3. Apple products

That’s it. Review complete.

It’s an interesting product - I still need time to form a more nuanced opinion.

One thing I will say though: the Sport is nice. It’s as nice and well built as the iPhone 6.

Don’t feel like you need to buy the Steel version unless the look and feel of the steel itself is what you’re interested in. Especially if fitness tracking is an attractor for you; the Ion-X glass on the Sport is more resilient to impact than the Sapphire screen of the Steel and Gold versions (the glass scratches more easily, but who cares about scratches if you shatter the sapphire screen playing sports).