[ Content | Sidebar ]

gdc 2011: monday

February 28th, 2011

This year, unlike previous years, I’m taking notes in my iPad instead of in my notebook. That means that I can generally read my notes, which is good; but it also increases my tendency to just write down slides with minimal commentary, editing, or even formatting. (And I’m sure that amusing iPad autocorrects will slip through, too.) So I apologize in advance for such infodumps: I wish I had time to do a better job, but if I let these posts pile up, I’ll be pretty unhappy.

In retrospect, it was kind of amazing how many talks I went to today: two sessions were really three separate talks each, so that adds up to 11 talks! Wow.

10:00am–11:00am: “Creating Your Building Blocks: Modular Component AI Systems”, by Brett Laming, Joel McGinnis, and Alex Champandard

This talk (or at least its first third) was my surprise favorite for the day: I’m pretty sure there’s a lot of object-oriented wisdom here, if I understood what was going on better. Anybody have recommended books on the approach presented here?

It was really three talks in one; the first, by Brett Laming on “Component Systems Revisited”, presented the basic foundation.

He started off with problematic approaches:

  • The class hierarchy Ogre : Monster is simply wrong.
  • Next, he presented a complex inheritance diagram with multiple inheritance, including a diamond. Worse, you run into situations where you have existing classes A and B where A derives from B, but you want A’s behavior but not B’s. So “deep class” is a problem.
  • Next, you push common functionality up, leading to a “fat class”.
  • Or you use aggregation to get plugins; lots of indirection, though.
  • A data driven approach comes next, but it’s hard to debug.

There are seeds of good ideas in all of these, but you need to know what to pick and choose from them. The metaphor that he suggests is that of a “component”, e.g. as on a circuit board: it gives a broad classification (diode, resistor, capacitor, …), with key properties (that aren’t visible in the class hierarchy!), with defined inputs and outputs, that are interchangeable.

He also added a note on reusable AI: its outputs feed to the gameplay, its inputs come from the gameplay world. And disciplined gameplay is naturally linked to good organization, purposeful data, and sensible lifetimes.

The body of his talk was on five aspects of a component architecture. The first was inheritance:

  • Classify where necessary, to define key slots. (Surprising mention of RTTI, e.g. for sorting.)
  • Name: RTTI Factory creation; ability to serialize.
  • Combined: Data driven approach, with a shallow hierarchy.

This discussion of run-time type surprised me, because I generally see it as a smell. But he was pretty emphatic about its virtues: he called RTTI “as important a tool as a smart pointer or a weak reference”! I think naming is one key route into what he’s thinking: he wants to be able to serialize and deserialize objects in a very flexible manner, to increase the power of tools at game designers’ disposal, and sees RTTI as a key part to that. (But I don’t think that’s the only thing going on.) He also gave examples of macros to help with RTTI (as opposed to leaning solely on what C++ provides), which also makes it more efficient.

The next aspect was structure:

  • Spatial: reference frame, world transform
  • Functional: composition and aggregation
  • Dependency tracking: conflict resolution, job ordering

The third aspect was data flow:

  • Data flow: world state -> AI -> gameplay -> world state
  • Changes to structure: messages upstream/downstream
  • Changes to properties: signaling downstream/upstream, message for spatial barriers

The fourth was compartmentalization:

  • Smart objects, reconstructable via RTTI
  • This is nearly free, given good structure
  • External instructions: AI, animation, etc., carried by signaling

And finally, parallelization:

  • The ideal is still a way off
  • But AI/gameplay still parallelizes, even in game graphs! (Mention of indirection, aliasing)
  • Candidates for parallelization: Leaf output: animation, navigation, component update. Leaf input: sensory info, blackboards, ray tests

He ended with some design tricks:

  • Remove temptation: minimal data (if per frame, put it on the stack), minimal lifetime (use new/delete boundary, object pools)
  • Favor derivation: no equation contradiction, no duplicate data
  • Potential deep class problem: generalize
  • Locality of reference: abstraction+composition, placement new, embedded lists, object pools
  • Minimize NULL checks: use Null Objects instead when necessary
  • Non-virtual pathways: use RTTI filtering
  • Many virtual pointers: package once and carry downstream

And his conclusion:

  • Gameplay gives us fun buttons to press: tight gameplay leads to good, reusable AI
  • Think: minimal classes, data lifetime, locality of reference
  • Use: generalization, RTTI, placement new/delete, object pools

Next, Joel McGinnis on “AI Design Patterns”.

The pressures you’re under are: resources (compute cycles, memory), and design specificity (or lack thereof…). Component architectures give you flexibility, and allow performance balancing. He warned that it’s not a blueprint, though: you still need to architect, so it’s not a solution, but a framework for how things can get built.

One antipattern he mentioned was putting data on AI component. Instead, think about the data that the AI component needs to consume: focal point, targetable object, cover markup, interaction point, trigger volume… Granularity is great with component architectures, gives lots of flexibility.

Pattern: Component Matrix

Entities, behavior tree, pathfinding, targeting system, animation, standard movement. Makes it easy to substitute parts out: e.g. if going from lithe enemy to hulking enemy, prototype by swapping out pathfinding component. Lets you answer design questions with minimal investment.

Pattern: Find Via Registration

E.g. target selection looks for targetable objects; both halves register with the targeting system, so you don’t need to search all objects in the world. Reduces the search space by scoping, simplifies construction of behavior, easily done via lifecycle management.

Pattern: Late Construction of Types

Lets you change your minds late in the game, do load balancing: try it everywhere, keep it where most effective. Requires things to be light weight, and data driven helps

And the third talk was Alex Champandard on “Performance and Multi-Threading”.

His talk used influence maps as an example component. How do you make it high performance? You want to use vectorization: SIMD instructions give a 4x performance boost. Then parallelization might give another 4x performance boost.

The solution is to build your build your engine as modularly as your entities. And use the same breakdown in both cases.

He gave an entity example. Then he talked about the system, which does: batching and prioritization. Don’t process individual requests, instead schedule jobs. Custom allocation by jobs to allow interleaving, SIMD. (C.f. the mention of placement new in Brett Laming’s talk.)

Summary: very lightweight, simple interface, handles events, data-driven. Pay attention to memory allocation, computation limits, batching, prioritization. This leads to jobs that are computationally intense and support parallelization.

11:15am–11:40am: “Ethics for Developers”, by Miguel Sicart

His question: what kind of ethical knowledge do future game developers need to know? But first, definitions:

  • Morality: a public system, governs behavior towards overs and how to avoid harm.   A system of rules, and principles for evaluating those rules; principles stem from ethics.
  • Ethics: the philosophical study of morality. Framework for analysis of moral issues via a coherent, philosophically argued scheme. Provides evaluative standards for development of principles/morals, not only to avoid harm but also to help human flourishing.

There are moral issues of: profession, art form/medium, games in society, and play. We need guidelines. And his outline of a method for acting ethically was: Identify potential moral issues.  Analyze and contextualize them. Deliberate about them, applying ethical theories.

He then talked about four ethical theories, linking each with a problem.

The first theory was consequence-based ethics: decisions should be taken based on consequences. Evaluate based on most desirable outcome for society. This is either act-utilitarianism or rule-utilitarianism.

Data mining and profiling raise moral concerns, especially profiling. Utilitarianism suggests: informed profiling is good as long as most players feel it as not harmful.

His second theory was duty-based ethics: centered on obligations towards others, trying to pursue happiness without harming others. The golden rule.

Duty applies to software and hardware dev: duty of developers to players (which is different from consumers!). Software must allow for play (anti-piracy software problems); some games (e.g. educational) need to be played on legacy platforms.

His third theory was contract-based ethics: contracts between individuals that form society. Often used in the case of right-based issues.

Community management shows how you can use this: a game is not just an entertainment product, but also an implicit contract between developer and players. Developers should understand that the way their communities are managed should allow for ethical reflection.

And his fourth theory was character-based ethics: instead of rules, consequences, contracts, we should focus on being good. Development of virtues and good characteristics leads to general morally good behavior, even in unexpected/new cases.

This helps inform our understanding of player behavior: it’s done within spaced created by developers. Developers should think about good virtues of good players, and create appropriate affordances in the design.

One approach towards ethical issues is via professional codes: these give guidelines for solving issues. If an issue affects the profession, professional codes should help. E.g. crunch, bad management, sexism. Do we need a professional code for game developers?

(Time ran out here.)

11:50am–12:15pm: “Game Design by Accidents”, by Steph Thirion

His basic thesis here is that coding is an idea generator: seeing how code behaves is a great way to confront yourself with surprising realities.

Exhibit A: A programmer making a game based on pentominoes, in order to explore a new computer. No graphics, text-based. He’d just implemented bit where pressing key rotates the piece, and spent a while playing with it: this real-time component is surprisingly powerful, opens up a new world.

He simplifies pieces, adds gravity, leads to Tetris. But: when he started programming it, he didn’t even have the idea yet!

Exhibit B: Jonathan Blow talking about how billiards would change if you could see the future. He did prototype, felt weird seeing it unfold, how the balls ended up where they were supposed to. He didn’t figure out how to make a game out of it, but it sparked ideas that led to Braid.

Exhibit C: A Game Mod workshop for graphic design students with no coding experience. He started by giving them a Breakout clone with no void at the bottom (so balls never went away), implemented in a relatively friendly language called Processing.

He told students to download Processing and the code, to change it, and to make something awesome in six hours. He then showed a video of students’ results, which I thought was really impressive.

Exhibit D: He talked about his background: started as graphic designer, evolved into coder, where in his game Eliss almost everything is produced by code rather than static images.

The takeaways:

  • Code makes you stumble into ideas.
  • Coding is: complex; precise; unpredictable.
  • Code is already there: if you discover something while coding, it’s working right in front of your eyes!
  • Simplicity first: you can feel the complexity of code, so it encourages you to keep things simple.

Finally, he ended with a live example using Ruby-Processing. Starts with static circle, adds random movement. Leaves trail, which is kind of interesting; then redraws background to remove trail. Makes background white, circle black.

Then does same thing with 100 circles at once: starts as growing blob, then individual circles emerge from it.  Plays with size of circles: makes them small, more like particles. Large, makes everything a big blob. Random starting position, turns whole screen back, but then puts in outline. Then fills them with alpha, leads to smoggy cloud.

I really liked this example: at several points I was really surprised at shapes and behavior that emerged from such simple changes.

Lunch

I had a very nice chat with Ben Abraham, Jorge Albor, and Brendan Keogh.

1:45pm–2:45pm: “Click Zen: Zynga’s Evolution from FarmVille to CityVille, by Mark Skaggs

Impossible 1.0: Red Alert 2: made by a team with no RTS experience, made it in 9 months.

Leading up to FarmVille: Zynga was “small”, Mafia Wars was the big dog. His team was trying to make a medieval RTS game, but was stuck in design limbo. Bing Gordon: “Wy don’t you just make a farm game?” Decided to take a small team and go for it.

Fast, light, and right. Single strong voice, passionate team, mission. 5 minute design: if you can’t figure out how to make something more fun, just go with the obvious solution. Only design screens and flows: what the player sees and does. Help from organization: took YoVille avatars, borrowed people.

Decision time: Zynga hardware or Amazon cloud? Zynga’s center ran out of space and power; would have had to wait 6 weeks for more servers, so went to Amazon, which turned out to be crucial for rapid scaling.

Minimal art content for shipping. RTS interface to remove friction, set context sensitive cursor, add queuing.

True Minimum Viable Product: no monetization, almost no metrics at launch! Not at parity feature-wise with other farm games, but a better user experience.

Team goal: 400k DAUs by June 30: 11 days after launch. SVP Biz Dev: if you hit 1M DAUs in 30 days, we’ll take you to the French Laundry. CFO: if you do it in 11 days, we’ll send you all to Paris! They hit it in 5 days; they got the dinner, but not the trip…

That’s Impossible 2.0: people kept thinking growth would stall at various points, it didn’t. Thank goodness that they were on the cloud. But still: had to watch the servers, had to scale the team.

Also unusual: keep the brand pure. Would Disney put this in Finding Nemo? Target audience is moms; don’t want anything in there that moms wouldn’t like; this led to tension with Mafia Wars ads.

One surprise: everything is much harder after launch.

Leading up to CityVille: Zynga was much bigger, they’d had another six games under their belt. FarmVille was still the biggest; Facebook had changed what was allowed, players’ expectations had changed, Zynga’s best practices had changed.

So: what’s Impossible 3.0? The wisdom at the time: FarmVille was a once in a lifetime success, Facebook policies mean you’ll never pass 10M DAUs, their internal model showed a city sim stopping at 5M. Lots of questions: gameplay style, who should develop it (send to their Austin studio?), full featured versus Minimum Viable Product. They spent too much time in paper design which led to imagining problems that might not materialize, so they switched to producing prototypes.

They set a date, locked in art style and rules. Lessons and features from FrontierVille: quests, stories, doobers (loot drops). Converged in Aug/Sep: narrowed scope, get real about date, push for quality. Still, story was missing, and fun wasn’t quite there.

Key mile markers:

  • Aug/Sep: team gels
  • Sep: game playable, but not fun
  • Late Sep: first bits of fun emerge
  • Oct/Nov: team plays the game
  • Nov: hold for quality, public announcements. Was supposed to be launch date, but game wasn’t good enough. Very different approach compared to FarmVille launch.

Proactive launch steps: lined up external teams to help with live services. Quality high: easier to fix bugs before launch. Feature roadmap. Was smooth compared to other Zynga launches.

They reached 8M DAUs in 2 weeks, 14M in 30 days, over 20M now.

What turned out well: Social: people’s faces, franchising your business. Game loop: right balance of simple sim. Quests.

Could be better: Trains are only kind of cool. Simpler interface for franchises. Expansions were too easy to get. Longer runway on the simulation. More surprises and easter eggs.

Could be better in the process: Didn’t have single strong voice with clear vision. Bigger product, hence more test and integration time. Maybe should have done Minimum Viable Product; not at all clear, though. No scaling plan. No features in the back product, ready for quick deployment after launch.

Meta lessons for social game developers: It’s entertainment: good looking, fun art, fun core gameplay loop. You’re building a product, a team, a 24/7 business, a platform. The battle is won before the launch, fix bugs then. Learn the space, know key features/recipes, know the audience. Speed wins: get to market quickly, and it’s a web experience, so performance matters. Deliver fun: “you can’t make up for boring with volume”.

3:00pm–3:25pm: “Leave Enough Room: Design that Supports Player Expression”, by Randy Smith

He started off with pictures from Fallout 3 that involved posing large numbers of teddy bears.

Is player expression for you? (I.e. indies, this was part of the indie games track.) Yes: indie attainable, indie appropriate, for the good of the art form.

How? Don’t have a string of pearls guiding users down a specific route. Don’t include single solution puzzles. Then a Scrabble example: the game looks expressive, but to do well you need to use words that never get used in real life and that don’t say annoying you’d want to express. So: scoring can harm expressiveness.

Example from in-progress Tiger Style game: need to grow biomass to progress. But: all lifeforms contribute biomass, not much is needed to progress. So: tell the player “just play the game”, but there’s also depth on demand.

Also, units have multiple functions: can be enemies or allies depending on the context, depending on what you’re trying to accomplish at the time.

Empower the user to generate data; I didn’t quite catch the example here.

Finally, let the user use the generated data. (E.g. players sharing screenshots of avatars / levels.) Achievements also help acknowledge what the player is trying to do. Stats can do that, too: largest web, longest jump, not just a single score. (In particular, these stats in Spider never block your progress, they’re depth on demand.)

3:35pm–4:00pm: “Turning Depression into Inspiration”, by Michael Todd

Indie developers work at a job that can cause stress, overwork, being unhealthy, being poor, being lonely. And there are also potential personal causes of depression. So: some indie devs are depressed! Not always easily solvable, so need techniques for developing while depressed.

Being unproductive and being depressed reinforce each other. Or: if you can be productive, this gives control over our work, our lives. So, ways to increase productivity.

1) Work on rewarding projects

These are good to build. Get to the gameplay, don’t get bogged down. But be careful: don’t front load the fun stuff to the extent that there’s only slog left over. Instead, make as much of the project be reward as possible!

Complete vs. progressive gameplay. Progressive is semi-playable almost at once; a complete game needs almost all the systems before its playable. Lean towards the latter.

Awesome/crazy ideas are more rewarding, easier to keep the faith.

And: design for yourself. Keeps up day to day interest.

2) Try to stop being a perfectionist.

Don’t overthink everything. Get other people to play the game. Skype somebody else to tell them about the flaw you’re worrying about, they tell you you’re worrying too much. Play lots of games (Steam, XBLIG, demos.)

3) Shorter projects

That way you spend more of your building time in the phase where you’re excited about the game. So: small bad is no good, want small awesome!

4) Measure your hours

Otherwise, you’ll work less and less when depressed.

5) Design the game to suit your abilities

What do you love? What do you hate? Use the resources that are available to you. The trick is understanding what you have.

Finally: how does being depressed change how you work?

A game is a thousand tiny choices. These are affected by your mood, your priorities. The distinct choices of a personality can be an advantage; bad experiences can be a particular advantage. (Artists in love are boring, ones that have gotten screwed over in love aren’t.) And depression is an experience.

4:15pm–5:15pm: “From AAA to Indie: Three Start-Up Stories”, by Jake Kazdal, Daniel Cook, and Ichiro Lambe

Another three-speaker talk. First was Jake Kazdal: “From AAA to aaa”. I mostly napped during this.

Next, Daniel Cook: “Spry Fox, Year One: Lessons Learned”

A portfolio approach is key. Great games are not enough: have to hit right platform at right time with right theme. Portfolio model helps reduce that risk.

Flash portals are so used to taking games essentially for free that they don’t understand your asking for money. Very few portals that respect the needs of developers at all. They also don’t understand payment systems, microtransactions. Most important: bring people off of portal back to your website.

Too many designers are like too many cooks. His teams converge on the fun so much faster now that there’s a single creative director for a project.

Teams should aspire to iterate daily. A week is bad; two week iterations and your design may never converge.

Building meaningful hobbies is hard, but worth it. Want people to be playing ten years from now. Tend to be multiplayer, tend to be a service, tend to monetize well, tend to build relationships. But really, really hard to build. And game developers don’t traditionally have those skills, that’s why web developers are doing better in the social game space.

When hiring people, make them do a real project: that lets you see if they can finish. Great teammate: reliable, able to see big picture, works well with others, respects the game designer.

Missing from list: willing to work long hours. (Crunch is wrong.) Passion isn’t enough, and can mean obstinate. And no need for people to be located in North America.

Finally, Ichiro Lambe; I didn’t catch the name of his talk.

Think holistically. Conventional wisdom: wear many hats. True, but the mistake is thinking of things as separate problems, instead weave them together. (E.g. marketing + bug support.)

Tie marketing into design. Conventional view: marketing = getting people to buy crap they don’t want. Instead, create a game that people give hard-earned money for it, and that is remarkable! Make a game that’s both a game you want to make and a game that people want to buy. So: create a game that we’re excited about, and that will sell for stated reasons.

He ended with a bit on postmortems / retrospectives.

underscores and precedence in scala

February 27th, 2011

At work recently, I was writing some code which wanted to add all the elements of a collection of strings to a document writer. This seemed like a classic case for foreach, so I wrote something like this:

data.foreach(s => writer.addDocument(createDocument s))

(Warning: I’m typing this from memory, without trying it out in the Scala CLI, and I’m new enough to Scala that it’s entirely possible that I’m making silly syntax errors.) That was great, but Scala lets you use underscores in place of explicit argument names for arguments that you’re only going to use once, so I tried doing this instead:

data.foreach(writer.addDocument(createDocument _))

That, however, didn’t work. After looking at the error message and talking to some coworkers, it seemed like Scala was parsing it as the following:

data.foreach(writer.addDocument(s => createDocument s))

And there isn’t a version of addDocument that takes a function argument. Which is good: if there had been, it might have compiled but not done what I wanted, which would have been even more confusing! Still, I was frustrated: why can’t Scala just read my mind? But, honestly, the compiler’s choice was a perfectly reasonable way to parse that expression, and I certainly wouldn’t want Scala’s parsing to be dependent on the types that function calls accept. So I was willing to leave it at that.

Except that, as one of my coworkers then pointed out, there was another way of breaking it down: instead of writing as a single foreach call, I would write it as map plus foreach, as follows:

data.map(createDocument).foreach(writer.addDocument)

Which is much nicer! So, actually, Scala’s parse error was gently nudging me in the correct direction: yes, this sort of thing is potentially ambiguous to parse, but if you break down your function composition properly, then that ambiguity goes away. So it was nice of the compiler to help me write my code elegantly!

The funny thing was, I ran into a very similar situation an hour later: it involved two maps plus a foreach, but the exact same principle applied. That time, though, after writing it out as a chain of three collection functions, I didn’t really like the result: it was going too far into the details of how to use a library that I was integrating with, and I didn’t find the result particularly evocative. So I ended up going back to the single-foreach version, but this time I pulled out the function that I was applying to a member function, so I could give it a name that explained what was going on. It’s nice to have different tools in your toolkit, because ultimately you need to be guided by what makes your code the most expressive rather than falling in love with the most powerful tool.

my gdc 2011 schedule

February 26th, 2011

For all you stalkers out there, here’s my best guess at my GDC 2011 schedule. And clearly I should bring snacks, it’s not at all clear that I’ll be able to eat lunch on Wednesday, Thursday, or Friday… Please say hi if you’re there and run into me!

Monday

Tuesday

Wednesday

Thursday

Friday

game blogging and description

February 23rd, 2011

Ben’s latest post starts with a lament on the lack of blogging about multiplayer games (which I agree with; I hope Ashelia resurrects Hellmode soon, she had some great posts on multiplayer gaming), and then continues with

(competitive) multiplayer gaming has been hard to talk about unless you are something akin to a top-tier player. But that may only be the case if you are trying to add an explanation of things – anyone should be able to attempt a complete description of a multiplayer game regardless of their skill. The compulsion to explain so exemplarily embodied by the critical essay and its relentless push towards the ‘conclusion’ is a habit from the English department that we perhaps aught to consider jettisoning alongside the Comp. Science faculty’s reliance on ‘concreteness, definitiveness and finitude’, as I put it in Rhetorical Questions.

Latour’s approach, which I am hoping to make my approach, will be to stick to description. Description that will come, mind you, from a very specific and embodied perspective – that is, from my own. In this way we get to hold onto the best of the Sciences reliance on ‘facts’ and ‘objects’ and concrete things while maintaining our commitment to relativism, rhetorical persuasion and… beauty, I think.

(Emphasis and ellipsis in the original.)

Which rather struck me, because I’ve been doing a variant of this on my new blog, and I’ve been surprised at how that’s turned out. I’ve been really enjoying it, at least a few people have been enjoying reading it; but it’s also served as a source of raw material, and while the effects of that have been hidden so far, I hope it will start showing up here fairly soon. I’ve been doing descriptive writing in a matter that’s quite different from what Ben’s describing (in particular, not going into nearly as much detail about the actual games involved), so we may end up going in quite different directions, but right now it seems possible to me that we’re uncovering similar issues in our own ways.

I continue to be surprised by the variety of productive niches that online writing provides. First, I blogged (well, first I wrote static web pages, but never mind that); then I joined twitter. Then Tumblr, and Facebook; I’ve never really gotten into the latter as a publishing platform, but it has its virtues, and the ‘like’ button is a real advance. I also haven’t really gotten into Wave or Buzz, but they also have their virtues, even though I choose not to explore them. And then there’s Formspring, Quora, the list goes on. Not only do all these platforms have their own distinctive strengths, but they’re also all broad enough to support multiple usage styles. (E.g. I use Tumblr as a linkblog, many people use it for personal pictures, many people use it for short paragraphs of personal experience, and then there’s the whole reblogging thing.)

And if descriptive game writing is another one of those niches, great: blogs as research notebooks.

a few early scala notes

February 20th, 2011

I haven’t started programming Scala in earnest yet, though I’ve been going through some books and typed a bit into the interpreter. (Whee, JVM startup times.) I had the Odersky book recommended to me, but I actually first read the PragProg book: I’ve had good luck with some of their books recently, it’s quite a bit shorter, and there is a tradition of excellent short introductions to programming languages in the field. I won’t exactly say I regret that choice, but the PragProg book isn’t anything special; I’m only 85 pages into the Odersky book, but I’m enjoying it quite a bit more.

A few things that amuse me so far, as a C++ fan:

Yet another book which has to explain that a variable being immutable doesn’t mean that the object it’s pointing to is immutable (just that you can’t reassign the variable to point to something else), and that there’s in fact no way to create immutable objects (assuming that the class allows mutation at all, of course). Is C++ really the only language that has a reasonable story about this?

Admittedly, C++’s story is far from perfect as well: all you have to do is hold a member variable via a pointer and then it’s up to the class implementor to declare const methods honestly, the compiler won’t have your back for you in that case. And that also points at C++’s main advantage in this area, that you can have variables that aren’t held via pointers: maybe without that, automatically enforcing constness is impossible, and without that there’s no benefit in letting class implementers declare which methods are const? I’ll have to think about that one; still, it’s certainly not an area that I would have thought C++ would be relatively unique in when I first ran into the language.

And after reading so many complaints about how you can’t tell what “a + b” means in C++ code, it’s great to see another language that unabashedly embraces operator overloading. And having operators that end in a colon be magically reversed to be methods of the object on their right is simply brilliant: not only does it naturally handle the cons case of

1 :: List(2,3)

but having /: be an alias for foldLeft is just brilliant: I think writing

(0 /: list) { _ + _ }

to sum the elements of list is super natural, much more so than a syntax with 0 and list reversed would be. (Think of it as smooshing down list starting with 0 at the front and with the function argument telling you how to do the smooshing.)

So yeah, Scala and I are going to get along just fine, I think.

job search and narrative

February 18th, 2011

Beginnings

As soon as Disney’s acquisition of Playdom closed, e-mails from recruiters started appearing regularly in my inbox. Most of them I essentially ignored: I’d been having a great time at Playdom, and while I didn’t expect to stay there for the six years that I’d stayed in my previous job, I certainly wasn’t planning to leave after just over a year. So I sent polite notes back to the recruiters saying that I wasn’t interested, and promptly forgot about them.

Eventually, though, one of those e-mails snuck through my defenses. It was from a startup that I had vague warm feelings about, enough so that I clicked through to their job ads; and, when I did so, I found that they used both Ruby on Rails and Scala. These are two technologies that I’m quite interested in, and that I wasn’t likely to get to play around with at Playdom; also, at that point I was in a bit of a rut at my current role at Playdom. So I responded to that e-mail in a more positive fashion.

That was the first chink in my armor; a little while after that, I got an e-mail from an industry recruiter whom I’d noticed appearing on my twitter followers list a week or two before. So, out of curiosity (or perhaps vanity), I responded to her as well.

This was the middle of December, so it was close enough to Christmas break that not much happened with those conversations for the rest of the year. But the conversations had planted a seed in my brain, enough to shift my mental story so that, when relatives asked me over Christmas how work was going, my answer was “fine, but I’ve been a little bored recently”.

Changing Stories

In retrospect, that was the key turning point. Before, the dominant stories playing in my head were all strongly in favor of my being at Playdom: the story about being in the games industry, the story about how Playdom was on the right side of an Innovator’s Dilemma market shift, the story of being part of a startup destined for great things, the story of learning new technologies. The first two stories were holding up fine; but Playdom wasn’t a startup anymore (and I was a late enough hire that I didn’t have much of a financial incentive to stick around waiting for options to vest), and there weren’t any technologies on the horizon at Playdom that I was actively excited about, so the third and fourth stories were losing their power. And we hadn’t had meetings within Playdom for a while that were reinforcing those stories or generating new stories to replace them. (Playdom had an all-hands meeting in early February that excited me an a couple of ways; if that had happened in December, maybe I never would have responded to that earlier e-mail.)

This meant that my brain had a narrative gap that it wanted to fill. And, right at that moment, the best new stories were coming from seeds planted by recruiters: maybe I wanted to be at a startup again, maybe I wanted to explore Ruby or functional programming. The very act of talking to recruiters and companies gave this a boost: such conversations inevitably turn fairly soon to the question of what you’re interested in, so unless you want to sabotage your chances immediately, you’ll come up with an answer expressing a story leading away from your current company and towards whomever you’re talking to. Yes, you’re doing that because of your audience; still, telling them those stories has a cumulative effect, and if you spin enough such stories, they’ll combine to lead you in a different direction.

Crafting a New Story

But that travel is more haphazard than I’d like. And potentially dangerous: if other people are driving the conversations and leading the stories, they’re not particularly likely to go in directions that will turn out well for me. So that suggested two courses of action:

  1. I should think hard about what I wanted.
  2. I should talk to as many people as I could manage, to maximize options and prevent any single external story from having undue influence.

The outcome of the first course of action was:

  • I wanted to explore different technologies, Ruby and functional programming languages in particular.
  • I wanted to be some place that was into the technical side of agile, that focused more on craftsmanship.
  • I wanted to be at a startup again, and a smaller one: I’d tried 50-person and 100+-person startups, I’d tried large companies, and it seemed time to head down to the 25-person range.

None of which I was likely to get at Playdom. Now, I like playing and thinking about games, which meant that I liked being in the games industry; but I like thinking about programming, too, and about everything entailed in the art of creating software. And when it comes down to which of those two I’d most be able to make a rewarding career out of, I don’t think there’s much comparison: I’ll do better (both personally and financially) if I follow my nose as a programmer. So it wasn’t crazy to think that I’d gotten most of what I was going to get technically out of Playdom, and move on.

And the outcome of the second question was that I should cast my net more broadly: in particular, I talked to a couple of recruiters that had helped me land with Playdom originally. One of whom was at a different firm, so now I was talking to three recruiting firms plus a handful of companies that I’d met through other means, mostly LinkedIn e-mails that they’d sent.

Going for a Ride

Let me tell you: those recruiters did not mess around. They all did a very good job, and I’d happily work with all of them again: they’d come up with a first pass of ten or so companies that seemed to them to be plausible fits, I’d look at them and agree that all of them were plausible but pick out a few that particularly caught my eye for some reason, and they’d both set up conversations with those few and use that information to come up with further excellent suggestions.

The upshot of this was that I was spending a lot of time on the phone talking to various companies, and some amount of time (mercifully mostly on evenings or holidays) interviewing in person. (It was quite lucky that it was good weather, because I spent a lot of lunch breaks sitting in a nearby park and talking.) And it was nice to feel wanted!

But also a little disconcerting. I’d like to pretend that I’m so super-awesome that anybody would love to hire me; the truth is, though, that while I’m fairly sure I do have several good attributes, there’s also quite a bit of luck involved. I know several other people whom I have a lot of respect for who have had more protracted job searches recently; I’m not about to chalk that up to some sort of essential difference, it means instead that right now I’m in a situation where people are happy to work with me to spin stories where I sound good. So I need to understand what’s going on there, and see how to best take advantage of it and set myself up in the future.

I wasn’t consciously thinking about this during the job search, but I turned 40 last Tuesday. I’m in an industry that, to some extent, overvalues youth; so far I haven’t had any problems with that, but it’s an example of how future job searches could be a lot more prolonged and a lot less fun than this one was. Which helped confirm my feeling that now was the right time to leave Playdom: from a strictly mercenary point of view, it’s almost certainly going to be the case that I have a significantly higher expected value from playing up the story of “being part of a company that has sold for a good amount recently in a high-profile industry” than from the Disney stock options that I’d be giving up by changing jobs.

Ambition

The upshot of this was that I decided that I needed to change the story that I was telling myself and others still more, and to do so by increasing its ambition. Following the nose of technologies that I’m interested in but not yet fully fluent in remained important (both for personal fulfillment reasons and for setting myself up for further growth), but I didn’t want to go too far in that direction at the expense of underplaying everything that I’ve learned over the last decade.

Also, I ended up prioritizing functional programming languages over Ruby: Ruby’s been around enough that I’m definitely playing catchup there compared to a lot of other programmers, whereas I’m hearing a surprising amount of buzz about Scala while not yet getting the feel that there’s a huge amount of existing expertise in the language. (And I’m quite confident that my brain will do well at turning me into a very good Scala programmer: it’s good at that sort of thing.) I’m pretty optimistic that going in that direction will open up a lot of interesting doors a few years from now, positioning me well on the adoption curve.

In terms of company size, I should go still smaller: coming into a 25-person company would be interesting, but even then you’ve missed a lot of the early decisions. I didn’t quite want to be a co-founder or first hire, but being in the 10-15 person range seemed like it would be a plausible fit.

And then there’s The Innovator’s Dilemma. You can never predict what will turn out to be successful, but I figured there’s no sense not swinging for the fences. Which meant looking for companies that could tell a story involving disruption on a significant scale, and companies whose founders have the chops to pull it off.

This all adds up to a great story going forward: I’ll have worked at multiple successful startups, I’ll have had increasingly important roles within those startups, I’ll have a lot of experience in dealing with very large quantities of data, with cloud technologies, with new programming paradigms (or with half-century old programming paradigms that are making a deserved resurgence!), I’ll have the agile chops to look beyond my day-to-day programming to help the effectiveness of the organization as a whole. That is a story that I can get behind, and it will convert my getting older from a potential liability into a tale of valuable experience.

Outcome

At least that’s how I’d like things to go; then again, I certainly wouldn’t have predicted two years ago anything that has happened since then, so I don’t want to get too tied up in this particular story! I’m very glad to have spent time thinking about it, but in the mean time I need to dive in, start programming, work as hard as I can to help make my next company successful, and see where the future leads.

Which means I needed to pick the next step in my future! I was very fortunate to have the opportunity to talk to some very interesting companies indeed; I ended up joining Sumo Logic, and I’m super-excited about them. They have a great disruption story, their founders can pull it off if anybody can, I interviewed with all nine of the current employees and am very much looking forward to having all of them as colleagues. What they’re doing and the way they’re working fits well enough with my prior experience that I should be able to hit the ground running and contribute well, but there’s enough new that I’ll come out of it knowing quite a bit more than I know going in. It looks like a great fit from my point of view, and they seem to agree; I’m looking forward to spending the next several years with them, it’ll be quite a ride.

And I will pay more attention to the stories that are going through my head in the future: they are powerful, they control me more than I realize.

game dev story

February 13th, 2011

Last month, it seemed like most of my twitter feed (especially the game developers in it!) was playing Game Dev Story, so I decided to give it a try last week.

And it’s certainly addictive; I spent more time playing it than I’d like to admit, and while I was getting a little bored with the game towards the end of my first run, there were also some goals I hadn’t managed to accomplish, so I ended up launching into a second playthrough immediately. Having said that, I haven’t had any desire to touch the game after the second run, so its addictive qualities seem to be fairly short-lived.

Straightforward enough gameplay, though admittedly well-matched to the iPhone. To me, the most interesting thing about the game was the strategies that it encouraged: the path to success that I found was to find the best people possible to do whatever work needed to be done, and not to worry about how much it cost as long as I could afford them at all. Hear that, game companies: find good people, and pay them lots of money! (Alas, in the real world developers don’t come with stats meters to let you figure out which ones are five or ten times more productive than others…)

Actually, the game seemed to reward spending money in general: if I could afford it, I threw double resources at games when developing them and never regretted it, and spending money on advertising seems to have paid off, too. Once you do that, you’ll have a well-oiled machine where it’s impossible to develop a game that doesn’t do fantastically well, and where you’ll be able to make sequel after sequel for games with no loss in quality. So: not so realistic, and a bit boring. But there were some nail-biting moments in my first playthrough, when I was trying to save up money for a new console license while manufacturers kept on releasing more and more expensive consoles.

iphone noby noby boy

February 8th, 2011

I wanted to like the iPhone version of Noby Noby Boy. Not out of any particular fondness for the PS3 version, but because I think Katamari Damacy is one of the most wonderful games of all time.

Sadly, I do not find either variant of Noby Noby Boy to be one of the most wonderful games of all time. I found the PS3 version strangely soothing, but I haven’t felt any pull to return to it. And the iPhone version didn’t manage that: you have a small screen with bad controls to stretch things (though the controls did improve once I discovered tapping to stick things), and with the addition of badly-done music library listening and clock watching modes. Some of the items that you can play with were worth a minute of fiddling; some weren’t.

On to Game Dev Story.

dragon age: origins

February 6th, 2011

So. Dragon Age: Origins. I’m a pretty big BioWare fan, though more on their action RPG side: Jade Empire was the game where I fell in love with them, and of their two recent games, it’s not due to chance that I played Mass Effect 2 first. But I enjoy their games in general, and I’ve seen more interesting blog posts about Dragon Age than any other game I can think of, so certainly I was going to play it when I had a bit of free time in my gaming schedule. And any game that Kateri thinks so highly of has to be rather good: her liking it doesn’t necessarily mean that I will, but it almost certainly means that I’ll respect it.

Which I do. But I also have no idea what to say about it! So I’ll fall back on my favorite technique of free-associating; and, given the scope of the game, that will be a lot of associating indeed.

RPG Conventions

Let’s start off with the “action RPG” label that I mentioned above. Dragon Age isn’t an action RPG, but a lot of the time its combat plays like one. Which is mostly good: it means that you don’t have to spend more time than necessary on the simple battles. (It’s possible for a turn-based RPG to have similarly fast battles—see Chrono Trigger—but these days the style is for turn-based RPGs to spend too much time animating you into and out of combat.) Though that does raise the question: what is the point of the simple battles, exactly?

For the hard battles, though, the battle system started to fall apart. You really want all of your party members to be working well together; for better or for worse, however, I’d reacted to the action aspect of the battles by only directly controlling my primary character, which meant that I had very little idea of how I wanted to use my other characters’ abilities, and the interface left me with no desire to actively switch between them. (Incidentally, one aspect of the “Leliana’s Song” DLC that I enjoyed was having an excuse to try out playing as a rogue.) Maybe the tactics controls would have left me with sufficient control to pull that off without pulling out my hair, maybe it would have worked better if I’d been playing on a PC instead of an Xbox; as it was, I just fell down to easy.

There were a lot of items to pick up; I bought all the backpacks I could, but on the long dungeons, they still got full, which just increased my annoyance at said long dungeons. There were, potentially, some interesting choices to be made in my choices of items to keep, of armor sets to target; I didn’t feel like thinking about that too hard or looking up the community’s recommended courses of action in that regard, though.

I was expecting to look forward to learning about the history of the world. Thinking back, though, I skimmed most of the encyclopedia material in Mass Effect 2, so perhaps that falls under the category of something that I think I’ll like more than I actually like it. (I do think that building a history for your world makes it richer, but that doesn’t mean that you benefit from making that material available to players.) I can’t say for sure one way or another, though, because Dragon Age combined a huge amount of material with an interface that made it impossible to find bits of lore that you hadn’t read: there’s no way to tell unread lore from previously read lore unless its entry happened to be on the first screen.

Interlude

Which all adds up to a feeling of meh. Is that fair? Maybe I should look at the game through my musicals analogy: embrace the set pieces? I don’t think that analogy is really relevant here: that analogy suggests that I shouldn’t worry too much about the overall narrative structure, but here my feeling is that the set pieces don’t hold together particularly well. (They certainly don’t have the crispness of a good song in a musical).

Failing that, what about the Bohemian Rhapsody analogy? Embrace the overwhelming nature of the game, its ungainly aspects, the ways in which it sails past convention, heedless of the sharp corners that result?

But, of course, Dragon Age doesn’t sail past convention: that’s exactly the problem! In a weird way, though, there’s something here nonetheless: the game was so overwhelming in its adherence to RPG tropes that I ended up ignoring them, ended up going through them and coming out on the good side. If it broke me of the habit of reading through history, of opening chests just because they’re there, of swapping out party members and going through endless conversation trees just to see all of the choices and answers that ensue, and that’s all to the good. I don’t entirely approve of the methods there, but the outcome was curiously pleasing.

Relationships and Story

Speaking of choices and conversation trees: I was a female city elf mage. The most interesting part of my origin story was Jowan: I can’t remember the last tIme I’ve felt so conflicted about a quest in a game. Normally, I jump at a chance to be helpful, but what a drip!

And then Ostagar, and Alistair. Whom I was charmed by immediately, with his self-deprecating humor. Followed by the arrival in short order of Morrigan and Leliana: I really enjoyed being around all three of them, in particular Morrigan’s bickering with the other two; by the time other party members showed up on the scene, I couldn’t imagine swapping out any of those three.

(Side note: Leliana’s entrance, covered in blood spatters, is ridiculous. I read those omnipresent blood splatters as the strongest signal that the game is intentionally going so deep into genre and game conventions as to point out the absurdity and come out on the other side. But the game doesn’t manage to do that wholeheartedly (far too little camp for that to be the case), so it comes out as yet another sign of the game not making up its mind. Which, in its own way, is perhaps the strongest argument for viewing it through a Bohemian Rhapsody lens: the game throws in everything, you make of it what you will, and don’t expect consistency. I just wish there had been more fevered dreams, or indeed any fevered dreams.)

And characters kept on surprising me, and my attitude towards them changed. Sure, Alistair’s revealed as the potential heir to the throne; oddly enough, I reacted to that by mentally withdrawing somewhat. Which ended up making a lot of sense when I reached the part of the game where that really mattered: yes, I could have put Alistair on the throne, but to me the queen fit much better there. (Incidentally, I really appreciated her behavior towards me when I botched one aspect of her rescue.)

And then there’s the approval system. I could have tried to keep everybody’s approval as high as possible; I ended up completely ignoring it when choosing my actions. But I still really liked having the approval system in place: it was an accurate feedback mechanism for how I and the various characters approached the world differently. And it helped me notice that I was much more on the same wavelength with Leliana than with Alistair; I’d been charmed by him initially and assumed that I’d go on to romance him, but I ended up with Leliana, and I think she was a much better fit.

Morrigan generally disagreed with my actions; somehow, though, that never mattered to me, and I found that I really respected her and never questioned her fitting in as a member of my party. So when, towards the end of the game, she made two rather serious requests of me, I did them without thinking twice (or with only a little bit of thought): she was a party member, I had faith enough to go along with what she wanted.

And then there were the fringe party members: I was fond of the dog, certainly, but I never got to know Oghren, Zevran, Sten, Wynne. (Though I did end up disliking Wynne from what little contact I did have with her.) I was a little surprised when Zevran turned on me, but I’d been ignoring him the whole time, so I certainly can’t blame him.

Conclusion?

I have no idea where this all ends up. I’m still ambivalent about RPGs in general, and about a lot of the details of the mechanics of the game. The game seems to some extent aware of those flaws, and I’m not sure if that makes matters better or worse.

But, ultimately, the characters make up for that. Not completely, but enough so that I’m happy to have played through the game. It’s similar to how I feel about Persona 3: too long, too much of a slog in places, but it lets me view relationships between characters that I’ve never seen before in a game. And, in both cases, I wish the game went all-in on what makes it special. But I’m also a little scared of what the results would be of doing that, because I don’t feel I really understand the virtues of RPG slogs.

Time to play some shorter games, I suppose.

joining sumo logic

February 3rd, 2011

If you’ve been wondering at the slow pace of updates here, part of the reason is that a low-key job search suddenly got a lot hotter over the last couple of weeks. Fortunately, it’s over now: I’ll be joining Sumo Logic on February 21st.

More info to come eventually…

created a gaming scenes blog

January 17th, 2011

I’ve been trying to figure out my reactions to Minecraft recently, and to that end I thought writing down some of my experiences would be useful. Useful to me, that is; quite possibly boring to y’all! So I decided to create another blog for that purpose, and to expand the purpose slightly to include narration of whatever game-related experiences I’m going through.

I don’t expect to put longer-form material there, or even particularly analytical material: I’d like to largely confine it to experience reports. I hope that those experience reports will lead to deeper dives here, however.

It’s at scenes.malvasiabianca.org—have a look. (Or don’t!) There’s not much there yet, but my guess is that what’s there now is representative enough of what its content will look like for the next few months.

(I’ll also use this as an occasion to plug my linkblog, if you’re into that sort of thing.)

the virtues of backups

January 11th, 2011

I was using one of our laptops on New Year’s Day, and it froze with an odd graphical pattern on the screen. I force-rebooted the computer, but it hung in the middle of the reboot; repeating the attempt showed that this was not a one-time coincidence. Whoops; I have bad luck with computers these days, it seems.

Though, to be honest, it wasn’t much of a shock: the computer was one of the original Macbook Pros, which meant that it was almost five years old, quite long in laptop years. So I’d been thinking about replacement plans for a while; in fact, disk space concerns might have forced my hand on that over the next few months anyways. (And kudos to Snow Leopard for reducing disk usage enough to not have forced my hand a year ago!) I talked it over with Liesl and Miranda, and we decided that my tentative plan of replacing it with a desktop machine plus a second iPad made sense, and that it also made sense to hold off on purchasing the second iPad for a few months, until the next model is released. (We have a Macbook around the house, too, so we’re not exactly lacking in options in the interim.)

So, the next day, I went to the Apple store and got a replacement (a base model 27″ iMac, specifically), along with the new Apple trackpad, an external drive for backup purposes, and a copy of iWork that was on sale. (Though, in retrospect, not on sale enough, given the appearance of those programs on Apple’s Mac app store the next week…) And, fortunately, for the second time this year, my backup strategy proved to be up to the task: when I turned on the new computer, it asked me if I wanted to restore from a Time Machine backup, I did so, and all our files and applications were back.

Though, as it turned out, not all of those restored applications worked. Almost all of the problematic ones didn’t work for the same reason, namely DRM. Some of that was straightforward but annoying (I had to re-enter license keys for a bunch of Popcap games), but I ran into real bugs with Spore and with iTunes’s ability to play Audible files that took some amount of googling to figure out. (The Spore problems were particularly special; the joys of PC gaming…) Also, on a non-DRM front, I ended up deleting and reinstalling Macports after some problems there (which, admittedly, may have been partially my fault); not my favorite piece of software, that.

Still, all in all, I’m quite happy: I’ve had two computers die on me this year, and in both cases I had a quite functional replacement working the next day. I still don’t feel entirely comfortable with my Mac backup strategy—Time Machine is magic enough that it seems to me that there’s more scope for bugs than I’d like, and the backups there are physically colocated—but it’s definitely passed the test so far. And the new computer is really nice (and Miranda seems quite fond of it indeed, it turns out that she really likes 27″ screens), and I’m quite happy with Apple’s trackpad as well.

I’m tentatively planning to install Windows on it as well at some point: I can’t imagine playing major new Windows releases, but it would be convenient for indie games or for Vintage Game Club stuff. No urgent plans along that front; I’m tentatively thinking a Boot Camp install plus Parallels, but I might go pure Parallels, or change my mind entirely.

osmos

January 9th, 2011

So: Osmos. It’s a lot like Art Style: Orbient, no? In the mechanism of circles absorbing other circles until they become the largest circle, in the simplicity of the controls, in the puzzle nature, in the simplicity of the presentation, in the amount of content that’s perfectly reasonable for a five-dollar game. I like Osmos‘s aesthetics a little more (some of its forms of circles are quite lovely), and actually as far as gameplay goes, some of my least favorite bits are where it uses the orbiting mechanic that’s central to Orbient. (Hmm, I wonder why that is? Maybe because it’s the situation where Osmos‘s control scheme starts to become a bit obtuse, turning into an indirect version of Orbient‘s control scheme.) I like Osmos‘s pacing more, too: the directed version of the levels ran out just as I was getting frustrated, and it’s backed up by a solid procedurally generated arcade mode.

A pleasant way to spend a couple of hours when I was home sick; who knows, maybe I’ll dip into it more in the future, maybe not. I’m certainly glad that games of this weight exist, I should play them more.

bohemian rhapsody as video game

January 7th, 2011

Rock Band 3‘s signature song is Bohemian Rhapsody; and, as a video game, that song is a very odd experience indeed. Unless you’re singing, you spend large portions of the song waiting for your next chance to play; whether or not you’re singing, the style and difficulty vary wildly from section to section.

This is a huge change of pace from most games I’ve played recently. Yes, video games frequently involve standing around, in the form of cut scenes: but those are short compared to the action sections and are in a different mode, whereas the gaps in Bohemian Rhapsody are fairly long and are of a piece with the rest—indeed, you would be playing during them if you’d chosen a different instrument. And, while games move you from region to region, they do that on level boundaries: you’ll typically spend an hour or more in a given context and, outside of platformers, different levels in a single game typically have quite a bit more in common than the different sections of Bohemian Rhapsody. And Bohemian Rhapsody’s difficulty curve spiky graph would be completely out of place in any game that I can think of.

The thing is, none of this matters! Or rather, it matters, but in a good way, in that these comparisons completely miss the point of the virtues of playing the song. The song has a (quite!) distinctive vision, and the goal of playing through one of the instruments in the song isn’t to go through a checklist of what makes a game-playing experience pleasant (or, for that matter, what makes a musical experience pleasant), it’s to experience a portion of that vision.

I don’t want to throw away traditional guidelines for what makes a video game experience enjoyable, what makes a video game well crafted: I enjoy the sort of refined experience that is produced by years of thoughtful evolution as much as the next person, and I would find it exhausting if all games were as idiosyncratic as Bohemian Rhapsody. Having said that, the game that I played in 2010 that is rattling around in my brain the most is Killer 7, and for much the same reasons: it presents an experience that is quite different from anything else I’ve ever played, and that experience is a powerful one that I still don’t know how to make sense of. If you’d asked me what sort of characteristics an enjoyable action game would have, being on rails would be very low on my list; but that sort of checklist comparison is completely overwhelmed by the vision that illuminates Killer 7, and I’m more than happy to place myself in the light of that vision and see where it leads me.

By all means, refine your craft, and don’t put barriers in your users’ way out of carelessness. But listen to what emerges during the night, and if those visions lead you somewhere unusual, embrace them.

gospel morality: looking back at matthew

January 5th, 2011

And now I’ve come to the end of Matthew. (Phew!) Many thanks to those of you who have read this far and commented, especially to Roger for his many insights. (And I apologize if I mischaracterize his point of view below.)

I came in expecting to dislike a lot of what I read, and I wasn’t disappointed in that. God is presented as a figure of petty evil; Jesus is working in support of that. Or at least, that’s how I initially read it; as Roger pointed out, prophecy isn’t necessary inherently moral, it can be simply descriptive, and warnings of evil are useful.

But, as I read further, I felt less and less that those statements were directed at me. Roger’s comments helped me see this more as an exercise of community forming within an existing Jewish community; most of Jesus’s strongest attacks are directed at the existing Jewish priestly elite, he explicitly abstains from opportunities to attack the secular government of the time, and he probably doesn’t care at all about an atheist on another continent two millennia later! The prophecies about the arrival of the kingdom of heaven within a generation also helped me root these statements as concerning a battle involving specific people in a specific time and place.

I was surprised by my reaction to Jesus’s healing: I expected to like that uncritically, but the repetition eventually got to me. That probably says more about me (and not in a particularly good light!) than about anything in the text, however.

And I was also expecting to find a lot to like, and I wasn’t disappointed in that, either. So many strong statements about forgiveness, my favorite of which was the passage about turning the other cheek. Linked to that are statements about not judging others but instead judging yourself (the mote in thy brother’s eyes), and statements about caring for others, and of faith in the generosity of humanity; great stuff on page after page.

I’m glad to have gone through this exercise; but it’s also been a lot more work than I expected! I’m still planning to read through the rest of the gospels, but I’m certainly not planning to do many posts on them; if something catches my eye, I’ll write about it, otherwise not. Again, my thanks to those of you who have stuck with me; to those of you who think this topic has more than overstayed its welcome, I reassure you that I’ll soon be back to my normal program of video game pontification combined with occasional bits on software development…

gospel morality: matthew 27-28

January 4th, 2011

I’m a bit confused by the parts involving Pontius Pilate. Some of that is simple ignorance: I understand that the Jewish priests don’t like Jesus, but I don’t understand why the Roman governor should care. And the part with the crowd clamoring for Pilate to free Barabbas doesn’t ring true to me. (E.g. the crowd shouting “His blood be on us, and on our children” from Matthew 27:25: in what circumstances would a crowd shout that?) Those issues aside, I’ll see Pilate’s lack of desire to kill Jesus as a sign that (as in Matthew 21-23) the real war here is between Jesus and the priest elite, not between him and traditional government forces.

We see a return of the humanity from Matthew 26 in Jesus’s crying “My God, my God, why hast thou forsaken me?” (from Matthew 27:46), and for that matter, a crueler version of humanity in the mocking comments in Matthew 27:40-43. (Which do ring true to me, unlike the bit from Matthew 27:25 quoted above.)

At the end of Matthew 27, Jesus dies and is buried; and, in Matthew 28, he’s resurrected. I find that chapter very odd: there’s an amazing lack of detail, no power in the phrasing, and so much uncertainty that it’s acknowledged in the text in Matthew 28:15 and Matthew 28:17 with only a passing attempt at a rejoinder. A sad ending…

gospel morality: matthew 26

January 3rd, 2011

A fascinating chapter, because of the humanity that pervades it. The chief priests are the bad guys, but while I don’t defend their actions, I can see where they’re coming from: Jesus was really laying into them a few chapters ago. And Jesus knows what’s coming, so he doesn’t turn away the “very precious ointment” in Matthew 26:6-12; and the organization of the chapter then suggests that Judas gets fed up with Jesus because of that, and goes and talks to the high priests.

That passover must have been one of the most depressing meals ever (and I’m sure the creepy cannibalism bits didn’t help). And then, in their last night together, Jesus is lonely and unsure, asking the disciples to stay with him, but they fall asleep while he repeatedly asks “O my Father, if it be possible, let this cup pass from me: nevertheless not as I will, but as thou wilt” (from Matthew 26:39/42/44).

Then there’s Peter: Jesus says Peter will deny him, Peter says never, but Peter does, leading to the end of the chapter Matthew 26:74-75: “Then began he to curse and to swear, saying, I know not the man. And immediately the cock crew. And Peter remembered the word of Jesus, which said unto him, Before the cock crow, thou shalt deny me thrice. And he went out, and wept bitterly.” And I can’t read Peter as being a bad person here: he’s one of many scared, fallible people in this chapter, and he remains the foundation of Jesus’s church.

And even in the middle of being seized by the priests’s men, Jesus gives us one last lesson in compassion and non-violence: when one of Jesus’s followers attacks one of the priest’s followers with a sword, Jesus says “Put up again thy sword into his place: for all they that take the sword shall perish with the sword” (from Matthew 26:52). Or at least that’s how I choose to interpret it: the context presents it more as a fulfilling of prophecy, and Jesus having faith that, ultimately, he has the upper hand. Still, that’s the lesson that I’d prefer to take from it.

gospel morality: matthew 24-25

January 2nd, 2011

Matthew 24 is one long, misguided prophecy of Jesus’s return: you have to believe, don’t be led astray by rumors or false prophets or doubts, and while we don’t know exactly when God is going to come and take away the just, nonetheless “Verily I say unto you, This generation shall not pass, till all these things be fulfilled” (Matthew 24:34). Well, no, it didn’t work out that way, and I’m a bit afraid of anybody who still holds to what’s in this chapter.

Matthew 25 also talks about the kingdom of heaven, but in a more discursive fashion. I rather like the parable of the talents (Matthew 25:14-30), with its notion that you shouldn’t squander what is given to you and its explicit acceptance of loaning money with interest. (Matthew 25:27, “Thou oughtest therefore to have put my money to the exchangers, and then at my coming I should have received mine own with usury.”)

Note, however, that in that parable, we’re talking about people to whom something has been given: the chapter ends with a paean to the virtues of kindness and charity to those who are in need, in Matthew 25:34-46. In fact, I’ll just quote Matthew 25:34-40 here:

Then shall the King say unto them on his right hand, Come, ye blessed of my Father, inherit the kingdom prepared for you from the foundation of the world: For I was an hungred, and ye gave me meat: I was thirsty, and ye gave me drink: I was a stranger, and ye took me in: Naked, and ye clothed me: I was sick, and ye visited me: I was in prison, and ye came unto me. Then shall the righteous answer him, saying, Lord, when saw we thee an hungred, and fed thee? or thirsty, and gave thee drink? When saw we thee a stranger, and took thee in? or naked, and clothed thee? Or when saw we thee sick, or in prison, and came unto thee? And the King shall answer and say unto them, Verily I say unto you, Inasmuch as ye have done it unto one of the least of these my brethren, ye have done it unto me.

Amen.

gospel morality: matthew 21-23

January 1st, 2011

Matthew 21 starts with the bit about the ass and the colt, and then moves on to casting the moneychangers out of the temple (“My house shall be called the house of prayer; but ye have made it a den of thieves”, from Matthew 21:13), and Jesus’s withering a fig tree (Matthew 21:18-22). The former of which I rather enjoyed, but the latter is quite harsh: that poor fig tree! What happened to turning the other cheek?

At any rate, these leave you with the ideas that: 1) you shouldn’t mess with Jesus, and 2) those in the temple aren’t exempt from his wrath, indeed rather the opposite. Which leads directly to the next bit, with Jesus confronting the “chief priests and the elders of the people” (from Matthew 21:23). This lasts for a full two and a half chapters, containing: a couple of arguments about bible interpretation; a couple of parables all on the theme of “chief priests bad (directly going against the will of God), followers of Jesus good”; the “Render therefore unto Caesar the things which are Caesar’s; and unto God the things that are God’s” (from Matthew 22:21) bit that makes it clear that Jesus is focusing right then on arguing with the priests rather than with the state; and Matthew 23. In that chapter he really lets loose against the priests, with seven verses starting with “woe unto you, scribes and Pharisees, hypocrites!”, five verses where he calls them blind, one “Ye serpents, ye generation of vipers”, and other fine examples of invective.

Ouch. But great stuff: it’s one thing when Jesus is telling me that it’s way or the highway, but I’m perfectly fine with him telling off other similarly judgmental types. Especially when it’s an argument between the old and the new, though I do feel a bit sorry for the priests here, with their fear that they’re on the wrong side of history.

gospel morality: matthew 20

December 31st, 2010

I wasn’t aware of the parable that takes up the first half of chapter 20, but now I’m fascinated by it. It presents a group of laborers who worked for different amounts of time, but all got paid the same; the longer-working laborers complained, but got the following response, from Matthew 20:13-15:

Friend, I do thee no wrong: didst not thou agree with me for a penny? Take that thine is, and go thy way: I will give unto this last, even as unto thee. Is it not lawful for me to do what I will with mine own? Is thine eye evil, because I am good?

Emotionally, I’m on the side of the longer-working laborers here: but why? If they would have felt adequately paid in the absence of the other laborers, then why are they bothered by how the other laborers are treated?

The key here is, of course, the comparison. If the other laborers hadn’t worked at all, and it had been pure charity, I imagine that the laborers who had worked wouldn’t have felt bad. And then there’s another potential scenario that Jesus doesn’t give us: what if both sets of workers had worked the same amount, but they’d gotten radically different pay rates, the lower of which would, in other circumstances, be acceptable? The same argument seems to apply that the lower-paid set of workers shouldn’t feel bad; I bet they would, though, and they’d feel like the person in charge is unfairly playing favorites.

I dunno. I’m still mostly on the side of the longer-working laborers, and, if I were in their shoes, I wouldn’t set my alarm clock early the next day. But “Is thine eye evil, because I am good?” is a very good question.

The rest of the chapter doesn’t strike me as strongly. I do, however, like the call to servant leadership in Matthew 20:26-28, in particular “And whosoever will be chief among you, let him be your servant” (Matthew 20:27).