frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Open in hackernews

The key points of "Working Effectively with Legacy Code"

https://understandlegacycode.com/blog/key-points-of-working-effectively-with-legacy-code/
156•lordleft•3d ago

Comments

allemagne•18h ago
I read through this book relatively recently and agree with the praise here for the core idea that legacy code is code that is untested. The first few chapters are full of pretty sharp insights that you will nod along to if you've spent a decent amount of time in any large codebase.

However, most of the content in the last half of the book consists of naming and describing what seemed like obvious strategies for refactoring and rewriting code. I would squint at the introduction to a new term, try to parse its definition, look at the code example, and when it clicked I would think "well that just seems like what you would naturally choose to do in that situation, no?" Then the rest of the chapter describing this pattern became redundant.

It didn't occur to me that trying to put the terms themselves to memory would be particularly useful, and so it became a slog to get through all of the content that I'm not sure was worth it. Curious if that was the experience of anyone else.

ebiester•18h ago
I think of the second half much more as reference. I can give it to a junior engineer or early mid-level and say "here is an example."

It's harder if they can't read the older examples, but I can google for a more modern example as well. It gives nomenclature and examples.

dotancohen•3h ago

  > It's harder if they can't read the older examples, but I can google for a more modern example as well. It gives nomenclature and examples.
Don't do that. Ostensibly you're giving these people the book so that they'll learn to deal with legacy code. Those older examples are exactly what they need to see, even if they're in a language that those devs are not using.
michaelfeathers•16h ago
Thanks. After I wrote it a friend said "I think you just gave people permission to do things that they would've felt bad about otherwise." I think he was right, in a way. On the other hand, not everything is obvious to everyone, and it's been 20 years. Regardless of whether people have read the book, the knowledge of these things as grown since then.
iteria•14h ago
I happen to read this book in my early career. I was mid-level. Beyond struggling with codebases, but hadn't yet developed an intuition with codebases. This book blew my mind then. It gave me whole new ways to thinking. I recommend it all the time to people in early career because how to handle a massive legacy codebase isn't obvious at all when you haven't been doing it for a long time.
pmg101•18h ago
The pull quotes are in black on a black background for me on Brave, made it a bit of a confusing read I have to say!
antonvs•16h ago
Same on an iPad Air in Safari
sam_bishop•9h ago
I could read it once I forced my browser into light mode.
nuancebydefault•17h ago
I would argue that legacy code has more chance of going along with test code than new code. Often code is written and tests grow during its maintenance.

Another thought... if I'm tasked with maintaining or adding features to existing code, should I feel responsible for writing tests for the existing codebase?

j45•17h ago
The goal of existing and new functionality is reliability.

What you touch will be on you. So writing a test for your own things, and testing what you are using of the legacy code as you go is a good way to maintain your own coverage in case someone else breaks something in the legacy code, or maybe an update to a library or something goes sideways.

Since you'll be doing a good job of mapping it out below is something elsee. The nice thing is LLMs can help a lot with writing tests.

Reliability can be achieved in a number of ways.

Where I've come across an unknown spreadsheet gone wild, or a code base who's jedi knights have long since vacated, I try to get a sense of putting together the story of how the project started and how it got to where it is today.

If I was cold, I'd first focus on the most critical parts, the most complex, and most unknown potentially to put testing around first.

If refactoring was a goal, for me that means it has to run the same as the old code. One way to do that is see if the existing code can become a service that can be compared to the new service.

LLMs have been really fascinating for me to apply in this regards because I've had to map and tear apart so many processes, systems, integrations and varying interpretations and memories.

AI can even explain what most code is doing no matter how convoluted it is. From there, things like test driven development, or test driven legacy code stabilization is much more doable and beneficial not just for the legacy code, but keeping the AI behaving if it's helping with coding.

ZaoLahma•16h ago
> Another thought... if I'm tasked with maintaining or adding features to existing code, should I feel responsible for writing tests for the existing codebase?

Do you trust yourself enough to not break existing code while maintaining or adding features to it? What would be the consequence of you screwing up? Where would your screw up get noticed? Is it a scary person or group of people who will chase you down to fix it?

I've worked long enough to not trust myself at all anymore, regardless if it's old code or new. Then I evaluate according to above. Usually I land firmly in "yeah, better test it"-territory.

GuB-42•15h ago
Tests in legacy code... LOL

From my real life experience with legacy code:

- There is usually a "test" folder, but what they test look nothing like the actual code, they often don't even compile, and if they do, they fail, and if they don't, that's because every failing test is disabled.

- Refactoring? What refactoring? Usually, all you see is an ugly hack, usually noticeable because the style is different from the rest of the code base. The old code is generally commented out if it is in the way, left alone as dead code if it isn't.

- Writing tests yourself? It would require you to put the test framework back in order first, they don't have the budget for that. Something as simple as reformatting the function you are working with is already a luxury.

- Sometimes, some refactoring is done, but that's only to add new bugs as to keep things exciting.

Still, as surprising as it may seem, I actually like working with legacy code. It is a challenge, understanding what it is doing (without reading the documentation of course, as if it exists, it is full of lies) and trying to leave it in a better state than it was before in a reasonable amount of time. It is great at teaching you all the antipatterns too, very useful if you end up in a greenfield project later on and you don't want it to end up like all the legacy code you have worked on before. If people actually use it, it will, but you can at least delay the inevitable.

Night_Thastus•15h ago
>Another thought... if I'm tasked with maintaining or adding features to existing code, should I feel responsible for writing tests for the existing codebase?

Write tests for new additions to the code, when making major overhauls to sections of it, or when a bug is discovered that the old tests did not catch.

Those are the 3 cases I would say you should add a test. #3 is most important, in my experience.

j45•17h ago
Appreciate the intro to the book.

I recently talk therapied some legacy code through Claude Code back to life, but along the way put some frameworks in place for the codebase itself, and overall with how I think about approaching existing implementations, which helped a ton to shed a path forward for modernization.

It ultimately reminded me there's always a ton more to learn and think about, and it's sometimes quickest to learn from others experiences when considering paths forward, so the book is a helpful share, thanks.

All code is eventually legacy code in one way or another, whether it's the code directly, or the infrastructure level. Today's code might be the best one writes today.. looking back in 5-10 years.. one might wonder if best practice was best practice.

umbula•17h ago
What sort of LLM/Copilot advice file could you write to encapsulate all the good advice here? Would "approach this problem using the ideas from Michael Feather's book Working Effectively With Legacy Code" work?
chris_wot•17h ago
Interesting article, but a small issue - I can’t read this properly on my iPhone as it doesn’t fit on the screen!
commandlinefan•17h ago
Kind of depressing to read because it's so accurate, yet so likely to be ignored.

I remember when Martin Fowler first published the book "Refactoring" - I was so relieved at the time because somebody with some clout that executives might actually listen to had not only identified what was wrong with software but identified a way to fix it and even gave it a name! Boy was I wrong - now you have to be careful how and when you use the term "refactor" because the people who ought to be supportive hear "wasting time".

PaulHoule•13h ago
My feeling about it is that there is not a tension between refactoring and feature work but rather that a specific bit of feature work is best done with a refactoring. For instance about 10 components on a certain page I was working on all had the same accessibility problem which involved changed the HTML and then changing the CSS so this is a good chance to make a single component which can be used to replace the problematic code in all 10 components and to rationalize the CSS.
tome•5h ago
Yes, I have the same experience. Most of my features are implemented as double figures of tiny refactoring commits to prepare the code so that the feature can be implemented in a straightforward way.
_mu•12h ago
> now you have to be careful how and when you use the term "refactor" because the people who ought to be supportive hear "wasting time".

Programmers had a hand in this, sadly: https://martinfowler.com/bliki/RefactoringMalapropism.html

Nowadays people throw the term "refactoring" around quite loosely, usually meaning "rewrite" when that was not at all the original meaning of the term!

A little bit like how "vibe coding" quickly went from one definition to another even though people should have known better.

zabil•5h ago
Part of this is on developers. Refactoring is fine, but too often it turns into yak-shaving and nothing ships. The approach usually works: refactor in small steps and tie it to a feature so it’s testable and adds value.
eschneider•3h ago
Very much this. There's no need (and certainly never time) to add tests to the world or refactor everything. But it's often practical to figure out "I need to make changes "here" and add tests for that section and do whatever cleanup helps for that bit.
pydry•5h ago
It's not a phenomenon specific to refactoring. Humans just arent good at appreciating abstract gains or abstract risks.

The proliferation of technically clueless managers of tech projects and their "control systems" such as scrum has exacerbated the problem.

I met some doctors recently that made some rhyming complaints when non-medical mba management took over a practice.

dakiol•31m ago
I like Fowlers writings, but honestly Refactoring is one of the worst tech books I have read.
egypturnash•16h ago
All the blockquotes are coming in as black on black for me in Safari, Firefox, and Chrome. This appears to be due to a css file called "https://understandlegacycode.com/_astro/ai-support.D3anziw5....". Anyone wanna lay odds on whether that filename is a big tell that much of the text is also written by three autocompletes in a trenchcoat?
KTibow•14h ago
Vite/Rollup name assets based on one of the included files, which can lead to funny and misleading file names like this one.
Lovesong•15h ago
I understand and I agree with the author points, specially looking to distance yourself from the dependencies these systems are usually entangled with, however:

>But the code examples are in Java and C++ and I do python/JavaScript/ruby/

The problem with real legacy code is that sometimes it's not even in those languages. It's VB.NET, COBOL, AS400, BASIC, FORTRAN...and these may not have a chance to "wrap around your class", or "think about all the ORM code that you use". None! I use none of that!. And I can't even call any tests because I can't extend a non existant class, there's no objects in here!.

The author also says:

>You need feedback. Automated feedback is the best. Thus, this is the first thing you need to do: write the tests.

I don't need automated feedback. I need to untangle this deep business layer that everything is wrapped around in a 40 years old codebase, with practically no documentation and having to modify one of the core systems of the company. Sometimes I can't even trust the feedback the program outputs. In this kind of scenarios where the code is so messy and limited by technical factors, the best approach I have found is to debug. And that's it. Follow the trail, find the "seam", and then start your kingdom in the little space you can. Because if you tell your boss that you are implementing Unit tests in a 40 years old codebase, the first question he is gonna hit you with is "Why?", and the article doesn't give any compelling argument to answer this.

bitwize•14h ago
> VB.NET

*laughs in VBA*

jaggederest•14h ago
I got started professionally in ASP/JScript. That's right, ADO through JScript, backend programming in javascript circa 2001.

(If you've never heard of JScript, be thankful. It was microsoft's very-slightly-modified ECMAscript variant)

th0ma5•14h ago
I've skimmed the source material and it doesn't either except for the general advice of putting it all in some kind of conceptual box and slowly move parts to modern or better managed solutions as you try to reverse engineer it all. The underlying subtext was that it is all probably worse than you think and there isn't much good news... But "containment" in various forms is the direction forward mostly unfortunately.
eschneider•3h ago
TBF, that approach works and you won't go years w/o any deliverables with that approach.
strken•13h ago
> the article doesn't give any compelling argument to answer this

Is "[w]hen code is not tested, how do you know you didn’t break anything?" not a compelling argument to your boss?

drzaiusx11•10h ago
From personal experience with bosses: no, often times it's not a sufficient argument.

If the choice is thought to be between:

* delivering value directly to the customer to justify a company's existence

* or adding tests to things that already work (shore up) in an effort to make more correct changes in the future

Will anyone be surprised how often it's the former that management will go for?

I've found the appetite for this type of testability/observability improvement work increases proportionally with the number of support calls being made from customers complaining about the current feature set being unstable and buggy. This work is less palatable when customers really are just looking for that next new feature you promised instead and everything else is a-ok. The exception being things like orbital navigation systems etc..

tonyedgecombe•7h ago
>Will anyone be surprised how often it's the former that management will go for?

I don't think I have ever asked permission to do make what I thought was the correct change.

dotancohen•3h ago
That's because you're not opening Jira tickets titled Refactor Foobar. You're just doing it as a consequence of resolving real business issues. I have seen developers, and once been the developer, suggesting a refactor to the PM. That rarely works: it does not (directly) address a business goal.
MarkSweep•13h ago
Would you be so lucky if your legacy code was written in a well-known language. At a previous employer we had a big pile code in a “macro” language. It could interface with the main C++ code base. It was similar to assembly language in that it had no loops (just gotos) and register-like local variables (no custom names, just L0, L1, L2,…). The semantics were weird, something like unexpected pass-value-value versus pass-by-reference behavior when calling functions.

One customer required lengthy qualification processes when changing the software. But “configuration changes” had a lower bar and somehow these “macros” counted as config. So eventually all the interesting business logic and RPC processing end up in a giant macro file.

bitwize•9h ago
Sounds similar to, but not as bletcherous as, BANCStar, a famed "esolang" that was really the output of a form generation tool used in the finance industry in the 90s. Some engineers figured out that the form generator's output was actually expressed in a Turing-complete, though very arcane, notation replete with opcodes and operands, reverse-engineered it, and started working directly in this language without using the tool to do more sophisticated things than the tool enabled on its own. The boss man probably said "Great! When can we put this into production?" and it's been downhill since.

https://esolangs.org/wiki/BANCStar

https://github.com/jloughry/BANCStar

Relatedly, a long time ago I discovered that Zenographics Mirage—a vector graphics/illustration program originally designed to run on like, VAXen, with both a text terminal and a graphics terminal with a digitizing tablet (similar to this setup seen on Reading Rainbow: https://www.youtube.com/watch?v=b_zYaIxb6dY&t=965s), but later ported to PCs—ran on a sort of bytecode. There were a number of sample scripts shipped with the package that allowed you to automate things in Mirage's command language. Some of them had statements like DO 62,2,32472,32476,0 and comments that read "Don't worry about this, this is just Mirage assembly language." Intrigued, I discovered in the manual a feature you could enable called Op Code Monitor that flashed similar numbers whenever you entered a command. It was mentioned but not documented in detail, nor what the numbers meant, but from that and the scripts I could make some pretty good guesses. I figured out how to make Mirage prompt for a point and store it in a register; and with that I made a command to draw a rectangle that could be rotated. A rectangle in Mirage was defined by its corner points, so when you attempted to rotate it it just rotated the corner points and drew an axis-aligned rectangle with the new corner points. My command accepted two corner points and drew a polyline, so that when you rotated it, the whole rectangle rotated.

kens•12h ago
I read the book shortly after it came out, when I was working on an enormous system of legacy code. Unfortunately, I didn't find the book particularly helpful in terms of strategies for understanding or modifying legacy code. Yes, tests are a good thing, but I expected the book to provide a lot more.

I agree with the parent comment that it is useful to follow the "trail" through the code. It can be a big effort just to figure out how the pieces are connected. Figuring out the data structures and files is another important thing. Also, write documentation as you go; this will help others understand the big picture. If you can just jump in and start writing meaningful unit tests, your legacy system is kinda trivial :-)

Overall, there are people who view testing as a useful tool and people who view testing as an ideology. This book falls into the latter category.

osigurdson•8h ago
>> Yes, tests are a good thing, but I expected the book to provide a lot more

It is strange, actually, how much value we place on any information that sits between two pieces of cardboard.

hiatus•49m ago
Wait till you hear about how much we value information stored in meat!
arkh•4h ago
> And I can't even call any tests because I can't extend a non existant class, there's no objects in here!.

I'm gonna preach for the church of "away with unit tests": so what? You don't want to test code. Code is not what the user care about.

You want to test behavior. And for this you don't need to extend classes. You should not have to rewrite any code from your application. Like you say: write tests at the seam. Automate user inputs and checking outputs.

A good test suite should not need to be rewritten during refactoring. It should even allow you to change language or replace for an off-the-shelf solution you did not write. If a unit test suite does not allow that, unit tests are an impediment. And I don't care about the "test pyramid", like the IRL ones, it is just a relic; from an age when launching all your tests in parallel was unfathomable.

SideburnsOfDoom•3h ago
> You don't want to test code. You want to test behavior. A good test suite should not need to be rewritten during refactoring.

100% agreed.

> I'm gonna preach for the church of "away with unit tests"

I disagree with the semantics here.

From the article: "In short, your test is not unit if it doesn’t run fast or it talks to the Infrastructure (e.g. a database, the network"

This says _nothing_ about what part of the app structure you test. It's not always a class-method test. Outside-in, behaviour centric tests that are not close-coupled to structure, can also be unit tests. And most of the time, it's a better kind of unit test.

Kent Beck said many times: "tests should be coupled to the behavior of code and decoupled from the structure of code."

"test behavior" was the original intent of unit tests. The idea that unit tests are only close-coupled class-method tests, or that testing 2 collaborating classes from the same app at once counts as an "integration test" is a latter-day misconception. A dumbing down.

jbjbjbjb•13h ago
Big caveat that I’ve not read the book but I get that the premise is “legacy code is code that is untested” and I’ve always struggled with that definition. I think a more accepted definition would be that it is not well understood, uses old tooling/languages/runtimes and is usually high stakes code (driving some business that was successful enough to last longer than the staff that coded it up). I’m sure added tests help deal with legacy code under that definition but not sure it’s the panacea, I’ve certainly seen code without tests lots very high coverage that people area afraid to work on due to them being unfamiliar with the domain and codebase.
nitwit005•13h ago
The code base I work on has multiple layers of wrapper code from people following this sort of advice. Sure, it's safe, but once the code is two layers of wrappers deep, you'll see the downsides.
fknmillenisla•11h ago
What I’ve found:

- Anything with millennial-looking cartoon characters in cartoons is bad.

- Anything with furry characters is good.

avgcodor•10h ago
I've replaced a few large legacy systems over the years and I disagree with most of the points mentioned in the link. The only way guaranteed to work is to run the old system concurrently with the new system with live inputs and compare results for a trial period and fixing discrepancies as they arise. Only when there is 100% behavioral/data fidelity with the old system can a switchover to the new system occur.

I'm not aware of the formal Design Pattern name, but a google search yielded this blog post on the subject: https://medium.com/@sahayneeta72/parallel-run-strategy-7ff64...

Coincidentally this is the same strategy github employed when verifying libgit2: https://github.blog/engineering/engineering-principles/move-...

grahamplace•9h ago
I’ve seen Martin Fowler call something like what you’re describing the Strangler Fig pattern

https://martinfowler.com/bliki/StranglerFigApplication.html

asplake•7h ago
Better still, lots of mini-switchovers. I rolled out a bank’s p&l system for bonds that way. Trading book by trading book, those with simpler instruments first, more complex ones later. We finished ahead of schedule!
sciurus•35m ago
You're assuming the "legacy" system is being replaced by a new one, which isn't the scenario being described in the link or the book. They cover approaches for continuing to safely evolve the legacy (i.e. untested) system.
neilv•9h ago
> First, add tests, then do your changes

This can be a superpower.

I once had to replace a PostgreSQL-interfacing layer of a large+complex+important system, and most of the original tests had been lost.

It's the kind of change that could be an existential risk for a company that needs the system to be available and correct.

So I built a comprehensive test suite for the existing PostgreSQL-interfacing layer, tested it, made drop-in compatible API using the new way to talk with PostgreSQL, tested that, and... the entire huge system simply worked with the replacement, without a lot of headache/defects/dataloss/ulcers.

> Before you change code, you should have tests in place. But to put tests in place, you have to change code.

Keep reading. You don't always have to do it in the heroic way the article described in this section. Modularity and backward-compatible interfaces, FTW, when you can. The "Sprout" and "Wrap" techniques that the article describes later.

Also, one complementary general technique that the article didn't get into is that sometimes you can run two implementations in parallel, and check them against each other. There are various ways you can do this, involving which really implementation really takes effect, and what you do if they don't agree. (Related: voting configurations in critical systems.)

> Characterization tests

The test suite not only let me validate the implementation, but the exercise of developing the test suite also helped me understand exactly what I should be implementing in the first place.

Sometimes I had to look at the implementation, to tentatively figure out the semantics, then testing validated that also.

> Use scratch refactoring to get familiar with the code

In reasonable cultures and with reasonable management, or if you don't tell anyone. Otherwise, it's the same kind of risk as the old "throwaway prototype" problem: someone with authority says "looks good; I told the customer/CEO we just need to make these few more changes, and ship it". Or, in popular Agile/Scrum processes, "I thought you already completed the refactor last sprint; why are you doing it again".

fogzen•8h ago
No. Run away from any sort of refactor or rewrite. Don't even think about it. Do not proceed. If you're thinking that you can do better, you will be humbled in the worst way. Ignore my warning at your peril. I'll never again for the rest of my life make the horrible mistake of rewriting any system. The article's tactics are all good advice – but it's like tactics for surviving on the front line. You win by never going there in the first place.
bsder•7h ago
Maybe the technical aspects of the book are okay.

However, the big problem with legacy code is always political. And the only book I've seen ever try to address that is "Kill It with Fire".

It's one of the few books that talks about the need to keep your team motivated and plugged into the political system given that they are working on the thing that's super important but also almost invisible. You need to be constantly selling what is going on in front of the important eyeballs.

Unfortunately, a lot of the anecdotes have an undercurrent of "Until the system has actively exploded into a million pieces such that somebody with real power has their ass on the line, don't bother."

guardian5x•5h ago
It's easy to say 'write tests', but it's difficult to do so if you don't know what the actual requirements are.

People often think they are doing it 'properly' now by starting simple, but as they learn more and add functionality, they end up with the same complex mess they wanted to avoid.

yakshaving_jgt•3h ago
Right, but not knowing what tests to write is feedback that your [yet to exist] tests are trying to tell you.
pkdpic•4h ago
Love this resource, really looking forward to perusing the full text.

And to echo what others are saying I have spent the last month experiencing for the first time how not simple throwing a meaningful test suite together is for a ginormous legacy codebase. I was glad the author briefly seemed to acknowledge that but still... the pain...

They said the playwright ui was supposed to make it easy... Just plug it into an LLM they said... It should just take a few days right?

internet_points•4h ago
The most important part:

> You have to deal with Legacy Code every day.

Legacy code is code you didn't write. It used to be that code you didn't write was written by past team members. These days, we have legacy-code-generators that write code you didn't write at a much higher rate then your company can fire team members.

brainzap•3h ago
the website doesnt render properly on mobile. the first aid website is unreadable on mobile darkmode
shahindohan•2h ago
The only issue I have with writing tests before refactoring is that sometimes it can take a really long time to write those tests and cover all the cases, not to mention needing to sometimes refactor to make the code even testable.

I've made huge successful refactors using nothing but carefulness and manual testing, maybe just a very little bit of unit testing :)

jt2190•44m ago
I like to make the distinction that the absence of automated tests is not the absence of tests altogether, and that the time it takes to get an automated test set up might be longer than doing the test manually. This is especially important to be aware of if the tests will be temporary because the code is about to be changed.

Of course the goal is to reach an end state with automated tests, but insisting on 100% automated tests up-front can actually prevent the refactoring from even starting.

gnulinux996•2h ago
I feel like there is a need for a new paradigm on navigating code; and reference documentation for that matter.

I like how https://gwern.net and https://en.wikipedia.org allow you to hover over terms and show you a quick glance of a term you might not know, and then you can fan out to create an understanding for the basis needed to understand the material in front of you. I feel like some sort of windowing system where I can pin and move references around and then kinda have the llm explain or reference things might be of use to me, as in help me navigate the unknown. Is there a "study companion" application of the sort?

I find that this is easier to do with a language like Java than say Python, I need as much information as I can in order to understand the decisions that led to the current implementation.

Sometimes when I want to change some piece of legacy code, I need to know the rationale behind the code written here, although keeping the interfaces the same and changing the implementation allows me to go quite far.

sesm•14m ago
This book talks about unit tests, but for UI they are mostly useless. I found that for UI the most essential refactoring tools are storybook and visual diff tests.

Mistral AI raises 1.7B€, enters strategic partnership with ASML

https://mistral.ai/news/mistral-ai-raises-1-7-b-to-accelerate-technological-progress-with-ai
445•TechTechTech•7h ago•264 comments

A clickable visual guide to the Rust type system

https://rustcurious.com/elements/
109•stmw•3d ago•10 comments

You too can run malware from NPM (I mean without consequences)

https://github.com/naugtur/running-qix-malware
65•naugtur•3h ago•46 comments

DuckDB NPM packages 1.3.3 and 1.29.2 compromised with malware

https://github.com/duckdb/duckdb-node/security/advisories/GHSA-w62p-hx95-gf2c
134•tosh•3h ago•81 comments

Hallucination Risk Calculator

https://github.com/leochlon/hallbayes
29•jadelcastillo•2h ago•8 comments

How can England possibly be running out of water?

https://www.theguardian.com/news/ng-interactive/2025/aug/17/how-can-england-possibly-be-running-o...
184•xrayarx•2d ago•278 comments

Signal Secure Backups

https://signal.org/blog/introducing-secure-backups/
890•keyboardJones•20h ago•394 comments

Weaponizing Ads: How Google and Facebook Ads Are Used to Wage Propaganda Wars

https://medium.com/@eslam.elsewedy/weaponizing-ads-how-governments-use-google-ads-and-facebook-ad...
35•bhouston•52m ago•14 comments

Nango (YC W23) Is Hiring a Staff Back End Engineer (Remote)

https://jobs.ashbyhq.com/Nango/3467f495-c833-4dcc-b119-cf43b7b93f84
1•bastienbeurier•1h ago

Liquid Glass in the Browser: Refraction with CSS and SVG

https://kube.io/blog/liquid-glass-css-svg/
373•Sateeshm•15h ago•96 comments

iPhone dumbphone

https://stopa.io/post/297
535•joshmanders•19h ago•315 comments

Anscombe's Quartet

https://en.wikipedia.org/wiki/Anscombe%27s_quartet
20•gidellav•1d ago•8 comments

Strong Eventual Consistency – The Big Idea Behind CRDTs

https://lewiscampbell.tech/blog/250908.html
85•tempodox•8h ago•35 comments

NPM debug and chalk packages compromised

https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised
1233•universesquid•21h ago•662 comments

Experimenting with Local LLMs on macOS

https://blog.6nok.org/experimenting-with-local-llms-on-macos/
342•frontsideair•22h ago•225 comments

Deluxe Paint on the Commodore Amiga

https://stonetools.ghost.io/deluxepaint-amiga/
52•doener•3d ago•13 comments

Microsoft doubles down on small modular reactors and fusion energy

https://www.techradar.com/pro/microsoft-joins-world-nuclear-association-as-it-doubles-down-on-sma...
147•mikece•18h ago•260 comments

The elegance of movement in Silksong

https://theahura.substack.com/p/the-elegance-of-movement-in-silksong
137•theahura•16h ago•207 comments

Alterego: Thought to Text

https://www.alterego.io/
158•oldfuture•16h ago•104 comments

Contracts for C

https://gustedt.wordpress.com/2025/03/10/contracts-for-c/
89•joexbayer•4d ago•69 comments

X Design Notes: Unifying OCaml Modules and Values

https://blog.polybdenum.com/2025/08/19/x-design-notes-unifying-ocaml-modules-and-values.html
12•todsacerdoti•3d ago•0 comments

Is OOXML Artifically Complex?

https://hsu.cy/2025/09/is-ooxml-artificially-complex/
117•firexcy•3d ago•112 comments

No adblocker detected

https://maurycyz.com/misc/ads/
507•LorenDB•12h ago•261 comments

Clankers Die on Christmas

https://remyhax.xyz/posts/clankers-die-on-christmas/
240•jerrythegerbil•22h ago•195 comments

Will Amazon S3 Vectors kill vector databases or save them?

https://zilliz.com/blog/will-amazon-s3-vectors-kill-vector-databases-or-save-them
246•Fendy•21h ago•111 comments

Majority in EU's biggest states believes bloc 'sold out' in US tariff deal

https://www.theguardian.com/world/2025/sep/09/majority-in-eu-biggest-states-believes-bloc-sold-ou...
11•belter•1h ago•1 comments

Seedship – Text-Based Game

https://philome.la/johnayliff/seedship/play/index.html
107•ntnbr•3d ago•41 comments

Show HN: Attempt – A CLI for retrying fallible commands

https://github.com/MaxBondABE/attempt
57•maxbond•11h ago•15 comments

The key points of "Working Effectively with Legacy Code"

https://understandlegacycode.com/blog/key-points-of-working-effectively-with-legacy-code/
156•lordleft•3d ago•61 comments

AMD claims Arm ISA doesn't offer efficiency advantage over x86

https://www.techpowerup.com/340779/amd-claims-arm-isa-doesnt-offer-efficiency-advantage-over-x86
196•ksec•22h ago•365 comments