<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://premortemculture.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://premortemculture.dev/" rel="alternate" type="text/html" /><updated>2026-06-01T06:58:30+00:00</updated><id>https://premortemculture.dev/feed.xml</id><title type="html">Premortem Culture</title><subtitle>Premortem Culture: in which we systematically explore what could possibly go wrong.</subtitle><entry><title type="html">Privacy for Infrastructure: Addressing Problems at the Root</title><link href="https://premortemculture.dev/jekyll/update/2026/05/30/privacy-for-infrastructure.html" rel="alternate" type="text/html" title="Privacy for Infrastructure: Addressing Problems at the Root" /><published>2026-05-30T20:00:00+00:00</published><updated>2026-05-30T20:00:00+00:00</updated><id>https://premortemculture.dev/jekyll/update/2026/05/30/privacy-for-infrastructure</id><content type="html" xml:base="https://premortemculture.dev/jekyll/update/2026/05/30/privacy-for-infrastructure.html"><![CDATA[<p>(This post was adapted from a <a href="https://fpf.org/wp-content/uploads/2021/06/Session-1-1-Privacy-for-Infostruction-by-OMadadhain-Young.pdf">talk</a> that I <a href="https://youtu.be/lenVTvDMWxM">presented</a> at <a href="https://fpf.org/fpf-event/pepr-2021-conference-on-privacy-engineering-practice-and-respect-2/">PEPR 2021</a> with <a href="https://www.linkedin.com/in/gary-young-bb9b28/">Gary Young</a>.)</p>

<p>One should generally solve problems as far down in the stack as possible; privacy is no exception.  This post explores what shifting left looks like in privacy, why it’s a good idea, how to do it, and where some of the pain points may be.</p>

<h2 id="terminology">Terminology</h2>

<ul>
  <li><strong>system</strong>: application, product, or service</li>
  <li><strong>infrastructure</strong>: a system that provides other systems with capabilities.  (<a href="https://www.youtube.com/watch?v=Wpzvaqypav8&amp;t=1247s">“Infrastructure: If Anything Exciting Happens, We’ve Done It Wrong”</a>.)
    <ul>
      <li>examples: storage, networking, data processing systems, server frameworks, libraries, system integrations</li>
    </ul>
  </li>
  <li><strong>product</strong>: a user-facing system (e.g. application)</li>
</ul>

<p>Infrastructure has <strong>clients</strong> (the systems that use it); products have <strong>users</strong> (the people that use it).</p>

<p><strong>Data-agnostic</strong><sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> infrastructure is not aware of the kinds of data it handles, that is, it doesn’t handle privacy-relevant data differently from other data.)  The data-agnostic approach tends to be simpler and more general; however, sometimes infrastructure is made data-agnostic to avoid responsibility for solving privacy problems (“we just handle data, it’s the client’s job to do it right”).<sup id="fnref:2"><a href="#fn:2" class="footnote" rel="footnote" role="doc-noteref">2</a></sup></p>

<h2 id="why-should-privacy-be-infrastructures-problem">Why should privacy be infrastructure’s problem?</h2>

<p>First, because the infrastructure can be part of the problem independent of whatever its clients may be using it for.  Leaving infrastructure out of the privacy design of a system makes about as much sense as leaving it out of the security design.  (And while security provides essential tools for solving privacy problems, not all privacy problems are security problems.)</p>

<p>Second, because <strong>solving problems in infrastructure is how you solve them at scale</strong>; this is just as true for privacy problems as for any other sort.</p>

<p>For this reason, data-agnostic infrastructure should receive extra scrutiny to ensure that it’s not missing opportunities to fix problems once rather than requiring each of their clients to do so.</p>

<p>Finally, because infrastructure that solves engineering problems at scale <strong>may create privacy problems at scale</strong> if it doesn’t make a point of solving them.  Privacy problems that aren’t handled systematically across an organization will at best be re-solved repeatedly, inconsistently, and expensively.  Infrastructure and automation are a much better way to solve those problems than spreadsheets and a lot of human attention.</p>

<p><strong>Exception</strong>: if only one client has a particular problem, that may indicate that the client should be solving that problem.</p>

<h2 id="infrastructure-privacy-design-review">Infrastructure privacy design review</h2>

<p>Privacy design reviews for both infrastructure and products each need to consider the following factors:</p>

<ul>
  <li>what privacy-relevant data are handled?
    <ul>
      <li>infrastructure often generates its own logs, error messages, etc. based on clients’ activity; these may therefore include privacy-relevant data</li>
    </ul>
  </li>
  <li>what are the relevant purposes for handling this data?</li>
  <li>data minimization: did you need to collect that?  do you need to keep it?</li>
  <li>access control: who has access, and how is that controlled?</li>
  <li>retention: are data being properly removed by request and on schedule?</li>
  <li>dependencies: what does this system depend on?</li>
</ul>

<p>However, infrastructure review needs to be at a <strong>different level of abstraction</strong> than product review: it needs to answer the question <em>”how does the infrastructure help its clients to meet <strong>their</strong> data handling needs?”</em></p>

<p>As a result, infrastructure review may need to approach some topics differently.  Not all of these topics apply to all kinds of infrastructure; for instance, infrastructure that doesn’t store anything won’t have retention risks.</p>

<h3 id="use-casespurpose-limitations">use cases/purpose limitations</h3>

<p>Infrastructure’s purpose for handling privacy-relevant data is usually only to provide the service.  However, if it has other purposes (such as building predictive models that incorporate data from multiple clients) those must be compatible with declared purpose limitations, and documented, just as they are for products.</p>

<p>Infrastructure may also perform data governance functions on behalf of its clients, including:</p>

<ul>
  <li>annotation management: parsing, generation/inference, propagation</li>
  <li>governance: purpose limitations, access control, join restrictions</li>
</ul>

<p>It’s important for infrastructure to document any data governance roles it may have, so that clients know what they can, and can’t, depend on infrastructure to handle for them.</p>

<p><strong>what can possibly go wrong</strong></p>

<ul>
  <li>Serving infrastructure builds a model from client data to make serving more efficient; as a side effect, it predicts user behavior for clients that have user data.  The ads team gets access to this model, and starts using it for ads targeting, in contravention of the purpose limitations for this data.  Lawyers ensue.</li>
  <li>Data processing infrastructure does not propagate annotations of data that pass through it from its inputs to its outputs.  This creates a hole in the affected clients’ data governance that they can’t easily patch.</li>
</ul>

<h3 id="access-control">access control</h3>

<p>Infrastructure generally should not allow clients to access each others’ data; setting up per-client access controls should be part of onboarding.</p>

<p>Infrastructure that stores or serves client data may have internal access paths for operational or debugging purposes.  Historically many infrastructure system owners have built their systems so that any member of their team has free access to those internal paths.  Infrastructure review should consider whether:</p>

<ul>
  <li>limitations on such access (such as multi-party authorization, access logging, structured justification, or redaction by default) are appropriate</li>
  <li>client team members should be given access to those internal paths</li>
</ul>

<p>Infrastructure that’s responsible for the fundamental building blocks of access control (e.g. cryptography, authentication/authorization checks, identity and access management) should be among the most carefully scrutinized.  Security review should catch most problems in this area, but their evaluation of risks may be different than privacy’s, and any integrations with data governance are likely to be more in privacy’s wheelhouse.</p>

<p><strong>what can possibly go wrong</strong></p>

<ul>
  <li>Infrastructure team leaves access to their internal logs open to all of their clients. One client snoops on other clients’ logs, uses this for business advantage, and then a whistleblower in that client’s organization tells the media what happened and where the data came from.  Lawyers ensue.</li>
</ul>

<h3 id="retentiondeletion-data-export-data-updating">retention/deletion, data export, data updating</h3>

<p>Storage infrastructure that handles privacy-relevant data should either support these functions automatically, or provide client APIs for them.  Otherwise the infrastructure team would need to handle such requests manually.</p>

<p>Since these functions (especially full deletion) can take time, infrastructure should document any propagation delays that their system may introduce.</p>

<p>All of this applies to primary data stores, caches, and backups.</p>

<p><strong>what can possibly go wrong</strong></p>

<ul>
  <li>Infrastructure neither handles data export for its clients, nor empowers its clients to handle it.  All export requests (whether from users or in response to legal requests) have to be handled manually by the infrastructure team.</li>
  <li>Infrastructure team decides to add a new backup system that covers all client data, and decides to keep backups around indefinitely because storage is cheap and they want to help their clients recover their data.  This places them out of compliance with retention deadlines for clients that handle privacy-relevant data.  Lawyers ensue.</li>
</ul>

<h3 id="notice-consent-control">notice, consent, control</h3>

<p>These don’t generally apply directly to infrastructure directly, but the infrastructure may be able to empower its clients to set, or inspect, the status of:</p>

<ul>
  <li>notices: has a specified user seen the most recent version of this notice?</li>
  <li>consent moments: what has the user consented to?</li>
  <li>other controls, such as user-to-user sharing or blocking actions</li>
</ul>

<h3 id="aggregating-and-obscuring-data">aggregating and obscuring data</h3>

<p>This includes anonymization, pseudonymization, redaction, deidentification, and generating summary statistics.  As with access control mechanisms, these are both important to do consistently across your organization, and easy to do in a way that introduces subtle vulnerabilities, so ideally infrastructure will provide common solutions.</p>

<p><strong>what can possibly go wrong</strong></p>

<ul>
  <li>Infrastructure does not provide an anonymization solution.  Clients use a mixture of strategies (mostly redaction) in an attempt to obscure the identities of their users; this makes data governance difficult and inconsistent across the organization.  A data scientist pulls together data from different clients and uses it to reidentify many users.</li>
</ul>

<h2 id="configuration">Configuration</h2>

<p>The amount and complexity of per-client configuration needed has direct operational effects on clients, and indirect effects on user protections.</p>

<p>Where configuration is possible, or necessary, there are two critical elements:</p>
<ul>
  <li>responsibility: who does the configuration, infrastructure team or client team?</li>
  <li>complexity: how is the configuration performed?
    <ul>
      <li>simple UI</li>
      <li>creating/editing configuration files</li>
      <li>writing code</li>
    </ul>
  </li>
</ul>

<p>In descending order of preference, this is what infrastructure per-client configuration should look like:</p>

<ol>
  <li>Zero configuration</li>
  <li>Good stance by default</li>
  <li>Good stance requires per-client configuration</li>
  <li>Good stance requires client-side implementation</li>
  <li>Good stance not possible</li>
</ol>

<p>We use a storage system as a motivating example in the sections below.</p>

<h3 id="zero-configuration">Zero configuration</h3>

<p>Infrastructure automatically performs all relevant privacy functions for all clients; no configuration is possible.</p>

<ul>
  <li>all data are encrypted with client-specific keys that are generated at onboarding and managed via IAM integrations</li>
  <li>retention timelines are enforced for all data</li>
  <li>all aspects of data export are managed by infrastructure</li>
</ul>

<h3 id="good-stance-by-default">Good stance by default</h3>

<p>Infrastructure does something conservatively appropriate for all clients, but provides configuration options.</p>

<ul>
  <li>data are encrypted by default; different encryption options available; client may choose to manage their own keys</li>
  <li>clients can override default retention timelines</li>
  <li>clients can customize data export formats</li>
</ul>

<h3 id="good-stance-requires-per-client-configuration">Good stance requires per-client configuration</h3>

<p>Infrastructure can be configured to satisfy client needs.</p>

<ul>
  <li>clients must specify that they want their data encrypted, and manage their own keys</li>
  <li>clients must opt into specify a deletion timeline, and describe the data to be deleted</li>
  <li>clients must configure data export mechanisms and protocols</li>
</ul>

<h3 id="good-stance-requires-client-side-implementation">Good stance requires client-side implementation</h3>

<ul>
  <li>clients must encrypt their own data</li>
  <li>clients are responsible for keeping track of their data’s age and deleting it to meet retention requirements</li>
  <li>clients must implement data export themselves</li>
</ul>

<h3 id="good-stance-not-possible">Good stance not possible</h3>

<p>The infrastructure’s design does not support the client’s privacy goals.  This is not a value judgement, but it is important that infrastructure makes it clear what privacy goals it does not, or cannot, support so that prospective clients can make informed choices.</p>

<ul>
  <li>infrastructure does not encrypt data, and required data format does not support client-side encryption</li>
  <li>infrastructure does not provide client APIs for data deletion or export</li>
</ul>

<h2 id="change-management">Change management</h2>

<p>Infrastructure systems sometimes need to make client-visible changes.  This can place a large burden on clients, especially if the changes affect per-client configuration or otherwise impact privacy guarantees in
ways that clients have to compensate for.</p>

<p>Infrastructure with open/public APIs may not know who all of its clients are; this can limit its ability to understand and address its clients’ needs, and make change management very difficult.</p>

<p>Examples of changes that may impact privacy guarantees:</p>

<ul>
  <li>changing retention implementation timelines or policies</li>
  <li>starting, or stopping, logging of access requests, or changing what information is in them</li>
  <li>creating new dependencies that have data governance implications</li>
</ul>

<p>Options for infrastructure for helping clients navigate change include:</p>
<ul>
  <li>provide stability: allow clients to stay with a given version of infrastructure as long as possible</li>
  <li>own client configurations: allow infrastructure owners to edit/maintain client configurations so that they can make some changes without clients’ intervention
    <ul>
      <li>this may create other risks</li>
    </ul>
  </li>
  <li>make changes with plenty of notice, documentation, and support
    <ul>
      <li>this requires reasonably robust communication channels with clients</li>
    </ul>
  </li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>Infrastructure teams generally want to help solve their clients’ problems.  Privacy can and should work directly with these teams to help them to understand where there are opportunities for their infrastructure to solve privacy problems–and thus create value–for all of their clients.</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>This is related to, but not identical with, the GDPR concept of a <a href="https://commission.europa.eu/law/law-topic/data-protection/rules-business-and-organisations/obligations/controllerprocessor/what-data-controller-or-data-processor_en">data processor (as opposed to a data controller)</a>. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2">
      <p>A more subtle version of the “it’s the clients’ responsibility” problem arises in the very common situation in which there are multiple layers of infrastructure and no clear division of responsibility. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[(This post was adapted from a talk that I presented at PEPR 2021 with Gary Young.)]]></summary></entry><entry><title type="html">When is a policy not a policy?</title><link href="https://premortemculture.dev/jekyll/update/2026/05/18/when-is-a-policy-not-a-policy.html" rel="alternate" type="text/html" title="When is a policy not a policy?" /><published>2026-05-18T20:00:00+00:00</published><updated>2026-05-18T20:00:00+00:00</updated><id>https://premortemculture.dev/jekyll/update/2026/05/18/when-is-a-policy-not-a-policy</id><content type="html" xml:base="https://premortemculture.dev/jekyll/update/2026/05/18/when-is-a-policy-not-a-policy.html"><![CDATA[<p>Answer: when it has undocumented exceptions.</p>

<p>Sometimes it’s appropriate to make an exception to a policy; policy authors can’t always anticipate all possible relevant future situations.</p>

<p>However, when an exception is necessary, it’s important to recognize that <strong>making an exception means that the policy has changed</strong>. There are a few different ways to address this:</p>

<ul>
  <li>a documented list of exceptions, which the policy links to</li>
  <li>an update to the policy to change…
    <ul>
      <li>…the wording, if the exception was needed because the policy wasn’t clear</li>
      <li>…the meaning, if the exception was needed because circumstances have changed</li>
    </ul>
  </li>
</ul>

<p>In either case, the change itself–whether to add an exception or update the policy text–should be documented with:</p>

<ul>
  <li>a precise and complete description of the exception/change</li>
  <li>who requested it, and why</li>
  <li>who granted it, and why</li>
</ul>

<p>(If these details are sensitive, access to them can be restricted.)</p>

<p>Making such updates explicit and visible simplifies future uses of, and changes to, the policy. More importantly, however, it requires the people involved to be explicit about the nature of, and motivation for, the change.</p>

<p>Notes:</p>

<ul>
  <li>Explicit documentation may entail some difficult conversations, if the initially presented reason for the exception is “X wants to be able to do something that the policy prohibits”. <strong>The more difficult the conversation, the more important it is to have it</strong>.</li>
  <li>If a policy gets too complex to be easily understood, it may be time to look into either simplifying it, or automating enforcement.</li>
</ul>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Answer: when it has undocumented exceptions.]]></summary></entry><entry><title type="html">Properties of Assessments</title><link href="https://premortemculture.dev/jekyll/update/2026/05/15/properties-of-assessments.html" rel="alternate" type="text/html" title="Properties of Assessments" /><published>2026-05-15T20:00:00+00:00</published><updated>2026-05-15T20:00:00+00:00</updated><id>https://premortemculture.dev/jekyll/update/2026/05/15/properties-of-assessments</id><content type="html" xml:base="https://premortemculture.dev/jekyll/update/2026/05/15/properties-of-assessments.html"><![CDATA[<p>Google’s privacy and compliance assessments and processes evolved considerably over my time there.
I was responsible for responding to one of Google’s first privacy assessment requests, and I helped
to refine the latest versions of the process prior to my departure. These are some of my reflections
on what makes for a good assessment framework.</p>

<h2 id="collect-information-if-and-only-if-it">Collect information if (and only if) it…</h2>

<h3 id="drives-decisions">…drives decisions</h3>
<p>Information in the assessment you’re collecting should be necessary and sufficient to enable
informed decisions about the system being assessed.</p>

<h3 id="is-relevant-to-the-system-being-assessed">…is relevant to the system being assessed</h3>

<p>Some examples:</p>

<ul>
  <li>An assessment that’s designed for a user-facing product may include questions that aren’t relevant to
back-end/infrastructure systems, and vice versa.
    <ul>
      <li>Back end systems may not need to detail their notice/consent stories, because they don’t usually
interact directly with users.</li>
      <li>Front end systems that depend on infrastructure to handle automated data deletion should not have to
document the details of that infrastructure’s operation.</li>
    </ul>
  </li>
  <li>If your organization is introducing widespread use of LLMs, your assessment may now need to (at least) identify the models being used, and the contexts in which they’re used.</li>
</ul>

<h3 id="relates-to-a-documented-need">…relates to a documented need</h3>

<p>Each element of an assessment should connect to a documented policy that describes what’s needed, and why. System owners are generally happier about answering questions if they’re backed by a policy that’s easy to understand.</p>

<p>Such documentation also makes it easier for people performing the assessments to make sure they’re getting what’s needed (and not collecting what isn’t).</p>

<h3 id="is-unique">…is unique</h3>

<p>System assessment can be a frustrating process for the owners of the system. A common source of frustration is being asked to repeatedly provide the same, or similar, information. Opportunities include:</p>

<ul>
  <li>As assessment needs and formats evolve, make sure that information in existing assessments is maintained and migrated.</li>
  <li>Where different assessing organizations (privacy, security, compliance, etc.) have overlapping needs, those organizations should collaborate to avoid redundancy by combining assessments, or making use of each others’ assessment data.</li>
</ul>

<h2 id="collection-should-be">Collection should be…</h2>

<h3 id="minimum-effort">…minimum effort</h3>

<p>In decreasing order of preference, assessment information collection should be</p>

<ol>
  <li><strong>automatic</strong>
    <ul>
      <li>example: programmatically checking whether all data in a repository are encrypted</li>
    </ul>
  </li>
  <li><strong>self-explanatory</strong> (person completing the assessment can do so without needing to read additional documentation)
    <ul>
      <li>example: “click here to run the encryption checker, and copy/paste its output here”</li>
    </ul>
  </li>
  <li><strong>quick and easy</strong> to complete with supplied documentation
    <ul>
      <li>example: “follow these instructions to run the encryption checker and report results”</li>
    </ul>
  </li>
  <li><strong>straightforward</strong> to complete with supplied documentation
    <ul>
      <li>example: “follow these instructions to install, configure, and run the encryption checker, extract the results from the database that it creates, and update the linked spreadsheet with the results”</li>
    </ul>
  </li>
  <li><strong>complex</strong> (requiring analysis, research, and/or clarifying discussion)
    <ul>
      <li>example: respondent must figure out what files are in scope, find a way to check encryption status, and understand what results should be reported</li>
    </ul>
  </li>
</ol>

<p>“Can this be automated?” is a good first question; “can it be [better] documented and simplified?” is a good follow-up if the first answer is “no”.</p>

<p>You may never get to the point for a given assessment framework where all questions are answerable in bite-sized chunks, but it’s a good aspiration.</p>

<h3 id="timely">…timely</h3>

<p>Assessment questions should be asked as soon as they can be answered (and the answers acted on), but no sooner.</p>

<h3 id="informed-by-prior-findings">…informed by prior findings</h3>

<p>If it’s generated as part of the assessment process, and it’s important, write it down so that future assessments can make use of it. Some examples:</p>

<ul>
  <li>If an assessment results in an agreement for future behavior of the system, recording that agreement explicitly as part of the assessment can avoid re-litigating it later, and helps to ensure that all parties share an understanding of its provisions.</li>
  <li>In general, mature organizations should rely on individuals’ memories as little as possible: memories fade, and people move on to other roles or organizations.</li>
</ul>

<h3 id="scoped">…scoped</h3>

<ul>
  <li>The system being assessed (and thus the boundaries of what needs assessment) should be clearly defined, including how it connects/relates to other systems.</li>
</ul>

<h2 id="collected-information-should-be">Collected information should be…</h2>

<h3 id="searchablediscoverable">…searchable/discoverable</h3>

<p>If the information is worth recording, it’s worth making it findable. (Recording the information in a structured format can be helpful.)</p>

<h3 id="shown-only-when-helpful">…shown (only) when helpful</h3>

<p>Not all collected information needs to be presented to all viewers in all contexts. If an assessment has multiple audiences or use cases, this may also imply that it should have multiple views.</p>

<h3 id="interpretable">…interpretable</h3>

<p>“Self-explanatory” is better than “well-documented”, and “well-documented” is better than “not documented” or “requires expert interpretation”.</p>

<h3 id="verifiable">…verifiable</h3>

<p>It should be possible to tell whether the assertions included in an assessment are accurate. This requires that they be precise and checkable.</p>

<h3 id="self-maintaining">…self-maintaining</h3>

<p>It’s generally better for an assessment to link to the source of truth for any extracted information than to include a copy of that information; copies can easily fall out of date.</p>

<h3 id="self-contained">…self-contained</h3>

<p>It shouldn’t be necessary to track down several different sources (issue trackers, design documents, assessments, email/chat transcripts) in order to have the full state of the assessment.</p>

<p>An assessment should include a reference to the time at which it was completed.</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Google’s privacy and compliance assessments and processes evolved considerably over my time there. I was responsible for responding to one of Google’s first privacy assessment requests, and I helped to refine the latest versions of the process prior to my departure. These are some of my reflections on what makes for a good assessment framework.]]></summary></entry><entry><title type="html">About the author</title><link href="https://premortemculture.dev/jekyll/update/2026/04/06/about-the-author.html" rel="alternate" type="text/html" title="About the author" /><published>2026-04-06T20:00:00+00:00</published><updated>2026-04-06T20:00:00+00:00</updated><id>https://premortemculture.dev/jekyll/update/2026/04/06/about-the-author</id><content type="html" xml:base="https://premortemculture.dev/jekyll/update/2026/04/06/about-the-author.html"><![CDATA[<p>I’m <a href="https://www.linkedin.com/in/joshua-o-madadhain/">Joshua O’Madadhain</a>.
I’ve been a software engineer, privacy engineer, and applied researcher at Google, Microsoft, and
various startups since the mid-90s. Much of my work has related to software infrastructure, and
I’ve developed a healthy respect for identifying and preventing problems before they happen.</p>

<p>In my spare time, I co-create and develop Java graph libraries (<a href="https://github.com/jrtom/jung">JUNG</a>
and <a href="https://github.com/google/guava/wiki/GraphsExplained">Guava</a>’s <code class="language-plaintext highlighter-rouge">common.graph</code>).</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[I’m Joshua O’Madadhain. I’ve been a software engineer, privacy engineer, and applied researcher at Google, Microsoft, and various startups since the mid-90s. Much of my work has related to software infrastructure, and I’ve developed a healthy respect for identifying and preventing problems before they happen.]]></summary></entry></feed>