Thursday, March 7, 2013

Why I Hate Vanity Tweets

I was at a Hertz car rental stop the other day, and as I waited in the customer service line for 20 minutes after spending 10 minutes trying to use their busted self-service machines, I found myself staring at walls and walls covered in ads about how great Hertz was. Apparently, Zagat had rated them best in approximately everything, and they felt the need to spend all of their wall real estate sharing that information with us. I was already frustrated, and their self-aggrandizing house ads just aggravated me more. What benefit was I deriving from knowing how great everybody else thought they were? Why couldn't they use that space to give me some useful information instead?

This reminded me of something else that I see every day that annoys me in the same way: vanity tweets.

What are they?

When I say a "vanity tweet", I mean a tweet or often a retweet that is entirely about how great a particular Twitter user is. Corporate Twitter brands are particularly apt to issue vanity tweets, like this one from @GoogleMapsAPI:


Why do we tweet them?

There are a few main reasons why we make these vanity (re)tweets:

  • We want to thank someone for their compliment, and one way of acknowledging their compliment is to share it with the world. Often times they have less followers than us, so it's a boost to their Twitter reputation when we retweet or mention the complimentary user.
  • We are happy when someone praises us, and we want everyone to know how happy we are - basically, it's a classic humble brag, that thing that we all find so easy to do on Twitter or any social network, because it re-enforces the ego boost that we got from the original action and makes it last a little longer.
  • We want people to look at our stream and think "wow, everybody likes them, so I should like them too!"

Why do I hate them?

As a general rule, vanity tweets provide very little useful information to me as a reader of your stream. Either I already know that you or your product is great and I don't need the reminder, or I don't know it but the vanity tweet does nothing to convince me of it. Or, atleast, I'd argue that it *shouldn't* convince me of it.


What's the alternative?

Here's what I'd suggest instead of vanity tweets:

  • Show, don't tell: Instead of tweeting about how great people think you or your product is, tweet about new ways of using it that I didn't know about, like tutorials or blog posts, or tweet about oft overlooked features. Just hearing that something is great won't convince me that it's great, but if I discover some new way of using it that suddenly makes it great for me, then I might be convinced. Here's an example where Trello points out a customer's unique use of their product:



  • Instead of acknowledging a compliment by retweeting it, favorite it and personally reply to the complimenter with a sincere thank you. They may not get the follower boost that they'd get out of a retweet, but they will be happy for their praise to be acknowledged. You could maybe even ask them what their favorite feature is, so that you can create a useful tweet out of their praise. Here's an example where Trello responds to a compliment and points them to their recommend tool, too:



  • As a general rule for your Twitter stream, be either useful or entertaining to your target audience. If what you are about to tweet is neither of those, then reconsider whether you really want to tweet it. Here's an example of Trello retweeting a useful keyboard shortcut:


Yes, yes...

I don't think that we all need to stop all vanity tweets ever. But I think that we can all safely do less of them, and the Twitter world will be a more useful place. In fact, when I was looking for examples for this post, I was having a harder time finding them than I expected, so perhaps the Twitter world is already a more useful place. Oh, and yes, I'm sure I've been guilty of issuing a few from my own accounts, so this blog post also serves as a reminder to myself.

Sunday, March 3, 2013

5 days in SoCal: Catalina Island, Joshua Tree, and LA

I just took a proper 5-day vacation around SoCal with my best friend and brother, and managed to fit quite a lot into those 5 days- camping, hiking, kayaking, eating, drinking, beaching, the works. And for whatever reason I decided to write up a diary of it, so... enjoy?

Monday, February 25th

  • 12:00 - We all met in LAX - I flew in from SFO, Hunter megabussed from SF, and Stephie flew in from Washington. (Man, I love the view of the cut out landscape from the plane).
  • 12:30 - We took a pre-arranged Karmel shuttle from LAX to the Downtown landing, which took only 30 minutes or so, so we enjoyed clams and sand dabs at the cafe there.
  • 2:00 - We used our pre-reserved tickets for the 2pm ferry to Catalina Island. We set up our 2-person tent for 3, with our Target-acquired 30 degree sleeping bags.
  • 3:30 - We walked to Hermit Gulch and checked in with our reservations. We were the only ones there- it's apparently not quite the season for camping tourism there - maybe because it's actually pretty cold at night still.
  • 6:30 - We tried out the local fare - the grub from the Lobster Trap (the actual food not that great, but their "pancake breakfast" shot was really quite tasty) and the famed "Buffalo Milk" from Luau Larry's (brain freeze alert!). We also charged our phones there since we had no electricity in our lil old tent. Hunter *really* enjoyed his multiple Buffalo Milks - and the bar enjoyed his unicorn mask.

Tuesday, February 27th

  • 7:00 - We awoke bright and early from our not so restful sleep (the ground was hard and cold, and our impromptu pillows sucked), and took a hike up the Hermit Gulch trail. We were sweating by the time we got to the top, 1.7 miles later, and walked/ran the 2 miles down to the Botanical Memorial Garden (pretty but quite small).
  • 11:00 - After a round of omelettes at Joe's Diner, we boarded the "Semi-Submersible", which really truly only submerged about 10 feet under the water. As it turns out, that was deep enough to see a LOT of fish (mostly the same 4 species, but the Garibaldis are cool) and very tall seaweed forests. Also, to giggle at the undersides of ducks and sea lions.
  • 1:00 - Fueling ourselves with chocolate covered bananas, we rented bicycles and attempted the very steep climb up to the "bison spot", or so the map promised. Catalina Island is known for its roaming bison - a film crew brought 10 out there, never brought them back, and they multiplied. Sadly, we didn't really know where to find them on our bikes and probably didn't venture far enough inland, so we biked our tired asses down the hill.
  • 3:00 - We enjoyed a leisurely bike ride down past Pebbly beach and rocks covered in birds, and we were quite happy to spot dolphins just off the coast. So pretty!
  • 4:30 - We took a break at the Avalon Casino, which is quite pretty but was also quite closed (and the museum cost a whole 5 dollars, more than we were willing to pay).
  • 5:30 - As had become our habit, we started our dinner early, this time at El Galleon, this restaurant that had life size replicas of fish all around it (and a waiter who used to be a fishing captain and answered all of our inane questions about them). We stayed there until we managed to charge all of our phones to 100%, and then we went to Coyote Joe's for a nightcap, as we were determined to stay awake past 8. After 5 songs on the Jukebox, a taco, hot chocolate, and a flan, we called it a night.

Wednesday, February 28th

  • 7:00 - We tried as much as we code to sleep in, but we were no match for the cold ground and bright sun. So after packing up and bidding adieu to Killer, the local feral cat, we enjoyed a breakfast at Jack's Diner, a place covered by cowboy quotes and photos of Marilyn Monroe (who spent a fateful year on the island as a 16-year-old)
  • 9:00 - We rented a double kayak from "The Wet Spot" (not what I would have picked for a name, myself, but perhaps I've had too many accidents in my life), and Hunter and I kayaked while Stephie manned our stuff. We kayaked just around the port area for 45 minutes, and in that time we kayaked alongside many many sea lions and even a group of dolphins. Plus, of course, shit tons of cormorants and pelicans. I fell in love with sea lions at that time and decided I needed a pet one.
  • 11:45 - We took the pre-reserved Catalina Island ferry back to Downtown Landing.
  • 1:00 - We took the pre-reserved Karmel shuttle back LAX, where we picked up a car from Hertz rental.
  • 2:00 - We road trip'ed our way to Joshua Tree, passing the land of a thousand wind mills.
  • 6:00 - We checked into the Hi-Desert Motel instead of the campsite at Indian Grove that I'd reserved because we collectively decided that there was no way we would survive a night in the significantly colder desert, given how cold we were on Catalina. We rejoiced in the modern luxuries of the motel - a 20 inch TV, a shower, OUTLETS! We were also happy to find Jesus just next door.
  • 7:00 - We drove down the street to the Joshua Tree Saloon, enticed by the advertisement of Wednesday night karaoke and grass-fed beef. Hunter has never experienced karaoke, and I thought, wow, the chance for another FIRST on this vay-cay. He went page-by-page through the karaoke book, searching for songs that he'd recognize from Just Dance, and when we finally settled on YMCA, we discovered the karaoke machine was busted. Alas, that first was not meant to be.

Thursday, March 1st

  • 5:30 - Hunter decided that it was the most important thing in the world for us to see the sunrise in Joshua Tree, so he woke us up for the "6:20 sunrise". After we all reluctantly woke up, I pulled the shades open and demonstrated that in fact, the sun was already rising quite prettily over our motel and Jesus, and now we were awake for no particularly good reason.
  • 6:30 - We decided to drive into the park anyway and try a morning walk around Barker Dam, walking strategically into allthe sunny bits.
  • 8:00 - Since we made the silly decision of driving into the park before breakfast (do not recommend), we drove back out the other way and found our only option around there was Denny's, where we un-enjoyed some breakfast skillets.
  • 8:30 - We walked around the 29 Palms Oasis Visitors Center, where I proceeded to learn a massive amount about deserts, which fueled my ego for the rest of the trip and will disappear by the next one. We also realized then there were no guided tours we could hit up that day, so we booked tickets for a Keys Ranch tour for Friday.
  • 9:30 - Determined to spend the rest of the day hopping from rock to rock, we headed back in. First we did some meditating at Arch Rock, then interpretative dance at the Cholla Cactus Garden, a quick stop by the Ocotillo patch, aimless wandering at the Cottonwood Spring (i.e. we failed to find the spring), and some learning at the Bajada nature trail.
  • 1:30 - Finally depleted enough to be hungry for our next meal, we drove south of the park to the Chiriaco summit, a truck stop with its own post office, airport, tank museum, trailer park, and school. Most importantly, the cafe had homemade date shakes (vanilla ice cream + dates), which I'm determined to make at home now.
  • 2:30 - dsfsd
  • 5:30 - We timed our entry to Keys View to coincide with sunset and we were well rewarded by the panoramic view of the sun setting over the park, the nearby mountains, Salton Sea, and even a mountain top in Mexico. That, sir, is what we call *high visibility*.
  • 8:00 - We drove to the 29 palms inn, a hotel built around the natural oasis with its own oasis-irrigated garden. We didn't stay in it for priciness reasons, but I figured we could still enjoy its food. We had to sit at the bar for a while at first because we didn't have a reservation, but that was entertaining thanks to the live jazz and more so, the live hitting on of Hunter by the local cougars. Once we got to sit, we enjoyed their homemade sour dough bread alongside our tasty meals.

Friday, March 2nd

  • 8:00 - We somehow managed to sleep in until 7:30 today (a record!), so that meant going to a breakfast place besides Denny's. We went for the Joshua Tree saloon because they have a "breakfast happy hour" and that concept just amuses me. Chili cheese omelettes are delicious, by the way.
  • 10:00 - After some scrambling around the Hidden Valley rocks (yes, "scrambling" is the technical term around those parts for not-quite-climbing-not-quite-walking), we met up with a bunch of people 5 times older than us for the Keys Ranch tour. We learnt how the native americans used the land originally (a diet rich with pine nuts) and how Keys built a ranch, dam, general store, school, and even invented his own back stretcher. Oh, and how he killed a man. Crazy cowboy shoot-outs.
  • 12:00 - We drove back to LA, waving adieu to the windmill gods and singing along to pop rap songs.
  • 3:00 - We got our swimmers on and headed to the beach, where I was immediately distracted by sand and demanded to be buried in it. Stephie and Hunter complied, but when I asked them to make me into a butterfly, they made me rather phallic instead. Sigh.
  • 5:00 - Santa Monica has this amazing "muscle beach" area filled with equipment for the acrobatic at heart, so I swung my heart out while Hunter tried the traveling rings and the not-so-traveling rings. And we mostly just stood in awe as wanna be circus folk walked along trapezes, juggled, hula hooped, and spun their body in crazy ways.
  • 8:00 - We finished off the night by meeting up with our friend Tim, of heavy metal vegan cooking fame, and our last meal was a very British one at the Fox & Hound - scotch egg, bangers and mash, beef and kidney, spotted dick.

Saturday, March 2, 2013

Co-Learning Spaces

I've been toying with an idea in my head lately, and I want to put it out there now to help me think through it and see what you all think.

"Spaces"

First, some context. Around San Francisco, we have an increasing number of "co-working spaces", and I've co-worked at a handful of them myself. A "co-working space" is where you can rent a seat, a desk, or a whole room of desks, and you can go there every day and work on whatever it is you do, around other people also doing their work thing. The space provides amenities that you typically get at an office, like Wi-Fi, a fridge and mini kitchen, mail delivery, fax/printer, conference rooms, and often also tries to provide opportunities for networking and business growth. The co-working crowd is vast and varied - book authors, freelancers, contractors, remote workers, fledgling startups, consultants, coaches - and they come across many industries. For them, a co-working space is the alternative to working at home (which can be lonesome and not create the "work/life" barrier that folks strive for) or to renting an entire office space for themself (which can be expensive and requires an investment). Co-working is low-cost and is often a month-to-month commitment, so it's an easy choice for people to make in many different situations.

We also have a few "hacker spaces" and "maker spaces" here in the valley. The classic hacker space is Hacker Dojo down in Mountain View, which is targeted at people "who share a common love of creating wonderful things and understanding how the world works." It's not limited to programmers, but the majority of members likely are. They also host many meetups and (un)conferences along the same lines. A big "maker space" is NoiseBridge up in SF, and they describe themselves as an "infrastructure provider for technical-creative projects." They attract many hardware hackers and host regular classes in both software and hardware.

I think that all of these spaces are fantastic and am thankful that they exist. However, I think we could use another sort of specialized space, particularly around here, and that's what I'd call a "co-learning spaces".

"Co-Learning Spaces"

A "co-learning space" would be oriented entirely around enabling and encouraging learning. All of its amenities, its layout, its target members, its events, its pricing, all of that would be learning oriented. When you walked into the space, you would immediately know you were surrounded by learners and be inspired to learn yourself.

What?

Right, well, that fluffy description is all well and good, but what would that actually look like?

  • The space would include a lab area with inexpensive laptops like ChromeBooks for members to do online learning with.
  • The space would include tutoring rooms, designed to fit a 2-3 people and their laptops.
  • The space would be laid out as an open space with removable walls, to make it easy to turn it into a different layout for different sorts of learning events.
  • The organizers would schedule viewings of online lectures and post them on a calendar, like scheduled viewings of an ongoing Coursera class that multiple members were enrolled in. That would give members an IRL, social component to their online learning experience.
  • The organizers would work with local groups/teachers/skillshare to host low-cost classes for their members and the general public, depending on what their members are the most interested in.
  • There would be a "TIL" session at the end of each week for members to share something interesting they learnt that week.
  • The organizers would collect information about learning opportunities (online and IRL) and broadcast them to their members.
  • The organizers would facilitate the creation of open-source group projects, to give budding software developer members an opportunity to experience both a real project and IRL group collaboration. They might work with local non-profits to come up with these projects.
  • The members wall would list what each member is learning, and what level they're at if they're enrolled in something with known levels like Codecademy and Duolingo. That way, members could find other people learning similar things, and they might form study groups or just friendships.
  • The cost for the space would be a bit less than other spaces, since learners are usually earning less than workers.

As you can see, it would be very similar to the co-working, hacker, and maker spaces that we already have - the main difference is that it would be entirely focused on learning, to its core.

Who?

A learning space could easily exist for any sort of learner (of languages, or humanities, of crafts), but at least in the valley, I think we could have learning spaces devoted specifically to learning software development. There just may be enough potential members for that sort of space here, and it would benefit from being a more topically focused space. What sort of people would be members of such a space?

  • Transitioners: People who started off an in industry and have since decided to move into the development industry. We have quite a few GirlDevelopIt members that are transitioning, and the trend is rising. People are realizing that the world needs more developers, and thinking to themselves that hey, they could do that. Some of them do their learning on the side (weekdays/weekends) whilst others leave the current job and become "full-time learners".
  • Recent grads: People who graduated from college, perhaps even with a CS degree, but don't feel equipped enough to enter the job market yet, or have some topics they want to learn more of before they do. CS degrees are great but are sometimes lacking in practical skills, and that's something that many CS grads have to learn in their internships, free time, or summers.
  • Retirees: People who have left the workforce but still enjoy learning. I met a handful of these sorts at the Coursera BBQ - folks that are taking courses just to learn and keep their mind sharp, and they were keen to meet others who loved learning too.
  • Everyone else: We should all be entitled to lifelong learning, and particularly in software dev, we really do need to keep learning since things change all the time. We can't take our whole week off to learn, but we could spend a few days here and there to learn amongst others. I know that I do a lot of extra learning in the evenings and weekends, and I'd love to do that in a space of learners.

Why not bootcamps?

Well, now you might ask, if the members in the space are devoting their time to learning software development, why don't they just join one of the intensive bootcamps around SF? We have quite a few of them now, and they seem to be very effective ways to learn a lot about development in a short period of time.

  • Price: The bootcamps are usually around 6K-10K, and that might be or seem too costly, particularly for someone who is just getting their feet wet. If they are self motivated, they might decide it's better to teach themselves with free/cheap online resources (of which there are plenty) and save their money.
  • Topic: The bootcamps each revolve around particular technologies, like JS, Rails, or Python, and usually aim to produce a particular type of developer (backend/frontend). Someone might be interested in a different technology or want to become a different sort of developer (sys ops, data scientist, mobile, etc).
  • Opportunity: The bootcamps have limited space, and not everybody will necessarily make it in.
  • Commitment: A bootcamp requires 24/7 commitment, which not everyone can do. At a co-learning space, they could be a part-time member and still benefit from their few days a week.

To sum it up...

I love learning, and I love being surrounded by movements that encourage more people to continue learning throughout their life, like GirlDevelopIt with its in-person classes and Coursera with its online classes. I think that something like co-learning spaces could complement the movement towards lifelong education and create a physical space to encourage it. We may not be in college anymore, but we can still be around learners like us.

I'd love to hear what you think in the comments.

Saturday, February 16, 2013

Checking for Technical Requirements in a Sign-up Process

As mentioned in my last post on feature detection vs. user agent sniffing, we do use feature detection for some of our Coursera features, and I wanted to talk here about one particularly interesting usage.

A month ago, we launched a new product called "Signature Track." We created it because we wanted to give students a way to verify that they really are who they say they are, and that they are the ones that are actually doing the assessments. That will give their certificates and accomplishments more meaning.

To verify their identity, we ask them to give us a typing pattern (on a hard keyboard, where biometrics algorithms works best) and to take a photo of themselves (from their webcam, so that they can't just upload a photo). They have to do that both when they register for Signature Track and after each assessment they do.

That means that there are a few technical requirements for them to be in Signature Track: they need a hard keyboard, they need a webcam, and they need the Flash plugin (it is possible to access the webcam via HTML5 getUserMedia, but it is a bit buggy, so we're starting with Flash only access). Since the Signature Track signup process is multi-step, we wanted to warn users ahead of time about all the requirements, so that they didn't go through one step and then be frustrated to discover they couldn't complete the next step. Here's how we checked for support (or tried to) for each of our requirements:


Hard Keyboard

As far as I know, there's no actual way to query if the user is on a device with a hard keyboard. You can query whether the device supports touch events, and that's what we started off with doing by checking for the existence of document.ontouchstart, but then we found out that several browsers may start exposing Touch APIs on non-touch devices, so that seemed not very future-safe. Paul Kinlan had a good idea that we good monitor the sequence of events while a user is typing - if the keypress came before a touch event, they are likely using a physical keyboard. However, we can only do that check once the user has actually started the process, and we wanted to give users a heads up before they even dove in.

So, for now, we are no longer using feature detection - we are instead doing a check on the user agent to see if a user is on a known mobile device:

 function isMobileDevice() {
    var ua = navigator.userAgent || navigator.vendor || window.opera;
    return (/iPhone|iPod|iPad|Android|BlackBerry|Opera Mini|IEMobile/).test(ua);
  }

If they are on a mobile device, they'll be brought to a page letting them know what we've detected, and we track in our analytics how many users get to that page:

We will likely add in the physical keyboard check based on events in the actual typing phase and warn users when they appear to be on a soft keyboard. Or, we improve the algorithms so that users can match their patterns even when typing from soft keyboards.


Flash Plugin

I typically go to Modernizr for my straightforward feature detection needs, but unfortunately, they do not include a check for Flash. I looked through their issue threads on it and did some Googling, and after trying a few options, I decided that the SWFObject library was the most straightforward option.

After including that library, our check is simply:

swfobject.hasFlashPlayerVersion("8")

If they don't pass that check, they'll be brought to a page letting them know what we've detected, and we track in our analytics how many users get to that page:


Webcam

As with the physical keyboard, the browser does not give any indication whether a user has a webcam. We would have loved if it did while we were brainstorming this product, because we wanted to figure out how many users would even have a webcam available, but alas! The only way to know if a user has a webcam is to use Flash or getUserMedia to ask for permission to use their webcam. If they don't have one, you'll get an error in response.

So, unfortunately, we can't warn users ahead of time about lack of a webcam, but we do try to message that via a modal at the very beginning, along with other reminders:


If you have a product with technical requirements, what do you do to check for them in the sign-up process? I'd love to hear more in the comments.

Why isn't our warning banner based on feature detection?

In my last post, I showed how we display a banner above Coursera to users on explicitly unsupported browsers, to warn them that the site is known not to work well on them.

After my post, Kyle Simpson, a well-known web developer and creator of the talk "Browser Versions are Dead", put together a post about why he thinks browser version detection should be avoided, and feature detection should be used instead.

He has some great points in it. Generally, the web developer community is trying to move towards using feature detection instead of user agent sniffing to warn users and degrade website functionality. We try to do that at Coursera where it makes sense for specific features (we deliver video via Flash if you don't have native HTML5, e.g.), but we determined that it's not practical to do that for our cross-site warning, for a few reasons:

  • We would have to test for *a lot* of features, and those tests would take time on page load. We could cache the results of those tests in a cookie or localStorage, and so there would only be a one-time cost. But if the browser upgraded and suddenly did start supporting a feature, we would need to know to re-run the tests - and as far as I know, the only way to know about a browser upgrade is via user agent sniffing and some knowledge of how versions work.
  • We couldn't just tests for features, like "does canvas work", we would also have to test for performance. We've seen some older browsers simply can't handle the amount of JavaScript that we use or simultaneous XMLHttpRequests that we send off, and they will hang. How does one test for a hanging browser yet still recover? I imagine it's possible, but I don't know if it's easy.
  • I have personally been bitten by feature detection in the past and now approach it cautiously. There are some features that developers have put a lot of approach into figuring out rigorous feature testing for, like all of the tests in Modernizer.js, but there are other features that are newer and whose detection quirks are less known. For example, when I tried to use FormData for sending a form, I checked for the existence of it on window. Unfortunately, it existed in Safari, but Safari wasn't actually setting the data, and since the FormData API had no accessors, there was no way that I could feature detect it. I resorted to user agent sniffing instead, blacklisting that Safari version for that feature. That is just one example, and there have been others.
  • We have limited resources. Yes, we could try to solve the problem of doing performant, comprehensive feature detection tests, of caching them and figuring out when to update our cache, doing performance tests, and determining the cross-browser feature detection technique for every single feature we use. Or, we could focus our time on our actual product, and decide that it's okay to say "Alright, we know we don't work in these older browsers, so let's just tell users what we know."

Something that I've come to appreciate in my last 8 months as engineer is that we can't always do what's perfect and ideal. Sometimes, we have to do what is practical and be cognizant that there is a better way, and when the time has come, try to move to the better way.

Wednesday, February 13, 2013

Warning Users on Older Browsers

As web developers with finite time and resources, we have to make a conscious decision of which browsers we will support. Every supported browser means additional bugs to fix when things don't work, and additional browsers to do both manual and automated testing in. And as you all know, some browsers are much harder to support than others (*cough* IE6 *cough*).

At Coursera, we have decided to support IE9+, Firefox 12+, Chrome (any version), and Safari 5+, and we document that decision on our help site.


Letting users know

But, our website still works in other browsers, so we do not want to block a user from using it completely, if that is their only option. We do want them to be aware that they are on an unsupported browser, though, so that they are prepared for some features to not quite work. Since 99.99% of users do not consult the help site before they use a website, we need to find a way of messaging this to them when they're on the site. Pop up a modal? Make them sign an agreement that they know they're on an older browser? Float a banner somewhere? Turn everything bright red?


Our approach: the top banner

We opted for the top banner approach, which has become a fairly common paradigm on websites for warning-style messages. We have a little JavaScript browser banner library that we can include on any of our sites. It starts by checking the user agent to see if the user is on an un-supported browser. I debated between checking if they're on a whitelisted browser versus checking if they're on a blacklisted browser, and I went for the latter approach. I figure that we can always add more to that blacklist, if we see many people on a particular old browser.

If the user is on an unsupported browser, then it animates a banner sliding down with the message "You are using an unsupported browser, so some features may not work. Please upgrade to a modern browser." We link to our help site so that users can read which browsers we support and hopefully decide to download one of them.

You can see the full code for our banner in this gist, a demo of it in this jsfiddle, and a screenshot below:


Is it enough?

We've had users ignore the banner in the past (as evidenced by oblivious forum posts) and have been iterating on it to increase its obviousness (increasing the font size, adding the push-down animation), but we will probably still have users that ignore it and get upset when something doesn't work.

In particular, we have some parts of our class sites that work much better than others in older browsers (like lecture watching vs. peer graded assignments), and we have debated whether we should have a harsher warning in some places versus others. But, we decided that our users are likely to eventually experience both features, so it is the responsible thing to warn them everywhere.

If anything, we may make the warning even more obtrusive in the feature, like a modal which forces the user to acknowledge its existence before continuing, to make sure that users do not get started on a class in a browser and think that they will be successful, only to discover later that there are some aspects of the class that they just cannot complete at all.

So, that's where we're at right now. I'd love to hear about other approaches to browser messaging. Let me know in the comments!

Thursday, February 7, 2013

My Lasik Journey

me being a dork in glasses I started wearing glasses when I was 8 years old. I'm pretty sure my attraction to big shiny CRT monitors and my tendency to stare directly at the sun contributed to that fact. I hated glasses, because I already felt like a dork, and when I wore them, I felt even dorkier. (See photo for evidence →)
So in late middle school, when it is of the utmost importance for a young girl to feel as least dorky as possible, I started wearing contacts. I hated actually putting in contacts - I'd come out of the bathroom with tears streaming down my face every time - but once they were in, I could keep them in for months and months, never taking them out, and my eyes would never dry up. I could even wear just one contact at a time, and I could see just fine - as I would oft demonstrate by doing a one-eyed cartwheel down the balance beam.
Fast forward 15 years, and things change. Now, my eyes notice the contacts, and I find myself noticeably affected by how dry they are. I even go to bed early just to give my eyes a rest. And I still hate glasses. As much as people tell me, "but glasses are cool!", I immediately feel like a dorky 10-year-old again when I put them on, and my confidence starts to wane.
Last week, my glasses broke, my contacts ran out, and I decided that it was time to do something I've been thinking about for a long time: Lasik surgery. I don't want my eyes (or lack thereof) to be something that I think about every day for the rest of my life, now is as good as time as any to start the rest of my life. Plus, I have health insurance again, thanks to Coursera. ☺
So, here's what I've learnt in my Lasik journey so far, and I hope that it helps you with your own decisions.

What is Lasik?

intralasik diagram
As it turns out, there are multiple types of Lasik-esque surgeries. Here's my layman's description of them, but note, I'm not a doctor!
  • Lasik: In this surgery, the doctor cuts a corneal flap using a microkeratome knife, and then uses a laser to shape the cornea to fix your vision. Most doctors do not offer this anymore (at least the ones I talked to).
  • IntraLasik: This one is all laser, all the time. The doctor creates the flap using a laser, and then does the shaping with a laser. It is considered safer and more precise than Lasik, and is the preferred technique.
  • PRK: In this surgery, there is no flap creation at all. Instead, the doctor reshapes the cornea by modifying the top layer of the eye. The healing process is longer and more painful for PRK, so it is only recommended if your eye's surface is already misshaped.

Will insurance cover it?

This was a big question I had, because I knew Lasik was an expensive procedure ($5K-$10K seems to be the range). What will my insurance actually cover? Apparently, in the VSP network that we're in for our insurance, we always get 20% off the procedure, regardless of which one we go with. And that's it. Oh, well, it's "elective" surgery, so I'll be thankful that anything is covered. (I could argue that I could potentially die one day while wearing glasses and biking in the rain at night, but alas).

What doctor should I go to?

After money, the big concern around Lasik is safety and success. It involves putting a freaking laser in your eye, after all. So, you have to figure out: who is the best equipped person to put a laser in your eye? I did my research the usual way- emailed my colleagues, tweeted out to followers, perused Yelp reviews. In the end, I got multiple referrals for Dr. Ella Faktorovich of Pacific Vision Institute, and after having a great chat with them on the phone where they answered all my questions, I was convinced.

Am I eligible?

Not everyone is a good candidate for Lasik surgery. Or atleast, that's what Dr. Faktorovich believes, so her office puts you through a series of checks first to make sure. It's the usual stick your head in a contraption while they shine lights on you thing, and they use the results to determine if you are a candidate, and for which surgery (IntraLasik or PRK). As it turns out, my eyes are "boring" (to quote their chief engineer, who put up with my never ending array of technical questions), which means that I get to go for IntraLasik, the surgery with the fastest recovery. Woot!

How much will it cost?

The cost varies per doctor, but for Pacific Vision Institute, the final cost for me will be $6900, which includes the 20% VSP discount, the $300 discount for coming from a referral, and a $300 discount for me coming from an awesome university (I think the doctor threw that in because her daughter goes to USC and I was sporting my Trojans shirt today!).

What's next?

My pre-op visit is next Tuesday, where they'll dilate my eyes and I'll try to avoid staring at the sun, and then my actual surgery will be on Valentine's Day. (Not to jinx myself but...) Best date ever?

How'd it go??

It's been four years, and I never updated this blog post to share the rest of my Lasik journey with the world. Why? Honestly, the surgery went so well, I soon forgot that I ever had glasses, contacts, or vision problems! Dr. Faktorovich led me smoothly through the surgery, talking me through the strange process of having an operation on my eye, and after a few weeks of follow-up eye drops, my eyes were better than ever.
I no longer have to worry about losing glasses or struggling to get my contacts in, and I can use my eyes all day without feeling strain. For me, Lasik surgery was a great success, and I'm so very thankful I had the savings to fund the surgery.
(If you end up going to Pacific Vision Institute and would like me to get a referral bonus, message me to let me know.)