<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
  <title>open source on Jon Calder</title>
  <link>https://www.joncalder.co.za/tags/open-source/</link>
  <description>Recent content in open source on Jon Calder</description>
  <generator>Hugo -- gohugo.io</generator>
<lastBuildDate>Mon, 04 Dec 2017 00:00:00 +0000</lastBuildDate>

<atom:link href="https://www.joncalder.co.za/tags/open-source/index.xml" rel="self" type="application/rss+xml" />


<item>
  <title>Naming things is hard</title>
  <link>https://www.joncalder.co.za/2017-12-04-naming-things-is-hard/</link>
  <pubDate>Mon, 04 Dec 2017 00:00:00 +0000</pubDate>
  
<guid>https://www.joncalder.co.za/2017-12-04-naming-things-is-hard/</guid>
  <description>&lt;blockquote&gt;
&lt;p&gt;‘There are only two hard things in Computer Science: cache invalidation and naming things.’&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The above quip by Phil Karlton is fairly well known and often quoted, sometimes with amusing extensions:&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;en&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.&lt;/p&gt;&amp;mdash; Jeff Atwood (@codinghorror) &lt;a href=&#34;https://twitter.com/codinghorror/status/506010907021828096?ref_src=twsrc%5Etfw&#34;&gt;August 31, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;en&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;There are only 2 hard things in computer science:&lt;br&gt;0. Cache invalidation&lt;br&gt;1. Naming things&lt;br&gt;7. Asynchronous callbacks&lt;br&gt;2. Off-by-one errors&lt;/p&gt;&amp;mdash; Paweł Zajączkowski (@gvaireth) &lt;a href=&#34;https://twitter.com/gvaireth/status/909805115707727873?ref_src=twsrc%5Etfw&#34;&gt;September 18, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;These are funny, but they do also convey some truth: in the midst of all the technicalities and abstractions we can find ourselves caught up with in the world of programming, it&amp;rsquo;s surprising how often seemingly &amp;lsquo;simple&amp;rsquo; things like naming things trip us up.&lt;/p&gt;
&lt;p&gt;I was recently reminded of this when a difference of opinions about function names sparked some healthy debate in a pull request I was reviewing for one of my personal projects.&lt;/p&gt;
&lt;p&gt;So the question I want to raise is this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;When (if ever) is it a good idea to adopt a prefixing convention for the names of exported functions in an R package?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;disclaimers&#34;&gt;Disclaimers&lt;/h2&gt;
&lt;p&gt;Before I dive into the details I feel it is important to state a few things upfront.&lt;/p&gt;
&lt;p&gt;Firstly, I want to thank my friends and collaborators Katrin and Lorenz who are strong proponents of open source software and for whom I have a lot of respect. On this occasion they both seem to disagree with me, but that is not a bad thing - discussion and debate is valuable, and that&amp;rsquo;s not gonna happen when everyone agrees with each other all the time. I did also ask for their permission before publishing this post.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/survivorship_bias.png#floatright&#34; alt=&#34;xkcd: Survivorship Bias&#34; title=&#34;xkcd: Survivorship Bias&#34;&gt;&lt;/p&gt;
&lt;p&gt;Secondly, my purpose in writing about this is less about trying to determine who is right, and more about attempting to convert this experience into insight. Often we learn more from our failures than from our successes, but it&amp;rsquo;s harder to share our mistakes than it is to share our triumphs. So this post is my way of being vulnerable about something that is a work in progress and the process of trying to improve on it. As an aside, if you haven&amp;rsquo;t encountered survivorship bias before, I highly recommend you &lt;a href=&#34;https://youarenotsosmart.com/2013/05/23/survivorship-bias/&#34;&gt;read this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thirdly, I was wrong. This is especially important in light of the previous point. I was wrong to raise the issue of function names (for the package as a whole) in a pull request which was focused on something else. This is a valuable lesson. One should always aim to keep pull requests (and issues) narrow in scope because attempting to tackle multiple problems in one place (unless they are inherently linked or dependent on each other) is messy and complicates matters unnecessarily.&lt;/p&gt;
&lt;p&gt;Lastly, what I share will be my own opinion, but it is just an opinion and I&amp;rsquo;m always open to learning from others with different views. My hope is that collectively we can share some worthwhile perspectives from both sides and possibly encourage more thinking and conversation around this or related issues.&lt;/p&gt;
&lt;h2 id=&#34;background-context&#34;&gt;Background Context&lt;/h2&gt;
&lt;p&gt;Ok, so having made those upfront disclaimers, I&amp;rsquo;ll begin by summarizing the back-story and context in which the discussion arose. If you&amp;rsquo;d like to refer to the pull request itself - it can be found &lt;a href=&#34;https://github.com/jonmcalder/exercism/pull/9#pullrequestreview-66774136&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.joncalder.co.za/img/small-imgs/exercism_R_logo.png#floatleft&#34; alt=&#34;R track on Exercism&#34; title=&#34;R track on exercism&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://exercism.io/&#34;&gt;excercism.io&lt;/a&gt; is a learning platform that aims to provide code practice and mentorship for everyone. I got involved in developing the R track on Exercism and wrote about it &lt;a href=&#34;http://joncalder.co.za/2017-04-05-r-track-on-exercism/&#34;&gt;earlier this year&lt;/a&gt;. Unlike most online learning platforms, with Exercism, all the coding happens on your machine in an environment you&amp;rsquo;re familiar with. So Exercism provides a command line tool which leverages an API in order to facilitate the process of fetching and submitting exercises.&lt;/p&gt;
&lt;p&gt;A few months ago, I had an idea to write an R package which wraps this API. The thinking was that the user experience (for R users) might be improved upon by facilitating interaction with &lt;code&gt;exercism.io&lt;/code&gt; directly from R itself. This removes the need for switching repeatedly between R and a shell when fetching, iterating on and submitting exercises - although now the addition of terminal tabs in RStudio 1.1 has already reduced this friction to a degree. In any case, there are additional opportunities for Exercism helper functions in the package which can be context aware and integrate with the RStudio if it is being used. An example this could be functions (or addins) which make use of the &lt;code&gt;rstudioapi&lt;/code&gt; to detect which problem was last worked on when submitting so that it doesn&amp;rsquo;t need to be specified manually.&lt;/p&gt;
&lt;p&gt;Katrin, who is a co-maintainer for the R track on exercism.io, has also been collaborating on this R package with me and has had some great ideas like leveraging &lt;a href=&#34;http://testthat.r-lib.org/&#34;&gt;testthat&amp;rsquo;s&lt;/a&gt; &lt;code&gt;auto_test()&lt;/code&gt; to facilitate and encourage test driven development, as this is one of the implicit goals of Exercism. In the PR introducing this feature, the potential for function name confusion was soon evident when this new Exercism specific version of &lt;code&gt;testthat::auto_test()&lt;/code&gt; was (initially) given the name &lt;code&gt;autotest()&lt;/code&gt;. This reminded me that I&amp;rsquo;d in fact been thinking for a while about renaming all the exported functions to adopt the prefixing convention &lt;code&gt;ex_*&lt;/code&gt; (for a few different reasons which I&amp;rsquo;ll get to later). So I figured this &amp;ldquo;name clash&amp;rdquo; was as good a catalyst as any, and made the suggestion to start adopting the new naming convention in the PR. Once again it&amp;rsquo;s worth noting that this was a mistake - I should have instead opened a separate issue to discuss my proposed change in naming conventions.&lt;/p&gt;
&lt;h2 id=&#34;discussion--follow-up&#34;&gt;Discussion &amp;amp; follow-up&lt;/h2&gt;
&lt;p&gt;The suggestion was met with some resistance, and after some further discussion it became clear to me that it was a thoughtfully considered resistance. So I asked my friend Lorenz to weigh in on the discussion too, given that he knows Katrin and I but is not involved in the project and thus has the benefit of a more neutral perspective. To my surprise, he did not agree with me either!&lt;/p&gt;
&lt;p&gt;But I did still seem to have &lt;a href=&#34;https://github.com/jonmcalder/exercism/pull/9#issuecomment-334316542&#34;&gt;Jenny Bryan on my side&lt;/a&gt; (thanks Jenny!), and I figured &lt;a href=&#34;https://twitter.com/hadleywickham&#34;&gt;Hadley&lt;/a&gt; had to have thought it was a good idea at some point given the &lt;code&gt;str_&lt;/code&gt; prefix for &lt;a href=&#34;http://stringr.tidyverse.org/&#34;&gt;stringr&lt;/a&gt; and &lt;code&gt;fct_&lt;/code&gt; prefix for &lt;a href=&#34;http://forcats.tidyverse.org/&#34;&gt;forcats&lt;/a&gt; among others. So after thinking on the problem for a while, out of curiousity I eventually tweeted out a poll to see if I could get any sense of where the &lt;code&gt;#rstats&lt;/code&gt; community falls on this issue.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-lang=&#34;en&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;What is your take on prefixing conventions for &lt;a href=&#34;https://twitter.com/hashtag/rstats?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#rstats&lt;/a&gt; function names? (e.g. stringr/stringi, forcats, googlesheets)&lt;/p&gt;&amp;mdash; Jon Calder (@jonmcalder) &lt;a href=&#34;https://twitter.com/jonmcalder/status/921470775294681089?ref_src=twsrc%5Etfw&#34;&gt;October 20, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;At a glance it looks like a reasonable proportion are actually in favour of prefixing conventions for function names (or at least not against the idea), but of course there are a number of disclaimers to make here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Character limits (at the time of the poll) made it hard to communicate the question clearly or to include any additional context for the question, so that probably leaves a lot of room for interpretation&lt;/li&gt;
&lt;li&gt;I don&amp;rsquo;t have much reach on Twitter, so there weren&amp;rsquo;t many responses (81 votes is not much to go on)&lt;/li&gt;
&lt;li&gt;Even if there had been a good number of responses, Twitter polls need to be looked at skeptically given the potential for sampling bias&lt;/li&gt;
&lt;li&gt;Speaking of sampling bias, most of the votes came in after Hadley tweeted a reply to the poll so it makes sense that the results would be skewed towards his legions of followers (I&amp;rsquo;m one of them and the degree of influence is clear because his packages are what got me considering prefixing conventions in the first place, among others like &lt;a href=&#34;https://github.com/jennybc/googlesheets&#34;&gt;googlesheets&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/maelle&#34;&gt;Maëlle&lt;/a&gt; had two helpful follow-ups for me. Firstly, she encouraged me to blog about this (and I don&amp;rsquo;t think I would have done so otherwise so thanks Maëlle!). Secondly, she directed me to the ROpenSci review process for her package &lt;a href=&#34;http://ropensci.github.io/ropenaq/&#34;&gt;ropenaq&lt;/a&gt;, which provides access to air quality data via the OpenAQ API. In his &lt;a href=&#34;https://github.com/ropensci/onboarding/issues/24#issuecomment-177408867&#34;&gt;review of the package&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/polesasunder&#34;&gt;Andrew MacDonald&lt;/a&gt; suggested the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I was thinking that the names of functions might be a bit similar to functions in other packages that also use geography. What do you think of prefixing every function with a package-specific string? Perhaps something like aq_ before all the user-facing functions (i.e. countries() becomes aq_countries()). This is similar to another rOpenSci package, geonames, which uses GN (as in GNcities()). This has the added benefit of playing very nicely with Rstudio, which will show all the package functions as completions when users type aq_ and hit tab.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interestingly, this suggestion (although the original inspiration may have come from elsewhere) was later incorporated into &lt;a href=&#34;https://github.com/ropensci/onboarding/blob/master/packaging_guide.md#funvar&#34;&gt;ROpenSci&amp;rsquo;s packaging guide&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.joncalder.co.za/img/small-imgs/ropensci_logo.png#floatright&#34; alt=&#34;ROpenSci logo&#34; title=&#34;ROpenSci logo&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Consider an object_verb() naming scheme for functions in your package that take a common data type or interact with a common API. object refers to the data/API and verb the primary action. This scheme helps avoid namespace conflicts with packages that may have similar verbs, and makes code readable and easy to auto-complete. For instance, in &lt;code&gt;stringi&lt;/code&gt;, functions starting with &lt;code&gt;stri_&lt;/code&gt; manipulate strings (&lt;code&gt;stri_join()&lt;/code&gt;, &lt;code&gt;stri_sort()&lt;/code&gt;, and in &lt;code&gt;googlesheets&lt;/code&gt; functions starting with &lt;code&gt;gs_&lt;/code&gt; are calls to the Google Sheets API (&lt;code&gt;gs_auth()&lt;/code&gt;, &lt;code&gt;gs_user()&lt;/code&gt;, &lt;code&gt;gs_download()&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Though I hadn&amp;rsquo;t seen this recommendation from ROpenSci at the time, it aligns very strongly with my initial reasoning for wanting to change the function names in the &lt;code&gt;exercism&lt;/code&gt; package. It is primarily an API package, and all functions either interact with the exercism.io API or act on some (local) Exercism data/code (exercises). A potential objection could be that in some cases the &lt;code&gt;ex_*&lt;/code&gt; prefix may be interpreted either as &lt;code&gt;exercism_*&lt;/code&gt; or as &lt;code&gt;exercise_*&lt;/code&gt;, but I don&amp;rsquo;t think that&amp;rsquo;s a problem since either way the context is common and shared implicitly.&lt;/p&gt;
&lt;p&gt;Having said that, I&amp;rsquo;m also aware that a prefixing convention is not suitable in the majority of cases and there are reasons to avoid it, otherwise it would already be far more common. I&amp;rsquo;ve not tried to summarize the arguments for and against it here since this post is already quite lengthy, but I believe Katrin and Lorenz both raised a number of good points over in the &lt;a href=&#34;https://github.com/jonmcalder/exercism/pull/9#issuecomment-334929991&#34;&gt;original PR thread&lt;/a&gt;, so I would encourage you to read through that to get some more insight into the potential pros and cons.&lt;/p&gt;
&lt;p&gt;Below is an overview of the currently exported functions for &lt;code&gt;exercism&lt;/code&gt;, along with a brief
description of what they do and potential new names for each should we adopt a prefixing convention:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Current Function&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Description&lt;/th&gt;
&lt;th style=&#34;text-align:left&#34;&gt;New Name?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;set_api_key()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Set an environment variable for the provided exercism.io API key, and store in .Renviron so that it can persist for future sessions.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_set_key()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;set_exercism_path()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Set an environment variable for the provided exercism path, and store in .Renviron so that it can persist for future sessions.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_set_path()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;track_status()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Fetches current track status from exercism.io&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_status()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;check_next_problem()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Returns the next problem for a language track&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_check()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;fetch_problem()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Fetches the files for a problem via the Exercism API and writes them into a new problem folder in the Exercism directory&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_fetch()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;fetch_next()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Checks for the next problem via the Exercism API, and writes the files into the folder in the Exercism directory&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;*special case of &lt;code&gt;ex_fetch()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;open_exercise()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Open files for an exercism.io problem&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_open()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;start_testing()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Exercism- and R-specific wrapper for &lt;code&gt;testthat::auto_test()&lt;/code&gt; that starts testing your solution against the problem&amp;rsquo;s test cases.&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_auto_test()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;submit()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Submits the specified solution to exercism.io&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_submit()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;skip_problem()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Marks a problem as &amp;lsquo;skipped&amp;rsquo; via the Exercism API&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_skip()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;browse_exercise()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Navigate to an exercise description on exercism.io&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;ex_browse()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;browse_solution()&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;Navigate to an exercise solution on exercism.io&lt;/td&gt;
&lt;td style=&#34;text-align:left&#34;&gt;*special case of &lt;code&gt;ex_browse()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;So looking at the above, do you think this a good use case for an &lt;code&gt;object_verb()&lt;/code&gt; naming convention? How should one determine this? Please feel free to comment with your thoughts and suggestions either in the comments section below, on &lt;a href=&#34;https://twitter.com/jonmcalder&#34;&gt;Twitter&lt;/a&gt;, or in &lt;a href=&#34;https://community.rstudio.com/t/function-naming-conventions-and-best-practice/3381&#34;&gt;this RStudio Community discussion thread&lt;/a&gt;.&lt;/p&gt;
</description>
  </item>
  
<item>
  <title>R track on exercism.io</title>
  <link>https://www.joncalder.co.za/2017-04-05-r-track-on-exercism.io/</link>
  <pubDate>Wed, 05 Apr 2017 00:00:00 +0000</pubDate>
  
<guid>https://www.joncalder.co.za/2017-04-05-r-track-on-exercism.io/</guid>
  <description>&lt;p&gt;&lt;a href=&#34;https://www.joncalder.co.za/2017-01-09-why-swirl/&#34;&gt;As I&amp;rsquo;ve said before&lt;/a&gt;, when it comes to programming I&amp;rsquo;m a firm believer in the &amp;ldquo;learn by doing&amp;rdquo; approach. &lt;a href=&#34;http://exercism.io/&#34;&gt;&lt;code&gt;exercism.io&lt;/code&gt;&lt;/a&gt; is a project which exemplifies this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.joncalder.co.za/img/small-imgs/exercism_logo.png#floatright&#34; alt=&#34;exercism logo&#34; title=&#34;exercism logo&#34;&gt;&lt;/p&gt;
&lt;p&gt;I came across &lt;a href=&#34;http://exercism.io/&#34;&gt;&lt;code&gt;exercism.io&lt;/code&gt;&lt;/a&gt; earlier this year while exploring GitHub looking for an open source project to contribute to. The premise is fairly simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pick a language that you&amp;rsquo;d like to learn or improve on&lt;/li&gt;
&lt;li&gt;fetch an exercise via the Command Line Interface (CLI)&lt;/li&gt;
&lt;li&gt;code up and submit a solution for the exercise&lt;/li&gt;
&lt;li&gt;return to the site to get feedback on your solution and/or to compare it to the solutions others have come up with&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problems are very simple to begin with, (usually starting out with the traditional &amp;ldquo;Hello, World!&amp;quot;), progressing to more difficult problems further on. It&amp;rsquo;s aimed at both newbies and experienced developers, with the philosophy being that for newer programmers the exercises are achievable but &amp;ldquo;with enough complexity to uncover bite-sized knowledge gaps&amp;rdquo;, whereas for more experienced developers, the problems &amp;ldquo;provide a balance of constraints and freedom and encourage you to explore trade-offs and best-practices&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.joncalder.co.za/img/small-imgs/lolcat_code_reviews.jpg#floatleft&#34; alt=&#34;lolcat code reviews&#34; title=&#34;lolcat code reviews&#34;&gt;&lt;/p&gt;
&lt;p&gt;More experienced developers are also encouraged to get involved reviewing the solutions of others and/or to contribute to the project which is all completely open source, whether it is the website itself, API&amp;rsquo;s, the CLI, documentation or track content. The site is also well suited to those with experience in one or more languages who are wanting to ramp up in a new language, or to get a sense of the how the idiomatic approach to a problem might differ from language to language.&lt;/p&gt;
&lt;p&gt;There are currently 35 active language tracks, with another 20+ language tracks planned or upcoming (essentially in an incubation stage). One of those which is hopefully soon-to-be-launched is the &lt;a href=&#34;http://exercism.io/languages/r/launch&#34;&gt;R language track&lt;/a&gt;, which I&amp;rsquo;ve been contributing to over the past two months and am pretty excited about.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.joncalder.co.za/img/small-imgs/exercism_R_logo.png#floatright&#34; alt=&#34;exercism R logo&#34; title=&#34;exercism R logo&#34;&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested, there are a number of ways you can get involved:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firstly, give the &lt;a href=&#34;http://exercism.io/languages/r/launch&#34;&gt;R language track&lt;/a&gt; a try! (you&amp;rsquo;ll need to login on &lt;code&gt;exercism.io&lt;/code&gt; using your GitHub account)&lt;/li&gt;
&lt;li&gt;Once you&amp;rsquo;ve submitted a solution to a problem, you&amp;rsquo;ll be able to see other peoples submissions and are encouraged to comment on these and get discussions going around style and best practice, pros and cons of different approaches etc.&lt;/li&gt;
&lt;li&gt;If you encounter any problems along the way (e.g. setup/install instructions, fetching or submitting exercises, running tests etc) then raise it via the &lt;a href=&#34;https://gitter.im/exercism/support&#34;&gt;online chat support&lt;/a&gt; in order to get help and/or bring it to someone&amp;rsquo;s attention if something needs to be fixed&lt;/li&gt;
&lt;li&gt;With regard to the above, if you encounter an issue which applies specifically to the R track, then please open an issue on the &lt;a href=&#34;https://github.com/exercism/xr/issues&#34;&gt;R track repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Consider becoming a mentor for the R track (if you&amp;rsquo;re interested, please reach out to me on &lt;a href=&#34;https://twitter.com/jonmcalder&#34;&gt;Twitter&lt;/a&gt; or via my &lt;a href=&#34;https://www.joncalder.co.za/contact/&#34;&gt;contact page&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Checkout the list of &lt;a href=&#34;http://exercism.io/languages/r/todo&#34;&gt;unimplemented exercises&lt;/a&gt; for the R track and follow the instructions there to submit a pull request&lt;/li&gt;
&lt;li&gt;Lastly, look through &lt;code&gt;exercism.io&#39;s&lt;/code&gt; &lt;a href=&#34;https://github.com/exercism/exercism.io/blob/master/CONTRIBUTING.md&#34;&gt;contributing doc&lt;/a&gt;, which outlines a number of other ways you can get involved (either with a specific language track, or across other areas of the project as well)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Based on my involvement so far the &lt;code&gt;exercism.io&lt;/code&gt; community seems very friendly and open, and I think its a great open source initiative, so there&amp;rsquo;s no reason why the &lt;code&gt;#rstats&lt;/code&gt; community shouldn&amp;rsquo;t be well represented there.&lt;/p&gt;
&lt;p&gt;On that note, a big thank you to exercism&amp;rsquo;s contributors, and especially to &lt;a href=&#34;http://jonboiser.com/&#34;&gt;Jonathan Boiser&lt;/a&gt; and &lt;a href=&#34;http://www.kytrinyx.com/&#34;&gt;Katrina Owen&lt;/a&gt; for being friendly, helpful and supportive of my involvement in the project thus far. You guys are excellent role models for the greater open source community.&lt;/p&gt;
</description>
  </item>
  
</channel>
  </rss>