<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Philosopher Ping]]></title><description><![CDATA[Explorations of software, philosophy, work, life, the universe and everything else.]]></description><link>https://philosopherping.com</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 12:57:44 GMT</lastBuildDate><atom:link href="https://philosopherping.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Hybrid Store Design Pattern]]></title><description><![CDATA[The Hybrid Store is a design pattern for merging batch and real-time data sources into a single dataset. It is an abstraction composed of several versioned datasets, along with a current version pointer (or symlink) serving one of them.

The batch da...]]></description><link>https://philosopherping.com/hybrid-store-design-pattern</link><guid isPermaLink="true">https://philosopherping.com/hybrid-store-design-pattern</guid><category><![CDATA[architecture]]></category><category><![CDATA[design patterns]]></category><category><![CDATA[Databases]]></category><category><![CDATA[Data Infrastructure]]></category><category><![CDATA[venice]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Mon, 05 May 2025 15:49:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/GISbfvCO9JM/upload/81021099f7ea6bee78a49e0883bdc322.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The <em>Hybrid Store</em> is a design pattern for merging batch and real-time data sources into a single dataset. It is an abstraction composed of several <em>versioned datasets</em>, along with a <em>current version</em> pointer (or symlink) serving one of them.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746459861384/37af18f2-2125-43fa-950e-f1119b0c3fa4.png" alt class="image--center mx-auto" /></p>
<p>The batch data source is a job that produces <em>new versions</em> of the dataset. The real-time data source, on the other hand, appends data to a <em>real-time buffer</em>, and this data eventually gets written to <em>all versions</em> of the dataset.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746370540453/4f263134-53a1-4d67-851a-95ab0d64217f.png" alt class="image--center mx-auto" /></p>
<p>When the batch data source runs and produces a new version of the dataset, the Hybrid Store design pattern then does the following:</p>
<ul>
<li>Create a new version N+1 of the dataset (called a <em>future version</em>) and load the batch data into it.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746370554339/3b0c47ea-79f7-4c64-9330-0e00b11e734b.png" alt class="image--center mx-auto" /></p>
<ul>
<li>Replay recent data from the real-time buffer onto the future version N+1.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746370565179/dd811571-32c9-4bd3-81df-5932e604ac13.png" alt class="image--center mx-auto" /></p>
<ul>
<li>After the buffer replay is caught up, switch the current version pointer from N to N+1. Version N can be kept as a backup. There is no future version anymore (until the next batch job).</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746370648004/3e481863-d626-4135-a2e9-b52c4bc7fb6c.png" alt class="image--center mx-auto" /></p>
<p>Hybrid Stores are a way to implement <a target="_blank" href="https://en.wikipedia.org/wiki/Lambda_architecture">Lambda Architectures</a>, but by merging at write-time, rather than read-time. They can also support <a target="_blank" href="https://www.oreilly.com/radar/questioning-the-lambda-architecture/">Kappa Architectures</a>.</p>
<p><a target="_blank" href="http://venicedb.org">Venice</a> is an open source database implementing the Hybrid Store design pattern, and other proprietary systems do so as well.</p>
]]></content:encoded></item><item><title><![CDATA[The Coupling Cost of Leverage]]></title><description><![CDATA[This is a summary of a recent discussion about making some system A leverage some other system B. The new system B would replace some functionality which system A already had.
The case in favor of A leveraging B was that it would decrease the mainten...]]></description><link>https://philosopherping.com/the-coupling-cost-of-leverage</link><guid isPermaLink="true">https://philosopherping.com/the-coupling-cost-of-leverage</guid><category><![CDATA[leverage]]></category><category><![CDATA[#execution]]></category><category><![CDATA[Coupling]]></category><category><![CDATA[maintenance]]></category><category><![CDATA[dependency management]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Fri, 31 Jan 2025 03:53:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/2zGTh-S5moM/upload/add722a8ab4f909c819e98504d3f3d01.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is a summary of a recent discussion about making some system A leverage some other system B. The new system B would replace some functionality which system A already had.</p>
<p>The case in favor of A leveraging B was that it would decrease the maintenance cost of system A, since more functionality would be “outsourced” to system B (owned by another team). This <em>maintenance gain</em> could be especially significant if system B offers a correct solution to a difficult problem. That being said, some nuances are missing.</p>
<p>Deeply integrating multiple systems with a single shared dependency has pros and cons. It generates more leverage of course, but <a target="_blank" href="https://philosopherping.com/the-four-quadrants-of-leverage">what kind of leverage?</a></p>
<p>If the surface area of the leveraged functionality is large (i.e., lots of APIs), then the more likely it is that any change on either side causes a regression. System A could break the system B, or vice versa, potentially leading to outages. This risk can be mitigated with robust integration testing and other techniques, but in the end it still translates into a productivity cost. These various drags on operations and development can be called <em>coupling cost</em>.</p>
<p>If the <code>maintenance gain - coupling cost &gt; 0</code>, then the leverage is positive on execution, otherwise the leverage is negative on execution.</p>
<p>Reassess this periodically. Yesterday’s great dependency could be today’s liability.</p>
]]></content:encoded></item><item><title><![CDATA[Flow vs Deliberate Practice]]></title><description><![CDATA[In his latest podcast, Andrew Huberman interviewed Cal Newport.
One of the many things they discussed in the interview is the contrast between the state of flow, and deliberate practice. Cal says that some people have been trying to reconcile these t...]]></description><link>https://philosopherping.com/flow-vs-deliberate-practice</link><guid isPermaLink="true">https://philosopherping.com/flow-vs-deliberate-practice</guid><category><![CDATA[deliberate]]></category><category><![CDATA[deliberate practice]]></category><category><![CDATA[flow]]></category><category><![CDATA[practice]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[concentration]]></category><category><![CDATA[distractions]]></category><category><![CDATA[cal newport]]></category><category><![CDATA[Andrew huberman]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Sat, 16 Mar 2024 18:05:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/gyXPnjCxSlA/upload/0ca34aef12099fa7afbbbc1ceef98379.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In his <a target="_blank" href="https://podcasts.apple.com/us/podcast/huberman-lab/id1545953110?i=1000648734230">latest podcast</a>, <a target="_blank" href="https://www.linkedin.com/in/andrew-huberman">Andrew Huberman</a> interviewed Cal Newport.</p>
<p>One of the many things they discussed in the interview is the contrast between the state of <a target="_blank" href="https://en.wikipedia.org/wiki/Flow_(psychology)">flow</a>, and <a target="_blank" href="https://en.wikipedia.org/wiki/Practice_(learning_method)#Deliberate_practice">deliberate practice</a>. Cal says that some people have been trying to reconcile these two approaches, but he argues they are actually quite different.</p>
<p>Flow is a state of mind where one performs some task intuitively. Time flies by. The end result may be high quality, perhaps the best one can do (at a given time).</p>
<p>Deliberate practice, on the other hand, is a state of peak exertion. It is trying to learn something you don’t know yet, or improving some weaker aspect of it. Time does not fly by, in fact every second may be excruciating. The end result is getting better at the thing being practiced.</p>
<p>Flow is about performing at peak capacity, while deliberate practice is about lifting the peak higher.</p>
<p>Neither states can be achieved if distracted, but that does not make them one and the same.</p>
<p>Cal Newport is the author of <a target="_blank" href="https://amzn.to/3PoKRYO">Deep Work</a>*, a book I’ve read and heartily recommend.</p>
<hr />
<p>*As an Amazon Affiliate I earn from qualifying purchases. You can support my blog by buying through this link.</p>
]]></content:encoded></item><item><title><![CDATA[Stale Emails]]></title><description><![CDATA[The value of an email is inversely proportional to its age.
In order to properly benefit from time off, it is better to disconnect fully, so it is commonly accepted wisdom that one shouldn't read emails on the beach. But in addition to that, I recomm...]]></description><link>https://philosopherping.com/stale-emails</link><guid isPermaLink="true">https://philosopherping.com/stale-emails</guid><category><![CDATA[email]]></category><category><![CDATA[Vacation]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[team]]></category><category><![CDATA[leadership]]></category><category><![CDATA[teambuilding]]></category><category><![CDATA[teamwork]]></category><category><![CDATA[busfactor]]></category><category><![CDATA[slack]]></category><category><![CDATA[messaging]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Fri, 01 Mar 2024 16:39:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/DCg103FwjCg/upload/3c1f216286bee0237be60a740707e17b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The value of an email is inversely proportional to its age.</p>
<p>In order to properly benefit from time off, it is better to disconnect fully, so it is commonly accepted wisdom that one shouldn't read emails on the beach. But in addition to that, I recommend not reading emails that came in during that time <em>at all</em>.</p>
<p>Why does this work? Because the people you work closely with should already know that you have upcoming time off, and have already gotten any time-sensitive context from you before that. And those you don't work closely with should be able to get what they're looking for from your teammates.</p>
<p>If your <a target="_blank" href="https://en.wikipedia.org/wiki/Bus_factor"><code>bus_factor</code></a> <code>== 1</code>, fix that. Let others lead too, make yourself replaceable. Be a good example for your team by NOT being online while you're on vacation. Come back fully recharged, and encourage your teammates to do the same.</p>
<p>Here's the template I've used for my auto-responder for many years:</p>
<blockquote>
<p>Hi,</p>
<p>I’m on vacation until &lt;date&gt;.</p>
<p>This email will not be read, so please slack me after this date if it is still important then.</p>
<p>For support, please email &lt;team_support_email&gt; or consult the #&lt;team_support_channel&gt; slack channel.</p>
<p>For anything else, please email my manager at &lt;manager_email&gt;.</p>
<p>-F</p>
</blockquote>
<p>Feel free to steal it, tweak it, use it!</p>
]]></content:encoded></item><item><title><![CDATA[The Four Quadrants of Leverage]]></title><description><![CDATA[Leverage is often seen as helpful: get more output from a given input. Yet leverage can also increase difficulty, e.g. a push up with elevated feet.
Organizations that pursue leverage may want standardization, reuse, specialization and separation of ...]]></description><link>https://philosopherping.com/the-four-quadrants-of-leverage</link><guid isPermaLink="true">https://philosopherping.com/the-four-quadrants-of-leverage</guid><category><![CDATA[leverage]]></category><category><![CDATA[technical-leverage]]></category><category><![CDATA[craft]]></category><category><![CDATA[software craftsmanship]]></category><category><![CDATA[#execution]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Thu, 08 Feb 2024 15:57:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/zbF-lW3k1QU/upload/a1edaa4ab364d1fb3ce02adda1859582.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Leverage is often seen as helpful: get more output from a given input. Yet leverage can also increase difficulty, e.g. a push up with elevated feet.</p>
<p>Organizations that pursue leverage may want standardization, reuse, specialization and separation of concern. Organizations that avoid it may instead reward ownership, tight integration, scrappiness and waiting for no one. Both have pros and cons. Regardless, it would be desirable for the industry to have a vocabulary to discuss leverage.</p>
<p>We should evaluate how leveraging something affects execution and craft:</p>
<ul>
<li><p><strong>Execution:</strong> faster/easier versus slower/harder</p>
</li>
<li><p><strong>Craft:</strong> higher versus lower quality</p>
</li>
</ul>
<p>These two dimensions are fundamentally independent, and both can be either positive or negative. We can thus map four quadrants, with craft as the horizontal axis, and execution as the vertical one:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1707406019064/64424618-e631-4d13-b82d-7be2ad9f1a04.png" alt class="image--center mx-auto" /></p>
<p>Some organizational cultures assume that leverage is miraculous (top right quadrant) while others think it is catastrophic (bottom left). However, in reality, the most common scenarios are the top left and bottom right ones!</p>
<p>We can make better leverage decisions by considering these tradeoffs. A given project may benefit from quick and dirty <em>execution leverage</em>, and be negatively impacted by the detour of <em>craft leverage</em>. In another project, the reverse may be true. Of course, one should always try to avoid <em>catastrophic leverage</em>.</p>
<p>Get in the habit of asking: what kind of leverage is it?</p>
]]></content:encoded></item><item><title><![CDATA[Thermodynamics of Software Complexity]]></title><description><![CDATA[As an industry, we tend to obsess over complexity and how to reduce it, but that may not be the ideal frame of mind.
During early iterations, we may come up with a design which is strictly better than another, but we rapidly exhaust these low hanging...]]></description><link>https://philosopherping.com/thermodynamics-of-software-complexity</link><guid isPermaLink="true">https://philosopherping.com/thermodynamics-of-software-complexity</guid><category><![CDATA[architecture]]></category><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[design principles]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Tue, 07 Mar 2023 16:10:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/5q5K8Q3x6e4/upload/70e2f747d9276989ac4fc8eca5c14fd3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As an industry, we tend to obsess over complexity and how to reduce it, but that may not be the ideal frame of mind.</p>
<p>During early iterations, we may come up with a design which is strictly better than another, but we rapidly exhaust these low hanging fruits. We end up with many local optimums, without a clear global one.</p>
<p>If we conclude that one these alternatives is the global optimum, it is often a contextual judgment. In other words, we are faced with tradeoffs, and decide that some dimension is more valuable than another.</p>
<p>Once we reach the stage where we compare refined alternatives, then we usually don’t have any opportunity left to reduce complexity, but rather, we merely move it around. We may think we reduced it but that could be an illusion due to complexity having moved outside our scope of ownership (e.g. we dumped the complexity on the users, instead of solving it).</p>
<p>Software is like a thermodynamic system. You cannot <em>just</em> increase temperature while keeping everything else the same. Increasing temperature will also increase pressure. If you increase temperature while keeping pressure fixed, then you’ll need a larger volume, and so on. <a target="_blank" href="https://en.wikipedia.org/wiki/Ideal_gas_law">Something's gotta give</a>.</p>
<p>How do you navigate these design comparisons when something seems too good to be true and some side effect may be hidden?</p>
]]></content:encoded></item><item><title><![CDATA[Miniliths and Macroservices]]></title><description><![CDATA[Back in the days, it was not that crazy to pack a whole LAMP stack in a single box. If your website made it big maybe you’d split your database onto a separate rig.
Then scale was all the craze, both technologically and organizationally. It was not g...]]></description><link>https://philosopherping.com/miniliths-and-macroservices</link><guid isPermaLink="true">https://philosopherping.com/miniliths-and-macroservices</guid><category><![CDATA[architecture]]></category><category><![CDATA[design patterns]]></category><category><![CDATA[trends]]></category><category><![CDATA[history]]></category><category><![CDATA[Future]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Sun, 05 Mar 2023 02:39:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/6F2I3dPQ73U/upload/6f31666488d96cf229e1d4f40ecd8c4e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Back in the days, it was not that crazy to pack a whole <a target="_blank" href="https://en.wikipedia.org/wiki/LAMP_(software_bundle)?wprov=sfti1">LAMP</a> stack in a single box. If your website made it big maybe you’d split your database onto a separate rig.</p>
<p>Then scale was all the craze, both technologically and organizationally. It was not good enough to replicate your monolith; the cool kids also split theirs into microservices. We’ve been in this era for more than a decade, but the pendulum is starting to swing back the other way…</p>
<p>In large web companies, a request hitting a front-end can then touch hundreds or more mid-tier, back-end, cache and database servers. This is the epitome of the microservices architecture, but also where the edifice starts crumbling under its own weight. By compartmentalizing, we built a <em>Conway-esque symmetry of the sprawling org chart</em>. Unfortunately, it is impossible to make this many servers work flawlessly, quickly, all the time. Tail latency degrades the more moving parts are involved.</p>
<p>Microservices are becoming bulkier again, because their owners don’t want to pay the latency and reliability costs of RPCs. Services which heavily query databases can be refactored to <a target="_blank" href="https://youtu.be/pJeg4V3JgYo?t=1700">eagerly cache</a> the entire dataset.</p>
<p>Can a stateful service really be called "micro"? Or is it more of a <em>macroservice</em>? Or perhaps a microlith? Minilith. Multiliths?</p>
<p>It’s a brave new world out there.</p>
]]></content:encoded></item><item><title><![CDATA[Existential Cache]]></title><description><![CDATA[A common use for a cache is to front a database, in order to improve latency, throughput or both. If the use case depends on these improved characteristics in order to survive, then we say that the cache is existential.
In other words, the use case c...]]></description><link>https://philosopherping.com/existential-cache</link><guid isPermaLink="true">https://philosopherping.com/existential-cache</guid><category><![CDATA[cache]]></category><category><![CDATA[Databases]]></category><category><![CDATA[architecture]]></category><category><![CDATA[design patterns]]></category><category><![CDATA[SRE]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Sun, 26 Feb 2023 23:04:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/r2WnUfvOnmQ/upload/ff1fc68ec28324133168e61302725b4f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A common use for a cache is to front a database, in order to improve latency, throughput or both. If the use case depends on these improved characteristics in order to survive, then we say that the cache is existential.</p>
<p>In other words, the use case ceases to exist if the cache is down. This can be due to excessive throughput hitting the database, thus taking it down as well. Or it could be due to the clients being incapable of operating efficiently enough when too many requests are served slowly (e.g. due to threads being tied up too long and thus causing backpressure).</p>
<p>This risk can be mitigated to some extent by always reading from both the database and the cache (rather than only on cache misses), thus ensuring that the database must be provisioned for full throughput, but this doesn’t guarantee that clients can gracefully sustain degraded latency.</p>
<p>If a cache is existential, then the uptime of the end-to-end architecture equals:</p>
<p><code>db_uptime * client_uptime * cache_uptime</code></p>
<p>Where <code>cache_uptime</code> means the proportion of time where the cache hit ratio remains above the level required for the use case to survive.</p>
<p>A non-existential cache, on the other hand, provides the more favorable end-to-end uptime of:</p>
<p><code>db_uptime * client_uptime</code></p>
<p>Do you leverage existential caches in your architectures?</p>
]]></content:encoded></item><item><title><![CDATA[Keyhole Design Pattern]]></title><description><![CDATA[The keyhole design pattern can be used when we wish to expose only a fraction of an object to another component.
If an object’s capabilities are deemed too powerful to pass around nilly willy, we may want to constrain the scope of what gets passed to...]]></description><link>https://philosopherping.com/keyhole-design-pattern</link><guid isPermaLink="true">https://philosopherping.com/keyhole-design-pattern</guid><category><![CDATA[design patterns]]></category><category><![CDATA[constraint]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Fri, 17 Feb 2023 15:06:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/fIDiBtC41ZQ/upload/06169969a6e04a349bcd5c8b9f88ac96.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The keyhole design pattern can be used when we wish to expose only a fraction of an object to another component.</p>
<p>If an object’s capabilities are deemed too powerful to pass around nilly willy, we may want to constrain the scope of what gets passed to the bare minimum needed by the recipient.</p>
<p>One way to achieve this pattern is for the powerful class to implement an interface containing only the functions to be exposed. Then the recipient can specify this interface as the type of parameter it receives.</p>
<p>Another way, if the scope of interest is just a single function, is to pass a handle of that function.</p>
<p>These techniques can be used to reduce coupling between classes. Instead of a class having the potential to call any functions of another class, it gets to call only a subset. Increasing the scope of the interaction requires widening the keyhole, which is an opportunity to reflect on whether the class structure has grown too tangled.</p>
]]></content:encoded></item><item><title><![CDATA[Premature Abstraction]]></title><description><![CDATA[We often hear about "premature optimization" in the context of performance. We also hear about the virtues of "clean code", which means many different things to different people, e.g., immutability, single responsibility, decoupling, etc.
This last o...]]></description><link>https://philosopherping.com/premature-abstraction</link><guid isPermaLink="true">https://philosopherping.com/premature-abstraction</guid><category><![CDATA[design patterns]]></category><category><![CDATA[abstraction]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Fri, 11 Nov 2022 20:11:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/NSwyO3jcbrA/upload/v1668197371737/tXKkIiJQV0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We often hear about "premature optimization" in the context of performance. We also hear about the virtues of "clean code", which means many different things to different people, e.g., immutability, single responsibility, decoupling, etc.</p>
<p>This last one, decoupling, says that two components interacting together should know as little as possible about each other. This is typically achieved via an abstraction. A <a target="_blank" href="https://www.linkedin.com/posts/niksumeiko_reactjs-cleancode-activity-6996453625807970304-HXLA">recent post on LinkedIn</a> reminded me that some folks really love abstractions.</p>
<p>Many years ago, I heard a good rule of thumb, which stuck with me:</p>
<blockquote>
<p>A well-designed abstraction needs at least three implementations.</p>
</blockquote>
<p>The issue with an abstraction that is backed only by a single implementation is that it will almost inevitably be over-fitted. The abstraction will closely espouse the shape of its one implementation and will therefore not be very generic, thus making it awkward to plug-in alternative implementations under the hood. Leaky abstractions are an example of this phenomenon.</p>
<p>This does not necessarily mean we should never write abstractions with just one or two implementations, just that it might be a red flag. Do we really need it, or is it a premature abstraction? Do we need to think extra carefully to avoid over-fitting? What future implementations which don't exist yet might we want to plug-in, and do those inform the design of the abstraction?</p>
]]></content:encoded></item><item><title><![CDATA[The True Value of Documentation]]></title><description><![CDATA[What if the goal of writing documentation was not to accurately describe a system? How it works, how to use it, etc.
What if, instead, the goal was to describe how the system should work?
Surely, it can’t be right to treat documentation like a fantas...]]></description><link>https://philosopherping.com/the-true-value-of-documentation</link><guid isPermaLink="true">https://philosopherping.com/the-true-value-of-documentation</guid><category><![CDATA[documentation]]></category><category><![CDATA[Philosophy]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Sun, 23 Oct 2022 02:32:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/AVYo3X6XZYg/upload/187eacff9b4d3a0c9c60ad9421b8f2fb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What if the goal of writing documentation was <em>not</em> to accurately describe a system? How it works, how to use it, etc.</p>
<p>What if, instead, the goal was to describe how the system <em>should</em> work?</p>
<p>Surely, it can’t be right to treat documentation like a fantasy novel. It does need to be factual.</p>
<p>And yet, if we write how the system should work, then analyze the gap between reality and this fantasy, we can go and plug that gap.</p>
<p>Or put another way, if one writes factual documentation, and struggles to make it easy to understand, it may be that the issue lies not in the doc, but in the thing being documented.</p>
<p>A similar idea is that your FAQ is your bug list. Why does this question need to be asked in the first place? Can’t the system be sufficiently intuitive to side step the question completely?</p>
<p>In the end, it may be possible to document how the system should work <em>and</em> how it does work, though it may require some iteration(s) of tweaking the system itself to get there.</p>
]]></content:encoded></item><item><title><![CDATA[Hello World]]></title><description><![CDATA[New blog. Trying out Hashnode. We’ll see where it goes.]]></description><link>https://philosopherping.com/hello-world</link><guid isPermaLink="true">https://philosopherping.com/hello-world</guid><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Sun, 23 Oct 2022 01:57:20 GMT</pubDate><content:encoded><![CDATA[<p>New blog. Trying out Hashnode. We’ll see where it goes.</p>
]]></content:encoded></item></channel></rss>