<?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: Hunnicuttt</title>
    <description>The latest articles on DEV Community by Hunnicuttt (@dmidlo).</description>
    <link>https://dev.to/dmidlo</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%2F207084%2F06c32f19-77d7-4ae3-806b-cf6f88ee2d0c.png</url>
      <title>DEV Community: Hunnicuttt</title>
      <link>https://dev.to/dmidlo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmidlo"/>
    <language>en</language>
    <item>
      <title>Why T-SQL’s Most Misunderstood Keyword Is Actually It's Safest</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Fri, 25 Apr 2025 02:07:03 +0000</pubDate>
      <link>https://dev.to/dmidlo/why-t-sqls-most-misunderstood-keyword-is-actually-its-safest-4a5e</link>
      <guid>https://dev.to/dmidlo/why-t-sqls-most-misunderstood-keyword-is-actually-its-safest-4a5e</guid>
      <description>&lt;p&gt;&lt;em&gt;Table of Contents&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When T-SQL Control Flow Silently Fails
&lt;/h2&gt;

&lt;p&gt;Ever debugged a T-SQL batch where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CONTINUE&lt;/code&gt; skipped your loop increment ...and you hit an infinite loop?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TRY/CATCH&lt;/code&gt; swallowed a failure ...and the error vanished without a trace?&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;CASE&lt;/code&gt; statement updated rows ...and quietly set half of them to &lt;code&gt;NULL&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If so, you're not alone &lt;strong&gt;&lt;em&gt;and you're not crazy&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;T-SQL looks structured, but it isn't. It has blocks, but no scopes. It has flow keywords, but no control model. It compiles code that fails silently. And it rewards syntax that hides behavior.&lt;/p&gt;

&lt;p&gt;That’s why &lt;code&gt;GOTO&lt;/code&gt;, used deliberately, isn’t a throwback to a bygone era or Assembly enthusiasm: it’s the only reliable way to &lt;strong&gt;name&lt;/strong&gt;, &lt;strong&gt;route&lt;/strong&gt;, and &lt;strong&gt;trace&lt;/strong&gt; control flow in procedural T-SQL.&lt;/p&gt;




&lt;h2&gt;
  
  
  GOTO as a First-Class Control Tool in T-SQL
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;When you must write procedural logic in T-SQL, GOTO is often the safest and most maintainable control tool and should be taught early to those writing non-trivial row-wise logic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In most imperative programming environments, &lt;code&gt;GOTO&lt;/code&gt; is rightly treated with caution, even skepticism. But T-SQL is a different animal. Its procedural model isn’t fully structured, and the control constructs it provides are shallow at best. In this environment, where flow control is flat and error paths are invisible by default, &lt;code&gt;GOTO&lt;/code&gt; can offer something rare: clarity.&lt;/p&gt;

&lt;p&gt;Over years of building and debugging real-world T-SQL logic from row processors to audit paths to conditional logging. I’ve come to rely on &lt;code&gt;GOTO&lt;/code&gt; not as a fallback, but as a &lt;strong&gt;deliberate control structure&lt;/strong&gt;. It’s not a relic here. It’s infrastructure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;T-SQL is simply one dialect of SQL, For other flavors of SQL these procedural operations are either handled more like a 'standard' imperative programming language; for others, the best practice is to keep procedural code within the application layer &lt;strong&gt;&lt;em&gt;(more on this later)&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preamble&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
When T-SQL Control Flow Silently Fails
&lt;/li&gt;
&lt;li&gt;GOTO as a First-Class Control Tool in T-SQL&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Intro&lt;/strong&gt;  &amp;lt;- &lt;strong&gt;You Are Here&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
T-SQL Is Not a Structured Language
&lt;/li&gt;
&lt;li&gt;
Why People Say GOTO Is Dangerous | and Why That Doesn’t Apply to T-SQL
&lt;/li&gt;
&lt;li&gt;
First Principles Over Abstractions
&lt;/li&gt;
&lt;li&gt;GOTO Makes Flow Explicit&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Flow Structure and Semantics&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
T-SQL’s Structured Syntax ≠ Structured Execution
&lt;/li&gt;
&lt;li&gt;
Set-Based Logic Isn’t Safer | It’s Just Quieter
&lt;/li&gt;
&lt;li&gt;
GOTO Safety Through Loud Failures
&lt;/li&gt;
&lt;li&gt;
The Real Risk of GOTO: Spaghetti Flow and Scope Violations
&lt;/li&gt;
&lt;li&gt;
Structured Alternatives Hide the Real Risk: Silent Data Mutation
&lt;/li&gt;
&lt;li&gt;State Machine via Status Column + Controlled Loop&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Declarative Constructs and Their Limits&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
CROSS APPLY and Table-Valued Functions: Structured but Limited
&lt;/li&gt;
&lt;li&gt;
CTEs with CASE Logic: Declarative Isn’t Control Flow
&lt;/li&gt;
&lt;li&gt;
Cursors Aren’t a Safer Alternative
&lt;/li&gt;
&lt;li&gt;Structured Failure vs. Silent Stalls&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Why Not Just Use...&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Why “Just Use a Function or Procedure” Doesn’t Always Work in T-SQL
&lt;/li&gt;
&lt;li&gt;
Functions Aren’t a Substitute for Flow
&lt;/li&gt;
&lt;li&gt;
Why Stored Procedures Don’t Replace GOTO for Local Flow
&lt;/li&gt;
&lt;li&gt;
Other Workarounds that are Just Plain Anti-Patterns
&lt;/li&gt;
&lt;li&gt;
Structured Error Handling: Guarded Branches, Not TRY/CATCH Abuse
&lt;/li&gt;
&lt;li&gt;
Trigger-Based or Log Table Pattern
&lt;/li&gt;
&lt;li&gt;CLR Functions: Unsafe for Control, Overkill for Flow&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;A Practical Model for Procedural T-SQL&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Functions as Pure Value Expressions
&lt;/li&gt;
&lt;li&gt;
Stored Procedures as Server-Side Composition and Boundaries
&lt;/li&gt;
&lt;li&gt;
GOTO as Inline Control Structure
&lt;/li&gt;
&lt;li&gt;Debug Visibility Without Logging Overhead&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Transactions and Flow Safety&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Using GOTO Inside Transactions: Precise Flow, No Interference
&lt;/li&gt;
&lt;li&gt;Savepoint + GOTO: Controlled Partial Rollbacks&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Discipline Over Syntax&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Structured GOTO in T-SQL: A Discipline-Driven Tool
&lt;/li&gt;
&lt;li&gt;
Why I Reach for GOTO Early in T-SQL
&lt;/li&gt;
&lt;li&gt;GOTO Lives After the Optimizer Dies&lt;/li&gt;
&lt;li&gt;
GOTO Is About Flow Safety, Not Performance
&lt;/li&gt;
&lt;li&gt;
GOTO as Logic Circuit, Not Legacy Syntax
&lt;/li&gt;
&lt;li&gt;A Model That’s Worked&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Cross-Dialect Perspective&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
SQL Dialects: Why GOTO Becomes a Tool in T-SQL | Not a Smell
&lt;/li&gt;
&lt;li&gt;
PL/SQL (Oracle): Structure Enforced by the Language
&lt;/li&gt;
&lt;li&gt;
PL/pgSQL (PostgreSQL): Same Discipline, No Labels Needed
&lt;/li&gt;
&lt;li&gt;
MySQL and MariaDB: Minimal for a Reason
&lt;/li&gt;
&lt;li&gt;
T-SQL: Half a Procedural Language
&lt;/li&gt;
&lt;li&gt;
GOTO Isn’t a Hack Here | It’s Infrastructure
&lt;/li&gt;
&lt;li&gt;When the Language Doesn’t Enforce Flow | You Do&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  T-SQL Is Not a Structured Language
&lt;/h2&gt;

&lt;p&gt;T-SQL is not like C# or Python. Once you enter procedural logic inside a &lt;code&gt;WHILE&lt;/code&gt; loop, a cursor, or a row processor; you’re no longer writing in a declarative model. You're writing imperative logic in a language without strong scoping, block validation, or flow constructs beyond basic &lt;code&gt;IF/WHILE/BEGIN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The assumption that &lt;code&gt;WHILE&lt;/code&gt; and &lt;code&gt;CONTINUE&lt;/code&gt; or nested &lt;code&gt;IFs&lt;/code&gt; provide “structure” is misleading in practice. These are syntactic constructs, not control mechanisms.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why People Say &lt;code&gt;GOTO&lt;/code&gt; Is Dangerous | and Why That Doesn’t Apply to T-SQL
&lt;/h2&gt;

&lt;p&gt;In most general-purpose languages, &lt;code&gt;GOTO&lt;/code&gt; is discouraged because it bypasses structured constructs like loops, blocks, or exception handling. It can skip initialization code, violate scope boundaries, or create control paths that are hard to reason about, particularly in deeply nested or object-oriented environments.&lt;/p&gt;

&lt;p&gt;But none of those constraints apply in T-SQL.&lt;/p&gt;

&lt;p&gt;T-SQL has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No lexical block scope&lt;/li&gt;
&lt;li&gt;No function-local variable lifetimes&lt;/li&gt;
&lt;li&gt;No structured loop constructs with enforced entry/exit&lt;/li&gt;
&lt;li&gt;No inline functions or closures that require controlled call stack behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of this, &lt;code&gt;GOTO&lt;/code&gt; isn’t subverting anything, &lt;strong&gt;it’s operating at the same level as every other control construct&lt;/strong&gt;. There's no hidden context to jump over. You’re writing top-to-bottom procedural logic in a flat execution model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;SkipProcessing&lt;/span&gt;
&lt;span class="c1"&gt;-- initialization here&lt;/span&gt;
&lt;span class="c1"&gt;-- main work&lt;/span&gt;

&lt;span class="n"&gt;SkipProcessing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;-- resume or exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, you’re not bypassing scope or leaving resources uncleaned; you’re making a deliberate control choice in a flat environment. In this setting, &lt;code&gt;GOTO&lt;/code&gt; doesn't undermine the language. It completes it.&lt;/p&gt;




&lt;h2&gt;
  
  
  First Principles Over Abstractions
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I fear not the man who has practiced 10,000 kicks once, but I fear the man who has practiced one kick 10,000 times.”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
~ Bruce Lee&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In procedural T-SQL, the safest path is often the one that’s the &lt;strong&gt;clearest&lt;/strong&gt;, not the most abstract. Too often, developers reach for &lt;code&gt;BEGIN&lt;/code&gt;, &lt;code&gt;WHILE&lt;/code&gt;, or &lt;code&gt;TRY/CATCH&lt;/code&gt; out of habit; not because they fit the problem, but because they mimic structured programming syntax from other languages.&lt;/p&gt;

&lt;p&gt;But T-SQL isn’t structured. It’s flat. And the more you rely on appearance over function, the more likely you are to ship &lt;strong&gt;logic that looks correct but silently fails&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GOTO&lt;/code&gt;, by contrast, doesn’t pretend. It exposes your logic. It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conditional skips (&lt;code&gt;continue&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Early exits (&lt;code&gt;break&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Error routing (&lt;code&gt;goto error handler&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Re-entry and retry logic&lt;/li&gt;
&lt;li&gt;Controlled fallbacks and dispatch jumps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this, &lt;strong&gt;without nesting traps&lt;/strong&gt;, &lt;strong&gt;without state flags&lt;/strong&gt;, and &lt;strong&gt;without mutating shared variables across scopes&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;rowInvalid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;SkipRow&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;fatalError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;TerminateProcess&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In two lines, you can express logic that would take a full block structure, plus careful variable handling, to reproduce with &lt;code&gt;WHILE&lt;/code&gt; or &lt;code&gt;TRY/CATCH&lt;/code&gt;. And because it fails loudly (missing label = runtime error), you’re not guessing what happened.&lt;/p&gt;

&lt;p&gt;One construct.&lt;br&gt;&lt;br&gt;
Ten thousand clean uses.&lt;br&gt;&lt;br&gt;
That’s not a fallback; it’s a foundation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Control Flow Should Follow First Principles, Not Syntax Mimicry&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When designing logic in any language, especially T-SQL-based systems, it's tempting to default to syntactic structures like &lt;code&gt;WHILE&lt;/code&gt;, &lt;code&gt;IF&lt;/code&gt;, or &lt;code&gt;BEGIN&lt;/code&gt; simply because they look familiar. But syntax is not structure. The presence of &lt;code&gt;BEGIN&lt;/code&gt; blocks or indented &lt;code&gt;IF&lt;/code&gt; trees does not imply correctness, traceability, or safety.&lt;/p&gt;

&lt;p&gt;A better starting point is to ask: &lt;em&gt;What is the actual control behavior I need?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do I need to &lt;strong&gt;conditionally skip&lt;/strong&gt; processing?&lt;/li&gt;
&lt;li&gt;Do I need a &lt;strong&gt;named exit&lt;/strong&gt; or &lt;strong&gt;early return&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Do I need to &lt;strong&gt;retry&lt;/strong&gt;, or &lt;strong&gt;redirect logic based on state&lt;/strong&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are &lt;em&gt;control flow primitives&lt;/em&gt; and T-SQL does not expose them directly. &lt;code&gt;GOTO&lt;/code&gt; allows you to build them explicitly.&lt;/p&gt;

&lt;p&gt;Compare these two styles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Structured by syntax&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;CONTINUE&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Structured by behavior&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;SkipRow&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;SkipRow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;StartLoop&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the second makes the skip behavior &lt;em&gt;named, visible, and testable&lt;/em&gt;. Syntax gives you form. First principles give you &lt;strong&gt;function&lt;/strong&gt;. In T-SQL, always choose the latter.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;GOTO&lt;/code&gt; Makes Flow Explicit
&lt;/h2&gt;

&lt;p&gt;Consider a typical &lt;code&gt;WHILE&lt;/code&gt; loop with &lt;code&gt;CONTINUE&lt;/code&gt;, &lt;code&gt;BREAK&lt;/code&gt;, &amp;amp; &lt;code&gt;RETURN&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DECLARE @i INT = 1
DECLARE @val INT
DECLARE @max INT = (SELECT COUNT(*) FROM @WorkTable)

WHILE @i &amp;lt;= @max
BEGIN
    SELECT @val = Value FROM @WorkTable WHERE RowNum = @i

    IF @val IS NULL
        BREAK

    IF @val = 2
    BEGIN
        SET @i += 1
        CONTINUE
    END

    IF @val = 99
    BEGIN
        -- Audit + bail
        RETURN
    END

    -- Main logic
    SET @i += 1
END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While this is readable in isolation, it becomes increasingly difficult to trace flow as complexity increases. Conditional logic is buried in nested blocks, and the sequence of actions becomes harder to follow. Maintenance suffers as developers must scan deeply to understand the logic tree.&lt;/p&gt;

&lt;p&gt;The logic starts simple but becomes hard to trace quickly. There’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A risk of @i not incrementing on every branch&lt;/li&gt;
&lt;li&gt;Hidden side effects in deeply nested conditions&lt;/li&gt;
&lt;li&gt;Confusion around early exit (&lt;code&gt;BREAK&lt;/code&gt;, &lt;code&gt;RETURN&lt;/code&gt;, or silent skip?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even with &lt;code&gt;CONTINUE&lt;/code&gt;, you often still need to manually adjust the loop index to avoid skipping or infinite loops; and &lt;code&gt;RETURN&lt;/code&gt; is an all-or-nothing exit, with no local recovery or audit branch.&lt;/p&gt;




&lt;p&gt;Now compare that to the same logic expressed with &lt;code&gt;GOTO&lt;/code&gt; and labels:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;StartLoop:
    IF @val IS NULL GOTO EndLoop
    IF @val = 2 GOTO SkipRow
    IF @val = 5 GOTO LogAndExit

    -- Work logic
    SET @i += 1
    GOTO StartLoop

SkipRow:
    SET @i += 1
    GOTO StartLoop

LogAndExit:
    INSERT INTO LogTable ...
    GOTO EndLoop

EndLoop:
    PRINT 'Done'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, every flow decision is visible at the top. Each path is labeled clearly. The branching logic is centralized, and there's no need to infer structure from indentation or nesting. This makes it easier to audit, easier to test, and less prone to silent failure.&lt;/p&gt;




&lt;h3&gt;
  
  
  T-SQL’s Structured Syntax ≠ Structured Execution
&lt;/h3&gt;

&lt;p&gt;This distinction often gets lost:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Structured syntax in T-SQL is not structured execution.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;People assume that visible nesting implies flow guarantees. But in T-SQL, that’s false. The engine doesn’t protect you from uninitialized paths, dangling flags, or incomplete logic.&lt;/p&gt;

&lt;p&gt;That’s why &lt;code&gt;GOTO&lt;/code&gt;, when used with discipline, can be safer because it forces you to impose your own structure and label your own intent. You’re not depending on indentation or nesting to signal control flow; you’re making it explicit.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Set-Based Logic Isn’t Safer | It’s Just Quieter&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Set-based logic (&lt;code&gt;CASE&lt;/code&gt;, &lt;code&gt;WHERE&lt;/code&gt;, &lt;code&gt;MERGE&lt;/code&gt;) is often treated as the “safe” or “pure” option in T-SQL, but that’s a misunderstanding of its role. These constructs are great for transformations, but they're &lt;strong&gt;not control flow tools&lt;/strong&gt;. And when misapplied to simulate logic, they introduce some of the most dangerous failure modes in SQL: &lt;strong&gt;silent data mutation&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;CASE&lt;/span&gt; 
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;Paid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Processed'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;Paid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt;
    &lt;span class="c1"&gt;-- forgot ELSE clause&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This compiles. It runs. It even looks fine in a code review &lt;strong&gt;and&lt;/strong&gt; it leaves all other rows with &lt;code&gt;Status = NULL&lt;/code&gt;. No error. No warning. No audit trail.&lt;/p&gt;

&lt;p&gt;Set logic is declarative, it says &lt;em&gt;what&lt;/em&gt; to change, but gives you &lt;strong&gt;no control over when or why&lt;/strong&gt;. It can't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skip based on runtime conditions&lt;/li&gt;
&lt;li&gt;Log or audit per-row&lt;/li&gt;
&lt;li&gt;Short-circuit a loop&lt;/li&gt;
&lt;li&gt;Retry on failure&lt;/li&gt;
&lt;li&gt;Selectively suppress output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With &lt;code&gt;GOTO&lt;/code&gt;, each branch is named, jumpable, traceable. You know what rows you’re skipping, when you're logging, and where you’re exiting. There’s no guesswork and no silent state corruption. That’s not just safer; it’s operationally trustworthy.&lt;/p&gt;




&lt;h2&gt;
  
  
  GOTO Safety Through Loud Failures
&lt;/h2&gt;

&lt;p&gt;One of the strongest operational arguments for structured &lt;code&gt;GOTO&lt;/code&gt; usage in T-SQL is that it fails loudly. In contrast to nested &lt;code&gt;IF&lt;/code&gt; blocks, &lt;code&gt;WHILE&lt;/code&gt; loops, or &lt;code&gt;CASE&lt;/code&gt; expressions that can silently skip execution or leave values unset, &lt;code&gt;GOTO&lt;/code&gt; breaks visibly and immediately when misused.&lt;/p&gt;

&lt;p&gt;For example, a mistyped label:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;ProccessRow&lt;/span&gt; &lt;span class="c1"&gt;-- typo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...will fail at runtime with a clear error. There's no silent fallthrough. You know it. You fix it. It’s done.&lt;/p&gt;

&lt;p&gt;Similarly, jumping to a missing or misaligned logic segment results in a batch error, not a silent bug. That visibility makes &lt;code&gt;GOTO&lt;/code&gt; safer than constructs that compile and execute without doing what you think they do.&lt;/p&gt;

&lt;p&gt;Compare that to this &lt;code&gt;CASE&lt;/code&gt; statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;CASE&lt;/span&gt; 
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;Paid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Processed'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;Paid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt;
    &lt;span class="c1"&gt;-- missing ELSE&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will run without error and leave &lt;code&gt;Status&lt;/code&gt; as &lt;code&gt;NULL&lt;/code&gt; for unexpected input &lt;strong&gt;&lt;em&gt;silently&lt;/em&gt;&lt;/strong&gt;. If your data logic is wrong, it will succeed &lt;strong&gt;incorrectly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Critically: &lt;strong&gt;T-SQL &lt;code&gt;CASE&lt;/code&gt; doesn’t work like a procedural &lt;code&gt;switch&lt;/code&gt;&lt;/strong&gt;, either. It has no fallthrough and no scoped logic blocks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- This will silently fail if Paid is neither 0 nor 1&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;CASE&lt;/span&gt; 
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;Paid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Processed'&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;Paid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There’s no &lt;code&gt;default&lt;/code&gt;, and no enforcement. So while &lt;code&gt;CASE&lt;/code&gt; looks structured, it lacks control semantics and error surfacing.&lt;/p&gt;

&lt;p&gt;In contrast, structured &lt;code&gt;GOTO&lt;/code&gt; ensures you &lt;strong&gt;see every path&lt;/strong&gt;. Labels act like checkpoints, not arbitrary jumps. That’s how you avoid chaos without losing flexibility.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;GOTO&lt;/code&gt;, correctness is never implicit. If the path doesn’t exist, the script stops; and that’s exactly the kind of safety production systems need.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Risk of GOTO: Spaghetti Flow and Scope Violations | and How to Avoid Them
&lt;/h2&gt;

&lt;p&gt;The common argument against &lt;code&gt;GOTO&lt;/code&gt; in any language is that it enables “spaghetti code.” Tangled, nonlinear control flow that’s hard to follow and prone to subtle bugs. This is especially true when labels and jumps are used arbitrarily, across unrelated logic or setup blocks.&lt;/p&gt;

&lt;p&gt;In T-SQL, a typical misuse might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Dangerous GOTO pattern&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;DoWork&lt;/span&gt;

&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'important value'&lt;/span&gt;

&lt;span class="n"&gt;DoWork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="c1"&gt;-- Uses @val, which might not be set&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Logs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;GOTO&lt;/code&gt; bypasses initialization. The result? A silent bug with a NULL insert or incorrect value.&lt;/p&gt;

&lt;p&gt;In the example a bit above, the pattern I advocate avoids this entirely by structuring logic &lt;strong&gt;with clear phases&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Loop entry (&lt;code&gt;StartLoop:&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Evaluation and branching (e.g., &lt;code&gt;IF @val = x GOTO SomeBranch&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Named logic blocks (&lt;code&gt;DoWork:&lt;/code&gt;, &lt;code&gt;SkipRow:&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Centralized loop exit (&lt;code&gt;EndLoop:&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each block is a &lt;strong&gt;deliberate, named target&lt;/strong&gt;. There’s no fallthrough, and each label is only jumped to &lt;strong&gt;after all required state has been prepared&lt;/strong&gt;. This prevents both spaghetti control and uninitialized state errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Structured Alternatives Hide the Real Risk: Silent Data Mutation
&lt;/h2&gt;

&lt;p&gt;The greatest danger in procedural T-SQL is not stylistic misuse; it’s silent failures that corrupt or omit data without detection.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE Orders
SET Status = CASE 
    WHEN Paid = 1 THEN 'Processed'
    WHEN Paid = 0 THEN 'Failed'
    -- forgot ELSE clause
END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code compiles and runs, but it silently leaves data in an unexpected state. There’s no warning. No runtime error. Just incorrect business logic quietly shipping bad data downstream.&lt;/p&gt;

&lt;p&gt;Another example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WHILE @i &amp;lt;= @max
BEGIN
    IF @skip = 1
        CONTINUE -- forgot SET @i += 1 here
END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a hidden infinite loop or skips critical processing. Again, the error is not structural, it's behavioral &lt;strong&gt;&lt;em&gt;and&lt;/em&gt;&lt;/strong&gt; it may not be caught until much later.&lt;/p&gt;

&lt;p&gt;By contrast, &lt;code&gt;GOTO&lt;/code&gt; fails loudly and visibly. A mistyped label triggers an immediate runtime error. A missing jump path creates a direct fault, not a latent data bug. It doesn’t rely on nested logic or block scope to simulate branching.&lt;/p&gt;




&lt;h3&gt;
  
  
  State Machine via Status Column + Controlled Loop
&lt;/h3&gt;

&lt;p&gt;A common workaround in T-SQL is to simulate control flow using status flags in the data itself, often called “status-driven processing.” The idea is to loop through rows, updating a status column (&lt;code&gt;Pending&lt;/code&gt;, &lt;code&gt;Processing&lt;/code&gt;, &lt;code&gt;Failed&lt;/code&gt;, &lt;code&gt;Complete&lt;/code&gt;) and using &lt;code&gt;WHILE&lt;/code&gt; with &lt;code&gt;WHERE Status = 'Pending'&lt;/code&gt; to control which rows get picked up next.&lt;/p&gt;

&lt;p&gt;This works, but it’s a &lt;strong&gt;coarse-grained approximation&lt;/strong&gt; of control flow. It’s slow, requires round-trips to the database, and depends on &lt;strong&gt;side effects stored in table state&lt;/strong&gt; to move logic forward. Worse, the logic that governs transitions is usually split across multiple &lt;code&gt;IF&lt;/code&gt; branches, updates, and sometimes triggers; making reasoning and debugging harder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Tasks&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Processing'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Pending'&lt;/span&gt;

&lt;span class="c1"&gt;-- Later&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Tasks&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Complete'&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;ELSE&lt;/span&gt;
    &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Tasks&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare this to a local &lt;code&gt;GOTO&lt;/code&gt;-based state machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Pending'&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Failed'&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;HandleFailure&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Complete'&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;

&lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;-- Logic here&lt;/span&gt;
    &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Complete'&lt;/span&gt;
    &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="k"&gt;Start&lt;/span&gt;

&lt;span class="n"&gt;HandleFailure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;-- Retry or exit logic&lt;/span&gt;
    &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;

&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids repeated writes, doesn't mutate global state, and keeps the logic readable and local with actual control flow constructs instead of abusing column values.&lt;/p&gt;




&lt;h2&gt;
  
  
  CROSS APPLY and Table-Valued Functions: Structured but Limited
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;CROSS APPLY&lt;/code&gt; and inline table-valued functions (TVFs) are excellent for projecting calculated data or filtering based on runtime logic. But they fall apart when used to simulate &lt;strong&gt;row-wise control flow&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;
&lt;span class="k"&gt;CROSS&lt;/span&gt; &lt;span class="n"&gt;APPLY&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DecideAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TVFs are &lt;strong&gt;purely declarative&lt;/strong&gt; and they &lt;strong&gt;cannot&lt;/strong&gt; perform side effects like logging or updates. Worse, they &lt;strong&gt;cannot access calling context&lt;/strong&gt;, so logic must be fully parameterized and isolated. This makes them great for calculations, but &lt;strong&gt;poor substitutes for control routing&lt;/strong&gt;. You can’t “skip this row,” “jump to fallback,” or “retry” from inside a TVF. They're expressions, not flow tools.&lt;/p&gt;

&lt;p&gt;If you’re trying to simulate a state machine or jump table with &lt;code&gt;CROSS APPLY&lt;/code&gt;, it’s a sign you’re solving a control problem with a projection tool. In these cases, structured &lt;code&gt;GOTO&lt;/code&gt; offers cleaner, more readable flow without forcing awkward decompositions.&lt;/p&gt;




&lt;h2&gt;
  
  
  CTEs with CASE Logic: Declarative Isn’t Control Flow
&lt;/h2&gt;

&lt;p&gt;Common Table Expressions (CTEs) and &lt;code&gt;CASE&lt;/code&gt; statements are often used together in an attempt to simulate per-row branching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;Marked&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="k"&gt;CASE&lt;/span&gt; 
               &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'process'&lt;/span&gt;
               &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;error_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'skip'&lt;/span&gt;
               &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="s1"&gt;'done'&lt;/span&gt;
           &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;WorkQueue&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Marked&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'skip'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works well for &lt;strong&gt;classification&lt;/strong&gt; or &lt;strong&gt;preprocessing&lt;/strong&gt;, but it’s not actual flow control. It doesn’t let you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exit early from a process&lt;/li&gt;
&lt;li&gt;Retry based on dynamic context&lt;/li&gt;
&lt;li&gt;Log conditionally&lt;/li&gt;
&lt;li&gt;Skip downstream logic blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worse, if you forget a &lt;code&gt;CASE&lt;/code&gt; branch or misorder your conditions, T-SQL won’t warn you, it’ll just return NULL or process incorrectly. This pattern is silent by default.&lt;/p&gt;

&lt;p&gt;By contrast, &lt;code&gt;GOTO&lt;/code&gt; logic makes those flows visible, step-by-step, and testable in isolation. &lt;code&gt;CASE&lt;/code&gt; is for expression. &lt;code&gt;GOTO&lt;/code&gt; is for control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cursors Aren’t a Safer Alternative
&lt;/h2&gt;

&lt;p&gt;Cursors are often presented as a “structured” way to process rows in T-SQL but that’s a dangerous misperception. In reality, cursors introduce &lt;strong&gt;stealth failure modes&lt;/strong&gt; that are easy to miss in code review, but catastrophic in production.&lt;/p&gt;

&lt;p&gt;They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are &lt;strong&gt;ceremony-heavy&lt;/strong&gt; and &lt;strong&gt;visually misleading.&lt;/strong&gt; They look safe because they wrap your logic in setup/teardown blocks.&lt;/li&gt;
&lt;li&gt;Depend on &lt;strong&gt;implicit state&lt;/strong&gt; (&lt;code&gt;@@FETCH_STATUS&lt;/code&gt;) instead of explicit control. One missed check and your logic derails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate fetching from logic&lt;/strong&gt;, which creates blind spots in traceability and auditability.&lt;/li&gt;
&lt;li&gt;Can &lt;strong&gt;deadlock silently&lt;/strong&gt; if transitions aren’t handled in exactly the right order.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Here’s the typical trap and why it’s so dangerous:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="n"&gt;my_cursor&lt;/span&gt; &lt;span class="k"&gt;CURSOR&lt;/span&gt; &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;OPEN&lt;/span&gt; &lt;span class="n"&gt;my_cursor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;FETCH&lt;/span&gt; &lt;span class="k"&gt;NEXT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;my_cursor&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;WHILE&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt;&lt;span class="n"&gt;FETCH_STATUS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="k"&gt;CONTINUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- Bug: no FETCH = infinite loop&lt;/span&gt;

    &lt;span class="n"&gt;PRINT&lt;/span&gt; &lt;span class="s1"&gt;'Processing: '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;CAST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;FETCH&lt;/span&gt; &lt;span class="k"&gt;NEXT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;my_cursor&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;

&lt;span class="k"&gt;CLOSE&lt;/span&gt; &lt;span class="n"&gt;my_cursor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;DEALLOCATE&lt;/span&gt; &lt;span class="n"&gt;my_cursor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks structured.&lt;br&gt;&lt;br&gt;
Feels safe.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;It's not.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One missed &lt;code&gt;FETCH&lt;/code&gt; and you’re stuck in an infinite loop, eating CPU, holding locks, stalling downstream jobs.
&lt;/li&gt;
&lt;li&gt;One forgotten &lt;code&gt;CLOSE&lt;/code&gt; and you’re leaking resources that T-SQL has no built-in guardrails to clean up.
&lt;/li&gt;
&lt;li&gt;One misuse of &lt;code&gt;@@FETCH_STATUS&lt;/code&gt; and you’re processing rows you think you skipped, or skipping rows you think you handled.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s not stylistic error. That’s &lt;strong&gt;latent infrastructure risk.&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Structured Failure vs. Silent Stalls
&lt;/h3&gt;

&lt;p&gt;Compare that to a &lt;code&gt;GOTO&lt;/code&gt;-driven pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;StartLoop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="k"&gt;max&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;EndLoop&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;SkipRow&lt;/span&gt;

    &lt;span class="c1"&gt;-- Processing logic&lt;/span&gt;
    &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;StartLoop&lt;/span&gt;

&lt;span class="n"&gt;SkipRow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;StartLoop&lt;/span&gt;

&lt;span class="n"&gt;EndLoop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All transitions are &lt;strong&gt;named and visible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;There’s &lt;strong&gt;no hidden state&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A missing label or jump is a &lt;strong&gt;loud failure&lt;/strong&gt;, not a silent corruption&lt;/li&gt;
&lt;li&gt;Control paths are &lt;strong&gt;testable&lt;/strong&gt;, not implied&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;Cursors don't give you structure; they &lt;strong&gt;simulate it through ceremony&lt;/strong&gt;, while hiding fragile, failure-prone behavior behind status flags and nested fetch logic.&lt;/p&gt;

&lt;p&gt;One missed line in a cursor is a &lt;strong&gt;runtime time bomb&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
One missed label in a &lt;code&gt;GOTO&lt;/code&gt; model is a &lt;strong&gt;compile-time error&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s the difference between code that pretends to be safe, and code that actually is.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why “Just Use a Function or Procedure” Doesn’t Always Work in T-SQL
&lt;/h2&gt;



&lt;p&gt;&lt;code&gt;GOTO&lt;/code&gt; doesn’t force you to fracture logic into isolated callable objects. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name common logic blocks&lt;/strong&gt; for reuse&lt;/li&gt;
&lt;li&gt;Keep &lt;strong&gt;shared variable scope intact&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Jump directly between &lt;strong&gt;related branches&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Audit your logic path &lt;strong&gt;linearly&lt;/strong&gt; from top to bottom&lt;/li&gt;
&lt;li&gt;Avoid the complexity and cognitive load of managing state across proc boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, &lt;code&gt;GOTO&lt;/code&gt; gives you the power to &lt;strong&gt;refactor without indirection&lt;/strong&gt;. No extra infrastructure. No loss of locality. No added complexity for something that’s simply: &lt;em&gt;“under this condition, jump there.”&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Functions Aren’t a Substitute for Flow
&lt;/h3&gt;

&lt;p&gt;T-SQL user-defined functions (UDFs) are often recommended as a “cleaner” alternative to inline branching. But that breaks down fast because they’re expressions, not control tools.&lt;/p&gt;

&lt;p&gt;By design, UDFs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Can’t perform side effects.&lt;/strong&gt; No logging, no I/O, no flow-altering actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can’t use non-deterministic functions&lt;/strong&gt; like &lt;code&gt;GETDATE()&lt;/code&gt; or &lt;code&gt;NEWID()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can’t short-circuit logic&lt;/strong&gt; or resume execution mid-batch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some teams think this is just a permissions issue. ...that if their DBAs would allow it, they could use functions for logic control.&lt;/p&gt;

&lt;p&gt;But even in environments where UDFs are fully trusted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You still can’t &lt;code&gt;GOTO&lt;/code&gt; inside a function.&lt;/li&gt;
&lt;li&gt;You can’t skip, re-enter, or dispatch.&lt;/li&gt;
&lt;li&gt;You can’t control &lt;em&gt;flow&lt;/em&gt;. Only &lt;em&gt;values&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Functions are for value projection &lt;strong&gt;not&lt;/strong&gt; execution control. They’re scoped, stateless, and return-bound by design.&lt;/p&gt;

&lt;p&gt;So if your logic says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Under this condition, perform X, then continue”  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s not a value expression. That’s control flow.&lt;/p&gt;

&lt;p&gt;And trying to wedge it into a function just distorts both. The function becomes impure, and your logic becomes unreadable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- This fails: side effects not allowed in UDFs&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;LogRow&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;AuditLog&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RowId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GETDATE&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to log, skip, retry, or exit; Use &lt;code&gt;GOTO&lt;/code&gt;. Use batch blocks. Use explicit, testable flow.&lt;/p&gt;

&lt;p&gt;Functions don’t branch. They compute.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Stored Procedures Don’t Replace &lt;code&gt;GOTO&lt;/code&gt; for Local Flow
&lt;/h3&gt;

&lt;p&gt;Stored procedures are essential for boundary setting and encapsulation, but they are &lt;strong&gt;not&lt;/strong&gt; a substitute for inline control logic. When a process needs to branch, loop, retry, or exit within a &lt;strong&gt;single coherent unit&lt;/strong&gt;, jumping into a stored procedure introduces friction.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;State isolation&lt;/strong&gt;: You must pass all shared variables as parameters and return modified state via output or result sets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow fragmentation&lt;/strong&gt;: Logic is now split across multiple objects, making it harder to trace or debug in one pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No resume&lt;/strong&gt;: Once you call a proc, you’ve left the current control path. There’s no “jump back in” point.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- You wanted to skip to a branch, but now you’re doing this:&lt;/span&gt;
&lt;span class="k"&gt;EXEC&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoSkipRowLogic&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;OUTPUT&lt;/span&gt;
&lt;span class="c1"&gt;-- And you've lost locality and continuity.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By contrast, &lt;code&gt;GOTO SkipRow:&lt;/code&gt; keeps everything local: shared variables, visible control flow, and testable branches &lt;strong&gt;without&lt;/strong&gt; introducing call indirection.&lt;/p&gt;

&lt;p&gt;Use stored procedures for orchestration and external boundaries.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Use &lt;code&gt;GOTO&lt;/code&gt; for internal routing.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Other Workarounds that are Just Plain Anti-Patterns
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Structured Error Handling: Guarded Branches, Not TRY/CATCH Abuse
&lt;/h3&gt;

&lt;p&gt;While &lt;code&gt;TRY/CATCH&lt;/code&gt; exists in T-SQL, it should never replace structured flow logic. Using it as a surrogate for branching leads to brittle, hard-to-audit code paths where intent is hidden inside catch blocks. In a &lt;code&gt;GOTO&lt;/code&gt;-driven model, error handling should be &lt;strong&gt;explicit, scoped, and isolated&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;TRY/CATCH&lt;/code&gt; Is Not a Control Flow Mechanism&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One common misuse in procedural T-SQL is treating &lt;code&gt;TRY/CATCH&lt;/code&gt; as a decision-making construct as a way to route logic based on conditions. This leads to brittle patterns where failures are masked as intended paths, making debugging and data validation harder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;TRY&lt;/span&gt;
    &lt;span class="c1"&gt;-- Attempt risky operation&lt;/span&gt;
    &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Logs&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;Table&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;TRY&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;CATCH&lt;/span&gt;
    &lt;span class="c1"&gt;-- "Handle" condition by rerouting&lt;/span&gt;
    &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;FallbackLogic&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;CATCH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates misleading behavior: a legitimate failure triggers a silent reroute, not a fault. It also encourages catching broad problems with no granularity, losing traceability. Instead, rerouting logic should be done intentionally with labels and &lt;code&gt;GOTO&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;log_attempt_failed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;FallbackLogic&lt;/span&gt;
&lt;span class="c1"&gt;-- Primary logic continues&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reserve &lt;code&gt;TRY/CATCH&lt;/code&gt; for true exception boundaries: transaction rollback, unexpected engine-level failures, or fallback logging. Use GOTO for explicit flow decisions; not as an error trap you hope to "route through."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrap the &lt;strong&gt;entire logic unit&lt;/strong&gt; in a top-level &lt;code&gt;TRY/CATCH&lt;/code&gt; for rollback and audit fallbacks.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;critical branches&lt;/strong&gt;, use &lt;strong&gt;guard clauses&lt;/strong&gt; and conditional exits. Don’t rely on exceptions to control transitions.&lt;/li&gt;
&lt;li&gt;If a branch includes operations that might fail (e.g., I/O, logging), contain that block and label a recovery path like &lt;code&gt;OnError:&lt;/code&gt; but jump there &lt;strong&gt;intentionally&lt;/strong&gt;, not reactively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the error model separate from the flow model. Failures are caught &lt;strong&gt;where they occur&lt;/strong&gt;, but transitions remain &lt;strong&gt;predictable and testable&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Trigger-Based or Log Table Pattern
&lt;/h3&gt;

&lt;p&gt;A common workaround for row-level decision logic is to shift flow control into &lt;strong&gt;triggers&lt;/strong&gt; or &lt;strong&gt;log table side effects&lt;/strong&gt;. The idea is: rather than controlling logic inline, insert audit records or intermediate flags and let downstream consumers (other procs, reports, apps) infer the result.&lt;/p&gt;

&lt;p&gt;This trades &lt;em&gt;explicit flow control&lt;/em&gt; for &lt;em&gt;delayed interpretation&lt;/em&gt;, which introduces significant risks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Race conditions&lt;/strong&gt;: logic now depends on external consumers seeing the correct log state, in the correct order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debug complexity&lt;/strong&gt;: it's difficult to trace &lt;em&gt;why&lt;/em&gt; a row was skipped or handled differently without reconstructing a timeline from logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent failures&lt;/strong&gt;: if the log step fails silently (e.g., due to a null value or FK constraint), the main process continues unaware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By contrast, a structured &lt;code&gt;GOTO&lt;/code&gt; flow keeps the logic &lt;strong&gt;in one place&lt;/strong&gt;, under &lt;strong&gt;explicit control&lt;/strong&gt;, with &lt;strong&gt;fail-fast semantics&lt;/strong&gt;. It avoids hidden branches and decouples logic from logging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ShouldSkip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;SkipRow&lt;/span&gt;
&lt;span class="c1"&gt;-- instead of: INSERT INTO Log WHERE Reason = 'Skipped' AND hope someone notices&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Triggers and logging are &lt;em&gt;adjuncts&lt;/em&gt; to control, not substitutes for it. &lt;code&gt;GOTO&lt;/code&gt; keeps logic and flow local, linear, and testable.&lt;/p&gt;




&lt;h3&gt;
  
  
  CLR Functions: Unsafe for Control, Overkill for Flow
&lt;/h3&gt;

&lt;p&gt;While T-SQL supports the creation of CLR (Common Language Runtime) functions using .NET, they're rarely a good fit for control flow logic and never a replacement for GOTO in procedural scenarios.&lt;/p&gt;

&lt;p&gt;CLR functions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolated in execution&lt;/li&gt;
&lt;li&gt;Expensive to compile, load, and maintain&lt;/li&gt;
&lt;li&gt;Opaque to query plans and runtime diagnostics&lt;/li&gt;
&lt;li&gt;Bound by permission models that can complicate deployment and sandboxing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More importantly, they do &lt;strong&gt;not solve&lt;/strong&gt; the core problem: managing flow &lt;em&gt;inside&lt;/em&gt; procedural SQL logic. You still can't jump, skip, retry, or exit loops conditionally without falling back into T-SQL constructs.&lt;/p&gt;

&lt;p&gt;Here's a (bad) example of using a CLR function to simulate flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- SQL wrapper around a CLR function that returns true/false&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsAuditRequired&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EntityId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;EXEC&lt;/span&gt; &lt;span class="n"&gt;LogChange&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EntityId&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't control flow, it's function call routing. The logic still lives &lt;em&gt;elsewhere&lt;/em&gt;, and now you're debugging SQL and C# at the same time.&lt;/p&gt;

&lt;p&gt;CLR may be powerful, but it’s an integration tool, not a replacement for readable, testable SQL control paths.&lt;/p&gt;




&lt;p&gt;This is the pattern I've kinda always used for this. &lt;code&gt;GOTO&lt;/code&gt; is not a fallback in my mind; It's my first reach. It is a control structure that, when used with discipline, provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clearly named flow branches&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consistent loop entry and exit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fast, visible error detection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Low cognitive overhead for tracing logic&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s true that &lt;code&gt;GOTO&lt;/code&gt; can be misused, but the same is true for every control construct in T-SQL. What matters is visibility and traceability of logic. In this regard, structured &lt;code&gt;GOTO&lt;/code&gt; patterns are safer than WHILE/CONTINUE nesting or cursor-based iteration, and far safer than set-based updates without strict guards.&lt;/p&gt;

&lt;p&gt;In a language that already lacks full procedural scaffolding, &lt;code&gt;GOTO&lt;/code&gt;; when used correctly... is the best tool available for controlled, testable flow IMHO.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Model for Procedural T-SQL
&lt;/h2&gt;

&lt;p&gt;Over the years, I’ve settled into a consistent approach to writing procedural T-SQL. One that’s worked well across a range of use cases, from data shaping to logging to security-driven view generation.&lt;/p&gt;

&lt;p&gt;It centers on treating SQL’s constructs intentionally, based on their real capabilities rather than how they’re described in general programming discussions.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Functions as Pure Value Expressions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I treat T-SQL functions the way a functional programmer might treat pure functions from lambda calculus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic&lt;/li&gt;
&lt;li&gt;Stateless&lt;/li&gt;
&lt;li&gt;Side-effect free&lt;/li&gt;
&lt;li&gt;Composable and testable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use them for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filtering and conditional logic&lt;/li&gt;
&lt;li&gt;Column projections&lt;/li&gt;
&lt;li&gt;Encapsulated expressions inside a query&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a function starts to need side effects, data access, or conditional branching, that’s a clear signal to me: it’s no longer a value expression. At that point, I refactor it into either a stored procedure or a local control block inside a batch.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Stored Procedures as Server-Side Composition and Boundaries&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In my work, stored procedures act as a server-side interface between the database and its consumers. I use them when I need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apply role-based access control (e.g., user-specific filtering)&lt;/li&gt;
&lt;li&gt;Parameterize a view-like experience&lt;/li&gt;
&lt;li&gt;Materialize intermediate datasets&lt;/li&gt;
&lt;li&gt;Encapsulate application-facing query logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They aren’t where I put per-row decision logic. They’re orchestration layers, more like controller endpoints than flow engines.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;code&gt;GOTO&lt;/code&gt; as Inline Control Structure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Where I do manage row-wise behavior such as skipping rows, logging based on conditions, or handling exceptions; I use &lt;code&gt;GOTO&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Not casually, and not arbitrarily. But intentionally, as a means of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Naming logical branches in a way that’s self-documenting&lt;/li&gt;
&lt;li&gt;Keeping control flow in one place, rather than scattering it across nested &lt;code&gt;IF&lt;/code&gt; blocks&lt;/li&gt;
&lt;li&gt;Maintaining local scope and variable continuity without externalizing logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives me the ability to manage flow clearly and directly, without deeply nested logic or fragmented code paths.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Debug Visibility Without Logging Overhead&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One technique I rely on heavily when using structured &lt;code&gt;GOTO&lt;/code&gt; flow is &lt;strong&gt;conditional trace output via &lt;code&gt;@Debug = 1&lt;/code&gt;&lt;/strong&gt;. It’s a pattern that lets you expose &lt;strong&gt;control transitions at runtime&lt;/strong&gt;, without littering the logic path with permanent logging.&lt;/p&gt;

&lt;p&gt;When used correctly, it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Branch-level observability&lt;/strong&gt; without side effects&lt;/li&gt;
&lt;li&gt;Runtime replay of logic transitions&lt;/li&gt;
&lt;li&gt;Lightweight hooks for testing and trace validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A practical pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt; 
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;PRINT&lt;/span&gt; &lt;span class="s1"&gt;'Routing: @val = 99 → LogAndExit'&lt;/span&gt;
    &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;LogAndExit&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No extra logging infra. No side channels. Just an inline diagnostic switch that turns on traceability when you need it and disappears when you don’t.&lt;/p&gt;

&lt;p&gt;In complex batches or loops with multiple branches (&lt;code&gt;SkipRow&lt;/code&gt;, &lt;code&gt;TerminateProcess&lt;/code&gt;, &lt;code&gt;RetryWrite&lt;/code&gt;), this kind of diagnostic flag gives you &lt;strong&gt;behavioral insight&lt;/strong&gt; without distorting the logic itself. It’s also self-contained: nothing external to trace, and no downstream coupling.&lt;/p&gt;

&lt;p&gt;The key is &lt;strong&gt;consistency&lt;/strong&gt;. Use label names in the print, and match them exactly to the GOTO target. You’re not just debugging; you’re building a flow transcript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Routing: @val = 3 → SkipRow  
Routing: @val = 99 → LogAndExit  
Routing: RetryCount &amp;gt; 3 → TerminateProcess  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That kind of output tells the full story &lt;strong&gt;without guessing&lt;/strong&gt; what path was taken or why.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using &lt;code&gt;GOTO&lt;/code&gt; Inside Transactions: Precise Flow, No Interference
&lt;/h2&gt;

&lt;p&gt;T-SQL transactions are batch-scoped and control-neutral. &lt;code&gt;GOTO&lt;/code&gt; does &lt;strong&gt;not&lt;/strong&gt; alter transaction scope, nesting level, or isolation behavior. It simply lets you &lt;em&gt;route to the correct transactional action deliberately&lt;/em&gt;, rather than depending on block layout or implicit returns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;TRAN&lt;/span&gt;

&lt;span class="c1"&gt;-- Main path&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ValidationFailed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Bail&lt;/span&gt;

&lt;span class="c1"&gt;-- Happy path&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;
&lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;

&lt;span class="n"&gt;Bail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="k"&gt;ROLLBACK&lt;/span&gt;
&lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;

&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;PRINT&lt;/span&gt; &lt;span class="s1"&gt;'Done'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps commit/rollback logic &lt;strong&gt;centralized and grep-able&lt;/strong&gt;, avoids missed fallthroughs, and works identically to deeply nested &lt;code&gt;IF&lt;/code&gt; blocks, but without the risk of premature exits or dangling paths.&lt;/p&gt;




&lt;h4&gt;
  
  
  Savepoint + GOTO: Controlled Partial Rollbacks
&lt;/h4&gt;

&lt;p&gt;In more complex transactional flows (multi-step staging, partial retries, chained operations), pair &lt;code&gt;GOTO&lt;/code&gt; with &lt;code&gt;SAVE TRANSACTION&lt;/code&gt; and &lt;code&gt;ROLLBACK TO&lt;/code&gt; to regain precise fault isolation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;TRAN&lt;/span&gt;

&lt;span class="n"&gt;SAVE&lt;/span&gt; &lt;span class="n"&gt;TRAN&lt;/span&gt; &lt;span class="n"&gt;Step1&lt;/span&gt;

&lt;span class="c1"&gt;-- Step 1 logic&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ErrorInStep1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;RollbackStep1&lt;/span&gt;

&lt;span class="c1"&gt;-- Step 2 logic&lt;/span&gt;
&lt;span class="n"&gt;SAVE&lt;/span&gt; &lt;span class="n"&gt;TRAN&lt;/span&gt; &lt;span class="n"&gt;Step2&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ErrorInStep2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;RollbackStep2&lt;/span&gt;

&lt;span class="c1"&gt;-- Finalize&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;
&lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;

&lt;span class="n"&gt;RollbackStep2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="k"&gt;ROLLBACK&lt;/span&gt; &lt;span class="n"&gt;TRAN&lt;/span&gt; &lt;span class="n"&gt;Step2&lt;/span&gt;
&lt;span class="c1"&gt;-- fallback logic&lt;/span&gt;
&lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;

&lt;span class="n"&gt;RollbackStep1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="k"&gt;ROLLBACK&lt;/span&gt; &lt;span class="n"&gt;TRAN&lt;/span&gt; &lt;span class="n"&gt;Step1&lt;/span&gt;
&lt;span class="c1"&gt;-- abort logic&lt;/span&gt;
&lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt;

&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;PRINT&lt;/span&gt; &lt;span class="s1"&gt;'Transactional flow complete'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure ensures that &lt;strong&gt;each rollback target is deliberate&lt;/strong&gt;, and failure handling is explicit. There’s no fallthrough, no side-channel signaling, no missed cleanup. It's structured flow in a model that doesn’t enforce structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Structured &lt;code&gt;GOTO&lt;/code&gt; in T-SQL: A Discipline-Driven Tool
&lt;/h2&gt;

&lt;p&gt;I’ve emphasized that using &lt;code&gt;GOTO&lt;/code&gt; in T-SQL isn’t about nostalgia or convenience. It’s about recognizing the realities of the platform: flat execution, limited structural constructs, and a complete lack of flow safety in the constructs most people assume are “structured.”&lt;/p&gt;




&lt;h3&gt;
  
  
  Why I Reach for &lt;code&gt;GOTO&lt;/code&gt; Early in T-SQL
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;GOTO Lives After the Optimizer Dies&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Once you write a &lt;code&gt;WHILE&lt;/code&gt;, a &lt;code&gt;CURSOR&lt;/code&gt;, or a &lt;code&gt;TRY/CATCH&lt;/code&gt; with control-dependent logic you’ve exited the declarative SQL optimizer model. From that point on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The engine is no longer reordering or optimizing operations.&lt;/li&gt;
&lt;li&gt;Row-by-row performance is now &lt;em&gt;your problem&lt;/em&gt;, not the planner’s.&lt;/li&gt;
&lt;li&gt;Every conditional branch, every early exit, every skip decision must now be &lt;strong&gt;explicit and correct&lt;/strong&gt;, or it silently fails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where &lt;code&gt;GOTO&lt;/code&gt; shines. It gives you &lt;strong&gt;named, testable control flow&lt;/strong&gt; after the query engine has stepped back. That’s not an argument against set logic; it’s an acknowledgement of where it stops being useful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GOTO doesn’t make SQL row-wise.&lt;br&gt;&lt;br&gt;
Your logic did.&lt;br&gt;&lt;br&gt;
GOTO just makes it &lt;strong&gt;correct&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;GOTO Is About Flow Safety, Not Performance&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Used correctly, &lt;code&gt;GOTO&lt;/code&gt; adds &lt;strong&gt;zero&lt;/strong&gt; overhead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It doesn’t increase I/O.&lt;/li&gt;
&lt;li&gt;It doesn’t invoke context switches.&lt;/li&gt;
&lt;li&gt;It doesn’t alter query plans.&lt;/li&gt;
&lt;li&gt;It doesn’t fragment memory or affect tempdb.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it &lt;em&gt;does&lt;/em&gt; do is &lt;strong&gt;remove ambiguity&lt;/strong&gt; in procedural logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Bad&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;CONTINUE&lt;/span&gt; &lt;span class="c1"&gt;-- but forgot to increment!&lt;/span&gt;

&lt;span class="c1"&gt;-- Good&lt;/span&gt;
&lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;SkipRow&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;SkipRow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;GOTO&lt;/span&gt; &lt;span class="n"&gt;StartLoop&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Performance suffers &lt;strong&gt;not because of &lt;code&gt;GOTO&lt;/code&gt;&lt;/strong&gt;, but because of &lt;strong&gt;badly structured loops&lt;/strong&gt;, redundant table access, or uncontrolled retries. If you're exfiltrating gigabytes in a loop, the problem isn't your control structure it's that you're looping at all.&lt;/p&gt;




&lt;p&gt;The reason I reach for &lt;code&gt;GOTO&lt;/code&gt; early and not as a last resort is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most logic bugs in T-SQL don’t throw errors.&lt;br&gt;&lt;br&gt;
They silently skip rows, misprocess values, or mutate state of data in place.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s not a style problem. It's a &lt;strong&gt;production risk&lt;/strong&gt;. And it happens all the time inside “safe-looking” constructs like &lt;code&gt;WHILE&lt;/code&gt;, &lt;code&gt;IF&lt;/code&gt;, and &lt;code&gt;CASE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A misplaced increment.&lt;br&gt;&lt;br&gt;
A forgotten ELSE.&lt;br&gt;&lt;br&gt;
A block that exits early but updates late.&lt;/p&gt;

&lt;p&gt;All of that happens silently.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;GOTO&lt;/code&gt;?&lt;br&gt;&lt;br&gt;
If you misuse it; it fails &lt;em&gt;visibly&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
A mistyped label is a crash.&lt;br&gt;&lt;br&gt;
A bad jump is grep-able.&lt;br&gt;&lt;br&gt;
The control path is traceable by eye.&lt;/p&gt;

&lt;p&gt;That’s not a crutch. It’s a feature.&lt;/p&gt;




&lt;p&gt;If the language evolves to offer new constructs; scoped blocks, local functions, lightweight handlers... this model could evolve with it. But today, it continues to scale cleanly and safely, especially for teams that need traceability and control in data logic.&lt;/p&gt;

&lt;p&gt;Teaching &lt;code&gt;GOTO&lt;/code&gt; early in this context isn’t about legacy, it’s about transparency. When used with discipline, it gives you structure, not spaghetti.&lt;/p&gt;

&lt;p&gt;And in procedural SQL, that's often exactly what you need.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;GOTO&lt;/code&gt; as Logic Circuit, Not Legacy Syntax
&lt;/h3&gt;

&lt;p&gt;If I had to summarize my stance, it would be this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you use &lt;code&gt;GOTO&lt;/code&gt;, think about it like a &lt;strong&gt;logic circuit&lt;/strong&gt;, not like a fallback.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Labels are named gates.&lt;/li&gt;
&lt;li&gt;Jumps are controlled transitions.&lt;/li&gt;
&lt;li&gt;The full flow should be traceable top-down, like a state machine.&lt;/li&gt;
&lt;li&gt;There’s no fallthrough, no shared mutable side-channels, no "maybe it happens" blocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s what I mean when I say structured &lt;code&gt;GOTO&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
It’s closer to &lt;strong&gt;Verilog&lt;/strong&gt; than to BASIC.&lt;br&gt;&lt;br&gt;
It’s declarative, not imperative; a way to &lt;strong&gt;model transitions intentionally&lt;/strong&gt;, not just a break-glass jump.&lt;/p&gt;




&lt;h4&gt;
  
  
  A Model That’s Worked
&lt;/h4&gt;

&lt;p&gt;In practice, this approach: pure functions for value expression, stored procedures for access and view orchestration (defining boundaries), &lt;code&gt;GOTO&lt;/code&gt; for structured inline flow has scaled well across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ETL pipelines with Row-by-row mutation logic&lt;/li&gt;
&lt;li&gt;Logging and audit workflows&lt;/li&gt;
&lt;li&gt;Conditional upserts&lt;/li&gt;
&lt;li&gt;Role-sensitive &amp;amp; Policy-enforced data shaping&lt;/li&gt;
&lt;li&gt;Data workflows that require early exits or fallback paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works not because it mimics structured programming, but because it aligns with what T-SQL actually &lt;em&gt;is&lt;/em&gt; flat, batch-oriented, and partially imperative. It respects the language’s boundaries, instead of pretending it offers control structures it doesn’t.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GOTO&lt;/code&gt; doesn’t rely on indentation or nesting to imply flow. It names it. It defines it. It imposes order where the language provides none.&lt;/p&gt;

&lt;p&gt;T-SQL doesn’t give you control structure; you have to bring it yourself.&lt;/p&gt;

&lt;p&gt;Used with discipline, &lt;code&gt;GOTO&lt;/code&gt; provides something most T-SQL constructs don’t: &lt;strong&gt;visibility&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
And in this language, visibility might be the only safety you actually have.&lt;/p&gt;




&lt;h2&gt;
  
  
  SQL Dialects: Why &lt;code&gt;GOTO&lt;/code&gt; Becomes a Tool in T-SQL | Not a Smell
&lt;/h2&gt;

&lt;p&gt;Most SQL dialects either lean into procedural structure &lt;em&gt;or&lt;/em&gt; lean away from it entirely. T-SQL does neither. It occupies a middle ground. Procedural enough to require flow control, but not structured enough to offer safe tools for it.&lt;/p&gt;

&lt;p&gt;That’s why &lt;code&gt;GOTO&lt;/code&gt; isn’t an artifact in this environment; it’s a &lt;em&gt;survival mechanism&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  PL/SQL (Oracle): Structure Enforced by the Language
&lt;/h3&gt;

&lt;p&gt;Oracle’s PL/SQL gets it right: it’s a real procedural language layered on top of SQL. It doesn’t pretend structure exists. It enforces it.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nested functions and procedures with scoped variables&lt;/li&gt;
&lt;li&gt;Named loops with safe exits (&lt;code&gt;EXIT WHEN&lt;/code&gt;, &lt;code&gt;RETURN&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;True block structure with &lt;code&gt;BEGIN ... EXCEPTION ... END&lt;/code&gt; for localized error handling&lt;/li&gt;
&lt;li&gt;Declarative, readable control constructs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In PL/SQL, control flow is first-class. You don’t need to simulate exits or fake structure with labels. You write logic the way you’d sketch a control diagram. Clearly, safely, and locally.&lt;/p&gt;

&lt;p&gt;In that world, &lt;code&gt;GOTO&lt;/code&gt; &lt;em&gt;shouldn’t&lt;/em&gt; be your first tool because the language already gives you the ones you need.&lt;/p&gt;




&lt;h3&gt;
  
  
  PL/pgSQL (PostgreSQL): Same Discipline, No Labels Needed
&lt;/h3&gt;

&lt;p&gt;PostgreSQL’s procedural model is similarly sane. PL/pgSQL doesn’t even &lt;em&gt;have&lt;/em&gt; &lt;code&gt;GOTO&lt;/code&gt; because it doesn’t need it. It enforces structure through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Labeled loops with controlled &lt;code&gt;EXIT&lt;/code&gt; and &lt;code&gt;CONTINUE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Block-local variables with scoped BEGIN blocks&lt;/li&gt;
&lt;li&gt;Predictable error handling through &lt;code&gt;EXCEPTION&lt;/code&gt; clauses&lt;/li&gt;
&lt;li&gt;Clean RETURN semantics from any point in the logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no need to simulate intent with jumps because the structure is &lt;strong&gt;intrinsic&lt;/strong&gt;. That’s not syntactic sugar, that’s enforced logic boundaries.&lt;/p&gt;




&lt;h3&gt;
  
  
  MySQL and MariaDB: Minimal for a Reason
&lt;/h3&gt;

&lt;p&gt;By contrast, MySQL and MariaDB intentionally &lt;em&gt;avoid&lt;/em&gt; procedural flow. Their procedural extensions are underpowered on purpose. No &lt;code&gt;GOTO&lt;/code&gt;, no structured exception model, no nested scope.&lt;/p&gt;

&lt;p&gt;In that model, best practice is simple: &lt;strong&gt;don’t write procedural logic in SQL&lt;/strong&gt;. Keep it declarative. Push complex branching and state to the application layer, where actual languages exist to handle it.&lt;/p&gt;

&lt;p&gt;It’s not elegant but at least it’s honest.&lt;/p&gt;




&lt;h3&gt;
  
  
  T-SQL: Half a Procedural Language
&lt;/h3&gt;

&lt;p&gt;T-SQL lands somewhere in between. It offers just enough procedural scaffolding to &lt;em&gt;look&lt;/em&gt; structured, but not enough to provide safety guarantees.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables live in a flat namespace. No lexical scope.&lt;/li&gt;
&lt;li&gt;There are no labeled loops, no named exits, no inline blocks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TRY/CATCH&lt;/code&gt; is global and brittle. It’s not a structured handler, it’s a catch-all trap.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WHILE&lt;/code&gt;, &lt;code&gt;BREAK&lt;/code&gt;, &lt;code&gt;CONTINUE&lt;/code&gt; are primitive and shallow.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RETURN&lt;/code&gt; works, but only in procedures and functions, and never with nuance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you end up writing control logic without true constructs. And that’s where things get dangerous. Because structured &lt;strong&gt;syntax&lt;/strong&gt; isn’t enough. You need structured &lt;strong&gt;execution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;T-SQL doesn’t give you that. So you &lt;strong&gt;build it yourself.&lt;/strong&gt; Label by label, jump by jump.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;GOTO&lt;/code&gt; Isn’t a Hack Here | It’s Infrastructure
&lt;/h3&gt;

&lt;p&gt;This is the part the critics miss.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GOTO&lt;/code&gt; in T-SQL isn’t about jumping around randomly. It’s about &lt;strong&gt;naming the control model&lt;/strong&gt; you’re forced to write anyway &lt;strong&gt;and&lt;/strong&gt; making that model visible, testable, and auditable.&lt;/p&gt;

&lt;p&gt;It’s not a fallback. It’s the only way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define named logic blocks&lt;/li&gt;
&lt;li&gt;Exit nested flows cleanly&lt;/li&gt;
&lt;li&gt;Handle conditional paths without stack abuse&lt;/li&gt;
&lt;li&gt;Contain state without fracturing it into separate objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In PL/SQL, the language handles this. In PL/pgSQL, structure is enforced. In MySQL/MariaDB, you avoid it.&lt;/p&gt;

&lt;p&gt;In T-SQL, you &lt;strong&gt;simulate control&lt;/strong&gt; because the language doesn’t give it to you.&lt;/p&gt;




&lt;h3&gt;
  
  
  When the Language Doesn’t Enforce Flow | You Do
&lt;/h3&gt;

&lt;p&gt;T-SQL isn't broken. It’s not incomplete. It gives you enough rope to build structure ...or to hang yourself.&lt;/p&gt;

&lt;p&gt;So don’t pretend structure exists where it doesn’t. Don’t lean on indentation and hope for correctness.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Define your own flow. Name it. Test it. Jump to it. Exit from it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s not a workaround. That’s disciplined control in a language that won’t do it for you.&lt;/p&gt;

&lt;p&gt;Structured SQL dialects gave developers the tools.&lt;/p&gt;

&lt;p&gt;T-SQL didn’t.&lt;br&gt;&lt;br&gt;
So we write our own control layer. ...by hand.&lt;br&gt;&lt;br&gt;
Label by label. Line by line.&lt;br&gt;&lt;br&gt;
And make the logic visible.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>sqlserver</category>
      <category>database</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cybersecurity Risk &amp; Shared Liability for MSP Client Verticals</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Wed, 16 Apr 2025 19:59:38 +0000</pubDate>
      <link>https://dev.to/dmidlo/cybersecurity-risk-shared-liability-analysis-for-msp-client-verticals-1a13</link>
      <guid>https://dev.to/dmidlo/cybersecurity-risk-shared-liability-analysis-for-msp-client-verticals-1a13</guid>
      <description>&lt;p&gt;In today’s threat landscape, managed service providers (MSPs) face &lt;strong&gt;shared liability&lt;/strong&gt; exposure when clients in various industries fall victim to cyber incidents. Courts and regulators are increasingly unwilling to accept client ignorance as an excuse – instead holding service providers to a &lt;strong&gt;duty of care&lt;/strong&gt; and even &lt;strong&gt;constructive knowledge&lt;/strong&gt; of risks. The following report analyzes key industry verticals served by a Minnesota-based MSP – including common breach scenarios, latent compliance obligations, and legal precedents – to quantify material cyber risk (in dollars where possible) and illustrate how client shortcomings can become MSP liabilities. Each section provides real-world examples and regulatory trends in the U.S. (with emphasis on Minnesota), followed by a concluding risk governance summary for MSP leadership.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;*Cost of a data breach by industry (average in millions USD, 2023 vs 2024) Cost of a breach reaches nearly $5 million, with healthcare being hit the hardest&lt;sup&gt;&lt;a href="https://therecord.media/ibm-breach-report-cost-rise-to-5-million" rel="noopener noreferrer"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Heavily regulated sectors like healthcare incur the highest breach costs (~$9.8M on average), but even “smaller” incidents in education or public sectors still average in the multi-millions. Professional services and industrial firms also see high impact, reflecting significant downtime and legal penalties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construction &amp;amp; Trades (Roofing, HVAC, etc.)
&lt;/h2&gt;

&lt;p&gt;Construction, contracting, and trades companies increasingly suffer costly cyber incidents despite often thinking “we’re not a target.” In fact, &lt;strong&gt;ransomware&lt;/strong&gt; attacks against construction have surged – one analysis found the construction industry was the &lt;strong&gt;most heavily impacted sector by ransomware in 2023&lt;/strong&gt;&lt;sup&gt;&lt;a href="https://spycloud.com/blog/cybersecurity-industry-statistics-account-takeover-ransomware-data-breaches-bec-fraud/#:~:text=past%2012%20months%2C%20and%2062,complaints%20regarding%20ransomware%20attacks%20on" rel="noopener noreferrer"&gt;2&lt;/a&gt;&lt;/sup&gt;. Such attacks can halt projects and equipment, leading to significant downtime losses. Indirect costs (e.g. contractual penalties for delays) and data exposure (employee or client information) add to the damage &lt;sup&gt;&lt;a href="https://www.scl.org/12965-claims-against-it-service-providers-following-a-cyber-attack/#:~:text=The%20financial%20implications%20of%20a,business%20elsewhere%2C%20impacting%20future%20revenues" rel="noopener noreferrer"&gt;3&lt;/a&gt;&lt;/sup&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;average breach cost in industrial sectors&lt;/strong&gt; (&lt;em&gt;which includes engineering/construction&lt;/em&gt;) jumped by $830k last year, reaching an average cost of $4.7-5.5M per incident&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Real-world examples underscore the risk. A famous case is the &lt;strong&gt;Target data breach of 2013&lt;/strong&gt;, in which attackers infiltrated the retailer via network credentials stolen from a third-party HVAC contractor. This &lt;strong&gt;small trades vendor’s compromise ultimately cost Target over $200 million&lt;/strong&gt; in breach expenses and settlements&lt;sup&gt;&lt;a href="https://adaptive.live/blog/bits-and-breaches-target#:~:text=The%20first%20story%20in%20the,cost%20them%20over%20%24200%20million" rel="noopener noreferrer"&gt;4&lt;/a&gt;&lt;/sup&gt;. Attackers sent phishing emails to the HVAC company (Fazio Mechanical), stole its VPN login to Target, and from there pivoted to steal 40 million credit cards &lt;sup&gt;&lt;a href="https://adaptive.live/blog/bits-and-breaches-target#:~:text=The%20first%20story%20in%20the,cost%20them%20over%20%24200%20million" rel="noopener noreferrer"&gt;4&lt;/a&gt;&lt;/sup&gt;. The incident illustrates how a seemingly low-tech vendor (refrigeration/HVAC) became the attack vector for a massive breach – with liability cascading up to the enterprise. Target paid &lt;strong&gt;$18.5M in multistate settlements&lt;/strong&gt; (including Minnesota) and incurred over &lt;strong&gt;$200M&lt;/strong&gt; in direct losses &lt;sup&gt;&lt;a href="https://www.facilitiesnet.com/hvac/tip/Target-Settles-HVAC-Data-Breach-for-185-Million--39237#:~:text=Facilitiesnet%20www,company%20says%20the%20breach%20cost" rel="noopener noreferrer"&gt;4&lt;/a&gt;&lt;/sup&gt;, while the HVAC firm faced intense scrutiny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latent compliance obligations&lt;/strong&gt; in construction/trades are often overlooked. Many contractors accept &lt;strong&gt;credit card payments&lt;/strong&gt;, making them subject to &lt;strong&gt;PCI-DSS&lt;/strong&gt; standards and even Minnesota’s Plastic Card Security Act (which permits banks to recover breach costs if card data was stored improperly) &lt;sup&gt;&lt;a href="https://www.computerworld.com/article/1687768/minnesota-gives-pci-rules-a-legal-standing.html#:~:text=Computerworld%20www,to%20turn%20a%20core" rel="noopener noreferrer"&gt;6&lt;/a&gt;&lt;/sup&gt;. Construction firms working on government or defense projects may unknowingly handle sensitive building plans or Controlled Unclassified Information – obligating them to &lt;strong&gt;NIST 800-171/CMMC&lt;/strong&gt; cybersecurity controls by contract. Yet many smaller trades are unaware of these duties. Additionally, employee PII (like Social Security numbers on payroll files) must be safeguarded under state data-breach laws. An MSP must recognize that if a contractor client ignores such obligations, a breach could trigger &lt;strong&gt;shared liability&lt;/strong&gt; – e.g. fines for PCI non-compliance or lawsuits for negligence in protecting personal data. In short, the construction sector’s &lt;strong&gt;cyber ignorance can become the MSP’s problem&lt;/strong&gt;, as regulators and clients will ask whether the MSP, as the IT expert, &lt;strong&gt;“should have known”&lt;/strong&gt; and addressed obvious vulnerabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nonprofits &amp;amp; Human Services
&lt;/h2&gt;

&lt;p&gt;Nonprofits, charities, and human services organizations (e.g. disability services, early childhood centers, housing authorities) are &lt;strong&gt;cyber-attack targets&lt;/strong&gt; due to often lax security and valuable personal data. Studies show that &lt;strong&gt;50% of NGOs&lt;/strong&gt; globally reported being targeted by cyberattacks in recent years &lt;sup&gt;&lt;a href="https://www.boardeffect.com/blog/nonprofits-cyberattacks-key-stats/#:~:text=The%20Number%20of%20Ransomware%20Attacks,Is%20Rising" rel="noopener noreferrer"&gt;7&lt;/a&gt;&lt;/sup&gt;, and about &lt;strong&gt;27% of nonprofits have already fallen victim&lt;/strong&gt; to a cyber incident &lt;sup&gt;&lt;a href="https://www.eidebailly.com/insights/articles/2022/1/cybersecurity-within-nonprofits#:~:text=Cybersecurity%20Challenges%20and%20Best%20Practices,Unfortunately%2C%20many%20of%20these" rel="noopener noreferrer"&gt;8&lt;/a&gt;&lt;/sup&gt;. These attacks can expose donor information, beneficiary data (which may include health or financial details), and even the personal info of vulnerable clients. The fallout is costly: one analysis found &lt;strong&gt;nonprofit data breaches affect ~19,000 individuals on average&lt;/strong&gt;, which for a small organization could be its entire donor or client base&lt;sup&gt;&lt;a href="https://www.riprapsecurity.com/blog/nonprofit-data-breaches-amp-their-impact#:~:text=Nonprofit%20Data%20Breaches%20%26%20Their,could%20represent%20the%20entirety" rel="noopener noreferrer"&gt;9&lt;/a&gt;&lt;/sup&gt;. Beyond notification costs, nonprofits risk &lt;strong&gt;reputational damage&lt;/strong&gt; and loss of public trust – an existential threat given their reliance on goodwill.&lt;/p&gt;

&lt;p&gt;A prominent case highlighting third-party risk is the &lt;strong&gt;Blackbaud breach&lt;/strong&gt;. Blackbaud, a cloud service provider for fundraising and donor databases used by countless nonprofits (as well as schools and healthcare orgs), suffered a &lt;strong&gt;ransomware breach in 2020&lt;/strong&gt; affecting over 13,000 client organizations and millions of donor records &lt;sup&gt;&lt;a href="https://www.hunton.com/privacy-and-information-security-law/blackbaud-to-pay-49-5-million-in-data-breach-settlement#:~:text=On%20October%205%2C%202023%2C%20Blackbaud,clients%20and%20donors%20as%20well" rel="noopener noreferrer"&gt;10&lt;/a&gt;&lt;/sup&gt;. Notably, donors and stakeholders didn’t just blame the nonprofits – they &lt;strong&gt;took direct aim at the vendor&lt;/strong&gt;. In fact, a U.S. court ruled that consumers whose data was compromised could &lt;strong&gt;pursue negligence claims directly against Blackbaud&lt;/strong&gt; (the vendor), instead of only suing the nonprofit that entrusted Blackbaud with their data&lt;sup&gt;&lt;a href="https://www.dataprotectionreport.com/2021/10/customers-can-pursue-negligence-claims-directly-against-vendor-2/#:~:text=On%20October%2019%2C%202021%2C%20a,se%20and%20unjust%20enrichment%20claims" rel="noopener noreferrer"&gt;11&lt;/a&gt;&lt;/sup&gt;. This unprecedented ruling signaled that service providers to nonprofits have a direct duty of care to the end individuals. Blackbaud ultimately settled with 49 state Attorneys General for &lt;strong&gt;$49.5 million&lt;/strong&gt; in 2023 over its deficient security and slow breach notification&lt;sup&gt;&lt;a href="https://www.hunton.com/privacy-and-information-security-law/blackbaud-to-pay-49-5-million-in-data-breach-settlement#:~:text=On%20October%205%2C%202023%2C%20Blackbaud,clients%20and%20donors%20as%20well" rel="noopener noreferrer"&gt;10&lt;/a&gt;&lt;/sup&gt;. For Minnesota, which participated in that multistate settlement, this is a clear precedent: state regulators will hold a tech vendor accountable for putting Minnesota residents’ data at risk, even if the vendor’s clients (the nonprofits) were the ones directly collecting that data. &lt;/p&gt;

&lt;p&gt;Nonprofits often operate under &lt;strong&gt;latent compliance obligations&lt;/strong&gt; that leadership may not fully understand. For example, a human services nonprofit providing counseling or healthcare services could be a &lt;strong&gt;HIPAA covered entity&lt;/strong&gt; (or a business associate), but many small nonprofits are unaware that federal health privacy law might apply. Similarly, organizations serving children (e.g. a faith-based childcare center) hold sensitive minors’ data that is protected by laws like &lt;strong&gt;FERPA&lt;/strong&gt; (if education-related records) or state child privacy laws – yet they might not implement required safeguards. Housing authorities and agencies handling sensitive personal/family data may be subject to government data protection rules (Minnesota’s Data Practices Act for government entities&lt;sup&gt;&lt;a href="https://mn.gov/admin/data-practices/data/warnings/breaches/index.jsp#:~:text=Data%20Breach%20Notification%20%2F%20Data,they%20reasonably%20believe%20a" rel="noopener noreferrer"&gt;12&lt;/a&gt;&lt;/sup&gt;, which mandates breach disclosure&lt;sup&gt;&lt;a href="https://mnccc.gov/Guidelines%20for%20Vendor%20Contracts.pdf#:~:text=,Reconciliation%20routines%20%28checksums" rel="noopener noreferrer"&gt;13&lt;/a&gt;&lt;/sup&gt;. &lt;strong&gt;Donor privacy&lt;/strong&gt; is another concern: while no single U.S. law governs donor data security, failing to protect it can trigger state consumer protection enforcement. An MSP must recognize these latent requirements. If a nonprofit client is ignorant of needed controls – for instance, not encrypting health information or lacking any cybersecurity program (as &lt;strong&gt;80% of nonprofits have no formal cyber plan&lt;/strong&gt; in place – the MSP may shoulder blame after an incident&lt;sup&gt;&lt;a href="https://www.boardeffect.com/blog/nonprofits-cyberattacks-key-stats/#:~:text=NGOs%20and%20nonprofits%20raised%20%2430,making%20them%20attractive%20to%20hackers" rel="noopener noreferrer"&gt;14&lt;/a&gt;&lt;/sup&gt;. Regulators can argue the provider (MSP) &lt;strong&gt;had constructive knowledge&lt;/strong&gt; that the client’s security was inadequate and should have advised or implemented better controls. &lt;/p&gt;

&lt;h2&gt;
  
  
  Healthcare &amp;amp; Biotech (Labs, Diagnostics, Research)
&lt;/h2&gt;

&lt;p&gt;Healthcare organizations and biotech firms are &lt;strong&gt;high-value targets&lt;/strong&gt; for cybercriminals and face extensive regulatory scrutiny. The &lt;strong&gt;healthcare industry has the highest average data breach cost of any sector&lt;/strong&gt;, reaching about &lt;strong&gt;$9.77 million per incident&lt;/strong&gt; (as of 2023)&lt;sup&gt;&lt;a href="https://therecord.media/ibm-breach-report-cost-rise-to-5-million" rel="noopener noreferrer"&gt;1&lt;/a&gt;&lt;/sup&gt; – a figure that continues to climb. These costs include not only technical recovery and notification, but also heavy &lt;strong&gt;regulatory penalties&lt;/strong&gt; and litigation. From 2009–2022, over &lt;strong&gt;5,000 healthcare breaches&lt;/strong&gt; (exposing 380+ million patient records) were reported to federal authorities, and an increasing share of these involved &lt;strong&gt;third-party service providers (business associates)&lt;/strong&gt; rather than the healthcare entities themselves&lt;sup&gt;&lt;a href="https://www.dorseyhealthlaw.com/hhs-ocr-settles-hipaa-investigation-with-business-associate-for-350000/#:~:text=Over%20the%20past%20decade%2C%20the,1" rel="noopener noreferrer"&gt;15&lt;/a&gt;&lt;/sup&gt;. This trend reflects how a vendor’s lapse can put a hospital or clinic in jeopardy – and vice versa. &lt;/p&gt;

&lt;p&gt;A striking example is the case of &lt;strong&gt;LabCorp&lt;/strong&gt; and its collections vendor, AMCA. When the vendor suffered a massive breach exposing the data of over &lt;strong&gt;10 million patients&lt;/strong&gt;, LabCorp faced not only class-action lawsuits from patients but also a &lt;strong&gt;shareholder derivative suit&lt;/strong&gt; accusing LabCorp’s directors of failing to ensure the vendor’s cybersecurity was adequate&lt;sup&gt;&lt;a href="https://www.ecjlaw.com/ecj-blog/insure-against-data-breaches-suffered-by-vendors-and-service-providers#:~:text=Corporation%20of%20America%20,healthcare%20and%20financial%20information%20to" rel="noopener noreferrer"&gt;16&lt;/a&gt;&lt;/sup&gt;. In that Delaware case, the claim was essentially that LabCorp’s board &lt;strong&gt;breached its duty of care&lt;/strong&gt; by providing sensitive data to a vendor with deficient security and not monitoring that vendor&lt;sup&gt;&lt;a href="https://www.ecjlaw.com/ecj-blog/insure-against-data-breaches-suffered-by-vendors-and-service-providers#:~:text=Corporation%20of%20America%20,healthcare%20and%20financial%20information%20to" rel="noopener noreferrer"&gt;16&lt;/a&gt;&lt;/sup&gt;. This illustrates that in healthcare, &lt;strong&gt;ignorance is no defense&lt;/strong&gt; – if a covered entity fails to vet and oversee a service provider, its leadership can be held liable for the fallout. Conversely, the service provider can also be directly targeted: multiple diagnostics and research vendors have been hit with lawsuits or enforcement. For instance, when Blackbaud’s incident affected numerous hospital foundations, &lt;strong&gt;hospitals and Blackbaud&lt;/strong&gt; both came under regulatory fire, culminating in that $49.5M multistate settlement requiring Blackbaud to overhaul its security&lt;sup&gt;&lt;a href="https://www.hunton.com/privacy-and-information-security-law/blackbaud-to-pay-49-5-million-in-data-breach-settlement#:~:text=On%20October%205%2C%202023%2C%20Blackbaud,clients%20and%20donors%20as%20well" rel="noopener noreferrer"&gt;10&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Healthcare and biotech SMBs often underestimate &lt;strong&gt;compliance obligations&lt;/strong&gt;. Many think regulations like &lt;strong&gt;HIPAA&lt;/strong&gt; only apply to hospitals, when in fact any entity handling protected health information – from a two-person diagnostics lab to a biotech research startup receiving patient data – is subject to HIPAA’s Security Rule and breach penalties. OCR (Office for Civil Rights) has directly fined small vendors for security failures: e.g. in 2023, a medical software provider &lt;em&gt;MedEvolve&lt;/em&gt; paid $350,000 to settle HIPAA violations after a breach of ~200,000 patient records&lt;sup&gt;&lt;a href="https://www.dorseyhealthlaw.com/hhs-ocr-settles-hipaa-investigation-with-business-associate-for-350000/#:~:text=Over%20the%20past%20decade%2C%20the,1" rel="noopener noreferrer"&gt;15&lt;/a&gt;&lt;/sup&gt;. Notably, OCR emphasized the vendor’s &lt;strong&gt;failure to conduct risk analysis and implement an adequate security program&lt;/strong&gt;. Likewise, Minnesota’s Attorney General has shown willingness to act – in 2012, AG Lori Swanson sued Accretive Health (a billing contractor) after a laptop theft exposed 23,500 patients’ data, leading to a &lt;strong&gt;$2.5M settlement and barring the vendor from operating in MN&lt;/strong&gt;&lt;sup&gt;&lt;a href="https://www.foley.com/insights/publications/2012/08/minnesota-attorney-general-reaches-first-settlemen/#:~:text=,to%20the%20State%20of" rel="noopener noreferrer"&gt;17&lt;/a&gt;&lt;/sup&gt;. In that incident, the hospital client (Fairview Health) was &lt;strong&gt;separately fined $1.5M&lt;/strong&gt; by federal regulators for failing to have a proper business associate agreement and oversight&lt;sup&gt;&lt;a href="https://www.startribune.com/north-memorial-health-care-paying-1-5-million-in-federal-privacy-settement/372490911#:~:text=North%20Memorial%20Health%20Care%20paying,laws%20and%20state%20consumer%20protections" rel="noopener noreferrer"&gt;19&lt;/a&gt;&lt;/sup&gt;, demonstrating that &lt;strong&gt;both&lt;/strong&gt; the service provider and client suffered consequences. Beyond HIPAA, biotech firms engaged in clinical research may handle genetic or health data subject to state laws (for example, Minnesota’s Genetic Information Privacy Act) or GDPR if EU subject data is involved. &lt;strong&gt;FDA&lt;/strong&gt; regulations also require certain cybersecurity practices for networked lab devices or diagnostic software. Many small healthcare and research organizations are unaware of these nuances. An MSP serving this vertical must treat &lt;strong&gt;compliance as a shared responsibility&lt;/strong&gt; – if the client neglects encryption, access controls, or timely breach reporting, regulators can and will claim the MSP “should have known better” and &lt;strong&gt;failed its duty of care&lt;/strong&gt; in preventing obvious security gaps&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Professional Services (Law Firms, Consultants)
&lt;/h2&gt;

&lt;p&gt;Professional service firms such as law offices, accounting or consulting firms are entrusted with highly sensitive client information – making them prime cyber targets and increasingly, legal liability flashpoints. The &lt;strong&gt;average data breach cost for professional services&lt;/strong&gt; firms is around &lt;strong&gt;$5 million&lt;/strong&gt;, reflecting the high stakes of exposed client data, downtime, and potential malpractice claims. Law firms in particular are &lt;strong&gt;under attack&lt;/strong&gt;: in recent years, numerous law firms (large and small) have suffered breaches exposing everything from corporate deal data to personal client details. Ethics rules impose a &lt;strong&gt;duty of confidentiality&lt;/strong&gt; on attorneys, and courts are now seeing clients (and regulators) hold firms accountable when cyber lapses occur.&lt;/p&gt;

&lt;p&gt;A powerful illustration is the 2024 case &lt;em&gt;Mastagni Holstedt, A.P.C. v. Lantech, LLC&lt;/em&gt;, where a California law firm sued its &lt;strong&gt;MSP (managed IT provider)&lt;/strong&gt; after a devastating ransomware attack. The firm had hired the MSP to bolster cybersecurity and backups, yet the firm’s network was breached by the Black Basta ransomware group – encrypting servers and even deleting cloud backups&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;. The law firm alleges the MSP was &lt;strong&gt;negligent&lt;/strong&gt;, citing several failures: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Inadequate backup strategy:&lt;/em&gt; The MSP &lt;strong&gt;advised switching to a cloud-based backup&lt;/strong&gt; but failed to ensure it was ransomware-resistant. During the attack, the cloud backups were &lt;strong&gt;encrypted and lost&lt;/strong&gt;, whereas the firm’s prior offline backups might have survived&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Lack of MFA:&lt;/em&gt; The MSP &lt;strong&gt;did not implement multi-factor authentication&lt;/strong&gt; on remote access, making it easier for attackers to penetrate the network&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Poor preparation and monitoring:&lt;/em&gt; The complaint says the provider failed to harden systems or promptly detect the intrusion, which went unnoticed until ransomware detonated&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ultimately, the firm had to pay a ransom to recover data because backups were gone &lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;. This case is a wake-up call – it shows an MSP being sued for &lt;strong&gt;breach of contract and negligence&lt;/strong&gt;, with the court expected to evaluate whether the MSP met the “reasonably prudent” cybersecurity standard of care&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;. If not, the MSP could face hefty damages. Crucially, the &lt;strong&gt;lack of a written contract&lt;/strong&gt; (it was an oral agreement) complicates the MSP’s defense&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;, as no liability limits or warranty disclaimers were in place. The lesson for MSPs is to explicitly define and limit their obligations – otherwise courts may impose broad duties after the fact.&lt;/p&gt;

&lt;p&gt;Professional service firms themselves are also being sued by their clients and third parties post-breach, sometimes alongside service providers. In late 2024, a proposed class action named &lt;strong&gt;both a law firm (Thompson Coburn LLP) &lt;em&gt;and&lt;/em&gt; its client (Presbyterian Healthcare Services)&lt;/strong&gt; as defendants, after a hacker accessed the law firm’s network and stole patient data related to the client&lt;sup&gt;&lt;a href="https://www.reuters.com/legal/litigation/law-firm-thompson-coburn-healthcare-client-hit-with-data-breach-lawsuit-2024-11-12/#:~:text=Nov%2012%20%28Reuters%29%20,filed%20against%20them%20on%20Tuesday" rel="noopener noreferrer"&gt;22&lt;/a&gt;&lt;/sup&gt;. The lawsuit claims the breach was a “direct result” of inadequate cybersecurity by &lt;em&gt;both&lt;/em&gt; the firm and the healthcare provider, essentially arguing they &lt;strong&gt;“paved the way”&lt;/strong&gt; for the attack through lax safeguards &lt;sup&gt;&lt;a href="https://www.reuters.com/legal/litigation/law-firm-thompson-coburn-healthcare-client-hit-with-data-breach-lawsuit-2024-11-12/#:~:text=Nov%2012%20%28Reuters%29%20,filed%20against%20them%20on%20Tuesday" rel="noopener noreferrer"&gt;22&lt;/a&gt;&lt;/sup&gt;. This is part of a larger trend – several large firms (Orrick, Bryan Cave, etc.) have been sued over data breaches and have reached multi-million dollar settlements&lt;sup&gt;&lt;a href="https://www.reuters.com/legal/litigation/law-firm-thompson-coburn-healthcare-client-hit-with-data-breach-lawsuit-2024-11-12/#:~:text=Nov%2012%20%28Reuters%29%20,filed%20against%20them%20on%20Tuesday" rel="noopener noreferrer"&gt;22&lt;/a&gt;&lt;/sup&gt;.  For example, a global law firm recently agreed to pay &lt;strong&gt;$8.5M in settlement&lt;/strong&gt; after a breach exposed client Social Security numbers&lt;sup&gt;&lt;a href="https://www.msba.org/site/site/content/News-and-Publications/News/General-News/Law_Firm_Settles_Data_Breach_Lawsuit_A_Warning_for_Legal_Professionals.aspx#:~:text=Law%20Firm%20Settles%20Data%20Breach,that%20disclosed%20their%20clients%27" rel="noopener noreferrer"&gt;23&lt;/a&gt;&lt;/sup&gt;. Law firms also risk &lt;strong&gt;malpractice liability&lt;/strong&gt; if a client can prove that a cyber incident (e.g. a hacked email leading to a fraudulent wire transfer) was caused by the firm’s failure to exercise due care in security&lt;sup&gt;&lt;a href="https://www.linkedin.com/pulse/law-firm-data-breaches-legal-malpractice-four-cases-helen-geib#:~:text=Law%20Firm%20Data%20Breaches%20and,had%20hacked%20into%20the" rel="noopener noreferrer"&gt;24&lt;/a&gt;&lt;/sup&gt;. Consultants and other professionals face similar exposures – e.g. an HR consulting firm that mishandles employee data could be liable to the client’s employees for identity theft damages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance obligations&lt;/strong&gt; for professional services are varied and often under-appreciated by SMBs. Lawyers, for instance, are bound by ABA Model Rule 1.6 and state ethics rules to safeguard client confidences – which today means having reasonable cybersecurity. Many state bar associations have issued guidance equating a lawyer’s duty of competence with keeping current on cybersecurity to protect clients. Some states (like New York via its SHIELD Act, or Massachusetts’ data security regulations) impose legal requirements on any business (including law firms) that holds residents’ personal data to maintain reasonable security controls&lt;sup&gt;&lt;a href="https://www.reuters.com/legal/litigation/law-firm-thompson-coburn-healthcare-client-hit-with-data-breach-lawsuit-2024-11-12/#:~:text=Nov%2012%20%28Reuters%29%20,filed%20against%20them%20on%20Tuesday" rel="noopener noreferrer"&gt;22&lt;/a&gt;&lt;/sup&gt;. If a firm deals with regulated client data, additional laws kick in: a law firm handling health records for a hospital becomes a &lt;strong&gt;business associate under HIPAA&lt;/strong&gt;, with direct liability for breaches. A consulting firm processing credit data for a client might fall under &lt;strong&gt;GLBA&lt;/strong&gt; or FTC Safeguards Rule mandates. Many small firms don’t realize these apply – for example, an accounting consultant might be deemed a “service provider” under a bank’s GLBA compliance program and be expected to uphold specific security measures. Failure to meet these latent obligations can lead to regulators or clients asserting that the professional service &lt;strong&gt;“should have known”&lt;/strong&gt; and implemented the required standard of care. For MSPs, this means that your professional services clients’ ignorance or refusal to invest in security doesn’t shield you – instead, you may be accused of &lt;strong&gt;negligence&lt;/strong&gt; for not compelling stronger protections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Education &amp;amp; Faith-Based Childcare
&lt;/h2&gt;

&lt;p&gt;Education institutions and child-focused organizations (such as private schools, daycare centers, and faith-based childcare providers) increasingly find themselves in the crosshairs of cyber attackers. K-12 schools and small educational nonprofits often have limited IT resources, making them &lt;strong&gt;soft targets for ransomware&lt;/strong&gt;. In 2023, Minneapolis Public Schools (MPS) experienced a &lt;strong&gt;massive ransomware attack&lt;/strong&gt; that underscores the stakes. The Medusa ransomware gang infiltrated MPS in February 2023, &lt;strong&gt;demanding $1 million&lt;/strong&gt; in ransom; when the district refused to pay, the hackers leaked extremely sensitive data – including detailed student psychological reports and security camera footage – affecting over &lt;strong&gt;100,000 individuals&lt;/strong&gt; (students, parents, and employees) &lt;sup&gt;&lt;a href="https://therecord.media/minneapolis-schools-say-data-breach-affected-100000#:~:text=Minneapolis%20Public%20Schools%20has%20begun,a%20cyberattack%20early%20this%20year" rel="noopener noreferrer"&gt;25&lt;/a&gt;&lt;/sup&gt;. The breach disrupted the school district’s operations for weeks and required notification to over 105,000 people, with MPS providing two years of credit monitoring to victims &lt;sup&gt;&lt;a href="https://therecord.media/minneapolis-schools-say-data-breach-affected-100000#:~:text=Minneapolis%20Public%20Schools%20has%20begun,a%20cyberattack%20early%20this%20year" rel="noopener noreferrer"&gt;25&lt;/a&gt;&lt;/sup&gt;. This incident, which took place in the MSP’s home state of Minnesota, highlights that even public sector and nonprofit educators face breach costs in the &lt;strong&gt;millions&lt;/strong&gt; and intense public scrutiny. In the aftermath, families have filed complaints and possibly legal claims, frustrated by delays in notification and alleging resultant fraud issues&lt;sup&gt;&lt;a href="https://therecord.media/minneapolis-schools-say-data-breach-affected-100000#:~:text=Minneapolis%20Public%20Schools%20has%20begun,a%20cyberattack%20early%20this%20year" rel="noopener noreferrer"&gt;25&lt;/a&gt;&lt;/sup&gt;. &lt;/p&gt;

&lt;p&gt;Smaller faith-based and private educational organizations might assume they are under the radar, but they handle valuable personal data: children’s names, addresses, medical info (allergies, medications), parents’ financial and contact data, etc. Such information can be sold or misused if breached. Moreover, &lt;strong&gt;regulatory compliance&lt;/strong&gt; does apply. &lt;strong&gt;FERPA&lt;/strong&gt; (the Family Educational Rights and Privacy Act) governs student records privacy for schools receiving federal funds – while a church-run preschool might not fall under FERPA, a charter school or daycare with state funding often does. FERPA violations (like an unauthorized disclosure via a cyber breach) can lead to federal sanctions or loss of funding. Additionally, many states have student data privacy laws and breach notification laws that include nonprofits and schools. Minnesota law, for instance, requires any organization (public or private) to notify individuals of a breach of personal information &lt;strong&gt;“in the most expedient time possible”&lt;/strong&gt;&lt;sup&gt;&lt;a href="https://www.insureon.com/small-business-insurance/cyber-liability/data-breach-laws/minnesota#:~:text=Businesses%20must%20report%20a%20breach,Delays%20are" rel="noopener noreferrer"&gt;26&lt;/a&gt;&lt;/sup&gt;, and has special provisions for breaches involving government entities&lt;sup&gt;&lt;a href="https://mn.gov/admin/data-practices/data/warnings/breaches/index.jsp#:~:text=Data%20Breach%20Notification%20%2F%20Data,they%20reasonably%20believe%20a" rel="noopener noreferrer"&gt;12&lt;/a&gt;&lt;/sup&gt; which would cover public school districts. &lt;/p&gt;

&lt;p&gt;For childcare centers and youth organizations, &lt;strong&gt;COPPA&lt;/strong&gt; (Children’s Online Privacy Protection Act) could indirectly come into play if they use online services that collect data on children under 13 – meaning the MSP should guide them in choosing compliant platforms. Furthermore, these organizations often &lt;strong&gt;don’t realize the duty of care they owe&lt;/strong&gt; for safeguarding minors’ information. An example: a daycare may keep a spreadsheet of children’s allergies and parent contact info on an office PC; if that gets hacked and posted, the organization could face lawsuits from parents claiming negligence in protecting their kids’ data. Even &lt;strong&gt;physical security system breaches&lt;/strong&gt; (like the leak of school building security camera maps in the MPS incident) create safety risks and liability. Many education-focused SMBs lack even basic controls – one study noted that 4 out of 5 nonprofits (including educational ones) &lt;strong&gt;do not have any cybersecurity plan&lt;/strong&gt; &lt;sup&gt;&lt;a href="https://www.boardeffect.com/blog/nonprofits-cyberattacks-key-stats/#:~:text=The%20Number%20of%20Ransomware%20Attacks,Is%20Rising" rel="noopener noreferrer"&gt;7&lt;/a&gt;&lt;/sup&gt;. This is where an MSP’s exposure lies: if an education client is breached, investigators will ask if the MSP had &lt;strong&gt;knowledge of vulnerabilities&lt;/strong&gt; (outdated systems, lack of backups, etc.) and failed to address them. The expectation is that, as professionals, MSPs shouldn’t wait for a school principal or church pastor (often not tech-savvy) to request security – the MSP is expected to proactively recommend and implement it. Failing to do so could be seen as a breach of the MSP’s duty of care, especially if the risks were foreseeable (e.g. no firewall, no antivirus on school PCs in 2025 is clearly reckless). &lt;/p&gt;

&lt;p&gt;Compliance obligations here can be “latent” as well. For example, a private school might not realize that &lt;strong&gt;state consumer protection laws&lt;/strong&gt; require reasonable data security – Minnesota’s adoption of the NAIC Insurance Data Security model (though aimed at insurers) reflects a broader regulatory ethos that third parties must be overseen and secured&lt;sup&gt;&lt;a href="https://www.house.mn.gov/comm/docs/bdfd4b0b-d874-465b-b7fd-0ada992e4fab.pdf#:~:text=Insurance%20Commissioners%20,for%20internal%20and%20external%20threats" rel="noopener noreferrer"&gt;27&lt;/a&gt;&lt;/sup&gt;. If a faith-based school processes tuition via credit card or bank drafts, &lt;strong&gt;PCI DSS&lt;/strong&gt; and &lt;strong&gt;GLBA&lt;/strong&gt; (if considered a financial transaction) could impose security requirements. The bottom line is that education and childcare organizations cannot ignore cybersecurity without risking legal exposure – and by extension, neither can their MSPs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Field Service &amp;amp; Restoration Contractors
&lt;/h2&gt;

&lt;p&gt;Field service companies – such as disaster restoration contractors, specialty repair services, and similar SMEs – may not appear to handle sensitive data at first glance. However, these firms often collect and store client information (homeowners’ addresses, insurance claim details, photos of property damage that might include personal belongings, etc.) and maintain always-on operations to respond to emergencies. A cyber incident can derail their ability to deliver critical services and also compromise client trust. &lt;strong&gt;Ransomware&lt;/strong&gt; has hit the field services sector with increasing frequency. In fact, construction and related trades (which include many restoration and field service businesses) saw a &lt;strong&gt;41% increase in ransomware attacks&lt;/strong&gt; recently&lt;sup&gt;&lt;a href="https://reliaquest.com/blog/report-shows-ransomware-has-grown-41-for-construction-industry/#:~:text=Industry%20reliaquest,Hours%20to%20Contain%20a" rel="noopener noreferrer"&gt;28&lt;/a&gt;&lt;/sup&gt;, and some cybersecurity reports rank construction/contracting firms as extremely common victims. The &lt;strong&gt;downtime&lt;/strong&gt; from an attack is particularly damaging here – e.g. a restoration contractor unable to access job schedules, drying equipment data, or customer contacts for even a few days can lead to mold spreading or buildings not being secured, causing additional property damage for which the firm could be liable. According to FBI data, the average ransomware incident in 2022 caused about &lt;strong&gt;one month of downtime&lt;/strong&gt; for government victims&lt;sup&gt;&lt;a href="https://techinformed.com/gov-agencies-face-96m-bill-after-cyberattack/#:~:text=Gov%20agencies%20%2496m%20recovery%20bills,of%20downtime%20per%20ransomware%20attack" rel="noopener noreferrer"&gt;29&lt;/a&gt;&lt;/sup&gt;; for a business, even a fraction of that could be ruinous. The &lt;strong&gt;average ransom demand&lt;/strong&gt; has also skyrocketed (nearly two-thirds of attacks now ask &amp;gt;$1M)&lt;sup&gt;&lt;a href="https://spycloud.com/blog/cybersecurity-industry-statistics-account-takeover-ransomware-data-breaches-bec-fraud/#:~:text=past%2012%20months%2C%20and%2062,complaints%20regarding%20ransomware%20attacks%20on" rel="noopener noreferrer"&gt;2&lt;/a&gt;&lt;/sup&gt;, and while many small firms won’t pay or can’t pay that, those that do face huge costs – and those that don’t may still incur costs to rebuild systems and handle data leaks.&lt;/p&gt;

&lt;p&gt;A scenario illustrating shared risk: imagine a &lt;strong&gt;fire restoration contractor&lt;/strong&gt; working with a large insurance company – the contractor receives claim details including policy numbers and perhaps health information (if it’s fire damage at a hospital or a home with medical equipment). If the contractor’s MSP hasn’t implemented proper network security and the contractor gets hacked, that insurance-related data could leak. Under laws like the &lt;strong&gt;Minnesota Insurance Data Security Act&lt;/strong&gt;, adopted in 2021, insurance companies must ensure their third-party service providers (like contractors) protect consumer data&lt;sup&gt;&lt;a href="https://www.house.mn.gov/comm/docs/bdfd4b0b-d874-465b-b7fd-0ada992e4fab.pdf#:~:text=Insurance%20Commissioners%20,for%20internal%20and%20external%20threats" rel="noopener noreferrer"&gt;27&lt;/a&gt;&lt;/sup&gt;. If a breach happens, the insurer might face regulatory action for failing to vet their vendor, and they will certainly seek to &lt;strong&gt;pass liability to the contractor (and indirectly, the MSP)&lt;/strong&gt;. Indeed, Minnesota’s law (mirroring a national model) requires insurers and agents to &lt;strong&gt;exercise oversight of third-party service providers’ security&lt;/strong&gt;&lt;sup&gt;&lt;a href="https://www.house.mn.gov/comm/docs/bdfd4b0b-d874-465b-b7fd-0ada992e4fab.pdf#:~:text=Insurance%20Commissioners%20,for%20internal%20and%20external%20threats" rel="noopener noreferrer"&gt;27&lt;/a&gt;&lt;/sup&gt; – effectively pushing the duty of care down the chain. This means a restoration contractor that doesn’t follow robust cybersecurity could put their partner insurance carrier in legal jeopardy, which in turn could result in lawsuits or indemnification claims against the contractor’s IT provider if negligence is found. &lt;/p&gt;

&lt;p&gt;Even independent of larger partners, field service SMBs face &lt;strong&gt;compliance obligations&lt;/strong&gt; they may not realize. Many handle &lt;strong&gt;payment card data&lt;/strong&gt; (for on-site payments), so PCI-DSS standards and state laws on cardholder data apply. They also often keep &lt;strong&gt;employee records&lt;/strong&gt; with sensitive PII and possibly DOT driving records or background checks (for technicians who go into homes) – such data is protected by laws like the Fair Credit Reporting Act and state PII safeguards. Environmental and safety regulations (OSHA, EPA) increasingly have cyber components too, as industrial control systems or alarm systems used by these contractors must be secure to ensure safety. Most small restoration firms lack dedicated IT staff, so they rely on MSPs for everything – effectively outsourcing their &lt;strong&gt;risk management&lt;/strong&gt;. Should an incident occur, they might claim ignorance (“we thought our MSP had it handled”), while clients or regulators will ask the MSP why basic precautions weren’t in place. In legal terms, the MSP could be seen as the “expert” who &lt;strong&gt;should have known&lt;/strong&gt; that, for example, the contractor needed offline backups or antivirus, etc., and thus share liability for the failure.&lt;/p&gt;

&lt;p&gt;In summary, field service and restoration contractors present a case where &lt;strong&gt;client ignorance and MSP responsibility intersect&lt;/strong&gt;. The clients may not be aware of regulatory expectations (like insurance data protection laws or breach notification duties), but regulators will not hesitate to enforce those – and the MSP must assume those obligations on the client’s behalf to avoid exposure. As one cybersecurity insurer put it, victims and their insurers are increasingly looking to &lt;strong&gt;“recover their losses by holding others accountable”&lt;/strong&gt; after an attack&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;. In this vertical, that “other” will likely be the MSP if proper security measures and incident response plans were not in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk Governance &amp;amp; Shared Liability: MSP Leadership Summary
&lt;/h2&gt;

&lt;p&gt;The case studies and trends above paint a clear picture: &lt;strong&gt;MSP leadership must treat cybersecurity and compliance risk as a core governance issue&lt;/strong&gt;, on par with financial or legal risks. Across all client verticals – from construction sites to clinics, charities to law offices – ignorance of cyber threats is rampant. Yet regulators and courts are demonstrating little patience for after-the-fact excuses. Instead, they increasingly apply standards of &lt;strong&gt;constructive knowledge&lt;/strong&gt; (what the MSP &lt;em&gt;should&lt;/em&gt; have known and done) and enforce a duty of care on service providers to protect client data and systems.&lt;/p&gt;

&lt;p&gt;Key themes for MSPs emerge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Growing Legal Duty of Care:&lt;/strong&gt; An MSP can face &lt;strong&gt;breach of contract or negligence lawsuits&lt;/strong&gt; if a client is breached. Courts are still evolving these standards, but generally expect the MSP to act as a “reasonably prudent” IT professional&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;. This means if there are known best practices (encryption, MFA, backups) or known vulnerabilities, an MSP is expected to address or at least warn about them. As seen in the law firm case (&lt;em&gt;Mastagni v. MSP&lt;/em&gt;), failure to meet this standard opens the door to litigation. The &lt;strong&gt;costs can be substantial&lt;/strong&gt; – not only legal damages but also the MSP’s own remediation expenses and insurance impacts. MSPs should assume that &lt;em&gt;any&lt;/em&gt; significant client breach will prompt the client (or their insurer) to &lt;strong&gt;point the finger at the MSP&lt;/strong&gt; in search of deep pockets or error admissions&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regulatory Enforcement Extends to Vendors:&lt;/strong&gt; Regulatory bodies now explicitly include service providers in their enforcement regimes. For example, &lt;strong&gt;state Attorneys General&lt;/strong&gt; have pursued IT vendors for poor security (e.g. Minnesota AG vs Accretive Health&lt;sup&gt;&lt;a href="https://www.foley.com/insights/publications/2012/08/minnesota-attorney-general-reaches-first-settlemen/#:~:text=,to%20the%20State%20of" rel="noopener noreferrer"&gt;18&lt;/a&gt;&lt;/sup&gt;, multistate AGs vs Blackbaud&lt;sup&gt;&lt;a href="https://www.bankinfosecurity.com/accretive-health-settles-minn-lawsuit-a-4999#:~:text=DataBreachToday%20www,filed%20following%20a%20data%20breach" rel="noopener noreferrer"&gt;17&lt;/a&gt;&lt;/sup&gt;. The FTC has likewise held companies accountable for vendor failings – in the Wyndham case, the FTC cited lack of oversight of franchisee security as part of unfair practices&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;. Sector-specific rules compel oversight: HIPAA directly regulates business associates; the &lt;strong&gt;NAIC Insurance Data Security law&lt;/strong&gt; adopted in Minnesota mandates oversight of third-party providers&lt;sup&gt;&lt;a href="https://www.house.mn.gov/comm/docs/bdfd4b0b-d874-465b-b7fd-0ada992e4fab.pdf#:~:text=Insurance%20Commissioners%20,for%20internal%20and%20external%20threats" rel="noopener noreferrer"&gt;27&lt;/a&gt;&lt;/sup&gt;; even the Department of Defense’s upcoming CMMC program will flow down cybersecurity requirements to the smallest subcontractors. The message: MSPs servicing regulated clients may themselves become &lt;strong&gt;directly subject to compliance&lt;/strong&gt; (by law or by contract) and liable for penalties if they fall short. Leadership must ensure the company has expertise in the relevant regulations for each client vertical (be it PCI, HIPAA, FERPA, etc.), so that no “latent” obligation is overlooked. Ignorance on the MSP’s part is as dangerous as ignorance on the client’s part.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quantifiable Risks &amp;amp; Insurance:&lt;/strong&gt; The material risks are quantifiable – and often &lt;strong&gt;eye-opening&lt;/strong&gt;. Breach costs range from &lt;strong&gt;$4M to $10M+ on average&lt;/strong&gt; depending on industry&lt;sup&gt;&lt;a href="https://therecord.media/ibm-breach-report-cost-rise-to-5-million" rel="noopener noreferrer"&gt;1&lt;/a&gt;&lt;/sup&gt;, with record-setting class action settlements (law firms paying $8M+, hospitals, class settlements, etc.) and fines (HIPAA fines in the millions, state AG fines likewise). Even for SMB clients, a breach can easily cost hundreds of thousands in response and liability. If an MSP services, say, 10 small clients and each has a 1 in 5 chance of a breach in a given year (not unrealistic in 2025), the MSP could statistically be dealing with 2 breaches annually. &lt;strong&gt;Cyber insurance&lt;/strong&gt; is a necessary backstop – MSPs should carry robust Errors &amp;amp; Omissions (E&amp;amp;O) and cyber liability coverage, and consider requiring clients to carry cyber insurance as well.&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt; Notably, insurers now often investigate breaches to subrogate claims – i.e. they might pay the client, then &lt;strong&gt;sue the MSP to recover losses&lt;/strong&gt; if MSP fault is suspected. Strong contracts with &lt;strong&gt;liability limitations and indemnity clauses&lt;/strong&gt; are the MSP’s first line of protection here&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contractual Clarity and Client Education:&lt;/strong&gt; A recurring factor in many incidents was misaligned expectations or lack of client understanding (e.g. the client assumed the MSP was handling all backups or security updates, when perhaps that wasn’t in the basic contract). To combat this, MSPs should establish a &lt;strong&gt;clear standard of care in contracts&lt;/strong&gt;, spelling out MSP and client responsibilities&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;. This might include requiring the client to adhere to certain minimum security practices or to acknowledge residual risks if they decline recommended services. Several legal advisors suggest MSP contracts include &lt;strong&gt;customer obligations, MSP obligations, assumption of risk, disclaimers, and liability limits&lt;/strong&gt; as key clauses&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;. From a governance perspective, MSP leadership should enforce that no client is onboarded without a written agreement that covers these points – the oral “handshake deal” is a recipe for uncertainty and expanded liability &lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;. Additionally, &lt;strong&gt;client education is part of risk management&lt;/strong&gt;: an MSP that regularly briefs its clients (in accessible terms) about cyber threats and compliance requirements can demonstrate it took reasonable steps to inform an “ignorant” client&lt;sup&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;&lt;/sup&gt;. This can both prompt clients to invest more in security and serve as evidence that the MSP exercised due care. Essentially, &lt;strong&gt;documentation and communication&lt;/strong&gt; are as important as the technical protections deployed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proactive Risk Governance:&lt;/strong&gt; MSP leadership should treat the MSP’s overall client portfolio as a &lt;strong&gt;risk portfolio&lt;/strong&gt;. This means assessing which verticals/clients carry the highest inherent risk and ensuring internal policies address those. For instance, if many clients are in healthcare, the MSP should invest in HIPAA training for staff, have a template Business Associate Agreement, and maybe even pursue a third-party audit (like SOC 2 or ISO 27001 certification) to demonstrate its own controls meet a high standard. Regular &lt;strong&gt;risk reviews&lt;/strong&gt; should be conducted: Are all clients receiving timely patching and backup services? Do any clients repeatedly refuse security recommendations (if so, is the MSP prepared to insist or document waiver of liability)? From a corporate governance standpoint, MSP boards and executives should be asking, &lt;strong&gt;“What if one of our client’s gets hit by a severe cyber attack – are we prepared to respond and defend ourselves?”&lt;/strong&gt; This includes having an &lt;strong&gt;incident response plan&lt;/strong&gt; that involves legal counsel, public relations, and technical response, since the MSP may need to assist the client and protect its own interests simultaneously. As Baird Holm’s cyber liability bulletin noted, victims (and their insurers) will try to &lt;strong&gt;“hold others accountable” to recoup losses&lt;/strong&gt;&lt;sup&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;&lt;/sup&gt;, so MSPs must be ready to demonstrate their accountability measures (or point to client’s own failings) in the aftermath. Good cyber hygiene within the MSP (to avoid being the vector of an attack, like through remote management tools) is also part of governance – e.g. the 2021 Kaseya incident showed how an MSP software breach can cascade to all clients, causing industry-wide impacts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In conclusion, MSPs today stand in a position of &lt;strong&gt;shared fiduciary responsibility&lt;/strong&gt; for cybersecurity. Much like an accountant is expected to catch glaring errors in a client’s finances, an MSP is expected to address glaring vulnerabilities in a client’s IT – or face potential liability for the damage that follows. Minnesota and U.S. legal precedent makes it clear that &lt;strong&gt;“I didn’t know” or “they didn’t ask for it” is not a winning defense&lt;/strong&gt; for service providers. Instead, courts and regulators favor a &lt;strong&gt;“knew or should have known”&lt;/strong&gt; approach – if the risk was knowable and the harm foreseeable, the MSP is expected to act. By embracing thorough risk governance, stringent compliance practices, client education, and ironclad contracts, MSP leadership can significantly mitigate this exposure. The goal is to transform what could be an adversarial blame game into a true partnership with clients on security: aligning incentives, sharing knowledge, and jointly meeting the standard of care that modern cybersecurity demands. In doing so, the MSP not only avoids legal pitfalls but also enhances its value proposition in an era where trust and accountability are paramount. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://therecord.media/ibm-breach-report-cost-rise-to-5-million" rel="noopener noreferrer"&gt;1&lt;/a&gt;.&lt;/em&gt; "Cost of a breach reaches nearly $5 million, with healthcare being hit the hardest | The Record from Recorded Future News"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://spycloud.com/blog/cybersecurity-industry-statistics-account-takeover-ransomware-data-breaches-bec-fraud/#:~:text=past%2012%20months%2C%20and%2062,complaints%20regarding%20ransomware%20attacks%20on" rel="noopener noreferrer"&gt;2&lt;/a&gt;.&lt;/em&gt; "Cybersecurity Industry Statistics: ATO, Ransomware, Breaches | Spycloud" &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.scl.org/12965-claims-against-it-service-providers-following-a-cyber-attack/#:~:text=The%20financial%20implications%20of%20a,business%20elsewhere%2C%20impacting%20future%20revenues" rel="noopener noreferrer"&gt;3&lt;/a&gt;.&lt;/em&gt; "Claims against IT service providers following a cyber attack | Society for Computers &amp;amp; Law" &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://adaptive.live/blog/bits-and-breaches-target#:~:text=The%20first%20story%20in%20the,cost%20them%20over%20%24200%20million" rel="noopener noreferrer"&gt;4&lt;/a&gt;.&lt;/em&gt; "Bits and Breaches - Target Data Breach 2013 | Adaptive"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.facilitiesnet.com/hvac/tip/Target-Settles-HVAC-Data-Breach-for-185-Million--39237#:~:text=Facilitiesnet%20www,company%20says%20the%20breach%20cost" rel="noopener noreferrer"&gt;5&lt;/a&gt;.&lt;/em&gt; "Target Settles HVAC Data Breach for $18.5 Million | Facilitiesnet"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.computerworld.com/article/1687768/minnesota-gives-pci-rules-a-legal-standing.html#:~:text=Computerworld%20www,to%20turn%20a%20core" rel="noopener noreferrer"&gt;6&lt;/a&gt;.&lt;/em&gt; "Minnesota Gives PCI Rules a Legal Standing | Computerworld"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.boardeffect.com/blog/nonprofits-cyberattacks-key-stats/#:~:text=The%20Number%20of%20Ransomware%20Attacks,Is%20Rising" rel="noopener noreferrer"&gt;7&lt;/a&gt;.&lt;/em&gt; "Nonprofits and Cyberattacks: Key Stats That Boards Need to Know | BoardEffect"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.eidebailly.com/insights/articles/2022/1/cybersecurity-within-nonprofits#:~:text=Cybersecurity%20Challenges%20and%20Best%20Practices,Unfortunately%2C%20many%20of%20these" rel="noopener noreferrer"&gt;8&lt;/a&gt;.&lt;/em&gt; "Cybersecurity Challenges and Best Practices for Nonprofits | EideBailly"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.riprapsecurity.com/blog/nonprofit-data-breaches-amp-their-impact#:~:text=Nonprofit%20Data%20Breaches%20%26%20Their,could%20represent%20the%20entirety" rel="noopener noreferrer"&gt;9&lt;/a&gt;.&lt;/em&gt; "Nonprofit Data Breaches &amp;amp; Their Impact | RipRap Security"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.hunton.com/privacy-and-information-security-law/blackbaud-to-pay-49-5-million-in-data-breach-settlement#:~:text=On%20October%205%2C%202023%2C%20Blackbaud,clients%20and%20donors%20as%20well" rel="noopener noreferrer"&gt;10&lt;/a&gt;.&lt;/em&gt; "Blackbaud to Pay $49.5 Million in Data Breach Settlement | Hunton"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.dataprotectionreport.com/2021/10/customers-can-pursue-negligence-claims-directly-against-vendor-2/#:~:text=On%20October%2019%2C%202021%2C%20a,se%20and%20unjust%20enrichment%20claims" rel="noopener noreferrer"&gt;11&lt;/a&gt;.&lt;/em&gt; "Customers Can Pursue Negligence Claims Directly Against Vendor | Data Protection Report"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://mn.gov/admin/data-practices/data/warnings/breaches/index.jsp#:~:text=Data%20Breach%20Notification%20%2F%20Data,they%20reasonably%20believe%20a" rel="noopener noreferrer"&gt;12&lt;/a&gt;.&lt;/em&gt; "Data Breach Notification / Data Practices Office | State of Minnesota"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://mnccc.gov/Guidelines%20for%20Vendor%20Contracts.pdf#:~:text=,Reconciliation%20routines%20%28checksums" rel="noopener noreferrer"&gt;13&lt;/a&gt;.&lt;/em&gt; "[PDF] Guidelines for Vendor Contracts | MNCCC"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.boardeffect.com/blog/nonprofits-cyberattacks-key-stats/#:~:text=NGOs%20and%20nonprofits%20raised%20%2430,making%20them%20attractive%20to%20hackers" rel="noopener noreferrer"&gt;14&lt;/a&gt;.&lt;/em&gt; "Nonprofits and Cyberattacks: Key Stats That Boards Need to Know | BoardEffect"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.dorseyhealthlaw.com/hhs-ocr-settles-hipaa-investigation-with-business-associate-for-350000/#:~:text=Over%20the%20past%20decade%2C%20the,1" rel="noopener noreferrer"&gt;15&lt;/a&gt;.&lt;/em&gt; "HHS OCR Settles HIPAA Investigation with Business Associate for $350,000 | Dorsey Health Law"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.ecjlaw.com/ecj-blog/insure-against-data-breaches-suffered-by-vendors-and-service-providers#:~:text=Corporation%20of%20America%20,healthcare%20and%20financial%20information%20to" rel="noopener noreferrer"&gt;16&lt;/a&gt;.&lt;/em&gt; "Insure Against Data Breaches Suffered By Vendors and Service Providers | Ervin Cohen &amp;amp; Jessup LLP"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.bankinfosecurity.com/accretive-health-settles-minn-lawsuit-a-4999#:~:text=DataBreachToday%20www,filed%20following%20a%20data%20breach" rel="noopener noreferrer"&gt;17&lt;/a&gt;.&lt;/em&gt; "Accretive Health Settles Minn. Lawsuit | DataBreachToday"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.foley.com/insights/publications/2012/08/minnesota-attorney-general-reaches-first-settlemen/#:~:text=,to%20the%20State%20of" rel="noopener noreferrer"&gt;18&lt;/a&gt;.&lt;/em&gt; "Minnesota Attorney General Reaches First Settlement With Business | Foley &amp;amp; Lardner LLP"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.startribune.com/north-memorial-health-care-paying-1-5-million-in-federal-privacy-settement/372490911#:~:text=North%20Memorial%20Health%20Care%20paying,laws%20and%20state%20consumer%20protections" rel="noopener noreferrer"&gt;19&lt;/a&gt;.&lt;/em&gt; "North Memorial Health Care paying $1.5 million in federal privacy | Star Tribune"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.calyptix.com/technical/professional-standard-of-care/#:~:text=The%20complexity%20of%20these%20various,where%20things%20can%20get%20sticky" rel="noopener noreferrer"&gt;20&lt;/a&gt;.&lt;/em&gt; "The MSP’s Responsibility for Professional Standard of Care | Calyptix Security"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.bairdholm.com/blog/the-ever-expanding-liability-of-cyber-breaches/#:~:text=In%20a%20recent%20court%20case,attack" rel="noopener noreferrer"&gt;21&lt;/a&gt;.&lt;/em&gt; "The Ever-Expanding Liability of Cyber-Breaches | Baird Holm LLP"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.reuters.com/legal/litigation/law-firm-thompson-coburn-healthcare-client-hit-with-data-breach-lawsuit-2024-11-12/#:~:text=Nov%2012%20%28Reuters%29%20,filed%20against%20them%20on%20Tuesday" rel="noopener noreferrer"&gt;22&lt;/a&gt;.&lt;/em&gt; "Law firm Thompson Coburn and healthcare client hit with data breach lawsuit | Reuters"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.msba.org/site/site/content/News-and-Publications/News/General-News/Law_Firm_Settles_Data_Breach_Lawsuit_A_Warning_for_Legal_Professionals.aspx#:~:text=Law%20Firm%20Settles%20Data%20Breach,that%20disclosed%20their%20clients%27" rel="noopener noreferrer"&gt;23&lt;/a&gt;.&lt;/em&gt; "Law Firm Settles Data Breach Lawsuit: A Warning for Legal | MSBA"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.linkedin.com/pulse/law-firm-data-breaches-legal-malpractice-four-cases-helen-geib#:~:text=Law%20Firm%20Data%20Breaches%20and,had%20hacked%20into%20the" rel="noopener noreferrer"&gt;24&lt;/a&gt;.&lt;/em&gt; "Law Firm Data Breaches and Legal Malpractice | Helen Geib via LinkedIn Pulse"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://therecord.media/minneapolis-schools-say-data-breach-affected-100000#:~:text=Minneapolis%20Public%20Schools%20has%20begun,a%20cyberattack%20early%20this%20year" rel="noopener noreferrer"&gt;25&lt;/a&gt;.&lt;/em&gt; "Minneapolis school district says data breach affected more than 100,000 people | The Record from Recorded Future News"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.insureon.com/small-business-insurance/cyber-liability/data-breach-laws/minnesota#:~:text=Businesses%20must%20report%20a%20breach,Delays%20are" rel="noopener noreferrer"&gt;26&lt;/a&gt;.&lt;/em&gt; "Minnesota Data Breach Notification Laws | Insureon"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.house.mn.gov/comm/docs/bdfd4b0b-d874-465b-b7fd-0ada992e4fab.pdf#:~:text=Insurance%20Commissioners%20,for%20internal%20and%20external%20threats" rel="noopener noreferrer"&gt;27&lt;/a&gt;.&lt;/em&gt; "NAIC Data Security Model Act | Minnesota Department of Commerce"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://reliaquest.com/blog/report-shows-ransomware-has-grown-41-for-construction-industry/#:~:text=Industry%20reliaquest,Hours%20to%20Contain%20a" rel="noopener noreferrer"&gt;28&lt;/a&gt;.&lt;/em&gt; "Report Shows Ransomware Has Grown 41% for Construction Industry | ReliaQuest"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://techinformed.com/gov-agencies-face-96m-bill-after-cyberattack/#:~:text=Gov%20agencies%20%2496m%20recovery%20bills,of%20downtime%20per%20ransomware%20attack" rel="noopener noreferrer"&gt;29&lt;/a&gt;.&lt;/em&gt; "Gov agencies $96m recovery bills after ransomware attack | TechInformed"&lt;/p&gt;

</description>
      <category>security</category>
      <category>infosec</category>
      <category>discuss</category>
      <category>startup</category>
    </item>
    <item>
      <title>DevOps ShmevOps</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Mon, 14 Apr 2025 17:19:10 +0000</pubDate>
      <link>https://dev.to/dmidlo/devops-shmevops-1n2</link>
      <guid>https://dev.to/dmidlo/devops-shmevops-1n2</guid>
      <description>&lt;h2&gt;
  
  
  &lt;em&gt;Lessons from Software Engineering in Multi-Tenant Infrastructure&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why ITIL means 'idle', SRE Isn’t Enough, and DevOps Doesn’t Scale Across the Zoo&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Let’s Get Real.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ITIL&lt;/strong&gt; gave us structure
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agile&lt;/strong&gt; gave us cadence
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps&lt;/strong&gt; changed how we ship software
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SRE&lt;/strong&gt; made reliability a product metric
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in &lt;strong&gt;multi-tenant infrastructure engineering&lt;/strong&gt; — especially across clients across industry verticals, countless endpoints, and wildly divergent architectures — &lt;strong&gt;none of them go far enough&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They weren’t designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stacked and conflicting compliance layers
&lt;/li&gt;
&lt;li&gt;Systems that span generations of tooling and vendors
&lt;/li&gt;
&lt;li&gt;Vertical-specific constraints that can’t be unified into a single pipeline
&lt;/li&gt;
&lt;li&gt;Shared services where one bad ticket can impact ten environments
&lt;/li&gt;
&lt;li&gt;Teams juggling business objectives, infrastructure, identity, support, security, and uptime with a staff of four
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; an app pipeline.&lt;/p&gt;

&lt;p&gt;This is a living system — messy, entangled across physical and digital layers, SLA-bound, and barely held together by the burnout cycle of one overextended unicorn engineer… handing off just enough notes for the next unicorn to pick up the pieces.&lt;/p&gt;

&lt;p&gt;We don’t grow engineers to sustain the system — we hunt unicorns to survive it.&lt;/p&gt;

&lt;p&gt;And as long as we build systems that depend on the rarity of engineering talent instead of resilience embedded in the architecture, we’ll always be short-staffed, over-leveraged, and one alert notification away from collapse.&lt;/p&gt;




&lt;h2&gt;
  
  
  ITIL: Idle Time in Layers
&lt;/h2&gt;

&lt;p&gt;There’s something ironic about a framework built to “standardize service delivery” being so... abstract that it only works if &lt;strong&gt;everything is predictable, repeatable, and documented&lt;/strong&gt; — which is to say: &lt;strong&gt;never&lt;/strong&gt; in the actual environments it claims to govern.&lt;/p&gt;

&lt;h3&gt;
  
  
  ITIL Assumes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You have a CMDB that reflects reality
&lt;/li&gt;
&lt;li&gt;Incident categories are clear before triage
&lt;/li&gt;
&lt;li&gt;Change windows are sacred and followed
&lt;/li&gt;
&lt;li&gt;All actions are approved, ticketed, and categorized &lt;strong&gt;&lt;em&gt;before&lt;/em&gt;&lt;/strong&gt; they happen&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Now Compare to Reality:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;“What’s this server?”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“No idea. But unplug it and three clients go offline.”&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;“Why is this backup writing to Bob’s desktop?”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;“He retired in 2019. But his profile still runs as a scheduled task.”&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ITIL was designed for &lt;strong&gt;a system you don’t run&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
And more than that — for a system that doesn’t &lt;strong&gt;evolve&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agile and DevOps: Built for Builders — Not Operators of Chaos
&lt;/h2&gt;

&lt;p&gt;DevOps was built for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unified, app-centric teams
&lt;/li&gt;
&lt;li&gt;Infrastructure defined as code
&lt;/li&gt;
&lt;li&gt;Environments you control
&lt;/li&gt;
&lt;li&gt;Pipelines you own
&lt;/li&gt;
&lt;li&gt;Product roadmaps and sprint boards
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in an MSP, or a cross-tenant ops team, &lt;strong&gt;you don’t get to pick the stack&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
You inherit it. You glue it together. You support it — even when it makes no architectural sense.&lt;/p&gt;

&lt;p&gt;You can’t CI/CD your way out of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SonicWall configs from 2013
&lt;/li&gt;
&lt;li&gt;Shadow SaaS systems
&lt;/li&gt;
&lt;li&gt;On-prem Exchange still handling business-critical mail
&lt;/li&gt;
&lt;li&gt;Hybrid Azure AD + local GPOs + 3rd-party MFA
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DevOps tells you to “shift left.”&lt;br&gt;&lt;br&gt;
But if you don’t own the architecture, the pipeline, or the culture?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;There is no left to shift to.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  SRE Helps — If You Own the System
&lt;/h2&gt;

&lt;p&gt;SRE gave us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SLIs, SLOs, and error budgets
&lt;/li&gt;
&lt;li&gt;Golden signals
&lt;/li&gt;
&lt;li&gt;Incident response rituals
&lt;/li&gt;
&lt;li&gt;Reliability as a product spec
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But SRE assumes &lt;strong&gt;standardization and system ownership&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a zoo of fragmented infra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t control telemetry end-to-end
&lt;/li&gt;
&lt;li&gt;You might not even have full access to the systems
&lt;/li&gt;
&lt;li&gt;SLAs exist, but SLOs are… aspirational
&lt;/li&gt;
&lt;li&gt;Monitoring tools vary per client — if they exist at all
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can’t reliability-engineer what you &lt;strong&gt;can’t observe&lt;/strong&gt;, &lt;strong&gt;can’t access&lt;/strong&gt;, and &lt;strong&gt;don’t fully own&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Welcome to the Zoo
&lt;/h2&gt;

&lt;p&gt;Forget “pets vs. cattle.” That metaphor died with Windows 2008.&lt;/p&gt;

&lt;p&gt;Here’s what you're actually running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Legacy pets&lt;/strong&gt; – fragile, undocumented, critical
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sacred cows&lt;/strong&gt; – architecturally absurd but politically untouchable
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ghosts&lt;/strong&gt; – no known owner, definitely in production
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Possums&lt;/strong&gt; – look dead, reboot them and the lights go out
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cattle&lt;/strong&gt; – finally, something you can rebuild
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zebras&lt;/strong&gt; – look compliant, hide deep weirdness
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chimeras&lt;/strong&gt; – half-cloud, half-VM, all nightmare
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invasive species&lt;/strong&gt; – installed by Bob in Accounting, running with root
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t a platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;It’s a zoo&lt;/em&gt;&lt;/strong&gt; — chaotic, multi-tenant, partially observable, duct-taped together — and you’re still on the hook for uptime.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Actually Do: Engineer Interfaces, Not Just Systems
&lt;/h2&gt;

&lt;p&gt;In this world, &lt;strong&gt;discipline has to look different&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
And software engineering has patterns we can steal.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. &lt;strong&gt;Everything Should Be an Interface&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can’t fix what you can’t isolate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define interfaces, even if the implementation is messy
&lt;/li&gt;
&lt;li&gt;Encapsulate chaos — contain it, describe it, version it
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use contracts as boundaries  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VPNs as APIs  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Client provisioning as request/response  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even if the backend relies on &lt;strong&gt;folklore logic&lt;/strong&gt;, the front should behave predictably  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not about purity — it’s about &lt;strong&gt;containment&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;GitOps for Infra, Not Just Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Apply GitOps to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS zones
&lt;/li&gt;
&lt;li&gt;Firewall rules
&lt;/li&gt;
&lt;li&gt;Patch flows
&lt;/li&gt;
&lt;li&gt;Client onboarding
&lt;/li&gt;
&lt;li&gt;Compliance checklists
&lt;/li&gt;
&lt;li&gt;Escalation workflows
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it’s procedural, &lt;strong&gt;version it&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
If it’s versioned, &lt;strong&gt;you can refactor it&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Design Observability in Layers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You don’t own every telemetry pipeline.&lt;br&gt;&lt;br&gt;
So you build around that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sidecar collectors
&lt;/li&gt;
&lt;li&gt;Exporter proxies
&lt;/li&gt;
&lt;li&gt;Canonical internal formats
&lt;/li&gt;
&lt;li&gt;Semantic definitions for latency, throughput, error rate — across tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Normalize the signal, not the tool.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Observability abstraction isn’t a luxury — it’s survival in a zoo.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Infrastructure is a Product. Build Like It.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If your internal tooling isn’t versioned, it’s &lt;strong&gt;implicit and passed on by water-cooler folklore&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
If your procedures aren’t modular, you’re hand-coding ops.&lt;/p&gt;

&lt;p&gt;Build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared services: VPN-as-a-Service, onboarding templates
&lt;/li&gt;
&lt;li&gt;Training with the flow of a UX designer, not just forwarded docs&lt;/li&gt;
&lt;li&gt;Reusable automation flows
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think like a platform team — even if your platform's definition is a one of a heterogeneous collection of many.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Runbooks Are Living Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Version-controlled
&lt;/li&gt;
&lt;li&gt;Linked to telemetry
&lt;/li&gt;
&lt;li&gt;Reviewed and rehearsed
&lt;/li&gt;
&lt;li&gt;Tied to actual system state
&lt;/li&gt;
&lt;li&gt;Executable, testable, auditable
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A runbook that’s not testable is &lt;strong&gt;just a wiki page getting old&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Billing Risk, SalesOps Gravity, and the Contractual Edge
&lt;/h2&gt;

&lt;p&gt;You’re not just running infrastructure — you’re fulfilling &lt;strong&gt;contracts&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SLAs signed by sales
&lt;/li&gt;
&lt;li&gt;Custom deliverables for key accounts
&lt;/li&gt;
&lt;li&gt;Penalty clauses and billing triggers
&lt;/li&gt;
&lt;li&gt;Legacy exceptions you can’t rewrite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every contract creates &lt;strong&gt;runtime boundaries&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Billing models tied to runtime behavior
&lt;/li&gt;
&lt;li&gt;Patch windows encoded in legal PDFs
&lt;/li&gt;
&lt;li&gt;Custom uptime guarantees
&lt;/li&gt;
&lt;li&gt;Support tiers bypassing queue logic&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Engineering for Contractual Gravity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version Your Commitments&lt;/strong&gt;
Expose them as API-like endpoints:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /client/acme_corp/sla → 99.99 / 5m
GET /client/acme_corp/billing_model → per-seat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instrument What You Promise&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If it matters to a contract, &lt;strong&gt;it has to be in telemetry&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invert Tooling Assumptions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Make tools reflect contractual logic, not the other way around.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Policy Engines for Exceptions&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BigGov&lt;/span&gt;
&lt;span class="na"&gt;sla&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;availability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;99.99&lt;/span&gt;
&lt;span class="na"&gt;billing_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;static_mrr_plus_usage&lt;/span&gt;
&lt;span class="na"&gt;patch_window&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Mon&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Wed&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;hours&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;02&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;00–04&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;00 UTC&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Story Cards as Interface Contracts
&lt;/h2&gt;

&lt;p&gt;In the zoo, a story card isn’t a task — it’s a &lt;strong&gt;boundary object&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Done right, it becomes a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Negotiated contract
&lt;/li&gt;
&lt;li&gt;Shared context unit
&lt;/li&gt;
&lt;li&gt;Traceable spec for infra change
&lt;/li&gt;
&lt;li&gt;Trigger for ops and finance alignment
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  A Real Story in the Wild
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Story:&lt;/strong&gt; Provision compliance-aligned identity boundary for Org X&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Context:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Org X signed a HIPAA-aligned MSA. This triggers Tier 2 controls by Q2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OU structure, GPOs
&lt;/li&gt;
&lt;li&gt;MFA policies
&lt;/li&gt;
&lt;li&gt;Log forwarding
&lt;/li&gt;
&lt;li&gt;SaaS federation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Constraints:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30m downtime max
&lt;/li&gt;
&lt;li&gt;Sandbox test required
&lt;/li&gt;
&lt;li&gt;Patch window: Wed 01:00–03:00 UTC
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Acceptance Criteria:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controls in place
&lt;/li&gt;
&lt;li&gt;Logs flowing
&lt;/li&gt;
&lt;li&gt;Cutover &amp;lt;30m
&lt;/li&gt;
&lt;li&gt;Federation verified
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Link to Contract:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
 &lt;code&gt;/contracts/org-x/amendments/2024-q1-tier2-access.pdf&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Org Design for Chaos-Resistant Ops
&lt;/h2&gt;

&lt;p&gt;Just like infrastructure, &lt;strong&gt;organizational design needs to be resilient to failure, drift, and entropy&lt;/strong&gt;. That means choosing operational models that survive context fragmentation, vendor heterogeneity, and multi-tenant chaos.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Centralized Ops&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Structure:&lt;/strong&gt; A single, central team handles ops across the org.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pros:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Efficient for standard environments
&lt;/li&gt;
&lt;li&gt;Easier to enforce tooling and process uniformity
&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Loses context quickly in diverse, fragmented systems
&lt;/li&gt;
&lt;li&gt;Becomes a bottleneck for requests
&lt;/li&gt;
&lt;li&gt;"Support desk" mentality limits engineering depth&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Great for:&lt;/strong&gt; Homogenous environments with high standardization&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Fails in:&lt;/strong&gt; MSPs, multi-vertical support, or high entropy environments&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Embedded Ops&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Structure:&lt;/strong&gt; Ops engineers are embedded directly into product, platform, or tenant-facing teams.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pros:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High context and domain awareness
&lt;/li&gt;
&lt;li&gt;Faster feedback loops and better trust with devs and clients
&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Difficult to scale
&lt;/li&gt;
&lt;li&gt;Risk of inconsistent practices or duplicated work
&lt;/li&gt;
&lt;li&gt;Harder to maintain shared ops culture&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Great for:&lt;/strong&gt; Environments where every client or system is wildly different&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Fails in:&lt;/strong&gt; Organizations that need to scale and standardize&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Infra-as-Coach (Hybrid Model)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Structure:&lt;/strong&gt; Senior infra engineers float across teams to advise, design patterns, review implementations, and mentor embedded ops/devs.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Pros:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Balances standardization with local context
&lt;/li&gt;
&lt;li&gt;Brings architectural consistency without central bottlenecks
&lt;/li&gt;
&lt;li&gt;Empowers teams without abandoning them
&lt;strong&gt;Cons:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Requires strong cross-org communication
&lt;/li&gt;
&lt;li&gt;Needs senior talent capable of coaching and pattern design&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Great for:&lt;/strong&gt; Chaotic multi-tenant systems where complexity clusters unpredictably&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Fails in:&lt;/strong&gt; Orgs without senior ICs or strong internal culture&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Principle: &lt;strong&gt;Align Support With Entropy&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Wherever complexity accumulates, &lt;strong&gt;embed talent&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Wherever repetition appears, &lt;strong&gt;standardize and centralize&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Wherever architecture diverges, &lt;strong&gt;float coaches to reconnect the seams&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just like infra can’t be one-size-fits-all, &lt;strong&gt;ops orgs need adaptive design&lt;/strong&gt; to survive the zoo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tooling Strategy: Abstract the Interface
&lt;/h2&gt;

&lt;p&gt;You don’t need better tools.&lt;br&gt;&lt;br&gt;
You need &lt;strong&gt;better boundaries&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Interface to Own&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CMDB&lt;/td&gt;
&lt;td&gt;Asset lifecycle + ownership queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logging&lt;/td&gt;
&lt;td&gt;Format normalization + access model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity&lt;/td&gt;
&lt;td&gt;Role mapping + join/leave workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance&lt;/td&gt;
&lt;td&gt;Evidence state + exception modeling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alerting&lt;/td&gt;
&lt;td&gt;Routing rules + SLA thresholds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Write your own SDKs.&lt;br&gt;&lt;br&gt;
Don’t fight the tools — &lt;strong&gt;wrap them&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrap-Up: Infra as a Bounded Mesh
&lt;/h2&gt;

&lt;p&gt;Here’s what it all adds up to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interfaces define your system’s edges
&lt;/li&gt;
&lt;li&gt;GitOps brings traceability
&lt;/li&gt;
&lt;li&gt;Observability is layered, not unified
&lt;/li&gt;
&lt;li&gt;Contracts are runtime configuration
&lt;/li&gt;
&lt;li&gt;Stories become scoped intent
&lt;/li&gt;
&lt;li&gt;Org design aligns with entropy
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re not building pipelines.&lt;br&gt;&lt;br&gt;
You’re engineering &lt;strong&gt;a composable, observable, bounded mesh of systems, humans, contracts, and abstractions&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Don’t Survive the Zoo — Engineer for It
&lt;/h2&gt;

&lt;p&gt;DevOps assumed you owned the platform.&lt;br&gt;&lt;br&gt;
SRE assumed you could see it all.&lt;br&gt;&lt;br&gt;
ITIL assumed it never changed.&lt;/p&gt;

&lt;p&gt;Reality?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t own the tools
&lt;/li&gt;
&lt;li&gt;You don’t own the culture
&lt;/li&gt;
&lt;li&gt;You don’t even own the system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you &lt;em&gt;can&lt;/em&gt; own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The interface
&lt;/li&gt;
&lt;li&gt;The abstraction
&lt;/li&gt;
&lt;li&gt;The operational contract
&lt;/li&gt;
&lt;li&gt;The engineering design of the whole&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Let’s stop pretending we’re in a datacenter.&lt;/p&gt;

&lt;p&gt;We’re in a zoo. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And it’s time to engineer accordingly.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sitereliabilityengineering</category>
      <category>productivity</category>
      <category>testing</category>
    </item>
    <item>
      <title>A Place to Put My Print Books</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Mon, 07 Apr 2025 06:28:17 +0000</pubDate>
      <link>https://dev.to/dmidlo/a-place-to-put-my-books-5cej</link>
      <guid>https://dev.to/dmidlo/a-place-to-put-my-books-5cej</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdc2pb0zm6lk6vog0rtrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdc2pb0zm6lk6vog0rtrg.png" alt="pseudo-intellectual" width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...still me, not there yet...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Ever go to hang out at a friend's place to hang out and look at their bookshelf?&lt;/p&gt;

&lt;p&gt;You walk in, drop your keys in the dish by the door, and before you even sit down, your eyes are already scanning the spines. It's not even intentional—it just happens. That quiet draw toward the rows of titles, the half-remembered authors, the dog-eared corners that scream well-loved. You learn a lot about someone by what they keep on their shelves—what they revisit, what they wrestle with, what they return to when life gets loud.&lt;/p&gt;

&lt;p&gt;This list? It's that shelf. Not curated for show. Just the real deal: accumulated over years, scribbled-in, bookmarked, and coffee-stained. No algorithmic ranking, no "must-read" hype cycles&lt;/p&gt;

&lt;p&gt;...just one person's stack of thought fuel, collected one curiosity at a time.&lt;/p&gt;

&lt;p&gt;A bookshelf isn’t a catalog of what's been conquered and logged—it’s a mnemonic; always within eyeshot and arm's reach. Some volumes are fully chewed through, others half-digested, many still aspirational. But they all say something: &lt;em&gt;This mattered, or still does, or maybe will someday.  Most though... It's kinda what I've been up to for the past twenty years.&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;Scroll if you must. Skim if you can. But if you get caught reading something you didn’t expect to care about... well, that's kind of the point.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frav36q8znjy8iufoxuik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frav36q8znjy8iufoxuik.png" alt="Alan Turing" width="800" height="799"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...The movie 'The Imitation Game', it's a good one...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Computer Science
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Code: The Hidden Language of Computer Hardware and Software&lt;/em&gt; – Charles Petzold
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mathematical Structures for Computer Science (Fifth Edition)&lt;/em&gt; – Judith L. Gersting
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Introduction to Algorithms&lt;/em&gt; – Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Introduction to the Theory of Computation&lt;/em&gt; – Michael Sipser
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Combinatorial Optimization: Algorithms and Complexity&lt;/em&gt; – Christos H. Papadimitriou, Kenneth Steiglitz
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Principles of Program Analysis&lt;/em&gt; – Flemming Nielson, Hanne Riis Nielson, Chris Hankin
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Elements of Computing Systems: Building a Modern Computer from First Principles&lt;/em&gt; – Noam Nisan&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbq42iz3xbfc4xg4rhi6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbq42iz3xbfc4xg4rhi6.jpeg" alt="My Keychron Q11" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...I've used 'stock' keyboards for a veeery long time and my stuff started to hurt.  Not anymore!!...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Software Engineering
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;The Object-Oriented Thought Process (Third Edition)&lt;/em&gt; – Matt Weisfeld
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Mythical Man-Month: Essays on Software Engineering&lt;/em&gt; – Frederick P. Brooks Jr.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Use Case Driven Object Modeling with UML: Theory and Practice&lt;/em&gt; – Doug Rosenberg, Matt Stephens
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Quest for Software Requirements&lt;/em&gt; – Roxanne E. Miller
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/em&gt; – Erich Gamma et al.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Object-Oriented Systems Design: An Integrated Approach&lt;/em&gt; – Edward Yourdon
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Metrics and Models in Software Quality Engineering (Second Edition)&lt;/em&gt; – Stephen H. Kan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Software Systems Architecture (Second Edition)&lt;/em&gt; – Nick Rozanski, Eoin Woods
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pattern-Oriented Software Architecture: A System of Patterns&lt;/em&gt; – Frank Buschmann et al.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;CMMI: Guidelines for Process Integration and Product Improvement&lt;/em&gt; – Mary Beth Chrissis, Mike Konrad, Sandy Shrum
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Queueing Systems, Volume 1: Theory&lt;/em&gt; – Leonard Kleinrock
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Queueing Systems, Volume 2: Computer Applications&lt;/em&gt; - Leonard Kleinrock&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Dataclysm&lt;/em&gt; – Christian Rudder
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Data Modeling: Theory and Practice&lt;/em&gt; – Graeme Simsion
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Life in Code: A Personal History of Technology&lt;/em&gt; – Ellen Ullman
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mh9fq13aanob02zma65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mh9fq13aanob02zma65.png" alt="Ada Lovelace" width="600" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...She didn't use a keyboard...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Software Development &amp;amp; Programming
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/em&gt; – Robert C. Martin
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Refactoring: Improving the Design of Existing Code&lt;/em&gt; – Martin Fowler et al.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/em&gt; – Eric Evans
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;JavaScript &amp;amp; jQuery: Interactive Front-End Web Development&lt;/em&gt; – Jon Duckett
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Front-End Web Development: The Big Nerd Ranch Guide&lt;/em&gt; – Chris Aquino, Todd Gandee
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Little LISPer&lt;/em&gt; - Daniel P. Friedman&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;sed &amp;amp; awk&lt;/em&gt; – Dale Dougherty
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mastering Regular Expressions (3rd Edition)&lt;/em&gt; – Jeffrey E.F. Friedl
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;GIS and Land Records: The ArcGIS Parcel Data Model&lt;/em&gt; – Nancy von Meyer
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Generative Deep Learning&lt;/em&gt; – David Foster
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;2600: The Hacker Quarterly – Summer 2017&lt;/em&gt; – 2600 Magazine
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;2600: The Hacker Quarterly – Spring 2018&lt;/em&gt; – 2600 Magazine
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;2600: The Hacker Quarterly – Summer 2018&lt;/em&gt; – 2600 Magazine
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How Hard is MQL4 Programming?&lt;/em&gt; – Jim Hodges
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Programming Beyond Practices&lt;/em&gt; – Gregory T. Brown
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Think Java: How to Think Like a Computer Scientist&lt;/em&gt; – Allen B. Downey
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Optimizing Java: Practical Techniques for Improving JVM Application Performance&lt;/em&gt; – Benjamin J. Evans
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Modern Java Recipes&lt;/em&gt; – Ken Kousen
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Continuous Enterprise Development in Java&lt;/em&gt; – Andrew Lee Rubinger
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;HTML5, JavaScript, and jQuery 24-Hour Trainer&lt;/em&gt; – Dane Cameron
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mobile HTML5: Using the Latest Today&lt;/em&gt; – Estelle Weyl
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Using SVG with CSS3 and HTML5: Vector Graphics for Web Design&lt;/em&gt; – Amelia Bellamy
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;CSS Secrets: Better Solutions to Everyday Web Design Problems&lt;/em&gt; – Lea Verou
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Working with Static Sites: Bringing the Power of Simplicity to Modern Sites&lt;/em&gt; – Raymond Camden
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;WebSocket: Lightweight Client-Server Communications&lt;/em&gt; – Andrew Lombardi&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60m8yleonh16mnnohcrh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60m8yleonh16mnnohcrh.png" alt="My DC" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...maybe wasn't me who took that. I decline to specify...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Computer Security
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Windows Security Internals&lt;/em&gt; – James Forshaw&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Criminalistics: An Introduction to Forensic Science&lt;/em&gt; (Lab Manual, 11th Edition) – Richard Saferstein; Meloan; James; Brettell&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Windows Registry Forensics: Advanced Digital Forensic Analysis of the Windows Registry&lt;/em&gt; - Harlan Carvey &lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnwdyurkb8etns39zmxc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnwdyurkb8etns39zmxc.png" alt="Bertrand Russell" width="460" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...read his philosophy when I was young. For me, the math waited for technology to poke a hole in my head to let it in...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Logic, Mathematics, &amp;amp; Physics
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Basic Technical Mathematics with Calculus (Ninth Edition)&lt;/em&gt; – Allyn J. Washington
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Discrete Mathematics for Computing&lt;/em&gt; – John E. Munro
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mathematics for Algorithm and Systems Analysis&lt;/em&gt; – Edward A. Bender, S. Gill Williamson
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Engineering Mathematics Handbook&lt;/em&gt; – Jan J. Tuma, Ph.D.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Introduction to Analysis&lt;/em&gt; – Maxwell Rosenlicht
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Functions of Mathematical Physics&lt;/em&gt; – Harry Hochstadt
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Complex Variables and the Laplace Transform for Engineers&lt;/em&gt; – Wilbur R. LePage
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Complex Integration &amp;amp; Cauchy's Theorem&lt;/em&gt; – G. N. Watson
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Fourier Series&lt;/em&gt; – Georgi P. Tolstov, Translator: Richard A. Silverman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Interpolation (Second Edition)&lt;/em&gt; – J. F. Steffensen
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;An Introduction to the Theory of Linear Spaces&lt;/em&gt; – Georgi E. Shilov, Translator: Richard A. Silverman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Matrix Computations and Semiseparable Matrices, Volume 1&lt;/em&gt; – Raf Vandebril, Marc Van Barel, Nicola Mastronardi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Matrix Computations and Semiseparable Matrices, Volume 2&lt;/em&gt; – Raf Vandebril, Marc Van Barel, Nicola Mastronardi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Topology&lt;/em&gt; – John G. Hocking, Gail S. Young
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Continuum: A Critical Examination of the Foundation of Analysis&lt;/em&gt; – Hermann Weyl, Translators: Stephen Pollard, Thomas Bole
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Analyzing Decision Making: Metric Conjoint Analysis&lt;/em&gt; – Jordan J. Louviere
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Games and Decisions: Introduction and Critical Survey&lt;/em&gt; – R. Duncan Luce, Howard Raiffa
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Principia Mathematica, Volume One&lt;/em&gt; – Alfred North Whitehead, Bertrand Russell
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Art of Modeling Dynamic Systems&lt;/em&gt; – Foster Morrison
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Drunkard’s Walk&lt;/em&gt; – Leonard Mlodinow
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Random Series and Stochastic Integrals&lt;/em&gt; – Stanisław Kwapień, Wojbor A. Woyczyński
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Markov Processes and Potential Theory&lt;/em&gt; – Robert M. Blumenthal, Ronald K. Getoor
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Finite Element Method: Basic Technique and Implementation&lt;/em&gt; – Pin Tong, John N. Rossettos
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Physics for Future Presidents&lt;/em&gt; – Richard A. Muller
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mensa: Logic Brainteasers&lt;/em&gt; – Mensa &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Invitation to Mathematics&lt;/em&gt; - William H. Glenn and Donovan A. Johnson&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Divine Proportion: A Study in Mathematical Beauty&lt;/em&gt; - H. E. Huntley &lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40rl3yrhj84m6wlnwp4t.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40rl3yrhj84m6wlnwp4t.jpeg" alt="The Right Hand" width="480" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...my right hand setup...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Statistics
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Naked Statistics: Stripping the Dread from the Data&lt;/em&gt; – Charles Wheelan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Signal and the Noise&lt;/em&gt; – Nate Silver
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Introductory Statistics with Randomization and Simulation&lt;/em&gt; – David M. Diez, Christopher D. Barr, Mine Çetinkaya-Rundel
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Fundamental Statistics for Behavioral Sciences (Eighth Edition)&lt;/em&gt; – Robert B. McCall
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Applied Multivariate Statistics for the Social Sciences (Fourth Edition)&lt;/em&gt; – James P. Stevens
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Probability and Statistical Inference for Scientists and Engineers&lt;/em&gt; – Isaac N. Gibra
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Design and Analysis of Experiments&lt;/em&gt; – Douglas C. Montgomery &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Second Course in Statistics: Regression Analysis (Sixth Edition)&lt;/em&gt; - William Mendenhall, Terry Sincich &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Qualitative Data Analysis: A Methods Sourcebook (Third Edition)&lt;/em&gt; - Matthew B. Miles, A. Michael Huberman, Johnny Saldana&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbsuz7md63b2adipouez.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbsuz7md63b2adipouez.png" alt="The Pits" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...Its the pits...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Economics
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;30-Second Economics (Editor)&lt;/em&gt; – Donald Marron
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Start Day Trading Now&lt;/em&gt; – Michael Sincere
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Alchemists: Three Central Bankers and a World on Fire&lt;/em&gt; – Neil Irwin
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Aftershock: Protect Yourself and Profit in the Next Global Financial Meltdown&lt;/em&gt; – David Wiedemer; Robert A. Wiedemer; Cindy Spitzer
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Value of Nothing: How to Reshape Market Society and Redefine Democracy&lt;/em&gt; – Raj Patel
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Small Is Beautiful: Economics as if People Mattered&lt;/em&gt; – E.F. Schumacher
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Free to Choose: A Personal Statement&lt;/em&gt; – Milton Friedman; Rose Friedman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The End of Poverty: Economic Possibilities for Our Time&lt;/em&gt; – Jeffrey D. Sachs
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The New Paradigm for Financial Markets: The Credit Crisis of 2008 and What It Means&lt;/em&gt; – George Soros
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Miracles of Barefoot Capitalism&lt;/em&gt; – Jim Klobuchar; Susan Cornell Wilkes
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Buying Freedom: The Ethics and Economics of Slave Redemption&lt;/em&gt; – Kwame Anthony Appiah; Martin Bunzl
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Money Mischief: Episodes in Monetary History&lt;/em&gt; – Milton Friedman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Market&lt;/em&gt; – Alan Aldridge
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Balance: The Economics of Great Powers from Ancient Rome to Modern America&lt;/em&gt; – Glenn Hubbard; Tim Kane
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Sinews of American Commerce&lt;/em&gt; – Roy A. Foulke
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Economics of Microfinance (Second Edition)&lt;/em&gt; – Beatriz Armendáriz, Jonathan Morduch
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Macroeconomics: Principles &amp;amp; Policy (Eleventh Edition, 2010 Update)&lt;/em&gt; – William J. Baumol, Alan S. Blinder
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Microeconomics: Principles, Problems, and Policies (Eighteenth Edition)&lt;/em&gt; – Campbell R. McConnell, Stanley L. Brue, Sean M. Flynn
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Economics (Fifth Edition)&lt;/em&gt; – Walter J. Wessels
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Engineering Economic Analysis (Twelfth Edition)&lt;/em&gt; – Donald G. Newnan, Jerome P. Lavelle, Ted G. Eschenbach
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The New Palgrave: Marxian Economics&lt;/em&gt; – John Eatwell, Murray Milgate, Peter Newman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The New Palgrave: General Equilibrium&lt;/em&gt; – John Eatwell, Murray Milgate, Peter Newman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;SuperFreakonomics&lt;/em&gt; – Steven D. Levitt &amp;amp; Stephen J. Dubner
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Worldly Philosophers: The Lives, Times, and Ideas of the Great Economic Thinkers&lt;/em&gt; – Robert L. Heilbroner
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How to Invest&lt;/em&gt; – Michael Edwards
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Forex for Beginners&lt;/em&gt; – James Stuart
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Black Book of Forex Trading&lt;/em&gt; – Paul Langer
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;50 Pips A Day Forex Strategy&lt;/em&gt; – Laurentiu Damir
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The 10XROI Trading System&lt;/em&gt; – L.R. Thomas
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The 1 Hour Trade&lt;/em&gt; – Brian Anderson
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Forex Made Simple&lt;/em&gt; – Kel Butcher
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Forex Strategies Revealed&lt;/em&gt; – Ade Asefeso MCIPS
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Little Book of Currency Trading&lt;/em&gt; – Kathy Lien
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Market Wizards&lt;/em&gt; – Jack D. Schwager
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;My Life as a Quant: Reflections on Physics and Finance&lt;/em&gt; – Emanuel Derman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Wrong Answer Faster: The Inside Story of Making the Machine that Trades Trillions&lt;/em&gt; – Michael Goodkin &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Dictionary of Finance and Investment Terms (Sixth Edition)&lt;/em&gt; - John Downes, Jordan Elliot Goodman &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A History of Economic Thought (New and Revised Edition)&lt;/em&gt; - Eric Roll &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Income Property Valuation: Principles and Techniques of Appraising Income-Producing Real Estate&lt;/em&gt; - William N. Kinnard, Jr. &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Investment Valuation: Tools and Techniques for Determining the Value of Any Asset (Second Edition)&lt;/em&gt; - Aswath Damodaran&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Econometric Models and Economic Forecasts (Fourth Edition)&lt;/em&gt; - Robert S. Pindyck, Daniel L. Rubinfeld &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Rice Economies: Technology and Development in Asian Societies&lt;/em&gt; - Francesca Bray &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Imperialism: The Highest Stage of Capitalism&lt;/em&gt; - V. I. Lenin &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Economics: Mainstream Readings and Radical Critiques&lt;/em&gt; - Edited by David Mermelstein; Special Introduction by Robert Lekachman &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Geography of the World Economy (Fourth Edition)&lt;/em&gt; - Paul Knox, John Agnew, Linda McCarthy &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Time Series Econometrics: Learning Through Replication&lt;/em&gt; - John D. Levendis &lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8yw7s4m36rg63j0hoih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8yw7s4m36rg63j0hoih.png" alt="Don't take my coffee" width="800" height="930"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...GPT generated scone recipe (2022). gotta have some coffee first before we get down to...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Business
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Enchantment: The Art of Changing Hearts, Minds, and Actions&lt;/em&gt; – Guy Kawasaki
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Risky Is the New Safe&lt;/em&gt; – Randy Gage
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Flash Foresight: How to See the Invisible and Do the Impossible&lt;/em&gt; – Daniel Burrus; John David Mann
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Principles&lt;/em&gt; – Ray Dalio, Business
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Business Model Generation&lt;/em&gt; – Alexander Osterwalder; Yves Pigneur, Business
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Six-Week Start-Up&lt;/em&gt; – Rhonda Abrams
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Small Time Operator&lt;/em&gt; – Bernard B. Kamoroff
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Legal Guide for Starting &amp;amp; Running a Small Business (13th Edition)&lt;/em&gt; – Fred S. Steingold
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Standard Manual for Supervisors&lt;/em&gt; – Bureau of Business Practice (1980)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Personal MBA: Master the Art of Business&lt;/em&gt; – Josh Kaufman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Jab, Jab, Jab, Right Hook: How to Tell Your Story in a Noisy Social World&lt;/em&gt; – Gary Vaynerchuk
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4fonor08vgw9dhh5c8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4fonor08vgw9dhh5c8q.png" alt="Sonover!?" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...huh?! who me?!? how?!...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Writing &amp;amp; Communication
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;The St. Martin's Guide to Writing (Short 6th Edition)&lt;/em&gt; – Rise B. Axelrod; Charles R. Cooper
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Speech Communication: An Interpersonal Approach&lt;/em&gt; – Ernest G. Bormann; Nancy C. Bormann
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Writers INC&lt;/em&gt; – Patrick Sebranek; Verne Meyer; Dave Kemper
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Writer's Reference (Fourth Edition)&lt;/em&gt; – Diana Hacker
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Untangling the Web: A Guide to Mass Communication on the Web&lt;/em&gt; – Deborah Greh
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;75 Readings (Eighth Edition): An Anthology&lt;/em&gt; – Santi Buscemi, Charlotte Smith
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Publication Manual of the American Psychological Association (Sixth Edition)&lt;/em&gt; – APA
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Young People, Ethics, and the New Digital Media&lt;/em&gt; – Carrie James&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlomhsl4itpqpkn5lkf6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlomhsl4itpqpkn5lkf6.jpeg" alt="Good Design" width="512" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...not me, but this is like 10 design books in one image...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Design
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;The Graphic Design Exercise Book (Second Edition)&lt;/em&gt; – Jessica Glaser
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Layout Index&lt;/em&gt; – Jim Krause
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Visual Grammar&lt;/em&gt; – Christian Leborg
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Layout Essentials: 100 Design Principles for Using Grids&lt;/em&gt; – Beth Tondreau
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Typographic Systems&lt;/em&gt; – Kimberly Elam
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Geometry of Design (Second Edition)&lt;/em&gt; – Kimberly Elam
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Grid Systems&lt;/em&gt; – Kimberly Elam
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Typographic Workbook: A Primer to History, Techniques and Artistry&lt;/em&gt; – Kate Clair
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Elements of Typographic Style (Version 3.1)&lt;/em&gt; – Robert Bringhurst
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Number by Colors&lt;/em&gt; – Brand Fortner, Theodore E. Meyer
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Sketching User Experiences: The Workbook&lt;/em&gt; – Saul Greenberg et al.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Information Architecture for Designers&lt;/em&gt; – Peter Van Dijck
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Understanding Color Management&lt;/em&gt; – Abhay Sharma
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Information Design&lt;/em&gt; – Editor: Robert Jacobson, Foreword: Richard Saul Wurman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Thoughtful Interaction Design: A Design Perspective on Information Technology&lt;/em&gt; – Jonas Löwgren, Erik Stolterman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Search Patterns: Design for Discovery&lt;/em&gt; – Peter Morville, Jeffery Callender
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Design Studies: Theory and Research in Graphic Design - A Reader&lt;/em&gt; – Editor: Audrey Bennett
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Practical Guide to Usability Testing (Revised Edition)&lt;/em&gt; – Joseph S. Dumas, Janice C. Redish
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;About Face 3: The Essentials of Interaction Design&lt;/em&gt; – Alan Cooper et al.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Observing the User Experience: A Practitioner's Guide to User Research&lt;/em&gt; – Mike Kuniavsky
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Don't Make Me Think Revisited: A Common Sense Approach to Web Usability&lt;/em&gt; – Steve Krug
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Function, Restraint, and Subversion in Typography&lt;/em&gt; – J. Namdev Hardisty
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Seventy-nine Short Essays on Design&lt;/em&gt; – Michael Bierut
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Visual Research: An Introduction to Research Methodologies in Graphic Design&lt;/em&gt; – Ian Noble; Russell Bestley
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Envisioning Information&lt;/em&gt; – Edward R. Tufte
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Visual Display of Quantitative Information&lt;/em&gt; – Edward R. Tufte
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Design of Everyday Things&lt;/em&gt; – Donald A. Norman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Meggs' History of Graphic Design (Fourth Edition)&lt;/em&gt; – Philip B. Meggs; Alston W. Purvis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Materials and Design: The Art and Science of Material Selection in Product Design (3rd Edition)&lt;/em&gt; – Mike Ashby; Kara Johnson
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6faq4zrclbi0g1opnjvs.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6faq4zrclbi0g1opnjvs.jpeg" alt="Grandma's Portable Drafting Board" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...grandma's portable drafting board...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Art &amp;amp; Music
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Cartooning the Head &amp;amp; Figure&lt;/em&gt; – Jack Hamm
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Sketching Made Easy&lt;/em&gt; – Picadilly USA
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How to See, How to Draw: Keys to Realistic Drawing&lt;/em&gt; – Claudia Nice
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Frida: A Biography of Frida Kahlo&lt;/em&gt; – Hayden Herrera
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Music First (Fifth Edition)&lt;/em&gt; – Gary C. White
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ett Bildverk om Småland&lt;/em&gt; – Allhems Förlag (Swedish Art/Photo Book)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Applied Photography: Student Manual&lt;/em&gt; – Ervin A. Dennis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Applied Photography (Second Edition)&lt;/em&gt; – Ervin A. Dennis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Art of Atari&lt;/em&gt; – Tim Lapetino
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Basic Guide to How to Read Music&lt;/em&gt; – Helen Cooper
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Piano Adventures (2nd Edition)&lt;/em&gt; – Nancy &amp;amp; Randall Faber
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Keyword: Palestine II – An Art Exhibition and Auction in Support of the Institute for Palestine Studies&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Gig Bag Book of Practical Pentatonics for All Guitarists&lt;/em&gt; – Matt Scharfglass
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Gig Bag Book of Scales for All Guitarists&lt;/em&gt; – Joe Dineen &amp;amp; Mark Bridges
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Gig Bag Book of Guitar Tab Chords&lt;/em&gt; – Mark Bridges
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Frida Kahlo: At Home&lt;/em&gt; – Suzanne Barbezat
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Frida Kahlo: A Life in Art&lt;/em&gt; – Mieke Bal, et al.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Learn World Calligraphy&lt;/em&gt; – Margaret Shepherd
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frabzf1fgm1dt5hyghx1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frabzf1fgm1dt5hyghx1u.png" alt="Minneapolis, Mn - Photo By David Midlo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...Minneapolis, Minnesota ~ maybe was me, borrowed camera. I was on the correct side of the yellow tape at the time...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Behavioral Science &amp;amp; Education
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;How to Read a Book&lt;/em&gt; – Mortimer Adler, Charles Van Doren
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Helping Children Succeed: What Works and Why&lt;/em&gt; – Paul Tough
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mastering the Instructional Design Process (Fourth Edition)&lt;/em&gt; – William J. Rothwell; H.C. Kazanas
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Teach Like Your Hair's on Fire: The Methods and Madness Inside Room 56&lt;/em&gt; – Rafe Esquith
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Essay Connection: Instructor’s Edition (Third Edition)&lt;/em&gt; – Lynn Z. Bloom
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Creating Innovators: The Making of Young People Who Will Change the World&lt;/em&gt; – Tony Wagner
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How to Assess Higher-Order Thinking Skills in Your Classroom&lt;/em&gt; – Susan M. Brookhart
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Positive Discipline Tools for Teachers&lt;/em&gt; – Jane Nelsen, Ed.D. &amp;amp; Kelly Gfroerer, Ph.D.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Learning Unlimited: Using Homework to Engage Your Child's Natural Style of Intelligence&lt;/em&gt; – Dawna Markova &amp;amp; Anne R. Powell
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The One World Schoolhouse&lt;/em&gt; – Salman Khan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Proust and the Squid: The Story and Science of the Reading Brain&lt;/em&gt; – Maryanne Wolf
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Thinking, Fast and Slow&lt;/em&gt; – Daniel Kahneman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Subliminal: How Your Unconscious Mind Rules Your Behavior&lt;/em&gt; – Leonard Mlodinow
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Power of Habit: Why We Do What We Do in Life and Business&lt;/em&gt; – Charles Duhigg
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Myth of Normal&lt;/em&gt; – Gabor Maté, MD
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;In the Realm of Hungry Ghosts&lt;/em&gt; – Gabor Maté, MD
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Kids, Parents, and Power Struggles&lt;/em&gt; – Mary Sheedy Kurcinka
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Post-Traumatic Growth Guidebook&lt;/em&gt; – Arielle Schwartz, Ph.D.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Humble Inquiry: The Gentle Art of Asking Instead of Telling&lt;/em&gt; – Edgar H. Schein
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Head Strong&lt;/em&gt; – Dave Asprey
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Genius in All of Us&lt;/em&gt; – David Shenk
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The First 20 Hours: How to Learn Anything… Fast!&lt;/em&gt; – Josh Kaufman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Democratizing Innovation&lt;/em&gt; – Eric von Hippel
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Future of Learning Institutions in a Digital Age&lt;/em&gt; – Cathy N. Davidson &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Rules and Representations&lt;/em&gt; – Noam Chomsky &lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj11xjheodfd8j7xb5ne.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj11xjheodfd8j7xb5ne.jpeg" alt="Rodeo Parade" width="640" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...who doesn't like candy while GTDing?...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Productivity
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Think and Grow Rich – Napoleon Hill
&lt;/li&gt;
&lt;li&gt;Pragmatic Thinking and Learning: Refactor Your Wetware – Andy Hunt
&lt;/li&gt;
&lt;li&gt;Procrastinate on Purpose: 5 Permissions to Multiply Your Time – Rory Vaden
&lt;/li&gt;
&lt;li&gt;Take the Stairs – Rory Vaden
&lt;/li&gt;
&lt;li&gt;The Magic of Thinking Big – David J. Schwartz, Ph.D.
&lt;/li&gt;
&lt;li&gt;Why We Sleep: Unlocking the Power of Sleep and Dreams – Matthew Walker, Ph.D.
&lt;/li&gt;
&lt;li&gt;Dog Care 101: Essential Tips – VCA Animal Hospitals
&lt;/li&gt;
&lt;li&gt;Wiring Simplified – H. P. Richter; W. Creighton Schwan; Frederic P. Hartwell
&lt;/li&gt;
&lt;li&gt;How to Fix Anything – Popular Mechanics
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0xj2o62z5ymvsx3y2en.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0xj2o62z5ymvsx3y2en.png" alt="When the wise man points at the moon, the fool looks at the finger." width="220" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...when the wise man points at the moon, the fool looks at the finger...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Philosophy &amp;amp; Ethics
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Persian Letters&lt;/em&gt; – Montesquieu
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Infinity Book&lt;/em&gt; – Eric Gorvin
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;More Matrix and Philosophy: Revolutions and Reloaded Decoded&lt;/em&gt; – Edited by William Irwin
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Women Philosophers of the Early Modern Period&lt;/em&gt; – Margaret Atherton (Editor)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ethics for the Information Age&lt;/em&gt; (Fourth Edition) – Michael J. Quinn
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ethics: Theory and Contemporary Issues&lt;/em&gt; (Fourth Edition) – Barbara MacKinnon
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Structure of Scientific Revolutions&lt;/em&gt; (Second Edition, Enlarged) – Thomas S. Kuhn
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Philosophy of Mathematics: Selected Readings&lt;/em&gt; (Second Edition) – Editors: Paul Benacerraf, Hilary Putnam
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Star Wars and Philosophy&lt;/em&gt; – Kevin S. Decker &amp;amp; Jason T. Eberl
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Art of Living an Absurd Existence: Paradoxes and Thought Experiments That Change the Way You Think&lt;/em&gt; – Robert Pantano
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Miniature Guide to Understanding Ethical Reasoning&lt;/em&gt; – Dr. Richard Paul &amp;amp; Dr. Linda Elder
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Art of Living: A New Interpretation&lt;/em&gt; – Sharon Lebell (from Epictetus)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How to Die: An Ancient Guide to the End of Life&lt;/em&gt; – Seneca
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;On the Shortness of Life&lt;/em&gt; – Seneca
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Letters from a Stoic&lt;/em&gt; – Seneca
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Meditations&lt;/em&gt; – Marcus Aurelius
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Walden and Civil Disobedience&lt;/em&gt; – Henry David Thoreau
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Basic Works of Aristotle&lt;/em&gt; – Edited by Richard McKeon
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ethics&lt;/em&gt; – Dietrich Bonhoeffer&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakwpukq3hktee2x2z245.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakwpukq3hktee2x2z245.jpeg" alt="Egyptian Jugglers" width="320" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...found in a tomb mural in Beni Hasan, Egypt. This is the earliest known record of humans juggling. 1994–1781 BCE, Middle Kingdom Period...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Arabic Studies
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Making Out in Arabic: From Everyday Conversation to the Language of Love&lt;/em&gt; – Fethi Mansouri
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Life of Ernesto “Che” Guevara (Arabic Edition)&lt;/em&gt; – Mahmoud Abdel Rahman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Media Arabic: A Coursebook for Reading Arabic News&lt;/em&gt; – Alaa Elgibali &amp;amp; Nevenka Korica
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Elementary Modern Standard Arabic 1: Pronunciation and Writing; Lessons 1–30&lt;/em&gt; – Peter F. Abboud et al.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Modern Arabic Workbook 1&lt;/em&gt; – Librairie du Liban
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Modern Arabic Workbook 2&lt;/em&gt; – Librairie du Liban
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Modern Arabic Teacher’s Manual&lt;/em&gt; – Librairie du Liban
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Arabic Language for Beginners Workbook 1&lt;/em&gt; – World Federation of Arab Islamic Inter Schools
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;English Grammar for Students of Arabic&lt;/em&gt; – Ernest N. McCarus
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Arabic Grammar&lt;/em&gt; (BarCharts, Inc.)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Easy Arabic Grammar&lt;/em&gt; – Jane Wightwick &amp;amp; Mahmoud Gaafar
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Easy Arabic Script&lt;/em&gt; – Jane Wightwick &amp;amp; Mahmoud Gaafar
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Arabic Alphabet: How to Read &amp;amp; Write It&lt;/em&gt; – Nicholas Awde &amp;amp; Putros Samano
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Arabic Reading &amp;amp; Writing Made Easy&lt;/em&gt; – Dr. Abu Ameenah Bilal Philips
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Egyptian Colloquial Arabic&lt;/em&gt; – František Ondráš
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Egyptian Colloquial Arabic Vocabulary&lt;/em&gt; – [Author not listed]
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Barron’s Foreign Language Guides: 501 Arabic Verbs&lt;/em&gt; – Raymond P. Scheindlin, Ph.D.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;From Code-Switching to Borrowing: A Case Study of Moroccan Arabic&lt;/em&gt; – Jeffrey Heath
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Arabic Writing Workbook&lt;/em&gt; – Taqwa Prints
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Sanabel al-Khatt (سنابل الخط)&lt;/em&gt; – Zeinat Abdel Hadi Al-Karmi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ata’allam al-‘Arabiyya 2 – Workbook (أتعلّم العربية 2 - كراس التمارين)&lt;/em&gt; – Al-Habib Al-Fassi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Learning Is Fun with Write and Erase: Arabic Alphabet Level 1&lt;/em&gt; – Rana Selo
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Learning Is Fun with Write and Erase: Arabic Alphabet Level 2&lt;/em&gt; – Rana Selo
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Book of Mormon: Another Testament of Jesus Christ (Arabic Edition)&lt;/em&gt; – The Church of Jesus Christ of Latter-day Saints
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Lord of the Flies&lt;/em&gt; – William Golding (Persian (Farsi) Translation by Mozhgan Mansouri)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Al-Qareeb Al-Mawrid Pocket Dictionary&lt;/em&gt; – Munir Baalbaki &amp;amp; Dr. Rohi Baalbaki
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Arabic Practical Dictionary&lt;/em&gt; – Nicholas Awde &amp;amp; Kevin Smith
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Egyptian Arabic: The Rough Guide Dictionary Phrasebook&lt;/em&gt; – Lexus
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Alif Baa: Introduction to Arabic Letters and Sounds&lt;/em&gt; – Kristen Brustad, Mahmoud Al-Batal, Abbas Al-Tonsi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Easy Arabic Reading&lt;/em&gt; – Mostafa Al Gindy
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Arabic Stories for Language Learners: Traditional Middle Eastern Tales in Arabic and English&lt;/em&gt; – Hezi Brosh &amp;amp; Lutfi Mansur
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Book of Mormon: Another Testament of Jesus Christ (Arabic Edition)&lt;/em&gt; – The Church of Jesus Christ of Latter-day Saints
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Arabic Business Dictionary&lt;/em&gt; - Morry Sofer (General Editor), Adnane Ettayebi (Arabic Editor)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Holy Bible: New International Version (Arabic–English Edition)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Kallimni 'Arabi Bishweesh: A Beginner’s Course in Spoken Egyptian Arabic 1&lt;/em&gt; - Samia Louis&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjmkd7ty5uhmxn05cdd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjmkd7ty5uhmxn05cdd3.png" alt="My Pandas" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...this is my vector panda friend, he has emotions when poets, playwrights, and novelists turn it up to 11...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Literature &amp;amp; Poetry
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Othello&lt;/em&gt; – William Shakespeare
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Anna Karenina&lt;/em&gt; – Leo Tolstoy
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Fallon&lt;/em&gt; – Louis L'Amour
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Squirrel Seeks Chipmunk&lt;/em&gt; – David Sedaris
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Poems&lt;/em&gt; – Ben Gillespie
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Jonathan Livingston Seagull&lt;/em&gt; – Richard Bach
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;I'm Gone&lt;/em&gt; – Jean Echenoz
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Burr&lt;/em&gt; – Gore Vidal
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;War and Peace: Parts I &amp;amp; II&lt;/em&gt; – Leo Tolstoy
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;One Day in the Life of Ivan Denisovich&lt;/em&gt; – Aleksandr Solzhenitsyn
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;All the King’s Men&lt;/em&gt; – Robert Penn Warren
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Kite Runner&lt;/em&gt; – Khaled Hosseini
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Battlefields and Playgrounds&lt;/em&gt; – Janos Nyiri
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Immortal Poems of the English Language: An Anthology&lt;/em&gt; – Edited by Oscar Williams
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Great Gatsby&lt;/em&gt; – F. Scott Fitzgerald
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Holidays on Ice&lt;/em&gt; – David Sedaris
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;When You Are Engulfed in Flames&lt;/em&gt; – David Sedaris
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Adventures of Tom Sawyer&lt;/em&gt; – Mark Twain
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Peppered Moth&lt;/em&gt; – Margaret Drabble
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Cannery Row&lt;/em&gt; – John Steinbeck
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Utopia&lt;/em&gt; – Sir Thomas More
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Farewell to Arms&lt;/em&gt; – Ernest Hemingway
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Moveable Feast&lt;/em&gt; – Ernest Hemingway
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The God of Small Things&lt;/em&gt; – Arundhati Roy
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Iliad and The Odyssey&lt;/em&gt; – Translated by George Chapman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Candide&lt;/em&gt; – Voltaire
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Sound and the Fury&lt;/em&gt; – William Faulkner
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Jane Eyre&lt;/em&gt; – Charlotte Brontë
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Brave New World&lt;/em&gt; – Aldous Huxley
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Tale of Two Cities&lt;/em&gt; – Charles Dickens
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Lord of the Flies&lt;/em&gt; – William Golding (Persian Translation by Mozhgan Mansouri)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Dramas of Sophocles&lt;/em&gt; – Translated by Sir George Young
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Lyrical Dramas of Aeschylus in English Verse&lt;/em&gt; – John Stuart Blackie
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Journey to the Centre of the Earth&lt;/em&gt; – Jules Verne
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;As Long as the Lemon Trees Grow&lt;/em&gt; – Zoulfa Katouh
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Child in Palestine: The Cartoons of Naji al-Ali&lt;/em&gt; – Naji al-Ali
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;P is for Palestine: A Palestine Alphabet Book&lt;/em&gt; – Golbarg Bashi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;These Olive Trees: A Palestinian Family’s Story&lt;/em&gt; – Aya Ghanameh
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Shakespeare: The Invention of the Human&lt;/em&gt; – Harold Bloom
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Where the Sidewalk Ends&lt;/em&gt; – Shel Silverstein
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Wrinkle in Time&lt;/em&gt; – Madeleine L'Engle
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Wind in the Door&lt;/em&gt; – Madeleine L'Engle
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Swiftly Tilting Planet&lt;/em&gt; – Madeleine L'Engle
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Many Waters&lt;/em&gt; – Madeleine L'Engle
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;An Acceptable Time&lt;/em&gt; – Madeleine L'Engle
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Lightning Thief&lt;/em&gt; – Rick Riordan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Sea of Monsters&lt;/em&gt; – Rick Riordan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Titan’s Curse&lt;/em&gt; – Rick Riordan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Battle of the Labyrinth&lt;/em&gt; – Rick Riordan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Last Olympian&lt;/em&gt; – Rick Riordan
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Foundation Trilogy&lt;/em&gt; – Isaac Asimov
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;When Worlds Collide&lt;/em&gt; – Edwin Balmer &amp;amp; Philip Wylie
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Hunger Games&lt;/em&gt; – Suzanne Collins
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mike Mars Flies the Dyna-Soar&lt;/em&gt; – Donald A. Wollheim
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mike Mars in Orbit&lt;/em&gt; – Donald A. Wollheim
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mike Mars Flies the X-15&lt;/em&gt; – Donald A. Wollheim
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Harry Potter and the Sorcerer’s Stone&lt;/em&gt; – J.K. Rowling
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Harry Potter and the Chamber of Secrets&lt;/em&gt; – J.K. Rowling
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Harry Potter and the Prisoner of Azkaban&lt;/em&gt; – J.K. Rowling
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Harry Potter and the Goblet of Fire&lt;/em&gt; – J.K. Rowling
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Harry Potter and the Order of the Phoenix&lt;/em&gt; – J.K. Rowling
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Magician’s Nephew&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Lion, the Witch and the Wardrobe&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Horse and His Boy&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Prince Caspian&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Voyage of the Dawn Treader&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Silver Chair&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Last Battle&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Uncle Tom's Cabin&lt;/em&gt; – Harriet Beecher Stowe
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Picture of Dorian Gray&lt;/em&gt; – Oscar Wilde
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pride and Prejudice&lt;/em&gt; – Jane Austen
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Sense and Sensibility&lt;/em&gt; – Jane Austen
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Scarlet Letter&lt;/em&gt; – Nathaniel Hawthorne
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Great Expectations&lt;/em&gt; – Charles Dickens
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Works of Edgar Allan Poe – Volume 1&lt;/em&gt; – Edgar Allan Poe
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Adventures of Sherlock Holmes&lt;/em&gt; – Sir Arthur Conan Doyle&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fitj2anq6egzrr0fawkv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fitj2anq6egzrr0fawkv7.png" alt="Minneapolis Times" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...found by my aunt and I going through her aunt's things...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  History
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;The Energy to Make Things Better: An Illustrated History of Northern States Power Company – NSP&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A History of World Societies, Volume I: To 1715 – McKay; Hill; Buckler; Ebrey; Beck&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A History of World Societies, Volume II: Since 1500 – McKay; Hill; Buckler; Ebrey; Beck&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Western Heritage Since 1300 (Sixth Edition) – Donald Kagan, Steven Ozment, Frank M. Turner&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Europe: A History – Norman Davies&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;1688: A Global History – John E. Wills, Jr.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Native Roots: How the Indians Enriched America – Jack Weatherford&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Jew, God and History – Max I. Dimont&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pirates: Terror on the High Seas – Angus Konstam&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Life and Words of John F. Kennedy – James Playsted Wood&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A History of Modern Germany: 1871 to Present (Fifth Edition) – Dietrich Orlow&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Walter Lippmann and the American Century – Ronald Steel&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;American Brutus: John Wilkes Booth and the Lincoln Conspiracies – Michael W. Kauffman&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Darker Nations: A People's History of the Third World – Vijay Prashad&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Dismantling Green Colonialism: Energy and Climate Justice in the Arab Region – Hamza Hamouchene &amp;amp; Katie Sandwell&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A People’s History of the United States – Howard Zinn&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Jakarta Method – Vincent Bevins&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How Europe Underdeveloped Africa – Walter Rodney&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Idea of Israel: A History of Power and Knowledge – Ilan Pappé&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Twelve Years a Slave – Solomon Northup&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Leila Khaled: Icon of Palestinian Liberation – Sarah Irving&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Ancient Mesopotamia: Portrait of a Dead Civilization – A. Leo Oppenheim&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Wink: The Incredible Life and Epic Journey of Jimmy Winkfield – Ed Hotaling&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;From Slavery to Freedom (Seventh Edition) – John Hope Franklin, Alfred A. Moss Jr.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How the Irish Became White – Noel Ignatiev&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwrp7yh93ea179gb4320.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwrp7yh93ea179gb4320.png" alt="mnemonic" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...Ḥāfiẓ, from a lifetime ago...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Mythology &amp;amp; Religion
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Many Peoples, Many Faiths: Women and Men in the World Religions&lt;/em&gt; – Robert S. Ellwood; Barbara A. McGraw
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Holy Qur'an (with English Translation and Commentary)&lt;/em&gt; – Maulana Muhammad Ali
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The New Inductive Study Bible, Updated New American Standard Bible&lt;/em&gt; – Harvest House Publishers
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How to Read the Bible for All Its Worth&lt;/em&gt; – Gordon D. Fee, Douglas Stuart
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;One Year Chronological Study Bible&lt;/em&gt; – Tyndale House
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Islam: Balancing Life and Beyond&lt;/em&gt; – Suhal Kapoor
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Proslogium, Monologium, Cur Deus Homo, Gaunilo's In Behalf of the Fool&lt;/em&gt; – St. Anselm
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Islam: Top 50 Questions Answered&lt;/em&gt; – Saheeh International
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Al-Fatihah and Juz' ‘Amma: English Translation and Commentary&lt;/em&gt; – King Fahd Complex
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Global Messenger: Muhammad (Peace Be Upon Him), A Short Biography&lt;/em&gt; – Saheeh International
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Christians&lt;/em&gt; – Bamber Gascoigne
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Classical Mythology (Fifth Edition)&lt;/em&gt; – Mark P.O. Morford &amp;amp; Robert J. Lenardon&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Why I'm not a Christian&lt;/em&gt; - Bertrand Russell&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Bulfinch’s Mythology&lt;/em&gt; – Thomas Bulfinch
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Clear Quran&lt;/em&gt; – Book of Signs Foundation
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Islam (Seventh Edition)&lt;/em&gt; – Caesar E. Farah, Ph.D.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Great Divorce&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mere Christianity&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Screwtape Letters&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Problem of Pain&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Grief Observed&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Four Loves&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Reflections on the Psalms&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Surprised by Joy&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How to Pray&lt;/em&gt; – C.S. Lewis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Celebration of Discipline: The Path to Spiritual Growth&lt;/em&gt; – Richard J. Foster&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Letters from a Skeptic: A Son Wrestles with His Father's Questions about Christianity&lt;/em&gt; – Greg Boyd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;God of the Possible: A Biblical Introduction to the Open View of God&lt;/em&gt; – Greg Boyd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;God at War: The Bible and Spiritual Conflict&lt;/em&gt; – Greg Boyd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Is God to Blame? Moving Beyond Pat Answers to the Problem of Suffering&lt;/em&gt; – Greg Boyd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Myth of a Christian Nation: How the Quest for Political Power Is Destroying the Church&lt;/em&gt; – Greg Boyd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Seeing Is Believing: Experience Jesus Through Imaginative Prayer&lt;/em&gt; – Greg Boyd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Satan and the Problem of Evil: Constructing a Trinitarian Warfare Theodicy&lt;/em&gt; – Greg Boyd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Astonished by God: Ten Truths to Turn the World Upside Down&lt;/em&gt; – John Piper
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Justification of God: An Exegetical and Theological Study of Romans 9:1–23&lt;/em&gt; – John Piper
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Is God Real or Pretend?: A Comparative Religion Book for Kids&lt;/em&gt; – JJ Flowers
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Short and Easy Method of Prayer – Enhanced Version&lt;/em&gt; – Madame Guyon
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Spiritual Torrents&lt;/em&gt; – J.M.B. De La Mothe Guyon
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Pursuit of God&lt;/em&gt; – A.W. Tozer
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Life and Legends of Saint Francis of Assisi&lt;/em&gt; – Father Candide Chalippe
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Confessions of St. Augustine&lt;/em&gt; – St. Augustine
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Concerning Christian Liberty&lt;/em&gt; – Martin Luther
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Lives of the Saints&lt;/em&gt; – Alban Butler
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Letters of Madam Guyon&lt;/em&gt; – Jeanne Marie Bouvier de la Motte Guyon
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Evidential Power of Beauty: Science and Theology Meet&lt;/em&gt; – Thomas Dubay
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Power of Now: A Guide to Spiritual Enlightenment&lt;/em&gt; – Eckhart Tolle
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmokob2qrt257p2sls23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmokob2qrt257p2sls23.png" alt="Mad Magazine" width="800" height="925"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...what generation didn't get mad...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Political Science
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Understanding American Government (Seventh Edition)&lt;/em&gt; – Susan Welch, John Gruhl, John Comer, Susan M. Rigdon
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Press Effect: Politicians, Journalists, and the Stories That Shape the Political World&lt;/em&gt; – Kathleen Hall Jamieson; Paul Waldman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;In Defence of Politics&lt;/em&gt; – Bernard Crick
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Institutions of the European Union&lt;/em&gt; – John Peterson; Michael Shackleton
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Doing Empirical Political Research&lt;/em&gt; – James M. Carlson, Mark S. Hyde
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Which Side Are You On? An Introduction to Politics&lt;/em&gt; – Stephen Rosskamm Shalom
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Kennedy and the Press: The News Conferences&lt;/em&gt; – Edited and Annotated by Harold W. Chase and Allen H. Lerman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Audacity of Hope&lt;/em&gt; – Barack Obama
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Prisoners of Reason: Game Theory and Neoliberal Political Economy&lt;/em&gt; – S. M. Amadae
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Tuned Out: Why Americans Under 40 Don’t Follow the News&lt;/em&gt; – David T. Z. Mindich
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Media, Politics and Government&lt;/em&gt; – Hoyt Purvis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Rockefeller File&lt;/em&gt; – Gary Allen
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Our Endangered Values: America's Moral Crisis&lt;/em&gt; – Jimmy Carter
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Reason to Believe&lt;/em&gt; – Mario Cuomo
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Robert Kennedy and His Times&lt;/em&gt; – Arthur Schlesinger Jr.
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Mueller Report&lt;/em&gt; – The Washington Post
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Middle of Everywhere: Helping Refugees Enter the American Community&lt;/em&gt; – Mary Pipher
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Between the World and Me&lt;/em&gt; – Ta-Nehisi Coates
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How Not to Get Shot: And Other Advice From White People&lt;/em&gt; – D. L. Hughley
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Communist Manifesto&lt;/em&gt; – Karl Marx &amp;amp; Friedrich Engels
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;On Palestine&lt;/em&gt; – Noam Chomsky &amp;amp; Ilan Pappé
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Propaganda and the Public Mind&lt;/em&gt; – Noam Chomsky
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Hegemony or Survival: America’s Quest for Global Dominance&lt;/em&gt; – Noam Chomsky
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Withdrawal: Iraq, Libya, Afghanistan, and the Fragility of U.S. Power&lt;/em&gt; – Noam Chomsky &amp;amp; Vijay Prashad
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Crude Capitalism: Oil, Corporate Power and the Making of the World Market&lt;/em&gt; – Adam Hanieh
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Image and Reality of the Israel–Palestine Conflict&lt;/em&gt; – Norman G. Finkelstein
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Except for Palestine: The Limits of Progressive Politics&lt;/em&gt; – Marc Lamont Hill &amp;amp; Mitchell Plitnick
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Perfect Victims and the Politics of Appeal&lt;/em&gt; – Mohammed El-Kurd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Hamas Contained: The Rise and Pacification of Palestinian Resistance&lt;/em&gt; – Tareq Baconi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Deluge: Gaza and Israel From Crisis to Cataclysm&lt;/em&gt; – Jamie Stern-Weiner
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Blaming the Victims: Spurious Scholarship and the Palestinian Question&lt;/em&gt; – Edward Said &amp;amp; Christopher Hitchens
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Little Book of Race and Restorative Justice&lt;/em&gt; – Fania E. Davis
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Black Antifascist Tradition: Fighting Back from Anti-Lynching to Abolition&lt;/em&gt; – Jeanelle K. Hope &amp;amp; Bill V. Mullen
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Rifqa&lt;/em&gt; – Mohammed El-Kurd
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Justice for Some: Law and the Question of Palestine&lt;/em&gt; – Noura Erakat
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Palestine Laboratory&lt;/em&gt; – Antony Loewenstein
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Strategy for the Liberation of Palestine&lt;/em&gt; – Popular Front for the Liberation of Palestine (PFLP)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Punishment of Gaza&lt;/em&gt; – Gideon Levy
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Onion Ad Nauseam: Complete News Archives – Volume 13&lt;/em&gt; – The Onion
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Onion Ad Nauseam: Complete News Archives – Volume 14&lt;/em&gt; – The Onion
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Onion Ad Nauseam: Fanfare for the Area Man (Volume 15)&lt;/em&gt; – The Onion
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Holocaust Industry: Reflections on the Exploitation of Jewish Suffering&lt;/em&gt; – Norman G. Finkelstein
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;An Oral History of the Palestinian Nakba&lt;/em&gt; – Nahla Abdo &amp;amp; Nur Masalha
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Gaza: An Inquest Into Its Martyrdom&lt;/em&gt; – Norman G. Finkelstein
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Settler Colonialism: An Introduction&lt;/em&gt; – Sai Englert
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Captive Revolution: Palestinian Women’s Anti-Colonial Struggle Within the Israeli Prison System&lt;/em&gt; – [Author not listed]
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Question of Palestine&lt;/em&gt; – Edward W. Said
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Beyond Chutzpah: On the Misuse of Anti-Semitism and the Abuse of History&lt;/em&gt; – Norman G. Finkelstein
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Black Power and Palestine: Transnational Countries of Color&lt;/em&gt; – Michael R. Fischbach
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;My Father Was a Freedom Fighter: Gaza’s Untold Story&lt;/em&gt; – Ramzy Baroud
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Manufacturing Consent: The Political Economy of the Mass Media&lt;/em&gt; – Edward S. Herman &amp;amp; Noam Chomsky
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Power Systems: Conversations on Global Democratic Uprisings and the New Challenges to U.S. Empire&lt;/em&gt; – Noam Chomsky
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Myths of Liberal Zionism&lt;/em&gt; – Yitzhak Laor
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Erasing the Nakba: Upholding Apartheid Atrocity Denial in the U.S. Media&lt;/em&gt; – Greg Shupak
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Kahanism and American Politics: The Democratic Party's Decades-Long Courtship of Racist Fanatics&lt;/em&gt; – David Sheen
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Israel’s Nation-State Law: Institutionalizing Discrimination&lt;/em&gt; – Hassan Jabareen, Suhad Bishara, Nadia Ben-Youssef, Sandra Samaan Tamari
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Zionism, Israel, and Anti-Semitism: Dangerous Conflation&lt;/em&gt; – Moshe Machover, Barry Trachtenberg &amp;amp; Kyle Stanton
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Erasing Palestine: Free Speech and Palestinian Freedom&lt;/em&gt; – Rebecca Ruth Gould
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Good Die Young: The Verdict on Henry Kissinger&lt;/em&gt; – René Rojas, Bhaskar Sunkara, Jonah Walters
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Hundred Years’ War on Palestine&lt;/em&gt; – Rashid Khalidi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Before the Next Bomb Drops: Rising Up from Brooklyn to Palestine&lt;/em&gt; – Remi Kanazi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Israel and Palestine: Reappraisals, Revisions, Refutations&lt;/em&gt; – Avi Shlaim
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Ethnic Cleansing of Palestine&lt;/em&gt; – Ilan Pappé
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Jerusalem Quarterly (Winter 2022)&lt;/em&gt; – Institute of Jerusalem Studies
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;All That Remains: The Palestinian Villages Occupied and Depopulated by Israel in 1948&lt;/em&gt; – Walid Khalidi
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Earth: The Book – A Visitor’s Guide to the Human Race&lt;/em&gt; – The Daily Show with Jon Stewart
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;I Am America (And So Can You!)&lt;/em&gt; – Stephen Colbert
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Reflections on the Revolution in France&lt;/em&gt; – Edmund Burke
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Government and Politics of the European Union (Third Edition)&lt;/em&gt; – Neill Nugent
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Architects of Freedom Series: Edmund Burke, Russell Kirk&lt;/em&gt; – [Collection]
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Immigration Reconsidered: History, Sociology, and Politics&lt;/em&gt; – Virginia Yans-McLaughlin
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Now They Tell Us: The American Press and Iraq&lt;/em&gt; – Michael Massing
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Bell Curve Debate: History, Documents, Opinions&lt;/em&gt; – Russell Jacoby &amp;amp; Naomi Glauberman
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Deculturalization and the Struggle for Equality&lt;/em&gt; – Joel Spring&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Guide to Subversive Organizations and Publications (and Appendixes)&lt;/em&gt; - Committee on Un-American Activities, U.S. House of Representatives &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;A Practical Guide for Policy Analysis: The Eightfold Path to More Effective Problem Solving (Fourth Edition)&lt;/em&gt; – Eugene Bardach &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The Skeptics Guide to the Global AIDS Crisis&lt;/em&gt; - Dale Hanson Bourke&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97cc4343nvw6kv5hnr6l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97cc4343nvw6kv5hnr6l.jpeg" alt="Capitalism" width="800" height="1113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;...I have an idea I'd like to run by you I'm thinking of calling 'Commonwealth Capitalism', first impressions??...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>programming</category>
      <category>machinelearning</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Scout &amp; Morgan Books</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Sat, 29 Mar 2025 23:47:09 +0000</pubDate>
      <link>https://dev.to/dmidlo/scout-morgan-books-1d6l</link>
      <guid>https://dev.to/dmidlo/scout-morgan-books-1d6l</guid>
      <description>&lt;h2&gt;
  
  
  How to Read a Book (Again)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4koaokjl67lqhr7me6m.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4koaokjl67lqhr7me6m.jpeg" alt="Scout &amp;amp; Morgan Books" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A lifetime ago, I was enrolled at an unaccredited music school in Kansas City. Focusing on the guitar, I studied songwriting and composition. In the footnotes of one of our assigned readings, I came across a reference to &lt;em&gt;How to Read a Book&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I put down the text, got in my car, and drove straight to the nearby big-chain-bookstore to grab my first copy.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;By the time I truly finished reading it, I was back in Minnesota, working as a carpenter. In the back of &lt;em&gt;How to Read a Book&lt;/em&gt; is the greatest treasure: a chronological list of great works, beginning with Homer’s &lt;em&gt;Iliad&lt;/em&gt; and carrying forward through the centuries—literature, science, philosophy, history. Everything.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x4mp5w229rx220fnt6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x4mp5w229rx220fnt6k.png" alt="google g1 phone" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the time I had an iPod—then a Google G1 on release day—and as I worked summer through winter and back again, I found audiobooks and loaded them up and began to make my way through the list.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;While my saw carved openings, and my hammer cleaved in doors and windows, my ears were full of Plato, Euclid, The Bard Himself, Darwin, Newton... on and on...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I, of course, began at the start. I was both inspired and tempered by Homer’s Achilles — and then by Odysseus: his resolve, self-awareness, and unrelenting pursuit to return to his love, Penelope, and her steadfast defense of their home while he was lost.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I was sunk in, and I knew from here on, these bits of letters on a page were the mast I would tie myself to.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Reading that book was a turning point.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;It changed how I read—but more than that, it gave me access to a world I never thought was open to me.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ancient texts, Enlightenment treatises, the early language of logic and reason... it was like a hidden gate had swung open.&lt;/p&gt;

&lt;p&gt;In it, I found the echo of words I’d once read from the mythic King Solomon: &lt;em&gt;“There is nothing new under the sun.”&lt;/em&gt; That even Darwin’s apes had not strayed so far from our own joys and sufferings.&lt;/p&gt;

&lt;p&gt;I'm a different man now than I was. I believe different things, I study different things, and now somehow, i've become a full-tilt Apple fanboy for my personal tech... &lt;/p&gt;

&lt;p&gt;&lt;em&gt;but I still trace the shape of who I’ve become back to that first turning of the page.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I’ve owned several copies since then, but I always end up giving them away—loaned to friends, left behind in moves, or simply lost to time.&lt;/p&gt;




&lt;p&gt;Last weekend I was passing through my hometown and stopped in at &lt;strong&gt;Scout &amp;amp; Morgan Books&lt;/strong&gt;. I noticed they had a “Books About Books” section. Imagining that it couldn't possibly be there, I didn’t bother scanning the shelf - instead I went straight to the counter.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Say, I noticed you had a ‘Books About Books’ section... you don’t happen to have a copy of &lt;em&gt;How to Read a Book&lt;/em&gt;, do you?”&lt;/p&gt;

&lt;p&gt;“By Adler?” she asked.&lt;/p&gt;

&lt;p&gt;“Yeah! You know it?!”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;"Wow!", I thought, "...This woman knows her stuff!"&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;I placed a request, and by midweek, &lt;strong&gt;Judith&lt;/strong&gt; sent me a text letting me know she’d found a vintage copy and was holding it for me.&lt;/p&gt;

&lt;p&gt;I stopped by today to pick it up.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Unfortunately, Judith wasn’t in—off on what is surely a well-earned vacation!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But I left with the book in hand, and this one... &lt;strong&gt;&lt;em&gt;this one I don’t think I’ll ever give away.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It’s been too long since my old friend and I have been together.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Best bookseller in Minnesota.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Trust me—I’ve been to them all.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://maps.app.goo.gl/B5oV7GZuL3CY2h5D8" rel="noopener noreferrer"&gt;Scout &amp;amp; Morgan Books on Google Maps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F131hpee5n5bqbjrun0je.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F131hpee5n5bqbjrun0je.png" alt="Scout &amp;amp; Morgan Books on Google Maps" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>PowerShell Nihilism as Software Discipline</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Wed, 26 Mar 2025 09:38:18 +0000</pubDate>
      <link>https://dev.to/dmidlo/powershell-nihilism-as-software-discipline-3e6p</link>
      <guid>https://dev.to/dmidlo/powershell-nihilism-as-software-discipline-3e6p</guid>
      <description>&lt;p&gt;&lt;em&gt;Every last mistake: practical, emotional, hubris..... it's me; a thousand times over... every time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm only speaking to this sysadmin here as a self-admonition. Because I constantly forget these things.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fell asleep at 4am finishing it up after a long debate about foreach loops with another industry vet who (like me on other powershell problems), spent too much time researching, testing variations, believing they came up with a good solution.... I had to break it to him; the same as the stark truth has hit me too many times.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  IMPORTANT UPDATE:
&lt;/h3&gt;

&lt;p&gt;While much of this critique remains; there was a particular 'discovery' I thought I made in regard to the powershell implementation of &lt;code&gt;foreach&lt;/code&gt; that guided rules around its use in preference over pipeline operations.  After much patience from the powershell dev team; they were able to clarify &lt;strong&gt;&lt;em&gt;exactly&lt;/em&gt;&lt;/strong&gt; how the pipeline works; &lt;strong&gt;&lt;em&gt;where performance considerations end&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;stylistic boundaries begin&lt;/em&gt;&lt;/strong&gt;; and frankly, what it is to be &lt;strong&gt;&lt;em&gt;absolute pros&lt;/em&gt;&lt;/strong&gt; in the exercise of community engagement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.gg/powershell" rel="noopener noreferrer"&gt;Powershell Official Discord&lt;/a&gt;&lt;br&gt;
&lt;a href="https://discord.com/channels/180528040881815552/1354470672436297988" rel="noopener noreferrer"&gt;Here's the whole thread&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Having learned so much, I will be writing a stand-alone follow up to this 'style guide' for powershell development practices that integrate all these expert thoughts along with the tips and tricks I've learned to &lt;code&gt;Invoke-CodeClarity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I warned you; &lt;em&gt;hubris indeed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With that being said; If you're here before I get back to working on something esoteric like this and now that it is quite clear that the &lt;code&gt;foreach&lt;/code&gt; loop does not act as yielding generator (at least for the foreseeable future) The inspiration and well-known progenitor rule that guided this thought is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prefer going &lt;strong&gt;&lt;em&gt;vertical&lt;/em&gt;&lt;/strong&gt; with your code instead of &lt;em&gt;horizontal&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Number 1 rule for PowerShell development:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Never write idiomatic PowerShell.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;If you show me PowerShell that looks like &lt;em&gt;PowerShell&lt;/em&gt;, it's never getting near my prod.&lt;/strong&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Underneath its simplicity is a pile of over-engineered abstractions trying really hard to look simple.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;That God-Like feeling of writing 'perfect powershell' when you dug into it's internals, flipping &lt;code&gt;$myInvocation&lt;/code&gt; reflections and &lt;code&gt;.GetSteppablePipeline()&lt;/code&gt; to eek out some more juice? yeah... that's stockholm syndrome.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If it looks too clean to be real, it's probably hiding an AST, a COM object, and a scriptblock logging penalty.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I want classes, type annotations, sealed behavior, and zero magic.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;- Don’t use syntactic sugar.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s not sweet. It’s sticky.&lt;/li&gt;
&lt;li&gt;That one-liner will rot your stack trace and give your future self trust issues.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save the &lt;code&gt;? { $_.Enabled }&lt;/code&gt; for your lunch-break scripts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Take an 'Anti-Aliasing stance' by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lean deeply into verbosity.&lt;/li&gt;
&lt;li&gt;Never use aliases. &lt;code&gt;Where-Object&lt;/code&gt; is a statement. &lt;code&gt;?&lt;/code&gt; is a cry for help.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;-not&lt;/code&gt;, not &lt;code&gt;!&lt;/code&gt;. Save &lt;code&gt;!&lt;/code&gt; for languages that care about you. at least enough to make it a first-class citizen.&lt;/li&gt;
&lt;li&gt;Avoid short-form anything. If you type less, you &lt;em&gt;know less&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Never use &lt;code&gt;Where-Object&lt;/code&gt; unless you're at the terminal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t hide logic inside &lt;code&gt;{ $_ }&lt;/code&gt; sugar cubes.&lt;/li&gt;
&lt;li&gt;Build meaningful booleans. Give your conditions names.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$isValid = $Value -is [ValueType] -or $Value -is [string]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;if ($isValid) { ... }&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Readable. Testable. Traceable.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Don’t write code you can’t explain without squinting.&lt;/strong&gt;&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Prefer &lt;code&gt;$global:ActualVariableName&lt;/code&gt; over guessing.&lt;/li&gt;
&lt;li&gt;But Really: Never use &lt;code&gt;$global:&lt;/code&gt; unless you're building a panic button.&lt;/li&gt;
&lt;li&gt;Globals are shared hallucinations.&lt;/li&gt;
&lt;li&gt;Build modules with private state, or cache inside a getter function.&lt;/li&gt;
&lt;li&gt;If you're reaching for a singleton in PowerShell — ask yourself who hurt you.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Be explicit. Be readable. Be annoying to lazy devs and let the too-clever ones think your dumb.  It's okay, their code runs like snails.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Never use the pipeline unless you're at the terminal. Ever.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scripts aren’t a concert — they don’t need to &lt;em&gt;flow&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The pipeline hides performance costs, debug context, and your sins.&lt;/li&gt;
&lt;li&gt;Always prefer &lt;code&gt;-InputObject&lt;/code&gt; or passing explicitly via variables.&lt;/li&gt;
&lt;li&gt;Chaining is for smokers and functional languages. If smalltalk only knew... it would come over and beat you with that pipe powershell.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Never write cmdlets unless you're newing a class you wrote.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cmdlets are overkill unless you’re exposing behavior from your own system.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If there’s no &lt;code&gt;[MyModule.MyType]&lt;/code&gt; behind it, it’s just a function in a trench coat trying to sell you a stolen watch.&lt;br&gt;
Treat functions like APIs. Cmdlets are just UI for your types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Always write functions with explicit returns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PowerShell returns anything it touches — even when you didn’t ask.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;→ Use &lt;code&gt;return&lt;/code&gt; &lt;em&gt;every&lt;/em&gt; time. Be intentional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;→ Use &lt;code&gt;$null =&lt;/code&gt; or &lt;code&gt;[void]()&lt;/code&gt; to shut up side effects you don’t want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Never let PowerShell decide what your function says. It’ll be wrong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Method calls return values — even when you don’t care.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;→ If you're not using it, silence it. Don't let it leak into your output stream.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PowerShell accepts fake enum values. Don’t trust the binding — enforce it yourself.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enum State { Start; Stop }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function Run { param([State]$Mode) $Mode }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run 'Destroy'   # → returns $null, no error&lt;/li&gt;
&lt;li&gt;→ PowerShell fails silently on bad enum input.&lt;/li&gt;
&lt;li&gt;→ If you don't check, your logic runs on &lt;code&gt;$null&lt;/code&gt; like Leroy Jenkins.&lt;/li&gt;
&lt;li&gt;Fix it with &lt;code&gt;[ValidateSet()]&lt;/code&gt;:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function Run {&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;param([ValidateSet('Start','Stop&lt;/code&gt;][string]$Mode)")&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$Mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run 'Destroy'  # → throws, as it should**&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Never use a PowerShell construct to solve a PowerShell problem inside of PowerShell.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reach for PowerShell only when you’re outside of it.&lt;/li&gt;
&lt;li&gt;Inside PowerShell, defer to .NET.&lt;/li&gt;
&lt;li&gt;New the object. Call the method. Don’t rely on the engine’s interpretation of your intent.&lt;/li&gt;
&lt;li&gt;PowerShell will try to help. Don’t let it.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PowerShell is not a language. It's not a runtime, it's not a platform.  It is only an execution substrate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Never use a PowerShell primitive type if there's &lt;em&gt;any&lt;/em&gt; other alternative that can be new'd from .NET.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[int] is cute until it’s secretly &lt;code&gt;[System.Int32]&lt;/code&gt; with extra baggage.&lt;/li&gt;
&lt;li&gt;[string] is a trap. Coerce it to &lt;code&gt;[System.String]&lt;/code&gt; if you care about methods behaving.&lt;/li&gt;
&lt;li&gt;Avoid &lt;code&gt;[hashtable]&lt;/code&gt;, &lt;code&gt;[array]&lt;/code&gt;, &lt;code&gt;[psobject]&lt;/code&gt;, &lt;code&gt;[scriptblock]&lt;/code&gt;, and anything else that lives in PowerShell’s imagination.&lt;/li&gt;
&lt;li&gt;If you &lt;em&gt;must&lt;/em&gt; touch a PowerShell type, immediately &lt;code&gt;.ToString()&lt;/code&gt;, &lt;code&gt;.ToArray()&lt;/code&gt;, or &lt;code&gt;.Cast&amp;lt;&amp;gt;()&lt;/code&gt; it into something real.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Avoid &lt;code&gt;[type](value)&lt;/code&gt; casting unless you're okay with PowerShell lying to you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It looks like a .NET cast.&lt;/li&gt;
&lt;li&gt;It feels like a .NET cast.&lt;/li&gt;
&lt;li&gt;It is not a .NET cast.&lt;/li&gt;
&lt;li&gt;Under the hood, it's &lt;code&gt;LanguagePrimitives::ConvertTo()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;That means PowerShell will 'help' you. You don't want help.&lt;/li&gt;
&lt;li&gt;You want control, predictability, and &lt;em&gt;exceptions when things go wrong&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;[int]::Parse()&lt;/code&gt;, &lt;code&gt;[datetime]::TryParse()&lt;/code&gt;, or &lt;code&gt;.Cast&amp;lt;T&amp;gt;()&lt;/code&gt; if you actually care.&lt;/li&gt;
&lt;li&gt;Stop writing code that 'works'. Write code that fails when it should.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;PowerShell casting is a vibe, not a contract.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Even then, Strong typing doesn’t mean safe input — validate explicitly.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;There is no faster or safer way to iterate: use &lt;code&gt;foreach&lt;/code&gt;. Stop Trying. ...in both(!!!) versions of Powershell&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;foreach ($file in Get-ChildItem -Recurse) {}&lt;/code&gt; is the correct form. This is a lazy-loaded generator expression.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$result = foreach ($file in Get-ChildItem -Recurse) {}&lt;/code&gt; for collecting output 
— stable and explicit.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;foreach ($item in $collection.GetEnumerator()) {}&lt;/code&gt; when you want full control.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t preload. Don’t pipe. Don’t decorate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;These forms are the truth. Everything else is the engine trying to be clever.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;On Throwing, Catching, and Losing Your Mind&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;~ or ~&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"If you didn’t rethrow it — it didn’t happen."&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;PowerShell’s exception model is a handshake agreement with chaos.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;throw&lt;/code&gt; looks like an exception.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throw&lt;/code&gt; &lt;em&gt;feels&lt;/em&gt; like an exception.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throw&lt;/code&gt; is &lt;strong&gt;actually a terminating error inside a non-terminating environment&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;And no, it’s not okay.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throw&lt;/code&gt; in a function? Good luck — sometimes it bubbles, sometimes it swallows, sometimes it yeets sideways and gets eaten by &lt;code&gt;$ErrorActionPreference&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;So if you catch, always rethrow — and rethrow &lt;code&gt;properly&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;throw&lt;/code&gt; by itself? — rethrows the current error object.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throw $_&lt;/code&gt;? — creates a &lt;em&gt;new&lt;/em&gt; error and &lt;strong&gt;wipes the stack trace&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throw $PSItem.Exception&lt;/code&gt;? — you just pulled out the .NET exception and yeeted it without context.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throw $_.Exception&lt;/code&gt;? Still bad. Just slower because you used an alias. You're discarding PowerShell’s error record and losing the script context.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;throw&lt;/code&gt; inside a catch block is your only safe bet — just use &lt;code&gt;throw&lt;/code&gt; raw. No extras.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PowerShell exceptions aren’t real exceptions. They're &lt;em&gt;error records&lt;/em&gt;, wrapped in runtime delusion.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most of your bugs come from thinking PowerShell will behave like other languages. It won’t.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ErrorActionPreference = 'Stop'&lt;/code&gt; should be the &lt;em&gt;first&lt;/em&gt; line in every script you write. Not negotiable.&lt;/li&gt;
&lt;li&gt;If you don’t force errors to terminate, PowerShell will “handle” them by pretending everything is fine while quietly torching your logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PowerShell's &lt;code&gt;throw&lt;/code&gt; is the programming equivalent of flipping a table in a room full of polite Minnesotans — dramatic, but everyone just quietly resets the chairs and moves on unless you really mean it.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;For both Powershell and Minnesota. I'm born and raised; I'm permitted.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Enums and classes — there isn't time in the world.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want them to be more than Snover’s shower-thought, write them somewhere else.&lt;/li&gt;
&lt;li&gt;PowerShell lets you define types. It doesn’t know what they’re for.&lt;/li&gt;
&lt;li&gt;You're not writing models — you're building containers for structured suffering.&lt;/li&gt;
&lt;li&gt;Use a duplicate object in your getters. No, PowerShell, you can’t hold my baby.&lt;/li&gt;
&lt;li&gt;Classes and Enums... They look like types. They act like variables. They debug like demons.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then they streak across prod with their privates exposed, and you get blamed for public indecency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you &lt;em&gt;still&lt;/em&gt; need a singleton in PowerShell: here’s the cliff notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t use &lt;code&gt;$global:&lt;/code&gt; — that’s not a singleton, that’s a liability.&lt;/li&gt;
&lt;li&gt;Use a module-scoped variable (&lt;code&gt;$script:&lt;/code&gt;) inside a &lt;code&gt;.psm1&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Expose a &lt;code&gt;Get-Instance&lt;/code&gt; function that initializes once and returns always.&lt;/li&gt;
&lt;li&gt;Encapsulate access — never let the outside world touch it directly.&lt;/li&gt;
&lt;li&gt;If you must reset it, make that a &lt;em&gt;deliberate&lt;/em&gt; exported function.&lt;/li&gt;
&lt;li&gt;You’re not writing Go. You’re duct-taping state to a fantasy. Be careful.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Classes and enums... sure, they’re busted.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t use classes in PowerShell because they’re good.&lt;/li&gt;
&lt;li&gt;You're going to need them if you want to escape the hell of cmdlet and function return diarrhea of anything that could be writ to the terminal munged together into an &lt;code&gt;object[]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You're not using them for OOP style or for code organization, you're using them because you're tired of getting crapped on by your own debug statements.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Dot-sourcing is an act of war — either against PowerShell’s module system, or against yourself. Choose wisely.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It leaks scope.**&lt;/li&gt;
&lt;li&gt;It overrides variables you didn’t mean to share.**&lt;/li&gt;
&lt;li&gt;It pretends your script is part of the caller’s logic.**&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Encapsulate everything. PowerShell doesn’t know how to contain your code — you have to.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;As my first language, and after over a decade in it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stop trying to adhere to the language spec.&lt;/li&gt;
&lt;li&gt;The spec doesn’t protect you.&lt;/li&gt;
&lt;li&gt;The spec won’t save you.&lt;/li&gt;
&lt;li&gt;The spec was designed for fast answers — not for codebases with consequences.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;It’s easier to learn to code than it is to learn PowerShell.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you learn PowerShell, you still have to learn to code.&lt;/li&gt;
&lt;li&gt;So you’ve just spent twice as much time and struggle... for no reason.&lt;/li&gt;
&lt;li&gt;And all you got was conformity to a spec written for scripting around .NET, not building with it.&lt;/li&gt;
&lt;li&gt;Learn to code. Then use PowerShell &lt;em&gt;as a tool&lt;/em&gt;, not a teacher.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Write code — &lt;em&gt;not PowerShell&lt;/em&gt; ...when writing PowerShell.&lt;/li&gt;
&lt;li&gt;Writing &lt;em&gt;code&lt;/em&gt; in PowerShell takes less time than writing &lt;em&gt;PowerShell&lt;/em&gt; code.&lt;/li&gt;
&lt;li&gt;The language wants you to write scripts.&lt;/li&gt;
&lt;li&gt;You should be writing software. Yes. Your ten lines of code to set up a scheduled task is "Software".  Make it fast and make it last.&lt;/li&gt;
&lt;li&gt;Lean on .NET. Use real logic. Skip the sugar. Don't learn the sugar when you get stuck; You don't have all the time in the world just to learn how to do it the wrong way. Respect Yourself.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PowerShell can be elegant, but clean code is faster, more readable, and more maintainable than clever hacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Researching &lt;em&gt;first-principles&lt;/em&gt; and applying them is faster than researching:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;... your objective,&lt;/li&gt;
&lt;li&gt;... the PowerShell abstraction that almost solves it,&lt;/li&gt;
&lt;li&gt;... why that abstraction quietly fails,&lt;/li&gt;
&lt;li&gt;... how to bypass PowerShell's resistance to correction,&lt;/li&gt;
&lt;li&gt;...to just to end up applying first-principles anyway.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Follow this and your code will be between 2x–500x faster (no joke), dramatically more maintainable, and infinitely less embarrassing to debug in front of other adults. You'll get more done, with less empty calories, with more energy to go deeper.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Just think about it for a second. None of this stuff is easy; you're grinding your nose into the dust for nothing when you wrestle with the desire to write idiomatic powershell code even when you know better.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's not more readable... if someone is reading your code; they know how to read code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If someone is learning your code; the basic constructs...  it really and truly is all you need to teach them.  Don't let the elitism of massive unpeneratible ecosystems keep you or anyone else feeling like you can't write California-Grade code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This isn’t about writing better PowerShell — it’s about writing real code &lt;em&gt;using&lt;/em&gt; PowerShell as a tool, not as a crutch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t need the language’s permission to write something that lasts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t need the language’s permission to learn to code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do I love it? Yeah.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Did it teach me more bad tricks than a magician with a drinking problem?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Absolutely.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Did it teach me everything I know? Yeah.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Can I write in any language now because of it? Also yeah.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;It made me a polyglot. And for that... I owe PowerShell everything.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>microsoftgraph</category>
      <category>automation</category>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Problem: PowerShell’s Hashing Illusion</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Wed, 19 Mar 2025 20:43:07 +0000</pubDate>
      <link>https://dev.to/dmidlo/the-problem-powershells-hashing-illusion-74p</link>
      <guid>https://dev.to/dmidlo/the-problem-powershells-hashing-illusion-74p</guid>
      <description>&lt;p&gt;PowerShell, for all its flexibility, has a glaring gap: &lt;strong&gt;there is no clear, reliable way to hash complex objects deterministically.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;If you’ve ever tried to:&lt;br&gt;&lt;br&gt;
✅ Compare structured data&lt;br&gt;&lt;br&gt;
✅ Track changes over time&lt;br&gt;&lt;br&gt;
✅ Verify data integrity  &lt;/p&gt;

&lt;p&gt;You’ve probably hit the same wall:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most hashing functions only work for files.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object hashing functions rely on non-deterministic serialization.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no robust, structured way to hash deeply nested objects.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even worse, &lt;strong&gt;many common object hashing techniques in PowerShell produce false positives and false negatives without users realizing it.&lt;/strong&gt;  &lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;🚨 The False Positives &amp;amp; False Negatives We’ve Been Living With&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Have you ever written something like this?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$hash1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$object1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertTo-Json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Depth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$hash2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$object2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertTo-Json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Depth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and confidently said, &lt;em&gt;“These two objects are identical!”&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You’ve been playing yourself.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Why?&lt;br&gt;&lt;br&gt;
Because &lt;strong&gt;PowerShell doesn’t preserve object structure deterministically.&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Property order of unordered dictionary-like collections, including &lt;code&gt;PSCustomObjects&lt;/code&gt; can change&lt;/strong&gt; between serializations.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashtables&lt;/strong&gt; have &lt;strong&gt;no guaranteed ordering&lt;/strong&gt; unless explicitly marked &lt;code&gt;[Ordered]&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ConvertTo-Json&lt;/code&gt; doesn’t respect data types perfectly&lt;/strong&gt; (e.g., &lt;code&gt;30&lt;/code&gt; and &lt;code&gt;"30"&lt;/code&gt; can serialize the same).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collections inheriting from &lt;code&gt;IList&lt;/code&gt; often get coerced into simple &lt;code&gt;@()&lt;/code&gt; arrays when serialized&lt;/strong&gt;, often losing behavioral semantics defined by a strict type chosen by the developer.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different PowerShell versions serialize objects differently.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;False negatives&lt;/strong&gt;: Two logically identical objects produce different hashes.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False positives&lt;/strong&gt;: Two structurally different objects produce the same hash.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PowerShell’s JSON-based hashing is fundamentally flawed for complex objects.&lt;/strong&gt;  &lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;The Search for a Solution: Where Is It?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When I first started looking, I assumed there’d be &lt;strong&gt;at least one&lt;/strong&gt; solid, reusable object hashing function. So, I did the obvious thing:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Searched &lt;strong&gt;PowerShell Gallery&lt;/strong&gt; for modules related to hashing.
&lt;/li&gt;
&lt;li&gt;Looked for &lt;strong&gt;Get-Hash&lt;/strong&gt;, &lt;strong&gt;ConvertTo-Hash&lt;/strong&gt;, or &lt;strong&gt;Compute-Hash&lt;/strong&gt; functions.
&lt;/li&gt;
&lt;li&gt;Googled &lt;strong&gt;“PowerShell object hashing”&lt;/strong&gt;, expecting an easy solution.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I found &lt;strong&gt;nothing useful.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;It wasn’t until I started &lt;strong&gt;Google dorking&lt;/strong&gt;—crafting targeted searches—that I uncovered &lt;strong&gt;the sad truth&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Most hashing functions only work for files.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many claim object hashing but rely on non-deterministic serialization.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;None provide a robust, structured way to hash deeply nested objects.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;The Google Dorking Journey&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s a small taste of the search queries I ran to find &lt;em&gt;any&lt;/em&gt; existing object hashing solutions in the ecosystem:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;General hash functions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"hash"&lt;/span&gt; &lt;span class="s2"&gt;"ConvertTo-SecureString"&lt;/span&gt; OR &lt;span class="s2"&gt;"Get-Hash"&lt;/span&gt; OR &lt;span class="s2"&gt;"SHA256"&lt;/span&gt; OR &lt;span class="s2"&gt;"MD5"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Searching for file-independent hashing utilities&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"function"&lt;/span&gt; &lt;span class="s2"&gt;"hash"&lt;/span&gt; &lt;span class="s2"&gt;"MemoryStream"&lt;/span&gt; OR &lt;span class="s2"&gt;"Get-FileHash"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Looking for anything using .NET’s &lt;code&gt;ComputeHash&lt;/code&gt; method&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"New-Object"&lt;/span&gt; &lt;span class="s2"&gt;"System.Security.Cryptography"&lt;/span&gt; &lt;span class="s2"&gt;"ComputeHash"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Searching for JSON-based hashing attempts&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com inurl:package &lt;span class="s2"&gt;"hash"&lt;/span&gt; &lt;span class="s2"&gt;"ConvertTo-Json"&lt;/span&gt; OR &lt;span class="s2"&gt;"Serialize"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trying to find hashing functions using legacy .NET cryptography providers&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"PowerShell"&lt;/span&gt; &lt;span class="s2"&gt;"SHA1CryptoServiceProvider"&lt;/span&gt; OR &lt;span class="s2"&gt;"SHA256Managed"&lt;/span&gt; OR &lt;span class="s2"&gt;"MD5CryptoServiceProvider"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hunting for functions that explicitly compute hashes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com inurl:functions &lt;span class="s2"&gt;"Get-Hash"&lt;/span&gt; OR &lt;span class="s2"&gt;"ConvertTo-Hash"&lt;/span&gt; OR &lt;span class="s2"&gt;"Compute-Hash"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seeing if anyone had implemented hashing for byte arrays directly&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"hash"&lt;/span&gt; &lt;span class="s2"&gt;"byte[]"&lt;/span&gt; &lt;span class="s2"&gt;"ComputeHash"&lt;/span&gt; &lt;span class="s2"&gt;"MemoryStream"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Looking for mentions of hashing objects in-memory instead of serializing them&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"Get-Hash"&lt;/span&gt; &lt;span class="s2"&gt;"in-memory object"&lt;/span&gt; &lt;span class="s2"&gt;"SHA256"&lt;/span&gt; OR &lt;span class="s2"&gt;"MD5"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checking if &lt;code&gt;ConvertTo-SecureString&lt;/code&gt; had been misused for hashing&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"ConvertTo-SecureString"&lt;/span&gt; &lt;span class="s2"&gt;"ComputeHash"&lt;/span&gt; &lt;span class="s2"&gt;"memory"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Digging through functions that mention hashing in the context of streaming&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   site:powershellgallery.com &lt;span class="s2"&gt;"hash function"&lt;/span&gt; &lt;span class="s2"&gt;"MemoryStream"&lt;/span&gt; &lt;span class="s2"&gt;"ConvertTo-HexString"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Why Existing “Solutions” Fail&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After analyzing what was out there, the gaps became &lt;strong&gt;painfully obvious&lt;/strong&gt;:  &lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;🚨 1. Hashing Is Not Deterministic&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PowerShell’s &lt;code&gt;ConvertTo-Json&lt;/code&gt; changes behavior between versions.
&lt;/li&gt;
&lt;li&gt;Unordered collections &lt;strong&gt;don’t serialize predictably&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Collections inheriting from &lt;code&gt;IList&lt;/code&gt; often get coerced into simple lists, leading to structural inconsistencies.
&lt;/li&gt;
&lt;li&gt;Some implementations &lt;strong&gt;accidentally shuffle object properties&lt;/strong&gt;, making the same object return &lt;strong&gt;different&lt;/strong&gt; hashes.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;🚨 2. No Standard Approach Exists&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Some scripts use &lt;code&gt;ConvertTo-Json&lt;/code&gt;, others use &lt;code&gt;.ToString()&lt;/code&gt;, and a few serialize objects to XML first.
&lt;/li&gt;
&lt;li&gt;None provide a &lt;strong&gt;consistent, structured way&lt;/strong&gt; to process objects.
&lt;/li&gt;
&lt;li&gt;There is &lt;strong&gt;no official guidance&lt;/strong&gt; on how to hash structured data reliably.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;🚨 3. Performance Issues Everywhere&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most implementations &lt;strong&gt;serialize the entire object into a string before hashing it.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;This means hashing a large object &lt;strong&gt;creates massive memory overhead.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No existing function &lt;strong&gt;streams data efficiently into the hasher.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;🚨 4. The JSON Hashing Trap&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To be fair, &lt;code&gt;ConvertTo-Json&lt;/code&gt; &lt;strong&gt;isn't always wrong&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;simple ordered lists and &lt;code&gt;[ordered]@{}&lt;/code&gt; hashtables&lt;/strong&gt;, JSON-based hashing &lt;em&gt;can&lt;/em&gt; work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$orderedHashTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'John Doe'&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;Age&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;City&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'New York'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$orderedHashTable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertTo-Json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, the moment you introduce:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Regular hashtables (&lt;code&gt;@{}&lt;/code&gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HashSets, Dictionaries, PSCustomObjects, or custom object types&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your hash becomes &lt;strong&gt;non-deterministic&lt;/strong&gt; because:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell’s internal object retrieval doesn’t guarantee a consistent order.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The serializer makes no guarantees about property traversal order.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🚨 5. The Type Coercion Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Even if JSON serialization were perfectly ordered, it &lt;strong&gt;still fails to differentiate data types properly&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$object1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$object2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Age&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Age is a string here&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$hash1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$object1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertTo-Json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Depth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$hash2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$object2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConvertTo-Json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Depth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-FileHash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Algorithm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SHA256&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$hash1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$hash2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# True, but these objects aren't actually the same&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PowerShell &lt;strong&gt;implicitly converts numbers to strings&lt;/strong&gt; in JSON, leading to &lt;strong&gt;false positives&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Matters: The Missing PowerShell Standard&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We need a &lt;strong&gt;real&lt;/strong&gt;, &lt;strong&gt;deterministic&lt;/strong&gt;, &lt;strong&gt;efficient&lt;/strong&gt; way to hash complex objects or the results could be devastating, and likely have been so already. &lt;/p&gt;

&lt;p&gt;A proper PowerShell object hashing function should:  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Preserve object structure&lt;/strong&gt; – Ordered collections should stay ordered; unordered collections should be sorted before hashing.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Avoid full serialization overhead&lt;/strong&gt; – It should process objects incrementally instead of dumping them into a giant string first.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Handle nested and recursive structures&lt;/strong&gt; – Objects can reference other objects; we need a way to track and hash them properly.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Respect complex collection types&lt;/strong&gt; – Lists inheriting from &lt;code&gt;IList&lt;/code&gt; shouldn’t get silently coerced into generic arrays.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Provide developer control&lt;/strong&gt; – Users should be able to exclude properties or use custom mappers.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Where We Stand at v0.9: Filling the Gap&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Toward a Better PowerShell Object Hash Generator
&lt;/h3&gt;

&lt;p&gt;A truly robust object hashing system for PowerShell should have the following features:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deterministic Hashing Across Object Structures&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The hash should remain &lt;strong&gt;consistent&lt;/strong&gt; across multiple invocations, ensuring that the same input object always produces the same output hash.
&lt;/li&gt;
&lt;li&gt;Object serialization should be &lt;strong&gt;order-preserving&lt;/strong&gt; for ordered collections (e.g., &lt;code&gt;[ordered]@{}&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Queue&lt;/code&gt;, &lt;code&gt;Stack&lt;/code&gt;), while unordered collections (e.g., &lt;code&gt;Hashtable&lt;/code&gt;, &lt;code&gt;Dictionary&lt;/code&gt;) should be &lt;strong&gt;sorted&lt;/strong&gt; to maintain hash stability.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Support for Complex and Nested Data Structures&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The system should correctly process &lt;strong&gt;deeply nested objects&lt;/strong&gt;, including dictionaries, lists, and custom objects.
&lt;/li&gt;
&lt;li&gt;Handling of &lt;strong&gt;PSCustomObject&lt;/strong&gt;, &lt;code&gt;Hashtable&lt;/code&gt;, &lt;code&gt;[ordered]@{}&lt;/code&gt;, and .NET collections should be seamless.
&lt;/li&gt;
&lt;li&gt;Circular references should be detected and safely handled to prevent infinite recursion.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurable Hashing Algorithms&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users should have the ability to select from multiple hash algorithms, such as &lt;strong&gt;MD5, SHA1, SHA256, SHA384, and SHA512&lt;/strong&gt;, to meet security and performance needs.
&lt;/li&gt;
&lt;li&gt;The default should be a secure option like &lt;strong&gt;SHA256&lt;/strong&gt; for strong cryptographic integrity.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Selective Field Exclusion&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certain object properties or dictionary keys should be &lt;strong&gt;excludable&lt;/strong&gt; from the hashing process, allowing users to ignore transient or irrelevant data fields.
&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;HashSet[string]&lt;/code&gt;-based implementation ensures efficient lookups for ignored fields.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Binary and Streaming Hash Computation&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of converting objects to strings, a robust hashing system should use &lt;strong&gt;BSON serialization&lt;/strong&gt; to create a stable, compact binary representation.
&lt;/li&gt;
&lt;li&gt;Streaming hash computation should allow large objects to be processed &lt;strong&gt;efficiently in chunks&lt;/strong&gt;, minimizing memory overhead.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Canonical Object Normalization&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before hashing, objects should be &lt;strong&gt;normalized&lt;/strong&gt; into a standard structure to ensure hash stability across different representations of the same logical data.
&lt;/li&gt;
&lt;li&gt;Floating-point numbers should be &lt;strong&gt;normalized&lt;/strong&gt; to avoid precision-related inconsistencies.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Equality Comparisons and Operator Overloading&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hash comparisons should be &lt;strong&gt;simplified&lt;/strong&gt; through overloaded equality operators (&lt;code&gt;-eq&lt;/code&gt;, &lt;code&gt;-ne&lt;/code&gt;), allowing intuitive comparisons between hashes and objects.
&lt;/li&gt;
&lt;li&gt;The class should provide a clean &lt;code&gt;ToString()&lt;/code&gt; method to retrieve the computed hash easily.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error Handling and Fault Tolerance&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The hashing system should gracefully handle unexpected object types and serialization errors.
&lt;/li&gt;
&lt;li&gt;Meaningful error messages should be provided when an unsupported object type is encountered.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pluggable Serializers for Custom Types&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The hashing system should support &lt;strong&gt;custom serialization strategies&lt;/strong&gt; for user-defined objects and complex .NET types.
&lt;/li&gt;
&lt;li&gt;A modular design should allow developers to &lt;strong&gt;extend or override&lt;/strong&gt; serialization behavior using pluggable components.
&lt;/li&gt;
&lt;li&gt;This ensures compatibility with &lt;strong&gt;non-serializable objects, specialized data structures, or domain-specific representations&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Toward a Better PowerShell Object Hash Generator: Introducing the &lt;code&gt;DataHash&lt;/code&gt; Class&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To fix these issues, I built &lt;strong&gt;v0.9 of &lt;code&gt;DataHash&lt;/code&gt;&lt;/strong&gt;, a structured and deterministic object hashing solution that actually works.  &lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Ensures object structure is preserved&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Sorts unordered collections before hashing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Provides fine-tuned control over ephemeral data that would pollute the object's identity&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Uses BSON serialization instead of unreliable JSON&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Maintains the identity of self-referencing objects without causing infinite loops&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By integrating these features, the &lt;code&gt;DataHash&lt;/code&gt; class provides a &lt;strong&gt;powerful&lt;/strong&gt;, &lt;strong&gt;flexible&lt;/strong&gt;, and &lt;strong&gt;reliable&lt;/strong&gt; solution for object hashing in PowerShell, making it ideal for scenarios such as &lt;strong&gt;data deduplication, integrity verification, and caching mechanisms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At this stage, &lt;strong&gt;v0.9 is one of the first practical PowerShell object hashing solutions that actually works the way we need it to.&lt;/strong&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  **v1, we're not there yet?
&lt;/h3&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;With v1.0 &lt;strong&gt;&lt;em&gt;nearly&lt;/em&gt;&lt;/strong&gt; complete, Get-DataHash now provides a fluent and reliable class that meets the exact demands of the project it was built for and gives greater confidence over any existing solution.&lt;/p&gt;

&lt;p&gt;The next is step—finalizing v1 with a cmdlet wrapper—is largely an aesthetic one, making the tool more idiomatic to PowerShell and easier to use in scripts.&lt;/p&gt;

&lt;p&gt;However, functionally, the class itself is complete save exposing the custom serializer API, which will no doubt be made available within the the scope the tasks at hand, and with that, my focus will shift back to my current project work.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Looking Ahead to v2: A C# Rewrite with Expanded Capabilities&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I’m writing this down now because &lt;strong&gt;I actually have to use this class&lt;/strong&gt;, and I don’t want to forget the &lt;strong&gt;roadmap as I’ve conceived it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;the broader scope of paradigms available in C#&lt;/strong&gt;, and after thinking through &lt;strong&gt;how to achieve parallelism while maintaining hash stability&lt;/strong&gt;, &lt;strong&gt;v2 will eliminate the LiteDB dependency entirely&lt;/strong&gt;. The Custom Type serialization features will still be supported, but through &lt;strong&gt;alternative mappers&lt;/strong&gt;, rather than requiring &lt;code&gt;LiteDB.dll&lt;/code&gt; as part of the project.    &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Hybrid BFS/DFS Parallelization: Branch-Slicing for Deterministic Hashing&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Along with the base performance increase granted by C#, The v2 implementation will introduce a straight-forward &lt;strong&gt;batch processing API&lt;/strong&gt; that will return an ordered collection of hashes as well as  &lt;strong&gt;structured, hybrid parallelization model&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use BFS to slice complex objects into major branches&lt;/strong&gt; that can be &lt;strong&gt;hashed in parallel&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Within each branch, apply Postorder DFS streaming&lt;/strong&gt; and stringifying each element adding it to the stream to ensure strict &lt;strong&gt;value-based determinism&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merkle-tree the branch hashes&lt;/strong&gt; as a final aggregation step to maintain structural integrity.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use structured bookkeeping (&lt;code&gt;branchId, hash&lt;/code&gt;)&lt;/strong&gt; to maintain execution order stability.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach ensures:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Branches can be processed in parallel&lt;/strong&gt;, reducing bottlenecks.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each branch maintains deterministic order&lt;/strong&gt; using DFS.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The final hash respects both structure and execution order&lt;/strong&gt;, guaranteeing consistency across runs.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Parallelization Without Breaking Determinism&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;PowerShell’s threading model makes &lt;strong&gt;true parallelization complex&lt;/strong&gt;, so v1 remains &lt;strong&gt;single-threaded&lt;/strong&gt; for strict control. The &lt;strong&gt;v2 C# rewrite&lt;/strong&gt;, however, will introduce:  &lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Thread-safe object hashing&lt;/strong&gt; → Parallel execution without data races.&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Efficient memory management&lt;/strong&gt; → Stream large objects without full serialization.&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Optimized Merkle aggregation&lt;/strong&gt; → Ensuring final hashes remain &lt;strong&gt;structurally stable&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;By leveraging &lt;strong&gt;branch-based parallelization&lt;/strong&gt;, we can make hashing faster &lt;strong&gt;without breaking deterministic guarantees.&lt;/strong&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Open Questions for v2&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;🔹 &lt;strong&gt;Define branch slicing heuristics&lt;/strong&gt; – When to BFS slice vs. process serially. Right now, I haven't decided how to handle the the cascade whereby while walking a branch that have sub-brances.  I can either choose to only allow first order parallelization on the tree, but, if it is a larger tree, efficiency gains might be made by spinning up a new context... that would also move our markle down into the tree some &lt;code&gt;n&lt;/code&gt; levels requiring more bookkeeping to assemble a final stable hash. And Similarly;&lt;br&gt;
🔹 &lt;strong&gt;Determine if intermediate DFS results can be pre-hashed&lt;/strong&gt; for better memory efficiency for simple types like scalars, etc. again more bookkeeping to ensure hash stability.&lt;br&gt;
🔹 &lt;strong&gt;Establish a simple parallel execution model&lt;/strong&gt; – Thread pool, task queue, async processing. &lt;em&gt;(to bookkeep to make it explicit and easy for contributors, or use structured wizardry.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ll accept &lt;strong&gt;pull requests with tests&lt;/strong&gt; if anyone wants to contribute, but major development on v2 will be driven by &lt;strong&gt;real project needs.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/dmidlo/Get-DataHash" rel="noopener noreferrer"&gt;GitHub – dmidlo/Get-DataHash&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Package:&lt;/strong&gt; &lt;a href="https://www.powershellgallery.com/packages/Get-DataHash/0.9.2" rel="noopener noreferrer"&gt;PowerShell Gallery – Get-DataHash v0.9.2&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;v0.9 is in use, v1... I chose to write this instead, coming down the pike within the months, v2 is mapped out, and this is the reference for when it’s time to build.&lt;/strong&gt; 🔥&lt;/p&gt;

</description>
      <category>microsoftgraph</category>
      <category>automation</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Parity: What it Means to be an IJSEC Practitioner: "It's Not Me, It's You"</title>
      <dc:creator>Hunnicuttt</dc:creator>
      <pubDate>Sun, 08 Sep 2024 19:58:30 +0000</pubDate>
      <link>https://dev.to/dmidlo/parity-what-it-means-to-be-an-ijsec-practitioner-its-not-me-its-you-1ii9</link>
      <guid>https://dev.to/dmidlo/parity-what-it-means-to-be-an-ijsec-practitioner-its-not-me-its-you-1ii9</guid>
      <description>&lt;p&gt;Welcome, fellow security enthusiasts, IT warriors, and coffee-dependent code wranglers! Today, we're diving deep into the cutting-edge world of Zero Trust—but with a twist. Instead of the typical security jargon, I want to introduce you to the secret, unsung discipline that’s been quietly thriving in every tech team: IJSEC (It’s Just Somebody Else’s Code or Computer). You may not know it, but if you’ve ever looked at a weird log, pointed at it, and said, "Eh, not my code, not my problem," you might already be a certified IJSEC practitioner!&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero Trust in a Nutshell: "It's Not Me, It's You"
&lt;/h2&gt;

&lt;p&gt;First things first: Zero Trust. The big idea? Trust no one and verify everything. It's like a high-stakes reality TV show where no one's really sure who's a friend or who's just waiting to exploit a loophole. It's a cold, paranoid world out there, and Zero Trust says that even your best buddy could be the bad guy (or, more likely, their malware-infected laptop is).&lt;/p&gt;

&lt;p&gt;But here's the thing: while Zero Trust is about assuming nothing and validating everything, &lt;strong&gt;IJSEC takes this to the next level&lt;/strong&gt;. It’s not just about not trusting users or devices; it’s about one unshakable belief:&lt;/p&gt;

&lt;p&gt;"It’s not my fault—it’s somebody else’s code!"&lt;/p&gt;

&lt;h3&gt;
  
  
  The Three Tenets of IJSEC: Foundations of Zero Trust (and Zen-like Peace)
&lt;/h3&gt;

&lt;p&gt;So what does it mean to fully embrace the IJSEC philosophy, especially when it intersects with Zero Trust? Let’s break down the core pillars that will help you sleep better at night while wearing your cybersecurity cape.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Assume the Code is Broken (Because It Probably Is)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In Zero Trust, we don’t trust devices, applications, or network traffic. In IJSEC, we go further and &lt;em&gt;always assume the code or config is broken&lt;/em&gt;. If something isn’t working right, or there's a security vulnerability, don’t panic—just assume that the person who came before you is the one responsible. Some call it "avoiding blame" or "shirking responsibility" but we call it "empowering yourself by acknowledging the inevitable flaws of others."&lt;/p&gt;

&lt;p&gt;Found a critical security bug in production? Not your code, not your config; not your problem! (Well, until your boss says it is, but let's not dwell on that.)&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Always Verify (Who the Heck Did This?)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In Zero Trust, it's all about verifying identity and access continuously. Similarly, in IJSEC, we constantly verify &lt;em&gt;who&lt;/em&gt; wrote the code or who configured the environment. "Who thought it was a good idea to leave an unencrypted S3 bucket?" you’ll mutter as you navigate the tangled mess of spaghetti logic in a system you inherited from Steve-who-left-3-years-ago. Steve’s ghost haunts your performance reviews, but as an IJSEC practitioner, you know better than to blame yourself.&lt;/p&gt;

&lt;p&gt;You didn’t leave that port open or write that SQL injection flaw! It was Steve! Verify and move on.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Segment Responsibility (Or, "Pass the Buck Effectively")&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Just as Zero Trust segments the network to limit damage, the IJSEC expert segments responsibility. This is where collaboration comes into play! When you find a bug, it’s crucial to send that ticket &lt;em&gt;directly&lt;/em&gt; to the team (or the person) you think is responsible. And if they’ve left the company? No worries. At that point, it’s a legacy issue—clearly not something &lt;em&gt;you&lt;/em&gt; should deal with today.&lt;/p&gt;

&lt;p&gt;You’re not just passing the buck; you’re practicing proactive segmentation. That’s advanced IJSEC thinking!&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced IJSEC Tactics for the Elite Practitioner
&lt;/h3&gt;

&lt;p&gt;For those ready to take their IJSEC skills to the next level, here are a few advanced moves guaranteed to keep your life easier and your security posture... &lt;em&gt;well, technically existent&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;The "Chain of Custody" Escape Hatch&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;When faced with a security issue, the IJSEC way is to start a chain of emails to track &lt;em&gt;exactly&lt;/em&gt; when and where the flaw emerged—and preferably, point out that it’s been there since long before you joined. In fact, you could say it’s been there since dinosaurs roamed the data center. You've just inherited the problem, and it’s a legacy concern now. Not your code, not your config; not your concern. Maybe submit a ticket for the "historical code issues" team, if they exist.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;The "That’s a DevOps Problem" Maneuver&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Zero Trust wants everything verified, logged, and authenticated at every layer. You, as an IJSEC guru, want that too—&lt;em&gt;as long as someone else is implementing it&lt;/em&gt;. So when asked why the logging isn’t set up properly for that application, the correct response is to calmly say, “That’s a DevOps problem.” Smile serenely and watch the ticket fly to another queue.&lt;/p&gt;

&lt;p&gt;Remember, Zero Trust may assume bad actors everywhere, but IJSEC assumes good delegation everywhere.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;The "Inherited Chaos" Clause&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;For the days when you’re on the hook for a particularly gnarly security incident (like the one that happened because nobody turned on MFA), simply invoke the "Inherited Chaos" clause. This powerful piece of jargon is your shield when explaining to higher-ups why something didn’t go as planned. “Well, due to Inherited Chaos from prior configurations, this happened.” This phrase is both vague and intimidating—perfect for getting out of tight spots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zero Trust, IJSEC, and Finding Balance in the Chaos
&lt;/h3&gt;

&lt;p&gt;Zero Trust may be the gold standard for keeping our networks safe, but for those of us in the trenches, IJSEC is the mindset that keeps us sane. By adopting the “not my code, not my problem” philosophy, we embrace a stress-free (okay, stress-managed) approach to modern systems engineering.&lt;/p&gt;

&lt;p&gt;So next time you find yourself untangling a web of poorly documented APIs, staring at suspicious network traffic logs, or deploying security patches to code that &lt;em&gt;wasn’t&lt;/em&gt; your fault—just remember: &lt;strong&gt;It’s Just Somebody Else’s Code or Computer&lt;/strong&gt;. Trust nothing, assume everything is broken, and, most importantly, be ready to shift responsibility like a pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it Means to be an IJSEC Practitioner: Embracing Zero Trust with a Smile
&lt;/h2&gt;

&lt;p&gt;As much as we love a good "not my code, not my problem" chuckle, there’s an unspoken truth hiding beneath the IJSEC mantra: somebody else’s code is still &lt;strong&gt;somebody’s&lt;/strong&gt; code. And let’s be real—while it’s fun to pass the buck for a while, eventually, we all have to deal with the challenges of our systems. After all, the true spirit of Zero Trust isn’t just about dodging blame—it’s about building strong, secure environments that protect everyone involved. So, let’s dig deeper and talk about how we can approach IJSEC not just with humor, but also with empathy, compassion, and a &lt;em&gt;healthy&lt;/em&gt; dose of collaboration.&lt;/p&gt;

&lt;h3&gt;
  
  
  A New Angle: "Somebody Else" Is Somebody You Should Care About
&lt;/h3&gt;

&lt;p&gt;Here’s a radical idea: behind every bug, every security vulnerability, and every piece of questionable code, there’s a person (probably someone just like you) who did their best with the knowledge, deadlines, and tools they had at the time. And just as we’ve inherited their work, someday, someone else will inherit ours.&lt;/p&gt;

&lt;p&gt;When we step into the mindset of Zero Trust combined with IJSEC’s empathy-driven approach, the goal shifts. It’s no longer about simply shrugging off blame; it’s about &lt;em&gt;understanding the upstream owners of that system&lt;/em&gt; and working together to move the entire system toward better security and reliability. Because at the end of the day, &lt;strong&gt;we’re all in this mess together&lt;/strong&gt;—and we might as well try to fix it with a little heart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Communicate with Compassion: The Code Doesn’t Write Itself
&lt;/h3&gt;

&lt;p&gt;We’ve all had that moment: staring at the mess of someone else’s algorithm or topology and thinking, "How could they have &lt;em&gt;possibly&lt;/em&gt; thought this was a good idea?" But instead of ranting in Slack and Teams or muttering darkly during meetings, what if we approached it with curiosity and compassion? Here’s how you can turn a frustrating bug hunt into an opportunity for growth and teamwork:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Reach Out with Empathy&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Before sending an irritated email or a passive-aggressive ticket comment, take a breath. Remember, the person who did the work wasn’t trying to make your life harder—they were likely solving a problem under pressure. When you reach out to the upstream owner (if they’re still around), frame the conversation positively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wrong approach:&lt;/strong&gt; "Who left this mess? Fix it."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better approach:&lt;/strong&gt; "Hey, I noticed this part of the code could use a security update. I’d love to understand the original thinking behind it and see how we can improve it together."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Starting with empathy opens the door to productive dialogue and avoids the blame game. Plus, building relationships with the people responsible for different parts of the system can pay off in the long run. Trust me—one day, you’ll be glad you have a direct line to Steve-the-ghost’s replacement.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Understand the Context Before Judging&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;It’s easy to critique what we don’t understand. Maybe that bizarre unencrypted database or hardcoded secret in the code was the result of a rushed MVP or a miscommunication between teams. By taking the time to dig into why the code was written the way it was, you can often uncover the root cause of the problems. Instead of just patching the symptom, you’re now armed with knowledge to prevent similar issues from cropping up in the future.&lt;/p&gt;

&lt;p&gt;Plus, asking “What were the constraints when this was built?” can offer insight into how to navigate future updates, budget discussions, and negotiations for additional resources to bolster security and stability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Collaboration: Zero Trust Isn’t Just About Code—It’s About People
&lt;/h3&gt;

&lt;p&gt;Zero Trust demands we authenticate, authorize, and validate everything, but it’s not just machines and network traffic that need validation—it’s people, too. By bringing human compassion into the equation, we can better ensure that Zero Trust frameworks are adopted by every team.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Share the Load, Don’t Just Pass the Buck&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;When you discover a security flaw or potential vulnerability, the instinct might be to toss it over the fence as quickly as possible (we get it—you have 12 other bugs to fix by Friday). But what if, instead, you reached out and asked the upstream owner how you could help address the issue collaboratively? Sometimes, the simplest solutions come from two minds working together. You might find that what seemed like "somebody else’s problem" is actually an opportunity to improve security across the whole system.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Create Learning Opportunities&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;As an IJSEC practitioner with a deep appreciation for Zero Trust, you’re in a position to foster a culture of continuous improvement. Instead of just flagging issues for others, offer to host security learning sessions, share best practices, or even pair-program to resolve security gaps. After all, "somebody else" might appreciate a helping hand more than you think.&lt;/p&gt;

&lt;p&gt;And let’s be honest: improving their code today might save you from inheriting even worse system tomorrow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Toward a Future of Secure, Collaborative Systems
&lt;/h3&gt;

&lt;p&gt;As much as IJSEC started as a jab at shifting blame, it’s clear that there’s a deeper truth here: by recognizing the human side of code, we can shift from finger-pointing to problem-solving. The journey to Zero Trust is a long one, and while we might not always own the code, we all share responsibility for the security of the systems we touch.&lt;/p&gt;

&lt;p&gt;So, next time you’re tempted to throw someone under the proverbial bus for a code flaw or a security mishap, pause for a moment. Remember: "somebody else" is a person just like you—trying to juggle deadlines, technical debt, and a million other things. With a little empathy, communication, and teamwork, we can all work toward a more secure (and less chaotic) future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Embracing Both Zero Trust and Zero Blame
&lt;/h2&gt;

&lt;p&gt;IJSEC may begin with "It's Just Somebody Else’s Code or Computer," but it ends with a reminder that somebody else is just like you—striving to build, protect, and maintain systems in an ever-evolving security landscape. As systems and security professionals, we’re all on the same team, working to make our code, our networks, and our world a safer place. By embracing Zero Trust principles and coupling them with empathy and communication, we can achieve both rock-solid security and strong, trusting relationships with our colleagues.&lt;/p&gt;

&lt;p&gt;And remember: it’s okay to laugh about the code you’ve inherited. But once the laughter fades, roll up your sleeves and collaborate with the team to fix it. Because the best systems aren’t built in isolation—they’re built with compassion, teamwork, and a shared commitment to security and reliability.&lt;/p&gt;

&lt;p&gt;Now, go forth, spread the good word of Zero Trust (and IJSEC), and—most importantly—be kind to "somebody else." You never know when you might become that "somebody" in someone else’s story!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>devsec</category>
      <category>itops</category>
      <category>community</category>
    </item>
  </channel>
</rss>
