The first major version of our mobile product was launched at the CTIA mobile conference in Las Vegas. The work and initial feature set included:
As part of the initial mobile product, Status Updates were introduced. The initial implementation allowed for update via SMS or via an AJAX editor on the profile page. A new filter was introduced to the Friends page that enabled viewing of friends with their Status messages ordered by recency. In retrospect, this was an extremely primitive precursor to News Feed.
Status Updates were built with the idea of activity and location metadata in mind, for which we applied and were awarded a patent. For the record, I am generally unsupportive of the existence of software patents.
As we were constrained on design resources at the time, I indulged my affinity for primitive graphic design with our mobile launch. Using Microsoft Paint, I crafted a set of mobile icons.
These icons were used to indicate a user's presence on the site or source of a Status Update. The "fire" icons were an easter egg feature. The online now icon, since retired, has come to be affectionately referred to as the "drunk computer."
After the launch of SMS, we added the ability to upload photos via MMS. This functionality was built via SMTP handling with a set of scripts to parse and sanitize text and photo content sent from mobile devices. This marked the introduction of the Mobile Uploads branding to the site.
The first XHTML version of the site was developed and launched in the middle of 2006 at m.facebook.com. The implementation covered core functionality, with support for basic device capability detection.
As the volume of product discussion on internal email lists grew steadily, it became clear that we needed a more structured system for communicating about new ideas. I developed a basic internal tool that employees to post and discuss ideas for the company and product, with simple interfaces for voting, commenting, and managing subscriptions.
Over time, the product gained ownership from a dedicated internal tools team and evolved into a much more generalized discussion tool used for all sorts of internal communication.
Throughout 2007 I spent time working on various aspects of the Platform API. Some examples include:
I began work on the Thrift framework in early 2006 as part of the Mobile SMS implementation. Work continued off and on until the initial open source release in April 2007. Thrift is now an Apache software project, living at thrift.apache.org.
After the success of the Ideas Page, I developed another internal productivity tool called Quikvote. It was a very simple polling mechanism with an elegant, minimal UI. Quikvotes came into regular use for fast, low friction polling of employee opinion on company or product issues.
I began developing the Friend List feature as it was becoming clear that a single notion of Friends would at some point be insufficient. While we did not expect most users to spend time manually curating lists, it was clear that we would need a future mechanism for offering finer-grained control over privacy, for which a list management framework would be necessary. The Friend List product was launched later in the year, along with a redesign of the Friends management page on the site.
Our original privacy implementation was based upon segmenting users into networks, which could be schools, workplaces, or geographies. Access controls were based on those network affiliations. After we had completely opened registration on the site and dropped the requirement that users affiliate with any network at all, the model was growing outdated and did not map well to the UI.
We overhauled the privacy implementation to be object-based, with a common mechanism for representing the ACL for any content on the site, whether it is a specific item like a photo album, or a general concept like the visibility of a profile. This new system made the privacy system more powerful, supporting the specific inclusion and exclusion of individuals, lists, or networks.
In early 2008 Facebook formed an independent Product Management organization, formerly treated as a function of Engineering. I switched roles and joined a team working on a major redesign of the Profile page.
Internally referred to as FB95, this project replaced a profile based upon a static layout with boxes for each application with a profile oriented around a unified Wall. This new Wall merged content created by the profile owner, their friends, and applications into a single time-based stream. Interactivity was focused around a single unified composer that allowed the user to create multiple types of content from a single place. Our focus shifted more overtly towards dynamic sharing and communication, with static information being represented on a separate Info tab.
This profile redesign went hand in hand with many changes to the developer APIs, beginning the process of deprecating the boxes metaphor in favor of what would eventually evolve into the stream publishing APIs. One of our largest user-facing changes since the News Feed, we rolled this profile redesign out over the course of a couple months with a user opt-in period.
In return for my efforts, I earned a tremendous quantity of hate-mail and a definition on urbandictionary.com.
I built a working implementation of a profile theming system that generated CSS rules from a simple editor UI, internally referred to as Wallpaper. We correctly decided against launching this, as the value it provided was not worth the costs it would have incurred to product complexity and future maintainability.
Up until this point, the frontend implementation of feed stories on the Profile was largely disjoint from the homepage News Feed implementation, for various historical reasons and due to them requiring different backend implementations. I lead an effort to refactor a significant amount of this code into a single hierarchy with shared rendering and data preparation. Part of this effort involved developing a staged data preparation framework called Preparable.
We spent a few months in 2009 exploring ways in which we might modify the friend connection model and UI, giving greater prominence to connections beyond symmetric friendship. We ultimately decided against launching these changes, as the UI and cognitive complexity outweighed the potential benefits.
Fatigued from frontend work, in mid 2009 I formally returned to the engineering organization and began work on a significant restructuring of our dependency management system. I designed a system for declaring and loading modules in PHP that bore some resemblances to Python modules, with a more structured file naming syntax and explicit require statements. This system was coupled with a set of static analysis tools that would verify that modules were not referencing symbols that they did not directly depend on and avoid circular dependencies.
While it aimed to solve some specific infrastructural problems, flib was just as much a cultural effort aimed at creating a new context in a growing codebase where an explicitly renewed focus on code quality could be communicated and enforced through tools.
Conceived in collaboration with friends at Stanford's Persuasive Technology Lab, peace.facebook.com was aimed at showcasing antecedents to peace facilitated by communication on Facebook. During a hackathon in July, I assembled a team to help design and build the site, launching it at a public event in October.
Throughout 2010 I spent most of my time working on an MVC framework for page generation called Alite. Originally developed to power the lite.facebook.com experiment, a fair amount of work was necessary to enable the generation of full site pages with interactive chrome, chat, etc.
Much of this work was oriented around refactoring legacy code, porting key page components into the flib framework, and evangelizing through code review and support. Through this work I formed a deeper understanding of software as a growing organism and the elusive nature of software quality, which I wrote about on the engineering blog.
For the third or fourth time in my Facebook career, I implemented a redesign of our Friends management page. We simplified list editing, added algorithmic suggestions, and removed legacy components. The construction of these new pages provided a good trial run of building new components exclusively using the Alite Framework.
I redesigned our chat sound to feel more organic and human. The sound can be heard at fbcdn.net/sound/pling.mp3. I have written about the process of its inception on Quora.
Once again ready for a change of pace, I moved out of our frontend infrastructure and began work on prototyping our next generation of mobile UIs, primarily based on HTML5 and initially targeting smartphones.
I took a sabbatical leave, exploring many of my interests and hobbies that had not received my time and attention over the past five and a half years.
I returned to Facebook to help prototype new touch-based interfaces for the iOS platform.
For my final chapter at Facebook, I constructed a 4000+ node custom LED art installation for Cafe 18. The code is open source and available at github.com/facebook/caf8teen.