HNHacker News
TopNewBestAskShowJobs

fasterthanlime

1,419 karma · joined August 8, 2014

say hi, be kind
submissionscomments
fasterthanlime··on I won free load testing
/r/rust is a great place for that, I also occasionally click through most of the https://lib.rs/ categories, just to see what the names I don't recognize are about.

My twitter timeline also has tons of neat little crates pop up every month, and I have to thank my colleagues at Netlify (back when they were doing Rust) and now at fly, for showing me some of those I showcase in the article.

fasterthanlime··on I won free load testing
Please don't downrank that one, too. I'm genuinely sorry about the week y'all have had, but this comment thread is the /only/ one asking about "the controversy" (which is dead and gone - everyone has decided whether I had a point or was being a jerk), please just nuke comments asking about it rather than preventing discussions about the cost of cloud hosting, how attacks work, how to mitigate them, etc.

I certainly didn't DDoS myself just to "game the system". It happened, I learned a bunch of things, did an extensive post-mortem, a lot of folks are finding it interesting, that's it - no smart trolling here, just content. I certainly could use a break from "the discourse" as well.

fasterthanlime··on I won free load testing
I'm begging the comment section here to not touch on this topic today — I'm really not trying to cause a third flamewar, and intentionally didn't mention the name of news aggregators or direct links to the articles themselves in that piece.

I was hoping for the discussion here to be around similar experiences, how DDoS really has become a commodity, how other folks's websites is architected, how various platforms fare against these threats (and what it costs), whether folks were are of Cloudflare's default caching policies, or its DDoS protection.

Anything BUT rehashing the discussions of the past few days: everybody is over that. If you do want to discuss those, you can move that conversation to my subreddit, or my twitter, or heck, send me an e-mail.

(Also, and I've stated this elsewhere many times: the Go community doesn't have to answer for that. This is one individual having well-timed fun, let's please PLEASE leave it at that)

fasterthanlime··on I won free load testing
For anyone reading this: Alex knows about the attack and has my permission to talk about it publicly.
fasterthanlime··on I won free load testing
Grew up in a very religious, very "literal interpretation of the texts" home. They had everyone hit the books and even write reports. I guess the habit stuck with me after I left the fold.
fasterthanlime··on I won free load testing
Mirror in case the attack successfully picks up again: https://web.archive.org/web/20220502013024/https://fastertha...

As a treat, this is a testament to a logic error I made in the caching code (inserted uncachable versions of pages into the cache for a little while). Enjoy!

fasterthanlime··on A Rust match made in hell
This is good advice! All this stuff is very close to my day job, I just never bothered doing it for my personal website because it withstood the front page several times over the past two years.

I've done most of what you mentioned (minus load shedding & connection metrics) and have posted about on Twitter, if you want to check out the thread again!

fasterthanlime··on A Rust match made in hell
It's a kid having fun. A kid with a couple botnets, but a kid nonetheless. Definitely not representative of the "Go team" or the "Go community".

If I had to guess, they don't care about Go, they just thought I'd be a fun target (with me generally being a tryhard and everything).

fasterthanlime··on A Rust match made in hell
Some fun numbers: 25M requests to fasterthanli.me (just the frontpage, the most expensive page to do queries / render templates for), not cached by CloudFlare (they don't cache HTML unless you set up a rule specifically for it), and a ~7Gb/s peak to tube.fasterthanli.me (hitting a single video asset)

Like any other DDoS, the goals are 1) take the site down temporarily, 2) cost me some money, 3) try to get whichever provider I'm using to boot me off their network.

They've achieved 1) for a few hours off today, the rest has been fairly entertaining honestly.

fasterthanlime··on A Rust match made in hell
I'm gonna soften that intro. I was definitely riled up when I wrote that and I can express the same sentiment better now - as soon as I'm done tending to the DDoS attacks (sorry, unsollicited load testing) I'm receiving today.

edit: Done removing some salt from the intro, DDoS still flaring up now and then, I'll be busy hardening some more.

fasterthanlime··on Lies we tell ourselves to keep using Golang
There's nothing I can say about "this is not actually the same article" and "the two comment sections do not say the same thing at all" that hasn't already been said by many other HN users in response to this moderation thread, so, I'll leave it there, still disappointed.
fasterthanlime··on Lies we tell ourselves to keep using Golang
> We've taken the [flagged] stigma off the title above, so as not to rub salt in any wounds.

Sending it to page 2 when it's only 3 hours old and has more upvotes than almost everything on page 1 /and/ removing the [flagged] marker feels weirder to me than not doing anything, but eh.

fasterthanlime··on Lies we tell ourselves to keep using Golang
Here's a Rust example, with tokio: https://play.rust-lang.org/?version=stable&mode=debug&editio... - I don't have time to come up with Java/C++ examples, but I'm sure others will.

(If your point was about it being _built into the language_, then it definitely stands, see the other discussion in the parent comment thread)

fasterthanlime··on Lies we tell ourselves to keep using Golang
Defaults matter because friction matters, but friction there is largely removed by having a decent package manager, so I personally don't think it matters (though the topic of "what batteries should be included" has far from run its course).
fasterthanlime··on Lies we tell ourselves to keep using Golang
That's not the only/main reason to want a newtype though - it's also about restricting what the value can be, see something like NonZeroU64: https://doc.rust-lang.org/stable/std/num/struct.NonZeroU64.h...

numeric literals (mentioned by paskozdilar in a parent comment) being untyped is another footgun I hadn't even thought of including - it makes it impossible to achieve in TypeScript/Java-level enums.

fasterthanlime··on Lies we tell ourselves to keep using Golang
> there's a difference between theorical ways to make bugs and bugs that happen in reality

On a large enough (time)scale, no there isn't.

But also, all this is rooted in years of running and/or watching someone run Go in production. These bugs aren't theoretical, they cause incidents and outages, and occasionally wake me up. I don't like being woken up.

fasterthanlime··on Lies we tell ourselves to keep using Golang
Reminder that I'm not part of /any/ Rust teams, not part of the Rust foundation, etc. etc. My site is my space, and it is specifically designed to let me post my point of view without having to bear ( ) the responsibility of speaking for entire communities at once.

It's important for individuals to be able to do that, and it's on everyone else to make the distinction.

fasterthanlime··on Lies we tell ourselves to keep using Golang
I really don't know enough about Python to discuss it, so I usually don't. There have been some semi-recent developments re typechecking Python (see https://dropbox.tech/application/our-journey-to-type-checkin...) that have made me interested in trying out for real.
fasterthanlime··on Lies we tell ourselves to keep using Golang
My site has its own search engine (just sqlite full-text search, nothing fancy) and searching for "go" is entirely unhelpful. So yes, external and internal SEO.
fasterthanlime··on Lies we tell ourselves to keep using Golang
It is a very minor point and could easily be removed from the article, but I had that realization while writing those samples and it stuck with me.

I really think that if we follow the "zero values by default" philosophy, it wouldn't be shocking for Go to accept omitting function arguments and just zero them.

The fact that it doesn't, and insists on you passing the right number of arguments, makes the point that you can't in fact, just afford to zero out everything that isn't explicitly specified.

fasterthanlime··on Lies we tell ourselves to keep using Golang
> As far as I know, no other popular language allows you to read from multiple queues at the same time

Off the top of my head, that's certainly possible in Rust, C++ and Java - probably many others I just don't know about.

That particular bit of concurrency goodness comes from the 70s, so you can be sure other languages picked it up.

fasterthanlime··on Lies we tell ourselves to keep using Golang
I moved some words around to make the nit less confused - thanks for the feedback!
fasterthanlime··on I want off Mr. Golang’s Wild Ride (2020)
If your idea of a "grown up engineer" is one who fails to notice systemic problems and diligently, repeatedly hits themselves in the head with a rake because that's the way it's always been done, we have very different ideas.
fasterthanlime··on I want off Mr. Golang’s Wild Ride (2020)
What an extremely convenient template to dismiss any nuanced argument against "worse is better". You even get to question my credentials a couple times! (I apparently pick metrics that are convenient to my argument, and fundamentally misunderstand programming language design).

Even if I accept the premise that "I'm challenging Go on things it doesn't promise to deliver" (which is disingenuous to begin with — correctness underpins /everything/, it's not a hobby), I can't help but notice you carefully use the word "attempt" when referring to the promises Go /does/ make.

One of the things I'm saying is that Go does not deliver on those. It does not deliver on "speed of coding", precisely because everyone, even seasoned Go developers, keep hitting its many design pitfalls.

It does not lower mental overhead, because it prevents you from building abstractions, and pushes complexity out of the language and into your head.

There's a lot to be said about safety and performance, which gets bleaker real quick once CGo enters the picture (hence why the Go team likes to remind folks that CGo is not Go).

But say we disagree there and you truly find it a breeze to write large amounts of Go code: as soon as you deploy something to production and others start to rely on it: you don't get to choose not to care about "correctness". If you don't, you're just pushing the problem onto someone else.

You may be pushing the problem onto ops people, other devs, or your customers, but it does land on someone. And nowadays that someone is often me: my frustration is fueled by years of real world use, I do not, like you seem to imply, enjoy thinking about these things in the abstract, just for the fun of it.

Of course, you can choose to ignore that too, and that's fine! But let's please drop the pretense that this kind of response is anything other than "I refuse to think about this".

fasterthanlime··on I want off Mr. Golang’s Wild Ride (2020)
Author here: I wrote this in 2020, have changed jobs twice since. Both jobs involved Go in some capacity, where it's supposed to shine (web services). It has not been a pleasant experience either - I've lost count of the amount of incidents directly caused by poor error handling, or Go default values.

If folks walk away with only one new thought from this, please let it be that: defaults matter. Go lets you whip something up quickly, but making the result "production-ready" is left as an exercise to the writer. Big companies that have adopted it have developed tons of tooling around it, use all available linters, do code generation, check the disassembly, and regularly pay the engineering cost of just using Go at all.

That's not how most Go code is written though. I'm interested not in what the language lets you do, but what is typical for a language - what is idiomatic, what "everyone ends up doing", because it is encouraged.

Because that's the kind of code I inevitably end up being on-call for, and I'm tired of being woken up because of the same classes of preventable errors, all the time. It doesn't matter that I don't personally write Go anymore: it's unescapable. If it's not internal Go code, it's in a SAAS we pay for: and no matter who writes it, it fails in all the same predictable ways.

Generics will not solve this. It is /neat/ that they found a way to sneak them into the language, but it's not gonna change years of poor design decisions, and it's definitely not gonna change the enormous amount of existing Go code out there, especially as the discourse around them not being the usability+performance win everyone thought they would be keeps unfolding.

As I've mentioned recently on Twitter, what makes everything worse is that you cannot replace Go piecemeal once it has taken hold in a codebase: its FFI story is painful, the only good boundary with Go is a network boundary, and there's often a latency concern there.

Lastly: pointing out that I have been teaching Rust is a lazy and dismissive response to this. For me personally, I have found it to be the least awful option in a bunch of cases. I am yearning for even better languages, ones that tackle the same kind of issues but do it even better. I like to remind everyone that we're not out there cheering for sports team, just discussing our tools.

If you're looking to reduce the whole discourse to "X vs Y", let it be "serde vs crossing your fingers and hoping user input is well-formed". It is one of the better reductions of the problem: it really is "specifying behavior that should be allowed (and rejecting everything else)" vs "manually checking that everything is fine in a thousand tiny steps", which inevitably results in missed combinations because the human brain is not designed to hold graphs that big.

fasterthanlime··on I want off Mr. Golang’s Wild Ride (2020)
Here it is: https://twitter.com/fasterthanlime/status/151945555551713690... (source: am fasterthanlime).

No idea what HN's policy is on posting links to Twitter, but since you asked. Also if the consensus here is that that 2020 rant is "unfair and toxic", that twitter thread is not going to go over well either!

fasterthanlime··on Request Coalescing in Async Rust
That's a very good question — I feel like the article is set up in a way that you could easily take the TCP-based, hand-written server and try to match Axum/hyper's performance — implement keep-alive, be smarter about buffering, etc, and see what makes an actual difference.

Of course if you reach a point where the only thing left to do is implement http/2, that... is no longer an evening project

fasterthanlime··on Request Coalescing in Async Rust
This gets requested often, it's still on my TODO list. I've touched the markdown pipeline code recently (to fix alt text support) so it doesn't feel as scary anymore, but I've got a lot of balls in the air so no ETA!
fasterthanlime··on Request Coalescing in Async Rust
Both my current and previous day jobs involve building an edge network, which involves doing TLS termination: that means dealing with a lot of crap that comes your way - much more traffic than is valid/legitimate traffic, because on the public internet, anything goes. So I may be biased here.

The situation for a purely backend service (behind an existing reverse proxy) might very well be different — but as others have mentioned, the Rust http ecosystem has solidified around async, so even if you could get away with 1 connection = 1 thread, you might not want to, just because of where the ecosystem is.

One thing I didn't mention is that epoll isn't even state of the art: there's a lot of work going on around io-uring and thread-per-core runtimes nowadays, which I'm following rather closely because again, at my day job it does matter!

fasterthanlime··on Some mistakes Rust doesn't catch
As others have noted, that's just how I write articles. More specifically, I have an end goal in mind, and to get there I need to establish a scene: make sure that we share a lot of context so that we can consider a problem together from the same angle.

Most articles don't do that, and so they're "short and to the point", but only to a tiny audience that already has the same shared culture. There's always readers complaining that they knew half of it and so I "wasted their time", but they forget about the other half, and also other readers.

Ideally, to please everyone, I would have to write a tailored article /just for them/, filling just the gaps they have. I do that on occasion, but I charge a lot of money for it :)

← PreviousPage 3 of 6Next →