More tinkering with auction games

So I was thinking about the scrabble modifications I outlined and some of the ideas sortof collided in my head with the auction game I designed (that didn’t really work) and I came up with the following game design. I do not yet know if it works. I suspect it to be overcomplicated.

Pieces

  • The same hexagonal tiles as before.
  • Currency tokens.
  • A tie-breaker token.
  • Some means of scoring – either a pad or victory point tokens
  • A collection of temporary marker tokens

Setting up

Assign the tie breaker token to someone.

Put all the hexagonal tokens in a bag or face down somewhere from which they can be randomly drawn.

Draw one hex tile at random and put it face up. This is the beginnings of the game board.

Give everyone N currency tokens. I don’t know what the right value of N is but it should probably be somewhere in the 5-10 region.

Place one currency token in the middle. This is the beginning of the auction pool.

Note that currency tokens will never enter or leave the game. The currency tokens given out now are the entire economic pool for the game.

Play

Play proceeds through a sequence of turns. A turn consists as follows:

One tile per player is drawn and placed face up.

Each player submits a sealed bid (they put a number of currency tokens in their hand and hold it out).

They reveal their bids and use them to determine play order. Play order is determined as follows:

  1. Higher bids go before lower bids
  2. Given two identical bids, the person clockwise closest to the tie breaker token goes first

So if we have players in order A, B, C, D, E with A being the tie breaker and we have bids A=2,B=3,C=1,D=2,E=2 then the play order is B (highest bid), A (tie breaker), D (closer to tie breaker than E), E, C (lowest bid).

In play order they each draw a hex and put it into their hand (a collection of hexes face up in front of them).

Now in reverse play order they may choose to play runs. A run consists of putting a set of hexes down on the game board as follows:

  1. The first hex may be placed so that it touches any existing hex on the board
  2. Each hex must be placed so it touches the previous hex laid. It is allowed to touch other hexes laid this turn as long as it also touches the last hex laid.
  3. As many hexes as you have in your hand may be laid down as long as you obey these rules, but you are not required to lay all of them down

Put temporary marker tokens on played hexes so you can keep track of which they are.

The run is then scored by counting up the number of edges each hex laid down has that are the same colour as the hex they adjoin. Note that this means if that hex is also one you’ve just laid down you score double (so if you play two hexes which share a red edge, they each gain you a point. If you lay down a hex which shares a red edge with one already on the board then you gain a point for the hex you played but not the one that was already there). These are added to your total.

At the end of the turn you now do two things:

  1. The tie breaker marker passes clockwise to the next player
  2. All bids made this turn are placed in the central pot. The pot is then divided equally between all players. If it does not divide evenly then the remainder is left in the pot for next turn.

Ending the game

There are seven special hexes. They each have 6 distinct colours and a black dot in the center. Once three of these tiles are on the game board the game is over. The current turn is completed (and the money and tie breaker tokens are distributed as normal), then victory conditions are calculated as follows:

  1. The person with the most points wins
  2. If there is a tie, the person in that tie who has the most currency wins
  3. If there is still a tie, the person clockwise closest to the tie breaker token wins

Notes

It feels like there are some annoying special cases in this. They were all added for good reasons, but I’m not sure that’s enough. I may attempt to play test this soon and see how it plays out in practice.

This entry was posted in Games on by .

How to quickly become effective when joining a new company

The other day my colleague Richard asked me how I managed to get started at Lumi quite so quickly. It’s a good question. When I started here I was pretty much doing useful work from my second day (I did manage to get “code” out into production on my first day, but it was my entry on the team page). I think I handed them a feature on day 3. For added funsies I’d only been writing Python for a month at that point.

I’ve seen enough new starters on equally or less complicated systems that I’m aware that this is… atypical. How did I do it?

The smartarse answer to the question is “obviously because I’m way smarter than those people”. As well being insufferably arrogant this isn’t a very useful answer – it doesn’t help anyone else, and it doesn’t help me (knowing how I do something is useful for me too because it allows me to get better at it and apply it to other things).

So I’m putting some thought into the question. This is largely just based off introspection and attempting to reverse engineer my brain’s behaviour. I’ve no idea how portable this advice is or even if it’s remotely accurate, but hopefully some of it might be useful.

There are essentially three key principles I apply, all about information:

  1. Acquire as little information as possible
  2. Acquire information as efficiently as possible
  3. Use the information you acquire as effectively as possible

I’ll elaborate on each of these and how to do them.

Acquire as little information as possible

This one is the only one that might be counter-intuitive. The others… well, yes. You want to acquire information efficiently and use it effectively. That’s kinda what learning quickly means. But acquiring as little information as possible? What’s that about? Surely when trying to learn stuff you want to acquire as much information as possible, right?

Wrong.

This sort of thinking fundamentally misunderstand the purpose of learning, at least in this context.

Learning is only useful when it allows you to get things done. Filling your brain with information is all very well, but what if you’ve filled your brain with entirely the wrong information?

Work example (a hypothetical one. I’ve not seen this happen, though I have seen similar): Suppose you diligently sit down, trace through the database schema, learning how everything fits together. You spend about a week doing this. Then you get told that that’s the old schema and we’re 2/3rds of the way through migrating to an entirely new data storage system after which that schema will be retired. Now the knowledge of the history isn’t entirely useless, but there’s certainly more useful things you could have been doing with that week.

The goal of learning as little information as possible forces you to do three important things:

  1. It forces you to learn the right information. If you only acquire information when it’s absolutely necessary then that information was by definition useful: It enabled you to do the necessary thing.
  2. It forces you to do things you can actually achieve soon. If task A would require you to learn a lot and task B would require you to learn a little, do task B. It will take you less time to learn the prerequisites, so you’ll get something achieved quickly.
  3. It prevents you from getting distracted by the immensity of the task of trying to understand everything and forces a more useful learning discipline on you by giving you concrete places to start.

“But David!”, I hear you cry in horror so profound that it causes you to use exclamation marks as commas, “Are you suggesting that learning is bad? That I shouldn’t try to learn how things work?”

Rest your mind and set aside your fears, for I am not!

The thing about information is that once you have acquired it you can build on it. Every little bit of knowledge you put into your head provides you with a framework on which to hang more knowledge. The journey of a thousand miles begins with a single step. Other profound sounding metaphors that convince you of the wisdom of my advice!

We’re essentially iterating this procedure over and over again. “What can I do? Oh, there’s a thing. Lets do that. Done. What can I do now? Oh, hey, there’s another thing which I couldn’t previously have done but now can because I’ve learned stuff from the last thing I did”. By acquiring our knowledge in little bite sized chunks we’ve rapidly consumed an entire information meal.

As well as interleaving getting things done with learning things, I think the quality of education you get this way is better than what you would otherwise get because it contains practical experience. You don’t just learn how things work, you learn how to work with them, and you learn a lot of concrete details that might have been missing from the high level description of them.

Now go back and read this section again (if you haven’t already. Don’t get stuck in an infinite loop and forget to eat and die. Because I’d feel really bad about that and it’s not an efficient way to learn at all). It’s literally the most important bit of this post and I really want you to take it on board.

Acquire information as efficiently as possible

Here is my knowledge acquisition procedure. I bequeath it to you. Use it well:

  1. Can I figure out how this works on my own? (5 minutes)
  2. Can I figure out how this works with googling and reading blog posts? (15 minutes)
  3. Ask someone to explain it to me (however long it takes)

OK, I know I said the previous section was the most important thing in this essay, but this one is pretty important too. For the love of all, please do not sit there ineffectual and frustrated because you can’t figure out what’s going on. It’s nice that you don’t want to bother your colleagues, and the first 20 minutes or so of trying to figure things out on your own is important as a way of preventing you from doing that too much, but your colleagues need you to be useful. They also probably possess the exact information you need. It is their responsibility and to their benefit to help you out when you get stuck.

Use the information you acquire as effectively as possible

This is a fuzzy one. It’s basically “Be good at thinking”. If there were a fool proof set of advice on how to do this the world would look very different than it currently does. Still, here are some ideas you might find useful.

Here is roughly what my thinking procedure looks like. Or, more accurately, here is my inaccurate model of what my thinking procedure looks like that I currently use to make predictions but don’t really expect corresponds that exactly to reality.

Err. That paragraph might be a bit of a clue as to what I’m about to say.

If I may get all meta for a moment: What is the purpose of knowledge acquisition?

I mean, sure, you want to get stuff done, but how does knowledge help you do that?

To me the value of knowledge is essentially predictive. You want to be able to answer two questions:

  1. If I do X, what will happen?
  2. If I want Y to happen, what should I do?

These two questions are natural inverses of each-other. In principle a valid algorithm for question 2 is “Think of all possible values of X and see if they cause Y to happen”. Everything else is just an optimisation to the search algorithm, right?

First I’ll go into how to answer question 1:

At its basic it’s two words. “Mental models”

A mental model is essentially an algorithm you can run in your brain that lets you put in actions as inputs and get outcomes as outputs.

They can be implicit or explicit (note: This is my terminology and is probably non-standard): An implicit mental model is essentially one that you can run without going through all the steps. You don’t need to be able to describe the model explicitly, you just know the answer. Essentially what most people mean when they say something is intuitive is “I have an implicit mental model for how this works”. You’re essentially pretty comfortable working with anything you have an implicit mental model for and can probably get things done with it pretty readily.

Explicit mental models are more work. You have to think through the steps linearly and laboriously in order to get the answer. But they’ve got a lot of benefits too:

  1. They tend to be more accurate. I find implicit mental models are full of shortcuts and heuristics which makes them really efficient when they work but often leaves some major gaps.
  2. They’re easy to fix when they’re wrong. And mental models will be wrong, all the time. The chances of you always being able to perfectly predict things are basically zero. An explicit mental model you can just patch, but adjusting your intuitions is much harder.
  3. You can explain your reasoning to other people. This is especially useful when you’re stuck and want to talk a problem through with someone else.

So both types of mental models have costs and benefits. So which do we choose?

Answer: Both!

Once you think of mental models in terms of being able to predict how things behave instead of truth about how things work you can realise that having multiple mental models of how something works is not only fine but often useful: You can cross check them against eachother to see if they make different predictions, you can use whichever is cheapest when the decision doesn’t matter very much or most accurate when it does.

Additionally, it’s not really as cut and dried as I’m making it seem. What tends to happen is that explicit mental models turn into implicit ones. Once you’re familiar enough with an explicit mental model the ideas become intuitive and internalized and you need to consult it less and less.

Here are some tips for building mental models:

  • Reuse old mental models as much as possible. When learning python I started out as “Like Ruby with funny syntax”. Then I learned a bit more and replaced this with “Like Javascript with funny syntax and a decent module system”. Then I found out about descriptors and patched it as “Like Javascript with funny syntax and a decent module system, but bear in mind that the value you put into an object might not be the value you get out of it because of these magic methods”.
  • In general, build mental models as cheaply as possible. A mental model that you can build quickly is probably much more useful than a laboriously constructed one, because you’ll be likely to resist changing the latter.
  • Patch your mental models when they make wrong predictions
  • Test your mental models constantly. This is useful a) Because it leads to finding out when you need to patch them and b) Because it greatly hastens the process of turning them into implicit mental models, which makes you more able to readily apply them in future.

That’s about all I’ve got on how to build mental models. Now onto question 2: I can predict the consequences of my actions. How do I go about predicting the actions that will lead to the consequences I want?

Here is roughly what I think of as my algorithm:

Section 1:

  1. Generate an idea
  2. Is it obviously stupid? Throw it away and go back to 1.
  3. Is it still not obviously stupid after a little bit more thought? Set it aside
  4. How many not-obviously-stupid ideas do have I set aside? 3 or so? If so, proceed to the next section.
  5. How long have I taken over this? Too long? If so and I have any ideas set aside, go to the next section. Else, step away from the problem. Either come at it from another angle of attack or go do something else and let it simmer away in the background.

Section 2:

I now have a bunch of idea candidates. Put some proper thought into it and attempt to determine which amongst them is best. This may require actually trying some things out and gathering new information.

Once I have determined which of these is the best, decide if I’m satisfied with it. If I’m not, start the whole process again. If I am, this is the solution I’m going to go with for now.

So basically the idea is that you want to use cheap mental models to filter ideas quickly, then once you’ve got a few goodish ideas to compete against eachother you can properly explore how they work as solutions. I don’t know how accurate a description this is, but I think it’s broadly OK.

Unfortunately it’s got a big gap right at the beginning where I say “Generate an idea”. How do you do that? Just try things at random?

Well, you just… do. I don’t really know. This may be where I have to fall back on my “Maybe I’m just kinda smart?” answer, but if so then sadly I’m not actually smart enough to give a good answer here. Here are some things I think that I might be doing, but it’s mostly speculation:

  1. Try and narrow the search space as much as possible. If you think you might be able to solve the problem by making changes to a specific thing, only look at ideas which change that thing. If that’s proving not to work, try a different thing. You should be able to use a mix of past experience and proximity to guide you here – think of similar problems you’ve solved in the past and look near what the solutions to those were. If you can’t think of any similar problems or those solutions don’t pan out, look nearby to the problem. The advantage of looking at a smaller area is that there are fewer things to try so you’re more likely to hit on the right one quickly.
  2. Try and narrow the problem by breaking it up into smaller pieces. When you do this it becomes much easier to narrow the search space as in the previous section. In order to do this try to find natural “cleave points” where the problem breaks neatly along specific lines.
  3. When you decide a solution is a bad idea, see if there are any general reasons why it’s a bad idea and try to avoid areas that relate to those reasons.
  4. Conversely, if an idea almost works but not quite, try exploring around it to see if there are any variations on it that work better.
  5. If you’re totally stuck, try thinking of something completely out there. It probably won’t work, but exploring why it won’t work might tell you interesting things about the problem and give you other areas that worked.

I don’t think that’s sufficient. I’m afraid this might just be a case of practice makes less imperfect. I think part of why I’m “smart” is that my brain just won’t shut up (seriously. It’s annoying), so tends to gnaw at problems like a dog with a bone until they give in, which has given me a lot of practice at trying to figure things out. Really, this might be the best advice I can give you, but you’ve probably heard it so many times that it’s redundant: Practicing solving problems and figuring things out makes you better at it. Still, I think there should be things you can do above and beyond that – practice is no good if you’re practicing doing something badly. I’d love to have a firmer idea of what they were.

Fitting it all together

I like to think of this as a process of exploration. You start somewhere simple (I find “actually using the product” to be a good place to start). You look around you and, step by step, you explore around you while doing whatever jobs you can find in the areas you currently have access to. Your colleagues will help you find your way, but ultimately it’s up to you to draw your own map of the territory and figure out how all the different bits connect up. Think of this post as my personal and eclectic guide to software cartography.

Does it work? Beats me. Certainly I seem to be doing something right, and I really hope that this encapsulates some of it. I think it’s mostly good advice, but there’s definitely a bit of a danger that I’m cargo culting my own brain here.

If you try any of this, do let me know how it goes, and please do share your own ideas in comments, email, etc. because I’d really like to know how to get better at this too.

This entry was posted in life, Open sourcing my brain, rambling nonsense on by .

Thesis: Job hopping is good for companies

For some reason, I’ve seen a few pieces recently on us “millenials” and our job-hopping tendencies. It’s certainly a thing I do. I’ve worked for two companies for ~ 3 years (one slightly under, one slightly over), one for a year and a half and a few short several-month stints. (This isn’t counting Lumi, my current one. No idea/comment yet on how long that one is going to last).

A lot is mentioned about the structural reasons for this, and how it makes total sense from the employee side of things. One thing I don’t think is often mentioned is that it’s actually really useful for the employer’s point of view (ok. This is often mentioned to be the case for cynical reasons of it meaning they don’t have to be loyal to their employees, but I for one am disinclined to count the loyalty of the corporation hive minds for much of anything anyway).

From the company’s perspective it sucks when people leave. But people leaving you readily comes with a pleasant side effect which I think might outweigh its cost: people also leave other companies readily and join yours.

Why is this a good thing when compared to just having the same people stay?

Because groups of the same people who have been solving the problem together for some time start to experience a very stagnant meme pool. They’ve all been thinking about the same things for some time, and they’ve been doing so in close collaboration. The result is that they will have broadly shared blind spots and habits. They can get very focused on solving the wrong problem, they get used to things in a “We know that’s shit but we’ve largely gotten used to it or figured out ways to ignore it” way, and they’ve got very used to specific ways of doing things as they’ve mostly been exposed to the same set of ideas.

And this is where constantly bringing in new employees helps. They’ve a fresh perspective grown in a different set of ideas. They’ve seen different ways of doing things and can cherry-pick the best of them to propose here (“Hey, this problem you’re stuck on, I’ve totally seen it before and we solved it this way”). They also have a fresh supply of outrage at the things you’re doing wrong – sure, this can be annoying. It can also be really useful because sometimes those things you’ve been ignoring aren’t actually harmless and are in fact ticking time bombs and it’s really helpful to have someone shouting about them and getting them fixed.

This entry was posted in Uncategorized on by .

More on labels and identity

I’m heading to Nine Worlds later today, which means that instead of getting ready I’m procrastinating by thinking about anything other than the fact that I’m about to spend nearly three solid days surrounded by a very large number of near strangers and having to function socially in their presence.

This caused me to think about the you are not your labels post again and reminded me that I had promised a follow up to clarify my position on some things. I still don’t have a total follow up, but some of my thoughts on the subject crystallized while I was thinking about them in the shower (the shower is a wonderful place for composing thoughts), and I thought I’d write them down while they were in my head.

Identities are important

Apparently one of the vibes I gave off in that post was the standard “privileged person complains about identity politics because it’s so divisive“.

Allow me to state categorically: Fuck that. Identity is super important.

Often when something is described as “divisive” what is meant is “I hold this opinion. You hold that opinion. Therefore you are being divisive by holding a different opinion to me”.

Implicit in “Identity politics are so divisive” is “But aren’t we all the same really?”. It’s very easy to think we’re all the same if the dominant narrative of society is that everyone is like you (note: This is true even if you’re not actually in the majority. Witness the “male as default” thing despite the fact that men are a slight minority). Identity politics is only divisive if you hold the opinion that everyone should act like the default.

So, yeah. My point was in no way intended to diminish peoples’ identities. I apologize if it sounded that way. Identities are important and we should talk about them more, not less.

Labels are important

Labels are super useful.

As well as just the basic fact that language is basically our species’ hat – it’s most of how we actually get things done – labels serve a lot of useful functions.

When you’ve named something you’ve acknowledged that it’s a thing that happens reasonably commonly. When there’s a word for something you get to go “Hey! I’m not alone! There are other people like me!”. This can be really helpful – a lot of people think there is something wrong with them because they’re different from everyone else right up until the point where they discover that there are all sorts of other people like them (I don’t necessarily think it’s a good thing that we need other people like us to feel comfortable with our identity, but it’s a thing that happens whether I like it or not and I’m certainly not going to judge people for needing it).

It’s also useful in group formation. Having groups is useful – it gives you more force when fighting for equality because you can share a voice, it surrounds you with people who understand your problems, etc. It’s much easier to form a group around a concept when you have a label for that concept.

I personally don’t feel strongly about any of my labels, but that’s a personal choice which I wouldn’t especially encourage others to follow. It’s just how I work.

So, labels are great. I encourage you to use them freely and happily, should you desire to do so.

Labels are not identities

Hopefully I’ve now convinced you that the reason I think my point that you are not your labels is important is not because I think either labels or identities are unimportant.

In fact, the reason I think this matters is precisely because they both are so important.

The key thing is that they’re important in different ways. They’re highly connected, and both feed into each other, but they are distinct things which are important for distinct reasons. Sometimes the difference is subtle, sometimes it’s really not.

But what happens when you conflate them is that that difference is erased, and the way you treat each is distorted to match the way you treat the other. If you consider a label a part of your identity you may get very angry and judgmental about other peoples’ usage of it. If you consider your identity a part of your labels, you may get a form of impostor syndrome where you have a platonic ideal of what that label looks like and feel terrible about yourself for not matching that platonic ideal.

This is the key point I was trying to get at which I don’t seem to have adequately conveyed last time. It’s not that labels don’t matter or that identities don’t matter, it’s that the difference between the two does matter.

I may have more to say on the subject at some future date, but that’s all I’ve got for now. Hope it helped clarify my position.

This entry was posted in Feminism, life, Open sourcing my brain, rambling nonsense on by .

Things you can do to scrabble

I’ve recently had my biennial family reunion. Amongst many other things, this means I’ve spent a lot of the time playing Scrabble.

I’d recently read this paper about “Richman” games where you take a game that is normally played with two players taking it in turns and convert it into a game where each turn is an auction for who gets to play with the winner playing the loser. It occurred to me that this would work very well for Scrabble, and this line of reasoning caused me to think of a whole bunch of other different variations.

I’ve not played any of them. Most of them are likely to be terrible. One or two might turn out to be good ideas.

Richman Scrabble

This is the idea that started this off.

How to play: Add some sort of currency token to the game. The currency should not be points, as that causes the game to have unfortunate “rich get richer” effects. Possibly how many tokens you have left at the end of the game should be added to your score. Each player starts with an equal number of tokens (say 50).

Each turn is played as follows. Everyone is given some time to study the board (say 1 minute). They then must submit a sealed bid (by putting tokens in their hand and holding it out). The highest bidder wins the right to play. If there is a draw the winner is determined randomly in some manner. They pay the amount they bid, distributed evenly amongst the other players (bids must be a multiple of the number of players – 1. So if you have three players it must be even, four it must be a multiple of three, etc. This ensures they divide evenly). They now take their scrabble turn as normal.

How would this change the game? One really annoying thing in multi-player Scrabble is when someone takes the perfect place for you to go. This would allow you to bid higher in those cases to have a chance of getting in there. Adding the currency to your score at the end provides a nice grounding of the value of the currency in the points of the game, but isn’t strictly necessary.

Letter queue

Another currency based system. You could use this either separately or together with the auction system.

Instead of drawing tiles randomly there is an ordered queue of tiles (at least 7). Each tile has a number of currency tokens on it. When you pick up a tile you get all the currency on it but must put one token on each of the tiles that comes before it. So e.g. when picking up the 7th tile you pay 6 tokens. You pick all your tiles, then you refill the queue by drawing tiles at random.

This leaves an element of chance in it but reduces it slightly. You can take less effective tiles for the value they’ve accrued if you think you can use them, or you can pay money for the optimal tile.

Random winner

This is a change you can make to any game where the victory is determined by scoring. Rather than having the winner be whomever has the highest score, the winner is chosen randomly at the end with a player winning with probability in proportion to their score.

Why? Because this means that a slight advantage in ability translates to a slight advantage in chance of winning. It’s much like the argument for random voting over FPTP.

Additionally, in a system where the highest scoring player always wins, once you’ve got a significant point advantage it’s in your strong interest to shut down the board and make it as hard as possible for people to score well.

I suspect in practice this would be quite annoying to actually play – it’s a situation more analogous to electing a president than to electing a representative, and I don’t really like random voting for such systems.

Random ending

A special tile is introduced to the mix. As soon as this tile is drawn, the game is over. Everyone’s current hand is deducted from their final score.

I think this would be interesting. Instead of a hotly contested endgame, your score at every point matters. It also discourages keeping high scoring tiles in your hand during the game because at any point the game might end and they might cost you.

Single word scoring

This is in the most scrabble specific of the changes, and it’s also probably the most controversial for hardcore scrabble players.

Instead of getting to score all the words you played, you only get to count the highest scoring word.

Yes, this completely changes the tactics of the game.

Why would I suggest such a thing?

Because in current scrabble, effective play makes the game less fun. Playing tightly filled blocks of words is a very good scrabble tactic – you can easily get a lot of points off each play – but it makes continuing the game like pulling teeth. Having a “highest word only” scoring system instead encourages playing long words which open out the board a lot more.

As a side benefit, it also reduces the advantage of having drawn high scoring letters.

In conclusion

I don’t actually know if I’d want to play any of these. I think it might be fun to try though.

In some ways a lot of the appeal of scrabble is that it’s not actually a very good game. Tinkering with that might disrupt that, or it just might uncover a good game inside it.

This entry was posted in Games on by .