PHP's Talent Crisis, Bad Software Design Smells, Terminal UIs with React, and Laravel 13.8

Published on 07.05.2026

ARCHITECTURE

PHP Powers Most of the Web, So Why Aren't New Developers Learning It?

TLDR: PHP still runs a huge portion of the web, but only 8% of PHP developers have fewer than five years of experience. The community is aging fast, and the pipeline of new talent is nearly empty.

Summary: The 2026 PHP Landscape Report from Perforce lays out something that should make anyone who cares about web infrastructure a little uncomfortable. PHP is everywhere. It powers a staggering share of the web. And yet, when you look at who is actually writing it, the picture is of a graying workforce with almost no one coming up behind them. Eight percent. That is the share of PHP developers who have less than five years of experience. Compare that to a language like JavaScript or Python, where the developer population skews much younger, and the contrast is jarring.

Most PHP work happens at small and medium-sized businesses, with nearly half of PHP developers working at companies with fewer than 20 employees. That is a very different profile from the enterprise Java or cloud-native Go developer. These are often agencies, small product shops, e-commerce businesses, the kinds of places that built WordPress sites ten years ago and have been maintaining them ever since. Europe is particularly dominant in PHP usage, which also reflects where CMS-heavy web culture took root.

On the infrastructure side, there is an interesting shift: NGINX has overtaken Apache as the top web server for PHP deployments for the first time. That is a real generational change in the stack. Meanwhile, 58% of PHP apps are still running on-premises rather than in the cloud, which tells you something about the conservatism of the typical PHP shop.

Here is what the report is not confronting directly: PHP has a perception problem that no amount of language improvement will fix on its own. PHP 8.x is genuinely good software. The language has grown up. But the developer community's reputation, fair or not, keeps it off the radar of bootcamps, university curricula, and the YouTube tutorials that shape what new developers reach for first. The report celebrates PHP's continued maturation without grappling with why that maturation has not translated into community growth.

What is also missing from this analysis is the role of WordPress in this equation. WordPress powers something like 40% of the web, and a huge portion of those 8% newcomers are probably theme and plugin developers, not application developers in the traditional sense. Strip that out and the talent pipeline for PHP-first application development looks even thinner.

Key takeaways:

  • Only 8% of PHP developers have fewer than 5 years of experience, signaling a serious talent pipeline problem
  • NGINX has surpassed Apache as the dominant web server for PHP deployments for the first time
  • 58% of PHP applications still run on-premises, reflecting the conservative nature of the typical PHP user base
  • PHP's language quality has improved substantially, but perception and community growth have not kept pace

Why do I care: If you are building systems that interact with PHP-based platforms, whether CMS integrations, payment gateways, or legacy APIs, the shrinking talent pool is a real operational risk. It is not just an academic concern. Fewer experienced PHP developers means higher hiring costs, more unmaintained codebases, and pressure to migrate systems that are actually working fine. Understanding where PHP is healthy and where it is fragile matters for any architect making long-term platform decisions.

PHP powers most of the web, so why aren't new developers learning it?


Symptoms of Bad Software Design

TLDR: Four classic symptoms of bad design, rigidity, fragility, immobility, and viscosity, are examined with concrete examples and pattern-based remedies. This is SOLID 101, but the scenarios make it worth revisiting.

Summary: The article from Optimist Engineer walks through four warning signs that your codebase is fighting you. Rigidity is when a single change cascades into a dozen other changes you did not expect. The fix proposed is the Strategy Pattern combined with the Open/Closed Principle, which lets you extend behavior without touching existing code. Fragility is when a change in one area of the system breaks something seemingly unrelated. The remedy here is proper encapsulation and Interface Segregation so that modules expose only what they need to, hiding implementation details behind stable contracts.

Immobility is the one that I think causes the most day-to-day frustration. You can see that a piece of logic could be reused somewhere else, but it is so tangled into its original context that extraction feels riskier than rewriting. Clean Architecture and Dependency Inversion are the prescribed solutions, pushing dependencies to the edges so that core logic becomes genuinely portable. Viscosity is perhaps the most insidious: it is when doing the right thing is harder than doing the wrong thing. The code structure discourages good practices, so developers take shortcuts, and the design degrades incrementally with each one.

What is worth noting is that these four symptoms, originally articulated by Robert Martin decades ago, remain as relevant as ever. That should give us pause. We have had SOLID principles, Clean Architecture, and design pattern literature for a long time. The fact that these symptoms persist so universally suggests that knowing the patterns is not the problem. The problem is the conditions under which software gets written: time pressure, unclear ownership, insufficient review, and the accumulated weight of decisions made by people who have since moved on.

The article is honest about offering solutions at a fairly high level of abstraction. It tells you to use the Strategy Pattern, but real-world adoption of these patterns in a legacy codebase is rarely straightforward. The harder questions, how do you incrementally introduce these patterns without stopping feature work, how do you get a team to agree on abstractions, are left unanswered. Still, as a diagnostic tool, the four-symptom framework is genuinely useful.

Key takeaways:

  • Rigidity, fragility, immobility, and viscosity are four symptoms that indicate structural problems in a codebase
  • Each symptom has a corresponding set of design patterns and principles that address the root cause
  • The persistence of these symptoms across the industry suggests awareness of patterns alone is not sufficient
  • Viscosity is particularly dangerous because it makes correct behavior the path of most resistance

Why do I care: As a senior frontend architect, I see all four of these symptoms regularly in large React codebases. Rigidity shows up as tightly coupled component trees. Fragility appears when touching a shared context provider breaks five unrelated features. Immobility is why utility hooks get copy-pasted instead of shared. And viscosity is why developers reach for inline styles instead of the design system. The patterns differ from backend OOP, but the underlying diagnostic framework maps cleanly.

Symptoms of Bad Software Design


Beautiful Terminal UIs, Made Simple

TLDR: termcn brings shadcn-style component distribution to terminal UI development in React, using the Ink framework. You install components directly into your project via the shadcn CLI, no separate package dependency required.

Summary: I keep coming back to how much the shadcn distribution model has changed the way developers think about component libraries. Instead of installing a monolithic package and fighting with its styling opinions, you copy the component source into your project, own it, and modify it freely. termcn applies exactly that idea to terminal user interfaces.

The project builds on Ink, which lets you write terminal UIs using React components. If you have ever used React, writing terminal apps with Ink feels surprisingly familiar. You use familiar component composition patterns, but instead of rendering to a browser DOM, you are rendering to a terminal. termcn layers on top of that by providing a registry of pre-built terminal UI components that you can pull into your project with a single command using the shadcn CLI.

This is a genuinely clever combination. The Ink framework has been around for a while and is used in some well-known CLI tools. What it has lacked is a component ecosystem that makes it easy to build polished interfaces without writing everything from scratch. termcn fills that gap using an infrastructure that the JavaScript community already knows and trusts.

The article itself is brief, more of an announcement than a deep dive, so there are real questions left open. How mature is the component set? What is the maintenance story? The shadcn model works well for UI components because the underlying Radix primitives are stable. Terminal UI components may have a narrower set of constraints, but the fidelity between what you compose and what the terminal renders can be surprising. Still, for teams building developer tooling in Node, this is worth keeping an eye on.

Key takeaways:

  • termcn is a shadcn-style component registry for terminal UIs built on the Ink React framework
  • Components are copied into your project rather than installed as a dependency, giving you full ownership
  • Installation uses the existing shadcn CLI toolchain, making adoption easy for React developers
  • This combination could lower the barrier to building polished CLI tools significantly

Why do I care: A lot of frontend tooling these days ships with a CLI companion, whether it is a dev server, a scaffolding tool, or a migration assistant. Having a well-designed terminal component library that React developers can actually reason about changes what is realistic to build in a day. The shadcn distribution model has already proven itself; applying it to terminal UIs is a logical extension.

Beautiful terminal UIs, made simple


Queue-Wide Inspection Methods in Laravel 13.8.0

TLDR: Laravel 13.8.0 ships a batch of developer quality-of-life improvements, most notably methods that let you inspect jobs across all queues in a single call, plus new worker lifecycle events and several testing and query builder additions.

Summary: Laravel continues its cadence of incremental, practical releases with version 13.8.0. The headline addition is a set of queue-wide inspection methods: you can now retrieve all reserved jobs, all delayed jobs, and all pending jobs across every queue in a single method call. Previously, getting a global view of your queue state required either looping through queues manually or reaching for external tooling. This addition makes debugging queue backlogs and building queue monitoring dashboards significantly more straightforward.

The release also introduces WorkerPausing and WorkerResuming events, triggered by UNIX signals. This is a nice touch for anyone building deployment or monitoring tooling around their queue workers. Knowing exactly when a worker starts pausing, rather than just inferring it from the absence of job processing, gives you better hooks for graceful shutdown logic and alerting.

On the testing side, the new assertSessionMissingInput assertion is a small but useful addition for form and session testing. The SortDirection enum in the query builder is interesting in a different way: it takes advantage of PHP 8.6 enum capabilities to make sort direction a proper typed value rather than a raw string. That kind of incremental type safety improvement is easy to overlook but adds up over time in a large application. The environment filter for the schedule list Artisan command is a practical debugging tool for anyone running different job schedules per environment.

There is also support for custom foreign key actions, attribute middleware merging with route middleware, named AWS credential providers for SQS, and enum support for the mail driver configuration. These are the kinds of additions that solve specific, real annoyances without introducing new complexity. Laravel's release process continues to be one of the more developer-friendly in the framework world.

What is worth pointing out is that Laravel's pace of small, well-scoped improvements reflects a mature project with a clear sense of what its users actually need. These are not headline features. They are the kind of additions that make you think "oh, I needed that last month" rather than "wow, this changes everything." That is a compliment.

Key takeaways:

  • New queue-wide inspection methods give a global view of all jobs across all queues in a single call
  • WorkerPausing and WorkerResuming events enable better hooks for graceful worker shutdown and monitoring
  • SortDirection enum in the query builder adds type safety for sort operations using PHP 8.6 features
  • Multiple smaller additions, including testing assertions, foreign key actions, and AWS credential providers, round out the release

Why do I care: Even if you are primarily a frontend or TypeScript developer, understanding what PHP frameworks are doing matters if you work with teams that use Laravel as a backend. Queue management, worker lifecycle, and type-safe query building are concerns that surface in any serious production system. The direction Laravel is taking toward more explicit types and better observability is the right one, and it mirrors what we see in typed frontend codebases.

Queue-Wide Inspection Methods in Laravel 13.8.0