finding relevant functions and their usagesdenys/pubs/talks/icse'11-portfoliosfps.pdfportfolio...

108
Portfolio Portfolio Finding Relevant Functions and their Usages Collin McMillan 1 Mark Grechanik 2 Denys Poshyvanyk 1 Qing Xie 2 Chen Fu 2 Chen Fu 1 College of William & Mary 2 Accenture Technology Labs Accenture Technology Labs

Upload: others

Post on 07-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

PortfolioPortfolioFinding Relevant Functions and their Usages

Collin McMillan1

Mark Grechanik2

Denys Poshyvanyk1

Qing Xie2

Chen Fu2Chen Fu

1College of William & Mary2Accenture Technology LabsAccenture Technology Labs

Page 2: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Virtues of Programmers:g

L i• Laziness

• ImpatienceImpatience

• Hubris

L W llLarry Wall,

Inventor of PerlInventor of Perl

Page 3: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Example Programming Task

Write a utility for dithering mip map imagesWrite a utility for dithering mip map imagesthat are used for rendering texture.

Mip Maps DitheringMip Maps Dithering

Page 4: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

What Programmers Do: Use A Search Engine!

Write a utility for ditheringmip map images “mip map ditheringthat are used forrendering texture.

texture image graphics”

Page 5: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

What Programmers Do: Use A Search Engine!

Write a utility for ditheringmip map images “mip map ditheringthat are used forrendering texture.

texture image graphics”

TaskDescription

Page 6: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

What Programmers Do: Use A Search Engine!

Write a utility for ditheringmip map images “mip map ditheringthat are used forrendering texture.

texture image graphics”

KeywordsTask KeywordsDescription

Page 7: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Example Source Code Search Engine

“mip map ditheringtexture imageg

graphics”

Page 8: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Example Source Code Search Engine

Query

“mip map ditheringtexture imageg

graphics”

Page 9: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Example Source Code Search Engine

Query List of Results

“mip map ditheringtexture imageg

graphics”

Page 10: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Users Prefer Web Search to Code Search

Of 35 Professional Programmers we surveyed:Of 35 Professional Programmers we surveyed:

• 12 did not search for code online

9 did d h i• 19 did not use code search engines

• 14 cited “irrelevant results” as the reason

• Preferred Web Search to Code Search!

* Susan Sim, Medha Umarji, Sukanya Ratanotayanon, Cristina Lopes, How Well Do Search Engines Support Code Retrieval on the Web?, TOSEM, to appear

Page 11: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Users Prefer Web Search to Code Search

Of 35 Professional Programmers we surveyed:Of 35 Professional Programmers we surveyed:

• 12 did not search for code online

9 did d h i• 19 did not use code search engines

• 14 cited “irrelevant results” as the reason

• Preferred Web Search to Code Search!

How Could This Happen?

* Susan Sim, Medha Umarji, Sukanya Ratanotayanon, Cristina Lopes, How Well Do Search Engines Support Code Retrieval on the Web?, TOSEM, to appear

Page 12: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Search Result ‐ A Relevant Function

Page 13: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Search Result ‐ A Relevant Function

Keywords in Comments

Page 14: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Find Usages of Relevant Functions

Page 15: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Find Usages of Relevant Functions

Function Called Here

Page 16: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 17: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 18: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

HR 1790

Page 19: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

HR 17901 59x1031 kg1.59x10 kg

Page 20: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Mag 1.94HR 1790

1 59x1031 kg1.59x10 kg

Page 21: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Mag 1.94HR 1790

1 59x1031 kg1.59x10 kg

Page 22: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 23: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 24: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Save()

Page 25: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Save()31 LOC31 LOC

Page 26: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

CC 0.13Save()

31 LOC31 LOC

Page 27: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 28: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 29: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 30: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Our Search Engine: Portfolio

Our Contribution, Two Search Models:

1) Navigation Model for Software

2) Association Model for Software) Association Model for Software

Page 31: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Navigation Modelg

Page 32: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Navigation Model ‐ PageRankg g

Page 33: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Navigation Model ‐ PageRankg g

Page 34: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Navigation Model ‐ PageRankg g

Popular

Page 35: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Spreading Activation inAssociative NetworksAssociative Networks

* Quillian, M. R. Word concepts: A theory and simulation of some basic semantic capabilities. Behavioral Science, 1967, 12, 410-430.

Page 36: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Spreading Activation inAssociative NetworksAssociative Networks

H iiHawaii

* Quillian, M. R. Word concepts: A theory and simulation of some basic semantic capabilities. Behavioral Science, 1967, 12, 410-430.

Page 37: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Spreading Activation inAssociative NetworksAssociative Networks

H iiHawaii

Iceland

* Quillian, M. R. Word concepts: A theory and simulation of some basic semantic capabilities. Behavioral Science, 1967, 12, 410-430.

Page 38: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

In Portfolio: Function calls are associations

initRenderer

LoadTextureFromFile

GlareTexture

LoadTextureFromFile

ImageTexture

Functions from Celestia: http://www.shatters.net/celestia/

TiledTexture CreateTextureFromImage

Page 39: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

In Portfolio: Function calls are associations

initRenderer

LoadTextureFromFile

GlareTexture

LoadTextureFromFile

ImageTexture

Functions from Celestia: http://www.shatters.net/celestia/

TiledTexture CreateTextureFromImage

Page 40: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Association Model – Spreading Activation

initRenderer

LoadTextureFromFile

0.19

GlareTexture

LoadTextureFromFile

0 24

0.24“mip map dithering

texture imagegraphics”

ImageTexture

0.24

0.30

TiledTexture CreateTextureFromImage

Functions from Celestia: http://www.shatters.net/celestia/

Page 41: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Association Model – Spreading Activation

initRenderer

LoadTextureFromFile

0.19

GlareTexture

LoadTextureFromFile

0 24

0.24“mip map dithering

texture imagegraphics”

T t lImageTexture

0.24TextualSimilarity

0.300.65

TiledTexture CreateTextureFromImage

Functions from Celestia: http://www.shatters.net/celestia/

0.65

Page 42: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Association Model – Spreading Activation

initRenderer

LoadTextureFromFile

0.19

GlareTexture

LoadTextureFromFile

0 24

0.24“mip map dithering

texture imagegraphics”

T t l 0 52

ImageTexture

0.24TextualSimilarity

0.52

0.300.65 0.52

TiledTexture CreateTextureFromImage

Functions from Celestia: http://www.shatters.net/celestia/

0.65 0.52

Page 43: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Association Model – Spreading Activation

initRenderer

LoadTextureFromFile

0.19

GlareTexture

LoadTextureFromFile

0 24

0.24“mip map dithering

texture imagegraphics”

T t l 0 52

ImageTexture

0.24TextualSimilarity

0.52

0.300.65 0.52

0.42

TiledTexture CreateTextureFromImage

Functions from Celestia: http://www.shatters.net/celestia/

0.65 0.52

Page 44: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Association Model – Spreading Activation

initRenderer

LoadTextureFromFile

0.19

GlareTexture

LoadTextureFromFile

0 24

0.24“mip map dithering

texture imagegraphics”

T t l 0 52

0.33

ImageTexture

0.24TextualSimilarity

0.52

0.300.65 0.52

0.42

TiledTexture CreateTextureFromImage

Functions from Celestia: http://www.shatters.net/celestia/

0.65 0.52

Page 45: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Association Model – Spreading Activation

initRenderer

LoadTextureFromFile

0.190.27

GlareTexture

LoadTextureFromFile

0 24

0.24“mip map dithering

texture imagegraphics”

T t l 0 52

0.33

ImageTexture

0.24TextualSimilarity

0.52

0.300.65 0.52

0.42

TiledTexture CreateTextureFromImage

Functions from Celestia: http://www.shatters.net/celestia/

0.65 0.52

Page 46: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1
Page 47: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

Page 48: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

Page 49: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

Page 50: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

Page 51: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

Page 52: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

Page 53: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

Page 54: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

CelestiaGlareTexture

UseImage

ImageTexture

GlareTexture

ImageTexture

TiledTexture

CreateTextureFromImage

Page 55: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRank

CelestiaGlareTexture

UseImage

ImageTexture

GlareTexture

ImageTexture

TiledTexture

CreateTextureFromImage

Page 56: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRank

CelestiaGlareTexture

UseImage

ImageTexture

GlareTexture

ImageTexture

TiledTexture

CreateTextureFromImage

Page 57: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRank

CelestiaGlareTexture

UseImage

ImageTexture

GlareTexture

ImageTexture

TiledTexture

CreateTextureFromImage

Page 58: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPR

CelestiaGlareTexture

UseImage

ImageTexture

GlareTexture

ImageTexture

TiledTexture

CreateTextureFromImage Popular

Page 59: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPRMetadataBuilder

CelestiaGlareTexture

UseImage

ImageTexture

GlareTexture

ImageTexture

TiledTexture

CreateTextureFromImage Popular

Page 60: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPRMetadataBuilder

Page 61: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPRMetadataBuilder

Page 62: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPRMetadataBuilder

ProjectsMetadata

Page 63: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPRMetadataBuilder

ProjectsMetadata

/* Tiling Method for Mip Maps */static Texture* TiledTexture(Image& img){if (GetTextureCaps().nonPow2Supported){

/* prepares mip maps for dithering */if (mipMode == Texture::DefaultMipMaps)

mipMode = Texture::AutoMipMaps;}…

}

Page 64: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

/* Tiling Method for Mip Maps */static Texture* TiledTexture(Image& img){if (GetTextureCaps().nonPow2Supported){

/* prepares mip maps for dithering */if (mipMode == Texture::DefaultMipMaps)

mipMode = Texture::AutoMipMaps;}…

}

Page 65: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCG

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

/* Tiling Method for Mip Maps */static Texture* TiledTexture(Image& img){if (GetTextureCaps().nonPow2Supported){

/* prepares mip maps for dithering */if (mipMode == Texture::DefaultMipMaps)

mipMode = Texture::AutoMipMaps;

“mip map dithering”

}…

}

Page 66: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

/* Tiling Method for Mip Maps */static Texture* TiledTexture(Image& img){if (GetTextureCaps().nonPow2Supported){

/* prepares mip maps for dithering */if (mipMode == Texture::DefaultMipMaps)

mipMode = Texture::AutoMipMaps;

“mip map dithering”

}…

}

Page 67: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

Page 68: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

SAN0.65TiledTexture

Page 69: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

SAN0.65TiledTexture

Page 70: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

CelestiaGlareTexture

SAN0.65 ImageTexture

GlareTexture

TiledTexture

ImageTexture

CreateTextureFromImage

Page 71: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

CelestiaGlareTextureStart Here

SAN0.65 ImageTexture

GlareTextureStart Here

TiledTexture

ImageTexture

CreateTextureFromImage

Page 72: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

CelestiaGlareTextureStart Here SAN

SAN0.65 ImageTexture

GlareTextureStart Here

Find

SAN0.52

TiledTexture

ImageTextureFindThese

CreateTextureFromImageSAN0.52

Page 73: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

CelestiaGlareTextureStart Here SAN

SAN0.65 ImageTexture

GlareTextureStart Here

Find

SAN0.52

TiledTexture

ImageTextureFindThese

Then This OneSAN0.42

CreateTextureFromImageSAN0.52

Page 74: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

ProjectsMetadataIR

Engine

CelestiaGlareTextureStart Here SAN

SAN0.65 ImageTexture

GlareTextureStart Here

Find

SAN0.52

TiledTexture

ImageTextureFindThese

Then This OneSAN0.42

CreateTextureFromImageSAN0.52

Page 75: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

ProjectsMetadataIR

Engine

CelestiaGlareTextureStart Here SAN

SAN0.65 ImageTexture

GlareTextureStart Here

Find

SAN0.52

TiledTexture

ImageTextureFindThese

Then This OneSAN0.42

CreateTextureFromImageSAN0.52

Page 76: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

ProjectsMetadataIR

Engine

CelestiaGlareTexture SAN

SAN0.65 ImageTexture

GlareTexture SAN0.52

TiledTexture

ImageTextureSAN0.42

CreateTextureFromImageSAN0.52

Page 77: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

ProjectsMetadataIR

Engine

CelestiaGlareTexture SAN

PR0.18

SAN0.65 ImageTexture

GlareTexture SAN0.52PR0.33

PR0.42

TiledTexture

ImageTextureSAN0.42

0.33

CreateTextureFromImageSAN0.52

PR0.33

Page 78: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

ProjectsMetadataIR

Engine

CelestiaGlareTexture SAN

PR0.18

SAN0.65 ImageTexture

GlareTexture SAN0.52PR0.33

PR0.42

TiledTexture

ImageTextureSAN0.42

0.33

CreateTextureFromImageSAN0.52

PR0.33

Page 79: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

ProjectsMetadataIR

Engine

P

CelestiaGlareTexture SAN

PR0.18

SAN0.65 ImageTexture

GlareTexture SAN0.52PR0.33

PR0.42

TiledTexture

ImageTextureSAN0.42

0.33

CreateTextureFromImageSAN0.52

PR0.33

Page 80: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

ProjectsMetadataIR

Engine

P

CelestiaGlareTexture 0 35

ImageTexture

GlareTexture 0.35

0 380.54TiledTexture

ImageTexture 0.38

CreateTextureFromImage 0.43

Page 81: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

Visualizer

ProjectsMetadataIR

Engine

PVisualizer

CelestiaGlareTexture 0 35

ImageTexture

GlareTexture 0.35

0 380.54TiledTexture

ImageTexture 0.38

CreateTextureFromImage 0.43

Page 82: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

Visualizer

ProjectsMetadataIR

Engine

PVisualizer

CelestiaGlareTexture 0 35

ImageTexture

GlareTexture 0.35

0 380.54TiledTexture

ImageTexture 0.38

CreateTextureFromImage 0.43

Page 83: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

Visualizer

ProjectsMetadataIR

Engine

PVisualizer

Page 84: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

Visualizer

ProjectsMetadataIR

Engine

PVisualizer

Page 85: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

ProjectsArchive

FunctionGraph Builder

FCGRelevantFunctions

SAN

PageRankPPRMetadataBuilder

PSAN

Visualizer

ProjectsMetadataIR

Engine

PVisualizer

Page 86: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Software Archive

FreeBSD Ports• 18,203 C/C++ Projects

• 2.4 Million Files

• 8.5 Million Functions

• 32 Million Function Calls• 32 Million Function Calls

• 270 Million Total Lines of Code

Page 87: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Portfolio Interface“mip map dithering texture image graphics”

Page 88: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Portfolio Interface“mip map dithering texture image graphics”

Page 89: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Portfolio Interface“mip map dithering texture image graphics”

Page 90: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Portfolio Interface“mip map dithering texture image graphics”

Page 91: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Portfolio Interface“mip map dithering texture image graphics”

Page 92: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Portfolio Interface“mip map dithering texture image graphics”

Page 93: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Experiment

To compare Portfolio with Google Code Searchand Koders

49 C/C++ Programmers participated49 C/C++ Programmers participated• 44 Professionals from Accenture• 5 Students from the University of Illinois at Chicagoy g

Page 94: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Large Case Studies are Rare

“First, it is very difficult to scale human experiments to get quantitative significantexperiments to get quantitative, significant measures of usefulness; this type of large-scale human study is very rare.scale human study is very rare.

Second, comparing different recommenders using human evaluators would involveusing human evaluators would involve carefully designed, time-consuming experiments; this is also extremely rare ”experiments; this is also extremely rare.

Saul, Filkov, Devanbu, BirdRecommending Random Walks, ESEC/FSE‘07

Page 95: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Participants’ Role

1) Receive Task and Search Engine

Write a utility for dithering mip map imagesthat are used for rendering texture

2) Translate Task to Query, enter into Engine

that are used for rendering texture.

Page 96: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Likert Scale ‐ Confidence

1) Completely irrelevant – there is absolutely nothing that the participant can use from this retrieved code fragments nothing in it is related tocan use from this retrieved code fragments, nothing in it is related to keywords that the participant chose based on the descriptions of the tasks.

2) Mostly irrelevant – a retrieved code fragment is only remotely relevant to a given task; it is unclear how to reuse it.

3) Mostly relevant – a retrieved code fragment is relevant to a given task and participant can understand with some modest effort how to reuse it to solve a given task.

4) Highly relevant – The participant is highly confident that code fragment can be reused and s/he clearly see how to use it.

Page 97: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Analysis of the Results

Metrics:Confidence (C)Precision (P)Normalized Discounted Cumulative Gain (NG)

Search Engine Queries Entered Responses Rated

Portfolio 184 1276Portfolio 184 1276

Google Code Search 198 1373

Koders 208 1486Koders 208 1486

Page 98: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Results – Confidence

p <5.0·10 -108

F 261.3

Fcrit 3.01

Google Koders Portfolio

Page 99: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Results – Precision

p <8.6·10 -22

F 52.5

Fcrit 3.01

Google Koders Portfolio

Page 100: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Results – Normalized Discounted Gain

p <2.5·10 -18

F 43.8

FFcrit 3.01

Google Koders Portfolio

Page 101: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Statistical Analysis – ANOVA

Null Hypothesis rejected in all cases:H0 – There is no difference in the C, P, or NG mean values among users of Portfolio, Google Code Search, and Koders.

H1 – There is statistically‐significant difference in the numbers of C, P, and NG mean values among users of Portfolio, Google Code Search, and Koders.

Metric p F Fcritical

Confidence < 5 0 · 10 -108 261 3 3 01Confidence < 5.0 10 261.3 3.01

Precision < 8.6 · 10 -22 52.5 3.01

Discounted Gain < 2 5 · 10 -18 43 8 3 01Discounted Gain < 2.5 · 10 18 43.8 3.01

Page 102: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Statistical Analysis – ANOVA

Null Hypothesis rejected in all cases:H0 – There is no difference in the C, P, or NG mean values among users of Portfolio, Google Code Search, and Koders.

H1 – There is statistically‐significant difference in the numbers of C, P, and NG mean values among users of Portfolio, Google Code Search, and Koders.

Metric p F Fcritical

Confidence < 5 0 · 10 -108 261 3 3 01Confidence < 5.0 10 261.3 3.01

Precision < 8.6 · 10 -22 52.5 3.01

Discounted Gain < 2 5 · 10 -18 43 8 3 01Discounted Gain < 2.5 · 10 18 43.8 3.01

Page 103: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Programmer Experience Relations

Do more‐experienced programmers report different results than less‐experienced programmers?

Null Hypothesis not rejected:H0 – There is no difference in the C, P, or NG mean values among experienced and less‐experienced users of Portfolio, Google Koder Search, and Koders.

H1 – There is statistically‐significant difference in the numbers of C, P, and NG mean values among experienced and less‐experienced users of Portfolio, Google Code Search, and Koders.

Page 104: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Programmer Experience Relations

Do more‐experienced programmers report different results than less‐experienced programmers?

Null Hypothesis not rejected:H0 – There is no difference in the C, P, or NG mean values among experienced and less‐experienced users of Portfolio, Google Koder Search, and Koders.

H1 – There is statistically‐significant difference in the numbers of C, P, and NG mean values among experienced and less‐experienced users of Portfolio, Google Code Search, and Koders.

Page 105: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Responses from Programmers

“The search engine Portfolio is a good search l d l ’ ltool ... developers won’t waste time exploring 

different projects or functions.”

“Portfolio looks into functional not based exactly on the wording like Google, so when it’s found g gthe right function, the search is really on target.”

“Th ‘ d b’ f h l“The ‘code web’ of search results was very helpful for finding out which things to analyze.”

Page 106: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Suggestions from Programmers

“The best addition to Portfolio would be the b l h h f h l kability to navigate though functions much like an IDE can.”

“I would like to see more feedback from the search and more options on how to search.”p

“If query is misspelled, [Portfolio] does not i ”return suggestions.”

Page 107: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Ongoing Improvements

Data AvailableAll Source Code in Our RepositoryFunction Dependency Extractor: FUNDEXCase Study Tasks and Responses

P AProgrammer AccessSOAP web serviceJava search now availableJava search now available

See http://www searchportfolio net/See http://www.searchportfolio.net/

Page 108: Finding Relevant Functions and their Usagesdenys/pubs/talks/ICSE'11-PortfolioSFPS.pdfPortfolio Finding Relevant Functions and their Usages Collin 1McMillan Mark Grechanik2 Denys Poshyvanyk1

Visit us online and at Facebook!

http://www searchportfolio net/http://www.searchportfolio.net/