SlideShare a Scribd company logo
1 of 65
Download to read offline
Romain Robbes
Michele Lanza
Facoltà
di scienze
informatiche
Università
della
Svizzera
italiana
ESUG
2006
Spyware-ridden
software
development
Context
What is SpyWare?
Results & demo
Further possibilities
Romain Robbes Spyware-ridden software development
SpyWare is a research
prototype built for my Ph.D.
2
SpyWare
75%
25%
?
?
Romain Robbes Spyware-ridden software development
More than 3/4 of the cost of
software is maintenance*
3
75%
25%
initial effort
maintenance
“A program that is
used in a real-world
environment must
change, or become
progressively less
useful in that
environment. ”
– Lehman’s laws
* from: http://www.cs.jyu.fi/~koskinen/smcosts.htm
75%
25%
Romain Robbes Spyware-ridden software development
The lifecycle of software
4
Requirements
Gathering
Understanding &
Reengineering
Design &
Implementation
75%
25%
Romain Robbes Spyware-ridden software development
Software development is
incremental
5
Version 4Version 1 Version 2 Version 3
75%
25%
Romain Robbes Spyware-ridden software development
Software development is
incremental
5
Version 4Version 1 Version 2 Version 3
checkout
commit
debugadd feature
75%
25%
Romain Robbes Spyware-ridden software development
Software development is
incremental
5
Version 4Version 1 Version 2 Version 3
checkout
commit
debugadd feature
add method
add class
add method
75%
25%
Romain Robbes Spyware-ridden software development
Languages and methodologies
target this problem
6
The holy trinity?
75%
25%
Romain Robbes Spyware-ridden software development
The change rate of the
software increases
7
It is easier to lose reference points
Evolvability and understandability are at odds
XP states that the software is in maintenance
100% of the time ...
Are conventional reengineering tools adapted
to agile development?
75%
25%
Romain Robbes Spyware-ridden software development
Software evolution analysis
helps reengineering
8
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
ConcreteA
- asdf: int
+ bar(): void
ConcreteB
Bar
- stuff
+ factory(): Bar
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
FooHistory holds
useful information
Versioning
system
Metrics
&
trends
75%
25%
Romain Robbes Spyware-ridden software development
Versioning systems lose
information
9
75%
25%
Romain Robbes Spyware-ridden software development
> cvs update
Versioning systems lose
information
9
75%
25%
Romain Robbes Spyware-ridden software development
> cvs update
> vim Foo.cc
Versioning systems lose
information
9
75%
25%
Romain Robbes Spyware-ridden software development
> cvs update
> vim Foo.cc
(some work done...)
Versioning systems lose
information
9
75%
25%
Romain Robbes Spyware-ridden software development
> cvs update
> vim Foo.cc
(some work done...)
> cvs commit
Versioning systems lose
information
9
75%
25%
Romain Robbes Spyware-ridden software development
> cvs update
> vim Foo.cc
(some work done...)
> cvs commit ?
Versioning systems lose
information
?9
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
2.Rename method
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
2.Rename method
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
2.Rename method
3.Create accessors
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
2.Rename method
3.Create accessors
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
2.Rename method
3.Create accessors
+18 / -11CVS:
10
75%
25%
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar(z);
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
Romain Robbes Spyware-ridden software development
Our paranoid programmer
saves every 5 minutes
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
1.Extract method
2.Rename method
3.Create accessors
+18 / -11CVS:
10
75%
25%
Romain Robbes Spyware-ridden software development
Recapitulation
11
Software evolution is hard but
necessary
Agile practices make it change even
faster
Versioning systems are inappropriate
sources of information for SE tools
75%
25%
75%
25%
Versioning
system
Romain Robbes Spyware-ridden software development
The principles behind SpyWare
12
1.Model changes, not versions
2.Use the IDE, not the code repository
3.Provide tools in the IDE
?
Romain Robbes Spyware-ridden software development
Modelling and capturing change
information
Rather than storing versions, we record
the semantic actions of the programmer
13
ConcreteA
- asdf: int
+ bar(): void
ConcreteB
Bar
- stuff
+ factory(): Bar
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
?
Romain Robbes Spyware-ridden software development
Modelling and capturing change
information
Rather than storing versions, we record
the semantic actions of the programmer
13
ConcreteA
- asdf: int
+ bar(): void
ConcreteB
Bar
- stuff
+ factory(): Bar
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
add class
add method
rename class
add attribute
change method
change method
?
Romain Robbes Spyware-ridden software development
The general architecture of
SpyWare
14
IDE
SpyWare
plugin
Change
repository
Tools
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
:
?
Romain Robbes Spyware-ridden software development
How does SpyWare work?
15
?
Romain Robbes Spyware-ridden software development
How does SpyWare work?
15
myNewMethod: foo
?
Romain Robbes Spyware-ridden software development
How does SpyWare work?
15
myNewMethod: foo
self bar: foo + 1.
?
Romain Robbes Spyware-ridden software development
How does SpyWare work?
15
myNewMethod: foo
self bar: foo + 1.
self baz: foo - 1.
?
Romain Robbes Spyware-ridden software development
How does SpyWare work?
15
myNewMethod: foo
self bar: foo + 1.
self baz: foo - 1.
Incremental
compilation
Method
compiled!
?
Romain Robbes Spyware-ridden software development
How does SpyWare work?
15
myNewMethod: foo
self bar: foo + 1.
self baz: foo - 1.
?
Romain Robbes Spyware-ridden software development
The change builder infers
change information
16
?
Romain Robbes Spyware-ridden software development
The change builder infers
change information
16
Method
compiled!
?
Romain Robbes Spyware-ridden software development
The change builder infers
change information
16
Is it a new one?
Yes!
Who? when?
Romain Robbes
@ 21h32
?
Romain Robbes Spyware-ridden software development
The change builder infers
change information
16
create method
add to class
create variable
add to method
OK...
?
Romain Robbes Spyware-ridden software development
The change builder infers
change information
16
?
Romain Robbes Spyware-ridden software development
Tools exploit the changes
17
Model maintainer
Bar
quux
baz:
?
Romain Robbes Spyware-ridden software development
Tools exploit the changes
17
create method
add to class
create variable
add to method
Model maintainer
Bar
quux
baz:
?
Romain Robbes Spyware-ridden software development
Tools exploit the changes
17
create method
add to class
create variable
add to method
Model maintainer
Bar
fooquux
baz: myNewMethod:
?
Romain Robbes Spyware-ridden software development
SpyWare case studies:
18
SpyWare
×9 ×1
Romain Robbes Spyware-ridden software development
Short SpyWare demo
19
SpyWare
Romain Robbes Spyware-ridden software development
Future possibilities
20
Several tools can be implemented on top of
this mechanism: here are a few.
?
Romain Robbes Spyware-ridden software development
Fine-grained software
evolution analysis
21
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar();
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
class Foo {
private int x;
private int y;
public getX() { return x; }
public setX(newX) { x = newX; }
public getY() { return y; }
public setY(newY) { y = newY; }
public baz() {
blah.blah(blah);
z = getX() + getY();
return bar();
}
public quux() {
return getY() + 4;
}
public asdf() {
return getX() * 8 + getY();
}
private bar(z) {
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
}
f = new Foo();
f.baz();
print f.getX() + f.getY();
class Foo {
public int x;
public int y;
public doFoo() {
blah.blah(blah);
z = x + y;
blu = blu * 2;
t = blurg(z);
bli[t] = blu;
return t;
}
public quux() {
return y + 4;
}
public asdf() {
return x * 8 + y;
}
}
f = new Foo();
f.doFoo();
print f.x + f.y;
Versioning
System
IDE
?
?
Romain Robbes Spyware-ridden software development
Query and understand recent
changes
22
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
?
Romain Robbes Spyware-ridden software development
Query and understand recent
changes
22
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
?
Romain Robbes Spyware-ridden software development
Query and understand recent
changes
22
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
?
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
Romain Robbes Spyware-ridden software development
Find precise causes of bugs
23
?
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
Romain Robbes Spyware-ridden software development
Find precise causes of bugs
23
?
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
Romain Robbes Spyware-ridden software development
Find precise causes of bugs
23
?
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
Romain Robbes Spyware-ridden software development
Find precise causes of bugs
23
:-)
?
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
Romain Robbes Spyware-ridden software development
Find precise causes of bugs
23
:-)
?
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
Bar
Foo
- asdf: int
+ Foo(c: int)
+ bar(): void
Quux
Romain Robbes Spyware-ridden software development
Find precise causes of bugs
23
:-)
?
Romain Robbes Spyware-ridden software development
Find merge conflicts faster
24
?
Romain Robbes Spyware-ridden software development
Find merge conflicts faster
24
!
!
?
Romain Robbes Spyware-ridden software development
Conclusions
25
Romain Robbes Spyware-ridden software development
SpyWare introduces a model of
software changes
26
+ no information lost
+ accuracy
+ tool support
ConcreteA
- asdf: int
+ bar(): void
ConcreteB
Bar
- stuff
+ factory(): Bar
ConcreteA
- asdf: int
+ bar(): void
+ baz(): int
ConcreteB
AbstractBar
- stuff
- other
+ factory():
AbstractBar
Foo
- performance?
- space?
- validation?
FOR SPYWARE NOW
http://romain.robb.es/spyware
Entity
- id
History
- changes
Change
- id
- timestamp
- author
EntityState
- entity
- parent
- children
- properties
1
1
1 *
1 *
1
*
Romain Robbes Spyware-ridden software development
Our model emphasizes changes
over entities
29
Romain Robbes Spyware-ridden software development
Spyware versus the change log
30
Ad-hoc format (a bunch of do-its)
Not aware of refactorings
Tied to one image
Data loss because of purges
Exporting with change sets only keeps
the last version of a method

More Related Content

Similar to Spyware-ridden software development

とある断片の超動的言語
とある断片の超動的言語とある断片の超動的言語
とある断片の超動的言語Kiyotaka Oku
 
Trace the following part of codes step by step- Show exactly what it w.docx
Trace the following part of codes step by step- Show exactly what it w.docxTrace the following part of codes step by step- Show exactly what it w.docx
Trace the following part of codes step by step- Show exactly what it w.docxgtameka
 
JavaForum Nord 2021: Java to Go - Google Go für Java-Entwickler
JavaForum Nord 2021: Java to Go - Google Go für Java-EntwicklerJavaForum Nord 2021: Java to Go - Google Go für Java-Entwickler
JavaForum Nord 2021: Java to Go - Google Go für Java-EntwicklerJan Stamer
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges✅ William Pinaud
 
WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...
WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...
WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...MaruMengesha
 
Python-GTK
Python-GTKPython-GTK
Python-GTKYuren Ju
 
Advanced Techniques: Graphics | Pebble Developer Retreat 2014
Advanced Techniques: Graphics | Pebble Developer Retreat 2014Advanced Techniques: Graphics | Pebble Developer Retreat 2014
Advanced Techniques: Graphics | Pebble Developer Retreat 2014Pebble Technology
 
Os9 2
Os9 2Os9 2
Os9 2issbp
 
An Introduction to Game Programming with Flash: Object Oriented Programming
An Introduction to Game Programming with Flash: Object Oriented ProgrammingAn Introduction to Game Programming with Flash: Object Oriented Programming
An Introduction to Game Programming with Flash: Object Oriented ProgrammingKrzysztof Opałka
 
LISA QooxdooTutorial Slides
LISA QooxdooTutorial SlidesLISA QooxdooTutorial Slides
LISA QooxdooTutorial SlidesTobias Oetiker
 
betterCode() Go: Einstieg in Go, Standard-Library und Ökosystem
betterCode() Go: Einstieg in Go, Standard-Library und ÖkosystembetterCode() Go: Einstieg in Go, Standard-Library und Ökosystem
betterCode() Go: Einstieg in Go, Standard-Library und ÖkosystemJan Stamer
 
Advanced Debugging Using Java Bytecodes
Advanced Debugging Using Java BytecodesAdvanced Debugging Using Java Bytecodes
Advanced Debugging Using Java BytecodesGanesh Samarthyam
 

Similar to Spyware-ridden software development (20)

Boosting Developer Productivity with Clang
Boosting Developer Productivity with ClangBoosting Developer Productivity with Clang
Boosting Developer Productivity with Clang
 
Java VS Python
Java VS PythonJava VS Python
Java VS Python
 
とある断片の超動的言語
とある断片の超動的言語とある断片の超動的言語
とある断片の超動的言語
 
Trace the following part of codes step by step- Show exactly what it w.docx
Trace the following part of codes step by step- Show exactly what it w.docxTrace the following part of codes step by step- Show exactly what it w.docx
Trace the following part of codes step by step- Show exactly what it w.docx
 
Talk Code
Talk CodeTalk Code
Talk Code
 
JavaForum Nord 2021: Java to Go - Google Go für Java-Entwickler
JavaForum Nord 2021: Java to Go - Google Go für Java-EntwicklerJavaForum Nord 2021: Java to Go - Google Go für Java-Entwickler
JavaForum Nord 2021: Java to Go - Google Go für Java-Entwickler
 
Let's golang
Let's golangLet's golang
Let's golang
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges
 
Xdebug
XdebugXdebug
Xdebug
 
WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...
WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...
WINSEM2020-21_STS3105_SS_VL2020210500169_Reference_Material_I_04-Mar-2021_L14...
 
Java oops features
Java oops featuresJava oops features
Java oops features
 
Python introduction
Python introductionPython introduction
Python introduction
 
Java Bytecodes by Example
Java Bytecodes by ExampleJava Bytecodes by Example
Java Bytecodes by Example
 
Python-GTK
Python-GTKPython-GTK
Python-GTK
 
Advanced Techniques: Graphics | Pebble Developer Retreat 2014
Advanced Techniques: Graphics | Pebble Developer Retreat 2014Advanced Techniques: Graphics | Pebble Developer Retreat 2014
Advanced Techniques: Graphics | Pebble Developer Retreat 2014
 
Os9 2
Os9 2Os9 2
Os9 2
 
An Introduction to Game Programming with Flash: Object Oriented Programming
An Introduction to Game Programming with Flash: Object Oriented ProgrammingAn Introduction to Game Programming with Flash: Object Oriented Programming
An Introduction to Game Programming with Flash: Object Oriented Programming
 
LISA QooxdooTutorial Slides
LISA QooxdooTutorial SlidesLISA QooxdooTutorial Slides
LISA QooxdooTutorial Slides
 
betterCode() Go: Einstieg in Go, Standard-Library und Ökosystem
betterCode() Go: Einstieg in Go, Standard-Library und ÖkosystembetterCode() Go: Einstieg in Go, Standard-Library und Ökosystem
betterCode() Go: Einstieg in Go, Standard-Library und Ökosystem
 
Advanced Debugging Using Java Bytecodes
Advanced Debugging Using Java BytecodesAdvanced Debugging Using Java Bytecodes
Advanced Debugging Using Java Bytecodes
 

More from ESUG

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingESUG
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in PharoESUG
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapESUG
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoESUG
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...ESUG
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsESUG
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6ESUG
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationESUG
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingESUG
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesESUG
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportESUG
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsESUG
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector TuningESUG
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseESUG
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FutureESUG
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the DebuggerESUG
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing ScoreESUG
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptESUG
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocESUG
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsESUG
 

More from ESUG (20)

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programming
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in Pharo
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and Roadmap
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in Pharo
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early results
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test Generation
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic Programming
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience Report
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIs
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector Tuning
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and Future
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the Debugger
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing Score
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design Mooc
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and Transformations
 

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 

Recently uploaded (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 

Spyware-ridden software development

  • 1. Romain Robbes Michele Lanza Facoltà di scienze informatiche Università della Svizzera italiana ESUG 2006 Spyware-ridden software development
  • 2. Context What is SpyWare? Results & demo Further possibilities Romain Robbes Spyware-ridden software development SpyWare is a research prototype built for my Ph.D. 2 SpyWare 75% 25% ? ?
  • 3. Romain Robbes Spyware-ridden software development More than 3/4 of the cost of software is maintenance* 3 75% 25% initial effort maintenance “A program that is used in a real-world environment must change, or become progressively less useful in that environment. ” – Lehman’s laws * from: http://www.cs.jyu.fi/~koskinen/smcosts.htm 75% 25%
  • 4. Romain Robbes Spyware-ridden software development The lifecycle of software 4 Requirements Gathering Understanding & Reengineering Design & Implementation 75% 25%
  • 5. Romain Robbes Spyware-ridden software development Software development is incremental 5 Version 4Version 1 Version 2 Version 3 75% 25%
  • 6. Romain Robbes Spyware-ridden software development Software development is incremental 5 Version 4Version 1 Version 2 Version 3 checkout commit debugadd feature 75% 25%
  • 7. Romain Robbes Spyware-ridden software development Software development is incremental 5 Version 4Version 1 Version 2 Version 3 checkout commit debugadd feature add method add class add method 75% 25%
  • 8. Romain Robbes Spyware-ridden software development Languages and methodologies target this problem 6 The holy trinity? 75% 25%
  • 9. Romain Robbes Spyware-ridden software development The change rate of the software increases 7 It is easier to lose reference points Evolvability and understandability are at odds XP states that the software is in maintenance 100% of the time ... Are conventional reengineering tools adapted to agile development? 75% 25%
  • 10. Romain Robbes Spyware-ridden software development Software evolution analysis helps reengineering 8 Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux ConcreteA - asdf: int + bar(): void ConcreteB Bar - stuff + factory(): Bar ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar FooHistory holds useful information Versioning system Metrics & trends 75% 25%
  • 11. Romain Robbes Spyware-ridden software development Versioning systems lose information 9 75% 25%
  • 12. Romain Robbes Spyware-ridden software development > cvs update Versioning systems lose information 9 75% 25%
  • 13. Romain Robbes Spyware-ridden software development > cvs update > vim Foo.cc Versioning systems lose information 9 75% 25%
  • 14. Romain Robbes Spyware-ridden software development > cvs update > vim Foo.cc (some work done...) Versioning systems lose information 9 75% 25%
  • 15. Romain Robbes Spyware-ridden software development > cvs update > vim Foo.cc (some work done...) > cvs commit Versioning systems lose information 9 75% 25%
  • 16. Romain Robbes Spyware-ridden software development > cvs update > vim Foo.cc (some work done...) > cvs commit ? Versioning systems lose information ?9 75% 25%
  • 17. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 10 75% 25%
  • 18. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 10 75% 25%
  • 19. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 10 75% 25%
  • 20. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 2.Rename method 10 75% 25%
  • 21. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 2.Rename method 10 75% 25%
  • 22. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 2.Rename method 3.Create accessors 10 75% 25%
  • 23. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 2.Rename method 3.Create accessors 10 75% 25%
  • 24. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 2.Rename method 3.Create accessors +18 / -11CVS: 10 75% 25%
  • 25. class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(z); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); Romain Robbes Spyware-ridden software development Our paranoid programmer saves every 5 minutes class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; 1.Extract method 2.Rename method 3.Create accessors +18 / -11CVS: 10 75% 25%
  • 26. Romain Robbes Spyware-ridden software development Recapitulation 11 Software evolution is hard but necessary Agile practices make it change even faster Versioning systems are inappropriate sources of information for SE tools 75% 25% 75% 25% Versioning system
  • 27. Romain Robbes Spyware-ridden software development The principles behind SpyWare 12 1.Model changes, not versions 2.Use the IDE, not the code repository 3.Provide tools in the IDE ?
  • 28. Romain Robbes Spyware-ridden software development Modelling and capturing change information Rather than storing versions, we record the semantic actions of the programmer 13 ConcreteA - asdf: int + bar(): void ConcreteB Bar - stuff + factory(): Bar ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo ?
  • 29. Romain Robbes Spyware-ridden software development Modelling and capturing change information Rather than storing versions, we record the semantic actions of the programmer 13 ConcreteA - asdf: int + bar(): void ConcreteB Bar - stuff + factory(): Bar ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo add class add method rename class add attribute change method change method ?
  • 30. Romain Robbes Spyware-ridden software development The general architecture of SpyWare 14 IDE SpyWare plugin Change repository Tools ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux : ?
  • 31. Romain Robbes Spyware-ridden software development How does SpyWare work? 15 ?
  • 32. Romain Robbes Spyware-ridden software development How does SpyWare work? 15 myNewMethod: foo ?
  • 33. Romain Robbes Spyware-ridden software development How does SpyWare work? 15 myNewMethod: foo self bar: foo + 1. ?
  • 34. Romain Robbes Spyware-ridden software development How does SpyWare work? 15 myNewMethod: foo self bar: foo + 1. self baz: foo - 1. ?
  • 35. Romain Robbes Spyware-ridden software development How does SpyWare work? 15 myNewMethod: foo self bar: foo + 1. self baz: foo - 1. Incremental compilation Method compiled! ?
  • 36. Romain Robbes Spyware-ridden software development How does SpyWare work? 15 myNewMethod: foo self bar: foo + 1. self baz: foo - 1. ?
  • 37. Romain Robbes Spyware-ridden software development The change builder infers change information 16 ?
  • 38. Romain Robbes Spyware-ridden software development The change builder infers change information 16 Method compiled! ?
  • 39. Romain Robbes Spyware-ridden software development The change builder infers change information 16 Is it a new one? Yes! Who? when? Romain Robbes @ 21h32 ?
  • 40. Romain Robbes Spyware-ridden software development The change builder infers change information 16 create method add to class create variable add to method OK... ?
  • 41. Romain Robbes Spyware-ridden software development The change builder infers change information 16 ?
  • 42. Romain Robbes Spyware-ridden software development Tools exploit the changes 17 Model maintainer Bar quux baz: ?
  • 43. Romain Robbes Spyware-ridden software development Tools exploit the changes 17 create method add to class create variable add to method Model maintainer Bar quux baz: ?
  • 44. Romain Robbes Spyware-ridden software development Tools exploit the changes 17 create method add to class create variable add to method Model maintainer Bar fooquux baz: myNewMethod: ?
  • 45. Romain Robbes Spyware-ridden software development SpyWare case studies: 18 SpyWare ×9 ×1
  • 46. Romain Robbes Spyware-ridden software development Short SpyWare demo 19 SpyWare
  • 47. Romain Robbes Spyware-ridden software development Future possibilities 20 Several tools can be implemented on top of this mechanism: here are a few. ?
  • 48. Romain Robbes Spyware-ridden software development Fine-grained software evolution analysis 21 class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; class Foo { private int x; private int y; public getX() { return x; } public setX(newX) { x = newX; } public getY() { return y; } public setY(newY) { y = newY; } public baz() { blah.blah(blah); z = getX() + getY(); return bar(); } public quux() { return getY() + 4; } public asdf() { return getX() * 8 + getY(); } private bar(z) { blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } } f = new Foo(); f.baz(); print f.getX() + f.getY(); class Foo { public int x; public int y; public doFoo() { blah.blah(blah); z = x + y; blu = blu * 2; t = blurg(z); bli[t] = blu; return t; } public quux() { return y + 4; } public asdf() { return x * 8 + y; } } f = new Foo(); f.doFoo(); print f.x + f.y; Versioning System IDE ? ?
  • 49. Romain Robbes Spyware-ridden software development Query and understand recent changes 22 ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux ?
  • 50. Romain Robbes Spyware-ridden software development Query and understand recent changes 22 ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux ?
  • 51. Romain Robbes Spyware-ridden software development Query and understand recent changes 22 ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux ?
  • 52. ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux Romain Robbes Spyware-ridden software development Find precise causes of bugs 23 ?
  • 53. ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux Romain Robbes Spyware-ridden software development Find precise causes of bugs 23 ?
  • 54. ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux Romain Robbes Spyware-ridden software development Find precise causes of bugs 23 ?
  • 55. ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux Romain Robbes Spyware-ridden software development Find precise causes of bugs 23 :-) ?
  • 56. ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux Romain Robbes Spyware-ridden software development Find precise causes of bugs 23 :-) ?
  • 57. ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo Bar Foo - asdf: int + Foo(c: int) + bar(): void Quux Romain Robbes Spyware-ridden software development Find precise causes of bugs 23 :-) ?
  • 58. Romain Robbes Spyware-ridden software development Find merge conflicts faster 24 ?
  • 59. Romain Robbes Spyware-ridden software development Find merge conflicts faster 24 ! ! ?
  • 60. Romain Robbes Spyware-ridden software development Conclusions 25
  • 61. Romain Robbes Spyware-ridden software development SpyWare introduces a model of software changes 26 + no information lost + accuracy + tool support ConcreteA - asdf: int + bar(): void ConcreteB Bar - stuff + factory(): Bar ConcreteA - asdf: int + bar(): void + baz(): int ConcreteB AbstractBar - stuff - other + factory(): AbstractBar Foo - performance? - space? - validation?
  • 63.
  • 64. Entity - id History - changes Change - id - timestamp - author EntityState - entity - parent - children - properties 1 1 1 * 1 * 1 * Romain Robbes Spyware-ridden software development Our model emphasizes changes over entities 29
  • 65. Romain Robbes Spyware-ridden software development Spyware versus the change log 30 Ad-hoc format (a bunch of do-its) Not aware of refactorings Tied to one image Data loss because of purges Exporting with change sets only keeps the last version of a method