who is the chromebook for? a review for senior citizens, kids and students

I’m getting tired of reading reviews that say the Chromebook is more limited than a netbook and therefore a waste of money.  These reviews miss the point.  Disclaimer: I haven’t touched a Chromebook – this is culled from other reviews.
Cr-48 Chromebook cropped
Who is the Chromebook for?

I can think of a few target audiences for the Chromebook:

  1. Senior citizens who use a computer to check e-mail, view pictures of the grandkids, research vacations, maybe watch some videos on youtube and some other random surfing.  People in this group do not want anything to do with taking care of their computer; they just want it to work.
  2. Young children who are just browsing and whose parent’s want the computer locked down.  (I actually think this case is marginal since children are typically going to use educational software and outgrow it quickly.  I’d favor an iPad with an optional keyboard for this group.)
  3. Teens and college students. I didn’t think of this one but if all you do is write papers, play games and surf the net, why bother worrying about a firewall/virus scan/etc.  I also like that this review was written by a teen – aka someone actually in the target audience being discussed.

You notice who is not on the list: technical people, people who like to fiddle with the computer, people with “advanced” needs, etc.

The reviews

Now let’s look at some reviews of the Chromebook.  Nothing against the NY Times; I read that review first and got aggravated with it first.  Most of the points I brought up there I saw in other reviews as well.

Review Comments Effect on senior citizen audience Effect on young child audience Effect on teenage/college student audience
NYTimes Missing Caps Lock Key This one could actually be a limitation.  This audience learned to type on a typewriter which had a Caps Lock key.  If it is a problem, hopefully another vendor/model adds back that key. Too young to care. Probably wouldn’t mind, but would be savvy enough to use the key reassignment technique to deal with it.
NYTimes No Bluetooth, Ethernet jack, FireWire port or DVD drive. Likely hasn’t even heard of the first three let alone wanting to fiddle with them. For a DVD drive, one can listen to music online and can’t install anything, so who needs a DVD drive. If everything is online this is ok.  If not, should have a different device. Depends on the person.  I can’t imagine not having a DVD drive and being able to install software in college.  But then I was a geek and computer science major.  If someone just wants the internet, it could be ok.
NYTimes I tried valiantly to use the Samsung as my main machine, but by the end of a week, I was about ready to toss it like a Frisbee. … I took four flights with it When was the last time you saw a retired person take four flights in a week and desperately need the computer then? Needs a tablet or game for the plane.  And doesn’t fly that much. Students aren’t known for having the resources to fly so much.
NYTimes But what if you want to run real, brand-name software? Photoshop? Quicken? Skype? World of Warcraft? FileMaker or Access? How will you sync or back up your iPad, iPhone or iPod if you can’t run iTunes? What about the specialized apps that your company might require? If you need any of these apps, you need a real computer and aren’t in the intended audience of a chromebook.  And if you aren’t retired yet, your company should be providing a computer. This is why I think young children would be better off with something else. This would have killed it for me in college.  I needed way too many apps.
LaptopMag But does the $499 Samsung Series 5 deliver as much performance as similarly priced netbooks? They are framing the question wrong right in the first paragraph!  It’s not a netbook.  I actually didn’t take issue with the rest of the review.  It was very neutral and they stated things as facts rather than “limitations” so it is up to the reader to decide if that is something he/she cares about.  Nothing about target audience, but nothing against it either.
Gizmodo Built for the Future, not for the Present Like LaptopMag, the actual review was pretty neutral and stated facts.  A negative rating without any mention of a target audience though.  (and of course it is forward looking – that’s what one does entering a market)
Assorted Zdnet pages n/a While I can’t imagine using this as a work machine, ZDNet extensively talks about a target audience.  (The reason I can’t imagine it as a work machine isn’t because I am technical.  It is because I work for a bank where putting all your data in the cloud and off VPN seems insane.)

I read a number of reviews but it was basically more of the same.  Has anyone seen a review that actually review about how the Chromebook would be for some target audience?  Zdnet was all I could find from someone who has tried a Chromebook.

Conclusion


As Mark Spritzler notes “The thing with the Chromebook, is there has never been a device like this for the actual purpose that the Google Chromebook was created for.” This is precisely the problem I am seeing in the reviews.  Google isn’t trying to compete with existing netbooks or even tablets.  They are trying to create an “internet surfing machine” and reviewers are looking at what it can’t do rather than the benefits.  Going back to our target audiences: they are all groups that will pay the same amount or even a premium for something simpler.  Less complexity which means less problems which means a better experience.

WTF from the Past

The missing image

I was remembering a strange problem from a few years ago and thought I would share the issue.

We had a simple web page around the year 2002 which contained either a plus or a minus image, not unlike these: plus minus

The problem we had was that regardless of the code we used, we could only ever see the minus image. Checking the page source and viewing the image on its own told us that we should be seeing the plus image where appropriate, and yet on the page itself we only ever saw the minus image.

How does your browser scale images?

It turns out that actual images were 11 pixels wide and 11 pixels high, but the image tag was telling the page to display as 10 pixels wide. I’ll show you what that looks like in today’s browsers, but your mileage may vary: plus minus

Hopefully you saw something like this: plus minus

If you’re unlucky you’ll see something like this: plus minus

Depending on the scaling algorithm used by your browser, scaling from width 11 to width 10 may just remove the middle line, making a plus look like a minus. Problem solved. I didn’t pick it and I’m sad to say that it took too long to pick up the issue.

Java Enums can implement Interfaces

Something which came as a surprise to me but ended up quite useful, was that enums in Java can also implement interfaces.

A typical enumeration in Java, introduced in Java 5, looks like a String value, but also introduces other features which make them a particularly useful language feature. Besides looking like an typical enumeration with a finite ordered list of values, it is also possible to attach additional information to each enumeration value.

A basic enumeration, which defines the four suits in a typical set of cards looks like this:

public enum Suit 
{ CLUBS, DIAMONDS, HEARTS, SPADES }

To attach additional information to the enumerated type, add a private constructor, add a private field, and get each enumeration value to call the new constructor.

public enum Numbers {
	One(1), Two(2), Three(3);

	private Numbers(int value)
	{
		this.value = value;
	}
	
	public int getValue()
	{
		return this.value;
	}
	
	private int value;
}

In the example above, we also introduced the getValue() method. This introduces the concept of behaviour to our enumeration; not something we would normally consider. It also lends itself to the idea of common behaviour between enumerated types.

To show how this works, consider an interface which defines the mapping between a class and a table.

public interface DatabaseMapping {
	public String getType();
	public boolean isKey();
	public boolean isNullable();
	//public String name();
}

The method name() is commented for now, we’ll get back to that in a minute.

To use this, we can now create a new Java class and then define the mapping of that class to a database.

public class Person {
	public String getFirstname() {
		return firstname;
	}
	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}
	public String getLastname() {
		return lastname;
	}
	public void setLastname(String lastname) {
		this.lastname = lastname;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	private String firstname;
	private String lastname;
	private int age;
}

(I realise there are better ways to map a class to a database table, this example is contrived) When we define the mapping from our class to our table, we can define a separate mapping class. We create this class, we will make it an enumeration and allow each class/database field to be a member in an enumeration.

public enum PersonMapping {
	personId, firstname, lastname, age;
}

Using the trick where we are able to attach additional information to enumerated types, we define some of the database mapping details:

public enum PersonMapping {
	personId("INTEGER", true, false), 
	firstname("TEXT", false, false), 
	lastname("TEXT", false, false),
	age("INTEGER", false, false);
	private PersonMapping(String type, boolean key, boolean nullable )
	{
		this.type = type;
		this.key = key;
		this.nullable = nullable;
	}
	public String getType() {
		return type;
	}
	public boolean isKey() {
		return key;
	}
	public boolean isNullable() {
		return nullable;
	}
	private final String type;
	private final boolean key;
	private final boolean nullable;
}

So now we are able to use the enumeration to iterate the fields and do some database stuff. For the moment we’ll hold off including the interface.

public String dbTableCreate(String tableName) {
	StringBuilder builder = new StringBuilder("Create table ");
	builder.append(tableName);
	builder.append("(");
	for (PersonMapping column : PersonMapping.values()) {
		builder.append(column.name());
		builder.append(" ");
		builder.append(column.getType());
		builder.append(column.isKey() ? " primary key" : "");
		builder.append(", ");
	}
	builder = new StringBuilder(builder.substring(0, builder.length() - 2));
	builder.append(");");
	return builder.toString();
}

Which looks fine for our PersonMapping enumerated type, but doesn’t allow us to plug in different class-to-database mappings. Time to introduce the interface. Looking closely at the code above, we need to use two of the additional methods available to all enumerations, name() and values(). The first returns the text name of the current enumerated value, and the second allows us to access the values that make up this enumerated type.

First add the interface to the enumeration:

public enum PersonMapping implements MappingEnum{

Uncomment the name() method so that it can be accessed from the interface.

public interface MappingEnum {
	public String getType();
	public boolean isKey();
	public boolean isNullable();
	public String name();
}

Final piece of the puzzle is to write the dbTableCreate() above to allow it to be reused with other enumerated types. The problem we need to work around is that the values() method is static, making it difficult to pass the enumerated type to the method. The simple solution is to call the method explicitly and pass the values:

dbTableCreate("tableName", PersonMapping.values()));

… and realise that we can now receive the values using the interface …

public String dbTableCreate(String tableName, MappingEnum[] values) {
	StringBuilder builder = new StringBuilder("Create table ");
	builder.append(tableName);
	builder.append("(");
	for (MappingEnum column : values) {
		builder.append(column.name());
		builder.append(" ");
		builder.append(column.getType());
		builder.append(column.isKey() ? " primary key" : "");
		builder.append(", ");
	}
	builder = new StringBuilder(builder.substring(0, builder.length() - 2));
	builder.append(");");
	return builder.toString();
}

Conclusion

* Enumerations can store additional data and have additional methods,
* Enumerations can use interfaces to define behaviour,
* Enumerated item behaviour can be accessed via an interface, the same as regular Java classes,
* The values() method from enumerations can be used to return an array of a interface.

Combined, it allows us to treat enumerated types as both regular Java classes and enumerated types and interact using common behaviour rather than being tied to a single implementation.