All articles

  1. Development & automation

    Before Design Patterns: How Software Engineering Learned to Manage Complexity

    From Lovelace's Notes of 1843 to Brooks's essay of 1986, each advance in programming removed a difficulty of the tools and left the difficulty of the problem. One pricing routine, written three ways with identical output, shows what structure and names buy and what they do not.

    ·17 min read

    Keep reading →
  2. Development & automation

    Structured Programming, Modularity and Information Hiding

    Structured control flow, procedures, modules, information hiding, coupling, cohesion and separation of concerns are separate ideas from separate authors. The same pricing rules, cut as functions and then as modules, show what Parnas's criterion localises and what it does not.

    ·19 min read

    Keep reading →
  3. Development & automation

    Object-Oriented Programming: Origins, Promises and Trade-offs

    Object orientation is several mechanisms with separate origins: Simula's subclasses, abstract data types, Smalltalk's messaging. One pricing example shows what encapsulation and an interface buy, what they cost, and when functions over plain data stay the better design.

    ·16 min read

    Keep reading →
  4. Development & automation

    The Gang of Four: 23 Design Patterns and the Problems They Solve

    The 23 patterns of the 1994 book, each as a problem, a shape, a cost and its modern C# form, in one pricing example. Most are a single move, an interface placed where something varies, and the example needed only one of them.

    ·31 min read

    Keep reading →
  5. Development & automation

    SOLID, Coupling, Cohesion and Dependency Inversion

    Coupling and cohesion are the criteria; the five SOLID principles are later heuristics with separate origins in Meyer, Liskov and Martin. One pricing calculator shows what each buys and costs, and why dependency inversion, dependency injection and a container are three different things.

    ·23 min read

    Keep reading →
  6. Development & automation

    Refactoring: Improving Design Without Changing Behaviour

    Refactoring changes structure against a recorded definition of behaviour, in steps small enough to check. One legacy pricing method is pinned by characterisation tests, reshaped in seven steps, and the tests themselves are proved able to fail.

    ·22 min read

    Keep reading →
  7. Development & automation

    From Design Patterns to Domain-Driven Design and Modern Architecture

    Domain-driven design, ports and adapters, the onion and the clean architecture share one rule: the business rules refer to nothing else. The pricing example gains a domain model and a tested boundary, and needs 22 types where one class did.

    ·20 min read

    Keep reading →
  8. Development & automation

    Do We Still Need Gang of Four Patterns in Modern C# and .NET?

    All 23 patterns set against C# 14 and .NET 10: eleven have a shorter form in the example, built from a language or platform feature, and twelve do not. The problems remain in every case, and each modern form has a failure of its own.

    ·25 min read

    Keep reading →
  9. Governance & security

    Automatic external forwarding in Exchange Online: three controls, and one value that tells you nothing

    Whether mail can leave a Microsoft 365 organisation by automatic forwarding is decided by three separate controls, and the default value of the first one means On in some tenants and Off in others. How to read each control with PowerShell, how to find the mailboxes that forward today, and how to block forwarding with named exceptions.

    ·7 min read

    Keep reading →
  10. Azure & Cloud

    Azure Functions timer triggers that run late, twice or not at all, and how to prove a run

    A timer-triggered function has no caller to notice when it does not run. This article sets out what Microsoft documents about schedules, time zones, missed occurrences and retries, and shows how to prove each run, and each absence, in Application Insights.

    ·8 min read

    Keep reading →
  11. Governance & security

    Giving an application access to specific SharePoint sites with Sites.Selected

    An application needs one SharePoint site and the request on the table is Sites.Read.All or Sites.FullControl.All for the whole tenant. This article sets out what Sites.Selected grants on its own, who can create the per-site grant, the Microsoft Graph and PnP PowerShell calls that create, list and remove it, and where the documentation stops.

    ·8 min read

    Keep reading →
  12. Development & automation

    Reading a SharePoint list with more than 5,000 items without hitting the list view threshold

    A script or view that worked for years fails once a list passes 5,000 items, even when the filter matches a handful of rows. This article establishes what the list view threshold measures, where it can and cannot be changed, and how to page through a large list with PnP PowerShell, REST and Microsoft Graph.

    ·9 min read

    Keep reading →
  13. Development & automation

    The green test that measured nothing

    A test suite can be green because the system works, or green because the test points at nothing. We collected our own specimens: a suite verifying a build nobody shipped, a read-only gate over a collector that could not load, a published guarantee table that never executed, a pinned assertion that was a fossil of a bug, and a suite that proved every rule and never ran the handler. Each one with the code, and the one-line question that catches all five.

    ·7 min read

    Keep reading →
  14. Development & automation

    Developing for SharePoint Server Subscription Edition: the practices that hold up

    Subscription Edition is supported until at least 2035 and its SharePoint Framework ceiling has not moved since 2023. That combination is the whole job: a long runway on an older stack. This is how to build on it well, with code that runs on the version your farm actually accepts.

    ·20 min read

    Keep reading →
  15. Migrations

    SharePoint 2016, 2019, Subscription Edition and Online: what actually changes

    2016 and 2019 both left support on 14 July 2026. Subscription Edition has no end date and cannot be bought outright. Online has features the others do not have, and Subscription Edition has two that are no longer a simple no. A practical comparison, with the licensing that decides it.

    ·21 min read

    Keep reading →
  16. Migrations

    Migrating SharePoint 2016 and 2019 to Subscription Edition: the scripts

    SharePoint 2016 goes straight to Subscription Edition. There is no hop through 2019, the method is database attach and nothing else, and the order of the service applications is not a preference. The sequence in PowerShell, from the inventory you take before touching anything to the checks you run before anyone is let in.

    ·25 min read

    Keep reading →
  17. AI & agents

    A Copilot agent manifest is a security boundary. Here is the linter for it.

    Every scoping property in a Microsoft 365 Copilot agent manifest is optional, and in six places omitting one grants the widest scope instead of the narrowest. A JSON Schema validator approves those manifests, because nothing in them is invalid: something optional is missing. So we wrote the check that does catch it. It finds six problems in a manifest that passes every other test.

    ·6 min read

    Keep reading →
  18. Development & automation

    SPFx before version 1.0: our web parts in the official Microsoft samples

    The SharePoint Framework developer preview came out in August 2016. Version 1.0 arrived in February 2017. Our first contribution to the official Microsoft 365 samples repository is dated October 2016, five months before there was a 1.0 to build against. Four of our web parts are in that repository today, and this is what each of them is for.

    ·5 min read

    Keep reading →
  19. AI & agents

    Can your AI assistant read documents the user cannot see?

    A badly built RAG searches with the application's identity, not the asker's, and the assistant answers with what the person should not see. The fix is not a filter someone can forget to write: it is passing the user's token and letting Azure AI Search enforce permissions inside the engine.

    ·6 min read

    Keep reading →
  20. Development & automation

    SPFx 1.23.2: upgrading is not changing a number

    The previous version was pulled from npm for regressions, and that is the warning: the risk of upgrading the SharePoint Framework is almost never in the SharePoint runtime, it is in the build. What changed in Heft, in Sass and in npm audit, with the code showing how it was, how it is, and how it will be.

    ·6 min read

    Keep reading →
  21. Microsoft 365 & SharePoint

    Windows 10 has ended: Windows 11 is the minimum, not the plan

    Support ended in October 2025. Whether a fleet is already on Windows 11, paying for Extended Security Updates, or simply exposed, the decision underneath is the same: swap the PCs, or use the forced move to modernise the workplace behind them. This is the how, with the Intune, Autopilot and Azure commands, and the reason the same Windows 10 is free to keep alive in the cloud.

    ·6 min read

    Keep reading →
  22. Governance & security

    A cookie banner you can prove, with Azure Tables and Functions

    The banner you copy from a vendor can itself be a tracker. Build your own instead, with no third parties, and the hard part turns out not to be the banner: it is keeping the proof that the person consented. Here is all of it, from the browser to the Azure Table, step by step.

    ·7 min read

    Keep reading →
  23. Development & automation

    Sending email from an application, without a single password

    Microsoft turned off SMTP with a password. The answer is not to store a better secret: it is to store no secret at all. Managed identity, Microsoft Graph, and Mail.Send tied to a group of mailboxes. Here is the whole configuration, mistakes included.

    ·5 min read

    Keep reading →

Categories

Send us a message

or write to hello@ph7x.com