What I’m Reading: 13 of My Favorite Web Development Newsletters

Keeping up to date with the ever-changing world of web development is tricky. You can either get overwhelmed by the amount of JavaScript frameworks and new shiny projects that promise you 10x productivity or you can just say, to hell with it and pray to not be left behind on the web development world.

I’ve consolidated my favorite sources of development related newsletters to share.

Continue reading

It’s 2015 and drawing text is still hard (WebGL, ThreeJS)

Preface (TL; DR):

  • After reading this blog post you should know about some techniques and performance optimizations around rendering text in WebGL/OpenGL ES. (Signed Distance Fields) SDF + Mesh Merging + Texture Mapping are the answer, and are the correct set of compromises in terms of performance and quality *for us*. Our “String Texture” method was the most performant way to render text that we found as long as an application didn’t have “canvas zooming” needs.
  • Here are links to all the demos in this post.
  • We have open sourced our rendering engine Cartogram. It provides a nice abstraction on top of ThreeJS, and a lot of tools in a world where “mesh merging” is the default. Feel free to play around with it and use it in production. Docs, more optimizations and interface changes are coming soon!

Continue reading

Readable JavaScript Tests with Object Builders

Building objects purely for testing purposes is often tedious. Let’s walk through the wondrous world of using design patterns to improve your JavaScript tests.

Over the past weeks we’ve been porting features to our new Event pages. Events are complicated, and the front end of the event page that supports them is feature-rich and has to deal with all sorts of different states an event can be in, in addition to all the types of ticket an event can have. As you can imagine, writing tests to cater for all these different scenarios can get tricky fast.

Continue reading

Make Animations For Users NOT Developers

I love nothing more than going big with a full screen, sweeping, sliding and stomach-churning animation. But I’ve come to the painful realisation that when I’ve used these in the past I’ve added them for myself and NOT for the user.

Recently, I’ve been working on bringing more animation to Eventbrite, so I wanted to share three lessons I’ve learnt about how to get the most out of animations: Animation should provide affordance, reduce friction, and delight the user.

Continue reading

Tech Talk: Db Anti-Patterns and Service Integration

Last week we teamed up with SF Python Meetup to host another great Python Night. 180 Pythonistas, 71 pizzas and a full keg of beer later, we’d say it was a great night.

We kicked things off with lightning talks by Safia Abdalla on Data Wrangling with Python and Alison Alvarez on 2-D Spatial Data using Shapely.

Managing Identities: LDAP, Google Directory, and Django

Scot Hacker, a web application developer at the California College of Arts and creator of bucketlist.org, took the stage first with a talk on the Django-based system they’ve created at the California College of Arts to help end-users and staff create and manage identities, passwords, groups, and permissions. Scot demonstrated how the system is unusual in that it uses almost no data modeling of its own, relying instead on communication via python-ldap, Google and Workday APIs, and old-school file shuffling to negotiate communications with other systems.

Dubious Database Design

Eventbrite’s very own Andrew Godwin, Senior Software Engineer, Django core developer and the author of South, the Django migrations framework. Andrew took us through advice and war stories (and failures) he’s faced in database design.  From re-implementing indexes to rendering templates purely in the database, we walked away from Andrew’s talk with red flags to look for and hopefully a few less real life failures we’ll need to learn from.

Building Eventbrite’s New Listing Page

Eventbrite has just released its new event Listing page. Built for the company’s focus on ramping up our two-sided marketplace, it features a modern and responsive user interface designed to work across all mobile devices. It is a layout that strives for clarity and cleanliness across all event listings. Let’s take a look at the Front End aspects of this project, how we built it, and the Responsive Web Design techniques we used.

I had just joined the Eventbrite team when this project kicked off, it was a high priority product that took a lot of planning and resource gathering by the team from lots stakeholders across the company. I had worked on responsive projects previously, but none that had as much care and focus on best practices as this one.

Why Update Event Pages?

There are lots of reasons why we wanted to update the event pages (I won’t try to cover them all here), but the primary focus of the project was to improve the mobile experience.

Anyone who has bought a ticket on Eventbrite through our mobile web interface (not our fantastic native apps) will agree that the experience wasn’t perfect, we’re the first to admit it. Our less-than-great mobile interface was using a completely different code base, with a different stack (jQuery mobile). This led to several undesired consequences, not least having to constantly maintain two codebases, so when we wanted to implement a change we had to do it twice (and often in two different ways).

Add to this the fact that the classic desktop UI has aged since its original inception, the need to unify the interface into a responsive design, and to improve conversion rates for our organizers, we knew we had our work cut out for us. Our mission was to create a Responsive, Performant, Accessible and A/B testable listing page with a cleaner codebase.

Continue reading

Building a Marketplace — Search and Recommendation at Eventbrite

These are exciting times for Eventbrite! Since our beginning Eventbrite has served a platform for event organizers. We allow organizers to market their events, message their attendees, and most importantly we take care of the hassles associated with selling tickets. But recently we have began to take a more active role of connecting potential attendees to the events that they will enjoy and in doing so, we are becoming the marketplace of events!

Personalized Discovery – the Center of the Marketplace

And at the heart of this transition to a marketplace of events is the notion of discovery – the ability for users of our site to serendipitously discovery events that they will enjoy. At Eventbrite, we think of discovery as occurring in two predominant modes: search and recommendation. In search, the user is actively telling us what type of event they are looking for, and it is our job to return results that are most relevant to their search. In recommendation, Eventbrite will provide passive users with recommendations for events that they might be interested in. Personalization is an important aspect of discovery as we hope to provide users not only with recommendations of popular events or search results that match their query, but we also want to tune our recommendations and search results to match individual user preference based upon their previous interactions with Eventbrite and the things that they have explicitly told us about themselves.

But this is no small undertaking, and Eventbrite has some interesting challenges to overcome. A chief concern is that, unlike movies or consumer goods, events are an unusually short-lived type of product. Netflix and Amazon use customer interactions to build rich recommendation models of their products through a technique called collaborative filtering. But when an event is published to Eventbrite there is no user interaction data and by the time the event is finished we may have only started to adequately understand how an event may be matched to our users. Though this situation will be challenging, we believe that is can be overcome via a hybrid approach – a combination of collaborative filtering and content-based recommendation and search. Read on…

Blueprints for Personalized Discovery

We are still in the early stages of building out our discovery platform, but we have some good ideas about where we want to go and how we plan to get there.

A major component of our strategy is collaborative filtering. By watching how users interact with the events in our inventory (for instance through clicks, purchases, shares, etc.) we can build a model of user-to-event affinity. Currently we are using this affinity model to send personalized event recommendations to users that receive our event follow-up emails. And right now we are rolling out a new “related events” feature on our event landing pages that is driven by this same user-to-event affinity model. The model is quite flexible, so in the future we may use it to recommend events customized for a group of users (think “night out on the town” with friends), or we might tune our related events feature so that it the related events are further personalized for the viewing user.

But, as alluded to above, one of the short-comings of collaborative filtering is that building a model requires quite a bit of user interaction data, and at the moment an event goes live there is no interaction data and thus no chance that the new event will be recommended. Because of this we will also rely upon content-based strategies for recommendation and search. Initially this will be based largely upon the organizer-specified categorization for the events and the text we find in the title and description fields (along with filters on things like location). But we are also looking at creating an event tagging system which will allow for much more finely tuned categorization of events. We are also building up user profile pages and we may eventually allow users to tag themselves with the same system being used for events. This would make content-based recommendation as simple as finding events that have the same tags as the user.

There are some problems though in having two competing recommendation systems. How do you combine the results provided by each system? Is it really a good idea to maintain two competing systems which probably have their own technology stacks? And do you really want to query both systems every time a recommendation is required? We think this seems silly. So, we’ve decided to roll both collaborative-filtering and content-based recommendation into one system and we’re doing this with search technologies. Think about it this way, search engines are natively good at content-based search and recommendation – you just store the text and categorization for each event in the search engine and then you query it as you normally would. Then, if we want to combine this with collaborative-filtering, we have to find a way of including a new field or making a new type of query that incorporates the information from the user-to-event affinity model. As it turns out, there are a few different ways to do this; but that’s a discussion for a different blog post! Once content and collaborative filtering information are in the search engine then the two sources of information can be balanced in much the same way that matches in the title and description field would be balanced in more mundane uses of search. Ultimately search and recommendation become one and the same thing and both are all the more relevant because they incorporate content-based and collaborative filtering strategies.

Will it Work?

Well, this is the most exciting question of all, because we don’t know yet if this will all work as we’ve planned. In a previous life as a search consultant I built a prototype that closely resembles the system we’re working right now, and the results were very encouraging. But this time we’re building for much larger scale. However I have seen search engines perform some amazing feats of scaling in the past and I have a strong suspicion that search technologies will not let us down here.

If you’d like to see how we’re progressing, then check back in to the Eventbrite engineering blog from time to time. In the coming months I plan to blog fairly regularly about our progress. So pull up a chair, you’ll have a front-row seat to all of the action.


P.S. In case you’re interested in the broader discussion of search relevance, then you should check out Taming Search, a book I’m writing with Doug Turnbull. The techniques I’m using here will be covered in depth in a later chapter of the book. If you decided to buy the book, then please be sure to use the code mlturnbull to get 50% off the price of the book.

Type python, press enter. What happens?

Philip James and Asheesh Laroia discussed how the Python interpreter starts, from the perspective of the operating system (OS). Together, we will see the ins & outs of processes: fork(), exec(), stdin, and stdout.

It focused on OS concepts and requires no background knowledge, using analogies to Python data structures. (The talk does not discuss Python’s own initialization, such as site.py or global variables.)

Finding Spammers & Scammers through Rate Tracking with Python & Redis

We made it back from PyCon to the considerably warmer climate we’re accustomed to in San Francisco. Mica Swyers and Jay Chan from the Eventbrite Integrity team provides an introduction to rate tracking as well as an explanation of a particularly cool way to implement it. They go over what rate tracking is, why you would want to do it, and then how you can use build a Redis-backed “velocity engine” in Python to do just that.