>> Chris Bird: It's my pleasure to introduce Emerson... PhD from Portland State, and then spent two years at...

advertisement
>> Chris Bird: It's my pleasure to introduce Emerson Murphy-Hill. He is, he got his
PhD from Portland State, and then spent two years at UBC under Gail Murphy as a post
doc, and just recently started as assistant professor at North Carolina State. So he's
visiting us today and he'll also be around for the rest of the week, so if anybody would
like to send him any questions by e-mail, people watching over video or meet with him
they can e-mail me, my email is cbird or Emerson directly. So with that we’ll turn it over
to him.
>> Emerson Murphy-Hill: Okay. Thanks Chris, and thanks for inviting me, happy to be
here. Thank you for all, to all of you for taking your morning to come and see me talk.
So I wanted to talk about why software developers don't use their tools. And I'm going to
start by telling you a little story. So this is the PDP-1 computer and this came out almost
exactly 50 years ago. And this is a replica; I think this is from the Computer History
Museum in San Jose. And so the computer you see in the back with the monitor is some
later, some later computer. It came out about 50 years ago. It cost about $100,000. It
came out with, kind of one of, what you might consider the first editor. They didn't really
have an official name for it, but they called it the colossal typewriter or the very
expensive typewriter.
And what's interesting to me about this system is that although it's got an editor and
although you could do some programming on it, there wasn't actually a monitor to see
what you were programming, okay. And if you wanted to type something in and then see
what you had, what you had written, you had to use the printer, and there's a little printer
in the back, all right. So, which of course makes debugging your programs a bit of a
challenge. So if anybody tells you that real programmers don't use Visual Studio they
use Emacs, you can tell them that real programmers don't use either of those. They don't
even use a screen.
So I bring up this example just because I want to say that 50 years ago this is maybe,
gives you kind of an idea of what software development looked like. And it was fairly,
you know, you could do your job, but it was fairly primitive, okay. There was a limited
amount of things you could do, a limited amount of tools that were available to you. So
contrast that with today. So this is what may be an average software developer's
workstation looks like. We've gone from you now having all computer and no screen to
basically all screen and very little computer. And we have a million, a thousand different
tools at her fingertips. We have bug trackers; we have integrated development
environments where we can, you know, format our source code with a single key press.
We can get an outline of our code, we can navigate our code, we can do find call
hierarchies we can find references, we can change the structure of our code, we can
generate new code. There's a million, not a million, there's thousands of different tools
within Eclipse or Visual Studio or any modern integrated development environment.
And so, the point of this example is that I’d say that life has really changed.
Technologically, we have a lot more at our fingertips as software developers. There's a
lot more things that we can do. However, if you look at all the different software features
that are available say in Eclipse, and you look at how many people are actually using, the
number’s quite small. So most developers use less than one percent of the available
commands in Eclipse. And so how we know this is that Eclipse makes public its usage
data so if you use Eclipse and you agree to submit your usage data, each time you use a
command, Eclipse records it and then puts it on a server in the Eclipse foundation. And
so we can go through that data and see which commands people are using, and also kind
of infer which commands they're not using. Question?
>>: Do you know how that compares to the percentage of other software tools like Word
or, you know?
>> Emerson Murphy-Hill: So I don't know anything about other development
environments. I know my guess is Visual Studio is keeping track, and I know InteliJ is
keeping track too. But I think that's private. I believe there's public Word data from
maybe ten years ago.
>>: What about non-programming tools?
>> Emerson Murphy-Hill: Non-programming tools, it’s actually quite similar as well. I
don't know if it's maybe quite as extreme as this, but take you know, take another
example outside of programming like, the, the Apple App Store. How many pieces of
software in the App Store do you use, of the, you know, hundred thousand that are
available? Maybe if you use a lot, you use a hundred, right? So it's pretty small. Yeah?
>>: Is it the same one percent?
>> Emerson Murphy-Hill: Is it the same one percent? No. There's, for any tool you'll
probably find a good one or two users. Now some of them are very esoteric and very few
people know about them so, for example, in Eclipse there's a tool called hippie complete.
Okay. It's like auto complete. It has a history and I don't remember what it is exactly,
but it comes from a previous editor. And the way hippie complete works is it's a braindead auto complete. It doesn't know anything about the semantics of your program. But
if you’re typing on a token, it looks back at the previous few letters that you've typed, all
right, and then finds that token in the previous, basically looks at the previous code or the
previous text or whatever that you've already written, and then auto completes from that
token above, okay. So it's kind of a, it's a weak version of auto complete. Now it's
actually pretty useful if you're using a programming language or a text file that there's no
auto complete for, and it's a feature that Eclipse offers but very few people actually use.
Other features that are really useful, I'll give you an example soon, are used by a broader,
broader population than just one percent. But it's still, you know, if you have such usage
data available to you, what I encourage you to do is take a tool that you think everybody
should know or that you assume everybody does know, and look at how many people are
actually using it. My guess is you're going to see numbers less than twenty percent. Uhhuh?
>>: [inaudible] leading essentially to the [inaudible] because they found that so many
features [inaudible] and that in fact the features people wanted to use were too hard to use
and the other ones were undiscoverable. I don't know if they've done a follow-up study
to understand whether users after [inaudible] aware of more commands, but certainly
there was a lot of work that went in because fundamentally the file [inaudible] the
traditional file menu system [inaudible] number of features [inaudible]. And so whether
the ribbon scales, I don't know but it certainly helps you discover things, I think.
>>: [inaudible] anecdote there and I don’t know if it's a case of the purist [inaudible] is
people kept asking them for those very features that had already be in the product for ten
years. So they were reaching constantly at the top of the request list for things that they
wanted ten years ago so what are they talking about? And that was one of the big drivers
of the change. But I don't know if that same thing going on here with Eclipse [inaudible]
but people still want the 99%.
>>: But if you look at like Visual Studio and Eclipse, they both subscribe to sort of the
old-style user interface.
>> Emerson Murphy-Hill: I would actually guess that--I think there's actually a fairly
fundamental difference between Word and tools like Visual Studio or Eclipse or
whatever. And that's with, with Word most of the features that you want to use, what
you'll find is that people have a problem and they need, they go out and they search for
and sometimes they can't find it. So they know that say text needs to be, they want their
text darker, so they're going to look for something like bold. Maybe they don't know the
name of it, but they're looking for something for it.
All right, with Eclipse, what are the core features you need to do programming? You
need a compiler and you need an editor. The rest of it's just kind of fluff, right? The rest
of it's just sort of productivity enhancements. Whereas, with Word, you know,
everything, I think well, not everything, but a lot of the tools are things that, you know
you should have, but it's just a matter of finding them. So, you know, contrasting you
know, fifty years ago against today, we have more tools, but we're not really using them
that much. All right, so, let me put it to you this way. So this is what programming
looked like 50 years ago, and this is kind of what I think it looks like today. All right, it's
basically the same picture right but we have a pretty UI on top of the development
environments that we use.
So my research is about helping software developers make use of the tools that we've got.
We spent a lot of time and we spent a lot of money making really great software
development tools. Things can really improve people’s productivity; things that can save
a lot of time, things can help connect people together, things that can make software
better in general. But if people don't use them, right, those benefits aren't reaped. So I
want to talk about sort of a slice of the research that I've done and that I'm planning to do.
And we’re going to talk about sort of three pretty different areas. And the first one is
going to be re-factoring, and I'll talk about a little more in a minute. Re-factoring is
restructuring code. Will talk about some re-factoring tools and some problems with those
and why people use them and don't use them. And then I'm going to talk about discovery
in general. How do people find out about features in the tools that they use? If they are
using Eclipse, how do they know that there's a re-factoring tool in it? If they're using
Word how do they know that there's a compare documents feature in it? And the last one
I want to talk about is aging. Which is probably not the kind of aging that we usually talk
about, software aging; this is actually human aging. How does the tools that we use, how
does that change over time as we get older?
Okay. So let's start with re-factoring. So this is some work that I did when I was in grad
school that my PhD is based on. So let's start at the beginning here little bit. So refactoring has been a hot topic in the last ten years or so. And re-factoring is just changing
the structure of code without changing the way that it behaves. So although it's been
popular for the last ten years, of course, it's been done forever. Even, it's been done since
we've had structured software at least. And so there's nothing, nothing particularly new
about it except that we have a name for it and we've kind of done some categorization of
different types of re-factoring. So why would we want to change the structure of code
without changing the way it behaves, right? We're paid to make software that does
something more, that has fewer bugs. Well, a re-factoring helps enable those different
types of changes. So if you need to make an enhancement, changing the structure of code
may make it easier to make that enhancement. Or if you need to fix a bug, changing the
structure may actually expose the bug in a way that's not obvious in the code that you
have now.
So and factoring is something, like I said, something that's been around for a long time
and in the past twenty years ago, if you wanted to restructure your code, you would you
basically do it manually. So if you to say rename a class Okay. renaming is typical refactoring that's, that a lot of people do. You want to take a class; you picked a name
before that doesn't capture what the class does anymore. The name wasn't good for some
reason. If you wanted to do it in the past what you would have to do is you would have
to change the name and then find all the references to that name and update all of the
references. And in the last few years what you've gotten is tools to help you do that.
What we are calling re-factoring tools. And so re-factoring tools are in most big
development environments now Clips, NetBeans, Visual Studio and as plug-ins to those
environments too. And re-factoring tools don't do anything amazing other then do what
you would normally do by hand. They just automate what you would have to do without
the tool. So again take this rename example, if I have a class and I need to rename it, I
can use a tool and I can, you know, say, this is the thing I went to rename. This is the
new name and the tool knows the semantics in the program and so it will find all the
references and update all of the references.
And so basically with re-factoring tools you get two things. One it's basically
guaranteeably correct. Okay. the change that it's, that will make will not affect the
behavior of your program. And they also do it very quickly as well. Even if you're pretty
sure that the change you are making isn't going to change semantics, you can do it much
faster with the tool. The tool can do it basically at the speed of the compiler. So that's
why you might want to use a re-factoring tool over factoring by hand. An important
point here is you always have the choice. Well, if you have a re-factoring tool available
to you in your development environment, you can do it with the tool you can do it
without the tool.
Okay. and I have a little demo here. So this is some re-factoring tools in Eclipse. I'm
going to change name of this results variable, Okay. I'm going to change it to results set
and it's going to change all of the references, which is nice. I'm going to do one other
little re-factoring here which is I'm going to take this hunk of code, and I'm going to put it
in a new method. It's what we call extract a method. All right, say extract method. All
right, it made it into a method here, put a reference to that method, and I can change the
name as I did before. So a little demo about what kind of re-factoring is about. And
there are smaller factoring and big ones. Bigger ones include things like restructuring
inheritance hierarchy in moving things up and down, excuse me, extracting classes, in
lining classes, lots of different types of re-factoring. So that's re-factoring and refactoring tools.
So what's the problem here? Well, we do know that re-factor--developers re-factor a lot.
Whether or not they recognize it, whether or not they sit down and say Okay. I'm going
to re-factor right now. It's something that people just do. And so we did--there's been
previous work that has, say, taken automated tools and look through the version of, look
through the version history of large pieces of software. And seeing where people have
changed class names, taken big classes and broken them down into smaller classes. They
have observed that re-factoring's happened. We also did a study where we manually
looked at code changes and found that re-factoring a lot. Happens daily, hourly at a high
level in changing the class structure around, at low levels just changing statements around
a little bit. So developers re-factor a lot. But they don't use their tools very much, okay.
They don't use re-factoring tools. And, in fact, we did, when we did a study what we
found was that developers only use them about ten percent of the time. And so the
methodology here is a little, little complicated but I think I can summarize it.
What we did is we looked through version history, Okay. and we did a random sampling
of before someone did a commit and after they didn't commit, and we compared the two
together, and we inferred whether some re-factorings happened. We saw a class that's
name is changed but the content hadn't changed all. We said, oh it looks like they do a
rename, re-factoring, okay. Okay. we did that for a bunch of different changes and we
also had re-factoring tool logs. The people that actually made these changes, they gave
us the history of which re-factoring tools they invoked when. So we were able to do with
that, we took when they used tools and tried to figure out, they must've done that between
two different commits, all right. So what we could do is we could see the re-factoring in
code, and we can see when they did it with the tool. Or sometimes we saw a re-factoring
in code and there was no history of doing it with the tool. And I case we said they didn't
do it with tool. Question?
>>: Were you looking only for re-factorings that matched the list of what could be done
automatically by the tools?
>> Emerson Murphy-Hill: That's a very good question. So we, when we looked
originally we didn't constrain ourselves by things that are just available by tools or even
re-factoring that have a name. We were just looking at changes and we thought really
hard about it, and we thought was this something that would've changed behavior or not.
I think we found a couple that didn't have names, but for the most part they were named.
And actually for the most part there was tool support. So when I talk about ten percent,
ten percent of the time they didn't use tools. That was only for the re-factorings for
which there was tool support. Okay.
>>: [inaudible] the driven by instrumentation of clips were what's the data collection
[inaudible].
>> Emerson Murphy-Hill: So, so in terms of looking through the repository, there wasn't
anything special there that was outside of Eclipse. That was us looking to the version
histories. In terms of instrumentation for which tools they were using, that is inside of
Eclipse. Eclipse keeps track of which re-factorings you do. And it does that for the
purpose of library migration. So if you do some re-factoring, you can ship those refactorings along with your code and so any clients of your code can kind of rerun those
re-factorings on their code and they can update it. But we can use that for our study too.
>>: [inaudible] control system to sort of match the changes to what happened
[inaudible] the re-factoring piece of the tool actually corresponded to [inaudible] and that
was manually done?
>> Emerson Murphy-Hill: That was, yes, manually done. And there are some threats
there. So for instance it's possible that we didn't get the full histories. But even if you
look at, even if you do a more conservative analysis, the number is still low. The number
only goes up to about 30%. Thirty percent of re-factorings are done with tools.
>>: [inaudible] adequate. Somebody actually would have to turn on the re-factoring for
that special [inaudible] to take place? That's not a default [inaudible]? So when they turn
that on and you know that the re-factoring tool is active?
>> Emerson Murphy-Hill: That's right.
>>: And then for certain other types of re-factorings, you actually have to explicitly say
I'm doing this re-factoring, lifting out the method.
>> Emerson Murphy-Hill: Yes, if you use the tools, you always have to say which type
of re-factoring you're doing.
>>: I see so this is the recording is recording the type of re-factoring [inaudible].
>> Emerson Murphy-Hill: Yes, that's right. Okay. So, developers are only using their
re-factoring tools about ten percent of the time. Then we did a couple of different case
studies and actually that number was quite stable. We were surprised. We were
surprised by that. And I think there's a bunch of possible reasons why people don't use
their re-factoring tools. But I'm going to give you one and one of them is that the refactoring tools have poor usability, okay. The re-factoring tools are, have some problems
with the user interfaces. So I'm going to give you an example here, this example says-occasionally when you do a re-factoring, you try to use a tool. The tool will refuse to do
it; it will pop up an error message. For instance this one says “ambiguous return value.
Selected block contains more than one assignment to local variable.” So maybe you are
smarter than I am, but when I first saw that it was, it didn't really make a lot of sense.
After, you know, careful study it's actually, it is correct. It's actually quite accurate. But
at its face is kind of hard to figure out what's going on.
And so we did a, a formative study where we had people do some re-factoring and, and
occasionally they got these, these error message and we asked them to either explain
what was going on, tell me what was, tell me what this error message means. And all the
time what they did, they got most of it; they got say 75% of understanding what the error
message meant. But the other 25% there was something slightly off, or more commonly
people just don't pay any attention to the error messages at all. They say yeah, Okay.
whatever, I get that. Okay.
So I'm going to talk about a solution to the error message problem and then I'll talk about
some other usability solutions too. So what we did here was we took the error messages
and we replaced them with a graphical representation. Okay. So what you see on top is a
graphical representation of the same error message you saw before. So if you select this
piece of code with these pink dots, Okay. And you tried to extract it to a new method, put
it into a new method below, you can't do it, because there are these two variables that are
being assigned to, and if you try to assign to them you can only return one or the other,
Okay. not both. And there are technical solutions to this, but basically this is what the
previous error message was trying to tell you, just in a graphical form, all right.
So we did this, we built an implementation for Eclipse, and then we also built some
prototypes. So it turns out if you look at the error messages that re-factoring tools throw
in Eclipse, there's a lot of them. There's actually more than I expected. There's about 600
different error messages that you can get from the Eclipse re-factoring tools. And that
was just one example. So I didn't have the time to reimplement all 600 in a graphical
form, but what I did instead is I took all 600 broken them down into taxonomies, similar
ones are grouped together. Some of them talk about data flows, some of them talk about
control flow, some of them talk about clashes between names. I took those broken them
down, and then made some sort of prototype UIs for what, what a graphical
representation of that error message might look like, sort of a more expressive
representation.
So, and based on those we kind of came up with some principles for what we think a
better display of these re-factoring error messages look like. And so, for instance, the
error representation, no matter what it is, should help me estimate the amount of work
that's required to fix the problem. So for example, we saw that last error message that
said more than one assignment to local variable. Okay. how many? It matters how many
because the more there are the harder it is for me to fix the problem. Another guideline is
the error should be distinguishable. And what we saw with the formative study is that
people saw one error message, Okay. and they read it, and they were pretty diligent about
it, and then I saw another, and they didn't even look at it because they assumed it was the
same as the first one. Okay. the fact that they were both kind of indiscreet text boxes,
they both had you know a sentence worth of text, they didn't even bother to look at the
second one. So our guiding line here was that you should be able to distinguish, sort of,
at a glance, the differences between different error messages. And these guidelines aren't
particularly new. These guidelines you get from sort of any standard usability text. But
they are sort of specialized just for this context. These are the ones that we think are
particularly important for these types of error messages. We also think actually that
they're probably generalizable to other error messages that you might get, in your
development environment.
So we did a study on this. Okay. where we had, we pitted the graphical version versus
the textual version. We had people do kind of some simulated re-factoring. We showed
them the error messages or we showed them the graphical version. We asked them to
explain what the problem was, point out what the problem points are in the code, and tell
us whether which kind of one they liked more. So a standard usability test. So using the
graphical version people were faster. They were about three times faster understanding
what the problem was. They were more accurate, depending on how you measure
accuracy. They were sometime, somewhere between two and 10 times more accurate
using the graphical version. And they also enjoyed using the graphical version more.
We actually did two different versions of the study. One where we gave them training
with both of the--we essentially told them what this meant, and we told them what this
meant and we did the experiment. And we did it another way when we didn't tell them
what either of them meant, all right. And those results were consistent as well.
Okay. So that's kind of an improvement to the error messages that you get with refactoring tools. We did some work in some other areas with re-factoring too. So on the
left, this is a tool, that's what they call a smell detector. So a smell detector is a tool that
finds and identified smells. And a code smell is something that's in your code that
indicates that a re-factoring might be necessary. Okay. So it's kind of a, you might call it
a design defect, and they use the word smell because it's something that might possibly
be wrong with your code. But you have to take a look at our first, like something that
smells in your refrigerator. You know, there's probably something wrong, but maybe it's
just some delicious cheese or something. And so what we did is we looked at the existing
smell detectors that were out there, which either take the form of this visualization that
you run through your whole codes set and you get this visualization and you pick through
it, or you get the standard underlining that you get in code with compiler warnings or
compiler errors. And we kind of combined these two together into this ambient
notification thing, which always stays in the same place as you're moving around in the
code. It's always behind the code. And it's not intended to be in-your-face but it's sort of
intended to be kind of a heads up display to give you some information about the code
smells and if you want more information you can kind of click on these individual pedals
and it will tell you, it will give you a deeper explanation of what's going on there. So is
kind of a different way to display static analysis results. We did some experiments there
too which were, good.
And then another problem that we tackled with re-factoring tools is--so it's been brought
up one problem with re-factoring, or one thing about re-factoring tools is you always
have to know which re-factoring you want to do before you do it. Okay. so things like
rename, people are pretty good at that. I'm about to rename a class, they recognize that.
But there's a lot of other re-factorings that maybe aren't so obvious. So for instance, what
is introduce indirection mean? Okay. If you were going to introduce indirection by hand
would you know to go to a menu item that said it introduce indirection? And our feeling
was no. The names aren't actually particularly good indicators of which, of what the
restructuring does. So we did instead is rather than having people rely on the names, we
had, we used gestures instead. We had kind this model of where re-factoring should
appear in a gesture.
So what's kind of nice about re-factoring is there's somewhat structural, so things like
pushing methods up and down, or pushing fields up and down, naturally kind of belongs
in an up-and-down position, okay. So if you want to invoke the re-factoring, we
implemented this with pie menus, so rather than going to the menu and saying, or going
to your contacts menu and saying pull up, you can just kind of gesture in the up direction,
or if you don't know which direction it is, you can invoke the pie menu. You can use
your mouse or you can do a hotkey, a hotkey scheme with that to. Another nice thing
about why re-factorings lend themselves well to sort of this directional scheme, is that a
lot of times re-factorings are opposite. Some things like extract method and in-line
method. Those kind of naturally lend themselves to being on, in opposite directions, and
so we leverage that to put re-factorings on these pie menus.
And we did, we didn't do, we haven’t done a field study with that yet, but what we did do
is we showed that people can intuitively--if we show, if we show them where these items
appear on the menu, they can kind of form a mental model of where they should appear
and can re-create that. What's even cooler is if you show some examples and you ask
them to do a re-factoring that you've never showed them before, Okay. but naturally fits
with the model, they can actually guess pretty well which direction they should gesture to
invoke that re-factoring. Which suggests that they don't actually have to know the name
of the re-factoring to use it.
And one other piece of work--so this is with tools but I'm also interested in not only how
developers use the tools that they use, but also I'm interested in the language, the
language features that they use to. So, for instance, this is a study that I did with Chris
Parnin and Chris Bird where we were looking at Java generics. Okay. and we wanted to
sort of evaluate some of the claims about Java generics, because nobody--there hasn't
really been many empirical studies on it, and certainly no large-scale empirical studies.
So one of the claims about generics, so generics are things like if you have a collection,
you want to type that collection, you want to say what the items in that collection. So if
you have a list, maybe you want to say it's a list of strings.
One claim with that is that if you use generics then you can reduce the number of casts
you have in your program. Casts allow you to force the type system to recognize that
when you say, get something out of the collection, it is of the specific type, and you have
to use a cast to do that. And so there's always been this claim that generics should help
reduce casts. So we evaluated that and it turns out it works, it's true sometimes, but a lot
of the times it's not.
So in this graph what we have is the number of casts in a program normalized for
program length, Okay. so you see it’s relatively, there’s some initial turmoil and then it
kind of it’s kind of more or less flat. And then the blue line is the number of. the number
of generics essentially. Okay. and we see that generics were actually introduced in 2004
and so we see a little bit of generic use from then on and some increasing use. And as
people are using generics more and more, we don't actually see a big change in the
number of casts in a program. And there didn't seem to be a strong correlation between
the two. So, this is interesting too because it tells us something about how people are
actually are adopting the language features that they’re adopting. When they're doing it
and whether the, the ideas that we have about how people should be using, using
language features, are really panning out.
Okay. so I want to return back to our factoring a little bit. So here's our development
environment, here’s Eclipse. So suppose that I’ve made, we’ve got these great refactoring tools. My research has this huge impact. Eclipse totally changes the way the
re-factoring tools are made, or Microsoft now goes out and changes all of its re-factoring
tools. They're all totally usable; their great. So now are people going to use the refactoring tools that we’ve given them? Are we going to see this big uptick? Well, I think
we'll see some, but are they going to find the re-factoring item on the menu? And are
they going to click on it? My guess is no, because the way that, if you don't use refactoring tools the way that you see your development environment is like this, you don't
even really recognize that there is re-factoring menu. You kind of just skip over it. And
this isn't a bad thing, right; this is how we deal with complex environments like this. Is
we don't, you know, we don't have to understand everything about it. We skip over the
things that we don't understand and sometimes we come back and try to figure out what
they are. But a lot of the times we just blank them out. And so for me there's a lot of
things in Eclipse that I don't know what it does, and I don't, don't register for me and all
those kind of appear as I just skip over, when I'm using my development environment.
And so all of these are kind of unused and so no matter how good the usability is of these
particular features in my development environment, if I don't really recognize them, I
don't even try them, I'm not, I won't use them. So I'll give you one other example of this.
So this is the open resource tool in Eclipse. You may not have used it, but you've almost
certainly use a tool just like it. So the way open resource works is if you use the open
resource command, it'll bring up a dialog box that looks like this. You can type, you can
start typing something and the characters that you type will match the different files that
Eclipse knows about. So, and it also works with camel case which is kind of neat. And
so it's, it's actually, it's really a good tool. It's quite, it's pretty usable. It could be a little
better, but it's quite good. And if you look online what people are saying about it they
really like it. So it's number one on the list of the ten navigation shortcuts every
programmer should know. It's one of the most useful tools in Eclipse. It's a command
that I use religiously. And it's the biggest timesaver I've stumbled upon. So this is a tool
that a lot of people really like in Eclipse.
But if you, again if you look at who's using it and who's not, if you say take one month, I
took May, 2009. Only about 12% of people actually use, who use Eclipse actually use
open resource. So even though the tool is really fantastic, it's really great, it's actually
independent of whatever programming environment, you’re, whatever programming
language you use, it'll work for anything you're using resources. People, a lot of people
still don't use it. Okay. and a maybe because they don't know about it.
So, what I wanted you to know about this is, what you really want to know is why aren't
people using those tools? Why didn't they find out about a tool? And that's a hard
question to answer. And so, what I did instead is, well, if we can't figure out what's not
working, let's figure out what is working. Okay. let's find out about how people really do
discover tools. So if you're working in this environment, how might you find out about
re-factoring tools? So we came up with a list of different possible ways that you might
discover a new tool. And we just sort of brainstormed these. This is with Gail Murphy.
And so for instance we said one way you might discover a new tool is through something
and we'll call peer observation, where you observe someone else using a tool while their
programming that she did know about. So say you're doing pair programming and you
see some else use a tool. Or you just walk into their office and you see them use it. And
you say hey that was cool. What did you just do? You learn it that way. Or kind of the
opposite thing happens, we'll call it peer recommendation, where someone observes you
programming and suggests a new tool and says you know you're doing something slightly
inefficiently. There's a tool that actually does that better for you. It'll save you a bunch
of steps; it'll save you a bunch of time,
There's tool encounter where you just happen to find a tool by exploring the user
interface of your development environment, or any other environment like Microsoft
Word. A tutorial, you're reading or watching a tutorial, mentions a new tool and you
discover it that way. There's sort of written descriptions, like standard textbook, or we'll
lump web pages in there too. So you're reading through one of these publications and it
mentions a tool. You could also discover a tool through Twitter or RSS feeds.
Occasionally, you'll see tweets where someone says, if you're in Eclipse and you press alt
shift t, it does this cool thing, of course on 140 characters or less. But it is one way that
you could discover it. We have seen people at least broadcasting that they discovered
new tools.
And the last one we thought of is discussion thread, where you learn about a new tool
after reading it on a list of comments or a forum or an e-mail discussion. And what we're
really interested in here is examples of where someone discovers a new tool where they
didn't know they had a problem, okay. Where it's not that they're going out to find a
solution; it's not that they're going to search Google; or not that there going to go ask a
friend, it's that they find something that they didn't know about in the past. Okay. So
we've got these seven different categories, and what we want to know about them is how
often do they happen, okay. And how well do they work. Are they effective if you learn
a tool, if you are discover a tool via one of these methods, how likely are you to use it
three months later or six months later?
So what we did is for frequency, all right, we asked people just to tell us some stories,
Okay. We did interviews. This is the first study that we've done. We did interviews
with developers and we said, we give them a list of different tools. We had a bunch of
tools from Emacs, and a bunch of different tools from Vim, a bunch of different tools
from Visual Studio and a bunch of tools from Eclipse. And we said now here's a
development environment you might use. Here's a tool, tell me how you discovered that
tool. How did you find out about it in the first place? And people told us stories. And
what we assumed was the more frequent they told the story, all right, the more frequent
the type, the more likely that type happened. So for instance, if everybody told us they
discovered that tool from Twitter, we would say that Twitter is a frequent mechanism for
discovering new tools. Now that relies on people's memories, which is questionable and
I can answer any questions about that.
Why we think that was an okay method to use. So that's how we figured out frequency
and I'll give you the results in a second. In effectiveness, we asked people to self rate in
ctiveness. So, we said here's seven different categories of ways that you could learn
about a new tool. Tell me what you think the most effective way is. What's the best way
that works for you in terms of using the tool later again in the future? And so here's what
the results looked like. Each of these boxes represents a single person's response. And
so what you find is that tool encounter, the one at the top, that's what people mentioned as
the most common way they discovered a new tool. Okay. they were poking through the
user interface, and they said oh there's a re-factoring menu. I wonder what this does and
they try it. And previous results actually predict that. That's not a big surprise. It turns
out that that is the most frequent way that people discover new tools. What previous
results don't tell us is whether it's really effective or not. And the answer to that
according to the people we interviewed was actually no, Okay. essentially not particularly
effective, especially compared to learning it from someone else.
So we did the study partially because we were especially interested in these first two,
learning socially from someone else. And what we found is learning from someone else
actually doesn't happen particularly frequently, but people like doing it a lot. It's quite
effective. And so the challenge here is it's, it's--we'll call these two together peer
interaction, interacting with a peer. So why is it effective, and why doesn't it happen
often? Okay. so that some answers to that based on the interviews. So why does it work
so well to learn from someone else? Well it works well because typically the person that
you learn from is someone that you work with as part of your normal work. If someone's
likely to walk over to you and look over your shoulder, that's probably someone you
work with rather than someone random who comes in off the street. So there's a high
probability of relevance there. What's also nice about this is the tool is demonstrated on a
real problem. It's not like you have to come up with a contrived example of why this tool
is great. You get to see it in the context of use. So it's on a real problem.
The learner feels like she discovered it herself, which is, which is nice so when you see
someone else do it and it's not necessarily like someone is forcing it upon you. It's more
like, it's kind of self discovery. Which people reported was important to them. The
learner associates the tool with its context of use which makes it memorable. Okay. So
they see the tool used in its context and what they report is next time they're in that
context they think of using the tool again. All right, so why doesn't it is happen to
frequently? Does anyone want to take a guess as to why learning from someone else
wouldn't happen frequently?
>>: Because programmers don't have a lot of friends.
>> Emerson Murphy-Hill: Because programmers don't have a lot of friends, great.
Nobody mentioned that. Nobody wanted to own up to that. What you think, what do you
think they reported as the biggest barrier to learning from someone else?
>>: They don't want to show you [inaudible]
>> Emerson Murphy-Hill: Don't want to show your toys, your tools?
>>: [inaudible].
>> Emerson Murphy-Hill: Yep, that will come in. It wasn't number one. The number
one thing was, of course, physical isolation. Okay. people not being in the situation
where they would naturally look over someone's shoulder. That's kind of obvious right.
Lots of people work from home at least part of the time. Or in some cases people work
from home a lot. So physical isolation makes this hard, but not impossible. Some people
talked to us about doing some remote pair programming with someone else. They
weren't using anything fancy like videoconferencing. But what they were doing is they
had a remote vim session open and they had a chat session open and they switch back and
forth. And one of them reported it as, I saw some text move around on the screen and
then I had asked my pair, my buddy what was going on with that. And he explained oh if
you press this particular combination of keys, you get that affect.
Okay. So physical isolation makes it hard but not impossible. Different programming
environments definitely make this hard. You know of some people on your team are
using Emacs and some of them are using Visual Studio, then different programming
environments, the two can't learn from each other say quite as much as they could if they
were using the same programming environment. But even if they are using the same
programming environment, at some point your team is going to kind of, you might call it
annealing, right, they all get to the kind of, the same level of tool proficiency. So once,
once I learned a lot from you, at some point there's not going to be much more that I can
learn assuming you're not learning new tools outside of that relationship. So acclimation
to each other's toolsets is one reason this may not happen very often.
Sometimes company policy dictates which tool you should use. This one came up a few
times. And so if the company says you must use Visual Studio, and you don't have a
choice even though you see your friend using something else, and you don't have a
choice to switch then obviously, basically that's a barrier to learning from someone else.
However, even within, even if you're, typically when someone dictates that you must use
this tool, typically it's a high-level tool. Is something big like Visual Studio or something
big like Eclipse, and even within that there's lots of new features or new tools that you
can learn. Time pressure makes this hard for sure. If you're working under a deadline
people reported well, I don't have the time to, you know, share my knowledge with
someone else. So when there's time pressure sometimes people don't share. And
sometimes there's an unwillingness to. This was kind of rare but some people talked
about sometimes people in the organization were not willing to share a tool with someone
else partially because, that is kind of what makes developers proficient sometimes. What
gives them their skills is the toolsets that they use, right. That's kind of a, kind of, it's
kind of like if I told about my tools I'd be giving away my secret sauce, so another reason
why it doesn't happen very often.
So here's the research challenge for me. So what we know Okay. Is that peer interaction
doesn't happen very often but it works really well. So if we could make it happen more
often, Okay. and people actually like doing it. They're not forced into a situation where
they don't want to do it. If people had the opportunity to learn from others more, they'll
probably learn more tools. So how can we make, how can we sort of tackle the number
one problem, people working in different places. How are people who work remotely
and say asynchronously, they're working on different parts of the globe at different times,
how can they learn from each other? Okay.
Okay. so I'll give you a proposal, all right. So one way we can have developers learn
from each other if they're working asynchronously, is that for each developer we'll just
keep this say into one team. We won't talk about the global ecosystem of developers.
For one developer we'll keep track of what tool she's using, okay. And so each time you
use a tool, make a note. And we have certainly got infrastructure to do that. And also
keep a full movie or a full screen cast of the developer’s history from beginning to end,
okay. Just a full, a full screen cast, all right, so that at any time you want to go back in
time and you can see what you were doing last week, or you can see what you are doing
last month. So a lot of you are thinking, okay, there's privacy issues here. I'm not going
to let anybody else see this sort of thing.
We can talk about that. But, what we can do with this data is we can look at the tool
histories and we can compare them between, let's say, all developers on your team, all
right. And by doing the comparison, we can use something like say collaborative
filtering to make recommendations about tools. Okay. we can say that, you know, there's
one tool that I don't use that everybody on my team knows about. Okay. And maybe I
should know about that too. We actually built, or Gail Murphy has built a tool with a
master’s student, where they actually did bank recommendations like this. And one
difficulty of these sorts of, just making recommendations, in saying, you know,
everybody else uses this, but you don't. Is people don't, people don't take very well to
those sort of recommendations. We get to the clippy the problem right. People don't like
the sorts of recommendations where they are kind of, where they're sort of out of context.
But what we can do, if we take recommendations from individual people, and we say
who it is, who's making the recommendation, and maybe if we just connect people
together, they'll learn from each other. So what we could do is we could say, you know,
we'll call one guy Rob and the other Tim. And we could say Rob your coworker Tim
uses open resource. Would you like to see an example of him using it yesterday? And
again, privacy issues, there will have to be some mediation going on here. But what you
can do is you can go through Tim's history, you go back in time to the last time he used it
or one time before that. You can take out a little screen cast, ship it off to the network
and then Rob can learn from what he did. Okay. It's not synchronous, because this
person did in the past. And it doesn't require any extra effort because the example’s
already there.
>>: Yeah this could be great [inaudible] relevance to what your current task is.
[inaudible] ah ha, with peer interaction, working on something [inaudible] I wrote a
really long e-mail saying [inaudible] and he said do you have time for a chat? And so
like he called me up and then he said, will you share your screen so I can see like visually
what's happening that's confusing you? And so like a communicator I just shared my
screen and he said, Okay. I understand now what you meant in that long e-mail and then
he says, Okay. can I see the source code now? Then he turned his browser on he said
well, you know this other thing that I did that is similar to what you want to do. And like
in five minutes like we were done.
So like, I think that I like the making peer interaction more frequent. Here was a guy
across campus and you know just the ability, I mean e-mail is like stupid. I should've
called him and said look at what's happening, I don't want this to happen and then we
could have this like really [inaudible] discussion. Instead I sat for like twenty minutes
typing this e-mail and trying to make it a perfect description, formal text [inaudible] so I
think somehow, somehow there's, if you can't get face-to-face you know you can talk to
the person, you can talk to the person and do these sort of things. [inaudible] have a
priority right? First I should really talk to the person who is the expert in this [inaudible].
If I can't do that then I need these, then I need these proxies from the person right of what
they did. [inaudible] you know even before I [inaudible] would just make it easier in an
organization you know to just contact people and get their time. This guy actually
happen to be very willing to share his time and you know suggested, wow, share your
computer screen with me, and I'm like, wow, that's an novel idea. And five minutes later
we were done.
So I really would just encourage you to think wider than just, the direct communication
like, wow, I really solved my problem quickly. I was such a happy camper because I
could have spent hours drilling down into the code, and browsing and thinking and
learning the code and, yeah, that might have been worthwhile but in the end getting the
solution which is good enough for what I to do now. So I'm thinking there's also that
balance, you know, I had a task to get done verses, browsing state. It may be in relevant
on may get some learning from it on the way getting [inaudible].
>> Emerson Murphy-Hill: The timing is definitely important. And this doesn't address it
at all. When you interrupt someone, or if you don't interrupt, if you wait for them to go
out and get the information they need, that's an open question.
>>: But I mean the title was absolutely right on. I think that enabling that within the
whole business of the privacy in history and so on, you know, I can't imagine that if this
guy had reported what he done like the little tidbit that he gave me would have been
captured, how I would've found it. [inaudible] an interesting search problem. I got
something that I want to do right like some thing somebody else did in this case.
>>: It seems like there are different levels [inaudible] like the suggestion here which is
completely unaltered to recapture. [inaudible] there's another level of investment which
is authoring something, some people will put together blog posts, you know, I love this
tool here’s why I use it, here's how to use it. There's another level which is this real-time
on my shoulder, over the shoulder [inaudible].
>>: What this peer interaction really means, like if it's mediated it would be a blog. So I
was taken the interaction more literally as he [inaudible].
>>: No I don't think given one, you're going to nail one…
>>: No, no I'm not suggesting that at all. I'm just saying that this sort of things here are
not, our proxy for peer interaction; they aren't peer interaction.
>> Emerson Murphy-Hill: Okay. thanks. That's good points. So, so in this first of
situation I'm talking about, we're saying, you know, there's something you don't know,
maybe you should find out about it. Okay. and that may or may not work. People may
not want to go out and sort of admit their, admit their ignorance of something. But you
could do it; you could flip it around to. You consider say to the other guy, you could say,
Rob, your coworker, or Tim, your coworker Rob doesn't seem to know about open
resource. Would you like to share an example with him using with it? So the example
that you just brought up of say putting it on your blog, for example, that might be kind of
an indirect way of to do it. We could just kind of take that snippet of your, of your
history, you know, and putting it on Facebook, for instance, that might help too. Yeah?
>>: [inaudible] a couple weeks ago and I was wondering if you thought about this which
is I guess I have to call it peer competition. It was the idea of trying to help people
discover natural abilities of the tool. Which was just to me was, here’s some
achievements that could be personally interesting for you to do it as an individual, but I
suppose we could explore the same space as a team [inaudible] were every group is my,
is the ones that we learn from. Competition [inaudible].
>> Emerson Murphy-Hill: Yeah, the gaming, yeah, the gaming aspect could definitely
be leveraged. This worked well for things like stack over flow where there is a certain
level, the more points you get, the higher status you are. But yeah, as you said even
within your own team. I think one question, one open question there though is how much
do people actually value that? I don't know. So you could take another example like
Olo, which rates open source developers against one another. That one I'm not sure that
people actually take seriously or not. So what's the difference between something like
stack over flow that people would, I would guess people take more seriously than they
take overflow. So I think, you know, using, maybe using what we've learned about
games in the past in the development context could, is definitely promising for sure.
Okay. Great. So maybe one solution to making peer interaction more frequent.
I want to share one other thing that we noticed by doing these interviews and that
discovery didn't happen uniformly across different groups of people. And one thing we
actually notice was there was an age difference between older developers and younger
software developers. So someone from an older teammate in a group said the junior
members tend to be more voracious in their desire to learn new APIs and tools and stay
plugged in to what's going on with languages and stuff. My time is spent digging into
more bugs and more things that I'm responsible for delivering, and I have less time to do
independent research. No one's upset when a junior member says they have a better way
to do things.
And I kind of saw the same affect from the younger side too. So someone, the younger
teammate said there's a fair amount of bias towards me teaching other engineers
something. I'm a student and intern in the process of learning as many tools as I can
from, learning as much as I can from as many tools as I can. Several developers I know
especially those that have ten, twenty, thirty, forty years of experience tend to say that
they have, say that they know the tools that they use and they don't necessarily have the
time, or more commonly the patience, to sit down and fiddle with a new tool. And I do
know about you but that kind of resonates with my experience too.
So what was interesting was that this sort of this dynamic where the tool knowledge
maybe comes in through the younger developers where they have time to mess around
and poke through the user interface and waste their time not actually developing
software, but playing with the tools they have and kind of filtering up socially to the older
software developers. And I think that's kind of, and I want to kind of go off into talk a
little bit more abstractly about this. I think there something there. You know we know a
little bit about gender differences between software developers, but we don't actually
know much about an aging perspective.
And we have reason, we have reason to suggest that it's important. So, for example, the
study that I just talked about suggests that technology introduction often starts with
younger workers and eventually may be reaching older adults, assuming that the peer
interaction actually happens. But one other interesting happened, is that older adults
reported they were actually both less likely to learn and teach others via peer interaction.
That was somewhat unexpected. Learning less, I can believe that. They’re, you know
they’re experts; they've been at it for a while. But teaching less was actually a surprise.
Okay. They said that it actually happen less often than their younger peers. And if you
look at sort of the other literature, there's not much about software development, but
there’s certainly a lot of research into aging and certainly aging and technology. If we
look at that, we can also get sort of a perspective on aging. So other studies have
suggested that there's a belief in practice that technology careers are very intense and
focused. So stereotypically we think that, you know, it's a young man's game and, you
know, between the ages of ten and thirty, you know, you are going to be working 80
hours a week or something. And then after that what happens, right? You burn out.
And so what if we thought about how could that be, what's going on there? Why are
people saying not, why isn't, why are so few interested in continuing, continuing to do
software development after these intense careers? Maybe they need to be less intense.
And finally, you know if we kind of look at other sort of physical and cognitive factors
that tells us interesting things too. So, for instance, as we get older our ability to filter out
irrelevant visual information goes down. So, for instance, what you might notice is that
kind of by analogy it happens, it happens in audio too. If you're in a party and there's a
bunch of noises going on, bunch of other conversations and you're having a conversation
with one person, typically your ability, you can filter out the other information, you can
filter out the other conversations and you can focus on your one, on the one person. And
the same happens visually, okay. Typically you have your one task. And you can filter
out other parts of the, the whatever task you're working on. If you're adding numbers and
there's dollar signs, you can filter out those dollar signs because they are not relevant to
your task. But as it turns out as you get older your ability to filter out the visual
information not relevant to your task goes down. Okay. I think it's interesting because
development environments are really, really complicated and we talk about you know
filtering, how it's important to be able to filter out features in your development
environment so that you can kind of deal with it effectively. Maybe, you know, because
of this factor our ability to deal with the complexity of our development environments
goes down as well. Just kind of some speculation.
>>: Some of my favorite Eclipse features is double click the tab, full-screen. You
missed that.
>> Emerson Murphy-Hill: Yeah, yeah, that's a good one for sure.
>>: Thanks.
>> Emerson Murphy-Hill: Yeah. Peer interaction. So kind of this is a little more farreaching. I don't have much research to show on this, but I think we don't have a very
good understanding of the opportunities and challenges faced by older adults in software
development. And I think we have a lot to learn there. Co I wanted to leave you with
just this, just as one last slide kind of summarizing what we talked about. So with our
factoring, there are still some open questions here. So how does increased usability of
tools translate to increased use? And, kind of in general, how can we communicate
effectively with our development environment? Our environment has a lot of things to
tell us. It has lots of information that we, that it would like us to be aware of, static
analysis information, compiler information. How can we effectively communicate with
it? In terms of discovery, what personal practices—ignoring, you know, the technology
solutions, what personal practices can developers follow to stay aware of new tools? Is it
about spending a lot of time on Life Hacker looking for interesting pieces of software? Is
it about spending more time pair's programming, spending an hour week doing it and
rotating between programmers? Don't know. And how can physically, as we talked
about, how can physically distributed developers discover, discover tools from one
another? And in terms of aging, how can we effectively, how can we lengthen the
effective working career of a software developer? And is that even something that we
want to do? And what challenges and opportunities do older adults face in software
development? Okay. so this is, I'll be around for the rest of the week, like I said. And so
if you'd like to meet with me, I would be happy to talk with you. If you got some great
examples, I like to hear them. I like to hear about your experience so thank you.
>>: [applause].
>> Emerson Murphy-Hill: Questions?
>>: Has this research been written up in a white paper of some sort or?
>> Emerson Murphy-Hill: The aging part?
>>: Just, the whole presentation in general. Because I see you had several references of
different studies.
>> Emerson Murphy-Hill: Yeah, there isn't a single, single unifying paper. This is, this
presentation is probably it. But you can look for my NSF career award, which will
probably be quite similar. Other questions? Points of contention? I don't agree with this.
Yeah?
>>: So I know you didn't do too much research into aging, did you get any sense for
whether if at all there was transition between younger and older developers? Like are
technologies adopted because your developers are sharing, or because just a generational
shift?
>> Emerson Murphy-Hill: That's a good question. I think, I don't have--so your point is
that there are two, two different factors that might be going on. One in terms of learning
new features, one of them is that maybe people are using the same tools just because
that's what they started with, right. And there continuing to use them. And the other one
is that maybe they transition to new tools because they find out about them through some
mechanism. And I don't know. Actually can't say much about whether one happens
more than the other. Which factor is more important? But there's definitely, there's
definitely, you know, in addition to, you know, your ability to be in the situation where
you're going to learn something from someone else, there's also kind of your willingness,
your willingness to learn something from someone else. And sort of the, one of our
interview respondents kind of called it developer inertia. Where, you know you got what
you have and it works pretty well, so why should you, why should you transition to some
tool that may or may not save you a few seconds? But it's a good question. I don't know.
Any questions or comments? Okay. Thanks, thank you all for coming.
>>: [applause]
Download