Engineering

Conspire product features aesthetic

Is It Possible for a Feature to Be More Aesthetic Than Practical?

Facebook let me know last night that I’d been poked twice since… not sure when since. I didn’t log in, let alone check who the mysterious pokers were.

But it got me thinking, despite my disinterest, how I’d feel if Facebook killed the poke. Not terrible, obviously, but I’d miss it. To draw a tenuous analogy, it’s like those cube-shaped SUVs with the asymmetric back windows… Googling… like the Nissan Cube (duh). I don’t want to drive one, but I’m glad they’re out there, doing their thing, being weird.

Continue Reading

product features Conspire

The Lean Product, or When to Kill a Feature

Killing features is hard. We put lots of time and effort—and a good dose of emotional energy—into creating and nurturing them. But even brief hesitation to excise an underperforming feature can be costly.

Think about it: If you ship four features a month and you have a hit rate of 25% (which is high; I’ll come back to this), waiting even two months to kill underperforming features means you’re supporting 75% × 4 × 2 = six dead-weight features at any given time.

Continue Reading

Browser plugin AB testing with Angular and Mixpanel

In order to get more people using our new Chrome extension, we recently put it in invite-only beta. At first, we added an invitation link on the right side of the header (Figure 1a) in the font and color scheme of the extension, which is to say, not particularly visible. To increase invitations, we decided to highlight the feature with a more salient but dismissible invite banner. In addition, we wanted to try a couple different designs (Figure 1b and 1c) and measure their performance with an AB test.

AB testing extension Conspire

Figure 1: a: original design, b: simple banner, and c: banner with contact

Continue Reading

Speeding up an Angular Chrome extension

We recently launched a Chrome extension to expose useful data to our users while browsing LinkedIn, Angellist, and Gmail. Quickly, requests through the plugin grew to dominate the load on our servers. The bulk of these were through Gmail, as we query our graph to expose common contacts with the sender for every email message you open – lots of passive load. The performance of the extension grew sluggish and the load meaningfully impacted other areas of our application. We had a problem.

Continue Reading

Lazy JSON

TL;DR: If you’re only accessing part of a JSON document, avoid the overhead of wholesale, eager parsing by skimming and lazily parsing only what you need. Get or contribute to the Ruby gem at github.com/conspire-org/lazy-json.

The use case

Typical JSON parsing converts the JSON document to an in-memory object you can navigate/update easily. For many uses, that’s the right approach. If you’re going to access lots of parts of the document, better to process it in one pass.

Continue Reading

Why we aren’t using the Gmail API (yet)—updated

Update: A Google engineer reached out to us and explained some of the finer points of the API’s quota and speed limits. With his help, many of the complaints in this post are no longer applicable. We have now been able to reliably achieve 11,000 messages per minute with the Gmail API. Check out the […]

Two-Factor Auth on EC2 with Public Key and Google Authenticator

Public key authentication is a powerful authentication mechanism, but it presents a problem when the device a user or employee uses to connect to the protected machine gets compromised or stolen. Adding a second factor mitigates the problem by requiring information not stored on the compromised device. This post shows you how to set up […]

Coding the Movies (Don’t Fake It)

When David Fincher hired me to build software effects sequences—animations of code and computer interfaces—for Zuckerberg’s and others’ monitors in The Social Network, he threw hackers everywhere a bone we’d been slavering over for a long time. At one point during the project a set decorator asked me, “Why did they hire you?” After the […]

Akka at Conspire [Part 5]: The Importance of Pulling

In our final post on our series about Akka, we’re going to cover a common pattern we used in building our backend: pulling. This pattern is not our creation, our work here is largely based upon work done by the Akka team (including the code itself). This post is intended to explain the motivation and […]

Older Posts