How Rock Stars Killed The Engineering Team

Ziggy played guitar


In late 2016, I wrote a slide deck. Or maybe it’s more accurate to say that I re-wrote -- no, I adapted -- a song. As a presentation slide deck. You know, as one does.

Over the next year and some change, however, I never delivered the presentation to an audience. I never... felt comfortable delivering the presentation to an audience. I wasn’t unaccustomed to public speaking. I’ve done plenty of presentations over the years I’ve been a professional software developer. I’ve presented to my teams, to my bosses, to my clients, to my customers, to the CEO, the president, to conferences (usually when I was on the schedule… once when I wasn’t). To adults. To children. Just never… to music. So I adapt (again).

David Bowie’s Ziggy Stardust tells the story of a rock-and-roll frontman whose self-absorbed braggadocio alienated (haha -- it’s a joke because… well, just read about the album), and ultimately destroyed, the band. Basically. David says it better, so listen to the song. I’ll wait.

3 minutes 13 seconds, 3 minutes 14… you’re back? Great. Where was I? Right. Ziggy. A Rock Star. Like those software job postings are always asking for. Wizards. Ninjas. Rock Stars. But is that what we want? Do we want to work on a team with someone who thinks they’re the nazz, parading their god-given ass around the office carrying a southpaw guitar? (Seriously, if you haven’t heard the song, then these references will make no sense at all. Go look up the lyrics, at least.)

Jamming good


We’ve all worked with someone who seems to know everything. Or acts like a know-it-all, anyway. Maybe they do their work really quickly. Or they come up with elaborate solutions, explaining how the problem is really complex, and how clever they had to be to solve it. They may be unconventional, do things differently. Management likes them, even though they’re… eccentric. They get accolades. They get attention. Still… something is off.

Made it too far


When one person has all the answers, other people lose their voice. The prominence and importance of one person is raised at the expense of others. These Rock Stars accomplish more than they should, and at too great a cost. They are toxic and should be considered ultimately harmful to the long-term health of a team.

The Rock Star will attract fans, groupies, other engineers who want to be like them. ‘Cause we all just wanna be big rock stars -- wait, wrong song. There will be people who admire the star’s work, who want their attention, who are eager to please them.

Others will chafe under the friction caused by the dissonance. They may be vocal with their objections, which will make them unpopular with management who appreciate the star and just wish everyone else could be more like him.

Should we crush his sweet hands?


A few people will work actively to undermine the star. This could take the form of withholding critical information, failing to call out risks, or of keeping quiet when a potential solution or improvement presents itself. The supporting members don’t feel like part of the team anymore.

The Rock Star will fight any challenge to his (we’ll save the discussion around gendered pronoun usage regarding egomaniacs for another blog post, mmkay?) dominance, trying to stay on top of the hill. He will denigrate, deny, deceive, and destroy in his struggle to remain relevant. In the Rock Star’s mind, his history of “success” enforces the idea that he is right, that challenges and objections are from small-minded people, jealous of his success, or simply less skilled and unable to see “The Truth” as he does. Even if the Rock Star has a good point, it may not be accepted by those he alienates.

But boy could he play guitar


Any personnel manager or HR professional should be triggered by the phrase “but he does such good work.” The Rock Star will cross a line sooner or later. Passive-aggressive bullying, or even overt abuse of others is a natural progression from the egotism combined with resistance and criticism. Don’t enable this behavior. Stamp it out quickly before it’s too late.

Before drastic measures are required.

Before it breaks up the band.

Oh, yeah


For all you engineers: don’t try to be a star. Be a catalyst. Start something wonderful -- be an instigator! Be someone who makes your team more than the sum of its parts. Everyone has a role to play, and that includes having a leader sometimes. Sometimes that might be you. Sometimes other people get the spotlight. Raise your voice in support of your teammates when it’s their turn to shine.

Ziggy played guitar


I wrote code. Increasingly, lately, I coach others through writing their code. When they ask a question, I lead them down a path to answering it themselves. I play rhythm, not the solos, trying to keep everyone on the beat, and in harmony. It takes getting used to. It takes practicing a new set of skills, and new approaches to situations. In the end, though, we all sound better when the band plays together. I don’t need to ham it up, to showboat, to impress anyone. I improvise. I adapt.

Still... just maybe, if I can ever get the slides to sync up with the music, maybe I’ll be the special man for three and a quarter minutes.


Special thanks to my good friend Mike Bland for his insight, thoughtful critique, and encouragement that led to this blog post, among other things.

Spectrum of Integration Automation


“Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.”
-- Martin Fowler, http://martinfowler.com/articles/continuousIntegration.html

In software development there is a spectrum of the degree to which a project team can automate integration of components, bug fixes, enhancements, and new features into a complete software product. In a 2000 article (revised in 2006), Martin Fowler describes the then-current state of this automation using the term Continuous Integration.  Fowler describes the tools and processes used to achieve this automation and the benefits of achieving Continuous Integration. Since then, many more tools and processes have entered the industry and it is becoming harder to fit all automated software development projects into a single definition of Continuous Integration. To help facilitate analysis and conversation around software development automation, I want to offer a set of terms describing various features of automation, how those features can be combined to achieve different levels of automation, and the benefits derived from each.

Features of Automation

Reproducible Builds

  • Builds are conducted from a version-controlled source of truth using a scripted process.
  • Provides traceability and accountability for every build of the system.
  • Previous builds can be reproduced with precision by another developer at a later point in time.
  • Enables troubleshooting of production issues outside of the production environment.
  • Eliminates the risk associated with variability of a manual build.

Automated Builds

  • Builds happen without manual intervention, reducing cost and freeing resources.
  • Build-time failures are identified quickly, reducing the cost of remediation.

Automated Unit Testing

  • Fails the build if individual components do not pass tests of basic functions.
  • Logical and functional failures in components are identified quickly, reducing the cost of remediation.

Automated Qualitative Analysis

  • Every successful build is analyzed for standards compliance, common coding mistakes, and security vulnerabilities.
  • Quality and technical debt can be tracked and managed to reduce the ongoing cost of maintenance.

Automated System Testing

  • Comprehensive testing that fails the build if components are not integrating properly when running in a simulated production environment.
  • Identifies runtime functional errors quickly, reducing the cost of remediation.

Automated Delivery

  • Successful builds are automatically deployed to selected environments for manual exploratory and user acceptance testing.
Automation features at various levels

Levels of Automations

Manual

  • No automation.
  • Builds are created by IDE export features, manually from the command line, or through other processes that are subject to human error and environmental variability.
  • “It builds on my machine” is a common refrain.
  • It is impossible to precisely reproduce a previous build with any reliability.
  • Automated tests (e.g. JUnit, Selenium) may exist, but they are not run consistently and automatically.
  • Individual developers may apply quality analysis tools, although inconsistently and with no formal enforcement mechanism.

Scripted

  • Builds are automated using a scriptable/configurable build tool: Ant, Buck, Gradle, Make, Maven, etc.
  • Build script may include running automated tests and qualitative analysis, but still lacks systematic formal enforcement.

Automated Integration

  • Builds are triggered automatically (typically nightly).
  • Automated tests (if present) are run.
  • Qualitative analysis may be performed.
  • Enforcement of testing and quality standards is now possible.

Continuous Integration

  • Developers integrate their changes into a central repository daily.
  • Builds are triggered continuously as changes come in.
  • Automated testing and analysis provide immediate feedback if breaking changes are introduced.
  • May include some level of automated system testing.
  • If deployment has been automated, CI should include automatically delivery of each build to a shared testing environment.

Continuous Delivery

  • A combination of rigorous standards compliance, up-front peer review, and automated testing at the unit and system level is sufficient that the team is comfortable promoting changes as soon as the lights turn green.
  • Builds and deployments are fully automated.
  • Any build that passes a final round of user acceptance testing can be promoted to production with a single click.

How Habits Steal Your Time (If You Let Them)


Filling The Void in Your Schedule

I made a casual reference this morning to how my habits and routines tend to expand to fill whatever "free time" I might otherwise have, causing me to defer other non-routine activities because "I don't have time." I don't even recall what my original point was at the time, but the idea that habits expand to fill a void in your schedule resonated with my audience. Time, essentially, is a scarce commodity, and "free time" is even rarer, so I find I have a natural tendency to allocate that time to familiar, comfortable, habitual leisure activities. Apparently, other people do this, too - or something like it. But often the non-routine activities that I put off nag at me. Maybe it is a chore I don't feel like doing, or a new and exciting leisure activity that might interest me but I'm putting off trying it out of habit. I do what is easy and familiar in the moment -  follow the path of least resistance.

David McRaney explains it very nicely, in the context of procrastination:
"This is why your Netflix queue is full of great films you keep passing over for “Family Guy.” With Netflix, the choice of what to watch right now and what to watch later is like candy bars versus carrot sticks. When you are planning ahead, your better angels point to the nourishing choices, but in the moment you go for what tastes good." 
Habit and routine taste good. Really, really good - to me, anyway. Habits are really powerful, and developing good habits (say, brushing your teeth) is a useful life skill. Indulging yourself, in moderation, is a good thing to do, too, so it is natural to find a free moment and think "I should go engage in my favorite leisure activity, indulge myself while I have a chance." But when those indulgences - those leisure activities - take on the form of habits, and you're just engaging in them because it is your normal routine, then there might be a problem: your routine might be expanding to fill a void in your schedule.

Nature abhors a vacuum. Gary Larson wrote that. So go out, break from routine, find something new, do something nice - and different - for yourself (or someone else). Take a walk on The Far Side.

Chrome OS v20

I just updated my Cr-48 to the latest version of Chrome OS - version 20, for those who are counting such things. Although the default mode still appears to be the familiar full-screen browser look, there's also a more desktop-ish mode available, complete with wallpaper.

Unfortunately, I fear that the days of the Cr-48 are numbered; this fancy new OS version seems to be testing the limits of my prototype hardware and page rendering is quite slow.

Oh, look, there's another update. Always fun to discover new stuff, but I wish these things came with change logs. Time to restart!

Supporting You Are Not So Smart

I've been following the You Are Not So Smart blog for a while now and frequently share its posts on Google Reader. The author, David McRaney, writes about human thought and behavior, drawing on research conducted over the last several decades. David describes it as "a blog devoted to self delusion and irrational thinking." It's a great read and I highly recommend it. There's a book coming out soon and I think this is a cause, and a creative professional, worth supporting, so I'm including the book's YouTube trailer below. Doesn't hurt that he's offering bribes for posting the video! It's only 3:37 long and well worth watching.




And a quick note for readers in the Richmond, VA area: I will be presenting Building Optimized Rich Web Applications with Java, an introduction to Google Web Toolkit at the Richmond, VA Google Technology Users Group tomorrow. It's not too late to sign up for the meeting, which is free to attend.

Google Analytics in Real Time

I just got accepted to the Google Analytics Real-Time beta. So, now I need everyone to go browse my blog so I have some real-time data to look at! And get your friends to come by, too. In the name of load testing, you know.

Charlottesville, VA beCamp 2011

Wow, what a great weekend at beCamp this year! I missed the setup and introductions because work kept me late Friday night, but I made it in time for proposing session topics (and pizza, of course). Running a session on Google Web Toolkit last year was a big thrill for me. I proposed GWT again, and ChromeOS, hoping to talk about my experiences with my Cr-48 since December. My GWT session got the same number of votes as last year, despite attendance being down something like 40% this year. Go me! ChromeOS didn't make the cut.

My first experience as a conference speaker was at beCamp 2010. In the spirit of the event, I proposed a session on GWT despite having no slides or other materials prepared. I got votes. I got scheduled. When I found myself in front of a dozen people with nothing prepared, I just started talking. I like GWT. I love using it. So, I went with that. What is GWT? Why do I use it? What do I love about it? That's what I talked about. And people asked questions. Lots of questions. I answered as many as I could as well as I could. People thanked me. This speaking thing wasn't so bad after all. I was even asked to give a presentation on GWT to the Richmond, VA Java User Group. I agreed. I obviously had a lot to say on the subject, and based on the response I was getting, people wanted to hear it. So I set about building slides for a presentation. I did my research. And in October 2010, I presented to about 25 people at the RJUG meeting. Nerves and a few technical issues aside, it went well. Now here I was, back at beCamp the following year, giving the presentation again. And people liked it. That feels good.

I gave the presentation using my Cr-48, only slightly disappointed that nobody wanted to hear about that too. But then after the session, I was approached. What was that notebook I used for the presentation? Oh, that's my Cr-48, a prototype Chromebook. I knew from the voting the night before that at least a couple of people were interested, so I was glad one of them had picked me out of the crowd later to talk about it. Then at lunch, more people gathered around interested in seeing it. Should I have put "Chromebook" on the topic card instead of "ChromeOS?" Are people more interested in the hardware than the operating system, or just more interested in seeing it in action? I'll propose the topic again next year, maybe under a different heading. I'll probably still be using the Cr-48 anyway, so if you're there and you want a look at it, come up and ask!

Thanks again to the organizer, Eric Pugh, all the sponsors, and everyone else who made beCamp 2011 possible. See you next year!

GMail TODO Script

After reading GMail Snooze with Apps Script I thought "Gosh, that's almost what I need to make GMail my go-to TODO list platform." Well, I finally sat down and closed the gap.

var MARK_UNREAD = true;
var MARK_IMPORTANT = true;
var ADD_TODO_LABEL = true;
var TIMEZONE = "EST";

function setup() {
  if (ADD_TODO_LABEL) {
    GmailApp.createLabel("TODO");
  }
}

function reviveTODOs() {
  var todayString = Utilities.formatDate(new Date(),
     TIMEZONE, "yyyy/MM/dd");
  var todaysLabel = 
     GmailApp.getUserLabelByName(todayString);  
  var page = null;

  // Get threads in "pages" of 100 at a time
  while(todaysLabel 
      && (!page || page.length == 100)) {
    page = todaysLabel.getThreads(0, 100);

    if (page.length > 0) {
      GmailApp.moveThreadsToInbox(page);
      
      if (MARK_UNREAD) {
        GmailApp.markThreadsUnread(page);
      }

      if (MARK_IMPORTANT) {
        GmailApp.markThreadsImportant(page);
      }
      
      if (ADD_TODO_LABEL) {
        GmailApp.getUserLabelByName("TODO")
          .addToThreads(page);
      }          
    }     
  }
}

Instead of using "Snooze x Days" labels, I use date labels like "2011/08/11" to remind myself to follow up on bills, respond to emails, etc. With this modified version of Corey Goldfeder's script, I don't have to remember to check those labels, they just pop back into my inbox automatically. I had a little problem with the markThreadsImportant call not seeming to work. Don't know what's up with that. But otherwise, it has performed well so far in testing.

Update: Be sure to set the timezone that the script will run in and the timezone used to format date labels to the same timezone. See Using Time-Driven Triggers.

Like this script? Have your own variation? Please share!

RVA GTUG - August 2011 Meeting

I'm thrilled to announce that on Thursday the Richmond, VA Google Technology User Group met for the first time. It was fantastic seeing familiar faces and also meeting some other Google enthusiasts for the first time. This is my first experience as a community organizer, so I'm excited to see how things will develop from here. We have good people who believe in the group and I'm confident we'll continue strong. Thank you to all of our members!

Special thanks to Genworth Financial for supporting the local Google developer community by letting us meet in their offices here in Richmond. If you or your organization would like to support this community, please contact me through my Google Profile or the RVA GTUG Google Group forum.

Anyone interested in membership in the RVA GTUG, please join the Google Group and introduce yourself. If you are interested in developing with Google technologies but aren't local to Richmond, VA, you can find over 260 other active and incubating GTUG chapters at gtugs.org.

Going in Circles with Google+

My Circle Problem

Trying to create Circles in Google+ can get confusing. The taxonomy of relationships - or at least my relationships - is very, very complicated. Let's start with a Circle for friends - but not all friends are the same, really, so let's make that close friends and acquaintances, two Circles - then a Circle for family. But who actually treats all family members equally when it comes to sharing? Immediate family, extended family, in-laws, etc... more Circles. Now co-workers, people I met years ago at a conference, people I've never met but sometimes care what they have to share, etc...

Relationship taxonomy is too complex! And then I have to decide, when I go to share something, is this for my close friends? My immediate family? My in-laws? Well... yes, some of them. Not all of them. But I can't be bothered to name each individual, that's what the Circles are for!

My Circle Solution

Create Circles based on content you share, not relationships.

What does that mean? It means, think of something you share - say, vacation photos. Now make a "Vacation Photos" Circle and add to that all the people you like to share those photo with: your parents, siblings, most of your close friends, the in-laws you like, and so on. Now make one for news about your garden, your stamp collection, or whatever other hobby you have, group you are affiliated with, etc. Add people who share that hobby, affiliation, or interest. See how this goes? Repeat as necessary. Now, when you go to share, you just pick the Circle you built for that topic.

I have one other circle, "Following" which is for all the people I want to subscribe to posts from, but probably won't share with directly. I can't see myself ever using the "My Circles" or "Extended Circles" sharing options - why not just make it public? If you "Follow" anyone like I do, and I expect anyone coming from Twitter will be into that habit, then "My Circles" or "Extended Circles" might as well be public.

Oh, and the redesign

I'm the first to admit, I'm not much of a graphic artist. I always tell my project managers to hire a professional designer so we can get great looking web sites. They never listen, so I get a fair bit of design experience in the trenches. At least, I learn some of the technical side of it. I still can't get the aesthetic bits the way I want them to save my life. So, I finally sat down and redesigned the Blogger template used on this blog. The look is based on another site I'm doing for myself, my first real personal web site. I'll probably write more about that later. It's a slow work in progress. In the mean time, enjoy the new look here. Or don't. Feel free to leave comments. I won't be offended.

Update on Picasa album re-sharing and Google+

This is the notice displayed on Picasa Web Albums since joining Google+. It reads:

You've recently joined Google+. Note the following changes to Picasa Web Albums:
  • Albums you've shared can in turn be tagged and shared by others.
  • For new albums, anyone an album is shared with can see who else it is shared with.
  • When you tag someone, they receive a notification and can see the photo and the related album.

I understand that sharing transparency and re-sharing are features that make Picasa albums more social, but I would really appreciate the option to turn them off. Sometimes I want to be less social. There's already re-sharing controls for individual posts on Google+. Why do you need to open up my albums too?

Google+ Invites: Here This Evening, Gone by Morning

I sent out my first invites for Google+ last night. I posted about it and expected I'd invite a few more people in the morning, only to wake up and find the invite option was gone. According to Vic Gundotra invites were switched off due to "insane demand." Hopefully we'll see them on again soon.

So far, I'm quite happy with Google+. The privacy model makes sharing scope much more prominent than other social networking sites (why name names?). It's easy to tell who a post will be shared with and I can change that scope as I see fit using "circles" (a.k.a., groups, lists, etc.). +1 is already implemented, of course. I'm looking forward to trying a "hangout" group video chat once a few more of my friends are on board.

Google+ Me

I received an invite to Google+ (Google's latest foray into social networking) this afternoon, just hours after it was announced. My first impression is that they're going to need to tighten up the default privacy settings. Just getting through the signup process meant agreeing to have my Picasa photos and videos displayed on my Google Profile page (which I immediately went to and turned these things off). And although my "circles" are empty initially, these are also displayed on my profile by default. Turned that off too. One thing I can't seem to turn off is that joining Google+ made it so that people I share my Picasa content with can then share that content with others. Not cool, Google. Give me back control of my content. I realize it's impossible to actually prevent my content from reaching third parties after I share it (shoulder-surfing, save, etc.) but I should have the option of whether to let other people re-share my photos and videos through Picasa.

I'm still looking around, but I haven't found a way yet to invite anyone else to join Google+. So, unless my friends and family sign up and get invited (unlikely given past experiences) I may be alone here for quite a while. On the plus side (pun absolutely intended) it says that non-Google+ users I add to my circles will still be able to receive links to content I share, they just can't interact with it the way a Google+ user could. Oh, well.

The Main() Conspiracy

Typical Java

I was browsing StackOverflow this evening when I came across this question. The question itself isn't anything special, but the quote from the Thread JavaDoc caught my eye:

"When a Java Virtual Machine starts up, there is usually a single non-daemon thread (which typically calls the method named main of some designated class)."

"Typically" calls main()? I mean, sure, you could call java SomeClassWithoutAMainMethod and the JVM would start up, cough, and die. But that hardly seems worth a parenthetical shout out in the JavaDocs, right? There's got to be more to it than that.

Static Initialization

So, how can we write a Java program that runs without a main() method ever being called? We'll need code that exists outside of a named method that we can get to run before the JVM discovers the main method is missing. What happens before main() is called? The class that is supposed to contain main() gets loaded. And how do you run code when a class is loaded? Static initialization!

public class Mainless {
        static {
                System.out.println("Mainless!");
                System.exit(0);
        }
}

And there you have it: a Java program with no main() method. The static initialization block runs when the Mainless class is loaded, before the JVM tries to call main (which, you'll note, doesn't exist). "But wait," you say, "I was taught in Java 101 that every program has a main() method!" And like much of what we learn in school, that isn't strictly true. Why the conspiracy to keep Java developers writing public static void main(String[] args)? Well, it does have practical uses. For example, you can't pass arguments to the static initialization block. You could set environment variables before running Mainless and access those variables, but that's just ugly. And, you have to call System.exit() at some point or you'll get an error message about the missing main() method.

The big question: why?

But, is there any point to this? Not as far as I can tell. There's no practical use of this technique that I know of. You save a little bit of typing and get an obscure piece of code that might confuse a lot of Java developers. And I'm sure somebody, somewhere, uses this fact in an obnoxious "gotcha" interview question. I hate those.

In case you missed April 1st

In case you missed April Fools' Day today, here's a recap of some of the foolery that came my way:

Cofoja - Java Annotations for Contract Programming

This afternoon, Google announced another open source tool for Java developers. From the examples they give, it looks like Contracts for Java, or "cofoja" is assertions for abstract methods. Interesting. Looking forward to trying this on my next Java project.

Obligatory First Post From Blogger Android App

Oh, right... content. Okay. I'm posting from the new Blogger Android app. I was going to link the blog announcement, but I don't see a way to add a link here. Oops.

This is a picture of a door, taken while I am writing this. Wait, where is the picture going to appear in the post? I can't tell! So... this app needs work. Oh, well.


Update: Back at the desktop, here's the link to the new Blogger Android app. And it appears that pictures show up at the end of the post. Enjoy the door.

public int Twitter

If you would like to get your public int updates via Twitter, you can now follow @publicintblog. In addition to the automated new post feed from Feedburner, I may tweet other little tidbits I find that don't warrant a whole blog post.

See you in short form.

WebGL on Cr-48

Google released the first Chrome OS updates of 2011 to the Cr-48 today. The new version on the development channel includes Chrome browser version 10.0.634.1. Chrome 10 has (among other new features) WebGL support, which I've been eager to try on the Cr-48. The results, I'm afraid, have been disappointing so far.

WebGL Aquarium

If you've seen WebGL, then you've probably seen this demo. You've probably also seen it produce surprising frame rates for browser-based 3D graphics. The hardware in the Cr-48, I suspect, just isn't up to the job. Even with only one fish in the tank, I got a depressing one frame per second. I think one was being generous.

Body Browser

I love this one - just not on the Cr-48. The app isn't just slow, like the aquarium demo, it's unusable. But definitely check it out for yourself if you haven't already. It's very cool.

I am hopeful that WebGL performance on the Cr-48 will improve. Chrome has already done a lot to improve browser performance and I expect that will continue. The Cr-48 will probably never run the next generation of web-based 3D games, but I expect that commercial Chrome OS products will have more powerful hardware.

Google Chrome OS - Not Everything to Everyone

Over the weekend I read a few articles on why Google's Chrome OS will be (or even already is!) a "failure." The common thread running through these supposedly fatal flaws was a misconception of the fundamental reasons for Chrome OS. It doesn't do everything because it doesn't need to do everything.

A 98% solution

I have been using a Chrome OS Cr-48 netbook as my primary computer since I turned it on Thursday evening. I spend most of my personal computer time on the web. At a guess, I can probably meet 98% of my computing needs in the cloud so adjusting to the web-focused OS has been easy. I check email, catch up on the news, keep my calendar, grab a weather forecast, listen to music, and even place phone calls online. If you spend most of your computer time playing the latest first-person shooters, then Chrome OS is probably not a good choice for your primary computer.

No Drive

The Cr-48 has no hard disk or DVD drive, which I've seen decried as a critical deficiency. This is only reference hardware, of course, but I have no reason to believe that a commercial product running Chrome OS would need to have them either. There is a small solid-state drive that web apps can use for local/offline storage. There's also an SD card slot that users can fill to store downloads. I could see a user possibly wanting to pop in a DVD with home videos or photos to upload or watch, and that may be supported eventually with a USB DVD drive. Cutting out these non-essential drives will make Chrome OS products smaller and less expensive, which seem like obvious wins to me.

Chrome OS vs. Android

The fact that Google is backing two separate, yet in some ways similar, operating systems seems to confuse some people. This is in part because the two overlap: Android typically runs on phones and tablets; Chrome OS is designed to run on anything from desktop PCs to tablets.

I've had an Android phone for a few months. Before the Cr-48 came along, I would check email, Google Reader, Facebook, and run the occasional Google search on my phone. The Cr-48 running Chrome OS has certainly stolen much of that activity. It's easy to have the netbook sitting next to me while I work, and I can keep it within reach on the coffee table if I'm watching TV or playing video games. Each device (and OS) has its place and I appreciate having the choice of which to use when their features ovarlap.

Chrome OS <3 Android

What I would love to see is more interaction between Android and Chrome OS devices. Chrome to Phone is a great start. But imagine if you could sit down at any Chrome OS computer anywhere in the world - say, a friend's netbook or a kiosk in a public library - and connect your phone to the USB port. The phone would prompt you to authorize the connection, and then start acting as a proxy for Chrome OS. The computer would treat you as a guest, preventing anything you do from leaving a mark on the computer after you log off and your phone, which has already authenticated your Google account, is handling all the sensitive transactions and keeping your passwords safe. If the two devices were programmed to work together properly, things like OAuth attempts could be intercepted on the phone. Instead of typing a password on the computer you're using as a guest, you would type it on your trusted Android device. Any information you access, such as a private email, would of course still reach the computer and be vulnerable if the computer has been compromised. Or if someone is standing behind you. But that seems a lot safer, to me, than typing your password into a shared or public computer.

Let's take that idea into the business world. Now, instead of you not trusting the computer it's the computer that doesn't trust you. If you could use your Android phone (or other device) as an access card, then any computer in the office could be your computer. No more suits walking the halls carrying laptops! Your IT department installs security software on the company's Android devices and Chrome OS workstations so that you can plug into any computer in the office and pick up working on that proposal document where you left off at your desk. When you unplug your phone, the computer locks up again and forgets about you before you've turned around. Your document, instead of being on the phone or on a hard disk in your cubicle, is tucked away safely in your company's private cloud.

But back to reality, here are a few more things I've been doing with Chrome OS:

Jailbreak!

I found the secret switch in the battery compartment. I flipped it to see what would happen, but I haven't gone all the way to turning on developer mode yet. I'm still enjoying seeing what it can do right out of the box.

Apps

I installed a few apps from the Chrome Web Store, which is how you add features to your Chrome OS experience (short of developer mode; see above).

I've found Scratchpad to be useful - I have been using it to keep notes on what I want to try on the Cr-48 and what I want to write about here.

Streaming HD radio with the NPR App produced mixed results. The app is slow to respond to clicks and it takes too many clicks to do simple things, like start playing my local NPR station even after I'd added it to my "favorites." It also doesn't handle having the lid closed while live streaming. When I open up again, it starts playing for a while (clearing the buffer, I assume) and then it just stops. I have to refresh the page to get it started again. On a positive note, streaming audio didn't seem to interfere with other activities, like checking email and editing documents. Chrome OS handled multitasking well.

Writing more

I'm sure it says something about how much I like using the Cr-48 that I've written more blog posts on it in the last week than I usually write in a month. It isn't just having something to write about; the Cr-48 is easy and convenient to write with.

I'm still hoping to find a screen reader that works on Chrome OS, and I need to try video chat. Any other suggestions?