<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Donald Merand</title>
    <description>The latest articles on DEV Community by Donald Merand (@dmerand).</description>
    <link>https://dev.to/dmerand</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F60881%2Fab8af738-7852-42bf-8aaa-8f547c10f2e3.png</url>
      <title>DEV Community: Donald Merand</title>
      <link>https://dev.to/dmerand</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmerand"/>
    <language>en</language>
    <item>
      <title>ExAirtable - Airtable in your Elixir</title>
      <dc:creator>Donald Merand</dc:creator>
      <pubDate>Mon, 09 Nov 2020 23:42:18 +0000</pubDate>
      <link>https://dev.to/explo/exairtable-airtable-in-your-elixir-1n01</link>
      <guid>https://dev.to/explo/exairtable-airtable-in-your-elixir-1n01</guid>
      <description>&lt;p&gt;&lt;strong&gt;tl;dr: If you use Elixir and like Airtable, check out a new library I wrote called &lt;a href="https://github.com/exploration/ex_airtable" rel="noopener noreferrer"&gt;ExAirtable&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://www.explo.org" rel="noopener noreferrer"&gt;EXPLO&lt;/a&gt;, we often reach for &lt;a href="https://airtable.com" rel="noopener noreferrer"&gt;Airtable&lt;/a&gt; when we're trying out new ideas. We love it because it really reduces friction for putting together simple relational systems that are the backbone of knowledge work. We are also very happy with &lt;a href="https://elixir-lang.org" rel="noopener noreferrer"&gt;Elixir&lt;/a&gt; and &lt;a href="https://www.phoenixframework.org" rel="noopener noreferrer"&gt;Phoenix&lt;/a&gt; when it comes time to build apps for the web, which seems to happen more and more these days!&lt;/p&gt;

&lt;p&gt;I've often wondered whether we could use Airtable as a content management back-end for some of these sites. It solves a few problems that we consistently have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A simple and consistent management front-end that includes relational data along with tabular views, forms, calendars, etc.&lt;/li&gt;
&lt;li&gt;File-hosting and image auto-resizing! You just make a "file" field type and you can upload files right into your 'tables. Images get automatically scaled to a variety of sizes.&lt;/li&gt;
&lt;li&gt;API! Every project has the same API structure and the API is sane to use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We've used Ruby with Sinatra or Rails and the excellent &lt;a href="https://github.com/Sirupsen/airrecord" rel="noopener noreferrer"&gt;AirRecord &lt;/a&gt; library to do Airtable-based sites before. But for Elixir, the current Airtable API libraries didn't seem to be in active development, and didn't have features like rate-limiting or caching. But it would be so cool if we had an Elixir library that would allow us to handle Airtable rate-limiting and caching as a single Elixir-native dependency! &lt;/p&gt;

&lt;p&gt;Meanwhile, Ricardo Garcia Vega wrote &lt;a href="https://dev.to/bigardone/headless-cms-fun-with-phoenix-liveview-and-airtable-pt-1-4anj"&gt;this amazing article&lt;/a&gt; demonstrating the use of Elixir and Phoenix as a caching layer for Airtable for a content management system. This "native" Elixir solution was just the push I needed to fix Elixir's Airtable library problem.&lt;/p&gt;

&lt;p&gt;So here's the buried lede: I wrote an Airtable library (actually two! read onward...) for Elixir called &lt;a href="https://github.com/exploration/ex_airtable" rel="noopener noreferrer"&gt;ExAirtable&lt;/a&gt;. This library aims to provide a solid foundation to use Elixir (&lt;a href="https://github.com/exploration/ex_airtable_phoenix" rel="noopener noreferrer"&gt;with&lt;/a&gt; or without Phoenix) with Airtable interaction. It handles rate-limiting against the Airtable API, and (optionally) caches all requests in local memory to drastically speed up reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solid Foundation
&lt;/h2&gt;

&lt;p&gt;I designed ExAirtable to work in two different ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Just hit the Airtable API directly. Don't worry about rate limits too much and give me all of the pages of data when I want a list. You'd use this method if you have a simple case where you don't expect things to get crazy in terms of number of requests or size of data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run as a supervised, cached, and rate-limited server tree. All client requests will go into a per-base queue which will never exceed 5 API requests per second. All desired data will be stored in an in-memory cache that is periodically refreshed via the API. Client request retrieved from the cache whenever possible to drastically speed up read times. This mode is useful when you're dealing with larger bases or apps that may have a lot of clients performing read and write operations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's how the system comes together:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsg85ziscccoxl6v3g3io.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsg85ziscccoxl6v3g3io.png" alt="ExAirtable - System Overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you decide to run the service in cached and rate-limited mode, here's how the supervision tree comes together:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fguy0qqcj9n0ntrezyc34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fguy0qqcj9n0ntrezyc34.png" alt="ExAirtable - Supervision Structure"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;If folks are interested, I can write more articles with code examples. In the meantime &lt;a href="https://hexdocs.pm/ex_airtable/ExAirtable.html" rel="noopener noreferrer"&gt;the documentation&lt;/a&gt; has tons of examples and information. I've tried hard to make it comprehensive and useful all by itself, which is a truly game-changing trick that I've learned from the Elixir community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use with Phoenix and/or Ecto
&lt;/h2&gt;

&lt;p&gt;Realistically, most folks who want to try this with Elixir are going to use Phoenix as their application framework. Since Phoenix plays so well with Ecto, I found it beneficial to create a set of conventions around creating ExAirtable Table models in an Ecto context with embedded schemas.&lt;/p&gt;

&lt;p&gt;That library (called ExAirtable.Phoenix) is here: &lt;a href="https://github.com/exploration/ex_airtable_phoenix" rel="noopener noreferrer"&gt;https://github.com/exploration/ex_airtable_phoenix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once again, I can write more follow-up if folks are interested. In the meantime, give it a try and let me know what you think!&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>airtable</category>
      <category>phoenix</category>
      <category>cms</category>
    </item>
    <item>
      <title>DNS is a Thing that People Hack Now, I Made an Open-Source App to Help</title>
      <dc:creator>Donald Merand</dc:creator>
      <pubDate>Thu, 30 Jan 2020 21:24:56 +0000</pubDate>
      <link>https://dev.to/explo/dns-is-a-thing-that-people-hack-now-i-made-an-open-source-app-to-help-13a3</link>
      <guid>https://dev.to/explo/dns-is-a-thing-that-people-hack-now-i-made-an-open-source-app-to-help-13a3</guid>
      <description>&lt;p&gt;&lt;a href="https://krebsonsecurity.com/2020/01/does-your-domain-have-a-registry-lock/"&gt;This article&lt;/a&gt; about recent DNS hijacking attacks is a wake-up call. I recommend you read it, but here's a bit of a summary in case you're not a big link-clicker (emphasis mine):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the case of e-hawk.net, however, the scammers managed to trick an OpenProvider customer service rep into transferring the domain to another registrar with a ... social engineering ruse — and without triggering any verification to the real owners of the domain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These folks were able to hijack DNS using old-fashioned social engineering techniques. They got a domain registrar to transfer a domain over the phone! Then they stole all of the data.  Okay, there's a lot more to it, you should maybe go read the article... &lt;/p&gt;

&lt;p&gt;The big take-home actions for me (they're listed at the end of that article) were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up multi-factor authentication at your domain registrar. If they don't do multi-factor, consider changing to a registrar that does, because you are now at risk due to their lax security.&lt;/li&gt;
&lt;li&gt;Configure DNSSEC signing zones + validating responses. See above if your registrar doesn't have this.&lt;/li&gt;
&lt;li&gt;Lock your domains with a &lt;a href="https://www.icann.org/resources/pages/locked-2013-05-03-en"&gt;domain lock&lt;/a&gt;. This is different from a "transfer lock" because it requires a laborious personal contact process to undo. This is what you want once your domain is configured correctly. Don't do it until you've got things configured correctly!&lt;/li&gt;
&lt;li&gt;Monitor your DNS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On that last point, I have some news for you:&lt;/p&gt;

&lt;h1&gt;
  
  
  DNS-Monitor, a New Ruby-Based CLI Tool
&lt;/h1&gt;

&lt;p&gt;I found myself wishing that I had a little robot to monitor all of my hostnames and warn me if there were any changes to them. So, I wrote that app yesterday and open-sourced it as the &lt;a href="https://github.com/exploration/dns-monitor"&gt;DNS-Monitor Gem&lt;/a&gt;. The big thing you get is a command-line utility called &lt;code&gt;dns-monitor&lt;/code&gt;. Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You feed it a text file with all of your host names (just one line per host).&lt;/li&gt;
&lt;li&gt;You figure out the &lt;a href="https://en.wikipedia.org/wiki/Registration_Data_Access_Protocol"&gt;RDAP&lt;/a&gt; (JSON WHOIS) endpoint of your domain registrar. I've done zero research on who uses RDAP, but it seems like a thing many of them use? At EXPLO we use &lt;a href="https://pairdomains.com"&gt;Pair Networks&lt;/a&gt;, so I put their server in as a default, but you can change it with the &lt;code&gt;-u&lt;/code&gt; or &lt;code&gt;--rdap_url&lt;/code&gt; flag.

&lt;ul&gt;
&lt;li&gt;Note that in the current configuration, I'm assuming only one registrar (because that's what we have). Send a pull request if you'd like to add the ability for multiple RDAP servers! :)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You run the app like this: &lt;code&gt;dns-monitor --check&lt;/code&gt; or &lt;code&gt;dns-monitor -c&lt;/code&gt;. It will run through your list of hosts, and compare the current RDAP (WHOIS) value for that host with a (SQLite3) database of previous values.&lt;/li&gt;
&lt;li&gt;The output of the program is a JSON array of all of your domain RDAP (WHOIS) information, with a diff showing changes for any domains that have them.&lt;/li&gt;
&lt;li&gt;At &lt;a href="https://www.explo.org"&gt;EXPLO&lt;/a&gt; we use Google Hangouts Chat for 'bot notifications, and Mandrill for transactional email, so I put in some extra functionality for those two things. If you send a Mandrill API key + email you can get email notifications if any domain has changed. But even if you use neither of those things, you can just pipe the program output into whichever utility you do use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We at EXPLO are using it currently, and it works pretty well for our use case. If you'd like to give it a try, just &lt;code&gt;gem install dns-monitor&lt;/code&gt; to get it for yourself. Here's an example cron script for how we use it in practice. It does some extra work to specify where the &lt;code&gt;hosts.txt&lt;/code&gt; and database files live:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;In summary, DNS is scary now, I hope this helps. Send me a note if you end up using it!&lt;/p&gt;

</description>
      <category>dns</category>
      <category>ruby</category>
      <category>gem</category>
      <category>cli</category>
    </item>
    <item>
      <title>Any FileMaker Devs Here?</title>
      <dc:creator>Donald Merand</dc:creator>
      <pubDate>Fri, 06 Apr 2018 13:12:11 +0000</pubDate>
      <link>https://dev.to/dmerand/any-filemaker-devs-here-1efe</link>
      <guid>https://dev.to/dmerand/any-filemaker-devs-here-1efe</guid>
      <description>&lt;p&gt;I spend a lot of my days in FileMaker, and I wonder: are there any &lt;a href="http://www.filemaker.com/index.html"&gt;FileMaker&lt;/a&gt; devs lurking around here? If so, what are your favorite parts? What would you like to learn more about? If not, would you be interested in learning about it?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>filemaker</category>
    </item>
    <item>
      <title>Is Touch-Typing an Important Skill for Software Developers?</title>
      <dc:creator>Donald Merand</dc:creator>
      <pubDate>Sun, 01 Apr 2018 12:38:55 +0000</pubDate>
      <link>https://dev.to/dmerand/is-touch-typing-an-important-skill-for-software-developers-4lic</link>
      <guid>https://dev.to/dmerand/is-touch-typing-an-important-skill-for-software-developers-4lic</guid>
      <description>&lt;p&gt;When I watch my expert colleagues navigate their work, I'm impressed by how their tools look like an extension of their body. A videographer with a custom Final Cut jogwheel + keypad setup, a designer who knows every Illustrator shortcut - they go about their work with a fluidity that looks like a dance. They never look at their hands while they're working.&lt;/p&gt;

&lt;p&gt;In college, a professor told me that "Once you learn &lt;code&gt;vim&lt;/code&gt;, you can move mountains." This sounded impressive, but didn't really click with me until 5 years after I graduated when I finally went through &lt;code&gt;:vimtutor&lt;/code&gt; and dedicated myself to using Vim for all of my code development. I can move mountains (of text)! But &lt;code&gt;vim&lt;/code&gt; is all but useless if you can't touch-type.&lt;/p&gt;

&lt;p&gt;I've always told my colleagues at work to memorize keyboard shortcuts. "Imagine how many hours of your life you've spent just moooooving your hand over to the mouse so that you can click some icon!" I say. But then I realized: keyboard shortcuts will only save you time if you can touch-type. If you can't find home row, a keyboard shortcut is not going to make you faster.&lt;/p&gt;

&lt;p&gt;So that's my question - given that our range of professions involve fending our way through gigantic piles of text, is true mastery only attainable to those who know how to touch type? Or is it merely a nice tool to have in one's proverbial belt? Or am I missing the point entirely? &lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Do You Prefer Multiple Monitors or Just One? Why?</title>
      <dc:creator>Donald Merand</dc:creator>
      <pubDate>Tue, 27 Mar 2018 01:14:34 +0000</pubDate>
      <link>https://dev.to/dmerand/do-you-prefer-multiple-monitors-or-just-one-why-4k6h</link>
      <guid>https://dev.to/dmerand/do-you-prefer-multiple-monitors-or-just-one-why-4k6h</guid>
      <description></description>
      <category>discuss</category>
    </item>
    <item>
      <title>Using JavaScript Promises for Non-Async Control Flow?</title>
      <dc:creator>Donald Merand</dc:creator>
      <pubDate>Sun, 11 Mar 2018 01:58:59 +0000</pubDate>
      <link>https://dev.to/dmerand/using-javascript-promises-for-non-async-control-flow--22od</link>
      <guid>https://dev.to/dmerand/using-javascript-promises-for-non-async-control-flow--22od</guid>
      <description>&lt;p&gt;I love functional languages like Elixir + Elm that give you a pipe syntax for control flow:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data
|&amp;gt; first_transformation
|&amp;gt; second_transformation
|&amp;gt; etc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It's easy to understand what this program is doing! I've been learning about how promises work in JavaScript, and they seem like a good way to mimic this kind of data-chaining, even if your functions aren't really doing anything that needs to be asynchronous:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;first_transformation(data)
.then(second_transformation)
.then(third_transformation)
.catch(handle_errors_from_the_whole_chain)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The MDN docs on &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Control_flow_and_error_handling"&gt;Control flow and error handling&lt;/a&gt; suggest that &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise"&gt;promises&lt;/a&gt; are mostly for async/deferred operations. Is it normal to use promises merely as a mechanism for control flow and organization? Is it a horrible idea for some reason?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Explain It Like I’m #{[5, 10, 15, 20]}</title>
      <dc:creator>Donald Merand</dc:creator>
      <pubDate>Tue, 06 Mar 2018 22:10:28 +0000</pubDate>
      <link>https://dev.to/explo/explain-it-like-im-5-10-15-20--4odf</link>
      <guid>https://dev.to/explo/explain-it-like-im-5-10-15-20--4odf</guid>
      <description>&lt;p&gt;&lt;em&gt;Cross-posted at &lt;a href="https://donald.merand.org/code/2018/03/06/explain-it.html"&gt;donald.merand.org&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://kottke.org/17/06/if-you-cant-explain-something-in-simple-terms-you-dont-understand-it"&gt;Richard Feynmann&lt;/a&gt;, the true measure of understanding a concept is to be able to relate it to a toddler. This is what I love about the &lt;a href="https://dev.to/t/explainlikeimfive"&gt;#explainlikeimfive&lt;/a&gt; channel here on Dev.to: explaining tech concepts in a couple of pithy paragraphs, without too much technical jargon, is a fun challenge to see if I myself truly understand the concept. I &lt;a href="https://dev.to/dmerand/comment/2fih"&gt;may&lt;/a&gt; &lt;a href="https://dev.to/dmerand/comment/2fn5"&gt;have&lt;/a&gt; &lt;a href="https://dev.to/dmerand/comment/2fn1"&gt;a&lt;/a&gt; &lt;a href="https://dev.to/dmerand/comment/2fnn"&gt;problem&lt;/a&gt; with compulsively commenting on these discussions...&lt;/p&gt;

&lt;p&gt;But there &lt;em&gt;is&lt;/em&gt; one thing that bothers me: I'm not sure that the asker always wants an answer suitable for a five-year-old! Five-year-olds aren't typically concerned with specific terminology, but responses to &lt;a href="https://dev.to/t/explainlikeimfive"&gt;#explainlikeimfive&lt;/a&gt; are often very jargon-heavy. The requester may have wanted that, but that's not an answer you'd want to give a 5-year-old! Not that it matters whether the requester &lt;em&gt;truly&lt;/em&gt; wanted a 5-year-old response versus a 7-year-old response, or what-have-you. What truly matters is that when your response doesn't match the question, you run the risk of being ignored or misunderstood.&lt;/p&gt;

&lt;p&gt;I think understanding these nuances is fun! I'm going to try explaining the same concept to a theoretical 5, 10, 15, and 20-year old. In doing this, I hope to learn something about my own process of teaching, and hopefully find some varying approaches that work well. I'll attempt to &lt;a href="https://dev.to/webdevdeja/explain-git--github-like-im-five--3pak"&gt;Explain Git + GitHub Like I'm Five&lt;/a&gt; (and Ten, and Fifteen, and Twenty).&lt;/p&gt;

&lt;h2&gt;
  
  
  #EXPLAINLIKEIMFIVE
&lt;/h2&gt;

&lt;p&gt;One good way to #explainlikeimfive is to tell a short story which is an analogy. Five-year-olds aren't typically concerned with specific terminology, but they are very good at understanding metaphor. Your goal here would be to get them to understand how this idea solves a problem that's very similar to one that they may have had.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Say you are writing a short story and you want to do a really good job. You might write the story on one sheet of paper, and then get another sheet of paper and write another version, and then keep writing more versions on more sheets of paper. After a while, you'd end up with lots of sheets of paper that weren't the version you were currently writing. You might put those sheets in a folder so that you can go back and see old drafts of your story.&lt;/p&gt;

&lt;p&gt;You give that folder to your mom to keep track of, because you know that you can always ask mom for one of the versions of your story if you need it. Plus, mom keeps photocopies so she can give versions of your story to your siblings. Mom also keeps similar folders for the stories that your siblings write.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Git&lt;/code&gt; is the folder, and your pieces of paper are &lt;code&gt;code&lt;/code&gt;. Your mom is &lt;code&gt;GitHub&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice that in the story above, technical terms aren't integrated into the story, and the list of actual terms is drastically simplified (and could be omitted entirely without negatively impacting understanding).&lt;/p&gt;

&lt;h2&gt;
  
  
  #EXPLAINLIKEIMTEN
&lt;/h2&gt;

&lt;p&gt;Ten-year-olds are ready for terminology, but they can lose a thread if you digress too much or get too technical. You can still succesfully employ an analogy, but they also tend to enjoy more integrated references to technical terms. &lt;a href="https://xkcd.com/thing-explainer/"&gt;Thing Explainer&lt;/a&gt; by Randall Munroe is another approach that works - explain how a thing works using universal words and concepts, because at ten, people tend to understand all of the truly important concepts already.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of computer &lt;code&gt;apps&lt;/code&gt; as stories. Say you are writing a story and you want to do a really good job. You might write several revisions of your story. You don't want to lose your revisions though - what if you had a good idea earlier that you want to revisit later? So you decide to keep all of your revisions in a folder. You can think of &lt;code&gt;git&lt;/code&gt; as the idea of folders that hold revisions, and your &lt;code&gt;repository&lt;/code&gt; (or &lt;code&gt;repo&lt;/code&gt;) is the folder that holds this one story you're writing, and all of its revisions.&lt;/p&gt;

&lt;p&gt;You might want to share the story that you're writing! Maybe you want to share the writing with friends, or maybe you just want a place for folks to go to read it. &lt;code&gt;GitHub&lt;/code&gt; is such a place - a web &lt;code&gt;app&lt;/code&gt; that holds your &lt;code&gt;repos&lt;/code&gt;, and gives you a &lt;code&gt;web site&lt;/code&gt; for them to share. From &lt;code&gt;GitHub&lt;/code&gt;, anybody you allow can get their own photocopy of your story, and make changes to their copy. In &lt;code&gt;git&lt;/code&gt; that's called a &lt;code&gt;fork&lt;/code&gt;. If the person who &lt;code&gt;forked&lt;/code&gt; your &lt;code&gt;repo&lt;/code&gt; wants to share their changes with you, so that you can have them in your &lt;code&gt;repo&lt;/code&gt;, they can give you a &lt;code&gt;pull request&lt;/code&gt; on &lt;code&gt;GitHub&lt;/code&gt; - a bit like handing you a version of your story with changes in red, and asking you to use that as your story instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  #EXPLAINLIKEIMFIFTEEN
&lt;/h2&gt;

&lt;p&gt;At fifteen, people are capable of truly excelling in areas that interest them. They can handle terminology and abstract concepts: metaphor, while helpful, isn't a tool you need to lean on quite so much. But you might still be dealing with a short attention span, so keep your descriptions on-topic and don't concern yourself too much with asides.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Say you are writing some code, but you worry that when you change your code you might want to &lt;code&gt;undo&lt;/code&gt; your changes. So you need a &lt;code&gt;version control&lt;/code&gt; system that you can tell "I've made some changes, please remember them". &lt;code&gt;Git&lt;/code&gt; is an example of a version control system. Your &lt;code&gt;repository&lt;/code&gt; or &lt;code&gt;repo&lt;/code&gt; is your code, which you &lt;code&gt;check in&lt;/code&gt; or &lt;code&gt;commit&lt;/code&gt; to your version control system as you work. Later, you might create other &lt;code&gt;git&lt;/code&gt; &lt;code&gt;repos&lt;/code&gt; for other code projects you're working on.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GitHub&lt;/code&gt; is an app that gives you a web site for your repo. Others can go to this web site, and download your repo to run the code, or make their own changes in their own copy (if they want to!). The idea of everybody getting their own copy of your &lt;code&gt;repo&lt;/code&gt; and being able to make their own changes to it is called &lt;code&gt;distributed version control&lt;/code&gt;. &lt;code&gt;GitHub&lt;/code&gt; gives you the ability to manage &lt;code&gt;pull requests&lt;/code&gt;. &lt;code&gt;Pull requests&lt;/code&gt; are changes that other people have made to their copies of your &lt;code&gt;repo&lt;/code&gt;, that they'd like you to include in (or &lt;code&gt;merge&lt;/code&gt; into) your copy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  #EXPLAINLIKEIMTWENTY
&lt;/h2&gt;

&lt;p&gt;For a twenty-year-old, you can lay out all of your terms once, and then explain the concept using those fully-explained terms. A twenty-year-old can be expected to look up words in the dictionary, or check out concepts on Wikipedia, without needing prompting, so you don't need to belabor your explanations. Your job is to explain how those terms relate to each other. You can also diverge a bit into related topics without worrying that the person will lose track of the main thread.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Git&lt;/code&gt; is a &lt;code&gt;version control system&lt;/code&gt; (&lt;code&gt;VCS&lt;/code&gt;), similar to &lt;code&gt;CVS&lt;/code&gt;, &lt;code&gt;SVN&lt;/code&gt;, or &lt;code&gt;Mercurial&lt;/code&gt;. A &lt;code&gt;VCS&lt;/code&gt; is a system for &lt;code&gt;committing&lt;/code&gt; code changes to a &lt;code&gt;code repository&lt;/code&gt; (&lt;code&gt;repo&lt;/code&gt;) in an &lt;code&gt;append-only&lt;/code&gt; fashion such that at any given point you can see the history of all changes made to the code up to that point.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Git&lt;/code&gt; is a &lt;code&gt;distributed version control system&lt;/code&gt; (&lt;code&gt;DVCS&lt;/code&gt;), meaning that if multiple people are working on the same code project, they each have an independent copy (a &lt;code&gt;fork&lt;/code&gt;) of the &lt;code&gt;repo&lt;/code&gt;, which can diverge from other copies. Changes from other copies (called &lt;code&gt;remotes&lt;/code&gt; in &lt;code&gt;git&lt;/code&gt;), are &lt;code&gt;merged&lt;/code&gt; into a given &lt;code&gt;repo&lt;/code&gt; through a text-based &lt;code&gt;differential comparison&lt;/code&gt; &lt;code&gt;algorithm&lt;/code&gt;. Changes in a given &lt;code&gt;repo&lt;/code&gt; can also be &lt;code&gt;branched&lt;/code&gt; and then &lt;code&gt;merged later&lt;/code&gt;, to give the developer an opportunity to work on specific ideas without the pressure of &lt;code&gt;committing&lt;/code&gt; them to the main &lt;code&gt;branch&lt;/code&gt; of the &lt;code&gt;repo&lt;/code&gt;. &lt;code&gt;Mercurial&lt;/code&gt; is another &lt;code&gt;DVCS&lt;/code&gt;, whereas &lt;code&gt;SVN&lt;/code&gt; and &lt;code&gt;CVS&lt;/code&gt; rely on a central "master" code &lt;code&gt;repo&lt;/code&gt; on a &lt;code&gt;server&lt;/code&gt;, which is typically referred to as a &lt;code&gt;trunk&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GitHub&lt;/code&gt; is a web app that provides a social network around &lt;code&gt;git&lt;/code&gt; &lt;code&gt;repos&lt;/code&gt;. &lt;code&gt;GitHub&lt;/code&gt; will give each repo a unique &lt;code&gt;URL&lt;/code&gt;, which can be used for &lt;code&gt;forking&lt;/code&gt; or downloading a &lt;code&gt;repo&lt;/code&gt;. &lt;code&gt;GitHub&lt;/code&gt; also provides &lt;code&gt;pull requests&lt;/code&gt;, wherein a developer can &lt;code&gt;fork&lt;/code&gt; a &lt;code&gt;repo&lt;/code&gt;, create changes, and then request that those changes be &lt;code&gt;merged&lt;/code&gt; into another fork. &lt;code&gt;GitHub&lt;/code&gt; provides other services such as &lt;code&gt;issue tracking&lt;/code&gt;, &lt;code&gt;wikis&lt;/code&gt;, &lt;code&gt;visualizations&lt;/code&gt; of code history, and more. People often use services such as &lt;code&gt;GitHub&lt;/code&gt; or &lt;code&gt;Bitbucket&lt;/code&gt; because they don't want to have to manage their own git server, or because they want the extra features such as &lt;code&gt;pull requests&lt;/code&gt; or &lt;code&gt;issue tracking&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice that this version is the first time that alternatives to Git, such as SVN or Mercurial, even get mentioned. I'm assuming that a twenty-year-old will want to do further research if they're interested, so providing bigger context such as naming alternative approaches can be very helpful toward that end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Explaining things to people is fun! It is a good test of your personal knowledge on a topic, and it is also deeply rewarding to share knowledge with people who want to learn. Keeping your audience's abilities and desires in mind drastically increases the likelihood that what you say will be received and absorbed.&lt;/p&gt;

&lt;p&gt;Do I think you should start using the hashtag #explainlikeimten or #explainlikeimtwenty just to be more precise? No, I do not! Please don't do that! I love that we have the one hashtag here which generally means "I'm new to this and would like some help." This was just a fun thought experiment meant to shed some light onto my own teaching process. I'm hoping that posting it here will be inspiring in some way!&lt;/p&gt;

&lt;p&gt;Who have you found (here on Dev.to, or elsewhere) that's good at explaining? What is it that you like about their explanations?&lt;/p&gt;

</description>
      <category>explainlikeimfive</category>
      <category>pedagogy</category>
    </item>
  </channel>
</rss>
