+ All Categories
Home > Documents > SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING...

SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING...

Date post: 31-Jul-2020
Category:
Upload: others
View: 5 times
Download: 0 times
Share this document with a friend
42
SOFTWARE MAINTENANCE AND EVOLUTION --- REFACTORING FOR ASYNC --- CS563 WEEK 3 - TUE Danny Dig
Transcript
Page 1: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

SOFTWARE MAINTENANCE AND EVOLUTION

--- REFACTORING FOR ASYNC ---

CS563 WEEK 3 - TUE Danny Dig

Page 2: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Course Objectives: Project

Practice a research or novel-industrial project through all its stages: - formulate problem, - find the current state of the practice/research (i.e, related

work)- design and implement solution- evaluate the solution empirically- write about it- present progress, receive feedback

2

Page 3: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Mobile Devices are Everywhere

300B apps downloaded annually [Gartner]

Will be the main control agents for IoT

Most end-users spend most of their time on mobile devices

3

Page 4: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Slow Operations Make Mobile AppsUnresponsive

300B apps downloaded annually [Gartner]

Slow operations freeze the UI and frustrate users - 75% of performance bugs in Android [Li et al., ICSE’14]

4

Page 5: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Why are Apps Unresponsive?

5

onClick

onKeyUp

…App Process

UI thread

Event Queue

onStart

Page 6: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

How frequently have you encountered unresponsive apps?

- Never- Rarely- Occasionally- A moderate amount- A great deal

6

Page 7: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

The Perils of Asynchronous Programming

Different programming model (call-backs invert flow of control)

Data races between async call and main thread (e.g., 77 data races on 13 top apps)

sync async

Page 8: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

The Perils of Asynchronous Programming

sync async

modernasync

Modernize legacy async code from call-backs to async/await

On some platforms, Microsoft no longer supports legacy async

Non-trivial changes: preserve program behavior and even the order of exceptions

Page 9: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

The Perils of Asynchronous Programming

9

sync async

modernasyncperformantasync

Misused async constructs hurt performance,cause deadlocks

4% of async code runs synchronously

Async code that constantly badgers UI kills responsiveness by “a thousand paper cuts”

Page 10: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

The Perils of Asynchronous Programming

10

Short-running async constructs can leadmemory leaks, lost results, and wasted energy

sync async

modernasyncperformantasynclong-runningasync

Requires changing stateful into stateless code: from shared memory communication to distributed style

Page 11: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Overview of Our Transformations for Asynchronous Programming

sync async

modernasyncperformantasync

long-runningasync

Page 12: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

A STUDY AND TOOLKIT FOR ASYNCHRONOUS PROGRAMMING IN C#

David HartveldDanny Dig

Arie van Deursen

Semih Okur

Page 13: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Intro

callback hell!private void SnapAndPost (){

Busy = true;UpdateUIStatus ("Taking a picture");var picker = new Xamarin.Media.MediaPicker ();var picTask = picker.TakePhotoAsync (new Xamarin.Media.StoreCameraMediaOptions ());picTask.ContinueWith ((picRetTask) => {

InvokeOnMainThread (() => {if (picRetTask.IsCanceled) {

Busy = false;UpdateUIStatus ("Canceled");

} else {var tagsCtrl = new GetTagsUIViewController (picRetTask.Result.GetStream ());PresentViewController (tagsCtrl, true, () => {

UpdateUIStatus ("Submitting picture to server");var uploadTask = new Task (() => {

return PostPicToService (picRetTask.Result.GetStream (), tagsCtrl.Tags);});uploadTask.ContinueWith ((uploadRetTask) => {

InvokeOnMainThread (() => {Busy = false;UpdateUIStatus (uploadRetTask.Result.Failed ? "Canceled" : "Success");

});});uploadTask.Start ();

});}

});});

}

Invert the control flowObfuscate the intent of the original synchronous codeDon’t scale to large programs13

Page 14: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Intro

async/await keywordsSpecial language constructs introduced in C# 5 (2012)

Make asynchronous programming a first-class citizen!

Possible to express efficient asynchronous code in a familiar direct style

async:method identifier await:used to define pausing points

14

Page 15: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Intro

our study

Q1) How do developers use asynchronous programming?

Built Asyncifier, a refactoring tool.

Conducted a first large-scale formative study about asynchronous programming to answer two RQs:

(i) We do not know how developers use asynchronous programming in practice.

(ii) Asynchronous programming is hard to use and developers lack tool support for it.

Q2) Do developers misuse async/await?

Built Corrector, a bug fixing tool.15

Page 16: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Asyncifier

code corpus

Analyzed 1378 open source Windows Phone apps, comprising 12M SLOC, produced by 3376 developers.

Built a static analysis tool with Microsoft’s Roslyn(C# compiler APIs: syntax, symbol, binding)

16

Page 17: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Asyncifier

developers need a refactoring tool: ASYNCIFIER

Microsoft officially no longer recommends these operations

Refactoring from callbacks to async/await is non-trivial

We built ASYNCIFIER: a refactoring tool to upgrade callback code to async/await

Developers heavily use callback-based operations

17

Page 18: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Corrector

developers need a bug fixing tool: Corrector

We built CORRECTOR: a transformation tool to find and correct the misused async/await

Batch mode to fix existing mistakes

Quick fix (VS) mode preventsuser from introducing mistakes

Developers frequently misuse async/await keywords

18

Page 19: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results

Empirical evaluation

(EQ1) Are they applicable?

Used the same code corpus from the Formative Empirical Study: 1378 WP apps, 12M SLOC

(EQ2) What is the impact on productivity?

(EQ3) What is the run-time performance?

(EQ4) Do developers find the transformations useful?

A: Yes, applied successfully on thousands of instances

A: Each refactoring changes 29 LOC, non-trivial

A: < 2sec, suitable for interactive use

19

Page 20: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results

Chose 10 most recently updated apps that have callbacks.Applied Asyncifier ourselves and offered patches.9 out of 10 apps responded and accepted 28 refactorings.“That was pretty good, look forward to the release of refactoring tool, it seems to be really useful.” Ocell app

Developers find Asyncifier & Corrector useful

Chose 20 most recently updated apps (where we found async err)

All apps accepted all our 288 instances of CORRECTORtransformations

"What you have pointed out is correct. This time, performance has been improved by 2x.” Softbuild.Data app

20

CORRECTOR ships now with official release of

Page 21: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results21

Paper conclusions

A toolkit inspired by our empirical study: (1) refactoring, (2) bug fixing tools

Evaluation: highly applicable, efficient, useful

First large-scale formative study on the usage of asynchronous programming

Parts of CORRECTOR already ship with official Visual Studio 2014

Architects of C# and F# confirmed that our findings will influence the language design

Page 22: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results22

Discussion

What is the most unexpected result from the paper?

What could have been improved?

How to make impact on the practice of SE?

What is a different workflow of using these tools?

What did the authors do right for an award paper?

New research ideas?

Page 23: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Failure - The Backdoor to Success

Establish the value of the paper, than go the extra mile

Killer Feature #1: large-scale formative study for mapping the landscape where you plan to create a solution

Killer Feature #2: large-scale empirical evaluation (e.g., 2972 applied refactorings in LambdaFicator – FSE’13)

Killer Feature #3 : show you add value in the real world (e.g., developers accepted 288 of our patches)

23

Lesson: The Killer Offer

Page 24: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results24

DiscussionNew research ideas- Braden, Deval, Dan: analyze async anti-patterns in other paradigms and languages- Malinda:

- extend the ideas to replace long-running UI operations with async code

- Language independent analysis platforms for async code- Vijay: implement detection with MLOpen questions:- Miguel: How to identify mapping from blocking to non-blocking ?- Braden: why choose C# over other platforms?

- The future of async programming?- Deval : WP7 vs WP8- Malinda: instantiate async from inside async- Vijay: what are the best practices, what about other platforms?

Page 25: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Converting Sync into Async Code via AsyncTask

25

Yu Lin, Cosmin Radoi, Danny Dig

Page 26: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

A Formative Study of AsyncTask

100 most popular Android projects from Github– 1.34M SLOC by 1139 developers

Find the commits where AsyncTask is introduced for the first time– Compare code before/after the commit

26

Page 27: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Use, Misuse, and Underuse of AsyncTask

half of apps use AsyncTask- 46% manually refactored, 54% introduced new

27

Misuse

Underuse

Performance: 4% of AsyncTask run synchronously

Correctness: 13 apps manually refactored had 77 races

251 places in 51 apps execute long-running in UI

Page 28: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Asynchronizer, our refactoring tool

Code Transformation– Extract selected code into background thread by

using AsyncTask

Safety Check– Check data races introduced by code

transformation

Empirical evaluation

28

Page 29: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

void onCreate() {ListView lv = getListView();final String query = "select …”;

lv.addFooterView(mCsr.get(0));

}

Cursor doInBackground(String… args){String query = args[0];

return mCsr;}

class ProcessRoutes extends AsyncTask{ListView lv;ProcessRoutes(ListView lv){ this.lv = lv;

}

}

void onCreate() {ListView lv = getListView();final String query = "select …”;new ProcessRoutes(lv).execute(query);

}

Code Transformation

29

void onPostExecute(Cursor mCsr) {

}

Cursor mCsr = db.rawQuery(query); Cursor mCsr = db.rawQuery(query);

lv.addFooterView(mCsr.get(0));

Cursor mCsr = db.rawQuery(query);

Page 30: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

doInBackground() {

}2 button1.setVisible(true);3 button2.setVisible(true);4 if(…) {5 button2.setVisible(false);6 return;7 }

1 Cursor mCsr = db.query(…);

8 Log.i(TAG, “log”);

2 button1.setVisible(true);3 button2.setVisible(true);4 if(…) {5 button2.setVisible(false);6 return;7 }

What is the continuation?• Naive approach

– move all statements after the selected code

Our approach considers- Control-flow, i.e., return statements are not moved- Data-flow: statements that are data dependent need to stay together30

onPostExecute(){

}

1 Cursor mCsr = db.query(…);

8 Log.i(TAG, “log”);

fork

Page 31: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Safety Check

IteRace [Radoi and Dig., ISSTA’13]– Analyzing data races in parallel loops statically– Specializations: thread-structure, summarizes at

library/application membrane, dynamic context-sensitivity

Two challenges to address event-driven model– Statically determining what instructions may execute in

parallel with doInBackground– Constructing call graph

31

Page 32: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Challenge: Construct Call Graph in the Context of Event-Driven Model

32

RouteselectActivity.<init>

RouteselectActivity.onCreate

OnClickListener.<init>

OnClickListener.onClick

AsyncTask.execute

AsyncTask.doInBackground

class RouteselectActivity extends Activity {public void onCreate() {

button.setOnClickListener(new OnClickListener(){public void onClick() { … }

}});

new AsyncTask() {void doInBackground(…){…mCsr = db.rawQuery(query);

}}.execute();

…if (mCsr.getCount() == 0) return;

}}

Synthetic Edge

Ordinary Edge

Synthetic Callgraph

Page 33: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Evaluation

RQ1: Applicability– How applicable is the code transformation?

RQ2: Accuracy– How accurate is the code transformation?

RQ3: Effort– How much effort can be potentially saved?

RQ4: Safety– Is the automated refactoring safer than manual refactoring?

RQ5: Value– Do developers accept our refactorings?

33

Page 34: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Experimental MethodologyReenact existing refactoring scenarios

– Retain all projects with at least two manual refactorings– Apply refactorings to the same code as the manual

refactorings did– Answer RQs: Applicability, Accuracy, Effort, Safety

Apply refactorings in new scenarios– Start from 19 projects where other researchers detected

potential responsiveness issues– Apply refactorings to long-running operations in UI thread,

and submit patches to the developers– Answer RQs: Value

34

Page 35: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Asynchronizer is applicable, accurate, and saves human effort

35

RQ1: Applicability- applied 135 refactorings in 19 apps. 95% pass preconditions

RQ2: Accuracy- 99% of changes are similar with the ones applied by developers

RQ3: Effort- Asynchronizer changed 2394 LOC in 62 files- on average, 31 non-trivial LOC changed, in less than 10 sec

Page 36: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Asynchronizer finds real races

36

Fixed Directly

Fixed Later

Never Fixed

False Warnings

(15 races)

(38 races)

(24 races)

(57 races)

• Races fixed in a later version– On average, 193 days elapsed to fix them

Page 37: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Asynchronizer is Valuable

37

62 refactoring patches in 7 apps

Accepted: 38 in 6 apps

Rejected: 24 in 4 apps

“Thanks for your contribution”

VLC app: “I think that most of the calls you put AsyncTask are not very costly”

Page 38: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Paper Discussion

38

New research ideas

Miguel, Braden: automated recommendation for refactoring opportunities (e.g., via profiling)

Deval, Dan: support other platforms (iOS) or other languages (JavaScript)

Dan: tools to help me learn how concurrency in Android works

Page 39: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Paper Discussion

39

Open questions?

Miguel: which code to move in the onPostExecute in order to improve UI responsiveness?

Deval: how do you define a popular OSS?

Braden: how can we better educate programmers?

Page 40: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results40

implications

LearnAsync.NET: hundreds of real-world positive and negative examples of asynchronous idioms

Developers

Page 41: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results

(EQ1) our tools are highly applicable

CORRECTOR fixed 4 main types of anti-patterns (2209 instances)

54% of 1245 callbacks passed the preconditions.ASYNCIFIER refactored 54% of callbacks.We manually verified that 10% of the instances are correct.

The reasons for un-refactored 46% of 1245 callbacks:(i) Algorithm’s preconditions(ii) Tool limitations

Our tools can be applied to any platform written in C# (not only Windows Phone)

Page 42: SOFTWARE MAINTENANCE AND EVOLUTION ---REFACTORING …web.engr.oregonstate.edu/~digd/courses/cs563_Sp19/pdfs/w3_1.pdf · Q1) How do developers use asynchronous programming? Built Asyncifier,

Results42

ASYNCIFIER changes 28.9 lines on average per refactoring!

ASYNCIFIER takes 508ms on average per refactoring

CORRECTOR takes 47ms per transformation

suitable for an interactive usage in an IDE

(EQ2) Automation is needed

(EQ3) Our tools are efficient


Recommended