From simple IP blocks to probabilistic deep packet inspection: the evolution of web censorship technology: https://news.ycombinator.com/item?id=22659534
miniblog.
Related Posts
What software designs require clean slate 'revolution' implementations, rather than evolution?
I can think of: borrow checking in a PL (existing code is unsafe), microkernels (architecture is too different from monokernels), and full REPLs (can't add type redefinition later).
The evolution of Rust compiler error messages, the approach taken by the core team, and even some sample code from the Rust lexer and parser!
The evolution of communication styles when machine learning can do the simple stuff: https://www.overcomingbias.com/2017/03/better-babblers.html