There's a quintessential Christian marketing story that goes something like this:
- Person was desperate
- Person experienced miracle
- Person became a Christian
When I called myself a Christian for many years, and before that growing up in a Christian home, I heard this story with variations over and over. The frequency was maybe never lower than every 3 years, sometimes more often, at least that's how I remember it. My mother LOVED repeating every new variation of this story when it came out.
Every time I heard this story, I had 2 responses internally: the story was always unverifiable, and the story was always believable. At least it was believable when I heard it for the first time. It lost some of that luster after hearing it countless times though.
Then many years ago I left Christianity, and I never heard that story again in other religious practices. There are other parallels to Christianity in other religions (like love your neighbor as yourself, or practice kindness, etc) but from what I've picked up in Buddhism or Hinduism or maybe even Mormonism - at least so far I've never heard this type of story. And possibly that's why at a very deep level Christianity just wasn't for me - at a certain level the story produced more doubt than it produced devotion.
The closest story which also shows up in other religions is something like this:
- Person has good practice
- Person lives good life even with hardships
That story shows up in Christianity and Judaism (i.e. Job, Habakkuk), but also in Buddhist Koans and maybe even something like it is in the Baghavad Gita.
Back to the marketing story. My only explanation is that this story exists on 2 levels. It may actually reflect real events. But it also serves a purpose for countering lost practice. So I think of it as an antidote. If you have really bad theology (namely the whole universe is really tainted with sin and all people are fundamentally bad) and everyone in your religious practice actually believes this bad theology (rather than seeing it for what it is, a metaphor of the not-yet-born-again-enlightened mind), then nobody new would ever come in. So that horror theology needs an antidote story. And you have to keep applying this antidote over and over again.
It is similar to the "end of the world" story that comes out at about the same frequency - every 3 years or so - where the world will end on such and such a date.
Now maybe that's not true. Maybe I'm seeing something that's not really there. Maybe your mileage varies. But the idea of an antidote pattern seems a compelling storytelling mechanism, so I present it here, because storytelling and game design are closely related. There is something very human going on here, and it seems worth mentioning.
Wednesday, October 14, 2015
Thursday, May 14, 2015
Interview question from hell: "Which text editor do you use?"
About 200,000 years ago - it's not really important when it was - I was in an interview somewhere... also not important where.
And at one point they asked me "which text editor do you use?"
This was apparently a part of the company conversation: "Which text editor?"
----------------
Some other place which I remember quite well, I was asked to "fix my tab settings in my editor" because my code didn't look like everyone else's.
I think I looked at it for about an hour... got a confused feeling "what's there to fix?" and gave up. And then for the rest of my career at that company I felt deeply guilty that my code's tabs were wrong, and I didn't know how to fix my editor to comply with everyone else's code.
-----------------
"What drives this conversation?"
Well I'm glad you asked. It just so happens it seems to be driven by merge conflicts which aren't ignoring white space.
And my own personal sloppiness. You see, I can read a file and mostly ignore the white-space, and somehow my brain parses all that and says "yep that will compile fine" and go my merry way without even a thought given to correcting all the spacing. But not everyone can do that - or even _should_ do that.
------------------
So I'm trying to come up with a solution.
One solution is to mandate company-wide "everyone shall use whatever editor the star performer coder is using" and then every year after the star performer quits to go work for Google - you can pick a new editor that everyone has to switch to.
This just might be the way to go.
-------------------
But the alternative I'm really wondering about is to let everyone use whatever editor they like - and have an automated process upon check-in which does something like this:
1) Remove all the whitespace in the code
2) Run a "prettify" algorithm that adds spaces or tabs
3) If it added spaces, convert them to tabs
4) Never code in Python... :) (sorry... for Python I think you are stuck mandating a specific editor).
--------------------
Git has check-in hooks that can run automated processes like this, to guarantee whatever sins the editor committed, they will all be erased and the code in the repository will be consistent. That way any merges between branches won't have any changes that are purely white-space.
git merge -Xignore-space-change would also fix this.
And at one point they asked me "which text editor do you use?"
This was apparently a part of the company conversation: "Which text editor?"
----------------
Some other place which I remember quite well, I was asked to "fix my tab settings in my editor" because my code didn't look like everyone else's.
I think I looked at it for about an hour... got a confused feeling "what's there to fix?" and gave up. And then for the rest of my career at that company I felt deeply guilty that my code's tabs were wrong, and I didn't know how to fix my editor to comply with everyone else's code.
-----------------
"What drives this conversation?"
Well I'm glad you asked. It just so happens it seems to be driven by merge conflicts which aren't ignoring white space.
And my own personal sloppiness. You see, I can read a file and mostly ignore the white-space, and somehow my brain parses all that and says "yep that will compile fine" and go my merry way without even a thought given to correcting all the spacing. But not everyone can do that - or even _should_ do that.
------------------
So I'm trying to come up with a solution.
One solution is to mandate company-wide "everyone shall use whatever editor the star performer coder is using" and then every year after the star performer quits to go work for Google - you can pick a new editor that everyone has to switch to.
This just might be the way to go.
-------------------
But the alternative I'm really wondering about is to let everyone use whatever editor they like - and have an automated process upon check-in which does something like this:
1) Remove all the whitespace in the code
2) Run a "prettify" algorithm that adds spaces or tabs
3) If it added spaces, convert them to tabs
4) Never code in Python... :) (sorry... for Python I think you are stuck mandating a specific editor).
--------------------
Git has check-in hooks that can run automated processes like this, to guarantee whatever sins the editor committed, they will all be erased and the code in the repository will be consistent. That way any merges between branches won't have any changes that are purely white-space.
git merge -Xignore-space-change would also fix this.
Thursday, January 22, 2015
Why Board Game Manuals are Evil
You bought a new game.
And it's gorgeous! Oh it's going to be so much fun!
So you read the manual and start to figure out how it works. The manual is a work of art - the whole game experience unfolds before you as you read it.
Finally you feel ready to host a game, and invite friends over to play.
And what happens next?
Do you give everyone a copy of the manual and order them to read?
Or did the manual explain to you how to be a good "game master" - organizing all the details of the game in such a way that everyone feels compelled to keep going forward with the process of learning the game?
The Indescribable Importance Of The Wiener Pattern
At this point, a game will either "magically" be great and everyone loves it, or half the audience at your house will want to play and half will have no clue what is going on and wander off with confused looks on their faces, or nobody even shows up in the first place. Oh sad.
This is why the wiener pattern is so important. And why game manuals usually fail. It's not that the game manual is at fault - it's that someone else usually explains the rules to the players. And that person probably likes the game, but doesn't know how to propagate that "like" to other players.
The answer is the wiener. How can a game be designed that the whole learning process is a continuous stream of wieners for all skill levels and not rely on a "game master" to do the work of producing wieners himself?
A Gigantic Pile of Details
My experience has been that some board games are so detailed the first few minutes involve hearing a gigantic pile of rules and explanations of "this is what this card is" etc. It can be overwhelming.
And overwhelming makes me feel dumb.
Now sometimes it's my job to feel dumb - but not everyone is so forgiving. They might not want to come back next time to visit such unfamiliar territory.
Organize The Piles Into Easily Digestible Categories
One way to incorporate wieners into a board game, is to make the game unboxing itself part of the learning process. There can be a specific order that items have to be taken out of the box - so that everyone watching isn't overwhelmed with "everything all at once". Instead, there may need to be boxes within boxes, to allow categorization of game concepts.
Put The Game Master Into The Game Itself
This offloads the burden from the game master and shifts it back to the game explaining itself, in it's own way. It can be as dramatic as it needs to be - but it no longer relies on the game master's dramatic skills. This way the game is it's own game master, inviting everyone to learn in a consistent way regardless of how much exposure they've had.
And it's gorgeous! Oh it's going to be so much fun!
So you read the manual and start to figure out how it works. The manual is a work of art - the whole game experience unfolds before you as you read it.
Finally you feel ready to host a game, and invite friends over to play.
And what happens next?
Do you give everyone a copy of the manual and order them to read?
Or did the manual explain to you how to be a good "game master" - organizing all the details of the game in such a way that everyone feels compelled to keep going forward with the process of learning the game?
The Indescribable Importance Of The Wiener Pattern
At this point, a game will either "magically" be great and everyone loves it, or half the audience at your house will want to play and half will have no clue what is going on and wander off with confused looks on their faces, or nobody even shows up in the first place. Oh sad.
This is why the wiener pattern is so important. And why game manuals usually fail. It's not that the game manual is at fault - it's that someone else usually explains the rules to the players. And that person probably likes the game, but doesn't know how to propagate that "like" to other players.
The answer is the wiener. How can a game be designed that the whole learning process is a continuous stream of wieners for all skill levels and not rely on a "game master" to do the work of producing wieners himself?
A Gigantic Pile of Details
My experience has been that some board games are so detailed the first few minutes involve hearing a gigantic pile of rules and explanations of "this is what this card is" etc. It can be overwhelming.
And overwhelming makes me feel dumb.
Now sometimes it's my job to feel dumb - but not everyone is so forgiving. They might not want to come back next time to visit such unfamiliar territory.
Organize The Piles Into Easily Digestible Categories
One way to incorporate wieners into a board game, is to make the game unboxing itself part of the learning process. There can be a specific order that items have to be taken out of the box - so that everyone watching isn't overwhelmed with "everything all at once". Instead, there may need to be boxes within boxes, to allow categorization of game concepts.
Put The Game Master Into The Game Itself
This offloads the burden from the game master and shifts it back to the game explaining itself, in it's own way. It can be as dramatic as it needs to be - but it no longer relies on the game master's dramatic skills. This way the game is it's own game master, inviting everyone to learn in a consistent way regardless of how much exposure they've had.
Friday, December 26, 2014
The Anti-Learning Pattern
If learning was just the acquisition of knowledge, it wouldn't explain how news can affect people so differently. Thus the necessity for framing "learning" in very precise terms, to allow for the idea of "anti-learning".
The Learning Pattern
We can think of learning in terms of process and need. For example, a basic need might be hunger. So any process which allows meeting that need which is new to the person hearing about it can be called "learning".
This way learning becomes a general game design pattern. The problem the pattern addresses is any need. The solution is a process to meet that need.
The Anti-Learning Pattern (Coping/Distraction)
The opposite of learning (yet similar enough to be misconstrued as valuable) is anti-learning. Let's pretend it's the same problem: hunger. Now if we provide a process which doesn't address the hunger, but instead distracts the person from their hunger, that process is anti-learning. In short, a coping mechanism or distraction.
[I'm not going to get into situations where someone is obese and their hunger is habituated - that's a different health need pattern where the solution process would involve spending time with hunger, diet, and exercise.]
The point of even discussing an anti-learning pattern is that all knowledge is not beneficial. Unless it addresses a need, it actually creates distraction. Or it may benefit one party while exploiting another. So there may be an interesting game dynamic available in this pattern.
The Learning Pattern
We can think of learning in terms of process and need. For example, a basic need might be hunger. So any process which allows meeting that need which is new to the person hearing about it can be called "learning".
This way learning becomes a general game design pattern. The problem the pattern addresses is any need. The solution is a process to meet that need.
The Anti-Learning Pattern (Coping/Distraction)
The opposite of learning (yet similar enough to be misconstrued as valuable) is anti-learning. Let's pretend it's the same problem: hunger. Now if we provide a process which doesn't address the hunger, but instead distracts the person from their hunger, that process is anti-learning. In short, a coping mechanism or distraction.
[I'm not going to get into situations where someone is obese and their hunger is habituated - that's a different health need pattern where the solution process would involve spending time with hunger, diet, and exercise.]
The point of even discussing an anti-learning pattern is that all knowledge is not beneficial. Unless it addresses a need, it actually creates distraction. Or it may benefit one party while exploiting another. So there may be an interesting game dynamic available in this pattern.
Sunday, November 30, 2014
The Anti-Wiener Pattern
Wiener
Have you heard of the "wiener" game design pattern? It involves making a possible future state of the game visible to the player. For example equipment that costs a 100,000 tokens, but your character only has 10 tokens - this is a wiener. It shows "if you play long enough, you'll be able to afford this cool thing".
Another example is the Disneyland castle, which draws people to walk in that direction because they want to see the castle up close.
Sword Of The Stars II and Over-budget Technology Research
Over the weekend I bought a 4x game (called Sword of the Stars II). The game is somewhat unfinished, had lots of bad reviews, but it was on sale and had enough youtube video evidence that I'd probably like it, so I took the risk and bought it.
Like most 4x games, you research technologies. Like some 4x games (Master of Orion), research can finish ahead of schedule. To describe research progress, a progress bar shows 0 to 100%. You could hover over the progress bar to see how many turns before it would reach 100%. At 100% a notice would come up that the technology was now available, and sometimes this happened early.
Fine. Everything is just as I've seen before in other 4x games.
What I didn't know, and which the UI didn't reflect at all, was that some research could go over-budget! So I'm playing along innocently minding my own business, and eventually see the progress bar fills to 100% and no new technology is available. Nada! I think "oh just an off-by-one bug" and go to the next turn. Still nothing! 2 more turns! Nope! I was completely convinced the game had a bug in it which wouldn't let some technologies be unlocked - which essentially was going to shelve the game for me.
What a rip-off!
After consulting the forums - I got a gentle rejoinder: "RTFM". Now whenever I hear "RTFM" - I think: "that's fine if we're talking about programming." RTFS. Okay I'll read the source code. I'll do whatever work it takes to get the job done.
But this is a game. I'm not being paid to do this. Someone else was paid to make this experience "fun" - and instead all I got was that "what a rip-off!" feeling.
So this feeling of "what a rip-off" led to the idea of an anti-wiener.
Anti-wiener
With an anti-wiener, the game has hidden a future possible state from the player, so that when that state comes up, the player is surprised and traumatized (especially if they feel they just bought a broken game). This is probably unintentional, unless you really hate your players.
In this case, the progress bar implied that 100% was the edge condition for research, when actually the edge was beyond 100%. The design for SotS2 is actually 200%: an over-budget project could take up to 200% before completion, and at 200% that technology would be considered unavailable (i.e. just too hard).
[The solution I that finally came to me was the edge condition should always be clearly shown in the UI. The bar should really show 200% as the full scale, with 100% being somewhere in the middle, and what players would usually see when doing research. This becomes a wiener pattern again, because the player will wonder "can research go beyond 100%? It looks like it can with the progress bar." Then there's no surprise and no RTFM - it's an intuitive design again.]
Saturday, September 27, 2014
raspberry-pi remote ARM compiles via VNC viewer
Running raspberry-pi at home, logging in remotely via vncviewer. A friend had set up a DNS service which my home PC pings, so I can get to the r-pi from anywhere. Originally I was doing this to use r-pi as my git repository, but now I can use it as a remote ARM compiler from my laptop.
The only snag I ran into was that after installing vncserver on the r-pi: it wasn't obvious that the port the vncserver serves you have to add 5900 (mines running on :1, so log in via 5901). Set up port forwarding on the router and an ssh connection. I'm running from OSX and using the Java (jar) vncclient (tightvnc).
This is NOT secure (well allegedly the passwords are encrypted) - I couldn't get the SSH tunneling to work (even though I can establish an ssh connection in a shell), so ideally this should be on some account that can be wide open. There are also claims you can avoid vnc programs and just use OSX screen sharing.
No VNC Just SSH Commands
Avoiding the vnc and just running commands over ssh requires entering a password every time (so I'd have to password for scp to the server, ssh command and scp results back). Pretty tedious. In OSX that approach also isn't helped by setting the .ssh/config to have:
home *
That's supposed to use an already existing ssh connection for all subsequent connections. But it wouldn't make an ssh connection at all on OSX. On PC it did log in, but it didn't help (with the added adventure of generating an AVG warning when it tries to make the connection - but only if you've set up ControlMaster=auto in the ssh/config)! Ugh! On PC trying to run an scp after an ssh was already open still asked for another password. Debian Linux on rpi apparently doesn't support ControlMaster.
TightVNC on PC
When I ran tightvnc on a PC (Windows Vista running from home), it required me to set up a connection via ssh first (I used cygwin). I'm not sure why the OSX version of tightvnc (via Java) doesn't use the ssh connection, but the compiled PC version looks like it does.
No VNC Just SSH Commands
Avoiding the vnc and just running commands over ssh requires entering a password every time (so I'd have to password for scp to the server, ssh command and scp results back). Pretty tedious. In OSX that approach also isn't helped by setting the .ssh/config to have:
home *
ControlMaster = auto ControlPath = ~/.ssh/master_%r@%h:%p
That's supposed to use an already existing ssh connection for all subsequent connections. But it wouldn't make an ssh connection at all on OSX. On PC it did log in, but it didn't help (with the added adventure of generating an AVG warning when it tries to make the connection - but only if you've set up ControlMaster=auto in the ssh/config)! Ugh! On PC trying to run an scp after an ssh was already open still asked for another password. Debian Linux on rpi apparently doesn't support ControlMaster.
TightVNC on PC
When I ran tightvnc on a PC (Windows Vista running from home), it required me to set up a connection via ssh first (I used cygwin). I'm not sure why the OSX version of tightvnc (via Java) doesn't use the ssh connection, but the compiled PC version looks like it does.
Friday, September 26, 2014
Genetic Algorithms Used to Search Solution Space
I keep losing this article:
http://cacm.acm.org/magazines/2009/11/48443-deep-data-dives-discover-natural-laws/fulltext
Years ago when it was first published, I went through the references and tried to understand how to reproduce the experiment, but got overwhelmed by some of the work.
The idea is that you provide a what I'll call a "vocabulary" - a list of operations - which are then randomly arranged, and that arrangement is scored according to how closely it duplicates a dataset. Call a single operation a gene, and for a large population of random solutions, propagate genes to next generations to converge on higher scoring solutions.
The difficult work is in optimizing convergence. Their work is very impressive, and looks like it's completely free for anyone interested in applying it.
http://www.sciencemag.org/content/suppl/2009/04/02/324.5923.81.DC1/1165893s1.mpg
Are you really sure your architecture is optimized? This is the tool for answering that question.
continued...
http://cacm.acm.org/magazines/2009/11/48443-deep-data-dives-discover-natural-laws/fulltext
Years ago when it was first published, I went through the references and tried to understand how to reproduce the experiment, but got overwhelmed by some of the work.
The idea is that you provide a what I'll call a "vocabulary" - a list of operations - which are then randomly arranged, and that arrangement is scored according to how closely it duplicates a dataset. Call a single operation a gene, and for a large population of random solutions, propagate genes to next generations to converge on higher scoring solutions.
The difficult work is in optimizing convergence. Their work is very impressive, and looks like it's completely free for anyone interested in applying it.
http://www.sciencemag.org/content/suppl/2009/04/02/324.5923.81.DC1/1165893s1.mpg
Are you really sure your architecture is optimized? This is the tool for answering that question.
continued...
Subscribe to:
Posts (Atom)
