I’m sitting here in a front-row seat for the f8 keynote. I’ll be keeping this post updated as interesting things happen…so stay tuned!
1:29 pm: Waiting for the talk to start…great seat! Music is good but a little loud
1:35 pm: Music out, Zuck in. That is an amazingly hi-res projector!
1:36 pm: FB has been learning how to work with developers, made some mistakes along the way.
1:39 pm: FB mission: “Give people the power to share and make the world more open and connected.”
1:42 pm: 24mil users at f8 ’07, 90mil users now. f8 ’07 US/International ratio was 50/50, now more like 30/60
1:44 pm: Opening up translation tool for platforms, they can use FB’s users to translate apps.
1:45 pm: Over 400k developers, more than half outside the US.
1:48 pm: Top 5k bands have more fans on iLike than anywhere else (including MySpace Music). Causes app has more users than Al Gore’s alliance campaign (the two have since merged).
1:49 pm: Over 30 different developers have been funded to develop FB apps. Flixter got $6m and Zynga raised $29mil just this morning.
1:54 pm: Lessons learned: Need to work more closely with developers. Need to align incentives better, reward good apps, punish bad apps.
1:56 pm: Walking us through new FB, explaining the new Wall.
2:04 pm: “We’ll do it live!”, giving us a live tour of the new feed.
2:10 pm: Talking about the decentralization of social networking, comparing the social network movement to the PC movement. FB expects in a few years all good applications and uses will come from sources other than FB, just utilizing their platform.
2:13 pm: FB Connect: Goals: Build the same kinds of apps across the web, share info across the web, control your info across the web. 3rd party sites can use it to pull profile info, friend lists, etc. You can also send FB hashes of your users emails and it will tell you if they are FB users.
2:15 pm: “It goes to their profile, and Christmas is ruined.” Zuck has a sense of humor…nice!
2:18 pm: Someone from Digg is on stage to demo the Digg/FB Connect inegration, nice, clean, and simple.
2:20 pm: Six Apart is next, demoing comment authentication with FB Connect, followed by Citysearch for reviews & recommendations.
2:26 pm: Profile is being rolled out over time, FB Connect Beta is today.
2:27 pm: That’s it for Zuck. Ben Ling takes the stage.
2:32 pm: They had a slide that lists universities researching FB Apps…they used a logo from Central Michigan University instead of Carnegie Mellon!!!
2:38 pm: Talking about what makes great apps, building trust, etc.
2:46 pm: Talking about partnerships with MS, Joyent, and AWS. New Developer Website (about time!). Also promising to build up a team to work more closely with the community. Applause for initial fbFund recipients, discussing Connected Weddings as an example.
2:48 pm: New program: giving out $2mil over the next 2 months. 25 finalists get $25k, 5 finalists (voted by community) get $250k.
2:49 pm: Announcing FB Verification program: Apps that feel they are Secure, Respectful, and Transparent can apply and be verified (they get a badge). Verified apps get more visibility on the site.
2:50 pm: Announcing FB Great Apps program: Apps that feel they are super-awesome (10 criteria + history of adherence to policies + minimum user base). Great Apps are more integrated and more trusted, as well as getting early access to new features and feedback directly from FB. iLike & Causes are the first 2 Great Apps, though the program is in Alpha.
2:53 pm: Talking about a more transparent and consistant process for enforcing abuse policies.
2:56 pm: FB Connect will be released for Desktop, Web , and Mobile (they have an iPhone Cocoa API).
2:58 pm: FB Connect launches full on next summer. There’s a hackathon today running until 9pm, winners announced at 11pm. That’s all :).
Update: Schrep (I’m far back right, he’s in the middle…note the ripped shirt, sorry Schrep!) was kind enough to point out that, as of bug 423377 being resolved, Firefox 3 defaults to 6 simultaneous connections. Modern browsers all use different numbers, the lowest being IE 7 with 2 (all older browsers also use 2).
One of my projects here at Mozilla (and, coincidentally, a past project at Yahoo!) was improving ySlow scores. ySlow is a utility that measures load time and analyzes page performance, assigning you a final letter grade based on various performance metrics. It’s a neat little Firebug plugin, and I highly suggest that any web developer install it.
Occasionally I like to play with this tool on other big sites, just to see how many of them actually care about such things. So I went through and ran ySlow on some of the more common Facebook pages. Here’s what I found:
With most aspects Facebook does a decent job: with the exception of advertiser scripts and some application-specific code they use etags, minify their JS, and use long expires headers. What amazed me is the number of JS and CSS files on each page, all listed one after another in the header:
|Page||JS Files||CSS Files||CSS BG Images|
|Homepage (logged out)||5||5||14|
And for those curious, here’s the count for the new facebook design (summary: significantly worse):
|Page||JS Files||CSS Files||CSS BG Images|
Really, I can’t think of any context in which 47 external files would be necessary! I understand breaking files up by purpose to make coding and revision management easier, but I wonder if someone at some point considered the speed impacts. I’m fortunate enough to almost always have a broadband connection, but the experience for their dial-up users is probably deplorable. Especially considering that they now localize the site and are pushing to expand overseas, you would think this would be a much higher priority. And don’t even get me started about the lack of spriting!
Here’s how I setup Mozilla’s JS/CSS concatenation (see the Build Process):
- Add a configuration setting for site state (example: a flag set to “production” on production servers, “dev” on everything else)
- All CSS/JS calls use these flags to decide if they go to the concatenated files or the actual development files
- Create a build script that generates the concatenated files (profile.js, photo.js, etc), run before pushing to production
Ironically enough I would bet Facebook already has #1 and #2 setup, since they use Akamai for production servers, and can’t use that for development.
Alternatively they could use the method YUI uses for serving JS files. Basically call a script that will return the concatenated files. It’s a less elegant solution, and is heavier on the server, but still better than nothing.
Note that this doesn’t only affect dial-up users. While broadband users usually have a fast enough connection to offset the slowdown, a large file count is the biggest slowdown for broadband. This is because of the 2-simultaneous-connection limit that most browsers obey. From rfc2068:
Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD maintain AT MOST 2 connections with any server or proxy.
Facebook.com is the 8th most popular site on the web, while Mozilla.org is the 258th (note that this is all of mozilla.org, not just addons.mozilla.org). They should be able to devote a lot more to the tail end of their users, especially considering the residual benefits for their main audience.
Just as bad is their lack of proper fallback for those with JS disabled. For example, if you were to disable JS, you can still login fine, but once you login, head back to facebook.com. That’s right, they use JS to redirect users from their homepage, with no <noscript> fallback, meaning the average joe with JS disabled can easily lock himself out of Facebook. In addition, pretty much every new feature added since poking doesn’t have a non-JS fallback. Status updates, “People you may know”, dropdowns, the entire “Friends” page, and so on. All completely useless.
I try not to make posts primarily links to articles, but this article about the truth behind America’s “everybody should go to college” mentality is both enveloping and thought-provoking (the author definitely proves his qualifications as a teacher).
Personally, I’m a little split on the subject, though I lean slightly in the direction of the author. On the one hand, I agree that the ideal that everybody should have a college degree is just that, an ideal. Some people are not able to, or have no reason to, obtain a college degree, and encouraging them to do so is a waste of their time, money, and energy.
On the other hand (and this is a tangent “Professor X” doesn’t touch on), I see and interact with people who haven’t had a college education, or have gone to a local community college at night, and it’s often surprisingly difficult. I’m not referring to intellectual differences, but I feel that going away to college gives you a more open view of the world. It not only exposes you to different cultures and ways of thinking, but shoves you into a hot, crowded room with them. It forces you to eat, sleep, and live with them. If that doesn’t broaden your horizons, I don’t know what will. Those who haven’t experienced this part of the education system I find are often much more naive to the world…they see people as more black and white than they really are. I’m not saying that college is the only place where one can learn these shades of gray, but for many who are born, grow up, work, raise a family, and die in the same place all their lives, this is the only opportunity they have to do so.
If it is idealistic to think that everyone should have a college education, it’s downright foolish to think that everyone should go away to college, and while I agree completely, if we don’t work towards ideals and dreams, how else will we make progress?
Update: Full script posted below.
I’m just wrapping up a relatively large project centering around a WordPress plugin. I’ve gotten a chance to explore the API in depth, and have discovered a lot of nice things and a lot of not-so-nice things. One of the not-so-nice things was the way plugin activation is handled…it is assumed that, assuming no fatal errors occur, that a plugin was activated properly every time. There’s no feedback mechanism, no way to pass back a message saying “woa, something’s wrong here”. So I wrote my own.
Now, this plugin will be installed on one site, and I will be doing the installation, so realistically there’s not too much of a concern. But I was slightly worried that the plugin made a lot of tables, and that in the future the plugin may be installed on a system that has a table with the same name. This may be incredibly unlikely, but it’s good to plan. With that goal in mind I wrote a neat piece of code (see below for the whole script to put things in context, though this piece is the most interesting):