  Code review is a key element of quality assurance in software development.
Determining the right reviewer for a given code change requires understanding
the characteristics of the changed code, identifying the skills of each
potential reviewer (expertise profile), and finding a good match between the
two. To facilitate this task, we design a code reviewer recommender that
operates on the knowledge units (KUs) of a programming language. We define a KU
as a cohesive set of key capabilities that are offered by one or more building
blocks of a given programming language. We operationalize our KUs using
certification exams for the Java programming language. We detect KUs from 10
actively maintained Java projects from GitHub, spanning 290K commits and 65K
pull requests (PRs). Next, we generate developer expertise profiles based on
the detected KUs. Finally, these KU-based expertise profiles are used to build
a code reviewer recommender (KUREC). In RQ1, we observe that KUREC performs as
well as the top-performing baseline recommender (RF). From a practical
standpoint, we highlight that KUREC's performance is more stable (lower
interquartile range) than that of RF, thus making it more consistent and
potentially more trustworthy. Next, in RQ2 we design three new recommenders by
combining KUREC with our baseline recommenders. These new combined recommenders
outperform both KUREC and the individual baselines. Finally, in RQ3 we evaluate
how reasonable the recommendations from KUREC and the combined recommenders are
when those deviate from the ground truth. Taking together the results from all
RQs, we conclude that KUREC and one of the combined recommenders (AD_FREQ) are
overall superior to the baseline recommenders that we studied. Future work in
the area should thus (i) consider KU-based recommenders as baselines and (ii)
experiment with combined recommenders.
