Hacker Newsnew | past | comments | ask | show | jobs | submit | jdw64's commentslogin

In China, there are first tier cities and second tier cities, and there is also the issue of migrant workers . The reason college students are so strongly opposed to the 'return to the countryside' movement is that they know once you go down, there is no way back up. And joining the Communist Party, and inheriting about half of the party's positions, is part of that reality. In that sense, it's not that women have a fantasy about marrying up, but rather that they are making a survival driven choice. Even within our East Asian cultural sphere, there has been a strong preference for sons due to the agricultural way of life. As a result, selective abortion has led to a significant shortage of women.

There is criticism that my country's K dramas encourage marrying up, but I don't think women's choices in the subtly stratified hierarchy of East Asian society are wrong. It's not a war; I see it as women simply surviving


In my experience, it's probably due to differences in budget line items. Usually, regular labor costs and outsourcing costs are budgeted separately. Some teams may not have the authority to hire an additional full-time employee, but they do have the authority to use external contractors. On top of that, the internal political landscape differs as well. When it comes to office politics, increasing headcount in a particular department means increasing that department's influence. There are also additional benefits and administrative costs that come with hiring permanent staff. Moreover, standard contracts usually come with overhead for contract management personnel and procedural costs, and these are often handled by the vendor side. In other words, direct employment comes with long-term responsibilities for performance and benefits, but when you outsource, most of that liability shifts to the external vendor.

What is more frightening about this than safe C assembly is that this level of implementation is achievable not with a SOTA model, but with a cost effective model like KIMI. There was human judgment involved in the middle, but reading the article, My reading of the process is as follows:

1.A developer identified the necessity of inline assembly.

2.Defined the safety boundaries for 'memory-safe' inline assembly.

3.Established strict policies for memory access.

4.Curated an allowlist of permissible instructions.

5.Set rigorous test criteria and 'done' conditions.

In short, with the overall guardrails in place, a sub agent loop was run, and this level of code was produced. This raises a number of interesting points about how we should use AI. I haven't looked at all the code, but the idea of passing assembly through safe zones without memory access, and using that as a foundation to achieve this level of implementation through AI, is quite impressive


The utility margin of SOTA models is greatly overstated. You have to pick seriously niche puzzles to make the money worth spending.

Anyway, this is also very useful for humans to use, so it's mostly a lovely coincidence this level of safety arrived with useful chatbots.


I honestly would be surprised if someone used AI in any other way to achieve this

Same here.

I agree with the main thesis, but I think the Socrates image in the blog post is a bit of an error. Because Socrates actually said that writing would atrophy memory. Yet every era faces the same criticism: 'New tools just make people dumber.' (They probably used Socrates to make a point about thinking humans, but still.) When AI-related posts come up on HN, it's usually best to pick the middle ground that fits the tone of the article.

In practical coding work, there's an overwhelming amount of code I don't know. To be precise, the only time someone can have a complete view of the architecture is in the early stages of a project. Once the codebase reaches a certain size, it's impossible to understand all of it. So what programmers typically do is start by focusing on small peripheral modules, adding debug logs at points they can understand, tracing the flow, and then modifying what they can.

The problem is that without a full overview or knowledge of the cost of different choices, you can't know if the abstraction you're working with is the right one. But that's how most people start anyway — collecting local evidence without understanding the whole, then finding changeable points. Over time, this naturally leads to technical debt and degradation, creating a need for refactoring. At those points, AI coding doesn't seem to change the workflow much in this bottom-up approach. For someone who can work top-down with a full blueprint, it might be different.

Anyway, reading this article, the question that comes to mind is: if AI handles debugging and code generation, and the system becomes more of a black box, how do we develop the architectural intuition needed to assemble a mental model of the entire system? It took me three years to deliver a working product with my first 40,000 lines of code. During those three years, I went through countless failures and refactorings. Then I wrote another 60,000 lines in just three months. Once the layout is set, at least within the frameworks I've worked with, you start to see where the boundary for what counts as complete lies. But if I'm worried about whether that kind of ability to design a finished layout can be developed through AI, I honestly don't know. On the flip side, if I don't use AI at all, I risk being left behind in the coming AI era. And if I do use AI, my own coding skills may atrophy, and without it, my direct understanding naturally declines. In the end, it comes down to where you strike the balance.

Ultimately, every programmer needs to own their own workflow, their own techniques, and their own mental model. So the end of these debates usually comes down to something like: 'Given your situation, you're right. And given my situation, I'm right.


With my limited knowledge, I read through it stumbling along, and from what I gather, this GA is not Clifford Algebra, and the argument is that the GA movement itself is misguided, and that combining operators and geometric objects without distinguishing between them is problematic.

From a programmer's perspective, it seems like they're saying it's a flawed abstraction, while the GA stance is different. I'd like to hear the other side of the argument too. I'm sure HN will get a long GA comment thread, so from their standpoint, what would it feel like? I agree that merging objects and operators is problematic, but I'm curious what the GA camp would say


Reading this article, I think there are quite a few interesting points to consider further. C started as a DSL for the Unix kernel. JavaScript is also a DSL, and successful languages are often described as DSLs in certain respects. Then, as they grow and gain broader adoption, they evolve into general purpose languages.

But if you think about it the other way around, since all programs are ultimately about data transformation, you could argue that UIs should essentially be drawn in SQL, but that would sound strange. That's because the tools we use have moved away from that mental model. (Though React's FRP premise does lean in that direction.)

And when I think about why languages split apart, it seems to me that it's because the word 'programming' covers so many different things at once. Languages end up diverging because they serve different purposes. In fact, as a programmer, I see programming languages as a collection of tools that essentially decide what to give up. C gives you safety and low-level hardware access through its ABI. Python gives you expressiveness. They exist because their target goals are fundamentally different.

In that sense, though I'm not an expert in this field, from my limited perspective this debate feels like it's just the noise that arises when Algebra tries to encompass too much and inevitably splits apart. I imagine these kinds of cases will only increase in the future. As things become more specialized, there will be more situations where existing frameworks don't fit, and new systems will be needed. Is there a term for this phenomenon? At that point, we might say we need to change the old system to fit the new one.

Personally, I wonder if there isn't a general purpose language at the bottom that models the entire world, with other languages layered on top of it.


> this GA is not Clifford Algebra

What makes you say that?


No, that's not my own argument — it's just how I understood the article's claim. I only know GA as something used for specific purposes. I was just sharing my thoughts on what the article was saying.

GA is Clifford algebra plus a bunch of new terminology plus advocacy that it should replace linear algebra.

Mathematician here.

> As I see it, GA is not so much a subject as an ideological position, consisting of basically two ideological claims about the world:

> Claim 1: That the concepts of EA (so, wedge products, multivectors, duality, contraction) are incredibly powerful and ought to be used everywhere, starting at a much lower level of math pedagogy—basically rewriting classical linear algebra and vector calculus.

I support this claim, so I suppose I’m a proponent of geometric algebra.

I think it’s more or less been carried out for vector calculus by Spivak’s “classical” Calculus on Manifolds, which is somewhat widely taught.

> Claim 2: That the Geometric Product (henceforth: GP) should be added to that list as the most fundamental operation, where by “fundamental” I mean that other operations should be constructed in terms of it, and theorems should be stated using it.

Like the author, I also believe this claim is nonsense.

“Rewriting classical linear algebra” is a honored pastime but it’s very difficult to make any headway doing it—the classical texts are classical for a reason, we more or less know how to teach them as an “80% solution” and it’s unclear that the investment in a new pedagogy would get us to an “81% solution.”

Especially with today’s undergrads. If you’re not churning arithmetic, they’re not into it.


I get why it is interesting and useful to write complex numbers in '+' notation rather than the conventional way to denote a 2d vector, like a tuple of components.

The benefit is that multiplication and distributive property is a beauty in the '+' notation, no special rules need to be memorized for multiplying 2d vectors, i*i = -1 takes care of it.

On the other hand I never understood what the benefit, of writing the tuple of wedge and dot products in '+'notation, is.

Perhaps I am not being fair, that it is the same idea and I have not used it as much as I have used complex numbers.


More or less agreed. I think though that one reason the geometric product is so tempting is that if you take matrix representations of all of these objects, then the geometric product is literally just straightforward matrix multiplication.

Because of that, it just becomes so tempting to try and phrase everything you can in terms of this geometric product. I'm very sympathetic to the temptation, and I even think the geometric product has some great uses (it shows up a lot in some physics I do), and using it makes writing rotations a treat, but I think it's still vastly overemphasized by GA people.

I still don't really know what my favoured notation for differential geometry is, I find myself switching around so much.


> I still don't really know what my favoured notation for differential geometry is, I find myself switching around so much.

Yep, me too. Maybe someday the HoTT folks will get around to formalizing it and standardizing the notation. /j


Interesting. To summarize your argument: the current state of Algebra is like an 80 point solution, but to push it a few points higher requires an enormous cognitive load, and the question is whether that's really worth it, even from an educational perspective. As mentioned in another comment, this is exactly the kind of issue that comes up in Rust discussions. It seems the argument from the GA camp is that top tier mathematicians are already using these tools just fine without needing to talk about it in that way, so there's no reason for it to become general purpose. Thank you for explaining it in a way that's easy to understand. But on the other hand, maybe anomalies like these could actually become generally useful concepts. Thanks for the comment. upvoted!

As someone who studies physics and then went into a long IT career (but kept reading papers casually), my view is that this whole GA saga is very reminiscent of how after decades of experience, I still can't convince juniors of the benefits of what I now consider obvious best practices. No amount of demonstrations of the blindingly obvious improvement of some better technique seems to work on someone who "finally got the thing to work".[1]

Certain kinds of perfect correctness are like pure and shining crystallised bits of refined knowledge created by the greatest wizards. "Parse, don't validate" or "Make invalid states unrepresentable." ought to be familiar to the better programmers here, the ones with decades of experience built on iterative, collaborative foundations with real consequences for error.

Theoretical physics doesn't have those same consequences, because there is no real punishment for their equivalent of "spaghetti code". Perversely, there's cachet to be gained for gaining understanding of its unnecessarily esoteric knowledge, much like how biologists and lawyers spend half a decade or more studying... Latin.[2]

Introducing Geometric Algebra to physics is like that wizard coder who sweeps away reams of spaghetti code and replaces it all with a call to a single standard library function. It's that "cheff's kiss" of cleanup. Meanwhile the juniors are screaming about how the senior "deleted all their hard work!"

Meanwhile, I never understood where Pauli and Dirac matrices came from! It's like they were pulled from fat air.

You've seen this in code, I bet. Some junior worked really hard on solving a problem and wrote a solid screen-filling wall of "a && b || c || !d && e && (f || g)..." continuing up to "ba, bc, bd", etc.. as they ran out single letters until they're well into the alphabet in double-character symbols.[3]

That's what those matrices are. Someone's hacky attempt at "making things work".

The problem is that we gave those people Nobel prizes and told everyone they're geniuses.

They are, but they were like that brilliant junior. Brilliant.. but junior.

Geometric Algebra sweeps all of that into one beautiful, consistent, crystal clear abstraction that is widely applicable. The magic matrix constants vanish. Bugs in 100-year-old textbook formulas suddenly come to light. Dozens of formulas, one set for each of the 1D, 2D, 3D, and 4D cases collapse into a single formula valid for any number of dimensions.

It's like watching someone struggle with "catching every possible instance of JavaScript injection".

No son, no. Just no. Stop enumerating badness. Stop. Just stop. Escape everything at the boundary instead, enforced by the type system. You'll thank me later.

I know it might be obvious to you, and you always use properly parameterised SQL queries or whatever. This is not the norm everywhere! I still get arguments, long drawn out arguments from people convinced that this is unnecessary and just one more search & replace is all they need to be safe from the bad hackers.

Physicists (and mathematicians) are still making that argument against GA.

"It's isomorphic!"

"That isn't the point!"

[1] You can't convince someone to climb Everest if they struggled to hike up to the top of one of its foothills.

[2] Let me be crystal clear: They're spending their precious time on this Earth learning a dead language instead of learning about the law or bugs. No amount of arguments will sway me. The bugs don't care what you call them. Criminals are guilty or innocent whether or not you speak funny in court. You've just made a simple thing harder for no good reason, that is all. Please stop.

[3] Yes, I've seen this. Twice, from two different people whom have never met. Aliens are amongst us.


I find it really fascinating that you use the metaphor to GA of a senior dev sweeping all the cruft away into a single clean abstraction, is that my read/smell of TFA (as a layperson for this depth of math) is that GA runs the exact same risk of leaky abstraction. It's really general and elegant and covers all these cases with a single abstraction, but in doing so it sometimes conflates very similar things (precisely because they are so similar) when they really ought to be separate things. Like a complex number and the rotation operator it performs. My seat-of-pants take is GA is just a bit too DRY.

My understanding is too shallow to get why we don't just go straight for EA/Clifford Algebra when the "lower" systems like cross product are insufficient.

I share the author's intuition that there ought to exist some mathematical object that begets Clifford Algebras and multivectors and GA and all the like that we have yet to discover.

> They're spending their precious time on this Earth learning a dead language instead of learning about the law or bugs

I know this is hyperbole, but it's my opinion Latin/Greek emerged so dominantly in law/bio/medical fields is that it allows at the same time semantic bleaching and composition. "Jargon is a DSL" if you will. Sure, you could say "heart muscle no worky cause insufficient oxygen" but "myocardial infarction" is a) more concise b) comprises reusable composable pieces of meaning (myo + card + -ial, in + farcire + -ion) c) most importantly, is extremely precise. It's like the trouble of using English + LLM to define a program, vs just writing damn code. Sure you can do the former, but it's lossy, and that lossiness causes issues.


> biologists and lawyers spend half a decade or more studying... Latin.[2]

> [2] Let me be crystal clear: They're spending their precious time on this Earth learning a dead language instead of learning about the law or bugs. No amount of arguments will sway me. The bugs don't care what you call them. Criminals are guilty or innocent whether or not you speak funny in court. You've just made a simple thing harder for no good reason, that is all. Please stop.

The absurdity of this claim is enough to call into question everything else in your post.


Hyperbole as literary device, not sworn testimony. Argumentum ad literalismum: dismissed.

I'll just assume all the rest of your claims are hyperbole then.

We run into these kinds of issues quite often. I also majored in physics, but unlike you, I dropped out of my master's program (I just didn't have the talent. Given my generally limited intelligence, it was probably an inevitable outcome). From what I've read, the article seems to be arguing against the claim that because so many anomalies have accumulated in the field of GA, it's now ready to become a general purpose tool. Your argument appears to be that GA has been nicely organized as a standard library, essentially defining invalid states. So it's a high level abstraction perspective, but on the other hand, I think it could also be framed as a case against excessive abstraction. Interesting

(This is a nitpick and does not argue against your main claim that GA is a better abstraction to represent and solve physics problems with, that I have no way to evaluate because I don't speak GA, though now I'm curious and will maybe spend an afternoon trying to figure out)

I mean, come on, lawyers and biologists don't really spend half a decade studying Latin. You can tell because smart people that spend a year or two studying Latin are conversationally fluent in it, and lawyers aren't.

They spend a month or two memorizing some latin words that could have been in English, and then (for biologists, lawyers just stop there) years memorizing lots of names of things that they'd have to memorize no matter what language they were in, and it's not really any slower in Latin than it would be in English once you spent that O(1) effort to get used to it.

Like us (systems) programmers don't spend decades studying the C language, we spend a year or two getting comfortable in C and then the rest of our careers learning all sorts of interesting ideas like generational GC that come phrased in pseudo-C but might as well have been phrased in English pseudocode with a similar cognitive load to grokking them.

That wonderful popcnt() algorithm that uses 0x33333333 and 0x55555555 constants would be just as hard to decipher if it was written in plain English.


To be honest I was struggling to phrase my argument in a cohesive narrative without it turning into a ten page blog post.

The point I’m trying to make is that there are necessarily complexities inherent in all areas of study, and there are incidental complexities because of historical reasons, “culture” within certain fields, or juniors putting out their fields’ equivalent of spaghetti code.

Geometric Algebra sweeps away a lot of the rather messy parts of now century-old physics, but the work of doing that substitution is decidedly non-trivial and thankless, so other than Hestenes, nobody seems to be pushing for it.

It’s like the 2pi versus tau fad on the internet.

Mathematicians argue that they’re “the same”, so it doesn’t matter, and ramble on about their equivalent of “learn the Latin to be smart like me”.

No. It’s stupid. It was an error. Tau is the correct circle constant and eliminates magic constants that don’t belong from literally hundreds of famous formulas!

I and many others simply failed to understand radians until I learnt to treat 2pi as a single ligature instead of “two of something”.


I tried to make it clear that I wasn't arguing against your main point, that was made very clearly, just against a comparison you used that I think was a bit slanderous (tongue in cheek). Yes, obviously Tau is correct, and that's a better comparison to use.

Having dived deeper into the essay, author claims that some of the new notation is obviously better (clifford algebras) and the rest is overzealous unification that obscures rather than clarifies because it mixes types in a weird way (geometric product).

I've never heard of any of this before, but author's second point looks rather convincing. Can you give counterexamples, ideas that are much clearer to think about once represented using GP? I'd love to dive a bit deeper.


I'm a bit pressed for time, but one annoyance I've had with the classic "greek" physics notation is that they represent things from "both ends" of a graded vector space. So for example, they start with a scalar, then a vector, then ... pseudoscalar-1, and finally the pseudoscalar.

It's a shortcut useful only if you need to scribble on paper and your wrists hurt from writing too much, but it obscures the underlying physics.

The programming equivalent is putting abbreviations in identifiers where, sure, it's fewer characters, but then the reader needs to a track a mental lookup table to translate back to the intended meaning.

Pushing things like this too far results in meaningful aspects of the equations getting squeezed out entirely. For example, the generality of GA means that you have to (correctly) track negative signs and multiplications by pseudoscalars such that your formulas work in all dimensions. In traditional vector algebra it's all too tempting to eliminate certain products because in "your chosen dimension" they multiply to 1 or -1 or whatever and just... disappear due to traditional algebraic simplification conventions. But then if you need to work in 4D SR or curved spaces, you can't, because you threw away something essential while "optimising for characters on a page".

You have then "start over", typically reaching for a partial and incomplete subset of GA, reinventing that wheel over and over.

Hence the push for unification onto GA, to break this cycle.


As a programmer I’m wondering how you get a decent graphics library out of it. If it’s conceptually better, shouldn’t it make writing code to do calculations easier?

It can write some fascinating stuff, but you have to learn to think in it:

https://enkimute.github.io/ganja.js/examples/coffeeshop.html

A major problem is that its a very general theory. Most calculations turn into very large but very sparse matrix multiplications. To make them work fast requires code generation and an optimization pass.

These types of optimization problems show up all over graphics programming though:

* Representing rotations with matrices takes more space than quaternions.

* Sacrificing a dimension to projective geometry actually makes representing things like projections (duh) but also translations more efficient.


> shouldn’t it make writing code to do calculations easier?

You need an optimizing compiler that would take the high level description (in GA) and compile it to add subtract multiply divide of reals (the assembly language). I don't think we have that yet.

Till we have such a compiler it will be tempting to drop down to assembly. Assembly being a metaphor.


I gave this a go a couple of years ago. GA multivectors are a direct substitute for both vectors and matrix transformations. The challenge is efficiency: a unified type is too expensive for real time games. The typical approach is to create efficient subsets symbolically and bake those into the code so that the compiler has something it can work with. This works, but the "strong typing" of the mathematics and typical programming languages doesn't exactly mesh, so a clean typesystem/interface design is annoyingly difficult.

The main advantage is the elimination of gimbal lock which allows smooth interpolations of arbitrary rotations and translations. This dramatically simplifies certain codes relating to animation and robotics. In mathematics, it simplifies differentiation and integration over curved surfaces in 3D and higher dimensions.

Most developers working in those fields already use one of the many creatively named “impostors” of GA subsets in isolation, such as the quarternions.


I made my homepage (www.makonea.com) support IPv6 too, but the number of people actually using it is much smaller than I expected. Is IPv6 really that widely used? I'm supporting both because I heard it's good to support both, but I'm not sure what the actual benefit is. Sometimes, when behind Cloudflare, I think even if someone connects via IPv6, it ends up coming through as IPv4

It's good to support it to resolve the chicken egg problem. If no service supports it, there is no sense in deploying it to the customers and the other way around.

Also you made the life better of people who have DS lite. They only get a public IPv6 and all their IPv4 traffic goes through a CGNAT.


For people like me: DS Lite stands for "IPv6 dual-stack lite". My mind went directly to Nintendo and I was confused.

Unfortunately, individual actions would never be enough to solve the IPv6 chicken and egg problem. See djb's "IPv6 mess" article:

https://cr.yp.to/djbdns/ipv6mess.html

Yes, it is old, many examples are outdated, but the main points still hold. Decades later his suggestions for making IPv6 succeed are still not implemented.


It's not a lot but it's better to be part of the solution than the problem even if it is an insignificant contribution.

Which is which?

This stuff is obvious now, but I think back then this was probably quite clever.

For client server web browsing what's the downside of CGNAT? I'd understand if we were talking about self hosting a service from home but for typical consumer usage?

1. Peer-to-peer networking won't usually work correctly. And quite a bit of software uses P2P networking these days---BitTorrent, Zoom/Teams (via WebRTC), Tailscale, PlayStation/Xbox multiplayer, etc. Most of these services have automatic fallbacks when P2P networking doesn't work, but these fallbacks are usually slower and less reliable.

2. Most websites assume that 1 IPv4 address==1 household, so you'll often run into rate limits. Or even worse, you might be blocked entirely if your CGNAT neighbours are spammers or otherwise breaking website rules.


While true, neither of those are relevant in context (and I even explicitly acknowledged your first bullet in my comment above). It was suggested that a website operator deploying IPv6 would somehow improve the end user experience by virtue of avoiding CGNAT and I was questioning that. I do of course appreciate that going via CGNAT to a clueless operator that eagerly adds IPv4 bans can be problematic but that's more a question of why you as a consumer might want IPv6 connectivity not why a service provider would want to deploy it.

> While true, neither of those are relevant in context (and I even explicitly acknowledged your first bullet in my comment above).

Yeah, I just mentioned that because P2P networking is used a lot more than most people think these days, since even things like Zoom that look like typical client–server web browsing actually use P2P networking internally.

> It was suggested that a website operator deploying IPv6 would somehow improve the end user experience by virtue of avoiding CGNAT and I was questioning that.

Reliability and latency will be marginally better with IPv6 than with CGNAT, but this is so minor that I doubt that most people will notice this. And many CGNATs will RST connections that last too long, but most protocols have some sort of automatic retry/reconnect built in, so this shouldn't cause issues very often either.

IPv6 addresses are quite a bit cheaper than IPv4 addresses in most clouds, but since most servers still need to support IPv4, this doesn't help you directly. Supporting IPv6 means that others using the cheaper IPv6-only cloud services will be able to connect to your server, but this doesn't matter for consumer-only services.

So yeah, you're probably right that enabling IPv6 server-side won't have (m)any benefits.

> I do of course appreciate that going via CGNAT to a clueless operator that eagerly adds IPv4 bans can be problematic but that's more a question of why you as a consumer might want IPv6 connectivity not why a service provider would want to deploy it.

Being able to ban IP addresses without worrying about collateral damage is a pretty big benefit to the service provider though, for certain applications at least.


If you're using a cloud you'll probably find it useful to have ipv6 on every server and ipv4 only on the front end gateway

> It was suggested that a website operator deploying IPv6 would somehow improve the end user experience by virtue of avoiding CGNAT and I was questioning that.

Non-legacy, newly formed ISPs have to spend a lot of money on either buying or leasing IPv4 address space, and even then if they grow they probably won't be able to keep up, and so have to deploy 100.64.0.0/10 to the WAN interface of CPEs and then buy a bunch of CG-NAT hardware.

The problems are on not entirely visible at the end-user side of things because of the Herculean efforts by ISPs.

IPv4-only services are thus externalizing the costs of connectivity to ISPs (especially newly formed ones).


> externalizing the costs of connectivity to ISPs

Isn't that literally their raison d'être? Point taken that in aggregate it increases the costs of network operators but still that's got nothing to do with an individual instance of an individual user visiting an individual website.


1) my stateful firewall is going to break most of that anyway

2) if cg nat is as popular as people claim then they won’t be doing that as it’s not an edge case


P2P protocols don't have much problem opening up a stateful firewall connection as you just have to send one packet out to open a known address and port.

I prefer to run scrapers behind CGNAT because websites can't ban it without causing collateral damage, which matters more to some than to others. The website probably has to put up a captcha. Which hurts its human traffic. Think about how much more traffic you could have if you didn't show everyone a captcha, and you might see that you should also be in favour of IPv6.


> 1) my stateful firewall is going to break most of that anyway

Your CPE is probably running UPnP IGD and/or PCP for hole punching of P2P services, and IGD/PCP can hole punch just as easily for IPv6.

> 2) if cg nat is as popular as people claim then they won’t be doing that as it’s not an edge case

It's not whether CG-NAT is an edge case or not, it's whether there are things that are completely impossible with it or not. Want to play with your friends on your Xbox/PS? Too bad, CG-NAT makes it completely impossible.

Why should we be happy with a technology that makes certain use cases impossible? On what planet is that a good thing?


> 1) my stateful firewall is going to break most of that anyway

Stateful firewalls and even regular NAT aren't much of an issue for P2P, but CGNAT is much more problematic [0].

> 2) if cg nat is as popular as people claim then they won’t be doing that as it’s not an edge case

You'd hope, but people tend to be pretty slow to update their networking assumptions, so this is still pretty common. And it doesn't help that most CGNAT users tend to be either from poorer, since poorer countries and mobile data providers are far more likely to use CGNAT than legacy North American ISPs.

[0]: https://tailscale.com/blog/how-nat-traversal-works


> people tend to be pretty slow to update their networking assumptions, so this is still pretty common.

My ISP doesn't do CGNAT in FTTH deployments, but I'm paying extra for a static IPv4 allocation anyway since I was increasingly getting hit with captchas every time my IPv4 rotated to flagged IPs that were trashed by my fellow subscribers with poor infosec practices - i.e. 99.9% of residential subscribers.

Once I got a static allocation, captchas are getting easy to pass.


> Is IPv6 really that widely used?

Mobile carriers use it almost exclusively, which is already a huge chunk of the internet, and newer ISPs are switching to it too.

> I'm supporting both because I heard it's good to support both, but I'm not sure what the actual benefit is.

The benefit is that you allow IPv4-only and IPv6-only clients to connect.


I accidentally became the user of an IPv6-only device a while back for some obscure reason I never could figure out. Let me tell you: There are no IPv6-only users. Absolutely nothing except Google, Facebook, and YouTube works. Any website not in the top 20 are IPv4-only. It was so bad I briefly thought I didn't have an internet connection at all. Anyone stuck on an IPv6-only connection would immediately cancel their contract on the grounds that they don't have de-facto internet access.

I've heard plenty of accounts from people (and these were techy people even, not just the ones who only go to Facebook and think that's the Internet) who lost v4 and didn't even realize for days, so I'm not sure how true that is... but more to the point, when we say an ISP is v6-only it usually implies some form of backwards compatibility method for reaching v4 hosts over the v6-only service.

Commonly that's NAT64, which maps v4 into the v6 address space. The resulting service is v6-only (you only get a v6 address and have to talk v6 to the ISP) but you can reach v4 servers by talking to the v6 addresses to which they've been mapped.


So, like, the three most popular things still worked. I wonder if working more is related to their popularity.

I think it's more that Google and Meta have the surplus engineering resources to implement IPv6 for what is essentially no reason.

Probably for lower latency and higher reliability on mobile networks.

You can do IPv6 only if you have a 64 nat on your edge and use dns64 and just use a limited set of applications and devices.

Some applications will still fail to work though unless you also have 46 nat on your device which still doesn’t work transparently on majority of types of device.

You also need all devices on your lan to support v6 natively, and v6 only. From your printer to your speaker.

You might be able to do something with mdns and nat64 to get them working on an IPv4 only subnet. But you’re talking layers and layers of complexity for things which just have to work.

I’m posting this from my phone on my IPv6 only subnet, not sure if it’s using a 64 gateway or 6 native to HN, but it’s possible.


All the more reason to support it. There are lots of ISPs that only assign you an IPv6, and do hacky trickery to make IPv4 work over that. We wouldn’t need all of this.

When hosting a server IPv6 doesn't make a huge difference beyond your logs will probably be a bit more accurate, people behind CGNAT where an ISP has multiple customers sharing a block of IPv4 will show up with their actual IPv6 address. They'll maybe also find it slightly quicker because they're not being funnelled through NAT gateways but realistically not enough to notice.

From the user side IPv6 is great for me. My ISP is using CGNAT and would bill me ten pounds a month for a static IPv4 address but I automatically get a vast block of IPv6. I'm using that block to allow me to VPN back home when out and about, and if I wanted to I could also host services from devices on my home network without needing any NAT nonsense, I can just open access to the relevant device on the router. (Because this is a world where not everywhere supports IPv6 yet if I'm on an IPv4 only network the VPN endpoint is a dedicated server I rent which forwards the relevant port back to my home router over IPv6)


So your isp is rinsing you for the cost of a an IPv4 address. £10 a month will pay for a whole /24 in 3 years.

Chances are they also skimping on other areas including over subscription. Choose a better isp if you want a better service.

Your “just open traffic to internal host 1 on your firewall is the same no matter if it has nat or not, unless you are using a non stateful firewall? Or perhaps your configuration layer splits the two for reasons.


Thank you for the advice. By any chance, have you worked with Ruby before? I remember seeing your username back when Ruby was popular and I first started learning it in university

Heh, there’s a blast from the past. I was doing Ruby professionally from 2005 to 2024 or so, I’m primarily using Python now because that’s what the business I’m working for was built on but I’ll always have a soft spot for Ruby.

I got help with an assignment from you before. You were probably just responding, lol. I was grateful back then.

Likely caused by better performance provided by IPv4.

Browsers try both stacks (Happy Eyeballs algorithm) so likely the IPv4 is working better for your visitors.

Since must people use IPv4 most of the time, IPv6 performance issues go unnoticed by the users, ISPs, CDNs, etc.


A lot of internet spambots and vulnerability scanners are v4 only. I discovered this when I found an open mail relay on v6, contacted the owner and he said it's been like that for ages due to a config mistake and he'd never heard a complaint. It wasn't an open relay on v4.

I recently enabled ipv6 on an unadvertised server i use just with people i know... it's on my home connection actually.

The great news is those vulnerability scans from random IPs are coming just on ipv4, there hasn't been any yet on ipv6 :)


My selfhosted email has been dual stack for close to a year and my eyeball estimate of the logs is around 10% of the traffic is IPv6.

Coding with AI eventually comes down to two paths, I've realized. One is using AI exclusively for everything. The other is not using it at all. There is almost no middle ground. The reason is that as the complexity and depth of the problem increase, the code AI generates increasingly follows enterprise level patterns. The deeper the meaning of what I input, the more AI tends to produce code that goes beyond my own area of expertise. For example, a human expert's code is very powerful and deep within their own domain, but when you look at the entire codebase, it's often shallow and uneven outside that domain. But the moment you write code with AI, once you go deep in one part, AI tries to standardize the rest accordingly. This means the entire codebase converges toward enterprise level standard code, which essentially reflects the average patterns of senior programmers who built large scale systems.

The problem is this. Human cognitive resources are finite, so we inevitably become shallow outside our own expertise. There is no programmer who can do everything well. And as systems grow in scale, they become more modularized and fragmented, making it impossible to understand the whole system. So what should we do about this? That's always the question.

In the end, do I choose not to use AI, finish the project with uneven code outside my domain, and deliver it? Or do I use AI and deliver a program that is uniform and consistent, but not in my own style? I still don't know. I haven't found the answer yet.


The middle ground is to use it as a power tool: give me an example of this, fix my types, do this fussy bit, find this in the docs, without ever letting go of control.

When using power tools you make all the measurements and decisions, you just hammer screw drill and cut faster. You cannot power tool your way to building a things that you don’t know how to build.

The other interesting thing about this is it works with smaller models and uses a fraction of the compute.


You can also just use AI and keep the scale of your changes small rather than refactoring the whole app with a change? This isn't super-weird.

"In the discrete world of computing, there is no meaningful metric in which "small" changes and "small" effects go hand in hand, and there never will be." - E.W.Dijkstra (EWD1036)

I believe grandparent meant "small enough changes that you can understand what the effects are likely to be"

Then it's probably small enough - where you don't need a help of AI, and should do it yourself.

My position is that AI could be useful to find the potential places for these changes, but it should be someone who's capable of thinking to implement them.


That might be true for you. For me, I can stay in flow state so long as I'm progressing, even if progressing doesn't involve writing every line by hand. Whereas I easily fall out of flow state as soon as I am frustrated by an inability to remember some particular bit of syntax, or a particular bit of architecture, or a particular code pattern.

For me, AI has been a godsend for productivity because it's great at what I'm bad at. I'm not spending 99% of my day grinding away at C++ code; I'm never writing enough for it to become a world class language expert. I'm jumping between SQL queries, CSS, Java, bezier curves, Python, and shell. If I need to write something in a language I touch infrequently (e.g. Go or Ruby) it's nice to have individual blocks of code generated for me, so that I'm not slowed down by my ignorance on a language's iterator syntax, or whatever.


As you know, the boundary ultimately depends on code quality. The problem is that AI generates code that looks high quality even outside my area of expertise, at least from my perspective. So now the boundary has to be redrawn. Refactoring usually ends up redefining those boundaries. At that point, the question becomes: do I rewrite my own code, or do I reject the AI code? Those are the two choices left.

In the end, an exceptionally skilled programmer might be able to keep their core domain intact, but I think the vast majority would find that very difficult. So it might be possible once you cross a certain threshold, but considering the sheer amount of code required to deliver a single modern program, it's hard to know which parts to focus on. However, my perspective might be different because I'm coming from the point of view of delivering a working program, not from the perspective of open source development


I'm part of the middle ground. Not able to do full agent code, but I'm fine using it to generate snippets that i fully read. I find it great to use apis with little documentation. For me AI is similar to a google search when im not able to find meaningful doc or i want the code snipped and refine over it

I feel like my current approach is a decent middle ground.

In the past, I wrote code by first writing English pseudo-code as a series of self-documenting comments. These would be declarative assertions of what the code will do. (For example, "Method returns true if array values are within 0.5% of spherical.") I then wrote the real code next to each comment.

My current workflow is mostly the same as before, but as soon as I think there's nothing creative left to do, I allow AI to take a pass at it, insisting it include verbose comments. Next I read everything; its comments are often redundant but allow me to internalise the logic/intent more quickly. I make any corrections myself. And I strip any pointless AI comments.

In short, I stay in full control of the architecture while tasking AI with the grunt work, the implementation details, and the superficial correctness.


> There is almost no middle ground.

I use it rarely. I did have it rewrite some code, mainly from one language to another. That works really well. I also had it rewrite a database interface, which also seems to work (no time to test it thoroughly, yet, so it's not in production). But I'll be damned if I let it write new features. I've debugged other people's code, and it ain't fun. Debugging 10kLOC AI code sounds like hell to me.


Own the design and let AI write the code. Spend the extra free time on becoming a better/broader architect.

How can you own the design if you don't know what your design actually does?

You can't, so you do read the code.

This idea is being pushed to increase sunk costs IMO. We are told to spend huge amount of time writing specs, behaviour tests, AGENTS.md and prompts.

Pinky promise that's enough to get good output.

Pinky promise we won't invent yet another body of work the whole industry must adopt to get good output.

Pinky promise the AI tool will properly read all your work

And then of course we are told you must never trust its output !? You must review all code it produces line by line and grok it fully !

And now we have: keep challenging it, keep rejecting it, keep interrogating it... That's just fancy words for spend more money (tokens)


Wow hang on, I'm suggesting to use AI as a code writing aid, not to increase scope until owning the design becomes unreasonable.

It's been years at this point though; everyone knows where "use AI as a code writing aid" ends up.

I think the differentiator is whether someone cares about what they build or not. Someone who doesn't care wouldn't produce masterpieces without AI, and using AI isn't going to prevent someone who does care from building something nice.

But everyone claims they care; everyone using AI is telling you that they're not like the slop merchants, that they're really building masterpieces/the next unicorn. Just like everyone using AI to write says they're just using it as a fancier spellcheck.

It doesn't seem like AI users are very good at telling how much or how well they're using it.


I'd rather blowtorch my nipples off than yell at a computer all day

Sometimes I'm not even sure what I truly 'understand.' When even senior engineers working on products used by hundreds of millions of people, like Zoom, have had these kinds of issues, it makes me wonder. So I usually just write code the way it was left by my seniors, out of inertia. But I realize that the area I work in is actually incredibly abstracted.

Seeing this reminds me of a project I delivered in the past. A tram installation was being planned in my city, and a researcher conducting a feasibility study asked me to build a crawler that would submit data for their research materials. As part of the process, they explained the study to me, and I got the sense that a tram and a delivery robot are essentially the same thing in this context.

When I was organizing the results, the personal conclusion I reached was that this kind of design is ultimately about redistributing existing public space. And in that process, the first people to be pushed to the margins are, by and large, the transportation disadvantaged. This delivery robot is consuming the same public resource, public space, and the same dynamic plays out: the weakest end up being pushed out first. I think it's a similar issue.


The Japanese team in Tecmo World Cup 98 was really good. The goalkeeper's skills were excellent

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: