+ All Categories
Home > Documents > James Gosling on Java, May 2001

James Gosling on Java, May 2001

Date post: 07-Apr-2018
Category:
Upload: danilosc
View: 227 times
Download: 0 times
Share this document with a friend

of 28

Transcript
  • 8/6/2019 James Gosling on Java, May 2001

    1/28

    Current Projects

    James Gosling on Java, May 2001

    A Conversation with Java's Creator, James Gosling

    by Bill Venners

    First Published inJavaWorld, June 2001

    Summary

    Java's Creator James Gosling talks with Bill Venners about many topics,

    including complexity, simplicity inheritance, composition, JSPs, servlets,

    and more.

    On Thursday, May 10, 2001 I peddled my bicycle up to Sun Labs in Mountain View,

    California to interview Sun Microsystems Vice President and Fellow James Gosling

    at his Sun Labs office. In this interview, Gosling gives his thoughts on complexityand simplicity, inheritance and composition, JSPs and servlets, and community

    design processes, and more.

    Bill Venners: What have you been up to this past year?

    James Gosling: Doing a lot less traveling. I'm not really going around preaching the

    gospel anymore. Folks are pretty converted these days. I hardly give talks at all

    now. I've almost exclusively switched over to doing long Q&A sessions where I getup on a stage and either people ask me questions directly, or I pull questions out of

    a fishbowl. For the last year I've been working at Sun Labs and ignoring all the

    usual corporate 'goo' that comes with working at a company.

    I've mostly been working on developer tools. I took a little hacking vacation earlier

    this year to do a relatively sophisticated Web server. It's just a pile of JavaServer

    Pages that manage the labs and the corporate document archive. And that has

    mushroomed features like mad. But my real job has been developing tools. Inparticular, I'm interested in tools for people who have to write code.

    Most developer tools try to shield you from actually writing code in constructing

    the GUI bits or the database bits. Yet when you do write code you usually get glass

    teletypes where high tech is keyword coloring. Really high tech gives you a bit of

    help as you're typing in names, but that's where it ends.

    So my work lately has centered on refactoring ideas, where you view a program asan algebraic structure, and you start doing essentially algebraic transformations on

    the program. That's been a lot of fun.

    http://www.javaworld.com/http://www.javaworld.com/
  • 8/6/2019 James Gosling on Java, May 2001

    2/28

    Bill Venners: You mean algebraic transformations in the context of refactoring your

    program?

    James Gosling: Yeah. One thing my tool will do right now is let you rename a class.

    Renaming a class at one level is really easy; you just change the name. But how do

    you change all the references to that class and all the imports? And what about

    renaming when it includes moving a class from one package to another? I did all

    this stuff to rederive all the import lists in order to deal with the various naming

    issues. But it's going even further. This is prototype number three, or maybe

    number four.

    Bill Venners: Will this tool be seen outside of Sun?

    James Gosling: Yes. If it gets to the state where it looks like it might have even a

    vague chance of being interesting. My hope is to throw it over the wall some day.

    The Complexity Challenge

    Bill Venners: In several recent interviews, you claim that the main challenge for

    programmers is complexity. Can you elaborate?

    James Gosling: In some sense, that's what this tool I am building is all about. How

    do you write a complex application? How do you deal with an application that's a

    million lines long? How do you even come close to understanding it? How do you

    make a change to a system like that? How can you cope with it?

    Another axis of complexity exists as you lay the application out on a network. One

    of the things that Java is good at is giving you this homogeneous view of a reality

    that's usually very heterogeneous. One of the things going gangbusters recently is

    the cell phone business. The last time I heard a number, it was like 60,000 Java cell

    phones were being shipped every day. The numbers have become staggering. Andthat's not the highest volume Java platform. The highest is actually smart cards, and

    that's a really big number, although I don't know the exact number.

    People building these applications that span the network from edge to center to

    edge, where you have part of the application in whatever the edge device is --

    whether it's desktop or cell phone or PDA -- some bits and pieces in the

    infrastructure, and some bits and pieces in the back ends and the databases. One

    person can work from end to end, but how do you manage the complexity of that?

    We don't have really good ways to deal with that issue. We just barely have tools

    that let us look at what one system is doing and map that across an end-to-end

    architecture. There are people who have these embedded debuggers for dealing

  • 8/6/2019 James Gosling on Java, May 2001

    3/28

    with things like J2ME devices. How do you debug code that's inside your Oracle

    database? How do you look at the whole thing in totality? That's the hard and

    interesting problem. The systems being built get more and more complicated every

    day.

    I spent a lot of time a couple of years ago on the whole real-time effort. The

    motivation for that came entirely from the real-time community. The main issue

    was that programmers are not writing a few thousand lines of assembly code

    anymore. These systems are getting really huge. And Java has proven to be pretty

    successful in building large reliable systems.

    Bill Venners: I'm glad I asked that question because I thought you might have been

    talking more about the complexity of large, monolithic programs.

    James Gosling: Yes, even isolated things. Some of these isolated applications that sit

    on one machine are a million lines of code. How do you deal with that? Most

    people have no way to wrap their head around it. There are all kinds of tools

    available, from organizational tool you get from object-oriented methodology, to

    some of the tools that are based on that, like UML modeling.

    But of course the more tools you build to cope with such complexity, the more

    complex things become. We always strain at the limits of our ability to comprehend

    the artifacts we construct -- and that's true for software and for skyscrapers.

    Bill Venners: Increasing complexity is also being driven by hardware that's getting

    cheaper and more powerful.

    James Gosling: Absolutely. One of my favorite lines is that computers are driven by

    Moore's Law, which is an exponential process, and human beings are driven by

    Darwinism.

    Bill Venners: And that's a linear process or what?

    James Gosling: One way to look at it is as a Monte Carlo process. In Monte Carlo

    algorithms, the precision of the result doubles as you double the amount of time. So

    you're getting better on a square root kind of a curve, whereas computers are going

    on a two-to-the-N kind of curve. Their curvature points in opposite directions. How

    do people with skulls of a limited size deal with that?

    The Role of Simplicity

    Bill Venners: The opposite of complexity is simplicity. I have often heard you

    describe your philosophy when designing Java in the early days: you didn't put

  • 8/6/2019 James Gosling on Java, May 2001

    4/28

    something in Java unless five people screamed at you and demanded it. In one

    interview, you told this really good story about moving to a new apartment and

    something about keeping things in boxes.

    James Gosling: That's actually a general principle for life that works really well.

    When you move to a new apartment, don't unpack. Just sort of move in, and as you

    need things, pull them out of the boxes. After you've been in the apartment for a

    couple of months, take the boxes -- don't even open them -- and just leave what's in

    there and throw them out.

    Bill Venners: The 'don't even open them' part is important because it's very hard to

    throw things away once you know what they are.

    James Gosling: Right, because if you open them, you say, 'oh, I can't part with that.'

    Bill Venners: So would you say that simplicity is a general philosophyprogrammers should always have when designing programs?

    James Gosling: I think in any kind of design, you must drive for simplicity all the

    time. If you don't, complexity will nail you. Dealing with complexity is hard

    enough.

    In programming language design, one of the standard problems is that the language

    grows so complex that nobody can understand it. One of the little experiments Itried was asking people about the rules for unsigned arithmetic in C. It turns out

    nobody understands how unsigned arithmetic in C works. There are a few obvious

    things that people understand, but many people don't understand it.

    So one of the most important criteria for judging a design for me is the manual. Is

    the manual out of control, or is it reasonably concise? You can write a pretty decent

    Java manual in less than 100 pages. The current Java language spec is pretty thick,

    but that's because it's probably the most detailed language spec ever written. It goes

    through all of the details. I couldn't write the Java language spec.

    A Delegation-Only Language

    Bill Venners: When asked what you might do differently if you could recreate Java,

    you've said you've wondered what it would be like to have a language that just

    does delegation.

    James Gosling: Yes.

    Bill Venners: And we think you mean maybe throwing out class inheritance, just

  • 8/6/2019 James Gosling on Java, May 2001

    5/28

    having interface inheritance and composition. Is that what you mean?

    James Gosling: In some sense I don't know what I mean because if I knew what I

    meant, I would do it. There are various places where people have completed

    delegation-like things. Plenty of books talk about style and say delegation can be a

    much healthier way to do things. But specific mechanisms for how you would

    implement that tend to be problematic. Maybe if I was in the right mood, I'd blow

    away a year and just try to figure out the answer.

    Bill Venners: But by delegation, you do mean this object delegating to that object

    without it being a subclass?

    James Gosling: Yes -- without an inheritance hierarchy. Rather than subclassing,

    just use pure interfaces. It's not so much that class inheritance is particularly bad. It

    just has problems.

    One of the metaphors I like to use for the whole design process is this game you see

    in arcades, particularly the older ones. If you go to the Santa Cruz Beach Boardwalk,

    there is this game called Whack-a-Mole. It's a table with 16 holes, and this little

    mechanical mole sticks his head out of one of the holes for a second. You whack it

    with a bat. He pops his head up, and you whack him, and he pops up someplace

    else.

    Engineering design is like playing Whack-a-Mole. You have a problem sticking up

    over there. You go and whack it, and it goes away. But have you really fixed it, or

    has it just moved somewhere else? It's often hard to tell whether you've solved the

    problem or moved the problem. And more often than not, when people say they've

    solved the problem, they've just moved the problem. So one of my big issues with

    things like delegation, although I feel like there's a right answer in there, is that

    delegation is going to have its own problems too. But it hasn't been used as

    extensively, so does it have more problems?

    It's almost a truism that you never actually find a perfect answer to a problem. You

    just find the answer that has the least problems.

    Inheritance vs. Composition

    Bill Venners: Given that we have both class and interface inheritance in Java, do

    you have any guidelines you would recommend to people trying to figure outwhich one of these they should use? When is it appropriate to use class extension,

    and what is the trade-off versus interface implementation and composition? Or is

    that too general of a question?

  • 8/6/2019 James Gosling on Java, May 2001

    6/28

  • 8/6/2019 James Gosling on Java, May 2001

    7/28

    Bill Venners: Two years ago, I asked you how the proliferation of network-

    connected embedded devices was going to change software, and you said, 'you

    can't sit alone in a room anywhere and write software. It's more of a social thing.'

    I've recently been involved in the Jini community, defining the process of how

    standard APIs will be agreed upon. In the very early days of Java, you were the

    benevolent dictator. And now the Java Community Process is running that show.

    James Gosling: Right. These days I'm the fly on the wall.

    Bill Venners: From your perspective, as the fly on the wall then, is there anything

    you could relate to us in the Jini community about process? What has worked in the

    Java Community Process? What hasn't? What can be improved?

    James Gosling: One of the most important things is the notion of a reference

    implementation. The ink isn't dry on a spec until somebody has built it.

    One continuing problem is the tension between having a bunch of engineers in a

    room designing and the organizations with their political agendas that turn it into

    this competitive marketing thing that quickly becomes dysfunctional. Generally, if

    the engineers can just sit down and do their thing, the end result will be higher

    quality. Then there's this problem that the word 'quality' has a point of view

    because various industrial concerns tend to look at it and say, 'well, it's not perfect

    for me.'

    Bill Venners: I see. I don't know if it was Ron Goldman and Dick Gabriel, the guys

    who wrote the first draft of the Jini constitution, or where it came from, but from

    Jini's beginning there were two houses. One's a commercial house, which represents

    people who have invested real money in the technology. They want to have a voice

    in its evolution. And the other house is nerds. They simply care about technology --

    they are the designers in a room. For a spec to be approved, it has to pass both

    houses. It's like an experiment to keep an appropriate balance of commercial andtechnical concerns. I'm not sure how well it will work.

    James Gosling: It's pretty hard, but certainly the computer industry is filled with

    examples of places where the only people in the room were really the politicians,

    and the bits of technology that came out were really goofy. It's hard. I wish there

    was a nice answer, but anytime you have more than one person in the room,

    politics is everywhere.

    Bill Venners: It becomes politics. Even in the room of engineers, you have to deal

    with personalities.

    James Gosling: Yes. That's one of the things they never teach in school, and it ends

  • 8/6/2019 James Gosling on Java, May 2001

    8/28

    up being the hardest part of any engineer's job -- the whole interpersonal thing. No

    matter where you are, you're dealing with people.

    Interface and Contract

    Bill Venners: Does an interface imply a contract?

    James Gosling: Yeah, an interface certainly does imply a contract, through whatone's notion of a contract is is pretty variable. The part of the contract that is

    embodied in the interface in Java is really about typing and what the parameters

    are. There are lots of other extensions to that. You could go into things like what

    Eiffel does with pre- and post-conditions. You can get into some pretty serious

    behavioral modeling.

    One time I had actually done a bunch of stuff to try to figure out how to do that in

    Java, long before Java was actually launched. And I got hung up on wanting the

    contract specifications to be ones that are actually analyzable, rather than just a

    Boolean expression that gets evaluated. I wanted something you could actually do

    some theorem proving about.

    Bill Venners: In other words, look at the formal contract specification and then look

    at the code and say, yeah, this code does that?

    James Gosling: Well, actually doing that all the way is--that's the fantasy of the

    folks in the formal verification field. And by and large, those people have been

    butting their heads against the wall so hard for so long that they have given up on

    the ultimate fantasy. But there are things on the way there that feel pretty valuable.

    I never got happy with doing something like that, and then we had to ship

    something.

    Bill Venners: So the contract for Java classes and interfaces ended up being ahuman language description.

    James Gosling: It's pretty much text, yeah.

    Bill Venners: So as a programmer, I have to read that text and understand it. If I

    implement that contract myself, I have to make sure I do it correctly.

    James Gosling: Right.

    Bill Venners: And then if someone someone writes to that interface, they have to

    make sure they are not making any assumptions that are not beyond the scope of

    the contract.

  • 8/6/2019 James Gosling on Java, May 2001

    9/28

    James Gosling: Right, right. The Javadoc stuff I put into the original compiler in the

    very beginning. It's funny, you talk to tech writers about Javadoc and they say, "it's

    so horrible." A good tech writer can always do a better than the Javadoc can. And

    the answer is yes, that's absolutely true. A good tech writer can organize things and

    structure things. But having the text of the spec associated with the code deals with

    all kinds of synchronization issues. When you update the code, the fact that the spec

    is sitting there in front of you kind of forces you to be aware of the spec as you'reediting. And heaven forbid, you might actually decide to conform to it, or edit it if

    it's changing.

    That is one of the central problems with all of the mechanisms that people put

    together for doing interface contracts. How do you give people the discipline to

    actually maintain them? How do you have any idea that they are correct?

    Bill Venners: That the contracts are correct?

    James Gosling: That the contracts are correct. And in particular, how do you

    express all kinds of really subtle things. Just a Boolean equation that says, "stack

    depth is greater than zero," doesn't help much when you get to more complex APIs.

    And so English language text in many senses is woefully inadequate, but it does

    have the advantage of being clear, in your face, have some hope of being updated

    regularly, and it's very flexible.

    Breaking the Contract

    Bill Venners: Last year when I interviewed you, you said, "by golly, you have to

    fulfill the contract." Certainly if the next version of Java came out and they changed

    the meanings of all the methods in class String , it would break everybody's code.

    You're not supposed to ever break those contracts. The idea of a contract is: it's a

    contract. But are there situations in which I can sometimes bend a contract? Such asif nobody is actually using something, or it doesn't hurt too many people?

    James Gosling: This is messy, right? If you are writing a bunch of code and the API

    is not exposed to people in the outside world, if you have this contained universe

    where you can actually see all the bits and pieces that reference something, then

    you're actually in a really great situation. Because you can do the kind of thing you

    just talked about. You can say, "This guy was never getting used."

    One of the nice things about Java is that, at least for the language parts, people were

    using Java for five years before we released it. And it went through a lot of really

    big changes, because although there was a developer community of about 20

    people, I could find every piece of source code in the world. And that let me do

  • 8/6/2019 James Gosling on Java, May 2001

    10/28

    experiments to find things out.

    One of the things I did was there were some issues with goto. Java had a goto at

    one point. I did this study of what people were doing with goto? And based on

    that study of a half million lines of code, I just got rid of it.

    At one point I was doing a revision to the set of bytecodes. So I found every

    constant and figured out what integers people use commonly, what floating point

    numbers people use. When you have a controlled universe, a contained universe,

    that is such a luxury. And that's why I have this tendency to not release things real

    soon. Because as soon as you have users, all of a sudden, you have this problem.

    In your question, you asked, isn't it okay to change things if nobody is using it?

    That's fine. You should be able to change things if nobody's using it. The hard part

    is, how do you know if nobody's using it? And how do you evaluate theconsequences of that change? And once your user community becomes this kind of

    unknowable group out there, then you have published this contract. You don't

    actually know which are the parts you get to dicker with and which are the parts

    you don't. You know what you've promised the world, and by God you've got to

    live by it.

    Exception versus Wrong Result

    Bill Venners: Bertrand Meyer, in his Object-Oriented Software Construction book,

    talks about his philosophy of contract. If I'm a method and I say in my

    documentation -- or my preconditions, in the case of Eiffel -- that you have to pass

    me a positive int, then if you pass me a negative number, Meyer says it's okay if I

    give you a wrong answer back. Because you have broken the contract. What he

    wanted to avoid is you checking to make sure you're passing a positive number and

    me checking to make sure you're passing a positive number.

    My take on Java's philosophy on that, however, is no, I should check for a negative

    value and throw you back an exception, so it's predictable what I do if you break

    the contract.

    James Gosling: Yes, and actually what I think the correct answer is--and this is

    what I was trying to do -- was to make the contract evaluatable as much as possible

    at compile time. So that, where possible, you could actually say, "the value you'repassing me is going to be negative or could be negative. Bad, bad, bad." Because

    when a contract violation is indicated by passing an exception, you don't actually

    see that until the code is actually running, which gives you this testing problem.

  • 8/6/2019 James Gosling on Java, May 2001

    11/28

    Whenever you're testing something, you have to make sure you actually exercise all

    these bits and pieces. And the world is filled with hunks of code that were written

    to handle some exceptional situation, and they have never actually been tested.

    It may be that if you have a parameter check, "Is this a negative number?" it almost

    never actually happens that it's negative. It's the Ariane 5 problem. Remember the

    Ariane 5 failure?

    Bill Venners: You have a link to that off your webpage.

    James Gosling: Yeah. It like blew up. And that was because they had taken this one

    piece of software with a parameter in it that had to do with the trajectory. It was

    built for the Ariane 4, but the Ariane 5 had bigger engines, and the rocket was

    getting into the flat part of its trajectory while it was still accelerating. So numbers

    were coming out of range.

    I believe it is completely beyond the sate of the art to try to do that kind of analysis

    statically, that particular one, but there are all kind of analyses that you could

    actually do. You don't declare failure if you can't do everything statically, but every

    thing that you can push into the static analysis phase of the system to get earlier

    and earlier is yet another source of reliability to the system.

    Bill Venners: Interesting. Given what we have, then -- we have Java as it is -- what

    should we do to prevent our rockets from exploding? Should I, at the beginning of

    my method, just make sure you pass me good data and throw an exception? In

    either case we have a problem, especially if this is controlling a rocket, whether I

    give you a wrong result or throw an exception. Or let me ask it this way: Bertrand

    Meyer says an exception indicates a broken contract. What do you think of that?

    James Gosling: I guess in the Java world, exceptions can mean lots of different

    things. Some of them are broken contracts. In the world ofThrowable things thatcan be tossed around by the exception mechanism, there are two classes. There are

    the ones for which the checking algebra happens. I think those are predominantly

    the contract violations. But, for example, in the file I/O system, when you go to

    open a file and the file isn't there, you get an IOException. In that case, it seems

    to me that the exception is a part of the contract and you can actually handle it.

    There are things that can go wrong for which it's actually reasonable to expect the

    application to be able to handle. And even outside of that, one of the things thatpeople do a lot in Java if they are building a command dispatch loop, and it's

    invoking things that are plugged in, is wrap that call with a try catch

    Throwable. That will catch all kinds of errors, even the ones that are contract

  • 8/6/2019 James Gosling on Java, May 2001

    12/28

    violations. That can be a really great way to increase the reliability of the system,

    because it gives you a way of saying, "Okay, this piece of the system just died

    horribly because it had a contract violation, but damn it, I've got to carry on."

    So, in the Ariane 5 case, the problem wasn't actually that they had this range

    problem, because the range problem was only in this diagnostic system. The

    problem was that when the out of range value happened (and the out of range

    value happened on all of the computers, because they all had the same code) then

    they dumped ASCII -- I don't know if it was a stack trace or what -- out on this

    main serial line. And that serial line happened to go to the gimbals that controlled

    the motors. And so, instead of getting pointing angles for the engines, it was getting

    a stack trace and the gimbals went erh! erh! The engine went erh! And the thing just

    tore itself apart.

    Bill Venners: That makes sense. It's a good justification for throwing an exception,because then I can catch Throwable. If you just give me the wrong answer, I'm not

    going to know.

    James Gosling: Right. And in systems that have to be long lived and reliable, they

    have to have a comprehensive strategy for dealing with failure, because failure

    always happens. There will always be bugs, there will always be pieces of

    equipment that get smacked. There will always be alpha particles that hit busses.

    Things go weird and the average answer, which is to just roll over and die, is not auseful one. And particularly as you get into the systems like flight avionics, you just

    don't get to crash.

    Bill Venners: You don't get to crash.

    James Gosling: From the software's point of view, you have to keep on going, you

    have to do something sensible. You can't just say, "Oops, no, I'm not going to work

    anymore."

    Assertions versus Exceptions

    Bill Venners: In 1.4, assertions are due to come into Java.

    James Gosling: Yeah.

    Bill Venners: I'm curious when you would use assertions versus when you woulduse exceptions.

    James Gosling: Assertions are just a syntax for generating exceptions. When an

    assertion fails, an exception gets tossed. So, an assertion in Java is essentially: if this

  • 8/6/2019 James Gosling on Java, May 2001

    13/28

    funny condition isn't true, then throw an exception. At its heart, that's what an

    assertion is.

    Standard assert macros in C and C++ have all done basically that. So the assert

    statement is not actually adding anything really new. What it's adding is a

    somewhat easier notation, and there's some other stuff under the sheets for enabling

    and disabling them.

    Bill Venners: If the main purpose of assertions is to streamline the process of me

    checking for things and throwing exceptions, should I remove that at run time?

    James Gosling: One of the nice things about the way Java works is that in general

    people ship around Java class files and the compilation phase happens just in time.

    These JIT compilers are all over the place. One of the really nice things you can do

    with that, which the assertion facility uses very heavily, is the code you ship around

    has the assertions in it. Assertions look like: if my gnarly test fails, then throw the

    exception. It gets turned into roughly: if assertions are enabled and my test fails,

    throw the exception.

    And the first clause in there, the "if assertions are enabled," is generated in such a

    way that most just-in-time compilers will go, "Oh, that is statically false, so false

    and anything is false, so I don't have to evaluate the assertion condition, and since

    the if is false, the then clause can never be executed." So the whole thing just dropsout. You can deliver your code with all the assertion tracking enabled in it, then,

    and at run time when you go to launch the app, you can say, "Turn off assertions."

    Bill Venners: To improve performance?

    James Gosling: To improve performance. And one of the great beauties of that is

    you can deliver one library to people rather than a debug library and a regular

    library. And they can decide.

    Too Many Little Objects

    Bill Venners: In an interview I read, you were asked what's the most common

    mistake Java programmers make, and you replied, "creating too many little objects."

    I wanted to get more information about what is too little and what is too often

    instantiated for an object. If I am making this big API or writing a program, to what

    extent should I worry about how big my objects are and how many of them I'mcreating? And isn't that a performance versus ease of use tradeoff?

    James Gosling: Often systems that have lots of little objects are easier to

    understand, easier to maintain, a lot cleaner. That's often how people get there is

  • 8/6/2019 James Gosling on Java, May 2001

    14/28

    they have taken courses on building nicely structured systems. They do that, and

    the system is nicely structured. But then a little later, you do some performance

    benchmarks and almost always, there is not a problem. But every now and then,

    you find that holy mackerel, I went to do something really simple and I'm 27 levels

    deep in methods. There was an app I was looking at the other day where the guy

    was building this data structure and the way he did it, he eventually doubled the

    storage consumption.

    Immutables

    When to use and why

    Bill Venners: How about immutables? When should I use immutables versus non-

    immutables?

    James Gosling: I would use an immutable whenever I can.

    Bill Venners: Whenever you can, why?

    James Gosling: From a strategic point of view, they tend to more often be trouble

    free. And there are usually things you can do with immutables that you can't do

    with mutable things, such as cache the result. If you pass a string to a file open

    method, or if you pass a string to a constructor for a label in a user interface, insome APIs (like in lots of the Windows APIs) you pass in an array of characters.

    The receiver of that object really has to copy it, because they don't know anything

    about the storage lifetime of it. And they don't know what's happening to the object,

    whether it is being changed under their feet.

    You end up getting almost forced to replicate the object because you don't know

    whether or not you get to own it. And one of the nice things about immutable

    objects is that the answer is, "Yeah, of course you do." Because the question ofownership, who has the right to change it, doesn't exist.

    One of the things that forced Strings to be immutable was security. You have a

    file open method. You pass a String to it. And then it's doing all kind of

    authentication checks before it gets around to doing the OS call. If you manage to

    do something that effectively mutated the String , after the security check and

    before the OS call, then boom, you're in. But Strings are immutable, so that kind

    of attack doesn't work. That precise example is what really demanded that Strings

    be immutable.

    Bill Venners: How about the wrapper types? I was asked a couple of weeks ago,

  • 8/6/2019 James Gosling on Java, May 2001

    15/28

    "Why are wrapper types immutable?" I wasn't exactly sure what to say.

    James Gosling: Same answer.

    Bill Venners: Because you can, and it helps with caching?

    James Gosling: Yes.

    Bill Venners: Okay. The tradeoff seems to be that sometimes I may end up creating

    a lot more little objects.

    James Gosling: You may. One of the proposals that keeps surfacing -- I actually

    wrote up a proposal for this four or five years ago. It's something that happened

    after Java got released, and so it gets really hard. And this one has really resurfaced

    with a vengeance lately: this notion of strengthening the support for immutables.

    Another thing about immutable objects: if you have a class that's final and whose

    fields are final, except for one nasty problem, the optimizers can do really cool

    things with them, because they don't necessarily have to allocate them in the heap.

    They can have pure stack lifetime. You can copy them at will. You can replicate

    them at will, which is what happens with primitives.

    That's one of the reasons that primitives are not objects, because it is so nice to be

    able to just replicate them. When you pass an integer to a method, you don't have topass the pointer to that integer. You can just replicate that integer and push it on

    the stack. So, it's a different integer. The same value, but a different integer and you

    can't actually tell. And if you look at a complex number class in C++ versus

    complex numbers in Fortran. In Fortran, they do all kinds of goofy things allocating

    complex numbers to registers, which really doesn't work in C++. And that mostly

    has to do with the fact that in C++, they are still objects and they have an identity.

    It's this whole platonic thing about identity. The nit that causes problems with

    optimizers and immutable objects is that as soon as you have a notion of identity

    that is independent of the value, then various things get really hard.

    Wrapper types versus primitive types

    Bill Venners: Why are there primitive types in Java? Why wasn't everything just an

    object?

    James Gosling: Totally an efficiency thing. There are all kinds of people who have

    built systems where ints and that are all objects. There are a variety of ways to do

    that, and all of them have some pretty serious problems. Some of them are just

    slow, because they allocate memory for everything. Some of them try to do objects

  • 8/6/2019 James Gosling on Java, May 2001

    16/28

    where sometimes they are objects, sometimes they are not (which is what the

    standard LISP system did), and then things get really weird. It kind of works, but

    it's strange.

    Just making it such that there are primitive and objects, and they're just different.

    You solve a whole lot of problems.

    Platonic Identity

    Bill Venners: Earlier you said "the whole platonic thing about identity." What does

    Plato have to do with identity?

    James Gosling: The notion of identity is something that the philosophers have

    argued about for a gazillion years. One of Plato's things, I don't remember the

    names, but the basic story is you have Bob the fisherman. He's out there fishing. His

    boat springs a leak. He goes to see his friend Fred, who fixes boats. Fred pulls aplank off of Bob's boat and puts a new plank in. Bob's now happy and he goes

    away. His fishing boat is now fine.

    A month later, the same thing happens again. He goes to his friend and after

    several years of doing this, every last plank in Bob's boat has been replaced by Fred.

    And so, now you have a whole new boat. Is this still the same boat? Then the trick

    to it is, unbeknownst to Bob, Fred has been saving all the little bits of wood that he

    has taken off of Bob's boat. And he's put them back together again.

    Bill Venners: And he wants to swap.

    James Gosling: So, which is Bob's boat? That with different names is one of Plato's

    things.

    Static Methods in Interfaces

    Bill Venners: Another question that I was recently asked is, "Why are there no

    static methods or non-public methods in interfaces?"

    James Gosling: There almost were. At least, they almost were static methods. And

    non-public probably would make sense. I actually don't think there is a strong

    rationale now. At one time, there was kind of a delirious period, at least for the

    requirement to do public.

    Static is kind of different in that one of the things I was trying to get to was that

    interfaces were sort of purist specification, no behavior. And it felt to me like there

    was a sort of a cleanliness to saying, "interface purely." And actually, that has often

  • 8/6/2019 James Gosling on Java, May 2001

    17/28

    worked out pretty well.

    There is still part of me that says, maybe interfaces should never have existed.

    People should just use classes for interfaces. But there turned out to be some nice

    things that get done with interfaces that are different. There's an interesting

    performance difference that most people never think about, which is that interfaces

    need to do a kind of a dynamic dispatch, whereas strict classes don't. The class

    model in Java is really rather reactionary. It's almost exactly the original class model

    from Simula 67. And one of the nice things about that model is you can make

    method dispatch just fiendishly fast.

    There are all kinds of tricks for doing interface-style dispatches, flexible multiple-

    inherited dispatches, pretty fast. But they are always a couple of instructions longer

    at least and maybe more, depending on how you it. Although there are techniques

    that trade it off against memory. You can actually get it to the same performance assingle inheritance, if you are willing to basically spend more RAM building tables.

    But one of the unsung nice things about the difference between classes and

    interfaces is that it is statically knowable whether you can do dynamic versus static

    dispatching.

    Challenge of Change

    Public versus Private Consumption

    Bill Venners: You were talking earlier about complexity being the major challenge

    for programmers. The main other thing I think of as being a major challenge for

    programmers is dealing with the uncertain future and the changes it will require.

    James Gosling: I guess one of my deals is that the word complexity covers a whole

    lot of ground for me, including the complexity of dealing with the future. The

    future becomes this great unknowable. One other thing we talked about earlier wasthe luxurious situation that some people are in when they are building an

    application, and they are the only people who will see the code. They are running it

    for themselves and that's it. When it comes to dealing with the future, those folks

    have a better situation. They can speculate the directions in which they might want

    to go. So they build the foundations for things they might do, given that they have

    the guts of the thing open right now.

    But where life gets really hard is for people who are building APIs for public

    consumption, which is most of what happens in the Java software organization. All

    of the people who are doing APIs in the JCP, APIs like Swing. One of the reasons

    that Swing is so incredibly complex is that it has to serve 3 or 4 million masters.

  • 8/6/2019 James Gosling on Java, May 2001

    18/28

    There are all these folks doing all kinds of different things, and when you are

    coming up with the API, if you come up with some speculation of the form, "Gee, I

    think somebody might want to do this," you're probably right. Even for arbitrarily

    bizarre values of "this." And it can be really difficult to keep things small when the

    domain that it's going to be applied to is so very large.

    Binary Compatibility

    Bill Venners: One thing you seemed to really care a lot about in Java was making it

    possible to make changes once you have frozen a particular API in stone. You've

    released it. You've thrown it over the wall. Now you really can't change it in a way

    that will break those peoples' code, but there are a bunch of changes you can make

    that are binary compatible.

    James Gosling: That are binary compatible, right. I was searching everything I

    could find that I could come up with a decent way to implement that would allow

    you to evolve and still maintain binary compatibility.

    Probably the central thing in that is in the virtual machine spec. The central thing is

    really about dynamic binding rather than static binding. The whole notion of

    having a just-in-time compiler has a whole lot of different aspects to it. One of them

    is this issue that if you look at a Java binary, it doesn't have fixed offsets for fields.

    It doesn't have slot numbers for virtual function tables. It's got symbolic references.And they get bound essentially as late as possible. And that gives you a terrific

    amount of flexibility. Some things seem like they ought to be obvious, that you

    ought to be able to do them, like adding private members to classes. But in

    something that does static determination of offsets of fields, you can't do that. You

    have to do all of that stuff dynamically. It really makes the issue of evolution work

    a lot better.

    Divide and Conquer + Hierarchical Composition

    Bill Venners: To go back to the subject of complexity, I think there's an algorithm

    for dealing with complexity that in general people use and in software in particular

    it's used. If you have this massive complex thing, you chop it up in pieces to start

    with.

    James Gosling: Right. Divide and conquer. It's been with us for years.

    Bill Venners: And each piece is then a understandable amount of complexity. And

    that's one of the ways I think about what a class or an object should encapsulate. It

    should encapsulate an amount of complexity that if there is someone working on

  • 8/6/2019 James Gosling on Java, May 2001

    19/28

    the guts, working on the implementation, they can understand it.

    James Gosling: Right.

    Bill Venners: And then you have interfaces to those parts. And in those interfaces,

    you raise the level of abstraction. You abstract away some of the details.

    James Gosling: Right.

    Bill Venners: For example, if someone peels of the back of my television set, they

    could focus on and understand the guts of the TV. They don't have to think about

    and understand the entire television broadcast system all at once.

    James Gosling: Right.

    Bill Venners: But when I use my TV, I just push on. And maybe when I push on, 30

    things happen inside the TV. And maybe over on this other TV when I push on, 50

    things happen inside it that are different. I don't have to know all that. I just think

    in more abstract terms of on - off. The external interface to the TV abstracts away

    much of the details of its implementation. So, if you think about pulling all these

    pieces together again, I can understand this complex whole in terms of the simpler,

    more abstract interfaces to its parts.

    James Gosling: Right. It's the pair of intellectual tools that people have used sincethe dawn of time. One is the divide and conquer, splitting things up in pieces, so

    they are individually understandable. And then there is hierarchical composition,

    where you take these things and you wrap them and put them together in these

    more and more abstract concepts.

    There are often flaws in that, though. There's a fancy word in here that I'm

    forgetting. But there is often this view that with large complex systems, you can

    deconstruct them, decompose them into their parts and then analyze themindividually. In biology, that kind of view is one of the things that led to a lot of

    major mistakes. Because you have to take this ecological view, of viewing the entire

    system. Because if you just look at a leaf or a frog, it's almost impossible to

    understand that leaf in isolation. You have to understand the whole ecology

    surrounding the leaf.

    And so, there's this dilemma. You really do need to split things down into pieces,

    but when you split them down into pieces, you have to understand that they don't

    make any sense in isolation. You can't forget the ecology within which they live.

    And so this business of on the one hand decomposition, dividing and conquering

  • 8/6/2019 James Gosling on Java, May 2001

    20/28

  • 8/6/2019 James Gosling on Java, May 2001

    21/28

    James Gosling: Right. Almost always, the less you can say, the better off you are.

    Bill Venners: Because?

    James Gosling: Because every commitment you make is a piece of flexibility you've

    lost.

    There is this duality between network protocols and interfaces. They are both kindof the same thing. They are a way for these two parties to communicate. When you

    deal at the level of a network protocol, you don't have to specify what the program

    interfaces on the other side look like. So that gives you the freedom to write a C API

    here and a Pascal API there and an Ada API there, and they can be completely

    different. They just have to arrange the bits on the wire exactly the same.

    And then the dual of that is when what you specify is the API. And you say, this is

    what it is, and how things get between here and there is, who knows? And that

    gives you a tremendous flexibility to have different ways of moving things back and

    forth. So for instance with RMI, one of the reasons that it's so popular is you can

    play all kind of games in that space in between. One of the things you can do is, if

    the two sides happen to be on the same box or in the same address space, all the

    stuff in the middle collapses out and it's just a direct call. Whereas, in these other

    systems, often you'll find that you're encoding and decoding even though you're

    not moving the bits anymore.

    But you can also play games with how you encode it. In RMI once upon a time you

    could put in all kinds of different encoders. You could put in a binary wire encoder.

    It was actually possible to write an XML encoder or an IIOP encoder. People don't

    do that much, but the ability to drop in your own encoder is basically there.

    You get independence of what the actual transport mechanism is. And to a certain

    extent, you can blend these. Because if you are doing the interface version, you candecide to target a particular binary encoding or not. So, you can get hybrid ways of

    building things. Nobody actually does that, although the RMI over IIOP stuff is

    kind of in that space.

    Bill Venners: Or for example, a Jini service proxy isn't necessarily doing remote

    procedure calls, so it could actually implement the service locally. Or it could talk to

    something across the network using any protocol. There are all these web service

    things that will probably be coming up in the next few years. You could wrap one

    of those in an object that has an interface. And when a client talked to that object, it

    would be using that XML-based protocol.

  • 8/6/2019 James Gosling on Java, May 2001

    22/28

    James Gosling: Right. So that gives you pretty tremendous flexibility.

    Testing against the Contract

    Bill Venners: Another thing you mentioned when talking about complexity was

    how do I understand the behavior of a large distributed system end to end when

    it's very complex. And I think it's worse than that, in that often the whole system

    doesn't exist. Because there are pieces that haven't even been imagined yet or

    created yet, that will eventually hook into this.

    James Gosling: Absolutely.

    Bill Venners: So the whole system can't be tested together because parts of it don't

    exist yet. And another reason large systems can't be tested as a unit is that the parts

    that do exist can simply be too vast. The test matrix is too big. Too many clients and

    too many servers that want to talk to each other. So, one of the tools that I think

    Java itself uses and I think will be important in getting things to work together that

    can't be tested together is testing against the contract. Testing each piece against its

    contract.

    Ambiguity in Specifications

    James Gosling: Right. And that's fine as far as it goes, the problem being that you

    probably don't actually know what the contract is in some sense. There is no such

    thing as a complete contract. You can write more and more, but you'll always find

    that there is some little thing that wasn't really expressed in the contract, however it

    is an artifact of the way that one system behaves that some other piece depends on.

    A standard thing that nobody ever puts in their contract is stuff about timing. You

    have a container class of some sort. It just happens to be that this container that we

    use over here does insertions really really quickly. Something else that might betotally compatible with it might have been optimized so you can do lookups really

    quickly, but insertions are kind of slow. And a lot of the time, that won't matter at

    all. Some of the times, it will be a killer.

    Bill Venners: Yeah. You said there will always be failure in the code. In the

    contracts, there will always be some ambiguity. There will be some question that I

    have when I am working on my application, and I go look at the spec and it's not

    addressed. So I don't know what the answer is. So I have to guess. Someone else onthe other side of the world may have the same question, and make a different guess.

    And now our stuff won't work together.

  • 8/6/2019 James Gosling on Java, May 2001

    23/28

    James Gosling: Right. Big problem. And in some sense, that is completely

    unavoidable, but you do what you can to make that happen less and less. I wish

    there were such a thing as a perfect answer to that question. There is this whole

    thing about mathematic specification of behavior and that ran into all kinds of

    troubles. One of its problems was that it didn't actually solve the problem, it moved

    the problem.

    Bill Venners: Because now you have to figure out what the semantics of the

    mathematical formal specifications are?

    James Gosling: Right. So, it doesn't actually provide an actual accurate

    specification. What it provides you is an alternate specification written in a different

    way. At least you can cross check the two and see if they make sense, but in no way

    is it necessarily complete.

    Bill Venners: And that's how I think of test suites, as an alternate form of

    specification. I could go out and buy the Java virtual machine spec and look at the

    Javadoc, and that's a specification for the Java Platform in a human language. And I

    can go code it up. But I can't call it's Java unless it passes this huge battery of tests.

    And I think the combination of having a spec as well defined as people can make it

    -- which is never going to be 100% -- plus the tests, gets you, not 100%, but pretty

    far along the way. I write a servlet on Windows and I deploy it on Linux and Ideploy it on Solaris, and it works.

    James Gosling: Yeah, it works. It's actually pretty amazing.

    Bill Venners: And my servlet and those Java Platform implementations were never

    tested together until I ran my servlet, but all those platform vendors ran their

    implementations through these tests against the platform contract.

    Forcing People to Pass the Tests

    James Gosling: Right. And that actually is one of the big sticking points that starts

    arguments between various folks. There are people who care about interoperability

    and people who don't. And by and large, we actually care. So we are pretty

    particular that if somebody wants to call something Java, by God it ought to

    actually run Java programs.

    Bill Venners: I think there's a third category of people. Those who care about

    inoperability.

    James Gosling: Yeah, well. There's this... Let's not go there.

  • 8/6/2019 James Gosling on Java, May 2001

    24/28

    Programmer Productivity versus Program Performance

    Bill Venners: Okay. New subject. We've talked about complexity and performance

    and change. Another thing that matters, to some extent, is the productivity of the

    programmer. I was wondering to what extent programmer productivity was a

    concern or goal, how it entered your thinking, as you were designing Java. And to

    what extent did you made tradeoffs in programmer productivity versus programperformance?

    James Gosling: It's funny how some of these things like performance and reliability

    actually fit hand in hand with developer productivity. There's a folk theorem out

    there that systems with very loose typing are very easy to build prototypes with.

    That may be true. But the leap from a prototype built that way to a real industrial

    strength system is pretty vast.

    By and large, I wasn't really concerned about how quickly you could slap together a

    demo. I was much more concerned about how quickly you could build a real

    system. And boy, strong typing is a great thing there. Anything that tells you about

    a mistake earlier not only makes things more reliable because you find the bugs, but

    the time you don't spend hunting bugs is time you can spend doing something else.

    I don't know what fraction of my life I blew away hunting down obscure memory

    corruption bugs in random bags of C code, but it's a lot. You can get a huge amountof developer productivity just out of making things less error prone.

    Bill Venners: That's interesting, because the next thing I was going to ask about

    was weak typing and Python. Have you ever done anything with Python?

    James Gosling: A little bit. Things like Python can be pretty nice. One of the issues

    with weak typing systems is they tend to be very hard to get them up to really high

    performance. In a lot of systems, for example, when integers overflow, they turninto doubles or big ints, or whatever. That means that adding a number together is

    not just an add instruction. It's: "Gee, are these guys both integers? Okay. Then I

    guess I can do an add. Let's get the integers. Oh, but this guy's a bigger number

    than that."

    So an add isn't one instruction any more. I cared pretty deeply that a = b + c

    should almost always be compiled into one instruction on just about any

    architecture. And you look at any of the JITs today and they pretty much do that. a,b, and c get optimized in the registers. And that's what it is most of these days. So

    you pay an awful lot for weak typing.

  • 8/6/2019 James Gosling on Java, May 2001

    25/28

    Bill Venners: In performance?

    James Gosling: In performance. There are certain forms of weak typing which can

    actually be pretty useful. If you have something where you are worried about

    numeric range overflow, or you have something that is mostly a small integer but

    occasionally turns into a 500 bit number, it's kind of nice to have it roll over.

    Statistically speaking, those are pretty hard to find. Most people are unwilling to

    give up their performance for that flexibility, at least in the production systems.

    In a lot of systems, however, it just doesn't matter if you spend 10-20 times as long

    doing an integer wrap. And also, a lot depends on how much you can vary in the

    libraries. So, for instance, PERL is in some sense is a horrific language in terms of

    performance, because everything is based around strings. But if the stuff you're

    doing really is string processing, the weak-typing polymorphic dispatch of

    everything doesn't matter because all the computation you're doing is done in thestring matching algorithms, and they have optimized the hell out of that.

    And so, you can end up with systems that perform just fine, so long as the real

    work is being done in libraries and what you're doing in the language is stitching

    things together. But it does mean that the language then becomes something that

    you can't actually use for everything. You can't use it for writing a string matching

    algorithm in something like PERL. Without the built-in string matching algorithms,

    it would be pretty slow. Whereas in Java, the string matching libraries are allwritten in Java. In the world of mathematics, it's a property generally known as

    completeness. How much of a system can you describe in itself, without having to

    go outside the system? That actually works pretty well in Java. You can write all

    kinds of funky low level stuff and the performance is good enough.

    Can't Hide the Network

    Bill Venners: What are the challenges of using mobile objects?

    James Gosling: It's the standard fallacies of distributed programming. When people

    use mobile objects straight out of the gate, they think mobile objects are like any

    regular objects. But you have to absolutely take into account things like the

    performance is different. At least 2, probably 3 or 4 orders of magnitude slower.

    And that's not just a minor annoyance at that level. That deeply affects your

    architecture.

    Bill Venners: You mean, if that object is doing something back on the network?

    James Gosling: Yeah, so if you have an array or an object that represents and array.

  • 8/6/2019 James Gosling on Java, May 2001

    26/28

    Pinging that thing for every element can be expensive. It might actually be cheaper

    just to make a local copy of the whole frigging thing in one transaction.

    But also, there are issues like errors. If it's not a distributed object, not a remote

    object, people tend to -- and fairly legitimately can -- ignore all kinds of errors. And

    yet when it is a remote object, you have to pay attention to the fact that the network

    can go down. Things that are equivalent to that. The remote host can be hit by a

    meteorite. Or there are a vast number of things which are similar to being hit by a

    meteorite. Anybody who does programming in California these days...

    Bill Venners: ...could be hit by a blackout.

    James Gosling: I run Solaris on my desktop here and for the last 10 years, the #1

    source of reliability problems has been the frigging power supply to the building.

    And when you are building a distributed system, talking to somebody else, there's

    this question of is he dead or is he slow? You can't tell the difference. Or did the

    network just go away and it will come back again? Or was it just glitch in the

    network? Did it just drop a few packets?

    Bill Venners: That's what Jini really tries to address with leases and the fact that

    you can put RemoteException in your throws clause to say, "This method may

    do something the network, therefore, it might be slower or it might fail." And that

    way I'll know because it will throw me back this checked exception that I have todeal with.

    James Gosling: Right. And that's really built into RMI.

    Bill Venners: It's a philosophy of not trying to paper over the fact that there may be

    a network there.

    James Gosling: Right, because if you try to paper it over, you're fundamentally

    kidding yourself. You just can't paper over either the performance issue or the error

    issue.

    Challenge of Heterogeneity

    Bill Venners: Another programmer challenge is the heterogeneity of hardware

    being programmed. This is particularly a challenge when creating mobile objects.

    The Java platform of course provides a great deal of homogeneity, but Javaplatforms are heterogeneous to the extent that different versions exist, different

    flavors exist (J2ME, J2SE, etc.), different API profiles exist, and so on. I'd like to be

    able to send out a Jini service proxy and when it lands, have it look around and

    dynamically load an implementation that makes sense. Could you speak to this and

  • 8/6/2019 James Gosling on Java, May 2001

    27/28

    other strategies programmers could use to deal with heterogeneity?

    James Gosling: The environmental differences from place to place get difficult to

    deal with. There have been a number of things that people have tried to do. This

    isn't exactly what you are talking about, but it's close, which is WebStart. In that,

    this mobile object, to use your term, comes along with a specification of the versions

    of the things it depends upon. It depends on a particular VM version at least. Itneeds the following add-on libraries. It needs the point of sale terminal and 3D

    rendering libraries. And that actually has been working pretty smoothly.

    Bill Venners: I see. We used the same describe-the-requirements approach in the

    Jini Service UI spec. We don't actually send UI objects along with the Jini service

    proxy, we send a list of descriptions of available UI objects, including describing

    required packages.

    James Gosling: Yeah.

    Bill Venners: The client looks through the list and says, "This is a JFrame. I can't

    use that because I don't have Swing, but this here is a Frame. I do have AWT, so I

    could use Frame , except that over here it says it requires the speech APIs, and I

    don't have that." So the client looks through the list and picks a best-fit UI object.

    But a Jini service proxy, that one, it just goes and needs to work wherever it lands.

    Well, it doesn't have to run everywhere, it just has to run everywhere you careabout.

    James Gosling: Right.

    Questions Never Asked

    Bill Venners: Lastly, is there anything that people never ask you in interviews that

    you wish they would ask you?

    James Gosling: People never ask me?

    Bill Venners: Something that you would enjoy talking about?

    James Gosling: In some sense, there are zillions of things that people never ask me.

    Generally, in interviews, people never ask me really geeky questions. By and large,

    I'm happy you're talking about really geeky things. This interview has beenparticularly geeky on the interview scale.

    Bill Venners: I'll take that as a compliment.

  • 8/6/2019 James Gosling on Java, May 2001

    28/28

    James Gosling: So it's been a lot more interesting. Nobody ever asks me questions

    about tree attribution algorithms or what's a good representation for a parse tree --

    basically things that nobody's interested in.

    Bill Venners: Things the readers of the interviews probably don't really care about.

    James Gosling:They don't care. It's not relevant to most people, but it's what I

    spend my days doing. Those are the kinds of things I find more interesting.

    Portions of this interview was first published under the name A Conversation with

    James Gosling inJavaWorld, a division of Web Publishing, Inc., June 2001.

    http://www.javaworld.com/javaworld/javaone01/j1-01-gosling_p.html

Recommended