Preface
Oh boy. When writing this preface, I started off with the preface to the second edition, which began by saying how long it felt since writing the preface to the first edition. The second edition is now a distant memory, and the first edition seems like a whole different life. I’m not sure whether that says more about the pace of modern life or my memory, but it’s a sobering thought either way.
The development landscape has changed enormously since the first edition, and even since the second. This has been driven by many factors, with the rise of mobile devices probably being the most obvious. But many challenges have remained the same. It’s still hard to write properly internationalized applications. It’s still hard to handle errors gracefully in all situations. It’s still fairly hard to write correct multithreaded applications, although this task has been made significantly simpler by both language and library improvements over the years.
Most importantly in the context of this preface, I believe developers still need to know the language they’re using at a level where they’re confident in how it will behave. They may not know the fine details of every API call they’re using, or even some of the obscure corner cases of the language that they don’t happen to use,[1] but the core of the language should feel like a solid friend that the developer can rely on to behave predictably.