Spyware-ridden software development

65
Romain Robbes Michele Lanza Facoltà di scienze informatiche Università della Svizzera italiana ESUG 2006 Spyware-ridden software development

description

Spyware-ridden software development. Romain Robbes, Michele Lanza.ESUG 2006, Prague

Transcript of Spyware-ridden software development

Page 1: Spyware-ridden software development

Romain RobbesMichele Lanza

Facoltàdi scienzeinformatiche

UniversitàdellaSvizzeraitaliana

ESUG2006

Spyware-ridden software

development

Page 2: 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%

?

?

Page 3: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

More than 3/4 of the cost of software is maintenance*

3

75%

25%

initial effortmaintenance

“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%

Page 4: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

The lifecycle of software

4

RequirementsGathering

Understanding &Reengineering

Design &Implementation

75%

25%

Page 5: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Software development is incremental

5

Version 4Version 1 Version 2 Version 3

75%

25%

Page 6: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Software development is incremental

5

Version 4Version 1 Version 2 Version 3

checkout

commit

debugadd feature

75%

25%

Page 7: Spyware-ridden software development

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%

Page 8: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Languages and methodologies target this problem

6

The holy trinity?

75%

25%

Page 9: Spyware-ridden software development

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%

Page 10: Spyware-ridden software development

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

Versioningsystem

Metrics &

trends

75%

25%

Page 11: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Versioning systems lose information

9

75%

25%

Page 12: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

> cvs update

Versioning systems lose information

9

75%

25%

Page 13: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

> cvs update> vim Foo.cc

Versioning systems lose information

9

75%

25%

Page 14: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

> cvs update> vim Foo.cc(some work done...)

Versioning systems lose information

9

75%

25%

Page 15: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

> cvs update> vim Foo.cc(some work done...)> cvs commit

Versioning systems lose information

9

75%

25%

Page 16: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

> cvs update> vim Foo.cc(some work done...)> cvs commit ?

Versioning systems lose information

?9

75%

25%

Page 17: Spyware-ridden software development

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%

Page 18: Spyware-ridden software development

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%

Page 19: Spyware-ridden software development

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%

Page 20: Spyware-ridden software development

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 method2.Rename method

10

75%

25%

Page 21: Spyware-ridden software development

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 method2.Rename method

10

75%

25%

Page 22: Spyware-ridden software development

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 method2.Rename method3.Create accessors

10

75%

25%

Page 23: Spyware-ridden software development

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 method2.Rename method3.Create accessors

10

75%

25%

Page 24: Spyware-ridden software development

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 method2.Rename method3.Create accessors

+18 / -11CVS:

10

75%

25%

Page 25: Spyware-ridden software development

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 method2.Rename method3.Create accessors

+18 / -11CVS:

10

75%

25%

Page 26: Spyware-ridden software development

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%

Versioningsystem

Page 27: Spyware-ridden software development

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

?

Page 28: Spyware-ridden software development

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

?

Page 29: Spyware-ridden software development

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

?

Page 30: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

The general architecture of SpyWare

14

IDESpyWare

pluginChange

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

:

?

Page 31: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

How does SpyWare work?

15

?

Page 32: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

How does SpyWare work?

15

myNewMethod: foo

?

Page 33: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

How does SpyWare work?

15

myNewMethod: fooself bar: foo + 1.

?

Page 34: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

How does SpyWare work?

15

myNewMethod: fooself bar: foo + 1.self baz: foo - 1.

?

Page 35: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

How does SpyWare work?

15

myNewMethod: fooself bar: foo + 1.self baz: foo - 1.

Incremental compilation

Method compiled!

?

Page 36: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

How does SpyWare work?

15

myNewMethod: fooself bar: foo + 1.self baz: foo - 1.

?

Page 37: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

The change builder infers change information

16

?

Page 38: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

The change builder infers change information

16

Method compiled!

?

Page 39: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

The change builder infers change information

16

Is it a new one?

Yes!

Who? when?

Romain Robbes@ 21h32

?

Page 40: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

The change builder infers change information

16

create method

add to class

create variable

add to method

OK...

?

Page 41: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

The change builder infers change information

16

?

Page 42: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Tools exploit the changes

17

Model maintainer

Bar

quux

baz:

?

Page 43: Spyware-ridden software development

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:

?

Page 44: Spyware-ridden software development

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:

?

Page 45: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

SpyWare case studies:

18

SpyWare×9 ×1

Page 46: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Short SpyWare demo

19

SpyWare

Page 47: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Future possibilities

20

Several tools can be implemented on top of this mechanism: here are a few.

?

Page 48: Spyware-ridden software development

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;

VersioningSystem

IDE

?

?

Page 49: Spyware-ridden software development

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

?

Page 50: Spyware-ridden software development

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

?

Page 51: Spyware-ridden software development

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

?

Page 52: Spyware-ridden software development

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

?

Page 53: Spyware-ridden software development

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

?

Page 54: Spyware-ridden software development

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

?

Page 55: Spyware-ridden software development

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

:-)

?

Page 56: Spyware-ridden software development

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

:-)

?

Page 57: Spyware-ridden software development

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

:-)

?

Page 58: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Find merge conflicts faster

24

?

Page 59: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Find merge conflicts faster

24

!

!

?

Page 60: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Conclusions

25

Page 61: Spyware-ridden software development

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?

Page 62: Spyware-ridden software development

FOR SPYWARE NOWhttp://romain.robb.es/spyware

Page 63: Spyware-ridden software development
Page 64: Spyware-ridden software development

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

Page 65: Spyware-ridden software development

Romain Robbes Spyware-ridden software development

Spyware versus the change log

30

Ad-hoc format (a bunch of do-its)Not aware of refactoringsTied to one imageData loss because of purgesExporting with change sets only keeps the last version of a method