Follow Slashdot blog updates by subscribing to our blog RSS feed

 



Forgot your password?
typodupeerror
×
Java Books Media Programming Book Reviews

Bitter Java 427

Peter Wayner writes: "There are 1693 books for sale at Amazon.com with the word "java" in the title and almost all of them are earnest, chipper books that promise real programmers, dummies , and nuts that learning Java is easy. Bruce Tate's, Bitter Java , is not one these books." Read on to see if you'd like to experience Bruce Tate's bitterness first hand.
Bitter Java: The lessons taught by server-side Java Antipatterns
author Bruce A. Tate (with help from Braden R. Flowers)
pages
publisher Manning
rating 8
reviewer Peter Wayner
ISBN 1-930110-43-X
summary A collection of bad habits to avoid for server developers using Java.

Writing and reading technical books is both a pleasure and a chore. Programming computers can be great fun, but doing the job well requires almost impossible amounts of discipline, attention to detail, and pure drive. The machines churn through billions of operations per second and a mistake in just one can send everything tumbling out of control. Most authors tend to gloss over the difficulty by tossing in a spoonful of Mary Poppins because it does little good to grouse. It's just so simple and straight-forward to toss in optimistic words like "simple" and "straight-forward."

Tate's approach is looks a bit different. He wants to follow in the tradition of Frederick Brook's Mythical Man Month and talk about software development with an honest voice. Microsoft executives, Objective C devotees, and assembler lovers will be disappointed because the title is a bit misleading. He's not really bitter about Java in the way that Princess Diana was bitter about the British Royalty, he's just had a few bad experiences and he wants to help us learn from them.

In fact, he's not even writing about Java in the general sense. The book concentrates on the problems that often arise with most popular and complicated applications for the technology like servlets and enterprise Java beans. If you're building a web site based on Java, then you might want to read through this book.

The structure itself is devoted to uncovering antipatterns , a term Tate uses because it plays off the way that Sun offered Java patterns to help programmers use the new tools efficiently. Most of the chapters show the wrong way to build something and then show how to correct it.

Chapter 8, for instance, demonstrates a bulletin board that seems to be well-designed on the surface. The parts of the data structure are broken up into suitable objects and every object comes with a collection of methods that act as gatekeepers for the data inside the object. It all looks elegant, but it performs badly especially on large installations when the objects live on different servers. Suddenly, all of the extra well-meaning object-oriented engineering starts jamming the flow. Wrapping every object with so much glue code is like hiring more workers to speed up a bureaucracy. Tate shows how to aggregate the calls and speed things up dramatically by cutting through the misapplied object-oriented concepts.

If you step back a bit and think about the book from a distance, the right title starts to look like "Bitter Object-Oriented Programming". Most of the problems in the book emerge when seemingly good uses of OOP turn out to be terribly slow when implemented. While all of the problems are practical hurdles awaiting Java programmers, they must have cousins in the world of C++ and the other OOP languages. Splitting things up into many objects is plenty of fun at the beginning, but when the messages start flowing, the code becomes a swamp.

After a few chapters it becomes clear that object-oriented programming is starting to reach practical limits. The theory may be elegant, but programmers can only make it work if they use guidebooks like Tate's. The object-oriented toolkits are too easy to use dangerously. So what is the solution?

This kind of guidebook filled with antipatterns may be the best we can do for now. Tate himself says that the book is filled with "merc talk", the kind of chatter about hair raising experiences he says that mercenaries trade when they're sitting around the fire. This is an apt description. If you're a hired codeslinger creating J2EE applications or servlets, then this is a good book for your shelf.


Peter Wayner's latest two books are Translucent Databases , an exploration of how to create ultra-secure databases, and Disappearing Cryptography: Information Hiding, Steganography and Watermarking , a book about mathematical parlour tricks, sleights-of-hand, and subversive things you can do with bits. You can purchase Bitter Java at bn.com, and you can join Peter in reviewing books by submitting reviews after reading the book review guidelines.

This discussion has been archived. No new comments can be posted.

Bitter Java

Comments Filter:
  • by TechnoVooDooDaddy ( 470187 ) on Thursday May 16, 2002 @10:23AM (#3529593) Homepage
    After years of listening to manager preach about "repeatable processes" and "the replaceable engineer" it's about time someone focused on skillsets. Appropriate and judicious use of OO concepts, design patterns does not a cookie cutter make.. Component design kludged up with so much glue that software engineers these days are nothing more than component assemblers.

    Development prowess and productivity is determined by how well your code works, not how many widgets you can crank out and connect together in "internet time". It's knowing how things work, and if they'll work together well or not. It's knowing when it's better to write the damn thing yourself, instead of spending 2-3x more time and resources gluing off the shelf components together..

    I'm heading off to buy the book, if not just for the reason to support the author courageous enough to go against the grain and give this topic a voice.
  • by Glock27 ( 446276 ) on Thursday May 16, 2002 @10:24AM (#3529603)
    "Make it as simple as possible, but no simpler." - Einstein

    "Keep it simple, stupid." - anonymous

    "Limit temporary object creation." - any smart Java programmer

    Java does a pretty good job of providing much more functionality for a little more overhead. There are areas in the Java libs which seem over-engineered and slower and bigger than they should be (Swing!). Don't throw out the baby with the bath water, though...Java is good and the crufty parts will evolve into something better.

  • by sputnik73 ( 579595 ) on Thursday May 16, 2002 @10:25AM (#3529615)
    Well, that's a really intelligent question - very entertaining as well. In a post that actually relates to the book, I think that Tate does a nice job in this book of really showing proper object oriented programming. So often OOP gets used as such a buzzword that if you, as a programmer, don't embrace and beat it into the ground, you're somehow seen as substandard or writing poor code. There are tools for every job. That's why people need to get a better grasp on OOP and understand when it should and shouldn't be used. One thing that this review did not mention is Tate's crisp writing style. He writes with a slightly conversational tone but one that won't become annoying by the 50th page or so. This is a very good book and I suggest you pick it up if you believe that OOP is the cure for all of society's ills.
  • OOP can be oops! (Score:1, Insightful)

    by mbone ( 558574 ) on Thursday May 16, 2002 @10:26AM (#3529617)
    There is something about OOP that I have learned makes people want to over-apply it. The result is frequently bad, as project development times stretch out to infinity. I know of a number of OOP programming projects that got canceled because of implementation issues (speed of development, speed of use, etc.), and that is rare now-a-days in older programming languages.

    I want to read this book. I have a feeling it may be instructive in avoiding this moral hazard of OOP.
  • by sisukapalli1 ( 471175 ) on Thursday May 16, 2002 @10:28AM (#3529627)
    It is sometimes very scary when things are so, ahem, much marketed. In many places, there seems to be more emphasis on the tools and techniques used than what the product is supposed to do.

    For example, "We clinched the deal because we promised to use the J2EE/EJB framework" -- as opposed to, "Our product is good, and the guys liked our technical expertise and design." This is a "sort of" true story!

    S
  • mmmmm... Money.. (Score:2, Insightful)

    by tomblackwell ( 6196 ) on Thursday May 16, 2002 @10:28AM (#3529632) Homepage
    Way to pack those Amazon affiliate links into that submission...
  • You are clever. (Score:0, Insightful)

    by Big Dogs Cock ( 539391 ) on Thursday May 16, 2002 @10:31AM (#3529645) Homepage Journal
    Please stop posting to /.

    Anyone who tells you that a tool/language/methodology will make programming easy is a liar/fuckwit. Doing difficult things is hard. There comes a point where a system is so difficult that it makes very little difference whether you program it in VB or assembler. It's still going to be hard.

    I though perl was a girl's language but look how hard it is to fix the page widening bug.
  • The solution (Score:3, Insightful)

    by Larne ( 9283 ) on Thursday May 16, 2002 @10:31AM (#3529648)
    After a few chapters it becomes clear that object-oriented programming is starting to reach practical limits. [...] So what is the solution?
    Some people have been saying for years that the solution is functional programing [chalmers.se]. In some functional languages, wierd run-time errors become type errors caught at compile time, the absence of state makes programs much easier to reason about, and so on.

    Of course, there is no magic bullet to make software suck less, but I would strongly encourage all developers to at least look at what FP offers.

  • Cross platform (Score:3, Insightful)

    by Chris Burke ( 6130 ) on Thursday May 16, 2002 @10:35AM (#3529676) Homepage
    Advertising cross-platform code as being one of the major benefits of java was a mistake by Sun. They should have realized that a language written for a generic VM is cross-platform only if the implementations of that VM and the system interfaces it uses on each platform are 100% compatible. That's a challenge even if all the implementations are written by Sun! Considering that they are not, and that some of those implementations were written by people with a somewhat vested interest in ensuring that cross-platform operation never comes to pass, it should have been obvious that it would never come off without a hitch.

    Making "Write Once, Run Anywhere" a Java mantra was a huge mistake. It should have been more like "Write once, tweak a little, maybe it'll run... But it's easier than porting C code!" A more modest claim would have been much better.
  • by Glock27 ( 446276 ) on Thursday May 16, 2002 @10:37AM (#3529689)
    You neglect to mention the conclusion, probably for fear of reprisal by Slashbots, but I have no such fear. He advocates the total abandonment of Java.

    Oh, then he's an idiot. ;-)

    His final chapter is scathing (words like "worst" and "language" and "ever" all pop up) but is entirely factual.

    Sounds like flamebait...er...'opinions' to me. Not facts.

    The fact is Java is good for nothing but web applets and only then if you don't care about uptimes.

    Nice assertion...now back it up with some facts. You might want to start by explaining how all those application servers out there do so much useful work running Java. Then go download Eclipse (www.eclipse.org) or JBuilder and then explain how such great IDEs could possibly be written in Java. There are also plenty of great Java-based websites out there, StockCharts.com [stockcharts.com] being one example.

    Fact is, Java is very good these days. Like anything, it has it's warts...but the good far outweighs the bad. Being able to target Windows, Linux and MacOS with a single code base is sweet.

    There may be issues with specific Java libraries and frameworks. Don't confuse those with the language or runtime, which are both fairly clean.

  • Blame Colleges (Score:1, Insightful)

    by Anonymous Coward on Thursday May 16, 2002 @10:45AM (#3529748)
    Te overuse of OOP stems from the shift in the american education system from the late 1980's on. In the good 'ol days, programmers for the application world could learn how to do things as a tradesman, but now everyone has to go to college. The result is that people graduate with CS degrees that have no idea how to do things that are not for academic exercices, and some people just don't know how to do anything. So they make giant OO classes that have worthless getter and setter methods for fields that do not need to be accessed, and other worthless crap that they teach you nowadays.
    I say down with CS because daddy said it was a good idea.
    The world needs less CS graduates and more people that are compitent in the field.
    If you don't like this because it describes you, good I hate you.
  • Over-Design (Score:2, Insightful)

    by supercytro ( 527265 ) on Thursday May 16, 2002 @10:45AM (#3529750)
    One the problems with OOP is that systems tend to be over-designed and overly-abstracted out. Whilst the result may be elegant, what generally results is a convulated solution which requires a lot of work to utilise practically and efficiently. However, this in no way means OOP is 'flawed'; merely that experience and intelligent design is required instead of applying OOP as a magic bullet or as some systems are applied, a magic rocket.
  • by Anonymous Coward on Thursday May 16, 2002 @11:01AM (#3529849)
    The only programmers using design patterns are C++ and Java programmers. Do you know why? Because the "patterns" are meant to overcome language hurdles that dont occur in lisp and strictly functional languages.

    Uhh yeah. Now let's see how easy it is to maintain and upgrade your amazing functional language code over the next 10 years. Man, people who hate OO languages are funny. They just don't like OO cause they can't figure out how to program OO.
  • by mark_lybarger ( 199098 ) on Thursday May 16, 2002 @11:05AM (#3529873)
    that's an interesting twist on design patterns... to "overcome language hurdles that dont occur in lisp and strictly functional languages."

    and i thought design patterns were just typical ways other people code stuff so you can 1, learn more quickly, and 2, not have to re-think through all that. are you saing that every lisp program you come across has a completely different design? (i'm not familiar with that language).
  • by SirSlud ( 67381 ) on Thursday May 16, 2002 @11:17AM (#3529961) Homepage
    > using the advanced GOTO command!

    I was about to point out that C has GOTO when I realized that C programmers who use 'goto' in C code more than 3 times in a 2 month span invariably seem to wind up homeless and discombobulated. So, it's probably for the best that you didn't point this out ...
  • by jaoswald ( 63789 ) on Thursday May 16, 2002 @11:36AM (#3530085) Homepage
    It's not that every Lisp program has a different design, any more than every machine has the same design; however, in Lisp, there tend to be fewer obstacles to expressing a particular program design in the language. There are a wide range of reasons for that.

    One is the pervasive nature of intrinsic typing. Variables are not typed, values are. Object-oriented methods, of course, explicitly mention classes, but non-OO code does not need to explicitly type variables, except to improve performance. The flexibility of many built-in Lisp operators helps deal with multiple types transparently. For instance, length of array, length of a string, and length of a list all use the same function: LENGTH.

    Another source of flexibility is Lisp macros, which can use the full power of the Lisp programming language to rearrange and process Lisp macro calls into Lisp code. If there is some design pattern that Lisp does not natively support, you can use Lisp macros to create a Lisp "dialect" that cleanly expresses the design.

    Paul Graham [paulgraham.com], in his books, demonstrates, for instance, that if Lisp did not already have CLOS to express object-oriented concepts, that in about a hundred lines of pretty clean Lisp macrology, you can add single-dispatch methods to the language, and it looks just like "real" Lisp, and mixes with the base language transparently.

    It took Stroustrup a large effort (cfront) to add objects and methods to C, and it requires explicitly invoking a compiler program to do the translation, with name-mangling and everything else. In Lisp, you would write Lisp macros to do the same thing, and you would still be working in true Lisp. You can also add macros on macros: cfront is basically a monolith, but Lisp macros can work together; you can continuously "build up" from the language foundation, and the various layers can be overlapped.

    Any time you find yourself repeating a pattern, it suggests a Lisp macro. If you have an example of the pattern already written, it is pretty much cut-and-paste to create the general macro from the specific pattern instance.

    That kind of flexibility, which allows the programmer to mold the language to fit his (and his tasks) needs, is really what makes Lisp great to work with.

    It's something like the difference between working with Legos and clay. If you're missing a Lego part to serve a particular function, you're pretty much stuck, unless you want to injection-mold your own custom blocks. Therefore, Lego models tend to use "design patterns" where the standard blocks or parts fit together a certain way that solves a certain class of problems. Lego models, although they can be amazing achievements, all tend to look like Lego models.

    With clay, however, the medium is fluid. You can mold it to just about any shape you want. Sculptures usually look like their subject, not like clay.
  • by jaoswald ( 63789 ) on Thursday May 16, 2002 @11:44AM (#3530142) Homepage
    OO and functional are not opposing concepts. Also, you may have missed the subtle point, but Lisp is not a strictly functional language, although it is obviously function-oriented.

    Lisp has a full-blown object system called CLOS (Common Lisp Object System), which frankly blows C++'s object system out of the water, in terms of flexibility, power, and syntactic cleanliness, just for starters. Lisp programmers aren't scared of OO. It's C++ programmers who are scared of Lisp, although why anyone would be less scared of C++ is a mystery to me.

    OO doesn't magically mean "easy to maintain." It may mean "easy to find drones who think they learned the language from a book in 21 days, so they put in on their resume" which I think was your real point.

    To address the original issue, functional designs tend to be much more "factored" than procedural designs, because things are designed to use functional abstraction rather than interactions between different bits of code and variables. This tends to make them much more robust and maintainable.
  • how about (Score:3, Insightful)

    by david_g ( 24196 ) on Thursday May 16, 2002 @11:45AM (#3530148)
    ...bitter about people who decide that one language is all they need to learn and leave the rest of us having to know mediocre programming languages because that's the only way you get a job?

    ...bitter about people who keep buying into marketspeak?

    ...bitter about people who keep developing the same old language, but put some makeup on it so for it to seem different?

    ...bitter about methodologies, because they're set in stone?

    ...bitter about requirements, because they're set in water?

    ...bitter about business because you're just a "resource" to them?

    ...bitter about business programming because it's dull, insignificant, and someone should have already figured out a way to generate all this stupid code since it's been repeated some many times over?

    Heh, whatever, I need to sleep.
  • Real programming (Score:5, Insightful)

    by gillbates ( 106458 ) on Thursday May 16, 2002 @12:00PM (#3530239) Homepage Journal
    The problem with the "Learn To Program in (insert language here)" books is that they don't teach people how to program, but just how to write code in a given language.

    The hardest thing to get across to a Java/C++/VB zealot is that assembly is the most powerful language available. There is no computing algorithm, or programming paradigm that can't be expressed in assembly. I routinely write classes in assembly, and use runtime polymorphism - in fact, correct multiple inheritance is more easily implemented in asm than C++! (fewer lines, no assinine casting...) However, this doesn't mean that assembly language is the cure all for every programming problem. Some problems lend themselves to assembly (like device drivers, OS code), others to C++ (games, applications), and others to Java (web programs). What's hard is convincing people that if they understood the underlying computer science, they could write the code in the language which best suited the particular application, rather than being stuck writing in Java, or whatever HLL is popular at the time.

    Incidentally, I like assembly because of the freedom and power it provides. But I still write in Java or C++ when the needs of the project dictate. Real computer science transcends the language used, as languages come and go. Soon, Java will be outdated, and those who only learned to program in Java will find their knowledge useless.

    What matters is not whether you know langauge X, but rather that you know the fundamental algorithms of computer science and can translate them into any language. If you can break down a task into algorithms, then you can pick the language best suited for those algorithms, and translate the algorithms into code in a trivial amount of time, regardless of which language you use. What too many people miss is the fact that if you can't break a problem down into its fundamental algorithms, or translate those algorithms into an arbitrary language, your days as a programmer will be few, irrespective of how well you know a particular language.

  • by feloneous cat ( 564318 ) on Thursday May 16, 2002 @12:06PM (#3530278)
    One thing that I noted when I first dealt with the problem of C++ (yeah, the language is a problem, we all know that) - is that everyone was writing these "wonderful" classes and yet, I found that not a SINGLE ONE made writing code that much easier. Oh, it changed the paradigm, but it didn't change the amount of work that had to be done. Far from it: it actually INCREASED work because we had to learn each and every class (which, in that perverse way that programmers are, seldom had much in common).

    "So what", you may say, "just deal with it."

    Well, the problem is not "just dealing" with it - the problem is if classes do not make my life easier, write code faster, write code that fails predictably, then they are in fact failures.

    Part of my history with software is I like to write software that you look at and go "oh, I could have written that". Which is far more difficult than writing code that is hard to understand. "Intuitive programming" is what someone once called it (I forget the brilliant soul who came up with the phrase). C++, much like Java, does not fall into that category.

    Sooooo, it was with much trepedation that I plunged into Objective C. At first, I hated the syntax (and the NeXT/Apple classes). Then, quickly and surprisingly, I learned how rich and powerful it was. Best it really DID make programming easier and fun again.

    But I am back at C++ (ugh). It is again like cutting off both arms and legs and being expected to whip Jet Li's ass. Yah, right!

    OO has been touted as the best thing since sliced bread, yet I have found that for the most part it is like having bread where all the slices are tagged as "virtual" - the REAL slicing still has to be done by yours truly. And to be honest, the tools are still effing primitive. I can't believe that we STILL debug EXACTLY the same effing way we did 20+ years ago (okay, source code debugging makes it easier still, but not significantly).

    Finally, for those who expect Microsoft to save the day, 'bout time to give up on those losers. By the time they get something out and it is being used a LOT, they dump it for the NEXT GREAT THING (and folks see pink slips).
  • by Enonu ( 129798 ) on Thursday May 16, 2002 @12:23PM (#3530443)
    You do have a point in that you describing a new breed of OO programmer who likes to over-design the entire process. She'll create an interface for every class, *intend* to use design pattern X before the project starts, and then finally make sure that everything is abstracted so far, that you have to go down 4 levels of class hierarchy before everything implemented.

    This process is obviously not super-productive. However, this individual simply does not have enough *real-world* experience. After getting lectured/fired a few times for not "putting out," he'll tune his skills to be able to make better decisions on how to apply his OO know-how.

    Finally, it is my opinion that this type of programmer is overall better than simply a guy who knows how well his code works. I know a lot of hacker-types who know their code down to ++ inside the assignment wrapped in their if statement. What they produce works, however:

    * Try to maintain it. Let me bring my lawn chair and a bag a popcorn and I'll watch.

    * Try to add anything to it. This time I think I'll just have a tall glass of pink-lemonade.

    * etc.

    One the otherhand, if I was given the code written by the OO goon, I'd be more likely to understand it, and trim the fat.
  • by Anonymous Coward on Thursday May 16, 2002 @01:20PM (#3530894)
    Less complex is good. It's basically just like database design -- think of objects as being conceptually somewhat equivalent to tables. Do you want to build your tables with only one column each, so you can't run a query without joining three or four (or ten?) tables? Or do you want to have a table which takes some of the most commonly queried-for data and pulls it together so you can have a single, clean select with no joins?

    Building zillions of objects seems kind of dumb. Just like fully normalized databases seem kind of dumb. I think people hear a good idea, or theory, or whatever and just get carried away with it, like the kid who thinks, "I like salt" and then pours the whole carton of Morton's into your pea soup.
  • Re:The solution (Score:3, Insightful)

    by HiThere ( 15173 ) <charleshixsn@ear ... .net minus punct> on Thursday May 16, 2002 @01:23PM (#3530936)
    It's not that simple. There is a class of problems for which the functional approach is good. There is another class for which object oriented is good. There is a class for which procedural is good. And there is another class, for which I don't know a good methodology.

    Object oriented is good when things are easily modeled by objects. When it's easy to think of them as physical models.

    Functional programming is good when something is well described by goal states.

    Procedural programming is good when the algorithm is the thing.

    The remaining set of approaches are involved in making quick choices between options based on relative desireability. In a person one might describe this as "having a feel for the problem", but that is often confused with the modeling approach. This is more related to a ranking procedure or an emotional approach. At the moment, the best way that I know of getting this is via a neural net, but that's clearly not a desireable programming strategy. A hash table is an example of this approach in use (if not in design). But the actual methodology would need to stretch far beyond hash tables.

    For a larger system, one would want to pick one of these approaches as a basis, and interface it with two of the other approaches. These in combination would be able to synthesize an attack on the fourth method problems. Then each problem would need to be solved using the api's relavant to the particular mode that handles that kind of problem best.
  • by porkchop_d_clown ( 39923 ) <<moc.em> <ta> <zniehwm>> on Thursday May 16, 2002 @11:07PM (#3534499)

    I think there seem to be fewer patterns in Lisp, because Lisp needs them less.

    I'm sorry, but I have to reply - a lot of people are making statements like this and it only shows that they misunderstand what a design pattern is.

    A proper design pattern applies to all languages equally - because it's about design not about coding.

    Saying that Lisp doesn't need design patterns is like saying BMWs don't need drivers.

    A design pattern is something like "isolate all the hardware dependent stuff in one portion of the application" or "use a special class as a filter for translating object oriented data into SQL statements". Your examples are anything but "design patterns".

And it should be the law: If you use the word `paradigm' without knowing what the dictionary says it means, you go to jail. No exceptions. -- David Jones

Working...