Judge Alsup learns to code and schools Oracle
plus.google.com
plus.google.com
This exchange highlights the rather unfavorable position that Oracle finds itself in on the copyright issues. It has won nothing of significance and stands to get very little from the jury on these issues. Concerning the broader claims on which the jury hung, it still faces a potent objection from Google that it cannot assert copyright violations based on the 37 API packages owing to defects in how the Java program was registered with the copyright office. It also faces the risk that the judge or a court of appeals will hold that APIs are not copyrightable.
A word on this last item: Much as the developer community believes very strongly that APIs should not be copyrightable, the Ninth Circuit law that is binding on this judge (beginning with Johnson Controls in 1989) is not particularly favorable in that it provides that software programs are to be analyzed item-by-item on the facts of each particular case to determine whether any particular component is protectible expression versus an unprotectible idea, function, system, or method of operation (this is in stark contrast to the First Circuit, which held that judges could make categorical judgments that certain components are functional by nature and hence unprotectible by copyright (as opposed to patent), as the menu structure was held to be many years ago in the Lotus/Borland case. Google is arguing the issue categorically ("APIs are inherently unprotectible under copyright law") but this makes for a tough sell in a jurisdiction where the appellate authority has said that such issues cannot be categorically determined. Google has alternative arguments, the main one tied to a leading Ninth Circuit case (Sega) that Google argues enables copying of functional elements of any program needed to ensure compatability. But, in my view, astute as this judge is, he will be bound to apply the fact-specific approach, making it tough for him to adopt Google's strongest argument and thus significantly reducing the prospects for a definitive ruling from the judge along the lines sought by Google (of course, this might come on appeal, where the court is free to reshape its earlier precedents in light of modern-day realities in the software world).
For example, take the Java package java.io used for reading/writing files among other things. How can you construct an argument that the structure of the API itself should be copyrightable? And what would be an example of an API that couldn't be copyrighted for that matter?
In the Ninth Circuit, however, the same Johnson Controls case that held that the components of a computer program are to be assessed item-by-item to determine what is protectible and what is not also set forth the (judge-invented) doctrine that the structure, sequence and organization of elements in a computer program can be protected by copyright even if the discrete pieces are not in themselves expressive. Taking this as its point of departure, Oracle argues at length about all of the "expressive choices" that were made in the 166 API packages that are part of Java (and in the 37 API packages specifically at issue in this case), how they are named in special ways, how they are structured to take certain parameters and not others, how some call certain classes and methods not others, etc. Oracle further argues that Google could have achieved the same functionality that it gained from copying the APIs through "other means" such as APIs with different names and the like and that it could have done so without using the identical "sequence, structure, and organization" used in the Java APIs. It analogizes all this to a musical composition that is readily protectible under copyright even though individual notes are not.
I personally think the Oracle argument is a crock but, when you are able to devote huge resources to developing a case, when you can hire the best experts who can attest to the countless forms of "creative expression" of the type alluded to above, when you can pay the best lawyers to spin it out endlessly from every conceivable angle, you get the scary prospect of a court buying into this sort of analysis and mechanically concluding that, yes, all this is protected by copyright because it is "expressive" and not merely functional. This is why I think that the judge, who is bound to follow the Ninth Circuit precedent, will really need to dig deep to make a definitive ruling here that APIs are not protectible by copyright as a matter of law. An appeals court will have more freedom, however, and can focus on the purpose of copyright law and on why it is absurd in light of modern programming realities to give any party the power to monopolize API-style functionality in ways that will paralyze the industry. The judge is a very good judge and he may also land on the right conclusion - it is just harder for him because he is bound by some restrictive precedents.
At least, that's my hope. The transcripts indicate that he understands the tech better than most.
I'm pretty sure that door is closed now, so I hope you're right.
My difficulty comes from the fact that designing a good API is hard, and I think that there clearly are creative aspects to it. Doing a good job requires having an intimate knowledge of the component being interfaced with, and how programmers are likely to use it. The mere fact that we have said before "This API sucks" implies that it is not just a mechanical process.
Basically, I want one result because I feel it's better for society. But based on first principles, that's not the conclusion I arrive at.
Section 102(b) reads as follows: "In no case does copyright protection for an original work of authorship extend to any idea, procedure, process, system, method of operation, concept, principle, or discovery, regardless of the form in which it is described, explained, illustrated, or embodied in such work."
The idea here is not to give anyone a monopoly via copyright over such fundamental concepts as ideas, etc. Things that are purely functional within systems and the like fall within 102(b) and cannot be copyrighted even if they are otherwise expressive. That is what Google is arguing about the 37 Java API packages in this case.
So did Huffman encoding. So did the Laplace transform. So did quicksort, red-black trees, and hell, even the Universal Turing Machine. These are all the result of many hours of creative endeavor, yet they are none of them copyrightable.
This is the same thing that makes Wolfram's claims of ownership of the existence of a proof of Rule 110 CAs as universal calculators particularly onerous.
This is a nice analogy. APIs are more expressive than individual notes but hardly raise themselves to the level of a fully formed composition.
Imagine a list of musical phrases. That includes scales and progressions at the simplest level and pleasing variations on those themes but not enough to form a contained composition themselves -- at most a couple of bars.
Each entry could show what scales and progressions they are derived from and even suggest which other entries, in simple combination, are common or otherwise musically sound. Let's further assume that they are given convenient names.
Would that rise to the level of copyright? If someone were to create a distinct variation on that list but slightly different for use with instruments tuned in an unusual way but used all of the same names because ultimately the way all of the phrases relate to one another is the same, would that be fair?
I haven't thought this scenario all of the way through, but it seems useful to take my familiarity with software out of the process...I have to admit, at first blush, I am a bit torn.
David Boies has argued in Bush v Gore, defended Napster, worked for SCO in SCO v Linux, argued the recent California gay marriage law, was the council for US team in the recent America's cup case, and now he's Oracle's lawyer here (at least I see the last connection).
I can't discern a pattern to those cases other than their high profile nature. Wouldn't it make more sense to hire someone that is an expert in computer IP law for SCO, Oracle, Napster type cases, a constitutional lawyer for the Gay marriage and Gore v Bush type cases, etc. How can one guy be the go-to for so many high profile cases?
(IANAL but I helped AOL sue Sanford Wallace, and it was a sight to behold.)
Praise of the man:
"The one talent of David's that stands out is his ability to lay out a course of action that would take into account any sort of complicated facts and develop a far-reaching scenario. It's a chess player's sense: If I do this, the following 15 things are going to happen, and if step 11 goes so, I'll do this rather than that. It's a fantastic game-playing ability." Thomas D. Barr, quoted in the New York Times Sunday Magazine, June 1, 1986
"The Boies memory is one of the first things cited when people discuss his strengths. What's most impressive about that gift -- focused as it may be by the intensified concentration that his dyslexia demands -- is Boies' uncanny ability to recall a key fact, legal citation or piece of contradictory testimony at moments of the most intense pressure." Time Magazine, "Get me Boies!" by Daniel Okrent, December 25, 2000
As a former litigator turned startup founder, I can attest to the difficulty of assembling the right team with the ideal point man for a trial, and when you do find one you respect, he is worth every penny. David Boies is one such man - nobody has gotten fired for hiring him as the lead trial attorney.
Boies can grab enough of the subject matter to speak to the key legal issues, and to ask experts the questions that define the boundaries around those questions. Another lawyer might know more of the subject matter, but that won't matter if they can't translate that extra knowledge into legal strategy.
Remember also that while you might be able to find legally pertinent technical responses to Boies' work in court, you're reacting to that after hearing his strategy. Good trial communication requires telling a unified narrative -- if your story doesn't already provide a basis for your response, that response will be weaker and may even distract from the story you do have. Boies' ability to anticipate arguments, mentioned by another comment, is crucial to all this -- it's not enough to have an answer, you really need to have that answer in advance of his question.
> Judge: We heard the testimony of Mr. Bloch. I couldn't
> have told you the first thing about Java before this
> problem. I have done, and still do, a significant amount
> of programming in other languages. I've written blocks of
> code like rangeCheck a hundred times before. I could do
> it, you could do it. The idea that someone would copy that
> when they could do it themselves just as fast, it was an
> accident. There's no way you could say that was speeding
> them along to the marketplace. You're one of the best
> lawyers in America, how could you even make that kind of
> argument?
It sounds like the judge is saying that he has written code before, just not in Java. Presumably this was some time ago, before he decided to become a judge.My wife tells a story about a business class she took in undergrad. It was about markets and investing for non-business majors. The professor started out very clearly by explaining that the class was not going to make them financial geniuses - that it would not make them all millionaires. But, that it would help them make better decision so they could understand what the recommendations of their financial planners.
In undergrad, I took a course on the "international political economy" (on of my favorites too - Thanks Dr. Katz). Now, I don't think that means I'd be equipped to negotiate a treaty, but it does help me follow international events with a bit more context.
Do you think we should get rid of Wikipedia, so people don't spend a few hours reading about topics, lest they start to think they are experts?
Learning a little about your car can help keep you from getting ripped off by a crooked mechanic. So why wouldn't learning a little about the world help keep you from getting ripped off by political leaders and other public figures?
ftfy.
seriously though, most of these people that don't fathom the work that goes into creating software don't fathom the work that goes into designing a car, or building a house, or just what it takes to get a product made in china to their door.
> This copying allowed them to use fewer resources and accelerate that. Suppose they
> accelerated it two days. They're making $3 million a day now [...] If you just get
> one or two days' acceleration, that's $6 million
This is a good point; it's common to underestimate how long it takes to code something. And time to market is often strategically crucial - that is, productivity isn't just efficient, but can be the difference between success and failure. rangeCheck is trivial; but writing, testing, debugging, naming and documenting take time. A trivial typo bug in rangeCheck can cost a disproportionate amount of time - and it's amplified here, when rangeCheck was used to test other code. (Who shall unit test the unit tests?)To answer Groklaw's final question as to why Alsup couldn't decide on API copyrightability yet, he clearly said he needed to do a lot of reading. He not only has to decide according to law, he is in effect creating law, since this specific issue hasn't been decided earlier. His ruling has wider significance than just this particular case. Future potential litigants will read his ruling, and will avoid court if it's clear who would win. Although he is only one judge and so his precedent won't be binding on a full bench/higher court, those judges would also carefully read his judgment. He'd better get it right, not only in the result, but in the reasoning, and integrating it with related cases.
It's great that Groklaw is making these transcripts - because the court is a public institution, I think the official transcripts should be available (and why not video too? The emphasis in oral argument sometimes isn't captured in a transcript.)
I'm sure there are more than 200 developers, so that lost person day would mean much less than $150,000 in lost profits.
On a related point: what would have happened had Bloch not been able to come up with a rangeCheck function quickly?
Would Google have stopped Android from shipping until it was complete? It's more likely they would have just left it as a bug to be fixed later.
Bashing it out cowboy style would have been faster and in no way harmed Android. It's Oracle's codebase he was spending time and energy improving with good engineering practice.
My point is specifically related to Oracle's claim that Android couldn't have shipped without a rangeCheck() function, which is patently nonsense.
That this is the only direct copyright infringement they could find is highly ironic, but I guess either the lawyers didn't understand the subtleties here, or thought the jury wouldn't as this argument wasn't made (except obliquely in Bloch's statements).
There might be a nine line function that takes a day or two to get right, but for even a bad programmer, rangeCheck would take a few minutes. With thorough tests, maybe ten minutes. I've barely touched Java code in over a decade, but I could write that function -- with tests -- in less than two minutes.
RangeCheck is the kind of function you'd get on a quiz in your first week of your first CS class in college.
A set of tests took me about 6 minutes.
Programming takes time... which is why it's so powerful if you can reuse code (as Bloch did), and even better if you can find a way to reduce the code needed, or best, to avoid needing any code.
sub rangeCheck {
my ($len, $from, $to) = @_;
if (($from > $to) || ($from < 0) || ($to > $len)) {
die "Illegal index $len ($from / $to)";
}
}
Java, as usual, makes a big hairy deal out of it. If the lack of types bothers you it's trivial in Haskell too. (Though trying to be idiomatic would lead you down a very different road. Perl is more similar to Java than Haskell, even as they are all very distant from each other.)As it happens I've recently written somewhat similar code in Perl where I want to explicitly deal with out-of-range accesses (in a way other than silently receiving undefs) in a particular case, so this isn't even that odd.
private static void rangeCheck(int length, int fromIndex, int toIndex) {
if (fromIndex > toIndex || fromIndex < 0 || toIndex > length)
throw new Exception("Illegal index");
}I think in defining a range, the toIndex means up-to-but-not-including the element at that index. Thus, to include the full array, you'd use the range fromIndex=0, toIndex=length (one past the last one, since the index of the last element is length-1). With this notation, you can then make ranges of any width, from 0 up to length. If instead you included the element at that index, you couldn't have 0-width ranges (unless you allowed toIndex to equal one less than fromIndex).
I don't know whether 0-width ranges are directly useful for the Timsort algorithm; or whether it's just a convenient notation that happens to have that ability as an unused side-effect.
All this reminds me of people saying that could code stackoverflow or facebook in a weekend. The difference is that rangeCheck actually is trivial - it's just that it's easy to underestimate the work involved in coding something. Even something trivial.
I know. I reduced it to one generic exception because that is what the person I was replying to did. Bloch's version is better of course.
The ubiquitous "gotchas" in binary search are well documented; Jon Bentley did a talk on it. At Google, if memory serves.
I really thought Oracle couldn't surprise me, but they keep getting to new lows.
I don't like the idea of court video that much...bad memories of the OJ trial.
Parallelization is limited similarly to http://en.wikipedia.org/wiki/Amdahl%27s_law (usually called critical path when applied to development). I don't know the dependencies for this code, though it is part of a sort (Timsort) which was likely used by a few things, being a utility. As for test code, although TDD advocates doing it first, it's not a functional dependency. But, given the crucial importance of compatibility in this situation (reverse-engineering standard libraries), you might well want it first, to catch problems ASAP when they are cheaper to fix.
> Q. Why did you copy the rangecheck function for Timsort?
> A. It's good engineering to reuse the same function if possible
That's Joshua Bloch (it was his own code he copied).
http://www.groklaw.net/articlebasic.php?story=20120419221941... I think "good engineering" includes the accelerating factors I mentioned above (also, future modifications/bugs-fixes can be made in one place, when the same code is called, which was Bloch's long-term expectation).BTW: Some other people are responding without reading fully - please take the time to do so. It elevates the discussion, making it interesting and engaging. I am really delighted to be shown wrong and to learn something, but it's hard for a response to a comment to be persuasive if it doesn't address that comment.
Thus, if we do suppose that Android was accelerated two days, the benefit wasn't $6 million - it was having that money in hand a little earlier. The interest on $3 million for a day at 7% pa is $575/day - or $1725 total. Or less money than it costs Oracle's counsel to sneeze.
From that, it's not remotely clear whether saving 2 days to beta would have even resulted in 2 days of savings in the creation of any device.
To say nothing of whether Google/TMobile/HTC pre-selected a launch date in advance for the Dream, in which case they easily may have squandered a handful of days waiting for their desired PR timing.
All it means is you'd have had to allocate two more days worth of some programmer's time away from some less important task. For something like this, the programmer wouldn't even need to know thing one about the Android project - just that "we need our own implementation of this standard Java function".
Actually, that's not entirely true. If you swapped the "hi" and "lo" parameters, the function would return an unmodified array if rangeCheck were taken out, rather than throwing an exception. But that's the only functional change.
So the idea that rangeChange is in any way significant is disingenuous at best, I think.
Judges tend to have ego battles with lawyers and like to show off in their decisions, trying to bluff and snow each other. That seems to be what this is.
> I'm not an expert on Java -- this is my second case on Java, but I'm not an
> expert, and I probably couldn't program [rangeCheck] in six months.
I don't know, how can anyone be taken seriously after something like that? He's clearly either stupid or willfully ignorant if he thinks he (a no doubt well-educated and intelligent man) couldn't learn to program rangeCheck in six months.Yes, I know, of course his defence against this charge will be "I can't be expected to know industry-specific things like this," but then why on Earth are you allowed to regulate and prosecute it?
I believe it is incumbent upon the attorneys to understand the basics of any industry that they are involved with. I first learned BASIC in 1980(?) and have been an amateur ever since and I do believe that has helped me relate to my clients.
BTW, thanks to HN I "learned" Ruby shortly after the posting of a great article on _why.
I think Boies is trying a forest-for-trees argument here, hinting that a jury might see the issue quite differently from a judge and that Alsup is discounting the significance of prior expertise and Bloch's existing understanding of Java. It's like one side saying '(something) is so trivial, anyone would have done that without thinking' and the other side saying 'well hold on, that task requires doing ten different things in the right order, and would take even an experienced person several minutes - looks to me like you made a very deliberate choice.' It's not a terribly strong argument, but Boies isn't there to represent himself; he's there to present a view of events most favorable to his client.
why on Earth are you allowed to regulate and prosecute it?
He's litigating it. Big, big difference.
you would need to spend 6 months programming
before you could look at RangeCheck
Except that's sunken cost for education that's paid only once. You also need 12 years to go through high-school and another 3 years to get a BS.RangeCheck is as trivial as counting your fingers. Counting reliably is learned in the first year of primary school, does that mean that counting isn't trivial because it took a year to learn?
http://www.groklaw.net/article.php?story=20120515120106322
(the quoted part is on update 5)
---
Judge Alsup: "I couldn't have told you the first thing about Java before this problem. I have done, and still do, a significant amount of programming in other languages. I've written blocks of code like rangeCheck a hundred times before."
---
"Access? Google organizes the world's information! Of course they had access to the patents."
(Yes, I know this technically about copyright, but the principle still applies.)
edit: I can see it when browsing from my pc, on mobile I get redirected to a G+ signup form.
Oracle: "Because Oracle is paying me to make losing arguments?
Because I can't code, and I don't need to? I get paid to file lawsuits.
Judge Alsup, I'm just a caveman lawyer..."
Now don't get me wrong, I'm definitely cheering on Google and find Oracle's case despicable and absurd, but still.
Fine....