>> Rob DeLine: Hello everybody. It is my... Steve Reiss from Brown University. It is also been...

advertisement
>> Rob DeLine: Hello everybody. It is my great pleasure this morning to introduce
Steve Reiss from Brown University. It is also been my pleasure over the last year and a
half or so to be a frequent collaborator with Steve. Steve and his colleagues at Brown are
pretty famous at this point for having put out the Code Bubbles user interface design for
development environments and he is going to be telling us about that today. Based on
that and the overlap between that great piece of work and some work we were doing here,
we formed a collaboration a year and a half ago, Brown University, Microsoft Research
and Visual Studio Ultimate to basically do a nice combination of what we have been
doing here with Code Bubbles. We've released that as Debugger Canvas in June. So
now there are basically two really great robust implementations of the Code Bubbles
idea. One is Debugger Canvas and Steve is going to tell us about the other one for
Eclipse this morning. So with that I will let Steve get started.
>> Steven P. Reiss: Well, I want to thank you all for coming. I understand you don't
have to come to see this. I am a professor so I am used to physical people being there
and if they weren't there I would be lost. So thank you. I also have two talks today, so
I'm going to kind of rush a little bit and see if I can get to the second one or not.
>> Rob DeLine: He has also had three Diet Cokes in the last hour or so [laughter].
>> Steven P. Reiss: Ask lots of questions so that I get to drink this one too. I also had a
big cup of tea, lots of caffeine in the morning and then I will sort of taper off at the end of
today so I can sleep on the plane tonight.
Okay. So I am going to talk about Code Bubbles making whatever that says.
Programming is fun. I think so at least. The problem is all of my students and everyone
else tells me that programming is still too difficult. I don't know why they are coming
out with that. This is why they don't let me teach intro classes. So I am trying to make
programming easier and one of the things I have been working on for many, many years
is tools to make programming easier in the development environment. It is supposed to
help. What is wrong with today's programming environments? Take Eclipse for
example, or take any other one you would like to have there.
One, they don't match the way programmers work. Programmers tend to think in terms
of working sets or tasks. The task involves a piece of file here, a piece of the code here, a
piece of code here, a piece of documentation here, an e-mail message from somebody, a
bug report, all types of things. You have to put up and view all at once then go back and
forth with. Environments are typically file oriented; they are not task oriented. It is hard
to organize stuff; it is hard to see everything. You have to keep it all in your head all at
once. This makes it fairly inefficient to use. So you have to do a lot of navigation.
Studies have shown up to 40, 50 and sometimes even 80% of your time is spent
navigating, finding what you want. You get no sense of context. They are not
particularly efficient with screen space. I had two displays back in 1990 for
programming. I now have four. Whenever they get around to building the machine I
suspect out in July, I am going to double the resolution of my main displays, two of them.
That is only for one machine. I also have, I have seven in my office actually. I had nine
at one point; they took some of them away, but four some on one machine, two on
another and one on two other machines. But screen space for programmers is one of the
most valuable resources we have. Eclipse is particularly inefficient. I can only use two
of my displays at once. I can't even use four them for Eclipse. Because they are set up as
multiple screens, so I can't use all seven right now, which I would love to be able to do.
They also because you have to share the screen space, these things are very complex. It
is very hard to make new tools here. People do it, but the tendency when you create a
new tool in Eclipse is to abort Eclipse and one of the things that you find out if you abort
Eclipse is you leave all of your files in a funny state, not just your source files, those you
can recover, but your Eclipse files, and therefore you have to reinstall Eclipse all the time
in order to get anywhere.
So what we're trying to do with Code Bubbles is first make the programmer more
efficient, make life easier for the programmer. We are trying to provide an intuitive
environment, something that it does what the programmer wants, works the way the
programmer thinks. We want to support all aspects of development, so we are trying to
complete the full programming process. And we want to make programming easier.
People think it is too hard. We will try to make it easier for them, and my goal is to keep
it fun. So I want to keep my programming fun here. So I am supposed to do a demo, so
let's see what happens here.
Okay, so this is Code Bubbles, our version of Code Bubbles as it comes up. This is
running on a program; this is the program. If you have ever seen, this is based on a toy.
It has a pendulum hanging above and sort of magnets down below. It is called Romp.
And you set the magnets and they have a plus side and a minus side and you can sort of
figure out which is which, and you can see the pendulum flowing back and forth. What
is wrong with the program? Do you see any bugs? Well, a couple of things. One I
wanted that to be red; that's easy. We will do that first. Two, these pluses and minuses
aren't centered. I am fussy about that. I like good user interfaces. Those should be
centered. So we want to deal with those things. Here you have the environment. Let's
do the easy thing which is change the color of the pendulum to red, so where would that
be?
Well, if you know anything about Java, which you probably don't, being Microsoft
people, there is a routine called Paint or Paint Component and that is where all of the
drawing is done. So we will just search for Paint. It helps to spell it right. And there is
only one paint routine in this code so we will click that. There we go. We will get to this
extra bubble here later on. Right now I will just enter something. What the… Okay. So
here is the color and someplace here is magnets are growing red? That doesn't make any
sense. Magnets--here is the pendulum. Draw a pendulum. So it looks like the pendulum
drawing; we can move these bubbles around. It is done, if you can read this, it says draw
a pendulum there. And we want to see what that is. So we just click F3, go to definition
and it brings up a bubble with the draw pendulum routine. Now it doesn't matter where
this is in terms of files. I will use this mouse and probably be better off. Move this
around, the group, you can move groups around if you want, and here there is lots of
debugging code. Here is color blue, so we will just change that to red. Red. And that
should fix the color going to be red.
But you can do lots of things here. You can bring up bubbles. You have search, you can
go in here and look at various routines. You can pull them out, move them around the
screen. I can bring up, if I choose set color, it brings up the documentation for set color,
rather than the code because it is a system library. I can move these around, rearrange
them however I want. I can go look at this routine. Notice the bubbles don't overlap.
Notice that that did overlap when I brought it up. I will get to that. I get to move it
before it does. I don't have to move it. It will settle in place in a little while. You can
bring up note bubbles. We will get to these. You can have notes just sitting around. I
can also create notes and I will show you that later on, that are attached to the source and
permanently attached, but you get some sense as to what is going on here.
These are full-fledged editors, do all of your editing in these things. You can create new
routines here in various ways, so I can go here. If I want to add a new method, I can
create a new method either before or after or at the end of the class. I can create new
fields. Add new fields, add new intro classes, all types of things and also create new
comments. I have to pull my--it's not from that box. Well, okay, I can't do that. Okay.
But you get some sense of what is going on here and what I am talking about.
Most of this--let's go back to our slides. Most of this we had working about two years
ago. So why am I still working on it? What is going on now? Moreover, the papers
came out about a year plus ago and I haven't written any more on this. What is taking all
the time to see why are we--what's up? Well, a couple of things, one, I believe in the
idea, and therefore I wanted to be able to use it myself, so we wanted to get the system to
the point where it is actually usable for real programming. Two, there are a number of,
we ran into a number of problems, some of which just take time to fix, others of which
are actually interesting and will eventually lead to papers and research. Let's look at
some of these problems.
First of all, you quickly realize that languages are complex, even something as simple as
Java when you take it from a programming environment point of view tends to be quite
complex. There are a lot of little features there that are hard to deal with from an
environmental point of view. Especially if you go to the definition, what is a class? Well
if you have an anonymous class that is inside of a method, is that a class? Is that not a
class? How do you want to display that? What do you want to display there? If I go to
all these places that this could be called, how do I find all of these things in inner classes,
in anonymous classes, things that aren't even named? The environment needs to handle
all of this.
Moreover, things we haven't gotten to yet, you come to realize that your systems aren't
just Java systems; they aren't just whatever. They are multilingual. How do you deal
with that? Eclipse sort of does, but not very well. We really would like to have a good
environment that does that even for our own code. Second problem we had is how do
you architect this environment? As I said, putting things inside Eclipse gets tricky. You
tend to abort Eclipse. Eclipse is big and massive. It is not particularly flexible. There
are a number of practical points like you have to use SWT which I did not want to learn
at the time having already known Swing, so we did things outside of Eclipse and we
wanted it to be as flexible as possible so we have our own Code Bubbles running here as
a separate process, talking to Eclipse and we have a little plug-in inside of Eclipse that
does the talking and lets us access Eclipse and lets Eclipse send out messages saying
what is going on to Code Bubbles and Eclipse talks to the user app.
Reason for this architecture will become apparent as we go on in the talk. There are
many ways that we use it. We needed to do reflow and elision, that is key to bubbles.
You want to have the minimum--the bubbles are small. You want to make effective use
of screen space. You want to truncate lines. You want to remove lines that aren't
relevant. We have tried a variety of ways here. We wanted to make sure that it was
natural, that it didn't get in the way of the programmer, so what we do is we use the
complete indentation rules for reflow, so reflow is if you hit a carriage return there, it will
indent it. That works a lot of the time; it doesn't work all the time so we had to do
exceptions, so there are some places where it is going to put it all the way on the right
anyway and not save you any space. We had to make those exceptional.
Elision, you would think you could just use the AST for elision or something simple like
that. Well, that works in about 80 to 90% of the cases, but there are a number of
exceptions. ASTs for “if then” statements with lots of “else’s” tend to be fairly complex.
They don't match the way the programmer thinks. It is not deeply nested; it is linear, so
we have a number of exceptions and actually what we have is a generic pattern-based
system on the ASTs that lets us essentially assign priorities to every AST node for doing
elision. And then we wanted to, we had no idea what the users wanted and so we gave
them everything. So you can run it with no elision or never do elision, never update the
elision if it's there except manually. We also had the opposite extreme, which is always
update the elision. Look where the cursor is and make sure that whatever is near the
cursor is not alighted and anything farther away can be alighted. We also make it easy to
avoid both of these. We have a one button, one keystroke command which will make the
window big enough so you don't need any reflow automatically. Another button which
will get rid of all of the elisions, and other that will re-do elisions. It will re-do reflow
and resize.
So we worried a lot about that. We did a little bit in the initial view on code creation. It
turns out if you are a programmer you are always creating code for some reason, even
when you are sort of thinking about fixing bugs, you are still creating code. You have to
add new methods. You have to add new classes, so this occurs fairly frequently.
Moreover, you worry about your system. It has to be done in the right context. Classes
have to go the right place. Methods have to go in the right class. You have to go in the
right place in the file. You are fussy about these things. You might want to write
comments in front of them, and it all has to be done right. If you don't do it right, then
programmers have to go and correct it later on and they don't like doing that. You have
to make sure how you do it. We have a number of solutions here. We have a very
flexible template insertion system. Actually we have several different systems, they are
simple ones; they are user templates. There is an AI-based system that we have plugs for
where it will learn what your formatting is and then reuse that. We haven't gotten that
debugged yet, but it is sort of there; it learns how methods are added. We have intuitive
insertion commands. You can just type in the right place and then pull it out into a new
bubble or you saw the ad things there. We have added things in a lot of other places as
well.
And we are working on various places where you know you need a method and we will
create it automatically and try figuring out logically where the right place is where you
have an undefined method or where you want to create a test case or things like that. We
have performance issues, as you would imagine here. Programmers expect the
environment to perform. What happens on keyboard input? You think what is going to
happen when I type a key? Not much, right? This is part of the second talk actually, but
we might be able to click on it here. Tell me if this shows anything, yeah. It does. This
is what happens when you click a key. And this is just an abstract point of view of what
happens when you click on a key. So you have all of that stuff happening in the main
thread where you handle the key, and then you have a number of asynchronous events
happening down here, multiple, sometimes multiple times. How fast should keystrokes
be? All of this has to get done every keystroke. So we had that problem. Are we back
there? Yeah.
And we also found that the graphics, doing fancy graphics slows you down. So what we
did here, a number of solutions, one the graphics is a lot simpler than maybe the original
videos. You might not notice it, but they are not as rounded. Turns out that 25% of the
time spent in Code Bubbles is still spent drawing the group boundaries. That is where
most of our runtime is. And we also do a lot of background threading. We have a big
thread pool and a lot of the work is done there. And then Eclipse has its own thread pool,
so we are really making use of all of the cores in your machine. And we have lots of
them. Another problem we had is, yeah?
>>: Is it okay to ask a question right now?
>> Steven P. Reiss: Sure. Then I get to drink more [laughter].
>>: So what is the exact reason that you guys are tying into Eclipse? I mean do you
need to tie into Eclipse to actually have your own IDE that can operate on Java or operate
Java?
>> Steven P. Reiss: I didn't want to really implement all of the debugging, all of the stuff
that Eclipse does.
>>: Oh, okay.
>> Steven P. Reiss: In theory, another reason we had it separated like that is so you can
tie into any environment you want. If you wanted to tie into NetBeans or Visual Studio
in theory, the interface there is fairly simple. Actually I want to tie into Python at some
point, and not necessarily use Eclipse Python which is huge and messy. I am not going to
implement the whole debugging framework. I am not going to implement the parsing
compilation. I'm going to let Eclipse to my parsing for me.
>>: [inaudible] the interface that you are doing when you are navigating your code and
[inaudible]?
>> Steven P. Reiss: We are doing mostly front end stuff. We do have our own--we are
doing more and more of the backend stuff, but I am leaving the groundwork; I didn't want
to re-implement it. I could have just put something else there. So what does undo mean
in this framework? If I hit undo in Eclipse, what happens? It undoes the edits in the
order that you actually did them. That doesn't make sense. You think about each
individual bubble as its own editor. You want to undo in that bubble. What is the
problem with this? Well, there are intricacies; you can have two bubbles with the same
code or one bubble with a class and another bubble that is a function of the class. They
are overlapping. There are dependencies between these undos. So we have to figure out
what this means. Undo in general will undo edits in the current bubble. It does what the
user expects, however it detects internally what the dependency is and if there are
dependencies that it can detect or that it does detect then it will undo all of the edits in the
other bubble to make sure that it is consistent at that point. Otherwise it won't.
This seems to work the way people expect it to, or at least the way I expected to. I
haven't had any problems with it. But it was an interesting case. The other thing you
find out if you start using this environment for any long period of time, and this you can
see up here is an overview of what is going on. And let's see where are we currently? Oh
you can't see in that picture. It is just a little bit of the screen. But this is, you can see
there are only three bubbles here, three bubbles there, it is huge. It becomes messy. If I
use this for several hours, the whole top display becomes like this. Screen complexity
just gets overwhelming, because you have your whole history there. And it is not
particularly well defined how things got laid out, so we have tried various things. The
first thing that happened, is it used to when you popped up a bubble it popped it up right
next to you; typically our bubble is right next to you, and it has to move things out of the
way. That moved things out of context and you lost your context that you had before.
You lost your layout that you had before. This was not good.
So the first thing we tried and we still do is when you pop up a bubble, it will look at the
group in general, these things that are the same color, and pop it up to the right of the
group and move it there. So you don't rearrange the group every time you add a bubble.
Next thing we did was give the user control. This worked in some cases and didn't in
others. So now what happens when you pop up a bubble is it will sit there for 2 seconds
before it drops in and moves the other bubbles out of the way. But you can move it in
those 2 seconds, and move it to wherever you want it to be fairly easily, just right click
the mouse on it and move it. And after you move it, then it drops in essentially at that
point quick, within a fraction of a second. So that was another thing that we tried and it
seemed to be quite successful. That has become very natural to me.
Some of the things that we are working on actually a student did one of these, and never
checked it in, which means it is not usable. Automatic layout. So I want to layout the
screen. So you can do this in two ways. You can do the simple thing which is just
rearrange the windows so they are nicely spaced and columnar and layout. You can also
do it intelligently. You have relationships, you know, you pick this bubble from this one
because it was dependent upon it, because there was a call there. We have the call
relationships. We know which bubbles are variable declarations. Maybe they should be
on top. We know which are class bubbles, maybe they should be to the left of all of the
method bubbles of that class. We are working on automatic layout feature which takes
all of these relationships into account and reorganizes your screen for you.
So this is some of the problems we came into, none of which are interesting enough to
require a paper, but all of which took time to solve and make sure we had the right
solution. Now we have a number of enhanced features. We do full debugging, just like
Debugger Canvas, and let's see; we can demo this as well. Ah, bubbles, bubbles,
bubbles--why did it shrink? So here what we will do, is we want to, the second thing we
want to do is figure out where the pluses and minuses are, so that is probably in draw
magnet. So here is the draw magnet, and as you can see it is very easy to on ally things;
we will go there. This will go there. Pops it up there. We will move it--well that is if
you have a mouse that has a right button. And it is that window; we will take this and
move it over here. And move ourselves over here. And let's see where we are drawing
strings. So let's set a breakpoint there. And now we can just debug it. You can go here
to debug. And we can bring up a variety of different views. And we can start the
debugger. And of course Eclipse is not particularly fast. That is a bug. And what you
get when you hit the--when you start the program, is a breakpoint; there is a breakpoint at
the start of the program. We will just continue at that point. It brings up a bubble for
that. It brings up the bubble for the breakpoint. Breakpoint occurred in a different
thread, so it is a different group, and it came below.
We layout different threads vertically and the same thread horizontally. When we come
up you get a bubble showing your source and then that is again completely editable. All
of your features are there. You can do anything you want with that bubble and you get a
bubble showing the stack. Now you can take here and pull out views from the stack and
look at the--I need more screen space obviously. Particular frame you're looking at or
you can take a look at the variable and you can look at it here or--I don't know if that is
useful in that window. We are going to pull this out, look at variables this way. Now if I
step, these will be updated automatically. If I can at any point go here and say freeze the
values in this, and what it will do is now these values are going to be preserved as I
stepped so I have a historical record of what the values were. And freeze also saves into
a certain depth. This also shows; it is a bluish color to show it is frozen, cold.
So what we can look at here is--it is also easy to make bubbles go away. What is
interesting is post, so X and Y, 00, so it is looking, so here you can see that it is drawing
it, the string, the plus or minus at 00, which means that it is starting in the middle of the
element. We don't want it to do that. We need to offset it. And that is where you get
into understanding why the bug is and you can go and change the code. Try offsetting
that. You can say ent equals post doc at X. What doesn't it like about that? Oh, okay.
Okay, let's float. Okay, now it likes it. We can just replace this with XP. And if I save
this it goes into the Eclipse facilities and it is still running. It just starts at the beginning
of the function again and does in-line code replace, and I can just continue. Now this
won't be any much of a surprise, but--okay, I don't know what it did. Popped new
bubbles up, new values of this. Oh this is doing funny things when you hit a button, isn't
it? Because this doesn't expect those buttons to be hit. You can bring these bubbles
back. We stepped into--when we clicked on our mouse.
The other thing is this can get real complex as you can imagine. It shows you what is
going on up here. Putting a laser on should not cause buttons to occur. Okay, but you get
a sense of what is going on here and what we can do. In full-fledged debugging, all of
these features you want, a couple of extra views which I will show you later on. Let's go
back to the talk.
Now the buttons should do the right thing when we get these things synchronized. One
of the things that you find out was bubble layout is a problem. You're getting all of these
bubbles; they are coming up and if the sessions tend to be long, I will sit there in the
debugger for a half hour on one particular program. I will hit step or go or continue a
couple of hundred times. What is my screen going to look like? There is lots of data for
the programmer to simulate. Layout is important to providing the right context. We have
automatic layout heuristics here, to the right of the current thread, below if a new thread.
We try if the user creates a new window, they went in browse to what is going to be
called instead of breakpoint there. We are going to reuse that window if we can. But we
need to pop up the stack view below it, so we are going to try finding our arrays and
putting this stack view below it, and making sure things are in the right place. We want
to remove unnecessary windows. If we step in and step out again, you probably don't
need the window that you stepped into, so we are going to remove it automatically, either
then or at the next step. But you can always click on it to bring it back very easily if you
really wanted it. But the default is to make it go away.
So you've got a whole bunch of layout heuristics here. We are still working on this as
you can see, especially on a small screen it doesn't work particularly well. It works much
better on a larger screen where it has more space. Another thing we have, we have debug
history point put in there. So you may have noticed at the bottom of this display here,
down here, let's bring this window up. You can see what's going on. And this is a fixed
window, which doesn't want to resize right now. Why doesn't it want to resize? There it
would resize. And essentially this is where you were at one breakpoint and then you
went to here. We can go here and, this is a history of our session, and we can show the
source at that point or show the stack at that point.
So we have a full history of the debugging session. You can go back and forth and see
values at that point. We also have--did I bring up here--yeah performance analysis in the
debugger, so you can see where you are spending your time. In here it is in physics
initialization. The program is still running, apparently. Some thread is still running. But
it is trying to take into account which threads are stopped and everything. You can see
where you are. And you can use this to go to that method. Now the method happens to
be small here so it is going to bring up the whole class. It has heuristics as to what the
user really wanted. If you bring up an enum, this is where nums come into play. You
don't really want to bring up just the declaration of that variable. You want to bring up
the whole enum class. If you bring up an interface, if it is a very small interface, you
don't want to just bring up the function of that interface. You want to bring up the whole
interface class so that--there are heuristics as to what is going on, what you should bring
up when the user selects something there.
So let's go back to our slides. We don't really want to run Word. We are running too
much on this machine as it is. Go to current slide. So we do what we call active
debugging. I need a new name for it. Essentially we have something running in the user
program, a separate thread, very unobtrusive. It is essentially doing stack sampling.
Occasionally it is talking to a server which can talk to multiple user programs at once and
that gets back and it can talk through Eclipse and find out what is going in Eclipse, and
actually send commands to Eclipse or get information from Eclipse, or it talks mostly to
Code Bubbles, back and forth. So what do we use this for? Well performance
monitoring is one thing. We are getting stack samples, so we can figure out where you
are spending your time. We can do dead lock monitoring, understand what threads are
locked at which point and as soon as these threads come within a millisecond of when the
threads actually get into a deadlock, we can tell the user, these threads are deadlocked.
We can do thread state monitoring, so that if you looked at what it said about thread
states, it would tell you that it is doing I/O, which is string system routines. We change
these every millisecond, if it gets out. You see a threaded string mostly I/O; it will tell
you that. Normal environments don't. Eclipse doesn’t for sure.
When you get to a breakpoint, we can go and give you the last couple seconds of history
for all of the threads, at that breakpoint. So if there is some sort of thread interaction, you
can see how, what all of the other threads were doing to interact to get to that point, or
even what your own thread was doing before it got to this point. So we save that in
circular buffers. And we have a number of things we are working on, detecting abnormal
programmer--excuse me--that we want to use this for. So that is debugging.
Another thing you find out after using this environment is that context is important.
Programmers are used to having context. They are used to using files. Files provide
context. Why is this function here? What is it doing? What is in the getter setter region?
So it is probably a getter setter. Or it is in the private region. It is in the public region, or
it is associated with this other function here. They organize your system. They are used
by other tools. And they are used for reading code. If somebody wants to understand the
code, they may not go into Code Bubbles to begin with; they may just start reading the
files. Some programmers do that for some reason. I never understood that. I only do it
for student code where I want to grade the students.
Function location in the system is important to programmers. They care about where the
function is. They care about where the files are and how the files are organized. They
care about how all of the system is organized and they care about things like readability
and comments. So what we do? Let's see if we can again show some of the views we
have here. We will go back to our regular session. Now the simplest thing that we can
do is just show the whole function at once, the whole class at once. So we have class
bubbles. They tend to be wide enough to hold the whole class, which isn't good on a tiny
display. But you can see that we use elision and obviously tooltips to show what is going
on in the elision. We use elision a lot here to show essentially the structure of the whole
class. So that is one way that you can do it.
You can also go and get an overview of the class, which is another form of that, and it
shows you where the comments are, where the fields are; these are methods and you can
then again get tooltips to show you any of these. You can pull these out. You can get
code. You can also use this if I want to see this, I can insert a comment, insert a method
before or after field so I can use this for inserting into the file, and I can also use this to
rearrange things in the file. I can move things around either within the file or between
files, so it is sort of a proxy for file that you get that way.
Now you might want to get other overviews. So let's go over here and create a file
overview; and here you can see the files that are being used within this local space here in
this window. And if I go into editor it will show me where in the file that is, which file it
is and where in that file and the other editors correspond accordingly. And this will just
show all of the files within, not just the region, but the contiguous space. So if you have
lots of bubbles contiguously even though you are just showing a little bit, it will show
that whole space or you can create working sets. And it will show just what is in that
working set. And these working sets can be expanded, so if I want to do this entire thing,
and then go over here and I lose that bubble. So you have another sense and again you
have tooltips here to show you what is going on, show you the code. You can use this to
get context information as to where you are, where this is in a particular file and what is
going on there. And the other thing that we have is, let's see, so let's go in this package.
Package viewer, so we have a viewer of the package where we can show all of the
classes; we can choose whatever relationships we want to have displayed. We can
choose the type of nodes we want. We can show methods, not methods and we can move
these things around. We can click on a node and show the sub graph for that node, which
didn't work that well.
So we can expand the nodes, you can collapse nodes by package. There is only one
package here. Expand, go back. You can get it to do--if you like labels you can go
labels; labels tend to take up space. I tend not to use them but if you like labels, you
might be able to see that. I can't. My eyes are not a good. You could make it better,
bigger. Now you can almost read them. You can also change layout methods and things
like that. But I want to see everything and deduce by that. In theory, that should work; in
practice I broke that. You can go down to the method level, showing context that way.
Another bug I have to fix on Tuesday. Wish I could read the display. There are various
ways of showing context. Next thing you find out in software development it is
collaborative. People keep telling us that. I keep doing my own work, but people keep
telling me everything is collaborative. What does this mean? Well, it means lots of
things to lots of people. Everyone has their own definition. Some people just pair
programming. How do you support that? Others, it is teams of programmers. Other
times it is geographically diverse teams. Others it is just working on a common source
base, which might be a real common source base if you are an old CVS person or RCS
person or it might be a virtual, source base if you use GIT or Mercurial or SVN.
Individual sources with merging, that is that. So how do we handle all of these cases?
What can we do? How do we get bubbles to work with that?
Well, we have a number of solutions here. One, you have to support communication
among programmers, so we have chat bubbles which will work on all different kinds of
chat systems. I think it works with all of the major chats at this point. I don't know what
they are because I don't do chat. I am told that it does. It also saves chat histories, makes
them permanent, so you can go back up tomorrow or next week and see what happened
with chatting a week ago or whatever. You can send and receive working sets. You can
say here is a picture of my screen, or here are the bubbles I currently have up, send them
that information over and they can bring up the same bubbles on their screen however
they want inside Code Bubbles. And we have a new feature for educational chats where
students can get into a queue to talk to the TA's but not learn the TA's chat ID, whatever
you call it, login, so they can't bug them all the time. They only can bug them virtually.
We have e-mail support. Again, you can send and receive workspaces and other
information from bubbles. We have note bubbles. I showed you notes. Notes are saved
as part of the project. They become permanent. They can be added as annotations to
code, so you can click on a piece of code and say and a note here, and it will tie that note
in to that code and it will have an annotation on the left; I think it is a yellow N right now,
and that will show up for everyone, everyone using this project. And you can click on
that and bring the note up at any later point in time, so notes can be saved that way. They
also are saved as part of your display and as part of the working set, if you save the
working set.
The other thing we worked on recently was the programmer’s log. Now scientists and
researchers have logs. I have a stack of notebooks which is right now about this high
with all my notes in them. Programmers should do this too. They are very valuable for
understanding old code, for understanding your motivation for going back and doing that.
And if you're working with other people, collaborating, understanding what they were
thinking of and why they may have done it this way. What is the problem here? Well
programmers aren't going to do any work. Programmers have enough to do without
adding new responsibilities to them.
So we wanted to do is make it very easy, so one of the things we did, let me see if we can
get back to the demo one more time. And if we bring up a new thing, it notices we are
doing something new, because we are in a new space and there are no bubbles around us.
It wants to know what we're doing. So it is going to pop this up here, and we're going to
say go back to our previous task, or we can say we want to start a new task, and then we
can give the task name, and then we can give it a description, if we are willing to, and
then we can just create the task and then we can go up and bring up the field, bring up all
uses of that field, show what is going on here. Bring that up. We can edit in various
ways. If we decide we want to add some comments to our lab notebook, we just hit F2
and it brings us up a comment bubble where we can add notes, add attachments, add a
screenshot. I wonder if that works on the Mac.
And then any time we want to we can go back or we can go here and show the
programmer’s log. Now the programmer’s log has massive data; it is also recording lots
of things automatically. We are trying to minimize the programmer’s work. So we can
go and select the task that we are interested in. We can just look at things related to a
particular class, or particular method, we can order it in various ways, and then we bring
it up we get this logbook display. And it basically has all of the things that we did before
when open; here is our sample task. Notice we added this particular function. It is down
at the function level because it knows that. And it didn't bring up the attachment, so the
attachment didn't work. If it would've worked, it would've shown the screen display
there.
This is all saved in the database. If you are working on a team project, you can have it
saved in a database for the whole team so you can show up the logbook of the whole
team at once instead of just your logbook if you wanted to. It will show options for that
as you are bringing it up, user options if it knows there is more than one user. So we
have that type of capability as well for collaboration. No, the one is that button. And we
have to get through this. Okay, next thing you want to do in collaboration is sharing
source. So that is the Code Bubbles view that we had. What we can do is we can just
add another Code Bubbles. It is talking to the same Eclipse, sharing the same source, we
made this all work. You can add it here, it will show appear immediately. You can add it
here; it will show up here immediately. You can even add it here if you want to use
Eclipse at the same time you are using Code Bubbles and it will show up in both of these
immediately. It is all synchronized, editing.
Then you think about if you are going to do collaboration, then these days you may as
well use the cloud. There are lots of things you can get with the cloud. Problem is that
you have to set it up in some way, and we want to minimize that. People worry about
security and privacy. I talked to Google. They won't share their code with. They don't
want me to ever see anything about what the code they are using this for. And other
companies are the same way. So how do you do this so that you can go access from here
to the cloud and not share any other things that are going in between? Well, we could
start here, and one of the things that we could do is say put that all in the cloud and just
go in display. And so you can run DNC or some other protocol there. You can sort of
get this working. The problem is the Mac has different key strokes; it's command
something rather than control something. So you have to do some sort of mapping thing
there. This doesn't work with that. Different screen sizes you may need to deal with,
rather than running it here, lots of things that this is a little inefficient for. Also I don't
trust network bandwidth for some of the graphic stuff we are doing.
So this is another model you can use. Just put Eclipse and Mint in the cloud and your
front end just talks to them. We have a separate front end anyway; this should work,
right? Why won't it? Well, you have things called files which are over here. Your
source is stored in files. Can this access those files? Not particularly easily. So you have
to somehow make it so that this can access the files here and get it to all of the right stuff,
so what we ended up doing is running Code Bubbles in the cloud in server mode, quote,
which doesn't affect very much. Running Code Bubbles here in client mode, because we
have multiple Code Bubbles, they collaborate with one another. This just doesn't happen
to put up a display; that is what server means. But whenever the client mode says
essentially do whatever you normally would do, except don't try to access any files that
are part of the project. Any files you want that are part of the project you go and request
from Eclipse directly. Actually you just request them this way and it will get them from
Eclipse or from the server, depending on what kind of a file you are asking for.
And this is fine if you are VPN’d in; you can talk to your cloud and that is what this link
is. I wanted it to work from home so I could run Code Bubbles at work on my office
machine and still work at home without having to VPN because I don't like VPN’ing. So
we have this little piece of Mint here which works over the web and we encrypt
everything going through there and this Mint will talk to that Mint using the user key
which you just save here and here, and now I run at home and display everything that is
going on at work, or I can have multiple users doing this simultaneously if you want that.
Is it useful for multiple users working this way? Well, two cases where it might be. You
might want to think of doing remote pair programming this way where you can sort of
share the screen. And the other thing is very useful for is when I want to use seven
displays, because I am running on three different machines, same Eclipse, same backend,
but I now have all Code Bubbles on all of my displays at once.
In general, we do support and we will get into the version management here with
software development tools. We have testing tools. I am going to skip the demo because
of time, but we have a test bubble up here which ties in, finds all of your JE unit tests and
shows you the status of them. It is able to, it runs as a separate process talking to Mint
talking to Eclipse, talking to Code Bubbles. It actually puts a little code in the application
before it runs it to instrument to get test coverage so it gets branch coverage. It gets call
coverage and block line coverage information and reports that back. It can run either
continuous; it runs in the cloud if you are running in the cloud. So that doesn't run on
your own machine. It will run either continuously or on-demand. So you can do
continuous testing because it is talking to Eclipse and knows what files don't compile
right now. It knows where changes are made, and it takes all of that into account in
figuring out what test cases to run. It supports test debugging, so you can click on that
and run it, create a new debugging session for that test case and debug that and it has
support for creating new tests.
Version management, we want it to interface with different version systems even within
Brown, there is no consistency. Code Bubbles is currently under both GIT and SVM
control because different people want different things. It also means that I don't trust GIT
enough; I don't know it well enough, so I understand SVN and it is safe under SVN.
Then I can play with GIT and if I clobber things I can always go back. Lets the user
check-in and checkout; that we actually don't do yet. We want to provide the user with
information; again, this is done as a separate process. We actually want to have the user
know what other people are working on, so one of the things that BVCR, our version
manager does for our Code Bubbles, is whenever you make changes and whenever you
save it will do a diff use a version management system to do diff and send the results
encrypted into a central data store someplace identified by some random key for this
project and some random key for the user, so that no matter who owns this data store they
can't tell anything about what is going on because it is all encrypted, and the only people
that can decrypt it are people who actually have the project there.
And what it will also do is when it sends this it will say give me all other users for this
project. Give me the information for all of the users in this project, so it now has all of
the changes that other people have been making, so it can display, and we haven't gotten
to display up yet, but it can display the information when I am showing this function,
when I am adding this function, or when anyone else has changed it that is currently
working on it. It can show that simultaneously. So we have that type of capability
without having to do any setting. Use something like the IBM, whatever they called the
system. You have to set up a database. You have to set up a project. This is all
automatically set up. It just works, which is the way you want it to go. So that is all of
that.
Future tools and directions. Lots of things you want to do and we are still planning on
doing. Integrated code search, we have a nice project for code search. We want to get
that in. We want to do Python because people keep asking for Python and students want
Python, high school, things like that. UI builder, Eclipse doesn't have one. NetBeans
does, but Eclipse is very primitive in that sense. We want to do it right, JML
specification bubbles. Intelligent data structure display, automatic creation of working
sets, here is a task I want to do. I want to make a change to this line. What other bubbles
are going to be affected by that? Can you bring all of those bubbles up immediately so I
have some sense rather than doing it incrementally? Automatic screen layout as I said.
Visualizations of program behavior; that is my second talk, flow analysis tools. We have
a flow analyzer. What information does the programmer really want from this? What
should we be displaying? How should we display it?
An environment for doing web applications, this is where you get into doing multiple
languages, and there are a whole bunch of missing features as well. Main ones a
programmer, an Eclipse programmer would notice Word quick fix and re-factoring. We
have limited support for those. We have re-factoring, but that is about it. It turns out that
the implementation of these in Eclipse is not done right. They are sort of integrated with
the front end and rather than being separated out, which you think you would be able to
do, so getting these with our model of how we use Eclipse is difficult. Supposedly
Eclipse 4.0 is going to fix this. I haven't seen that yet. And a number of other things that
people have asked for.
So how are we going to do all this? I am me. I write a lot of code, but not that much.
Our plan is not to do it. We open sourced this project, so we're going to try to get people
interested in this. You can download it. You can play with the code. You can contribute
back. It is sort of documented. There is a tutorial that is the most helpful thing these
days, doing the type of thing that I was doing there, except doing it right. And that is
where we are coming from, so a lot of acknowledgments. If you want to open source and
work on it, I don't know if Microsoft gives you any time. Not on my machine. I did that
on the plane too, so… At least the person wasn't sitting there when I did it.
Any questions on this part of the talk? I will see if I can think about setting up, going
through the other talk very quickly. Okay, what I have to do is I have to remove this talk.
Yes? No questions. Okay so, that is one thing that I had to do. Okay… CD… Talks…
Anybody understand PowerPoint on the Mac? If I open this talk in any other way
normally my demos don't run. If I open it from within a particular directory using an
open command then the demos run. I have never understood why that is or how that is.
So we will see the demos run. What I am trying to do here [inaudible] okay, I think we
have everything here.
So this talk if it ever starts is about what is my program doing? So what the bleep is my
program doing is a question I often ask. And what do I really want to know? I want to
know what it is doing in my terms, in terms of what I understand, in terms of where I can
fix it. What should tools tell me? Well, that is what I want them to tell me. What you
actually do when you have hard problems about your system? Well what I actually do is
I work on it for maybe three or four hours or maybe two or three days if it is really messy
and I actually have time, and then I will give up. And I will come back to it six months
later or when some user complaints about it, and try fixing it again then. And the third or
fourth time I come back maybe I'll figure out what is going on. On some of these I
haven't.
So here in Bubbles one of the problems we have is that the squiggle underneath the
variable for errors sometimes becomes wrong. That should be easy to fix, right? Figure
out what happens there, how hard can this be understand? Can you write a specification
for this? Formalize it, not particularly. Programmers have hard problems. This is not a
particularly easy, well let's go back. How hard can this be? I think I am supposed to
click on this. Remember that display I showed you with everything that happened on a
keystroke? That's what happens here. That's what you have to worry about. Not only is
it that long list of things and then you saw that there were certain lines in red, about 10 of
them, those are the things that can affect it. But you have these five tasks down below
which are running asynchronously, which can also affect it. And timing can affect it.
And it is usually right. What is the situation in which it is wrong? Programmers have
hard problems and most of these problems are dynamic.
So in Code Bubbles, the underlining is one, the error message display gets out of sync,
the breakpoints are off after editing, sometimes. I think this is Eclipse's problem because
Eclipse has the errors in the wrong place, but I am not sure. The bubble interaction can
be too slow. What is slowing it down? And every now and then you get into a deadlock.
Not usually, but every now and then it happens. I have another program here where I
have multiple threads running; it is multiple particles, 100,000 particles interacting. I
gave it, took a serial implementation which I did for class and then wanted to make it
multithreaded so I converted it into multithread and I only getting about half the speed
that I expected. It is highly paralyzable. What is going on? Why am I not getting the
speed up? Typical problem.
I have a web crawler, multithreaded. Each thread grabs it; there is a thread pool in the
thread grabs the URL, it goes out gets that URL and gets the text for it, processes it, saves
the information to a database, saves any new URLs and goes back and gets the next.
Works fine most of the time, does real well. But every now and then it sort of hangs for
15 to 30 seconds, why? What is going on? It is unlikely that if you have 256 threads or
even 64 threads that they are all waiting for web pages. That just doesn't really happen. I
have a cute program which does code search. So you give it a set of test cases, a
signature set of test cases and a set of keywords and it will go out and find, you can use
Google or any other engine, find the first hundred or 200 things that match the keywords
and then take each method and now you're searching for a method and as a possible
solution it will apply all types of unsafe program transformations to that solution trying to
get something that matches the signature and can compile, and then it will run that and
compile it and run it against your test cases and report back and reformat anything that
actually passes.
Why does it take longer than expected? What is the slow down? It was unusual. The big
question I had is why does it need 24 gig of memory most of the time? I have 32, so that
wasn't too much of a problem, but I don't want to use all of my memory. And why does
one requesting to block another? Typical type of problem you have in dealing with large
systems. I have a peer to peer network; if the whole network goes down so a lot of nodes
start interconnecting at once, not just a single node, the network order is sometimes
wrong. That you can understand. But this one is a problem I have never figured out. I
will run fine and then after a month or two months or sometimes two weeks whatever, a
node will run out of memory. Now it's not like its memory is going up in any way. The
memory is flat. All data structure sizes are flat. And all of a sudden it runs out of
memory. Something weird is going on in the system at that point. I have no idea what.
How do I tell that? How do we get a tool that will tell me something that is going to
happen a month from now?
I can't do detailed analysis. So there are many types of runtime problems. None of them
are easy. Anyone have a magic tool? What we need is high-level behavioral views, realtime views, the ability to monitor long-running systems, avoiding information overload,
because you can get too much. We've spent the last decade trying to understand what
works and what doesn't here. So here is Solar and the problem is multiple threads don't
get the expected speed up and let's see if this works. No, this does not work. That is
because we started PowerPoint for the other demo and we just loaded it here.
>>: Do you have a tool that can solve these problems?
>> Steven P. Reiss: Yeah, well, some of them.
>>: What does your Taiga network do?
>> Steven P. Reiss: What does Taiga do? Taiga was designed for internet scale
programming. It basically lets you have what we call an outer face. It is essentially an
interface to say a web service or a set of web services and it will go out and find which
one best meets your criteria, passes all of your--you specify it with test cases, so it will
find one that has this interface capacity for your test cases and it will automatically
switch it out and pop something else in if it fails. And you can code to the outer face and
you don't care what the implementation is. And it is designed to run wide scale and that
is why it needs a peer to peer network that way. That was another system, okay.
So PowerPoint is no longer running. Now if I open it this way… As I say, if I start
PowerPoint up another way, the demo runs fine. So here you can see the display. Here is
what we are showing. This is what is going on in the various threads. Magenta is
weight; yellow is running synchronized; green is running; it is continually drawing. You
can view this this way as well. It is a little easier. You can see what happens here is a
goes through phases. And there is a phase where all of the threads are running, a little
synchronization but they are not blocking; the lines are where they block, like there. And
then you have another phase where three of them are waiting. What is going on? Well, it
tells me that there is a problem. It doesn't tell me what the problem is. And what is over
here is what is happening in the classes and that doesn't really give you any information.
What I have to do is click that. But we can quit that later on. And so we have that.
We have another tool called Jove, which gives you more detailed information. It
basically gives you block counts while the program is running. That doesn't really help
in this case; the basic blocks don't change between those two phases. These two are
great. I love the visualizations. They are a lot of fun to run. They just don't solve the
problems. They have a little bit too much overhead by a factor of two or a factor of four
slow down. It is okay with an interactive program, but marginally it is not something that
you want to run for a month with server programs. We have to be able to run them in
real systems and these only run where I can actually have the whole code in advance. It
won't do something like Eclipse. You need to provide more detailed information. At the
same time we have to provide less information. We want to concentrate on just what the
problem is. So let's look at these problems in turn.
Code Bubbles, the interaction is too slow, so we can try a demo here. Now probably we
should get rid of this. There. So this is what is going on in Code Bubbles right now. We
can click on one of these and get CPU information. We can click again and get detailed
CPU information and you can get some sense of where you are spending your time and
even if you don't like CPU, you can get--what's this one? This is threaded information,
what the threads are doing; the socket information; the socket I/O is going on and you
have reaction. This is I/O, heap information; we have lots of different things you can get
information about and this is done with low overhead.
Actually what is cute about this program is you get to specify what overhead you want to
have. So I can say I am willing to give you 10% or I am willing to give you 1/10 of 1%
slowdown in the program to get this information, and it will adjust the way it collects the
information which is both stack sampling at whatever rate is needed to get that, and also
detailed, also instrument the code at times to get the usage counts or allocation counts.
And whether it can do that will depend on, and how often it does that and for how long it
does that will depend on what overhead you are willing to allow it to have. Now this tool
will also give you a view of what is going on in memory.
This is showing object ownership in the application in Code Bubbles over time, and it can
do it, again, it is very low overhead to get this. It is not trying to dump all gigabyte
memory. It dumps a sample of that and reconstructs this from the sample and here
everything zoned by root, and cycles are effectively data structures. You can see there is
a data structure 45, which is 93% of the memory, and color is where you actually have
memory. So here you say character array for strings. You can see this is the overhead
for Java strings here. And this is the overhead for URLs specified as strings. And you
can get information like this, and here you can see this is all coming from a bass tree
model; 63% of that is. That is the search space. This is telling me that most of my, 63%
of memory is used for storing information for searching, and that is just simple searching.
Let me get back to where I was. Most of the rest of this is similar. A lot of this is also
bass and stuff. But you can see where your memory is by ownership. It is using a whole
bunch of heuristics to figure out what it means to have ownership, because the only
information it has, it has A points to B, class A points to class B and is deriving
everything from that. So some problems we can address this way. Let's go back to
where we were. We actually went back. We did that. Okay so, this solves low overhead
monitoring. You can run this on server programs, no problem. It is designed for servers
because it gets its information slowly. It doesn't solve the program’s problem programspecific views.
One of the things we figured out here is that generic tools only solve generic problems.
The problem is programmers don't have generic problems; they have specific problems.
You can use these tools to solve the problems after the fact; once you've solved the
problems you can go back and see where the tools showed that to you, but you won't see
it when you're running the tool. So there are lots of great software visualization papers
which say you can see this, but I bet they understood it before they saw it. I know I have
written papers that way. I know other people who have too. You see it after the fact.
You don't see it when you need to see it. So you need tools that will do that. So here
everything pauses. This is the first tool we did. This is a visualization. It looks a lot like
the one we did before. What is different here is that the colors mean different things. So
here the colors are coded in terms of what the program is doing. So it is program states.
We actually went in and labeled this. This is, you know create a thread state, ready to
exit the threads. Here is save future URLs, wait for HTML, all those different things the
thread, each thread would do, and we can color it that way.
Here is what is happening when it is in a bug, when it pauses. You can see the state.
Saturation shows something, but what you find out is that this is all normalized URL. All
the threads are waiting for normalized URL. You go look at the code and yes indeed
there is one thing that happens there and that is search look@robots.txt. It turns out the
code for looking@robots.txt is the bottleneck here; it is stopping everything, and this tells
you that. So why don't use this? These displays work. Well, the reason we don't use it,
and I don't want to run a demo, is because figuring out how you instrument the code,
whether the events, whether the 16 states for this thread and what are the events that
indicate those things, is just too much work. Programmers are not going to do that even
if it is going to save them a lot of time in the long run, they are not going to do that.
So how do we simplify this? Well in general you can't. But you can look at specific
types of problems. Most problems are in the small number of categories. One we have
looked at pretty much so far is transactions, tasks and threads. We have looked a little at
locking. So we are looking at systems that have multiple transactions coming in. They
might be user interface events. They might be actual things coming from the web server
requests. They have tasks, they have threads which handle these and they break the
transactions up into tasks.
We need to understand all of that. We did a visualization. We want to automate this
whole process. In order to automate the process we need to find event handlers. We had
to find significant subtasks, whether the subtasks, we want to do that all automatically.
We have to find the threads, which ones are relevant to your particular problem. What
are the tasks that are relevant to your particular problem? I don't know how to do all of
this automatically at this point, but I can give you some hints as to which ones might be
relevant and let you choose. We have to find queues, you know when the task gets done
it gets put in a queue and gets later taken off. It turns out we really don't need this. We
can avoid that. We figured out how to do it; then we avoid it. And we need to provide a
customized time-based view.
So this is what we end up with. I want to leave time. I don't know what view this is
because I have it as a demo. So let's see what happens if we run the demo. It might
work. Solar. Now we didn't get rid of that. Nope. And it does static and dynamic
analysis; all we really need to specify here is what the transaction, what represents a
transaction and that was an object. And then we can attach, and we have to run, so I
shouldn't have killed that I guess. This is about it, the demo. Okay. I shouldn't have
killed that. It started for a reason.
Now we can attach to a running process and then we can show the view. And it quickly
becomes fairly clear that things are going on funny. You can see the phases there, and if
you go in here and you look at what is going on, you can see here that it is running, the
handle done code all the time. In here where it is running synchronized, it's doing lots of
gravity computations. I don't know if you know that, but you can see that if you know
the code all. So what is happening here is that the gravity computations are nicely
paralyzed. The summing up of all these forces is not. Now, summing up should be
quick, right compared to computing gravity. It is not. And that is where the bottleneck
is. We paralyzed the gravity computations; we didn't paralyze the summing up and that
affected everything. That cut our factor down. So that is the system that comes the
closest to working. You can see in the S6 server, the search server, what is going on here
and here the outsiders are colored by transaction and at some point here there are multiple
transactions. You can see that one transaction just started up, put too many things in the
thread pool and they were taken sequentially out, and that is why they blocked things up.
The web crawler here you can see the broken state and here you see the normal state.
Again you can go in and see exactly what is going on. We also have done lock analysis,
and here is locks and that, and this is basically… The problem here is that you don't just
look at synchronized regions, because you use synchronized regions to implement all
different types of locks. So what we do here is we analyze how the synchronization
regions are doing and we figure out that this set of regions is used to implement a
read/write lock. And this set of regions is used to implement a semaphore with an initial
count of such and such. And we will go and deduce that and then we will visualize it
accordingly. I don't like the visualizations here because they have too much plank space
in them and I have to figure out how to fix that. How long do you hold a lock for? A
microsecond? Maybe a millisecond if it is a really long lock. How long does the
program run? Minutes, hours? How are you going to see a millisecond in an hour time
display? Fun issues like that, we are working on that one.
So there are lots of problems here. The challenge is in understanding the dynamics of
answering these things. How do you obtain real solutions to real problems in real
systems and how do you get programmers to use these tools? You have to handle real
systems. Programmers have specific questions phrased in their own terms in their own
level of abstractions and real questions are not simple. You have to figure out how to
make these so you can categorize these correctly so you can get programmers to tell you
what the questions are, figure out how to use your tools to answer those questions, and
then you have to address these real questions. You have to provide meaningful output at
different levels of abstraction minimizing, with the right information there, information in
the terms that the programmer can understand, and not have to do too much work trying
to map back and forth.
So dynamic understanding should be simple and should be usable. Please solve my
problems. I gave you lots of problems there. Most of those are still outstanding. I need
them solved. Okay. So, I still have 2 minutes left so [laughter].
>> Rob DeLine: Okay. Let's all thank Stephen for his talk.
[applause].
>> Rob DeLine: Any questions?
>>: I have a question. It is impressive in a sense how much work your group has done in
terms of really just [inaudible] honestly just for Code Bubbles. I imagine that doing all
this, trying to figure out how all of this runs, distributed total management kind of stuff
within your environment is difficult and everything. But my question really is why do
that much code? Why write that much code? I mean in a sense… I mean you have your
Code Bubbles environment and you are working within a paradigm, and I am wondering
does it make sense to always be working in that area? Does it always make sense to work
in like a bubble, when you're looking at a stack frame? Does it make sense to have a
bubble for that, or does it make sense to have a static window for that? So that when
you're working…?
>> Steven P. Reiss: Bubbles, as you might've noticed as I was moving around the
debugger, some of those bubbles are static.
>>: Yeah, but, they move with your screen. If you are going to scan across…
>> Steven P. Reiss: They stay in one place on the screen.
>>: Oh, they stay in one place on the screen, okay. I never realized that. But even on
that note, does it really make sense that it is still in the bubble?
>> Steven P. Reiss: So even if I move the screen here…
>>: Okay. [inaudible] occlusion and stuff like that.
>> Steven P. Reiss: Yeah, well, you get those issues. But they are static. And I will tell
you typically on my normal display I have an error display down here…
>>: Okay.
>> Steven P. Reiss: Fixed. I have the panel with insert for searching fixed. Here I am
going to have this fixed and maybe a console window fixed; I may not. The thread state I
will have fixed.
>>: But you can still have multiple instances of them.
>> Steven P. Reiss: Yeah, there could be multiple instances of them. I can unfix them if
I want them to float. The option is there. And most bubbles you can make that way. So
you can switch them back and forth. Right clicking on them will let you switch them
back and forth between those different options. So we tried doing that. Another thing is
if you really want to run Eclipse, you can run Eclipse and this simultaneously and they
will synchronize.
>>: I was interested about that problem as well. Because you talked about like writing
software on the cloud or however you wanted to do it [inaudible] and distributed running
the software, and you had your architecture up where you had like differing instances of
Code Bubbles running on your local client going on the cloud and then from like
communicating through Mint, or whatever. Is that actually synchronized? Like if I type
a key on my Code Bubbles over here and then this person sees it immediately showing
over there? Now do you do that…
>> Steven P. Reiss: Essentially what happens is I type; I don't save it in the file. Instead
I send it to Eclipse. Eclipse is maintaining a file buffer for that file and it has to
recompile or rebuild the parse tree after that change. And I am waiting for that rebuilt
parse tree. But also whenever it gets a change like that, it broadcasts it to any other
viewers.
>>: Okay. So you have to wait for that?
>> Steven P. Reiss: Yes. Well, some updating occurs and that's why it gets so complex
on a keystroke, because I am going to do local updating without the AST for whatever
current lines I have with whatever local information I have I am going to undo the
structure at that point, change the structure so that it is local, and when the Eclipse sends
that comes back with errors or with the new apps our synced registry, I am going to redo
it.
>>: Yeah but…
>> Steven P. Reiss: Unless I get another edit in between, in which case it notes there is
another edit and it will therefore throw this one away.
>>: And you do all of the synchronizing on basically one [inaudible]?
>> Steven P. Reiss: Yes. So in that case the synchronizing, there is a central buffer for
this particular file and that is in Eclipse.
>> Rob DeLine: At this point why don't we bring the talk to a close? We can have Steve
hang out for another couple of minutes if you have a few more follow-up questions. But
let's thank him one more time.
[applause].
Download