{"id":1456,"date":"2018-01-21T20:05:08","date_gmt":"2018-01-22T04:05:08","guid":{"rendered":"http:\/\/www.bradleycbuchanan.com\/b\/?p=1456"},"modified":"2018-01-21T20:06:35","modified_gmt":"2018-01-22T04:06:35","slug":"my-work-in-2017","status":"publish","type":"post","link":"https:\/\/www.bradleycbuchanan.com\/b\/my-work-in-2017\/","title":{"rendered":"My work in 2017"},"content":{"rendered":"<p>I just concluded another full year with all of my work <a href=\"https:\/\/github.com\/islemaster\">public on GitHub<\/a>.  2017 was my eleventh full year as a software professional, and my third year at <a href=\"https:\/\/code.org\/\">Code.org<\/a>.<\/p>\n<p><a href=\"http:\/\/www.bradleycbuchanan.com\/b\/wp-content\/uploads\/2018\/01\/2017_contributions.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.bradleycbuchanan.com\/b\/wp-content\/uploads\/2018\/01\/2017_contributions.png\" alt=\"\" width=\"736\" height=\"167\" class=\"aligncenter size-full wp-image-1495\" srcset=\"https:\/\/www.bradleycbuchanan.com\/b\/wp-content\/uploads\/2018\/01\/2017_contributions.png 736w, https:\/\/www.bradleycbuchanan.com\/b\/wp-content\/uploads\/2018\/01\/2017_contributions-300x68.png 300w\" sizes=\"auto, (max-width: 736px) 100vw, 736px\" \/><\/a><!--more--><\/p>\n<p>Unlike <a href=\"\/b\/my-work-in-2016\/\">last year&#8217;s report<\/a>, I&#8217;m using the calendar year (Jan 1-Dec 31) to pull stats for 2016 and 2017 in this report.<\/p>\n<h1>Stats<\/h1>\n<p><a href=\"https:\/\/github.com\/search?q=type:pr%20author:islemaster%20merged:2017-01-01..2017-12-31\"><b>I merged 520 pull requests this year.<\/b><\/a><br \/>\nThat&#8217;s <strong style=\"color: darkred\">down 6%<\/strong> from <a href=\"https:\/\/github.com\/search?q=type:pr%20author:islemaster%20merged:2016-01-01..2016-12-31\">554 in 2016<\/a>.<\/p>\n<p><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+user%3Acode-dot-org&#038;type=\">491 (94%) within the code-dot-org organization<\/a>:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2Fcode-dot-org&#038;type=\">455 on code-dot-org\/code-dot-org<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2Fbrowser&#038;type=\">15 on code-dot-org\/browser<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2Fjohnny-five&#038;type=\">7 on code-dot-org\/johnny-five<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2Fcirclarify&#038;type=\">5 on code-dot-org\/circlarify<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2Fp5.play&#038;type=\">3 on code-dot-org\/p5.play<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2Fplayground-io&#038;type=\">3 on code-dot-org\/playground-io<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2Fbramble&#038;type=\">2 on code-dot-org\/bramble<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Acode-dot-org%2FJS-Interpreter&#038;type=\">1 on code-dot-org\/JS-Interpreter<\/a> (but probably <a href=\"https:\/\/github.com\/code-dot-org\/code-dot-org\/pull\/19012\">the most-viewed<\/a>)<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+-user%3Acode-dot-org&#038;type=\">29 (6%) elsewhere<\/a>:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Amolleindustria%2Fp5.play&#038;type=Issues\">16 on molleindustria\/p5.play<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Arwaldron%2Fjohnny-five&#038;type=Issues\">5 on rwaldron\/johnny-five<\/a>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Arwaldron%2Fplayground-io&#038;type=Issues\">3 on rwaldron\/playground-io<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Aislemaster%2Fconnectmydots&#038;type=Issues\">2 on islemaster\/connectmydots<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Agodotengine%2Fgodot-docs&#038;type=Issues\">1 on godotengine\/godot-docs<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Aislemaster%2Fhitotoki&#038;type=Issues\">1 on islemaster\/hitotoki<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+author%3Aislemaster+merged%3A2017-01-01..2017-12-31+repo%3Ahejiann%2Fbeautify&#038;type=Issues\">1 on hejiann\/beautify<\/a><\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/code-dot-org\/code-dot-org\/graphs\/contributors?from=2017-01-01&#038;to=2017-12-31&#038;type=c\"><b>I made 1,544 commits on code-dot-org\/code-dot-org.<\/b><\/a><br \/>\nI again ranked #1 by commit count to that repository. That&#8217;s <strong style=\"color: darkred\">down 3%<\/strong> from <a href=\"https:\/\/github.com\/code-dot-org\/code-dot-org\/graphs\/contributors?from=2016-01-01&#038;to=2016-12-31&#038;type=c\">1598 last year<\/a>.<\/p>\n<p><b>I averaged 2.97 commits per pull request.<\/b><br \/>\nThat&#8217;s <strong style=\"color: darkred\">up 3%<\/strong> from 2.88 in 2016.<\/p>\n<p><a href=\"https:\/\/github.com\/code-dot-org\/code-dot-org\/graphs\/contributors?from=2017-01-01&#038;to=2017-12-31&#038;type=a\"><b>I changed +57,215 \/ -43,451 lines on code-dot-org\/code-dot-org.<\/b><\/a><br \/>\nThat&#8217;s <strong style=\"color: darkred\">down a lot<\/strong> from <a href=\"https:\/\/github.com\/code-dot-org\/code-dot-org\/graphs\/contributors?from=2016-01-01&#038;to=2016-12-31&#038;type=a\">+130,647 \/ -139,705 last year<\/a>, and I also added more code than I removed &#8211; not necessarily a good sign.<\/p>\n<p><a href=\"https:\/\/github.com\/search?utf8=%E2%9C%93&#038;q=type%3Apr+reviewed-by%3Aislemaster+-author%3Aislemaster+created%3A2017-01-01..2017-12-31&#038;type=Issues\"><b>I reviewed 719 pull requests<\/b><\/a> by other people. I estimated 605 code reviews last year, so I&#8217;m <strong style=\"color: darkgreen\">up about 19%<\/strong>. (The comparison to last year is imprecise because <a href=\"https:\/\/github.com\/blog\/2291-introducing-review-requests\">GitHub reviews launched in December 2016<\/a>.)  Since I used all of my vacation this year, I averaged about 3.1 reviews per day, <strong style=\"color: darkgreen\">a moderate increase<\/strong> from 2.5 in 2016.<\/p>\n<h1>Features<\/h1>\n<p>Here&#8217;s a more qualitative look at my work this year.<\/p>\n<h2>Maker Toolkit<\/h2>\n<p>My main responsibility this year was Maker Toolkit, an extension to App Lab allowing students to use the <a href=\"https:\/\/code.org\/circuitplayground\">Adafruit Circuit Playground<\/a> board in the Physical Computing unit of our <a href=\"https:\/\/code.org\/educate\/csd\">CS Discoveries middle school course<\/a>.  About 20% of my pull requests were work on this feature.<\/p>\n<p><b>We built two ways to connect to the board:<\/b>  A <a href=\"https:\/\/github.com\/code-dot-org\/chrome-serial-app\">Chrome App<\/a> for use on Chromebooks, and an <a href=\"https:\/\/github.com\/code-dot-org\/browser\">Electron App<\/a> for use on other platforms.<\/p>\n<p><b>We built a student-friendly Circuit Playground API<\/b> on top of Rick Waldron&#8217;s <a href=\"https:\/\/github.com\/code-dot-org\/johnny-five\">Johnny-Five<\/a> and <a href=\"https:\/\/github.com\/code-dot-org\/playground-io\">Playground-IO<\/a> libraries.<\/p>\n<h2>Teacher Dashboard and Accounts<\/h2>\n<p>About 10% of my PRs this year were collaborative work on improved Teacher Dashboard features and Accounts\/Login features.<\/p>\n<h2>Internet Simulator<\/h2>\n<p>Internet Simulator had record traffic this year.  As the tech owner of this project, I did maintenance work and scaling preparations, including work to scale our Redis datastore horizontally. This only accounted for about 3% of my PRs this year.  I&#8217;m pleased that this project has been easy to maintain.  Ownership of this project is passing to another engineer for 2018.<\/p>\n<h2>App Lab, Game Lab, Web Lab<\/h2>\n<p>Together, about 10% of my PRs this year were support work on our other middle\/high school tools.<\/p>\n<h2>Tests, Tooling, and Technical Debt<\/h2>\n<p>About 35% of my PRs this year were dedicated to improvements to our tests, tools for the development team, updating dependencies, and general code hygiene.  In fact, I <a href=\"https:\/\/alldaydevops2017.sched.com\/event\/C0GO\/twelve-months-of-test-metrics-at-codeorg-with-brad-buchananpa-hrefhttpswwwyoutubecomwatchvcup8b8yq-k4-targetblankclick-to-view-the-recorded-sessionap\">gave a talk on our test improvements<\/a> to about 300 people at AllDayDevOps 2017.<\/p>\n<h2>Operations<\/h2>\n<p>About 22% of my pull requests this year were related to daily operations: Deployment pipeline merges, dev-of-the-day responsibilities, hotfixes, bugfixes outside my regular responsibilities.  This category should shrink significantly next year, because our pipeline merges are now automated!<\/p>\n<h1>New responsibilities<\/h1>\n<p>In October I was asked to become a manager.  I&#8217;m now supervising four very talented engineers.  I still spend the majority of my time as a developer.  This was a very affirming change, and lines up with my changing role on the team over the last couple of years: Trusted with more code reviews, mentoring other engineers, and spending at least a third of my time on work affecting the whole team, like technical debt and test improvements.<\/p>\n<h1>Strengths and Goals<\/h1>\n<p>Reading through the strengths I called out last year, they still feel about right.  I wasn&#8217;t successful at tackling all of my goals though:<\/p>\n<p><b>Measuring my defect rate.<\/b> I didn&#8217;t do this.  Maybe I&#8217;ll try this again, but I&#8217;m starting to think there are better things to measure &#8211; and this may be a better team metric than individual metric anyway.<\/p>\n<p><b>More consistent test coverage.<\/b> I definitely improved in this area.  I got very consistent about adding test coverage as I worked, especially in older code that I was updating.<\/p>\n<p><b>I need a new book.<\/b> I ended up picking up some leadership books in response to the new role, and I&#8217;m currently reading <i>Clean Architecture<\/i> by Robert Martin.  I expect to continue this habit into 2018.<\/p>\n<p><b>Find a new multiplier on the team.<\/b> Our team now has several engineering initiatives going that improve our processes and tools.  This has also become more of a team goal than a personal one, but I feel like I contributed to it quite a bit and I&#8217;m in a good position to do more of this.<\/p>\n<p>New goals:<\/p>\n<p><b>Learn to delegate.<\/b> This is an important skill as I learn my new role. It&#8217;s not just about assigning work, but making sure I&#8217;m not a single point of failure for anything. I&#8217;m starting by passing ownership of Internet Simulator to another engineer.<\/p>\n<p><b>Empower my reports.<\/b> I want to help the people I&#8217;m supervising find meaningful work, opportunities for growth, and influence on the team.<\/p>\n<p><b>Experiment with our process.<\/b> Like a lot of small teams, we use a loose version of agile as far as it works for us.  This year, I&#8217;d like to help the team try out some adjustments to that process and find improvements that stick.<\/p>\n<h1>Side projects<\/h1>\n<p>Finally, I&#8217;ve wanted to do more side projects for a while.  This year I had three!  And I feel pretty good about them.<\/p>\n<p><a href=\"https:\/\/connectmydots.net\/\"><b>Connect My Dots<\/b><\/a> is a network visualization tool co-developed with my wife as part of her graduate work.  We made some improvements this year, for use in networking workshops she&#8217;s been teaching.<\/p>\n<p><a href=\"https:\/\/goodenoughgolfers.com\/\"><b>Good-Enough Golfers<\/b><\/a> is a near-solver for the &#8220;Social Golfer Problem,&#8221; useful for anyone who needs to generate a rotating seating arrangement.<\/p>\n<p><a href=\"https:\/\/islemaster.itch.io\/wildflower-child\"><b>Wildflower Child<\/b><\/a> is an interactive toy, and my submission to the GitHub Game Off 2017 game jam.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I just concluded another full year with all of my work public on GitHub. 2017 was my eleventh full year as a software professional, and my third year at Code.org.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[418,8],"tags":[429,432,430,431],"class_list":["post-1456","post","type-post","status-publish","format-standard","hentry","category-blog","category-programmer","tag-code-org","tag-open-source","tag-retrospective","tag-workmetrics"],"_links":{"self":[{"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/posts\/1456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/comments?post=1456"}],"version-history":[{"count":37,"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/posts\/1456\/revisions"}],"predecessor-version":[{"id":1499,"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/posts\/1456\/revisions\/1499"}],"wp:attachment":[{"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/media?parent=1456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/categories?post=1456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bradleycbuchanan.com\/b\/wp-json\/wp\/v2\/tags?post=1456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}