Food: SF and South Lake Tahoe

A friend sent me an excellent article this morning entitled Why SF Restaurants are Suffocating. It’s great. You should read it.

I think over the next several years, these folks will realize the opportunity to bring their skills out of the SF pressure cooker to more accessible places, without really sacrificing much.

I moved away from SF almost exactly a year ago. Since then, I’ve had lots of people ask me about it — is it worth it, how’s the cost of living, what do you miss, etc. An in-depth answer would take its own (long) blog post, but I will say unequivocally that I do not regret moving to South Lake Tahoe. I love living here. There are things I miss about SF, but the benefits of living in South Lake Tahoe far outweigh the costs.

Reading the article above reminded me of how much I do miss the food in SF.

Heaven on earth. Taqueria Cancun in Bernal Heights.

Now, I am not a foodie. As a kid, I had a notoriously picky diet. But living in SF for 8 years completely spoiled me. From Mexican to Middle Eastern to Burmese to Ethiopian to Japanese ramen, I don’t need to remind you of the immense diversity SF has to offer. (And if you’ve never been to Taqueria Cancun….you have my sympathy.)

Mountain economies like Tahoe have historically relied heavily on tourism. As such, the food scene is bifurcated into two distinct camps: the extremely cheap, not-so-healthy-or-delicious option for the local residents, and the higher quality but overpriced option targeting weekend tourists.

Recently we’ve seen lots of development away from this situation. South Lake Brewing Company often hosts wood-fired Pizza (in addition to their delicious beer). Sidellis offers sausages, which totally satisfies my love of Rosamunde in SF. There are a handful of great mexican spots, such as Maya’s, Chimayo, and Verde. BBQ and good burgers can be found at Ten Crows and California Burger. And there are many others.

South Lake Brewing Company

There is a growing technology scene in South Lake Tahoe. It’s active enough to start a startup. Many folks work from coworking spaces. We have good coffee. And coming this spring, there’s even a Whole Foods up here. The long-time residents can feel the seismic shifts. And, if you include the entire Tahoe Region (Truckee, Incline Village, and Reno), it’s even more vibrant.

Ten Crows BBQ

I don’t personally know anyone in the restaurant industry in SF. I wish I did. I’d tell them that there is a large market opportunity to bring great food to places like Tahoe. You can afford to live here, to save for retirement, to enjoy the outdoors, and build your career.

Jargon mismatch

From Boz’s Mission, Strategy, and Tactics:

Interestingly, this post is an example of something even more paramount than having a mission: providing a common language for the team to use that everyone understands. Ensuring people use terms consistently isn’t just pedantry, it is potentially critical to scaling execution.

I couldn’t agree more emphatically. One of the most interesting lessons in my career has been to watch at a startup as various groups of people used the same words to mean different things, and used different words to refer to the same thing. I watched as the miscommunication was simply overlooked and bad things happened as a result.

I can’t figure out why people disagree with the importance of this antipattern. At a startup the most precious resource is time. The reason we impose processes on teams as they grow is to ensure communication is fast & clear. When this happens, precious time is wasted. Often at great cost.

I think we need a word for this anti-pattern. Jargon mismatch is the first one that comes to mind. By way of example, let us take the movement in many software engineering circles to adopt the functional approach of using immutable data in our applications. Don’t change the data, amend it in the most universal of data structures, the log (or some persistent data store). Reading hacker news etc you’d think this is a relatively modern approach — and it is, for software engineering.

But accounting has known about this for centuries. For millennia. The Romans used transaction logs and an always-amend style in their ledgers. The basic premise of accounting is that things should always sum to the same thing. The same inputs should always produce the same outputs. It’s identical to using immutable data in functional programming.

Another example: I often heard the folks at Bloc use the phrase “rework the model”. As our company grew, the sophistication and depth of our operating model grew: we had forecasts, waterfalls, and kept track of our finance in multiple dimensions (bookings, cash, GAAP cash, etc). In order to support these new and different ways of tracking the business, the undergirding of the spreadsheets needed to be updated.

It’s refactoring. Do business partners justify spending their time on this effort (as engineering teams often do with refactoring)? Of course not. They don’t refer to it as tech debt, they just get it done in service of the objective. And there’s no risk that they get carried away refactoring their models. (Well, at least the folks I’ve worked with.)

There are lots of other examples. Take acronyms — it’s one of the most infectious patterns at growing companies, and I think the reason it’s effective is because it provides this common language (with the trade-off of making the language incomprehensible to outsiders).

I’d love to hear about your jargon mismatches.

So far this jargon mismatch has been one of the most illuminating discoveries of my career.  We have so much to learn from each other — so few of our problems are new. It’s a near certainty that someone else has solved the problem you’re working on.  It’s a matter of moving our egos aside and finding the answer. If we can’t find one, it’s likely we’re looking in the wrong place.

Stripe Elements and Turbolinks 5

I was having a hell of a time getting Stripe Elements to work with Turbolinks 5, specifically the Turbolinks iOS wrapper. Hopefully others who see the same issues can benefit from what I learned.

The symptoms were:

  • Stripe Elements worked in the desktop browser, in mobile safari, but not in the Turbolinks-enabled iOS app

What I learned:

  • For Turbolinks-enabled iOS apps, all forms must be sent via AJAX w/ remote: true (or the absence of local: true depending on your version of Rails)
  • When using rails-ujs, you must intercept the ajax:before event and call event.preventDefault until the Stripe JS library has had a chance to retrieve the token
  • Once the token has been retrieved and added to the form, you must call, 'submit')
  • In your interception of ajax:before this time, you must not call event.preventDefault() since you now have the token

For reference, here’s my javascript:

At least I learned a lot about how rails-ujs, turbolinks, and Stripe Elements work under the hood!