Live data from Hacker News

The Rise of Worse Is Better (1991)

dreamsongs.com

331–340 of 351 posts

Re: The Rise of Worse Is Better (1991)

#331
post #303

Earlier quoted context omitted.

I would say the analogy fails because it's not about discomfort or weirdness (or taste); left-handed scissors just don't work if you try to use them right-handed. But right-handed scissors don't work if you try to use them left-handed either. So it's not about taste or preference, left handed people learn how to use right-handed scissors, but they can also use left handed scissors in a way that a right-handed person…

As a lefty who has used right-handed scissors in many situations all my life, it isn't that simple. I can cut with right-handed scissors. It requires changing the way I use them in a way that is a bit weird and unnatural, but it works. It's very much about what is comfortable for people.

100% agree that to make them work in the wrong hand you need to use them in a way that feels weird but the original comment was:

> a righthanded person picks up the lefthanded scissors and deems them weird and uncomfortable. Which they are .. for the right hand of a right-handed person.

What I disagree with is the idea that you can know, just by picking up a pair of scissors if they are left or right-handed. Except for ergonomically shaped ones!, you can't immediately tell. It's only obvious that something is wrong when you try to use them, and even then, I don't think many people would know why.

Re: The Rise of Worse Is Better (1991)

#332

I have a theory that the worse is better approach begets an environment where the worse is better approach is better. At least hypothetically, I think there's an approach which is not "the right thing" or "worse is better" but rather more like "the right foundations". Most interface complexity in my experience seems to be inherited from underlying interface complexity, and it takes a lot of work to fix that underlyin…

That worse-is-better is self-reinforcing and that it's the only stable strategy in an environment with less-than-perfect cooperation (i.e. it's the only Nash equilibrium) may both be true at the same time. In fact, if the latter is true then the former is alsmost certainly true.

The real question is, then, whether doing "the right thing" is a stable and winning strategy at all, i.e. viable and affordable. As you yourself suspect, the answer may well be no. Not only because it takes a few tries to figure out the right foundations, but also because what foundation is right is likely to change over time as conditions change (e.g. hardware architecture changes, programming practices -- such as the use of AI assistants -- change etc.).

Re: The Rise of Worse Is Better (1991)

#333
post #320
post #311

Earlier quoted context omitted.

It made it into the Linux kernel, and it's still a relatively young language. I don't think any language has made such a large impact since Java or Javascript, both of which are nearly 30 years old now.

Go?? Ruby and Python I think count, Ruby is a JS contemporary and Python is close enough, no one paid it any attention before the late 90s. Rust is still struggling in the domain it wants to live (a C++ replacement), I still have a suspicion that a new new C++ will ultimately come along and dominate before Rust eats the big money where C++ still lives. And I say this as someone who has been rooting for Rust since stu…

Go is an incremental improvement over Java and C#. I like it, but it tried extremely hard not to break new ground, and it succeeded at that. Java and Ruby and Python (odd how all these languages came out at almost the exactly the same time) had new ideas and new paradigms, like Rust does. Part of what I mean by "making a big impact" is affecting how we think about programs, which Rust has done and Go has not.

Re: The Rise of Worse Is Better (1991)

#334
post #333
post #320

Earlier quoted context omitted.

Go?? Ruby and Python I think count, Ruby is a JS contemporary and Python is close enough, no one paid it any attention before the late 90s. Rust is still struggling in the domain it wants to live (a C++ replacement), I still have a suspicion that a new new C++ will ultimately come along and dominate before Rust eats the big money where C++ still lives. And I say this as someone who has been rooting for Rust since stu…

Go is an incremental improvement over Java and C#. I like it, but it tried extremely hard not to break new ground, and it succeeded at that. Java and Ruby and Python (odd how all these languages came out at almost the exactly the same time) had new ideas and new paradigms, like Rust does. Part of what I mean by "making a big impact" is affecting how we think about programs, which Rust has done and Go has not.

Go is an incremental improvement over C#?? I think you’re going to find quite a bit of controversy with that take.

I think Go focusing on certain aspects of tooling and deployment early on might be considered improvements on C#/.NET (some, not all). There are aspects of the Golang standard library that are better designed for purpose than C#/.NET (Again even this has to be nuanced because quite a few 3rd party libraries in .NET were basically “standard”). .NET was hobbled by being effectively Windows only, not because of C#.

> Part of what I mean by "making a big impact" is affecting how we think about programs, which Rust has done and Go has not.

A hallmark of Go is the deprioritization of expressiveness compared to its contemporaries, and I argue this does just as much to affect how one thinks about programs.

A further hallmark of golang is CSP, which of course was nearly a 50 year old concept but not something mainstream at the time (which describes just about everything is Rust but perhaps for a number I can’t read your mind and this is too vague. It’s a matter of perspective but I’m not sure what the big new paradigm in Rust you are referring to. Rust doesn’t really break new ground either, which is partly why it isn’t less obscure, widely used languages are almost never the debut of new features, they have been cooking in research and more obscure PLs for years and years. It is at the end of the day still an imperative/mutable language. It just uses a hell of a lot more PL features than Go.

If we’re talking about the borrow checker, which was plan B (plan A was GC), I challenge the idea that it affects how we think about programs. The concept of ownership, lifetimes, aliasing and move semantics were already thought about heavily in C++ prior to Rust (many things codified in the 2011 standard). You still have to think about these things, it’s just that C++ lacks the ability to enforce it. And of course Rust lifted most of the design from Cyclone. There are few large scale Rust projects that can avoid RC either (or some other dynamic lifetime or surrogate reference copium).

You also haven’t mentioned Swift which in many ways is more clever than Rust. Its adoption is more hobbled by the circumstances surrounding its specific corporate driven ecosystem. Maybe that will change.

Re: The Rise of Worse Is Better (1991)

#335
post #149

Earlier quoted context omitted.

....so why is it so slow to generate code?

The compiler doesn't do a whole lot to try and minimize LLVM-IR, and monomorphization produces quite a lot of it. This makes LLVM do a lot of work. (EDIT: maybe that's being too harsh, but what I mean is, there's been some work towards doing this but more that could possibly be done, but it's not a trivial problem.) On my current project, "cargo check" takes ten seconds, and "cargo build" takes 16. That's 62.5% of th…

Have you heard of anyone proposing to add to rustc a flag or an attribute that would cause a generic type to be implemented by a dispatch at run time to avoid monomorphization and consequently decrease compile time?

Re: The Rise of Worse Is Better (1991)

#336
post #267

Earlier quoted context omitted.

I think he means to be saying that, in the context of TCP/IP, nobody knows what a “session” in the OSI sense would correspond to—not that nobody has ever implemented X.225. Presumably Graham knows that people have written X.225 implementations and isn't trying to convince his readers otherwise? I don't know enough to judge his assertion that the session layer exists to solve problems created by half-duplex terminals.…

From page 11: "OSI was designed primarily around the dumb terminal connected to a mainframe." Also from page 11: "'session' meant something related to attaching videotex terminals to mainframes." And yes, all Ceefax terminals were Videotex terminals, but not all Videotex terminals were Ceefax terminals. I might recommend that instead of guessing what the session layer is, you (or more appropriately, Mr. Graham) go an…

Hey, thanks! I had looked for it when writing my previous comment, but I skipped past the ITU links on the assumption that I'd have to sign over my first-born children in order to get a copy. But it turns out that they aren't currently restricting its availability: https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.22...

Clearly "videotex" is wrong. Skimming X.225, though, an awful lot of it does seem to be concerned with ⓐ half-duplex terminals and ⓑ T.62 teletex (not videotex, closer to telex) terminals. So "attaching video terminals to mainframes" does seem like a fair summary. Possibly Graham doesn't know what the word "videotex" means, or thought (as I did, neither of us having lived in Germany) that "teletex" was a kind of videotex.

I agree that it doesn't have the kind of functionality that HTTP cookies provide. That's backwards, I think? HTTP cookies provide session context that persists over multiple TCP-level connections; the reuse of a single transport connection between different X.225 sessions is more like reusing a single TCP-level connection for multiple HTTP requests, or multiple users logging in and out, one after the other, on the same hardwired terminal without resetting it?

I wish it gave examples of usage so I knew what the resynchronization functionality was for. Maybe you know?

Expedited data is a thing that TCP also has, and I've never really understood what it was for there either. Maybe it's for sending a ^C over a remote terminal login session when the keyboard buffer is full because the application you're talking to is hung? The "activity interrupt" stuff seems like it would be a better fit for that, but maybe the expedited data facility was an older design that was retained for backward-compatibility?

Re: The Rise of Worse Is Better (1991)

#337
post #221

Earlier quoted context omitted.

That's sort of like saying "TCP" is a failure because everyone now uses SSH instead of TELNET. TCP/IP still has to do all of the things the OSI stack does, it just does it in a different manner and there are (thankfully) plenty of well defined wire-formats and processing expectations so interoperability is pretty straight-forward. But I still think IPSec would have been MUCH easier to deploy had TCP/IP maintained a r…

Each of the articles linked upthread separately explain why everything you said in your comment is incorrect.

I withdraw the above comment; they do explain why many things in OhMeadhbh's comment are incorrect, but not everything.

Re: The Rise of Worse Is Better (1991)

#338

Earlier quoted context omitted.

Wow, you're not kidding about book-length: at 246 pages, that's an epic takedown. Learning all kinds of other things about networking along the way, though. I do remember all nine layers of the OSI stack though: physical, data link, network, transport, session, presentation, application, financial, political.

But we freakin have those layers now. Above TCP/IP there is SSL, and then about that https, and within that there's some JSON RPC or whatever. The first few OSI layers are fairly readily identifiable in TCP, IP and Ethernet, and some of the rest are built by applications.

Having just skimmed X.225 thanks to OhMeadhbh (https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-X.22...) I think Graham is correct that we don't have anything similar to the OSI "session" layer in the stack you're talking about; although the ARPANET TELNET protocol does have a lot of the same functionality, there's nothing analogous in SSL+https+JSON+RPC. I'm guessing the same is true of the "presentation" layer, but I'm certainly open to hearing why you think otherwise, if you do.

Also, if you happen to be familiar with X.225 (or read it following my prompt above), I have some questions in https://news.ycombinator.com/item?id=41789004!

Graham makes a good argument that, although there are some promising analogies between the physical/data-link/network/transport layers and the PHY/MAC/IP/TCP layers of TCP/IP over Ethernet, the model is overall a very poor fit even at those layers; it's better to not try to decompose network stacks into a predetermined set of layers, because the actual set of layers used is variable depending on the application and the environment.

Re: The Rise of Worse Is Better (1991)

#339
post #247
post #155

Earlier quoted context omitted.

Do you know if VAX BASIC fixed the problems I mentioned in BASIC? Was it interpreted? K&R C has separate compilation, pointer casting, a usable but janky and bug-prone variable-length string type, variadic functions, static variables, literal data of array and record types, bitwise operations, a filesystem access API, and an array iterator type. None of those require "assembly, compiler extensions, or OS specific API…

VAX BASIC was always compiled, it was its predecessors that were not, bitsavers or wikipedia have the background info. Take all the Assembly routines from libc, and K&R C turns into a macro assembler with nicer syntax. And not a good one, given that real macro assemblers actually have better macro capabilities, alongside their high level constructs. Quite visible in the C dialects that were actually available outside…

Do you know if VAX BASIC fixed the other problems I mentioned in BASIC, other than being interpreted? You were the one that brought it up as an alternative. Specifically, did it have record types, local variables, and subroutine parameters? This is the third time I've asked in this thread, but possibly you didn't notice the first two times.

I think "a macro assembler with nicer syntax" is an excellent summary of C. Though it's transitioning to "a retrocomputing programming language we have to support in order to be able to run software that was written long ago".

I agree that many other macro assemblers have more powerful macro capabilities than C. After looking at most of the output of the group that produced Unix, I think that's on purpose: cpp was deliberately less powerful than GPM or m6, but that's not because they weren't familiar with m6 or couldn't figure out how to write it, and ed was deliberately less powerful than QED or TECO, but that wasn't because they weren't familiar with QED. Possibly Plauger's remark about how one of the worst things he'd done in his life was to write a relocating linker in QED provides a clue as to why.

With the benefit of 45–55 years of hindsight, the decision to prioritize clarity over expressiveness in ed and cpp seems to have really paid off. You seem to disagree, but you don't say why; maybe you think it's axiomatic that more expressive languages are better, despite the fact that we're having this discussion in HTML rather than PostScript or TeX, using URLs rather than Smalltalk or Open Firmware bytecode packets, with browsers written mostly in C++ rather than Scheme or Common Lisp, over TCP/IP rather than CHAOSNET. If my suggested axiom were correct, all of those would be the other way around.

I'd like to see RatC, but I haven't been able to find old editions of A Book on C, and the later revisions seem to have removed it.

I don't see how Modula-2 is relevant to a discussion about Pascal. There were lots of Pascal-inspired languages in the 70s and 80s; Modula-2 was neither the most influential one nor Wirth's favorite.

It remains true that you could easily do portable systems programming in C in the late 70s and 80s, and you could do nonportable systems programming in VAX Pascal, but doing portable systems programming in Pascal required major compromises when it was possible at all. (Just to clarify, when I say "systems" I don't mean "kernels"; I mean "not applications", as you clearly also did when you said "VMS also supported Pascal and BASIC dialects for systems programming.")

There were other parts of your comment I wasn't able to make any sense of, but if you feel you said something I haven't responded to, please feel free to clarify.

Re: The Rise of Worse Is Better (1991)

#340
post #119

Earlier quoted context omitted.

LDAP is “lightweight” compared to the X.500 directory access protocol. LDAP DNs are basically the same as X.500 DNs. SNMP is “simple” compared to X.711 CMIP. But SNMP also uses ASN.1 and X.660 OIDs.

I finally understand why OSI failed, it's the naming! Dear lord.

I think naming quality isn't really a difference between OSI and TCP/IP. I'm sending this message in URL-encoded UTF-8 in MIME over HTTP over TLS and TCP, IP, MPLS, DOCSIS, and an 802.11g CSMA/CA MAC in a CIDR IP block allocated by ARIN via LACNIC to an AS that belongs to a CLEC; ultimately you'll use an URL to read it in HTML, and if your UA is like mine, you'll use ECDHE ECDSA with AES-256-GCM and SHA-384, verified through a CA chain through E5 (which supports OCSP) and ISRG. But nobody bats an eye at that because that alphabet soup has been familiar for decades.
Post reply on HN