SlideShare ist ein Scribd-Unternehmen logo
1 von 130
Downloaden Sie, um offline zu lesen
Modern Code Reviews in Open-Source Projects:
Which Problems Do They Fix?
Moritz Beller
Delft University of Technology
@Inventitech
Andy Zaidman, Georgios Gousios, Alberto Bacchelli,
Elmar Jürgens, Radjino Bohlanath, Shane McIntosh
Modern Code Review Workflow
Modern Code Review Workflow
Old
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
Modern Code Review Workflow
+
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDogUiThread = new
StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDogUiThread = new
StartupUIThread();
Review-triggered Change
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDogUiThread = new
StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
private Runnable watchDogUiThread = new
StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
private Runnable watchDogUiThread = new
StartupUIThread();
Self-motivated + Review-triggered Change
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
private Runnable watchDogUiThread = new
StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/**
* The ui thread for WatchDog registration. From
* this thread, the WatchDog program is started.
*/
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/**
* The ui thread for WatchDog registration. From
* this thread, the WatchDog program is started.
*/
public Runnable watchDog = new StartupUIThread();
Self-motivated Change
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/**
* The ui thread for WatchDog registration. From
* this thread, the WatchDog program is started.
*/
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
No Change
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
No Change
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
No Change
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
// TODO (GG) Provide a more descriptive name
public Runnable watchDog = new StartupUIThread();
/** The ui thread for WatchDog registration. */
public Runnable watchDog = new StartupUIThread();
Does it matter?
>1,400 changes
>245 tasks
Motivation for Change
Motivation for Change
78-90%
Motivation for Change
78-90%
Motivation for Change
22-10%
78-90%
Motivation for Change
22-10%
Motivation for No Change
Motivation for No Change
Motivation for No Change
7-35%
Motivation for No Change
7-35%
Type of Change
Doc
Visual
Structure
Resource
Check
Interface
Logic
Larger
Support
ConQAT
Gromacs
10% 20% 30% 40%
75
Doc
Visual
Structure
Resource
Check
Interface
Logic
Larger
Support
ConQAT
Gromacs
10% 20% 30% 40%
75
:
Doc
Visual
Structure
Resource
Check
Interface
Logic
Larger
Support
ConQAT
Gromacs
10% 20% 30% 40%
75
:
25
Doc
Visual
Structure
Resource
Check
Interface
Logic
Larger
Support
ConQAT
Gromacs
10% 20% 30% 40%
75 : 25
What Influences Code Review?
What Influences Code Review?
What Influences Code Review?
What Influences Code Review?
> 2,800 changes
> 970 tasks
What Influences Code Review?
> 2,800 changes
> 970 tasks
What Influences Code Review?
> 2,800 changes
> 970 tasks
What Influences Code Review?
> 2,800 changes
> 970 tasks
What Influences Code Review?
> 2,800 changes
> 970 tasks
What Influences Code Review?
> 2,800 changes
> 970 tasks
What Influences Code Review?
> 2,800 changes
> 970 tasks
What Influences Code Review?
> 2,800 changes
> 970 tasks
“Continuous” Integration Then (2014)
+
“Continuous” Integration Then (2014)
+
“Continuous” Integration Then (2014)
+
“Continuous” Integration Then (2014)
+
Continuous Integration Now (2017)
Continuous Integration Now (2017)
CI Services
Continuous Integration Now (2017)
a) Static Analysis
CI Services
Continuous Integration Now (2017)
a) Static Analysis
b) Dynamic Analysis
CI Services
Continuous Integration Now (2017)
+
a) Static Analysis
b) Dynamic Analysis
CI Services
a) How Prevalent Is Static Analysis?
122
a) How Prevalent Is Static Analysis?
122
a) How Prevalent Is Static Analysis?
122
a) How Prevalent Is Static Analysis?
122
122
a) How Prevalent Is Static Analysis?
122
122
a) How Prevalent Is Static Analysis?
122
36
122
a) How Prevalent Is Static Analysis?
122
36
122
a) How Prevalent Is Static Analysis?
122
36
122
a) How Prevalent Is Static Analysis?
a) How Prevalent Is Static Analysis?
Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT
122 59% 23% -
36 77% 36% 36%
a) How Prevalent Is Static Analysis?
Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT
122 59% 23% -
36 77% 36% 36%
a) How Prevalent Is Static Analysis?
Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT
122 59% 23% -
36 77% 36% 36%
a) How Prevalent Is Static Analysis?
Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT
122 59% 23% -
36 77% 36% 36%
a) How Prevalent Is Static Analysis?
Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT
122 59% 23% -
36 77% 36% 36%
a) How Prevalent Is Static Analysis?
Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT
122 59% 23% -
36 77% 36% 36%
Moritz Beller, Radjino Bholanath, Shane McIntosh, Andy Zaidman:
Analyzing the State of Static Analysis: A Large-Scale Evaluation in Open Source
Software, SANER, Osaka (Japan), 2016
a) How Prevalent Is Static Analysis?
TODO: Add background with
Sun
b) How Prevalent Is Dynamic Analysis?
TODO: Add background with
Sun
CI is the best practice in which
developers not only integrate their
work into a shared mainline
frequently, but also verify the quality
continuously through testing.
b) How Prevalent Is Dynamic Analysis?
TODO: Add background with
Sun
CI is the best practice in which
developers not only integrate their
work into a shared mainline
frequently, but also verify the quality
continuously through testing.
It is known.
b) How Prevalent Is Dynamic Analysis?
<TL;DR>...</TL;DR>
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
●
Parsing Log files for Java: Maven, Gradle, Ant
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
●
Parsing Log files for Java: Maven, Gradle, Ant
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
●
Parsing Log files for Java: Maven, Gradle, Ant
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
●
Parsing Log files for Java: Maven, Gradle, Ant
●
Parsing Log files for Ruby: bundler and rake
<TL;DR>...</TL;DR>
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running nl.tudelft.watchdog.ClientVersionCheckerTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time
elapsed: 0.04 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
<TL;DR>...</TL;DR>
●
Parsing Log files for Java: Maven, Gradle, Ant
●
Parsing Log files for Ruby: bundler and rake
b) How Prevalent Is Dynamic Analysis?
●
69% of Java and 87.5% of the Ruby projects:
test runs
b) How Prevalent Is Dynamic Analysis?
●
69% of Java and 87.5% of the Ruby projects:
test runs
●
Overall, 81% of the projects:
test runs
b) How Prevalent Is Dynamic Analysis?
●
69% of Java and 87.5% of the Ruby projects:
test runs
●
Overall, 81% of the projects:
test runs
●
96% of builds:
test runs
b) How Prevalent Is Dynamic Analysis?
b) How Prevalent Is Dynamic Analysis?
b) How Prevalent Is Dynamic Analysis?
b) How Prevalent Is Dynamic Analysis?
Testing is the single most important
reason for broken builds, more
prevalent than compile errors, missing
dependencies, build cancellations and
provisioning problems together.
b) Testing Is Central To CI
Testing is the single most important
reason for broken builds, more
prevalent than compile errors, missing
dependencies, build cancellations and
provisioning problems together.
b) Testing Is Central To CI
Moritz Beller, Georgios Gousios, Andy Zaidman:
Oops, My Tests Broke the Build: An Explorative Analysis of Travis CI with GitHub,
MSR, Buenos Aires (Argentina), 2017
What Is TravisTorrent?
What Is TravisTorrent?
MSR Mining
Challenge 2017
Public Data Set
What Is TravisTorrent?
Free* SQL-like cloud query
interface on Google BQ
MSR Mining
Challenge 2017
Public Data Set
What Is TravisTorrent?
.testroots.org
Free* SQL-like cloud query
interface on Google BQ
MSR Mining
Challenge 2017
Public Data Set
TODO: Add background with
Sun
Research on Continuous Code Review
Enabled By TravisTorrent
TODO: Add background with
Sun
- git_branch
- git_all_built_commits
- ...
Research on Continuous Code Review
Enabled By TravisTorrent
TODO: Add background with
Sun
- git_branch
- git_all_built_commits
- ...
- gh_project_name
- gh_is_pr
- gh_team_size
- gh_diff_tests_added
- gh_first_commit_...
Research on Continuous Code Review
Enabled By TravisTorrent
TODO: Add background with
Sun
- git_branch
- git_all_built_commits
- ...
- gh_project_name
- gh_is_pr
- gh_team_size
- gh_diff_tests_added
- gh_first_commit_...
- tr_prev_build
- tr_status
- tr_log_tests_ran
- tr_log_tests_failed
- ...
Research on Continuous Code Review
Enabled By TravisTorrent
TODO: Add background with
Sun
- git_branch
- git_all_built_commits
- ...
- gh_project_name
- gh_is_pr
- gh_team_size
- gh_diff_tests_added
- gh_first_commit_...
- tr_prev_build
- tr_status
- tr_log_tests_ran
- tr_log_tests_failed
- ...
62columns
Research on Continuous Code Review
Enabled By TravisTorrent
TODO: Add background with
Sun
- git_branch
- git_all_built_commits
- ...
- gh_project_name
- gh_is_pr
- gh_team_size
- gh_diff_tests_added
- gh_first_commit_...
- tr_prev_build
- tr_status
- tr_log_tests_ran
- tr_log_tests_failed
- ...
62columns
Research on Continuous Code Review
Enabled By TravisTorrent
TODO: Add background with
Sun
- git_branch
- git_all_built_commits
- ...
- gh_project_name
- gh_is_pr
- gh_team_size
- gh_diff_tests_added
- gh_first_commit_...
- tr_prev_build
- tr_status
- tr_log_tests_ran
- tr_log_tests_failed
- ...
62columns
Research on Continuous Code Review
Enabled By TravisTorrent
@Inventitech
Moritz Beller, TU Delft
Modern Code Reviews in Open-Source Projects:
Which Problems Do They Fix?
@Inventitech
Moritz Beller, TU Delft
Modern Code Reviews in Open-Source Projects:
Which Problems Do They Fix?
@Inventitech
Moritz Beller, TU Delft
Modern Code Reviews in Open-Source Projects:
Which Problems Do They Fix?
@Inventitech
Moritz Beller, TU Delft
Modern Code Reviews in Open-Source Projects:
Which Problems Do They Fix?

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (7)

CDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptor
 
Roboguice
RoboguiceRoboguice
Roboguice
 
Android Unit Testing With Robolectric
Android Unit Testing With RobolectricAndroid Unit Testing With Robolectric
Android Unit Testing With Robolectric
 
Refactor to Reactive With Spring 5 and Project Reactor
Refactor to Reactive With Spring 5 and Project ReactorRefactor to Reactive With Spring 5 and Project Reactor
Refactor to Reactive With Spring 5 and Project Reactor
 
Mobile Programming - Network Universitas Budi Luhur
Mobile Programming - Network Universitas Budi LuhurMobile Programming - Network Universitas Budi Luhur
Mobile Programming - Network Universitas Budi Luhur
 
Trying to build an Open Source browser in 2020
Trying to build an Open Source browser in 2020Trying to build an Open Source browser in 2020
Trying to build an Open Source browser in 2020
 
Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)Android Code Puzzles (DroidCon Amsterdam 2012)
Android Code Puzzles (DroidCon Amsterdam 2012)
 

Ähnlich wie Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix?

Keep your Wicket application in production
Keep your Wicket application in productionKeep your Wicket application in production
Keep your Wicket application in production
Martijn Dashorst
 
Commenting in Agile Development
Commenting in Agile DevelopmentCommenting in Agile Development
Commenting in Agile Development
Jan Rybák Benetka
 

Ähnlich wie Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix? (20)

Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15
 
The Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da AppleThe Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da Apple
 
Advanced n service bus deployment - NSBConnyc 2014 by Kijana Woodard
Advanced n service bus deployment - NSBConnyc 2014 by Kijana WoodardAdvanced n service bus deployment - NSBConnyc 2014 by Kijana Woodard
Advanced n service bus deployment - NSBConnyc 2014 by Kijana Woodard
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
Não reinvente a roda! Desenvolvendo com bibliotecas Android
Não reinvente a roda! Desenvolvendo com bibliotecas AndroidNão reinvente a roda! Desenvolvendo com bibliotecas Android
Não reinvente a roda! Desenvolvendo com bibliotecas Android
 
Annotation processing tool
Annotation processing toolAnnotation processing tool
Annotation processing tool
 
Google analytics
Google analyticsGoogle analytics
Google analytics
 
Context and Dependency Injection
Context and Dependency InjectionContext and Dependency Injection
Context and Dependency Injection
 
Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and Friends
 
Keep your Wicket application in production
Keep your Wicket application in productionKeep your Wicket application in production
Keep your Wicket application in production
 
Eddystone beacons demo
Eddystone beacons demoEddystone beacons demo
Eddystone beacons demo
 
Introduction to Git Version Control System
Introduction to Git Version Control SystemIntroduction to Git Version Control System
Introduction to Git Version Control System
 
VRaptor 4 - JavaOne
VRaptor 4 - JavaOneVRaptor 4 - JavaOne
VRaptor 4 - JavaOne
 
GIT training - advanced for software projects
GIT training - advanced for software projectsGIT training - advanced for software projects
GIT training - advanced for software projects
 
First Bucharest GTUG event 02 Mar 2010
First Bucharest GTUG event 02 Mar 2010First Bucharest GTUG event 02 Mar 2010
First Bucharest GTUG event 02 Mar 2010
 
The Ring programming language version 1.9 book - Part 81 of 210
The Ring programming language version 1.9 book - Part 81 of 210The Ring programming language version 1.9 book - Part 81 of 210
The Ring programming language version 1.9 book - Part 81 of 210
 
A Cocktail of Guice and Seam, the missing ingredients for Java EE 6
A Cocktail of Guice and Seam, the missing ingredients for Java EE 6A Cocktail of Guice and Seam, the missing ingredients for Java EE 6
A Cocktail of Guice and Seam, the missing ingredients for Java EE 6
 
Commenting in Agile Development
Commenting in Agile DevelopmentCommenting in Agile Development
Commenting in Agile Development
 
Android dev toolbox
Android dev toolboxAndroid dev toolbox
Android dev toolbox
 
FrenchKit 2017: Server(less) Swift
FrenchKit 2017: Server(less) SwiftFrenchKit 2017: Server(less) Swift
FrenchKit 2017: Server(less) Swift
 

Kürzlich hochgeladen

%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 

Kürzlich hochgeladen (20)

What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 

Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix?

  • 1. Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix? Moritz Beller Delft University of Technology @Inventitech Andy Zaidman, Georgios Gousios, Alberto Bacchelli, Elmar Jürgens, Radjino Bohlanath, Shane McIntosh
  • 3. Modern Code Review Workflow Old
  • 10. Modern Code Review Workflow
  • 11. Modern Code Review Workflow
  • 12. Modern Code Review Workflow
  • 13. Modern Code Review Workflow
  • 14. Modern Code Review Workflow +
  • 15.
  • 16. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread();
  • 17. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 18. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 19. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ public Runnable watchDogUiThread = new StartupUIThread();
  • 20. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ public Runnable watchDogUiThread = new StartupUIThread();
  • 21. Review-triggered Change /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ public Runnable watchDogUiThread = new StartupUIThread();
  • 22. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 23. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 24. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ private Runnable watchDogUiThread = new StartupUIThread();
  • 25. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ private Runnable watchDogUiThread = new StartupUIThread();
  • 26. Self-motivated + Review-triggered Change /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ private Runnable watchDogUiThread = new StartupUIThread();
  • 27. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 28. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 29. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** * The ui thread for WatchDog registration. From * this thread, the WatchDog program is started. */ public Runnable watchDog = new StartupUIThread();
  • 30. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** * The ui thread for WatchDog registration. From * this thread, the WatchDog program is started. */ public Runnable watchDog = new StartupUIThread();
  • 31. Self-motivated Change /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** * The ui thread for WatchDog registration. From * this thread, the WatchDog program is started. */ public Runnable watchDog = new StartupUIThread();
  • 32. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 33. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread();
  • 34. /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread();
  • 35. No Change /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread();
  • 36. No Change /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread();
  • 37. No Change /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ // TODO (GG) Provide a more descriptive name public Runnable watchDog = new StartupUIThread(); /** The ui thread for WatchDog registration. */ public Runnable watchDog = new StartupUIThread();
  • 47. Motivation for No Change 7-35%
  • 48. Motivation for No Change 7-35%
  • 54.
  • 59. What Influences Code Review? > 2,800 changes > 970 tasks
  • 60. What Influences Code Review? > 2,800 changes > 970 tasks
  • 61. What Influences Code Review? > 2,800 changes > 970 tasks
  • 62. What Influences Code Review? > 2,800 changes > 970 tasks
  • 63. What Influences Code Review? > 2,800 changes > 970 tasks
  • 64. What Influences Code Review? > 2,800 changes > 970 tasks
  • 65. What Influences Code Review? > 2,800 changes > 970 tasks
  • 66. What Influences Code Review? > 2,800 changes > 970 tasks
  • 72. Continuous Integration Now (2017) CI Services
  • 73. Continuous Integration Now (2017) a) Static Analysis CI Services
  • 74. Continuous Integration Now (2017) a) Static Analysis b) Dynamic Analysis CI Services
  • 75. Continuous Integration Now (2017) + a) Static Analysis b) Dynamic Analysis CI Services
  • 76. a) How Prevalent Is Static Analysis?
  • 77. 122 a) How Prevalent Is Static Analysis?
  • 78. 122 a) How Prevalent Is Static Analysis?
  • 79. 122 a) How Prevalent Is Static Analysis?
  • 80. 122 122 a) How Prevalent Is Static Analysis?
  • 81. 122 122 a) How Prevalent Is Static Analysis?
  • 82. 122 36 122 a) How Prevalent Is Static Analysis?
  • 83. 122 36 122 a) How Prevalent Is Static Analysis?
  • 84. 122 36 122 a) How Prevalent Is Static Analysis?
  • 85. a) How Prevalent Is Static Analysis?
  • 86. Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT 122 59% 23% - 36 77% 36% 36% a) How Prevalent Is Static Analysis?
  • 87. Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT 122 59% 23% - 36 77% 36% 36% a) How Prevalent Is Static Analysis?
  • 88. Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT 122 59% 23% - 36 77% 36% 36% a) How Prevalent Is Static Analysis?
  • 89. Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT 122 59% 23% - 36 77% 36% 36% a) How Prevalent Is Static Analysis?
  • 90. Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT 122 59% 23% - 36 77% 36% 36% a) How Prevalent Is Static Analysis?
  • 91. Source Amount of Projects Using ASATs Using >1 ASAT Enforcing ASAT 122 59% 23% - 36 77% 36% 36% Moritz Beller, Radjino Bholanath, Shane McIntosh, Andy Zaidman: Analyzing the State of Static Analysis: A Large-Scale Evaluation in Open Source Software, SANER, Osaka (Japan), 2016 a) How Prevalent Is Static Analysis?
  • 92. TODO: Add background with Sun b) How Prevalent Is Dynamic Analysis?
  • 93. TODO: Add background with Sun CI is the best practice in which developers not only integrate their work into a shared mainline frequently, but also verify the quality continuously through testing. b) How Prevalent Is Dynamic Analysis?
  • 94. TODO: Add background with Sun CI is the best practice in which developers not only integrate their work into a shared mainline frequently, but also verify the quality continuously through testing. It is known. b) How Prevalent Is Dynamic Analysis?
  • 95.
  • 97. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
  • 98. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR>
  • 99. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR>
  • 100. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR>
  • 101. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR>
  • 102. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR> ● Parsing Log files for Java: Maven, Gradle, Ant
  • 103. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR> ● Parsing Log files for Java: Maven, Gradle, Ant
  • 104. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR> ● Parsing Log files for Java: Maven, Gradle, Ant
  • 105. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR> ● Parsing Log files for Java: Maven, Gradle, Ant ● Parsing Log files for Ruby: bundler and rake
  • 106. <TL;DR>...</TL;DR> ------------------------------------------------------- T E S T S ------------------------------------------------------- Running nl.tudelft.watchdog.ClientVersionCheckerTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.04 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 <TL;DR>...</TL;DR> ● Parsing Log files for Java: Maven, Gradle, Ant ● Parsing Log files for Ruby: bundler and rake
  • 107. b) How Prevalent Is Dynamic Analysis?
  • 108. ● 69% of Java and 87.5% of the Ruby projects: test runs b) How Prevalent Is Dynamic Analysis?
  • 109. ● 69% of Java and 87.5% of the Ruby projects: test runs ● Overall, 81% of the projects: test runs b) How Prevalent Is Dynamic Analysis?
  • 110. ● 69% of Java and 87.5% of the Ruby projects: test runs ● Overall, 81% of the projects: test runs ● 96% of builds: test runs b) How Prevalent Is Dynamic Analysis?
  • 111. b) How Prevalent Is Dynamic Analysis?
  • 112. b) How Prevalent Is Dynamic Analysis?
  • 113. b) How Prevalent Is Dynamic Analysis?
  • 114. Testing is the single most important reason for broken builds, more prevalent than compile errors, missing dependencies, build cancellations and provisioning problems together. b) Testing Is Central To CI
  • 115. Testing is the single most important reason for broken builds, more prevalent than compile errors, missing dependencies, build cancellations and provisioning problems together. b) Testing Is Central To CI Moritz Beller, Georgios Gousios, Andy Zaidman: Oops, My Tests Broke the Build: An Explorative Analysis of Travis CI with GitHub, MSR, Buenos Aires (Argentina), 2017
  • 117. What Is TravisTorrent? MSR Mining Challenge 2017 Public Data Set
  • 118. What Is TravisTorrent? Free* SQL-like cloud query interface on Google BQ MSR Mining Challenge 2017 Public Data Set
  • 119. What Is TravisTorrent? .testroots.org Free* SQL-like cloud query interface on Google BQ MSR Mining Challenge 2017 Public Data Set
  • 120. TODO: Add background with Sun Research on Continuous Code Review Enabled By TravisTorrent
  • 121. TODO: Add background with Sun - git_branch - git_all_built_commits - ... Research on Continuous Code Review Enabled By TravisTorrent
  • 122. TODO: Add background with Sun - git_branch - git_all_built_commits - ... - gh_project_name - gh_is_pr - gh_team_size - gh_diff_tests_added - gh_first_commit_... Research on Continuous Code Review Enabled By TravisTorrent
  • 123. TODO: Add background with Sun - git_branch - git_all_built_commits - ... - gh_project_name - gh_is_pr - gh_team_size - gh_diff_tests_added - gh_first_commit_... - tr_prev_build - tr_status - tr_log_tests_ran - tr_log_tests_failed - ... Research on Continuous Code Review Enabled By TravisTorrent
  • 124. TODO: Add background with Sun - git_branch - git_all_built_commits - ... - gh_project_name - gh_is_pr - gh_team_size - gh_diff_tests_added - gh_first_commit_... - tr_prev_build - tr_status - tr_log_tests_ran - tr_log_tests_failed - ... 62columns Research on Continuous Code Review Enabled By TravisTorrent
  • 125. TODO: Add background with Sun - git_branch - git_all_built_commits - ... - gh_project_name - gh_is_pr - gh_team_size - gh_diff_tests_added - gh_first_commit_... - tr_prev_build - tr_status - tr_log_tests_ran - tr_log_tests_failed - ... 62columns Research on Continuous Code Review Enabled By TravisTorrent
  • 126. TODO: Add background with Sun - git_branch - git_all_built_commits - ... - gh_project_name - gh_is_pr - gh_team_size - gh_diff_tests_added - gh_first_commit_... - tr_prev_build - tr_status - tr_log_tests_ran - tr_log_tests_failed - ... 62columns Research on Continuous Code Review Enabled By TravisTorrent
  • 127. @Inventitech Moritz Beller, TU Delft Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix?
  • 128. @Inventitech Moritz Beller, TU Delft Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix?
  • 129. @Inventitech Moritz Beller, TU Delft Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix?
  • 130. @Inventitech Moritz Beller, TU Delft Modern Code Reviews in Open-Source Projects: Which Problems Do They Fix?