Review of the Kindle 4

I’ve just received my Kindle 4, the low-end ad-supported $79 model. I have a Kindle 2 as well, and because I’m traveling soon the smaller form factor and weight was attractive.

I also heard that the display was improved a lot from Kindle 2 to Kindle 3 and from what I’ve heard the Kindle 4 uses the same screen as the 3. I don’t have a Kindle 3 to compare against, but it’s definitely an improvement over the 2.

Hardware wise, it feels that it’s the same in terms of CPU: Downloading stuff from the archive still results in annoying screen refreshes and micro-hanging. Opening the on-screen keyboard results in a noticeable delay. Flipping pages or just rapidly moving through the Keyboard shows the high latency of the screen. No change, but if the Kindle Touch has the same hardware, it just fuels my belief that a touchscreen e-Ink isn’t a great experience.

It is still possible to take notes and highlight text passages. The On Screen Keyboard is not stellar, but it’s okay. I used the Keyboard on my Kindle 2 exactly 1 time so far, to buy a book from the Amazon store. I usually buy books from my Mac, and I never feel the urge to take notes. Realized how much I like 3G actually. Open Amazon on any web browser and use the "Send to my Kindle" option on checkout. Would definitely pay the extra price, if 3G were offered.

There is no Headphone jack anymore, and no Text-To-Speech anymore. It wasn’t great anyway, so I don’t care. But if you’re vision impaired and actually used that feature, you might want to know. Capacity reduction (2 instead of 4 GB) doesn’t matter, bought books are tiny, PDFs suck just as much as they did on the old Kindle, and no audio features means no music. Novels are usually around 1-2 MB, some tech books can reach 5-10 MB, and the (free) Oxford english Dictionary is 25 MB. My 31 books take up 155 MB, with about 80 MB for the mentioned Oxford Dictionary and two other, similar Dictionaries. Battery runtime was apparently reduced, but we’re still talking about a month according to Amazon (down from 2 months), a claim that is not only verified true, but also just means that it went from "So long you don’t have to worry" to "Still long enough that you won’t have to worry".

Does not come with a USB Power Brick, only with a USB Cable. Judging from the coating and looks, I assume it’s the same horrible Cable Amazon ships with all Kindles. Expect the cable to literally fall into pieces and disintegrate in a year or so. Threrefore, don’t buy these crap Kindle-branded cables as replacement when yours disintegrates (that’s a "when", not an "if") but get a plain standard Micro-B USB Cable, ironically sold by Amazon under their own brand as well.

Physical Prev/Next buttons on both sides like on the Kindle 3. They work well and have a nice touch, but I prefer the bigger ones on the Kindle 2. No more holes for book cover hinges – I liked those, but now the official Kindle covers seem to have a hard plastic shell, which is nice. $60 for a lighted cover to cover a $80 device does not look so nice, so I’ve passed on that. I love how the light is mounted though, much better than the Kindle 3 lighted cover which looked a bit makeshift.

Ads are annoying. I thought it wouldn’t bother me much, but I spend a lot of time on the Home Screen and I have 4 pages of books already. I’m only losing one row (9 vs. 10 Books per page) but it just somehow feels I’m losing a lot of space. If Amazon would offer an option to pay the $30 difference to remove ads, I’d seriously consider it. Ads themselves are not annoying and only show up on the home screen and screen saver, not during reading. So if you are cost concious, buying the ad-supported Kindle isn’t a bad thing. (Edit: You can upgrade the firmware to an ad-free one directly through Amazon)

If you don’t own a Kindle but like to read books and don’t mind that you can’t resell individual books, the Kindle 4 is a more than decent reader and a better reading experience than any Tablet will offer, including the upcoming Kindle Fire.

For size comparison, Kindle 4 lying on Kindle 2. Screen size is about the same.

Thoughts about the new Kindles

I own an iPad and a Kindle 2, and I love both devices because they are extremely good at what they are doing.

Today, Amazon announced three new Kindles, including an Android Tablet, the Kindle Fire.

Let me first say something about another new Kindle, the Kindle Touch: I don’t like it. At all. It seems like the worst of all worlds. It has a multi-touch screen, but no apps or anything, it’s the standard Kindle OS. On the other hand, it does not seem to have physical back/forward buttons. These are a killer feature for me on the eInk because I like to hold the Kindle, rest my thumb on/near the Next Button and just press it. That works so well on the Kindle 2 and 3 and I don’t see the point for not having it. The only real point I see is that selecting a bunch of text is easier (maybe for snippets?), but I think I’d rather go with the Keyboard Kindle 3. Both are equally priced anyway, at $189 for the 3G and $139 for the WiFi Model. I think this is like the iPod Nano: A gimmick

The other new Model is the low-end Kindle priced at $109, a full $30 less than the previous entry-level WiFi Kindle. I think it’s a fantastic product: It’s small and lightweight. It does not have a keyboard, but I don’t take notes anyway on my Kindle, it’s purely a reader that requires three buttons: Select book, Next Page, Prev Page. I think this one will be a massive success, if you can live without 3G.

The existing Kindle Keyboard and Kindle DX are just like they were before: The DX is still overpriced after the last Kindle 3 price cut ages ago, but great if your eyes aren’t that good anymore. The Kindle Keyboard is still a solid device to take notes or make annotations.

Now, the big new announcement is the Kindle Fire, a $200 Android Tablet featuring a Dual Core CPU, multi-touch 7” screen, full color display. It’s essentially a BlackBerry Playbook which doesn’t mean a bad thing – the hardware on that was solid, only the OS sucked. But really, the hardware is for us geeks, the end user is more interested in what this device offers, and this can be summarized with “Books, Netflix, Angry Birds, a Web Browser”.

As I said before, I love my iPad. I use it in the morning to browse the web or when lying on the couch to draw some stuff. However, the iPad is big and heavy, so I don’t usually carry it with me. The Kindle Fire addresses both problems: It’s smaller (7” vs. 10”) and lighter (413 vs. 680 grams).

Amazon is quick to say it’s not an iPad Killer, and they might be right. It’s far more likely that it will kill everything else, because why buy a $400+ Android Tablet that’s not as good as the iPad anyway? The $200 price tag is a killer for pretty much every other 7” Android Tablet, and possibly for a lot of 10” ones as well. I don’t think it will affect the iPad too much, because it not only has a strong established customer base, but also stand out features like 3G, more capacity and a 10” display.

I think it’s a safe bet to assume the price is heavily subsidized – $200 simply sounds to good to be true. Part of the money comes from Kindle books – no 30% commission fee to Apple like they would have on the iPad (if they wouldn’t have created Cloud Reader), and Amazon was once a book seller anyway. Another source of potential income is more interesting: Their Silk Web Browser.

The description reads interesting: Instead of making a ton of HTTP Requests (for JS, CSS, Images), your request will be handled through Amazon (acting as a proxy server), and they send one big chunk of data. Also, they can improve the reading experience by parsing the page and adding page indexes. It’s a bit like Opera Mini on steroids.

Now, this is a great thing to have on a 3G connection. However, the Fire does not have 3G (not surprising, I doubt carriers would be willing to make that commitment at that price). It has WiFi. So why do that? Just to add Page Indexes? This could be done on the device itself, it has a Dual Core Processor after all.

It doesn’t take much imagination and only a little bit of Paranoia to realize what this Feature does: By proxying all traffic through Amazon, they can analyze it and use it for advertising purposes. Essentially what Google is doing with GMail and AdWords.

I could whine about possible privacy concerns, but I think it’s an acceptable tradeoff if you are aware of it. You get a really nice, dirt cheap tablet and in exchange let Amazon monitor your Internet traffic. For people with Google and Facebook accounts, it’s not much difference anyway. I just hope that the amount of compatibility problems will be small, but since it’s an Android Tablet I am 100% sure you can just download a Firefox build for it at some point.

As usual, the Kindles come in a price reduced versions with Advertising on the Screensaver. That makes the new entry level Kindle a $79 device, which is a killer price for it. In fact, I ordered that just today with overnight shipping because it seems like a decent travel device, lighter and smaller than my Kindle 2 at the expense of 3G. I also preordered the Kindle Fire Tablet – if it turns out to be a dud, it’s still a dirt cheap, $200 Linux Computer with multi-touch screen, for which someone will make alternative distributions.

But really, I think we’re going to see a massive price war and the death of a lot of “Me Too” $400+ Android Tablets. And it fires the rumors of Amazon buying Netflix. And it should scare the hell out of Google. In any case, good times lay ahead.

Thoughts on OR/M

There is an updated post, written in August 2016: http://www.stum.de/2016/08/24/thoughts-on-orms-2016-edition/

It’s hard to imagine a world without OR/Ms anymore. The old days of making a query, getting a reader, looping through it, getting every column into an object…

I’m a Linq2Sql user. I like it’s relatively easy setup and good flexibility, and it has a really good query generator. However, I’m running into some issues with Unit Testing it, because you can’t really emulate all the features that it has (EntityRefs with a composite Key or fields that are DbGenerated are a nightmare). Since it is a one-off technology for SQL Server, it doesn’t work with any other database (not even SQL Compact 4, which sucks as it would be the perfect Unit Test drop in).

Some people are saying that OR/Ms are an anti-pattern, to which Ayende had an interesting reply. I don’t fully agree with any of them. I think that OR/M is solving two different problems, one that it shouldn’t solve.

The first problem is getting data from and to the database – the second problem is the mapping of the result to objects. The second problem is a good one, the first one is not a problem and thus doesn’t require a solution.

Somehow, people seem to frown SQL, as if it were some evil or outdated concept. You know what? SQL is the language of your database, so you better learn it. Oh sure, it’s nice to chain a gazillion Where/Select/ToDictionary/GroupBy calls together and don’t have to worry about coming up with the SQL yourself. It’s not so nice that the chance to produce a SELECT N+1 is pretty high. When was the last time you looked at the SQL that your OR/M generates and optimized it?

Speaking of optimizations: When was the last time your DBA improved your OR/M Code? Most DBAs I know speak one language very well, and that’s the SQL Dialect of their database. They know these hidden tricks and tweaks, they can tweak the query plan and come up with ways to speed up your queries, thus lowering the load and therefore the cost of the system. I don’t know many DBAs who would look at a piece of C# code and suggest moving the select outside of the foreach loop in order to turn a SELECT N+1 into a single select. They know the difference between the different JOIN Types (I use LEFT JOIN 99.99% of the time – who knows if there are better ways?) and are able to suggest putting in a READ UNCOMMITTED into a query that is okay to retreive slightly stale data. When was the last time you tweaked the TABLE LOCK setting on your OR/M query?

Granted, most developers don’t seem to have access to DBA people and thus have to wear a DBA hat quite often. But you know what? If you have to know about DB stuff anyway, you can as well learn SQL. Even though you may not get everything highly optimized, in the moment a DBA looks at it and optimizes stuff you just have to change your query and call it a day. Maybe you two decide to create a Stored Procedure instead, in which case your SELECT becomes an EXEC – big deal, not.

Yes, I am aware that some queries can get pretty harsh. I have a query with 14 subselects (mainly because it has to do paging on the database) and I am glad that I can write it in Linq2Sql, creating an IQueryable and passing it through a dozen methods that apply more Where clauses based on some ridiculously huge filter class a user passes in. Not having to generate that through StringBuilders or other stuff is a great thing.

But you know what? That query is the one anomaly in a sea of standard CRUD queries. I can write those CRUD queries in my sleep, blindfolded. And I can look at them and immediately understand what this thing is doing. I can read up the T-SQL manual, run it in SQL Management Studio while the SQL profiler is running, look at the Execution plan, tweak the query, put it on Stack Overflow to get some input – I am talking to the DB in a language it understands and have no limitations in how I tweak it.

Really, all I want is the Mapping. I want to write a (parameterized) SQL query, but I don’t want to do the ExecuteReader/foreach loop crap, because that’s stupid work. I want to be able to insert a Parent Row and it’s child rows in one go, without having to use client-side generated GUIDs for the primary key so that I can add it to the child rows. I love the EntitySet/EntityRef stuff in Linq2Sql, and that’s what I want. Create an Object and it’s children, put it in the database and not worry about capturing the @@IDENTITY and populating it on the children. I don’t want an OR/M, I want an Object Mapper.

Luckily, there seems to be a small (but truly existing) movement into it, Dapper and Massive being two of the better known ones. Massive uses the new dynamic functionality in .net 4, a technology that could revolutionize OR/Ms once they start embracing it (rather than trying to stick to their Java roots or stay compatible with .net 2.0). I don’t fully like how I have to create "empty" classes and it seems that it doesn’t do "real" SQL but rather a DSL that looks like SQL. That would kinda suck.

Dapper is currently used as the OR/M for Stack Overflow, It’s very bare bones (doesn’t manage your connection, no UPDATE helpers), has some not-so-nice syntax quirks (Having to pass IsAnsi = true when querying a non-unicode – but that’s an edge case I’d argue) and although I have not yet had a chance to use it, if Jeff Atwood is willing to use it on the thing that puts food on his table and rock band songs onto his Xbox, I’d assume it’s stable.

Granted, one can argue that you’re not paying your developers to write code that can be written faster in an OR/M, a claim I’d like to dispute when looking at the total lifetime of an application including maintenance, but if you want a catchy, quotable sentence: Traditional OR/M is like WebForms. It’s rapid at first, does stuff just well, may even have a fancy GUI to drag/drop your tables. But just like WebForms limits you tweaking the genrated markup or core functionality ("I need my Data Grid to render the headers in a <thead> so that the jQuery TableSorter plugin works") and sometimes requires some hacks ("I know, I just put some javascript that wraps the generated table header rows into a <thead>"), an OR/M will put up some walls that you can’t climb as well.

I think it’s time for an OR/M that is to other OR/Ms what ASP.net MVC is to ASP.net WebForms: A Framework that allows and requires us to get deep into the guts, but does not limit the tweaking we can do, while still handling a lot of the stupid work, and I think it’s great to see projects move into that direction. Just as MVC and WebForms both sit on top of an ASP.net core stack, ADO.net serves as a rock solid foundation for multiple philosophies of OR/M systems that can happily co-exist and serve both the people able and willing to write SQL and the people who’d rather spend money on an OR/M, profiling tools, and maintenance costs.