{"id":1201,"date":"2010-04-27T14:54:24","date_gmt":"2010-04-27T19:54:24","guid":{"rendered":"http:\/\/mikeconley.ca\/blog\/?p=1201"},"modified":"2023-12-20T16:25:17","modified_gmt":"2023-12-20T21:25:17","slug":"my-gsoc-project-review-board-extensions","status":"publish","type":"post","link":"https:\/\/mikeconley.ca\/blog\/2010\/04\/27\/my-gsoc-project-review-board-extensions\/","title":{"rendered":"My GSoC Project:  Review Board Extensions"},"content":{"rendered":"<p>If you didn&#8217;t already know, <a href=\"http:\/\/www.reviewboard.org\">Review Board<\/a> is an open-source web-based code review tool.\u00a0 <a href=\"http:\/\/www.markusproject.org\">The MarkUs Team<\/a> has been using Review Board for <a href=\"http:\/\/mikeconley.ca\/blog\/2010\/02\/02\/pre-commit-code-review-in-markus-development\/\">pre-commit code review<\/a> for about a year now.\u00a0 This has given the team a number of advantages:<\/p>\n<ol>\n<li>For a team that usually has a 4 month turnover, this allows us to quickly get new team members up to speed with how to contribute to MarkUs.\u00a0 We review every change that they propose, and give them tips\/guidance on how to make it fit in well with the application.\u00a0 They learn, and the applications code stays healthy.<\/li>\n<li>We catch defects before they enter the code base.\u00a0 Simple as that.<\/li>\n<li>We get a good sense of what other people are working on, and what is going on in the code.\u00a0 Review Board has become a central conversation and learning hub for the developers on the MarkUs team.<\/li>\n<\/ol>\n<p>So, the long and the short of it:\u00a0 <em>I like Review Board.\u00a0 Review Board helps us write better code.\u00a0 I want to make Review Board better.<\/em><\/p>\n<p>So what am I proposing?<\/p>\n<h3>How to Avoid A Bloated Software Monster<\/h3>\n<p>You can never make some people happy.<\/p>\n<p>No matter how decent your software is, someone will eventually come up to you and say:<\/p>\n<blockquote><p>Wow!\u00a0 Your software would be perfect if only it had feature XYZ!\u00a0 Sadly, because you don&#8217;t have feature XYZ, I can&#8217;t use it.\u00a0 Please implement, k thx!<\/p><\/blockquote>\n<p>And so you either have to politely say &#8220;no&#8221;, and lose that user, or say &#8220;yes&#8221;, and add feature XYZ to the application.\u00a0 And for users out there who don&#8217;t need, or don&#8217;t care about feature XYZ, that new feature just becomes a distraction and adds no value.\u00a0 Make this happen a bunch of times, and you&#8217;ve got yourself a bloated mutha for a piece of software.<\/p>\n<p>And we don&#8217;t want a bloated piece of software.\u00a0 But we <em>do <\/em>want to make our users happy, and provide feature XYZ for them if they want it.<\/p>\n<p>So what&#8217;s the solution?\u00a0 <strong>We provide an extension framework<\/strong> (which is also sometimes called a plug-in architecture).<\/p>\n<p>An extension framework allows developers to easily expand a piece of software to do new things.\u00a0 So, if a user wants feature XYZ, we (or someone else) just creates and make available an extension that implements the feature.\u00a0 The user installs the extension, activates it, and bam &#8211; our user is happy as a clam with their new feature.<\/p>\n<p>And if we make it super-easy to develop them, third-party developers can write new, wonderful, interesting extensions to do things that&#8230;well, we wouldn&#8217;t have considered in the first place. It&#8217;s a new place for innovation.\u00a0 What&#8217;s that old clich\u00e9?<\/p>\n<blockquote><p>If you build it [the plug-in framework], they will come [the third-party developers who write awesome things]<\/p><\/blockquote>\n<p>And the developers do come.\u00a0 Just look at <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/\">Firefox add-ons<\/a> or <a href=\"http:\/\/wordpress.org\/extend\/plugins\/\">WordPress plugins<\/a>.\u00a0\u00a0Entire <em>ecosystems<\/em> of extensions, doing things that the original developers would probably have never dreamed of doing on their own.\u00a0 Hell, <em>I&#8217;ve <\/em>even written <a href=\"..\/category\/technology\/firefox-extensions\/alertcheck-firefox-extensions-technology\/\">a Firefox add-on.<\/a> And users love customizing their Firefox \/ WordPress with those extensions.\u00a0 It <em>adds value<\/em>.<\/p>\n<p>So we get wins all over the place:<\/p>\n<ul>\n<li>Our user gets their feature<\/li>\n<li>The software gets more attractive because it&#8217;s flexible and customizable<\/li>\n<li>The original software developers get to focus on the core piece of software, and let the third-party developers focus on the fringe features<\/li>\n<\/ul>\n<p>And this is where I think I can help Review Board.<\/p>\n<p>(Before I go on, if you&#8217;re interested, <a href=\"http:\/\/www.fogcreek.com\/fogbugz\/blog\/post\/the-fogbugz-plugin-architecture.aspx\">here&#8217;s another article on the how and the why of plug-in architectures<\/a>)<\/p>\n<h3>Review Board Extensions<\/h3>\n<p>So if you look at the <a href=\"http:\/\/code.google.com\/p\/reviewboard\/w\/list\">Review Board Wiki<\/a>, or glance at the <a href=\"http:\/\/www.reviewboard.org\/mailing-lists\/\">mailing lists<\/a> you see numerous requests from users for new features, for example:<\/p>\n<blockquote><p>It would be nice if the review board had a &#8220;next comment&#8221; button that is always available to click, or had a collapse\/expand button. This would make it easier to see other people&#8217;s comments in cases like this.<\/p>\n<p>&#8230;<\/p>\n<p>It will be nice to have post-commit support. Instead of every post-commit review being a separate URL, if we could setup default rules for post-commit reviews to update an existing review providing the diff-between-diff features, it would be very useful.<\/p><\/blockquote>\n<p>The Review Board developers could smell the threat of bloated feature-creep from a mile away.\u00a0 So, <a href=\"http:\/\/github.com\/chipx86\/reviewboard\/tree\/extensions\">in a separate branch<\/a>, they began working on integrating an extension framework into Review Board.<\/p>\n<p>The extension branch, however, has been gathering dust, while the developers focus on more critical patches and releases.<\/p>\n<p>My GSoC proposal is to finish off a draft of the extension framework, document it, and build a very simple extension for it.\u00a0 My simple extension will allow me to record basic statistics about Review Board reviewers &#8211; for example, how long they spend on a particular review, their inspection rate, etc.<\/p>\n<p>Having been a project lead <a href=\"http:\/\/www.markusproject.org\">MarkUs<\/a> for so long, it&#8217;s going to be a good experience to be back on &#8220;the bottom&#8221; &#8211; to be the new developer who doesn&#8217;t entirely have a sense of the application code yet.\u00a0 It&#8217;s going to be good to go code spelunking again.\u00a0 I&#8217;ve done some preliminary explorations, and it&#8217;s reminding me of my first experiences with MarkUs.\u00a0 Like <a href=\"http:\/\/www.youtube.com\/watch?v=7N7i7_ts_eg\">a submarine using its sonar<\/a>, I&#8217;m slowly getting a sense of the code terrain.<\/p>\n<p>I&#8217;ll let you know what my first few sweeps find.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you didn&#8217;t already know, Review Board is an open-source web-based code review tool.\u00a0 The MarkUs Team has been using Review Board for pre-commit code review for about a year now.\u00a0 This has given the team a number of advantages: For a team that usually has a 4 month turnover, this allows us to quickly [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[454,657,773,649],"tags":[653,345,654,131,655,638,92,550,637,1219,504,656],"class_list":["post-1201","post","type-post","status-publish","format-standard","hentry","category-code-reviews","category-extensions-review-board-code-reviews-computer-science-technology","category-gsoc-computer-science","category-review-board","tag-addons","tag-architecture","tag-bloat","tag-extensions","tag-feature-creep","tag-framework","tag-gsoc","tag-markus","tag-plugins","tag-review-board","tag-reviewboard","tag-sonar"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/prmTy-jn","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts\/1201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/comments?post=1201"}],"version-history":[{"count":19,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts\/1201\/revisions"}],"predecessor-version":[{"id":1215,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/posts\/1201\/revisions\/1215"}],"wp:attachment":[{"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/media?parent=1201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/categories?post=1201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikeconley.ca\/blog\/wp-json\/wp\/v2\/tags?post=1201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}