<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>a bunch tell // team</title>
    <link>https://handbook.abunchtell.com/</link>
    <description></description>
    <pubDate>Sat, 02 May 2026 16:03:31 +0000</pubDate>
    <item>
      <title>Implementation</title>
      <link>https://handbook.abunchtell.com/implementation?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[#BestPractices and #GuidingPrinciples for implementing anything in code. !--more--&#xA;&#xA;When writing code, it&#39;s important to know our general philosophy as a software company, and where the software itself fits in with the bigger picture.&#xA;&#xA;Code exists to serve our product, which exists to serve our customers and users. In other words, our overall priorities as a software company go in the following order:&#xA;&#xA;Customer / user&#xA;Product&#xA;Code&#xA;&#xA;Put another way: A technical solution that fixes an issue for a real user is far more important than one that is merely technically elegant or &#34;good.&#34; &#34;Done and deployed&#34; is always better than &#34;unfinished but elegant.&#34;&#xA;&#xA;To drive this point home: we are not pursuing technical perfection. We&#39;re pursuing perfection of the customer&#39;s experience. Code is the means by which we most often get there, but it&#39;s not the only way.&#xA;&#xA;With that in mind, it&#39;s helpful to follow some guidelines:&#xA;&#xA;In general, take the shortest route possible. This doesn&#39;t mean doing things the wrong way, or writing bad code in the name of getting something done. Rather, it means that you should pursue the simplest solution first, even if it doesn&#39;t cover 100% of use cases.&#xA;&#xA;What is simplest? It&#39;s whatever accomplishes our product and customer goals without excessive re-architecting, unneeded complexity, etc. If a solution has technical shortcomings but accomplishes our product and customer goals (without harming them), it is a good solution.&#xA;&#xA;For any shortcomings, you should note them in commit messages and task trackers, and create new tasks (attached to the original task) to address any issues later, if needed. But, today: ship it.&#xA;&#xA;Solve for today&#39;s problems before solving for tomorrow&#39;s. It&#39;s important to keep our long-term vision in mind whenever developing something new. But your priority should always be to solve user problems that exist today before solving hypothetical ones that might exist tomorrow. Prepare for inevitable change and eventual gotchas as much as possible -- but don&#39;t let it keep you from shipping complete solutions today.&#xA;&#xA;Keep the big picture in mind. Before starting a task, it&#39;s important to know what the product and customer goals are, so you can make the right development decisions on your own. Knowing what our priorities are will help you determine what&#39;s important or not, what to focus on, and when you&#39;re finished. We hold all team members to this high standard, so everyone is aligned on our mission of building some of the best software products in the world.&#xA;&#xA;If you&#39;re ever unclear about the larger vision, goals, and strategy, ask us until everything is clear. If you don&#39;t understand why we&#39;re doing something, making certain decisions, etc., then that&#39;s a failing on our part.]]&gt;</description>
      <content:encoded><![CDATA[<p><em><a href="https://handbook.abunchtell.com/tag:BestPractices" class="hashtag"><span>#</span><span class="p-category">BestPractices</span></a> and <a href="https://handbook.abunchtell.com/tag:GuidingPrinciples" class="hashtag"><span>#</span><span class="p-category">GuidingPrinciples</span></a> for implementing anything in code.</em> </p>

<p>When writing code, it&#39;s important to know our general philosophy as a software company, and where the software itself fits in with the bigger picture.</p>

<p>Code exists to serve our product, which exists to serve our customers and users. In other words, our overall priorities as a software company go in the following order:</p>
<ol><li>Customer / user</li>
<li>Product</li>
<li>Code</li></ol>

<p>Put another way: A technical solution that fixes an issue for a real user is far more important than one that is merely technically elegant or “good.” “Done and deployed” is always better than “unfinished but elegant.”</p>

<p>To drive this point home: we are not pursuing technical perfection. We&#39;re pursuing perfection of the customer&#39;s experience. Code is the means by which we most often get there, but it&#39;s not the only way.</p>

<p>With that in mind, it&#39;s helpful to follow some guidelines:</p>

<p><strong>In general, take the shortest route possible</strong>. This doesn&#39;t mean doing things the wrong way, or writing <em>bad</em> code in the name of getting something done. Rather, it means that you should pursue the simplest solution first, even if it doesn&#39;t cover 100% of use cases.</p>

<p><em>What is simplest?</em> It&#39;s whatever accomplishes our <em>product and customer goals</em> without excessive re-architecting, unneeded complexity, etc. If a solution has technical shortcomings but accomplishes our product and customer goals (without harming them), it is a good solution.</p>

<p>For any shortcomings, you should note them in commit messages and task trackers, and create new tasks (attached to the original task) to address any issues later, if needed. But, today: ship it.</p>

<p><strong>Solve for today&#39;s problems before solving for tomorrow&#39;s</strong>. It&#39;s important to keep our long-term vision in mind whenever developing something new. But your priority should always be to solve user problems that exist <strong>today</strong> before solving hypothetical ones that might exist tomorrow. Prepare for inevitable change and eventual <em>gotchas</em> as much as possible — but don&#39;t let it keep you from shipping complete solutions today.</p>

<p><strong>Keep the big picture in mind</strong>. Before starting a task, it&#39;s important to know what the product and customer goals are, so you can make the right development decisions on your own. Knowing what our priorities are will help you determine what&#39;s important or not, what to focus on, and when you&#39;re finished. We hold all team members to this high standard, so everyone is aligned on our mission of building some of the best software products in the world.</p>

<p>If you&#39;re ever unclear about the larger vision, goals, and strategy, ask us until everything is clear. If you don&#39;t understand why we&#39;re doing something, making certain decisions, etc., then that&#39;s a failing on our part.</p>
]]></content:encoded>
      <guid>https://handbook.abunchtell.com/implementation</guid>
      <pubDate>Wed, 29 May 2019 19:38:28 +0000</pubDate>
    </item>
    <item>
      <title>Source Control</title>
      <link>https://handbook.abunchtell.com/source-control?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[BestPractices for working with git on Write.as projects. !--more--&#xA;&#xA;Make multiple, granular commits. Work on small, concrete pieces of the task at hand. Then, when you&#39;ve completed a usable chunk of code, use git add -p to step through your changes and commit only the ones that complete that certain bit of functionality. Often, this will result in creating multiple commits -- even very small ones. That&#39;s okay!&#xA;&#xA;Small commits make everyone&#39;s lives easier, from other developers to regular people scanning through the code. Doing so:&#xA;&#xA;Makes it easy to read through a log of changes in plain English, and quickly understand the decisions made over time without having to dig into code&#xA;Makes it easy to use the git blame tool, to figure out why a certain change was made when looking it up from a line of code&#xA;Makes it easy to revert decisions for any reason. Rather than the error-prone process of going into the code and undoing your changes, you can just do git revert [commit-hash]&#xA;&#xA;Some examples of granular commits:&#xA;&#xA;Fix file indentation&#xA;Run goimport on project&#xA;Fix Docker build after enabling Go modules&#xA;Include --config step in make install&#xA;&#xA;Write good commit messages. Once you&#39;ve started making granular commits, you&#39;ll want to ensure their messages are easy to understand and consistent with the rest of the project.&#xA;&#xA;The first line of your commit message should concisely sum up the changes in your commit, ideally in under 75 characters. If that&#39;s not possible to do, that could be an indication that your commit contains too many unrelated changes, and should be broken up.&#xA;&#xA;As for how to write the commit message, follow the advice given in the Git book:&#xA;&#xA;  Write your commit message in the imperative: &#34;Fix bug&#34; and not &#34;Fixed bug&#34; or &#34;Fixes bug.&#34;&#xA;&#xA;After that short, initial line in your commit message, you can optionally explain your changes in more detail below it. That may include:&#xA;&#xA;Rationale for any decisions made&#xA;What other parts of the software are affected by the change&#xA;What existing behavior changed&#xA;References to GitHub issues, e.g. Fixes #19 or Part of #13, or Phabricator tasks, e.g. Fixes T123 or Ref T234&#xA;&#xA;Don&#39;t force-push. Force-pushing creates headaches for other developers when they pull your code. Instead of force-pushing, create new commits, revert commits, and generally use the other git tools available to you to accomplish what you need to.]]&gt;</description>
      <content:encoded><![CDATA[<p><em><a href="https://handbook.abunchtell.com/tag:BestPractices" class="hashtag"><span>#</span><span class="p-category">BestPractices</span></a> for working with git on Write.as projects.</em> </p>

<p><strong>Make multiple, granular commits</strong>. Work on small, concrete pieces of the task at hand. Then, when you&#39;ve completed a usable chunk of code, use <code>git add -p</code> to step through your changes and commit only the ones that complete that certain bit of functionality. Often, this will result in creating multiple commits — even very small ones. That&#39;s okay!</p>

<p>Small commits make everyone&#39;s lives easier, from other developers to regular people scanning through the code. Doing so:</p>
<ul><li>Makes it easy to read through a log of changes in plain English, and quickly understand the decisions made over time without having to dig into code</li>
<li>Makes it easy to use the git blame tool, to figure out <em>why</em> a certain change was made when looking it up from a line of code</li>
<li>Makes it easy to revert decisions for any reason. Rather than the error-prone process of going into the code and undoing your changes, you can just do <code>git revert [commit-hash]</code></li></ul>

<p>Some examples of granular commits:</p>

<pre><code>Fix file indentation
Run goimport on project
Fix Docker build after enabling Go modules
Include --config step in `make install`
</code></pre>

<p><strong>Write good commit messages</strong>. Once you&#39;ve started making granular commits, you&#39;ll want to ensure their messages are easy to understand and consistent with the rest of the project.</p>

<p>The first line of your commit message should concisely sum up the changes in your commit, ideally in under 75 characters. If that&#39;s not possible to do, that could be an indication that your commit contains too many unrelated changes, and should be broken up.</p>

<p>As for how to write the commit message, follow the advice given in <a href="https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines">the Git book</a>:</p>

<blockquote><p>Write your commit message in the imperative: “Fix bug” and not “Fixed bug” or “Fixes bug.”</p></blockquote>

<p>After that short, initial line in your commit message, you can optionally explain your changes in more detail below it. That may include:</p>
<ul><li>Rationale for any decisions made</li>
<li>What other parts of the software are affected by the change</li>
<li>What existing behavior changed</li>
<li>References to GitHub issues, e.g. <code>Fixes #19</code> or <code>Part of #13</code>, or Phabricator tasks, e.g. <code>Fixes T123</code> or <code>Ref T234</code></li></ul>

<p><strong>Don&#39;t force-push</strong>. Force-pushing creates headaches for other developers when they pull your code. Instead of force-pushing, create new commits, revert commits, and generally use the other git tools available to you to accomplish what you need to.</p>
]]></content:encoded>
      <guid>https://handbook.abunchtell.com/source-control</guid>
      <pubDate>Wed, 29 May 2019 16:12:54 +0000</pubDate>
    </item>
    <item>
      <title>First task</title>
      <link>https://handbook.abunchtell.com/first-task?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[We&#39;ll have a discussion about what your first task should be, based on our product priorities and your interests. Once we&#39;ve agreed on a task:&#xA;&#xA;Make sure your development environment is set up (e.g. if you&#39;re working on WriteFreely, make sure Go is installed, and you can run the application)&#xA;Check out the develop branch with git checkout develop&#xA;Create a new feature branch with git checkout -b my-feature&#xA;Start working on the feature&#xA;&#xA;Read our guide on good Source Control habits. Overall:&#xA;&#xA;As you go along, track your time, make granular commits (where each represents a single chunk of functionality), and write decently descriptive commit messages (ideally, using the imperative present tense). When a commit relates to a specific task, you can include Ref T500 (where 500 is the task number) in the commit message to associate it to that task.&#xA;&#xA;When the functionality is ready for review, open a pull request on the related GitHub repo. Matt and others will look over the code, run it, and give you feedback -- requesting any changes, if needed. While a pull request is open, anyone should feel free to test it out and give their input. Then when everything looks good, we&#39;ll merge your change.&#xA;&#xA;Code style&#xA;&#xA;We aim for consistency first and foremost. Try to match the code styles (line breaks, indentation, etc.) currently used in the codebase. Where styles are inconsistent, use the one that seems to be most prevalent.&#xA;&#xA;When writing Go, please run go fmt on all files before committing them. The best way to ensure this happens consistently is to use an editor tool that runs this command every time you save the file (for example, vim-go takes care of this, if you&#39;re using Vim).]]&gt;</description>
      <content:encoded><![CDATA[<p>We&#39;ll have a discussion about what your first task should be, based on our product priorities and your interests. Once we&#39;ve agreed on a task:</p>
<ul><li>Make sure your development environment is set up (e.g. if you&#39;re working on WriteFreely, make sure Go is installed, and you can run the application)</li>
<li>Check out the <code>develop</code> branch with <code>git checkout develop</code></li>
<li>Create a new <em>feature</em> branch with <code>git checkout -b my-feature</code></li>
<li>Start working on the feature</li></ul>

<p><em>Read our guide on good <a href="source-control">Source Control</a> habits.</em> Overall:</p>

<p>As you go along, track your time, make granular commits (where each represents a single chunk of functionality), and write decently descriptive commit messages (ideally, using the <a href="https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines">imperative present tense</a>). When a commit relates to a specific task, you can include <code>Ref T500</code> (where <strong>500</strong> is the task number) in the commit message to associate it to that task.</p>

<p>When the functionality is ready for review, open a pull request on the related GitHub repo. Matt and others will look over the code, run it, and give you feedback — requesting any changes, if needed. While a pull request is open, anyone should feel free to test it out and give their input. Then when everything looks good, we&#39;ll merge your change.</p>

<h2 id="code-style" id="code-style">Code style</h2>

<p>We aim for consistency first and foremost. Try to match the code styles (line breaks, indentation, etc.) currently used in the codebase. Where styles are inconsistent, use the one that seems to be most prevalent.</p>

<p>When writing Go, please run <code>go fmt</code> on all files <em>before</em> committing them. The best way to ensure this happens consistently is to use an editor tool that runs this command every time you save the file (for example, <a href="https://github.com/fatih/vim-go">vim-go</a> takes care of this, if you&#39;re using Vim).</p>
]]></content:encoded>
      <guid>https://handbook.abunchtell.com/first-task</guid>
      <pubDate>Mon, 06 May 2019 21:03:56 +0000</pubDate>
    </item>
    <item>
      <title>Welcome!</title>
      <link>https://handbook.abunchtell.com/welcome?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[This site contains everything you&#39;ll need to know to work on WriteFreely and other A Bunch Tell projects. It&#39;s a living document that we&#39;ll update over time.&#xA;&#xA;First steps&#xA;&#xA;First, we need to take care of the paperwork:&#xA;&#xA;Add your address and sign the Consulting Agreement&#xA;Fill out and sign a W-9 form&#xA;Send us those documents&#xA;&#xA;  Note: with a signed Consulting Agreement, you do not need to sign the CLA to contribute to WriteFreely, as is required of general contributors.&#xA;&#xA;Now that all the paperwork is taken care of:&#xA;&#xA;Create a Phabricator account -- this is where most of our work will happen.&#xA;Once we approve your account, have a look around. We&#39;ll mostly be using the chat (&#34;Conpherence&#34;) and task-tracking features (&#34;Maniphest&#34;).]]&gt;</description>
      <content:encoded><![CDATA[<p><em>This site contains everything you&#39;ll need to know to work on WriteFreely and other <a href="https://abunchtell.com">A Bunch Tell</a> projects. It&#39;s a living document that we&#39;ll update over time.</em></p>

<h2 id="first-steps" id="first-steps">First steps</h2>

<p>First, we need to take care of the paperwork:</p>
<ol><li>Add your address and sign the Consulting Agreement</li>
<li>Fill out and sign a W-9 form</li>
<li>Send us those documents</li></ol>

<blockquote><p><strong>Note</strong>: with a signed Consulting Agreement, you do not need to sign the <a href="https://phabricator.write.as/L1">CLA</a> to contribute to WriteFreely, as is required of general contributors.</p></blockquote>

<p>Now that all the paperwork is taken care of:</p>
<ol><li>Create a <a href="https://phabricator.write.as/auth/start/">Phabricator account</a> — this is where most of our work will happen.</li>
<li>Once we approve your account, have a look around. We&#39;ll mostly be using the chat (“Conpherence”) and task-tracking features (“Maniphest”).</li></ol>
]]></content:encoded>
      <guid>https://handbook.abunchtell.com/welcome</guid>
      <pubDate>Mon, 06 May 2019 03:27:38 +0000</pubDate>
    </item>
  </channel>
</rss>