comment 0

On quitting my current life

I’ve quit my job. Actually, I’ve quit my current life. My wife Erin and I are going through a divorce. We love each other very much but we simply weren’t getting what we wanted. We’ve decided to let each other go out of mutual compassion and love; we just want each other to be happy.

About Instacart, it was the first corporate job I ever had and in many ways the best job I’ve ever had. I loved getting to walk into the office every morning and be surrounded by so many people who respected me and wanted me to be there, who made me smile and whom I felt so much warmth from. I’m so thankful that I got to grow there, both as an engineer and as a human being.

I’m going to spend the next year or so setting up passive income streams and traveling. Or at least that’s the plan. Honestly, I’m terrified. It feels like I’ve smashed apart my old life to make room for a new one, but that new one has yet to take shape. I have no idea what’s ahead of me–I like it, and also it scares me.

I’m also going to be blogging here for real, starting Monday. Part of quitting has been a desire to live my life as authentically as possible, and if you know me at all, you know that sharing and talking about my experiences is an irrepressible part of who I am.

Cheers, to a bold new future. I hope to see you there :-).

comment 0

The slow burn

Friends. This may come as a surprise to some of you, but I’ve decided to put my video game ambitions on hold for now and focus on finding a full-time position as a developer here in the Bay Area. For those of you who know my work and my values: if you know of an opportunity where you think that I might make a good fit, I would love to hear from you.

For those of you who are curious as to why…

When I left my job about a month ago, I decided to pursue creating historical video games. I wanted to travel the world doing my own original research and making games featuring voices that don’t make it into mainstream history. I talked with a lot of you and received so many offers of help and support, especially from my StartingBloc DC ’16 community, who helped me prototype a crowdfunding campaign.

That beautiful vision still lives on in my heart, but the truth has become a little more complicated.

Quitting my hectic startup job was more than just about chasing my dreams, it was about building a life with my wife Erin in which we could take care of each other and ourselves. While I pushed ahead toward my goal, Erin and I have both wondered, what did she want? If pursuing video games was my way of taking care of myself, what did taking care of herself look like? To be honest, pressing ahead with my dreams while we weren’t able to answer these questions for Erin has caused many tensions and difficulties in our relationship over the past month.

Ironically, it wasn’t until we scrimmaged (a tool that I learned at StartingBloc) potential futures for Erin that she was able to find a goal that really spoke to her. We came up with a plan: we’re going to buy a house on a few acres of land and start a retreat. We envision a place where people can recharge, practice yoga, meditate, hear lectures on art and science, read good books, put on plays, work in a greenhouse, practice emotional authenticity and in general become whole. We want the retreat to serve as the focal point of a community of people who can find a safe and supportive space to pursue all their dreams, whether that’s making video games, planting seeds in the earth or something else.

To accomplish this vision, we’re going to need to save up lots of money, fast! Indie game development unfortunately is neither lucrative nor financially stable enough, especially for a first timer like myself, to effect that vision. We did our research and looked into all the possible avenues for crowdfunding, but ultimately even a wildly successful crowdfunding campaign would come up short. The only logical way forward is for me to set full-time game development aside and find a company whose values, mission and project align with the kinds of questions that I like to ask (e.g., how do we make diverse and inclusive workspaces in tech?) and the types of things that I like to build.

I guess partly I’m writing all this because I feel guilty about having to delay The Vote, my game about women’s suffrage. I’ve received so much love and so many kind words from people about my project, and although I originally wanted to complete the game before the 2016 election, if anything it’s become more prescient in the election’s aftermath. Yet when it comes to working to support women’s rights, the reality is that I can think of no better way than to start with the woman who’s closest to me.

I will continue to work on The Vote and other historical games, just at a slower pace than before. Perhaps it’s all for the best. It felt like I was having to rush some of the hardest and most important work for this project–finding the right communities, playtesting and cultivating a dedicated following. I’m hoping that by spreading all of that over a slow burn, I’ll be able to do it justice and gather the mental, financial and community resources that I need to do this project over the long haul.

comment 0

An emotional primer to solopreneuring, part 1

The last time when I was freelancing about a year ago, I was in a difficult place in my life. The money I was making in web development was great, but on a personal level, I was working through a lot of issues involving my family, my relationship and–it felt this way at times–my existence. Some days I remember feeling completely incapacitated by crippling anxiety, unable to get out of bed save for going to the bathroom, unable to move except to bang out a few lines of code here and there.

As painful as it was, that time was also a period of enormous growth. I read somewhere about a neuroscientist who wanted to promote a new metaphor for the human brain: our mind is like the Earth and our thoughts are like the weather. Well, it felt like I was terraforming a new planet about a year ago because I was learning for the first time in my life how to love myself. That wasn’t something I had ever been taught, neither at home nor at school.

(Looking at my peers, most of whom seem to be in a similar position, I feel like people in their 20’s can be divided into two groups: those who learn self-love and those who don’t.)

This time I’m flying solo again but with an emphasis on game development, a much riskier enterprise than web development and where the returns on investment tend to be more hypothetical than real. It’s also an area of programming that I have no prior experience in, save for a few games I made as a kid in QBASIC on my dad’s old Packard Bell in the 90’s. I’m plagued daily with self-doubt as well as a good dosage of fear and self-judgement.

Yet I feel hopeful because I feel equipped with emotional tools that I didn’t have a year ago. I’d say that the biggest three are

  1. Self-awareness of how I’m feeling
  2. Knowledge of how to articulate my feelings as needs
  3. A lack of shame around satisfying those needs and asking others to help

Self-awareness of how one feels is a deep life skill that people don’t seem to take seriously. It starts with accurately knowing whether you’re angry, sad, happy, fearful, horny, or some other basic emotion, which is a serious accomplishment in a world where emotional expression, at least speaking as a man, is modeled as either “good” or “blah.” In my case, it took me years to realize that I had never been given the chance to feel like I could feel and accept my emotions safely without having them talked over, used against me or taken away from me.

Knowing how to articulate one’s feelings as needs means moving from “I feel sad” or “I feel lonely” to “I need to sit quietly for an hour to process” or “I need to find community.” This skill is about understanding that our feelings aren’t ephemera that we should work to ignore, but rather that they are indicators and sign posts pointing to our needs. There’s a radical implication here. Given that our feelings indicate needs and that at any given moment we are feeling something (except when we’re depressed), we’re always in need, even if that need is simply to quietly feel whatever we’re feeling at the moment. I’ve found this idea to be the only reliable bedrock principle in my life. Beyond all the fickle narratives we tell ourselves about our meaning and purpose, one’s emotions are always present without justification or meaning.

It took a lot of effort to accept the idea of myself as a permanently needy creature. Our culture loads so much shame around the idea of being needful or having our needs met. We’re told to base our lives on more abstract notions like honor or duty or sacrifice, and the blueprint is always given to us externally from school, religion or family. We’re urged to follow the Truth, whatever that Truth is, and not to deviate from the Path, whatever that Path is; deviation is Sin. It took a lot of time for me to unwind this kind of thinking and to accept that to take care of my needs is to honor my existence–indeed, it honors the very meaning of (meaningless) life. And it’s OK to ask for other people to help! Actually, that’s how we make friends, by asking others to help us feel loved and admired.

I’d like to write in detail at some point about how these kinds of emotional skills can form the core of an enlightened and sustainable approach to business. I’ll say that having these skills makes me feel equipped to handle the ambiguity, emotional uncertainty and lack of structure that comes with freelancing and solopreneuring. While I may have the skills, however, it feels like I don’t yet know how to apply them in my new context. I don’t know yet how best to satisfy, say, my need for structure or my need to feel connected, both professionally and in terms of friends.

comment 0

The Mechanics’ Institute, home to world explorers

I feel like a bad ass when I walk down the street. I haven’t yet gone to any other countries or written a single game, but I’m loving my new life pursuing my dream of traveling around the world, conducting archival research and writing historical video games. I feel like a modern day Phileas Fogg.

The thing is, every Phileas Fogg needs his Reform Club and every intrepid world explorer needs his home base. Last week, I found that new home base when I acquired a membership at the Mechanics’ Institute (MI).

Read More

comment 0

Programmers aren’t engineers, they’re architects

Every once in a while, I think about a friend’s critique that programmers shouldn’t be called engineers because engineers need a strong knowledge of nature’s physical laws in order to do their job. I agreed in principle, but I wasn’t able to find a word that conveys the mastery of strategy and logical/mathematical laws involved–until now.

It might sound incredibly pretentious, but truly, isn’t the term “architect” much better suited than “engineer”?

“Architect” doesn’t have to be a pretentious title, at least intellectually speaking. Keep in mind that the Romans were some of the greatest architects of all time despite having no comparable scientific knowledge about materials the way we do today.

Not all programs need an architect. Some are very simple scripts that can be written by a mere draftsperson, an apprentice or an intern–who can also be trained as a structural engineer, but it’s not necessary.

We should also keep in mind that programming is still a young profession. Having a knowledge of a computer’s physical properties isn’t usually seen as necessary for programming, but I would argue this is ultimately a function of three factors:

  1. For the typical programmer, there are much more pressing logical and human laws that have a higher chance of affecting program performance.
  2. We have developed a successful division of labor between programmers and hardware engineers (this was not always the case).
  3. The bar for software reliability expectations is set very, very low.

I would argue (or rather, I would do something between arguing and speculating) that point 1 follows from point 2 and point 2 follows from point 3. If we suddenly started mandating–ahem, legislating?–that electronics perform as well and as reliably as, say, cars, then I think we would could see a fusion between software and hardware developers emerge. It might force a fundamental rethink about how we design electronic products. Perhaps the only way to develop profitably would be to aggressively optimize physical and logical properties for maximum reliability in an integrated manner that doesn’t exist today. (Alright, I’m full-on speculating now.)

Until that day, if it ever arrives, perhaps we should refer to programmers as architects and draftspeople. Or maybe we should go back to calling ourselves “computers.” No one seemed to object when it was “women’s work.”

comment 0

My gaming background

I grew up on a steady diet of hardcore historical strategy games.

There was the venerable Civ 2, where I would basically play Turkey in the World War 2 scenario on repeat for days at a time on a Mini-ITX-in-a-box computer I had built with a jerry-rigged 20 lb. LCD screen pulled from a cop car. Then there were the venerable Europa Universalis and Victoria series, which my middle school friend introduced me to and which started a long love affair with Paradox Interactive. At one point, I remember even buying PDF’s of their public financial disclosure statements and learning just enough Swedish to translate them because I was so fascinated by their games and wanted to learn everything about them.

Machiavelli the Prince screenshot

Machiavelli the Prince’s iconic, colorful map that made the most of SVGA graphics.

Aside from those blockbuster hits, there was a whole host of titles now considered obscure, like Imperialism (1 and 2), Balance of Power: The 1990 Edition, Inca and Hidden Agenda, to name a few that I really enjoyed. I also played a lot of not really historical but historical/political-ish RTS games like Tropico, Command and Conquer: Red Alert, and Age of Empires (loved the “Enemies of Rome” campaign in the AoE 1 Gold Edition, especially getting to play Hannibal!) Finally, there was my favorite game of all time, the legendary Renaissance Venetian trading simulator that has yet to be beat, Machiavelli the Prince.

Those games got me through my childhood. At a time when things weren’t great at home and I didn’t really fit in with any group at school (not even the nerds), single-player historical strategy games let me build my own world and kingdom. They let me feel like I could build the walls to protect myself that I never had in real life. If I wasn’t able to be accepted for who I was outside of the confines of my room, at least I got to be myself through my game worlds. Social/multiplayer gaming–whether for PC, console, table top or card-based gaming–and the nerd culture that developed around it never appealed to me for that same reason. Gaming wasn’t my community. It was my highly personal refuge.

Now that I’ve grown up, I realize that I can’t build walls around my life and I can’t make a perfect, controlled little kingdom–and I don’t want to anymore. That ambition was a survival mechanism, blocking me off from the full range of emotions (and pain) that life affords. Yet there’s something that still appeals to me about the ability to find one’s identity through games and I think that it doesn’t always have to come from a wounded place. Games can inform how we see ourselves through their stories, colors and mechanics.

Despite the fact that I shunned connecting with others through games for so long, an important part of my desire to pursue game development now is to find community as well. A lot of people find comfort in sub-communities that are really blunt about this identity function, encouraging people to dress up as their favorite characters (i.e., cosplay) or become different characters (i.e., LARPing). Those have never felt quite right to me. But I love the idea of finding people who are fellow truth-seekers, who want to improve their lives by learning from history and by questioning, rewriting and valuing historical narratives. Maybe through game development I can start to form the core of such a community.

comment 0

I quit my job

I’ve been putting off the big news, but now that it’s finally happened I can announce it: I’ve quit my job.

It’s been an amicable split. It has a lot to do with shifting priorities, especially realizing what little time we have until my wife and I plan to start having kids. Also, going on my mind-blowing trip to Chile, which made me see how big life really is. Also, a few important differences that were present from the beginning that I wasn’t able to overcome. I worked with a great team and gained lots of important experience.

So what comes next?

I’ve decided to stop putting off a dream that I’ve had since college, something that I’ve kept suppressed for a long time. It may sound crazy, but: I’m going to travel around the world doing archival research and making historical video games out of my findings. I want to tell stories that have never been told through the medium of technology. I have no idea whether it’s going to work, but if I fail, damnit at least I will have tried.

My first game will be about Valparaíso, Chile in the nineteenth century. Still in the research phase, but I’m very excited. I’ll be writing more on this blog to chronicle my ups and downs. Finally, I’ll still be doing web development on the side to bring in income, but game development will be my main focus. My wife’s support in this has been crucial and I feel really lucky to have it.

Wish me luck 😉.

comment 0

Riot.js gotchas

UPDATE (2/1/2016): Added info on opts object.

I’ve been exploring Muut’s Riot.js library over the past few days. For the most part, I really like it. It’s like a lightweight React with three key advantages:

  1. Tiny size (~10kb min’d and gzip’d)
  2. Custom HTML tags used for layout instead of JSX
  3. Very fast

While using Riot, however, I’ve noticed a few gotchas, or more generally features and patterns that are really important but aren’t explained well in the documentation:

  1. Mounted views vs. nested tags: When creating a Riot.js app, a reasonable strategy is to compose your views of nested custom tags. However–and this is really important–only the tag that you mount with riot.mount(tag) will be mounted. Sub-custom tags of your mounted tag will not be mounted, which is important because to make the custom disappear you have to unmount them. So, when creating an app, if you want to be able to use tags as interchangeable views, you must explicitly mount them so that they can be unmounted/remounted. A good pattern is to use a div with an id like #view as a mount point for your custom tag-based views (see next).
  2. You can “overwrite” mounts: If you keep calling riot.mount(‘#view’, ‘custom-tag’), passing in the same mount point each time, you will achieve the effect of swapping out custom tags/views on that mount point. There’s no need to keep track of each mounted tag and unmount before mounting.
  3. Put require() statements inside <script> tags: When requiring modules for your custom tags, place the require statements inside your custom tags’ <script> tags. Not only does this keep a tidier namespace, certain tools break when you place them at the top of the tag files (I’m looking at you, Karma).
  4. opts is a funny little creature: When you pass in a data object or attributes while mounting your tag (e.g., <tag custom-attr="val"> or riot.mount('tag', data)), the data/attributes gets saved to the opts object, which is accessible from inside your tag’s script as well as conditional attributes inside your tag. But opts is not your everyday object; specifically, it isn’t a copy of whatever you pass in. Opts is actually an empty object with no properties but whose prototype is set to the object(s) that you pass in during mount or via attributes. JSON.stringify(opts), for example, will consistently return {}. For the same reason, you shouldn’t reference opts directly inside of conditional attributes because it often doesn’t get dereferenced properly leading to strange results. The preferred idiom for handling conditionals based on opts is to assign your opts property to this and then reference the property that way. So instead of this:
      // Danger! This may not show because showMe
      // may evaluate to undefined no matter what you
      // pass in.
      <span if={opts.showMe}>Hello, world!</span>

    Try this:

      <span if={showMe}>Hello, world!</span>
        this.showMe = opts.showMe