return to table of content

Russ Cox is stepping down as the Go tech lead

tomcam
84 replies
22h4m

IMHO Go has been one of the best-managed open source projects ever. Hats off to Google for supporting it.

hoten
76 replies
21h32m

What are some things that make it well managed?

ein0p
36 replies
21h25m

Almost zero drama and almost no feature creep or breaking changes. The team seems to have a focus, and does not change it easily. That is important for a programming language, and it doesn’t happen organically.

dom96
10 replies
21h20m

Zero drama is easy when you get paid (a lot) to work on something.

muratsu
2 replies
21h15m

Huhhh? Have you ever worked at a large enough company where stakeholder interests are not aligned?

IshKebab
1 replies
20h55m

That's private drama. For all we know there has been loads, but it's private so you can't see it.

ncruces
0 replies
19h26m

Where would you expect to see this drama unfold if it were private? Nowhere? That'd be incredible opsec.

Code review happens in public, not on GitHub but on Gerrit. The main issue tracker is public, on GitHub. Proposals are largely handled on the issue tracker. There are public mailing lists, etc.

Surely, there are face to face private meetings. And there are likely also private issue trackers, mailing lists, and etc. And, yes, sometimes, a seemingly arbitrary decision pops up, that was clearly discussed elsewhere.

But these comments seem to come from people who never even tried to contribute, or deal with the process.

I've done docs fixes as a total newb, had to convince the Windows maintainer to let me fix a Windows issue (that a year later produced flaky tests, which I fixed), made and got a proposal accepted, have a project in the linkname hall-of-shame, which led to another successful proposal to open up APIs (which then failed tests on some platforms, which I fixed).

All with little drama, pure engineering.

ein0p
2 replies
21h11m

That’s unfair. There’s plenty of drama in projects with all sorts of funding situations. Look at eg Rust. Lots of drama and it’s anyone’s guess if the code you wrote a year ago would work today.

lkirkwood
1 replies
20h51m

It's anyone's guess if the code you wrote a year ago would work today

Is that true? In what sense? I was under the impression the editions took care of that.

seeekr
0 replies
20h41m

Not true, not sure why GP said that. Been writing Rust for many years and code does not just break on compiler upgrades. Super stable overall, including the wonderfully evolving ecosystem!

Maxatar
1 replies
20h41m

Getting paid has nothing to do with drama. Plenty of high paid people get involved in drama and infighting across all walks of life including tech.

segfaltnh
0 replies
15h13m

Pretty sure Musk gets a decent paycheck, and manages to be involved in plenty of drama.

sangnoir
0 replies
21h10m

And yet we've had lots of drama in Linux and Redhat mailing lists, involving people paid to work on the respective projects, and using their work email.

goalonetwo
0 replies
21h2m

I would rather say that it is easy to have zero drama when most of the committers come from a single large companies.

Onavo
9 replies
17h17m

They are the programming language equivalent of GitHub repos that maintain a low open issue count by closing most issues as "won't fix" or "won't build".

lolinder
6 replies
16h53m

Yes. And?

Programming languages more than almost any other type of project end up swamped with thousands of competing requests to implement mutually incompatible features. Some languages do better than others at saying no, and those languages tend to be the ones that achieve widespread adoption.

pansa2
5 replies
14h28m

Some languages do better than others at saying no, and those languages tend to be the ones that achieve widespread adoption.

Unfortunately that’s not at all true - Go is a real outlier here. If it were true, we’d all be writing C instead of C++, Lua instead of Python and ES5 instead of TypeScript.

flohofwoe
2 replies
11h50m

FWIW I switched from C++ to C about 7 years ago and never looked back (can't quite escape C++ completely though because some important libraries are still written in C++ unfortunately). I vastly prefer TS to JS, Python and Lua though.

hsaliak
0 replies
4h51m

DearImgui’s coding style is a good compromise.

cookiengineer
1 replies
12h2m

The choice is yours. Don't blame your choices on other people's opinion that you don't agree with. Everything in life is a tradeoff.

If you don't agree with the available languages, make it better. That's the power of open source :)

randomdata
0 replies
11h5m

> The choice is yours [pansa2].

Who gave him control over what sees widespread adoption?

segfaltnh
0 replies
15h14m

Yep. It takes a lot of bravery and I appreciate it!

ein0p
0 replies
15h57m

Good

richardwhiuk
3 replies
21h14m

I suspect all the drama happens internally.

zja
1 replies
15h46m

Are there any Go team members that don’t work for Google? It’s a lot easier to remain civil/avoid drama when people know each other personally, and work together at a big company with an HR department.

markkrj
0 replies
15h32m

Does ex-googler counts? Then Filippo Valsorda...

tomcam
0 replies
12h59m

One reason I consider it so good

sidewndr46
2 replies
19h19m

Absolutely inaccurate. Pointer de-reference operator had a breaking change after 1.x

tweenagedream
0 replies
17h17m

I mean they did say almost no breaking changes, depending how much has changed in the language, a small handful of breaking changes in niche use cases may be considered almost none by some. I'm not sure I would say the comment is absolutely inaccurate.

arp242
0 replies
18h52m

I don't recall this off-hand; which change was that?

vdqtp3
1 replies
19h2m

The cost being that they [generally speaking] ignore proposals, pull requests, and new features - even if they are valuable to their users and AREN'T breaking.

segfaltnh
0 replies
15h15m

Mostly this comes down to recognizing the value of simplicity. I like Rust and Go, but I am infinitely grateful that Go is as minimal as it is. I wouldn't have had as much success ramping my team on Rust.

moogly
1 replies
6h8m

almost zero drama

Hm. Wasn't (the lack of) generics pretty drama filled? Especially the way they fought against it for so long.

quectophoton
0 replies
2h37m

s/fought against it/rejected superficial proposals that were mostly about syntax bikeshedding and didn't include enough research on how the proposal would play along with the rest of the language and ecosystem/

ahci8e
1 replies
18h48m

Almost zero drama, yeah. I do remember the dep drama though...

justinclift
0 replies
17h0m

And the telemetry drama.

truncate
0 replies
15h50m

Couldn't agree more. Always felt community had trust in the team. Its not the fanciest language, but whatever they push for usually works. In contrast, recently I've had to deal with Swift, and they are often pushing like 10 features, but each of them is full of holes and annoyances. Great respect for doing the boring of keeping it stupid and simple.

gunapologist99
0 replies
18h43m

Exactly. And it's in writing!

The backwards compatibility promise:

https://go.dev/doc/go1compat

cookiengineer
35 replies
11h56m

The reluctancy to introduce new syntax too quickly (looking at you, TC39 and Babel) makes go an almost maintenance free language.

If you learned idiomatic go, you can maintain and patch other libraries in the ecosystem very quickly.

Unified codestyle, unified paradigms, unified toolchain.

It's a language with harsh opinions on everything. If you manage to get over your own opinions, you'll realize that any opinion upstream is better than no opinion downstream.

That's why go's toolchain isn't as messed up as npm, yarn, grunt, gulp, webpack, parcel, babel and other parts of the ecosystem that have no conventions and are therefore as a result very expensive to maintain.

KronisLV
11 replies
11h38m

With it being so consistent and predictable, I wonder why it hasn’t displaced .NET and Java in the enterprise for back end development.

Maybe because a framework like ASP.NET or Spring that covers like 80+% of the enterprise needs hasn’t quite emerged? Or perhaps we just need to give it a decade or so.

There are still very few Go jobs in my country, most are either .NET, Java or PHP.

trustno2
3 replies
11h5m

Go doesn't really lend itself that much into code with a lot of abstraction layers. If you try to do that, you will start to run against the language.

The more enterprisey software usually have lots of layers for organizational reasons, and go doesn't really fit there. So I don't think it will really be a hit in the enterprise.

yes there are orm solutions and DI frameworks and all that, but they always feel like they don't belong in the language.

(Also, java and .net and php are much older and have much bigger enterprisey ecosystem.)

I have seen go replacing the php stack though, and in some way the "original" python stack - but python now has ML.

jen20
2 replies
6h19m

usually have lots of layers for organizational reasons

The ridiculous number of layers in Java or C# are more of a skill and guidance issue than anything else. Older languages don’t always mean over-attempted-abstraction (think C, for example).

trustno2
0 replies
4h57m

I have worked in enterprises and the layers are usually an organizational issue that just acts as code issue.

Structure of code often reflects structure of your company.

The code is often maze of layers because the company is a maze of sub-committees. Java/C# fits more neatly in there.

Although with Go, what can happen is that there is a maze of microservices. Maybe that's not that much better.

pjmlp
0 replies
5h13m

Never seen CORBA and COM written in C, I guess.

Enterprise Architects will do their beloved architectures with whatever languages are the tool of the day.

cookiengineer
2 replies
11h23m

ASP.NET or Spring

(Disclaimer: I don't agree with HTMX rendering HTML chunks on the backend side, and I think that APIs should be HTTP-cacheable and use REST/JSON)

Currently I am trying to get better at using Go with WebAssembly for the frontend. I love to use the webview/webview bindings to build local GUIs, but the need for redundant code in JavaScript for client data transfers and input data validation are annoying me a bit much.

I am trying to find out a paradigm that could benefit from the strength of JSON marshalling, with the idea that you can map routes to structs, for example, and where a unified "Validate() (bool, error)" method as an interface is enough to use the same structs on both the frontend and backend, for both serialization and validation/sanitization.

Having said that, I think that what's missing the most in go right now is a good UI framework for the web, but it's hard to find a paradigm that fits nicely into the language while also being able to handle dynamic data/refreshes/render loops without getting too bloated too quickly.

wordofx
1 replies
10h59m

and I think that APIs should be HTTP-cacheable

Rendering html on the server does not make it not cacheable.

The vast majority of people do not need graphql or shift their compute to the client with a junk react app with adhoc json endpoints everywhere.

KronisLV
0 replies
9h48m

I think server side rendering can often be pretty comfortable to use!

That said, I’ve also worked with JSF and PrimeFaces project and the ones I’ve seen have been more burdensome from a maintenance perspective and also more buggy than most SPAs that I’ve worked with.

I’ve also seen large monoliths where the tight coupling slows updates down a whole bunch, as opposed to the presentation being in a SPA that’s separate from an API that can be more limited in its scope (nothing wrong with using ASP.NET and Spring for just an API).

Heck, I’ve migrated a SPA from the now defunct AngularJS to Vue and it felt better than having a legacy project that’s stuck on an old version of Spring and PrimeFaces because there’s so many moving parts that when you try to update anything, everything breaks.

Plus, turning a SPA into a PWA is a fairly pleasant experience. I don’t think most folks need GraphQL though, especially when we can barely do RESTful API correctly and not even all places use OpenAPI specs and tooling, making client code impossible to generate (even SOAP did a better job in that particular regard with how widespread WSDL was).

pjmlp
0 replies
5h12m

Thankfully, it is enough that it is a must in DevOps space.

lifty
0 replies
7h57m

In my enterprise neck of the woods Go is steadily taking over backend development.

Philip-J-Fry
0 replies
10h53m

Go is displacing .NET where I work for backend development. We still use .NET for Windows GUIs but any sort of server code is mostly Go going forward.

Cthulhu_
0 replies
9h29m

It's not yet an enterprise language; along the languages/frameworks, there's a huge ecosystem of QA, monitoring, security, etc solutions in the Java/.NET space that just isn't there in Go.

I mean there's a slow shift, I keep hearing of "rewriting a Java codebase to Go", but it'll be a slow process. And especially the bigger projects that represent 30 years of Java development will and should be reluctant to start rewriting things.

lopkeny12ko
8 replies
9h59m

Unified codestyle

The moment I got my first compile error due to an unused variable and an unused import, made me realize Go is not a serious programming language.

Cthulhu_
5 replies
9h27m

I wonder who hurt them, that is, how much did unused variables/imports hurt at Google for them to make those a compiler error?

Insofar I know it, I can imagine C/C++ caused some issues like that because it's hard to figure out whether an import is used, but an unused import does have a cost.

foldr
3 replies
6h28m

I think the fundamental reason behind this behavior is just Go's rejection of the concept of compiler warnings. Unused variables must either be A-ok or trigger an error. They chose the second option for unused variables. Some other code smells are considered A-ok by the compiler and need to be caught by linters.

jen20
2 replies
6h17m

The problem with such rejection is that every serious project written in Go has invented compiler warnings outside the compiler, with linters.

kjksf
0 replies
3h34m

Why is it a problem?

`go vet` is part of Go toolchain so the designers very much understand and acknowledge that code can have issues that are not always errors.

The distinction they made is very simple: an error is something that is always wrong and a vet warnings is something that is possibly wrong but not always.

They made a judgement call to split the responsibility: compiler only reports errors, other tools, including `go vet`, can tell you about other issues.

For example: passing a large struct by value to a function is potentially a performance problem but it's also correct code.

If you ever tried to compile C++ code with different compilers you would know why it's a wise decision.

The set of warnings is vast and not standardized so you take C++ source from project. It compiles for them but doesn't compile for you because you use different compiler or enabled different set of warnings. At which point you either try to get the other project to "fix" something that isn't an issue for them or you do stupid, pointless, time consuming work adjusting your build system.

The same would happen in Go and it would be a reusability killer. You use some library in your program but it doesn't compile because you decided to use more strict set of flags.

Lack of warnings switches also simplifies the toolchain. In go it's just `go build` and it works.

In C++ you have to write some kind of makefile because everyone executes `cc` with different set of flags.

foldr
0 replies
4h41m

Is this a problem? Linters are also used with lots of languages that do have compiler warnings. Go just removes the no man’s land between honest-to-goodness compiler errors and linter warnings about code smells. I see no issue with having the latter handled entirely by tools designed for the job.

rsc
0 replies
47m

https://research.swtch.com/deps#watch_your_dependencies

Creeping dependencies can also affect the size of your project. During the development of Google’s Sawzall—a JIT’ed logs processing language—the authors discovered at various times that the main interpreter binary contained not just Sawzall’s JIT but also (unused) PostScript, Python, and JavaScript interpreters. Each time, the culprit turned out to be unused dependencies declared by some library Sawzall did depend on, combined with the fact that Google’s build system eliminated any manual effort needed to start using a new dependency.. This kind of error is the reason that the Go language makes importing an unused package a compile-time error.
tommica
0 replies
9h53m

Why not? Pretty sure it's used in a lot of places, so it does seem quite serious if a language.

lioeters
0 replies
7h5m

The moment you see that you had misspelled a variable name by a single character when the compiler warned you about an unused variable, you'll realize Go is a serious programming language.

serial_dev
4 replies
11h46m

This!

In Go, a feature needs to have an extremely good reason to be added, and even then it's only added with care and caution.

In other languages, pointless features are added because maintainers are afraid, or not empowered to say... "yeah, we get it, but no, we will not add cruft to the language because you can't write your own 2 line function to achieve the same, no matter how hard you dunk on us on Twitter, it's take it or leave it, but you won't tell us how to run this project"

pansa2
2 replies
9h51m

pointless features are added because maintainers are afraid

I wouldn't have described language designers' feelings that way, but you're absolutely right. For example, witness the recent features added to Python with little more justification than "other languages have it". It's pure FOMO - fear of missing out.

vbsd
0 replies
7h0m

Would you expand on the Python issue? I find recent Python additions either useful or non-intrusive, I wonder which ones you think are born out of FOMO.

Cthulhu_
0 replies
9h31m

"Other languages have it" is a disease that's struck many languages in the past decade+, notably Javascript which added partial OOP support (classes but initially no access modifiers), or Java which added functional programming constructs via Streams.

I mean granted, Java needed some tweaks for developer ergonomics, and I'm glad they finally introduced value types for example, but I now find that adding entire paradigms to a language is a bad idea.

In the case of Go, yes it needed generics, but in practice people don't use generics that often, so thankfully it won't affect most people's codebases that much. But there's people advocating for adding more functional programming paradigms and syntax like a function shorthand, which is really frowned upon by others, because new syntax and paradigms adding to the things you need to know and understand when reading Go.

Plus at the moment / the way the language is designed, FP constructs do not have mechanical sympathy and are far slower than their iterative counterparts.

klabb3
0 replies
8h15m

Yes about the language but also Google understands that both tooling and standard library is more important than the language. All of that makes Google internal maintenance much much better. Another artifact of google3 was the absolute shitshow of GOPATH and abysmal dependency management – because Google didn’t really need it, while people outside suffered. When they added go mod support Go became 10x more productive outside of Google.

Go is almost an anti-language in that sense, reluctantly accepting shiny lang features only after they’ve been proven to address major pain points. It’s almost more an “infrastructure deployment toolkit” than a language. Which strangely makes it extremely pleasurable to work with, at least for network-centric applications.

daghamm
4 replies
3h34m

"That's why go's toolchain isn't as messed up as npm, yarn, grunt, ..."

And let's be honest, Rust toolchain is pretty messed up too.

Want to cross-compile with go? Set the GOOS variable and you are done. On Rust you need to curl-sh rustup, switch to nightly, add new targets, add target to your cargo and cross fingers it works this week.

quectophoton
3 replies
2h51m

To be fair, with Go it's still painful to work with private repositories. And I'm invoking Cunningham's Law here when I say there's no convenient way to do so.

If you want to use a private repository (let's say it's a private GitHub repository), then you either have to do it the bad way (setting up your own GOPROXY and setting it up securely, which implies also ensuring it's not leaking your source code elsewhere for "analytics purposes"), or the worse way (doing brittle text replacement using weird git config stuff).

Or the annoying way of using a vanity import, and host that package in your domain with HTTPS using a wildcard certificate. But that would require either (1) only allowing access through WireGuard and hoping whatever reverse proxy you use has a plugin for your DNS registry; or (2) letting your VPS provider terminate DNS (e.g. Hetzner load balancer), but filter by IP address in your VPS firewall settings ensuring your public address (IPV4 /32 or IPV6 /64) is always up-to-date in the firewall.

Or using `replace` in `go.mod`, but these don't work transitively so these only work on "root" projects (i.e. they are ignored in dependencies), so I don't think this really counts as a solution.

I would have liked some way to force SSH access for a specific package, instead of HTTPS. Like for example `go.mod` supporting a `require-private` to use instead of `require` (or whatever similarly convenient directive for `go.mod` that implies authenticated SSH access is required).

Or in other words, say I have a package `github.com/_company/project`, and it depends on `github.com/_company/dependency`. I want to be able to do:

    git clone 'git@github.com:_company/project.git' 'project'
    cd 'project'
    go mod tidy  # Should just work.
`go mod tidy` should just work without complaining about `github.com/_company/dependency` not existing (because it's a private repository only accessible through SSH).

(EDIT: Still, I'm agreeing with the point that Go's tooling is better than most other things I've tried. My only complains are this one about being inconvenient to use private repositories, and also that by default it leaks package names to Google whenever you do `go mod tidy`.)

hop_n_bop
1 replies
1h47m

1) git config --global url.ssh://git@github.com/.insteadOf https://github.com/

2) export GOPRIVATE='github.com/_company/*'

quectophoton
0 replies
45m

> or the worse way (doing brittle text replacement using weird git config stuff).
cookiengineer
0 replies
6m

I'm not sure I understand the problem statement.

You can use e.g. this inside a go.mod file:

require some/library v0.0.0

replace some/library => ./external/library

------

/external is a folder inside the project repo

/external/library is a git submodule of the private repo.

------

Alternatively maybe go mod vendor can help managing the dependencies that aren't accessible via https?

I am not sure what go should do if a library repo in the dependencies tree isn't accessible, because that's the job of git, not go modules?

_the_inflator
2 replies
10h12m

Clutter death that creeps in any language, as I see it. To this day, only a small subset of JS syntax is used; I cannot recall anyone besides me ever using method chaining like .map .filter, etc.

There is a reason why almost every good language is somewhat akin to C to this day, and maybe people started over to get rid of the noise.

matwood
0 replies
5h31m

I cannot recall anyone besides me ever using method chaining like .map .filter, etc.

Interesting. That's all anyone on my team ever used once it became available.

But, it highlights the point with Go. Working with Go for just a little while means I can easily read and work with nearly any Go project with a very short ramp up.

jessekv
0 replies
6h27m

Haha interesting. I actually like .map/.filter/.find/etc. in JS and comprehensions in Python. I find they communicate the intent of the programmer really clearly as compared to a for-loop.

classified
0 replies
6h10m

Well, if you compare against the absolute bottom of the barrel, it's not too hard to look good.

tomcam
2 replies
12h58m

Your question answers itself. It's growing in popularity in every year and has apparently suffered exactly zero scandals or embarrassing gaffes of any kind. Just not fucking up is huge in making any serious enterprise successful and very, very difficult to achieve.

treyd
1 replies
12h46m

Just from the top of my head there's the Google proxy shenanigans and the telemetry proposal that they backed down from. There may be others I'm not aware of.

kjksf
0 replies
3h27m

Explain how Google proxy "shenanigans" are any different than "npm proxy shenanigans" or "cargo shenanigans" or "pip shenanigans". It's a service to improve Go ecosystem with anti-spoof security design (which can't be said about those other code download services).

telemetry design is actually very thoughtful, limited and reasonable about what and how much data it sends. Motivation for sending the data is clear (improving Go). It's only a scandal for unreasonable people.

dzonga
2 replies
19h5m

I think this is a side effect of golang having failed at the mission to replace C++ or even Java, becoming a replacement for ruby / python etc for API's. makes the project's goals align with users not about conquering the world anymore. as that battle is lost to Rust, Zig etc.

dgb23
0 replies
1h3m

Go is definitely used for stuff that rivals their Rust/C++ etc. counterparts in terms of performance and general quality.

Caddy and docker pop right into my mind. I‘ve also seen databases, image processing and other nitty gritty systems programming related projects in Go.

People also love to write CLI apps in Go that do a lot of heavy lifting like esbuild or k6 etc.

The sweet spot for Go seems to be IO heavy programs. It allows for just enough control to get good performance for a lot of use cases that bleed into systems programming.

bborud
0 replies
9h14m

I thought the mission was to replace C++ for a many things at Google. You can't really lose to someone you are not competing with. The choice of managed memory is a pretty obvious hint that Go isn't a general direct competitor to C/C++.

And neither Zig nor Rust have replaced C++ to any meaningful degree. Nearly everywhere it would count I still will have to deal with C++ for years, if not decades, to come.

nottorp
1 replies
4h32m

I did mean to ask: who "owns" Go for all practical purposes?

I suppose in theory it's some independent entity/commitee/whatever, but who pays the majority of the people working on it? Google?

diggan
0 replies
3h16m

but who pays the majority of the people working on it? Google?

Checking the 20 top contributors from https://github.com/golang/go/graphs/contributors

    Google: 10
    Unclear: 7
    Tailscale: 1
    Canopy Climate: 1
    Isovalent: 1
Just checking the GitHub profile and not doing any deeper digging, so take it with a grain of salt.

jgowdy
1 replies
13h52m

Yeah, only supporting glibc behaviors and ignoring the ELF standard at will really qualifies as best managed. /s

ainar-g
69 replies
22h45m

Thank you, rsc, for all your work. Development in Go has become much more enjoyable in these 12 years: race detector, standardized error wrapping, modules, generics, toolchain updates, and so on. And while there are still things to be desired (sum types, better enum/range types, immutability, and non-nilness in my personal wishlist), Go is still the most enjoyable ecosystem I've ever developed in.

thayne
16 replies
14h39m

Wow, that's painful to read.

Separating the concept of pointers and nullable types is one of the things that I think go having from the beginning would have made it a much better language. Generics and sum types are a couple of others.

ahoka
13 replies
7h53m

False things programmers believe:

All reference types should be able to take a null value.

It's impossible to write complex and performant programs without null.

It's impossible to write complex and performant programs without pointers.

References always hold a memory address in a linear address space. (Not even true in C!)

Every type is comparable.

Every type is printable.

Every type should derive from the same common type.

All primitive types should support all kind of arithmetic the language has operators for.

The only way to extend an existing type is to inherit from it.

What else?

lnggahc
2 replies
7h27m

It's impossible to write complex and performant programs without null.

Well, clearly there is a need for a special value that is not part of the set of legal values. Things like std::optional etc. are of course less performant.

If I can dream, all of this would be solved by 72-bit CPUs, which would be the same as 64-bit CPUs, but the upper 8 bits can be used for garbage collection tags, sentinel values, option types etc.

sapiogram
0 replies
6h9m

Well, clearly there is a need for a special value that is not part of the set of legal values.

There's a neat trick available here: If you make zero an illegal value for the pointer itself, you can use zero as your "special value" for the std::optional wrapper, and the performance overhead goes away.

This is exactly what Rust does, and as a result, Option<&T>, Option<Box<T>>, etc are guaranteed to have zero overhead: https://doc.rust-lang.org/std/option/index.html#representati...

dwattttt
0 replies
7h6m

If I can dream, all of this would be solved by 72-bit CPUs, which would be the same as 64-bit CPUs, but the upper 8 bits can be used for garbage collection tags, sentinel values, option types etc.

https://www.cl.cam.ac.uk/research/security/ctsrd/cheri/cheri...

Address space is 64bit, pointers are 128bit, and encode the region the pointer is allowed to dereference. And there's a secret 129th bit that doesn't live in the address space that gets flipped if the pointer is overwritten (unless it's an explicit instruction for changing a pointer)

dgb23
2 replies
2h16m

Without pointers in some form or another, you can’t refer to allocated memory. You can change the name of pointers but they are still pointers.

thayne
1 replies
47m

It is possible to write complex and performant programs without allocating memory.

And in some languages, where you only operate on values, and never worry about where something is stored, allocation is just an implementation detail.

dgb23
0 replies
16m

It is possible to write complex and performant programs without allocating memory.

I assume you mean by only allocating on the stack? Those are still allocations. It's just someone else doing it for you.

And in some languages, where you only operate on values, and never worry about where something is stored, allocation is just an implementation detail.

Again, that's someone else deciding what to allocate where and how to handle the pointers etc. Don't get me wrong, I very much appreciate FP, as long as I do information processing, but alot of programming doesn't deal in abstract values but in actual memory, for example functional programming language compilers.

sirsinsalot
1 replies
6h39m

Never met a programmer that thought these things were true.

thayne
0 replies
3h54m

A few of those myths are stated as fact in the aforementioned thread.

bayindirh
1 replies
3h43m

It's impossible to write complex and performant programs without pointers.

Well, I'd rather not copy around a multi-hundred-megabyte (or gigabyte) 3D object around to be able to poke its parts at will.

I'll also rather not copy its parts millions of times a second.

While not having pointers doesn't make impossible, it makes writing certain kinds of problems hard and cumbersome.

Even programming languages which do not have pointers (cough Java cough), carry pointers transparently prevent copying and performance hits.

marcosdumay
0 replies
33m

Well, looks like the GP missed a very common false fact:

The operations written in a program must literally represent the operations the computer will execute.

This one stops being true on high-level languages at the level of x86 assembly.

twic
0 replies
2h33m

It's going to be much faster to enumerate the true things programmers believe.

pwdisswordfishz
0 replies
6h48m

Every type must have some sort of a default value. (A generalization of the first item, really.)

LudwigNagasena
0 replies
1h56m

Every type is printable.

It’s 2024, every type is jsonable!

klabb3
1 replies
7h30m

Wow, that's painful to read.

And the dismissive tone of some people including Ian. But to be fair before Rust there was definitely this widespread myth in the dev hivemind that nullable pointers is just the cost of performance and low level control. What’s fascinating is how easy and hindsight-obvious it was to rid code of them. I’ve never had to use pointers in Rust and I’ve worked on quite advanced stuff.

lupire
0 replies
5h50m

Nullable pointers are fine for those who need them. What we're asking for is non-nullable pointers.

p1necone
12 replies
16h45m

Wow, that discussion is infuriating. I'm shocked that many people on there don't seem to understand the difference between compile time checks and runtime checks, or the very basics of type systems.

skybrian
9 replies
15h2m

I think people do understand the basics of static type systems, but disagree about which types are essential in a "system language" (whatever that is).

An integer range is a very basic type, too, conceptually, but many languages don't support them in the type system. You get an unsigned int type if you're lucky.

edflsafoiewq
7 replies
11h19m

An integer range is a very basic type, too

Not really, its semantics get hairy almost instantly. Eg does it incrementing it produce a new range?

randomdata
6 replies
10h54m

The semantics are always complex. The same type of question arises for all basic types. For example, what does adding a string to an integer produce?

Or do you give up on answering that and simply prevent adding strings and integers? When one wants to add them they can first manually apply an appropriate type conversion.

That is certainly a valid way to address your question – i.e. don't allow incrementing said type. Force converting it to a type that supports incrementing, and then from that the developer can, if they so choose, convert it back to an appropriate range type, including the original range type if suitable.

Of course, different languages will have different opinions about what is the "right" answer to these questions.

noelwelsh
5 replies
10h3m

I think you're confusing the type and value level.

The original statement was about a range type, that is something like an integer that is statically constrained to a range of, say, 1..4 (1, 2, 3, 4).

To work with this as a type you need to have type level operations, such as adding two ranges (which can yield a disjoint range!), adding elements to the range, and so on, which produce new types. These all have to work on types, not on values. If 1..4 + 5..8 = 1..8 this has to happen at the type level, or, in other words, at compile-time.

Range types are very complicated types, compared to the types most people deal with.

Converting a string to an int is very simple to type (String => Int if you ignore errors) and adding integers is also simple to type ((Int, Int) => Int)

foldr
3 replies
6h35m

OP is just saying that you don't have to permit operations such as addition or incrementation on range types, in which case you don't need the corresponding type-level operations.

noelwelsh
2 replies
6h21m

That is certainly a valid way to address your question – i.e. don't allow incrementing said type. Force converting it to a type that supports incrementing, and then from that the developer can, if they so choose, convert it back to an appropriate range type, including the original range type if suitable.

The quoted part above is an argument for dependent types. The conversion back to a range type creates a type that depends on a value, which is the essence of dependent typing.

foldr
1 replies
6h19m

No, I think the idea is that you'd get a runtime exception if the value was outside the range. No need for dependent types. It is no different conceptually from casting, say, a 64-bit integer to a 32-bit integer. If the value is outside the range for a 32-bit integer, then (depending on the language semantics) you either raise a runtime error, or the result is some kind of nonsense value. You do not need to introduce dependent types into your language to enable such casts (as long as you're willing to enforce the relevant checks only at runtime, or forego such checks altogether).

noelwelsh
0 replies
6h10m

I think the original comment is imprecise. E.g. "don't allow incrementing said type" can be read as either "don't allow incrementing values of said type" or literally as don't allow incrementing the type. I can see both your and my interpretation, depending on how one chooses to read the comment.

skybrian
0 replies
4h8m

A range type could be very simple if it were just used for storage - you couldn’t do anything with it other than passing it around and converting it to something else, and there would be a runtime check when creating it.

But such a thing would be useful mostly for fields in data structures, and the runtime checks would add overhead. (Though, perhaps it would replace an array bounds check somewhere else?)

dwattttt
0 replies
7h4m

I regularly find quite smart people assume Rust's references must be fat pointers to handle lifetimes, and check them all at runtime.

noelwelsh
0 replies
9h57m

Many people on here as well! :-) Reading the comments on this post is stepping into an alternative universe from the PL crowd I usually interact with. Very conservative. It's quite interesting.

jrimbault
0 replies
11h23m

It's like they don't speak the same languages.

everybodyknows
12 replies
21h32m

Nomination for RSC's greatest technical contribution: module versioning. Absolutely fundamental to the language ecosystem.

https://research.swtch.com/vgo-intro

trustno2
6 replies
11h11m

The interesting thing is - this went pretty much against the community at the time.

At the time, the community seemed to have settled on dep - a different, more npm-like way of locking dependencies.

rsc said "nope this doesn't work" and made his own, better version. And there was some wailing and gnashing of teeth, but also a lot of rejoicing.

That makes me a bit sad that rsc is leaving.

On the other hand, I don't really like the recent iterator changes, so maybe it's all good.

Btw if you reading this rsc, thanks a lot for everything, go really changed my life (for the better).

nasretdinov
5 replies
10h47m

Iterators definitely have one of the strangest syntaxes I've seen, but if you promise not to break the language you better not introduce new syntax without a Major reason (like generics, but even those actually introduced next to no new syntax, even re-using interfaces o_O).

foldr
4 replies
10h22m

Iterators don’t really introduce any new syntax, strange or otherwise.

jdnendjjd
3 replies
8h33m

That's what he said

foldr
2 replies
7h44m

In part of the comment yes, kind of, but the comment begins by saying "Iterators definitely have one of the strangest syntaxes I've seen". As there is no syntax specific to iterators in Go, I find this a bit hard to understand.

makkes
1 replies
5h48m

s/syntax/API/

It's not that hard to understand what OP means.

mseepgood
0 replies
4h48m

It's just the visitor pattern, taught in software engineering 101. A function that takes a callback function that gets called for each visited value. Nothing strange about it. Many standard library functions such as sync.Map.Range or filepath.Walk have always used it. The new thing is that it now gets easier to use on the caller side.

kiitos
1 replies
1h36m

Fundamentally broken model of versioning, but I guess nobody really cares.

jeremyloy_wt
0 replies
1h2m

Can you elaborate on what problems you have with the MVS algorithm?

nvarsj
0 replies
1h10m

Not really a fan at all. Dep and its predecessors followed kiss principles, were easy to reason about, and had great support for vendoring.

I’ve wasted so much time dealing with “module hell” in go, that I never dealt with in the prior years of go usage. I think it has some major flaws for external (outside Google) usage.

agumonkey
0 replies
12h33m

One I enjoyed a lot (a lot) was this one https://research.swtch.com/pcdata

Hope he gives us more in the future

thanks rsc

sharno
10 replies
16h9m

I’m sure if Go had nullable types and/or sum types from the beginning, it’s have been much more popular

segfaltnh
4 replies
15h16m

It's already quite popular. I'm less convinced there's a large pile of people wishing for a fairly high performance garbage collected language that are not using Go because of this. There just aren't many viable alternatives.

ReleaseCandidat
2 replies
13h38m

Java and C# being the obvious (and more performant) alternatives. And compared to them, Go already wins because of not being, well, "enterprisey". And with that I mean less the languages itself, but also the whole ecosystem around them.

pjmlp
1 replies
12h40m

Go's is already "enterprisey" enough, thanks to Kubernetes ecosystem.

wordofx
0 replies
11h3m

For the 3 people who actually need Kubernetes.

valenterry
0 replies
4h43m

There are definitely lots, I'm one of them. I use Scala, which is very powerful and imho much nicer language than golang. But the tooling and other support is slow and subpar. But I just can't go back to a brain-dead language(!) like golang because it hurts to program in such languages to me. So I hope that either golang catches up with Scala's features, or that Scala catches up with golangs tooling.

And I think there are many similar people like me.

lupire
1 replies
5h43m

Go has nullable types! We want non-nullable types!

chuckadams
0 replies
3h10m

I blame C# for the confusion. Think of it this way: the ability to explicitly express a type Foo|null implies the existence of a non-nullable Foo as well. IOW it’s shorthand for “nullable and non-nullable types”.

foldr
1 replies
6h32m

Perhaps, but other languages that look a lot like Go with these additions (e.g. OCaml) have not gained much popularity, despite getting much more love on forums like HN. It's important to remember that the people expressing strong opinions about sum types on the internet are a tiny and non-representative fraction of working programmers.

lupire
0 replies
5h41m

OCaml has a huge number of challenges besides "popular language plus sum types"

hu3
0 replies
16h3m

I'm sure of the opposite given the ideas behind Go's design.

vyskocilm
8 replies
21h48m

Well written list of what made Go better language during last years. I'd add iterators, the recent big thing from Russ.

valyala
3 replies
9h9m

Iterators and generics go against the original goals of Go - simplicity and productivity. They complicated Go language specification too much without giving back significant benefits. Iterators and generics also encourage writing unnecessarily complicated code, which makes Go less pleasant to work with. I tried explaining this at https://itnext.io/go-evolves-in-the-wrong-direction-7dfda8a1...

jdnendjjd
2 replies
8h28m

This argument is brought up again and again, but it is just wrong.

Go had both generics and iterators from the get go. Just not user defined ones.

Thus it is obvious that the creators of the language always saw their need for a simple and productive language

joeblubaugh
0 replies
3h35m

I do agree with his point that the implicit mutation of the loop body for an iterative will be difficult to debug.

eweise
0 replies
3h32m

Not obvious to me. We just implemented a streaming solution using the iterator interfaces. They are just functions so reading the code its easy to understand. Adding special language support only serves to obfuscate the actual code.

galkk
3 replies
19h48m

Wow. I haven't followed Go for a while, thanks for that note.

Iterators are very nice addition, even with typical Go fashion of quite ugly syntax.

kjksf
1 replies
4h20m

Just last week I've implemented an iterator for my C++ type and lol to your comment. It was fucking nightmare compared to how you (will) implement an iterator in Go.

I didn't study the reason why Go chose this way over others. I do know they've considered other ways of doing it and concluded this one is best, based on complex criteria.

People who make value judgements like this typically ignore those complex consideration, of which playing well with all the past Go design decisions is the most important.

Frankly, you didn't even bother to say which language does it better or provide a concrete example of the supposedly non-ugly alternative.

galkk
0 replies
3h11m

C#, python - here are the most mainstream examples of syntax that doesn’t look alien.

mseepgood
0 replies
7h44m

They don't have any syntax that differs from the previous Go versions.

tapirl
3 replies
3h6m

Don't forget that the semantic change of traditional 3-clause "for" loops: https://go101.org/blog/2024-03-01-for-loop-semantic-changes-...

Because of this change, Go 1.22 is actually the first Go version which seriously breaks Go 1 compatibility, even if the Go official doesn't admit the fact.

dgb23
1 replies
2h11m

Are there cases where people actually rely on the previous behavior?

I always assumed that it was considered faulty to do so.

rsc
0 replies
49m

There were certainly buggy tests that relied on the old behavior. We didn't find any actual code that relied _correctly_ on the old behavior.

https://go.dev/wiki/LoopvarExperiment

kiitos
0 replies
1h38m

since Go 1.22, every freshly-declared loop variable used in a for loop will be instantiated as a distinctive instance at the start of each iteration. In other words, it is per-iteration scoped now. So the values of the i and v loop variables used in the two new created goroutines are 1 2 and 3 4, respectively. (1+2) + (3+4) gives 10.

I think you are assuming more guarantees than are actually guaranteed.

You have a well-documented history of making incorrect claims about Go compiler and runtime behaviors, so this isn't surprising.

since Go 1.22, you should try to specify a Go language version for every Go source file

What on Earth?? Absolutely 100% not.

paride5745
0 replies
5m

I wish they would opt for ARC instead of a GC, to have a more deterministic memory objects lifecycle.

Other than that, I agree with your comment.

alphazard
26 replies
20h10m

I don’t believe that the “BDFL” (benevolent dictator for life) model is healthy for a person or a project

It's interesting that the best projects have BDFLs, and that the best BDFLs are skeptical of their own power.

darby_nine
18 replies
19h21m

I don't think this is true. Python had a BDFL and it didn't seem to benefit much from it. I'm not sure what other projects this attitude draws from. Off-hand I'd guess it causes less drama but no appreciable increase of quality, just like other forms of bureaucracy.

Meanwhile there's entire landfills of failed projects with single owners who couldn't bend enough. We just don't find this worth discussing.

Of course this won't happen, but a man can dream.

anamexis
8 replies
19h9m

Linux/Linus Torvalds stands out as another notable BDFL.

darby_nine
6 replies
17h49m

I'm not intimate with Linux as a project, but this is an attractive argument for it. Unfortunately my main experiences with Torvalds are motivated by his chewing out people on mailing lists for something stupid they said rather than fending off varied interests, which makes him look far more petty than competent.

arp242
4 replies
17h18m

Only those instances make the news. And then get repeated time and time again. It's a super-biased view not at all representative of his day-to-day behaviour.

Also I've never seen Torvalds "chewing out people on mailing lists for something stupid they said", it's always been someone breaking something or something along those lines. That is: doing stupid. And it's also experienced maintainers Torvalds feels should have know better.

You can like or dislike Torvalds' style, but this little student from Finland created the world's most successful open source project, so I think he's probably doing one or two things right.

He may not be perfect, but being hung up over a few incidents over a 30-year time period is perhaps not too brilliant, and insinuating incompetence over this is quite the take. Imagine every outburst you have is public and pointed to for years to come.

Capricorn2481
2 replies
4h15m

it's always been someone breaking something or something along those lines

Not only is this a complete lie, but God forbid there's a process in place to catch these things instead of verbally abusing your coworkers for making mistakes, which Linus has done himself.

Imagine every outburst you have is public and pointed to for years to come

You may be surprised to learn that the rest of us don't talk to anyone like this.

but being hung up over a few incidents over a 30-year time period

That's a great way to make it sound old but he actually gets angrier as time goes on. https://lkml.iu.edu/hypermail/linux/kernel/1510.3/02866.html

lakdna
0 replies
3h44m

You may be surprised to learn that the rest of us don't talk to anyone like this.

The moral superiority is misplaced:

https://news.ycombinator.com/item?id=41017195

But I am not surprised. CoC proponents universally do the same as the people they criticize. Only the application of rules is selective.

arp242
0 replies
2h43m

You may be surprised to learn that the rest of us don't talk to anyone like this.

You do. By outright claiming that I'm lying when I share what I've seen. Of course with no substance to back it up. Let me tell you: I've seen what I've seen. Have I seen an incomplete picture? Almost certainly. Am I wrong? Perhaps. Am I lying? No. Your post is extremely aggressive, pretty darn toxic, and explicitly the sort of stuff that's not appropriate here.

Do better next time. Doubly so if you want to get all high and mighty.

rectang
0 replies
14h54m

Torvalds also listened, learned and improved. If we want people to respond to constructive criticism constructively, it's uncharitable and counterproductive to pigeonhole them as they were at a point in time.

kfgahs
0 replies
8h52m

Linux started on Usenet, and that was the normal communication style. People simply did not take it seriously back then, it was understood to be partly humorous.

Linus doesn't even rant frequently either. People point to the same 10 messages over and over again.

He also tolerates when someone snaps back at him, unlike in projects with double standards like CPython where the old boys can do whatever they like but you are not allowed to criticize back or point out their numerous mistakes, segfaults, threading bugs and generally low code quality.

gunapologist99
0 replies
18h42m

And Daniel Robbins at Gentoo, who recently (and sadly) stepped down from Funtoo as well.

SatvikBeri
7 replies
15h18m

Here are some other projects that benefited from BDFLs in my opinion:

* Keras

* Ruby

* Clojure

* Zig

* OCaml

* Vim

* Elixir

I think all of these have ended up being unusually coherent. I may not agree with their design philosophy, but there clearly is one.

giraffe_lady
2 replies
5h23m

But php, one of the most notoriously chaotic mainstream languages, has a bdfl. And lua, arguably more disciplined than all of the ones you listed, has not.

hermanradtke
0 replies
3h56m

Rasmus is not the BFDL for PHP.

chuckadams
0 replies
2h56m

PHP is governed by an RFC process requiring a 2/3 majority vote of a couple dozen core devs. This has been the case for nearly 20 years now. Rasmus rarely even votes these days.

dash2
1 replies
12h31m

Conversely, projects without clear leadership include rust (recently) and R, and I think they suffer for it.

A very widespread system for organising people is to have a single responsible decision-maker, supported, monitored and advised by a committee. We see that through politics and business, and a lot of the best open source projects seem to do the same thing.

gpderetta
0 replies
10h6m

IMO C++ would have benefitted from having a BDFL for a bit longer as well.

kovac
0 replies
8h39m

Linux, OpenBSD? Perhaps to an extent Mutt too.

dgb23
0 replies
41m

A perhaps important clarification:

Many of those, including Linux as far as I know, simply started as projects that were driven by single authors with a strong vision and remarkable diligence.

Then people flocked to those projects, but with the understanding and appreciation of that vision.

I don’t think any of them wanted to be BDFLs for the sake of power. They were the original authors and _made_ something useful. I don’t think any of them took over an existing project and declared themselves dictators. Ironically they all would be way too opinionated to do so.

vbezhenar
0 replies
13h43m

Python became #1 language in the world. Which factors lead to this success is debatable, but leadership role can't be dismissed.

knighthack
1 replies
13h54m

I've noticed: competent people who aren't interested in leadership tend to make the best leaders.

As compared to people who want to be leaders, for the sake of being known as a 'leader', but have neither the competency nor accountability to be leaders.

singron
0 replies
3h51m

As long as they aren't so disinterested that they become absentee leaders. It's rare for huge successful projects you've heard of, but I think the typical project is more likely to have this problem, although maybe it's just incompetence too.

carapace
1 replies
18h3m

The whole idea is a joke, it's right there in the name. It was a recognition of the "facts on the ground" of GvR's role as the creator of Python, it was never seriously meant as a principle of project management. It's descriptive not prescriptive, eh? The idea got reified all out of hand.

rsc
0 replies
45m

The wording may be a joke but the concept is real and widely used.

saghm
0 replies
16h39m

Without taking a stand on the first half of that, I don't think it's particularly surprising that the best BDFLs are skeptical of their power. I'd argue the main benefit of having a single person with the power to make a unilateral decision is that it provides a way around the gridlock that tends to occur whenever there are a wide variety of stakeholders involved;. a project whose leader feels warranted to overrule decisions that have a strong consensus is a lot less likely to build up a community to the point that anyone is aware of the project.

riwsky
0 replies
3h29m

Remember when they tried to king George Washington?

groby_b
0 replies
19h40m

The only people worth having in power are the ones that don't want the power.

This extends well beyond OSS projects.

purpleidea
25 replies
22h2m

Huge news! I hope the new leadership remembers that keeping golang small and simple was its greatest strength. Adding generics was too much, and while I think there are some important small cases when it's valuable, in practice people are using it when they shouldn't. I'd also like to see less google control of the project.

I'm certainly thankful for golang as it made my https://github.com/purpleidea/mgmt/ project possible!

Thanks Russ!

p1necone
9 replies
16h17m

Adding generics was too much, and while I think there are some important small cases when it's valuable, in practice people are using it when they shouldn't.

Strongly disagree. Beyond very simple codebases lack of generics means either duplicating a bunch of code or eschewing type safety - neither of those things are particularly attractive to me. I can't imagine writing code in a strongly typed language that doesn't have support for generics.

Even if you don't use them directly it's almost certain you're using libraries that would be forced to be less ergonomic or type safe because of a lack of generics.

akira2501
8 replies
14h25m

or eschewing type safety

Type casts are checked.

that doesn't have support for generics.

We get first class functions and compiled closures with zero syntax overhead. It's entirely manageable.

or type safe because of a lack of generics.

Case in point: sort.Slice(). It lacks ergonomics, otherwise, entirely usable.

That being said, the generic version is faster and easier to use, so they are not without purpose, but they're not fundamental to large scale design either. Used without caution they can become a burden in and of themselves.

I like them just fine, but I could completely live without them.

zarzavat
7 replies
13h19m

BTW this kind of thing is why I don’t use Go.

Generics are a basic language feature for a statically typed language. Go needs a lot more features to be usable, like better error handling, but the ultra-conservative community that opposes any changes is a drag on the language and makes developing in it a miserable experience.

akira2501
4 replies
13h14m

needs a lot more features to be usable

I guess what I'm caught up on is the idea of "usable" is entirely subjective. To my eyes and fingers, Go has been fine without generics, and since their addition I've only used them once to clean up an odd bit of code around instantiating "module" like initializers.

and makes developing in it a miserable experience.

Subjective or not I find this a bit harsh. I spent years in an environment where C was the only option that could be used and Go is a complete dream compared to this. You may dislike the environments, you may find fault with them, but there are many examples of both of them being used to build large and complex systems that aren't completely "miserable" to work on.

I wonder if the split is something like "batteries must be included." I don't feel this way. I'm content to mine up Zinc and Copper and forge my own batteries if needed. I'm not at all put out by this.

lenkite
2 replies
11h12m

Please search/replace all `map[x][y]` in your Go projects with `map[sting]interface{}` in order to be honest and consistent with your opinion. And explain to all your stakeholders that you have done so because generics is bad.

You have been using a generic data-structure since Go 1.0 but did not realize this.

akira2501
1 replies
9h31m

in order to be honest and consistent with your opinion

Did you mean replace `map[string]string` with `map[string]interface{}`? You should take a look at Go's runtime map code. This is not a "generic" data structure. It's an unsafe data structure with some thin compiler sugar on top of it which is also something worth taking a look at.

For example see how it handles something like `m["x"]` versus `m[12]` or a map using structs as keys. Put it in Godbolt then chase down the various runtime implementations you encounter. Unless I'm misunderstanding you, then I apologize, but what else did you mean?

explain to all your stakeholders that you have done so because generics is bad.

I also write code based upon engineering principles and not on the difficulty of explaining it to my peers or customers. I'm more concerned with the results they experience when they use the software.

generic data-structure

What we call "go generics" has nothing to do with "typed go maps." To the extent that I've needed something "generic" up until they were formally introduced into the language careful interface design was enough to cover 90% of use cases. For the ones that weren't a map holding a function which wrapped a type-checked cast operation did the rest.

So all we're left with is the ability for the current go generics to automatically populate functions into your compiled image based upon instantiated and optionally constrained type usage rather than some explicit and planned mechanism implemented through interface.

lenkite
0 replies
8h59m

Apologies for the stupid typo. Anyways, I think we will need to simply agree to disagree because of this statement:

I also write code based upon engineering principles and not on the difficulty of explaining it to my peers or customers.

I believe that difficulty of explaining code to "my peers or customers" is a basic engineering principle.

Also, I consider what the compiler does behind the scenes as irrelevant as long as you have reasonable performance and usability qualities. That's one of the fundamental principles of abstraction after all.

Btw, the inventor of the C programming language also said this. Dennis Ritchie -> "Code should be written for humans first, machines second"

rob74
0 replies
10h37m

Interesting that they write "I don't use Go" but are still convinced that "developing in it [is] a miserable experience". So, which one is it now? I think many people would be positively surprised if they tried Go approaching it with an open mind, but all the FUD spread on HN and similar forums prevents that...

trustno2
0 replies
11h0m

error handling is what I like about go.

ok errors.As is a little stupid, I'll give you that. But that's all.

illusive4080
0 replies
4h53m

This is why I prefer Rust over Go. Go is far too simple.

arp242
7 replies
21h31m

I'd also like to see less google control of the project.

What does this even mean? Google basically just finances the project, but doesn't really "control" anything, never mind that "Google" isn't a monolithic entity in the first place.

purpleidea
6 replies
21h22m

They could be a non-google employee. They could let the community vote on who new leaders are, etc...

arp242
4 replies
20h45m

They could let the community vote on who new leaders are, etc...

Who is "they"? Who is "the community"? Who qualifies for a vote and who doesn't? I never contributed any code to the Go compiler or stdlib, but have contributed to some aspects of the "wider ecosystem", including some things that see fairly broad usage, and am (coincidentally) wearing a 2018 GopherCon t-shirt as I write this. Do I qualify? Does someone who has been writing Go for a year qualify? A week? Someone who never even wrote Go code? Someone who sent in a single patch to stdlib? And how do you verify all this?

Saying "let the community vote" is easy, but if you think about it for more than a second you will realize there's tons of difficulties and that it doesn't really work. I also don't really know of any project that works like this: it's pretty always a fairly small group of "core contributors" that get to decide.

tempest_
3 replies
20h5m

What do you mean it doesnt really work? There are a large number of programming languages and open source projects and a large number of approaches to this problem.

Python, Postgres, Rust..

A small amount of core contributors doesn't mean they all have to come from a single corporate entity either.

The notion that only Google could shepherd a programming language is hilarious.

arp242
2 replies
19h50m

The notion that only Google could shepherd a programming language is hilarious.

I never said anything of the sort. I said that "let the community vote on who new leaders are" doesn't work. Python, PostgreSQL, and Rust don't work like that either; it's just members of a fairly small "core team" that can vote, or some variant thereof. I have no inside knowledge here, but I'll stake a good amount of money that the Go core team had a lot of discussions about this, and de-facto, it's more or less the same as having a vote – except maybe a bit less formal.

And Go would obviously be fine without Google, just as Rust was fine without Mozilla. But why bother? It's working fine as it is and Google wants to spend the money on developer salaries, so why not let them? People get far too hung up on "Google bad". I say this as someone who doesn't even have a Google account or Chrome installed.

tempest_
1 replies
19h46m

I think Googles good will in recent years is the problem.

I think Rust is better divorced from Mozilla, and Go would be better if it was divorced a bit from Google for a lot of the same reasons.

arp242
0 replies
18h55m

I think Googles good will in recent years is the problem.

I don't really follow what you mean with that.

People keep going on that Big Tech needs to invest more in open source projects and maintainership. "But no, not like that!" Hmkay...

In the end, the people doing the work get to decide. That's how it works everywhere. Go originated at Google and many (though far from all) of the core people working on it are still paid by Google. The people doing the work seem to have no problem with this relationship, so standing on the sidelines shouting "no no, do the work differently!" is not really brilliant IMO.

And as I said, I don't see Google "controlling" anything. What does that even mean? Larry Page deciding what happens in the next Go release or something?

bborud
0 replies
9h1m

It is tempting to look at the election in the US and ask what will determine the outcome - who has the policies that will make peoples lives better or who can come up with the most effecive derogatory nickname for the opponent and stoke the most fear.

I've worked at Google, I've used Go for about 8 years at this point and I've met a few of the key Go figures at some point. I have to say that I have _no_ idea who would be best to run the project. And neither do you.

This isn't politics where the winner gets to vanquish their enemies and make themselves and their friends and family rich. It's developing and maintaining a programming language. The only real reward you'll get is admiration IFF you do a good job. Do a crap job and you ruin the project and/or become a pariah.

I would rather have those people who make up the core leadership tell me who should run the project since they not only know the technology, but they know the people and they know how to provide continuity. Continuity and discipline is all-important.

I'd prefer it if whoever runs the project works for Google since that is where Go was born. In part for continuity reasons and that Google has proven to be a very good home for Go, but also because it is good to have direct access to an organization that has resources to support you.

dblohm7
3 replies
21h16m

Adding generics was too much

I strongly disagree. Sure, like anything in programming, generics can be misused. But even comments can be misused!

OTOH I am able to build things in Go with generics that I would not be very happy building without them.

nasretdinov
0 replies
20h59m

Yeah I agree. Due to Go's slow moving approach we'll see the biggest impact of generics much later, when they become more prominent in the standard library. A lot of those APIs are necessarily not type safe now and generics would close that gap quite nicely

jen20
0 replies
14h19m

But even comments can be misused!

And arguably are in Go, where they are used for all kinds of things that are not inline documentation!

gary_0
0 replies
17h32m

The thing people dislike, I think, is that actually implementing generics and handling all the syntactical and compilation edge cases is complicated and ugly.

But generics as a high-level concept are wonderfully simple and useful ("let me use different types with certain code constructs without having to manually duplicate them, and stop me from doing anything that doesn't make sense"). It would be a far easier call for languages to add them if they were just a bit of syntactic sugar instead of a whole new section in the manual. (I do think adding generics was a good call; practicality trumps a fussily clean design, in my book.)

simonz05
2 replies
21h57m

I'd also like to see less google control of the project.

That doesn't look like is going to happen — the leadership change announced here seems to me to continue on the Google path. Both Austin and Cherry are relatively unknown outside Google and are to my knowledge not active in the community outside Google.

rsc
1 replies
21h40m

Both Austin and Cherry are relatively unknown outside Google and are to my knowledge not active in the community outside Google.

I don't believe this is true at all. They are both highly active in external Go development, far more active than I have been these past few years. (It's true that neither gives talks or blogs as much as I do.)

simonz05
0 replies
21h13m

I understand and respect your perspective on Austin and Cherry’s involvement in the Go community. Their contributions may indeed be less visible but still impactful. However, the community’s perception of leadership is crucial, and visibility plays a big part in that. For instance your long form blog adds context to decisions you’ve taken in the past. I hope their active roles will become more apparent, fostering a stronger connection with the broader Go community.

hgyjnbdet
14 replies
20h48m

Out of interest, why are people so confident in Google when it comes to Go, yet every other day there's articles about how Google can't be trusted in related to Dart/Flutter which are soon to be abandoned?

nu11ptr
5 replies
20h37m

Google can't be trusted in related to Dart/Flutter which are soon to be abandoned

source?

patmorgan23
3 replies
20h16m

Off the top of your head, name 3 projects/apps that use Dart/Flutter, now do the same for go.

bitpush
1 replies
20h3m

If you cant name 3 projects/app that use Dart/Flutter that just shows your bias.

Can you name 3 apps/projects that use COBOL?

-- This is akin to asking, "Quick, name 3 books written in Persian. Huh, you cant name them? Must be a dead language"

randomdata
0 replies
11h32m

> Can you name 3 apps/projects that use COBOL?

Does this imply that you see COBOL as having a trustworthy future, making it a great choice for a new greenfield application?

bufo
3 replies
20h44m

Because Go has massive traction both inside and outside of Google, whereas Dart/Flutter never got big traction.

surajrmal
2 replies
15h33m

Dart only found a real good use case fairly recently. Given its explosion in usage since then, I think it may very well be more popular that go in several years.

smithcoin
1 replies
2h54m

Curious- what is the use case?

hgyjnbdet
0 replies
1h6m

I think they mean Flutter, and Darts truly cross platform abilities.

tedunangst
0 replies
16h3m

At any point in recent history, I would have been pretty happy sticking with the last release of go for quite some time. Flutter always feels like it's the next release that's going to be the good one.

quectophoton
0 replies
2h28m

I don't trust Google.

I trust specs[1], multiple implementations[2], and how easy it is to bootstrap a compiler[3].

[1]: https://go.dev/ref/spec

[2]: https://gcc.gnu.org/onlinedocs/gccgo/ (even if feature parity isn't quite there yet)

[3]: Instead of requiring double-digits compilation steps that each take too long to be reasonable.

euroderf
0 replies
9h8m

I get an early-UNIX / Bell-Labs vibe from the entire Go project. New Jersey all the way. The ecosystem is too sleek and practical to abandon. My 0.02€, ymmv.

arp242
0 replies
20h37m

I don't really know anything about Dart or Flutter, but they're entirely separate teams within a huge organisation. It's entirely possible that one team does an excellent job, whereas the other doesn't. I keep repeating this: but "Google" is not a monolithic entity. People aren't "confident in Google", they're "confident in the people working on Go" (or not: you can decide that for yourself).

hankman86
10 replies
12h36m

Does Google actually consider Go to be a success? I get the impression that it failed in what it set out to be: a successor to C/C++. Or put differently, Rust has eaten Go‘s lunch.

jeffrallen
3 replies
12h29m

A goal of Go was to put working on complex distributed systems within the reach of the junior people Google had access to in the quantity they were hiring. To whit, the kind of people who would have been able to work on a big Python system with 3 months ramp up or on a big C++ system with a year of ramp up.

It is pretty clear that with respect to that goal, Go is a success. It has attracted Python programmers who need type safety and performance. Someone with no Go experience could land a useful new feature in a big Go program in 3 months.

Introducing a junior person to a large Rust system would still take a year, because it is so much more difficult than Go. Which means to me that if Rust had been aiming at this same adoption goal (it wasn't) it would not have succeeded where Go did.

weinzierl
1 replies
10h28m

"Introducing a junior person to a large Rust system would still take a year, because it is so much more difficult than Go."

A recent study done at Google disagrees with this assessment.

""it takes about the same sized team about the same time to build it, so that's no loss of productivity",

said Google's Director of Engineering Lars Bergstrom about porting Go to Rust in the talk https://youtu.be/6mZRWFQRvmw?t=27012

tm-guimaraes
0 replies
7h42m

Time to build a new system and time to onboard a new team member without professional experience in a given language are 2 very difficult things.

Go is much more optimised for quick onboarding, fast feedback, more “code look” consistency across projects then rust.

Now a team that knows both rust and go well might have the same proditivity in rust and go (maybe even more in rust), but with lots of changes in personell, specifically in quick growing departments, go can make a huge difference.

This is obviously just an anecdote, but i’ve seen more companies or departments running mostly a go backend stack, having job postings saying “no go experience required”, than the equivalent other companies (or departments ) focused on any other lang.

zozbot234
0 replies
10h51m

Introducing a junior person to a large Rust system would still take a year, because it is so much more difficult than Go.

Do you really think large Golang codebases are so easy to survey? I could see the argument wrt. C++, but Rust actually has a great featureset for programming "in the large". Take a look at the k8s codebase for an example of a large project that's written in Golang - doesn't seem all that easy to get started with.

randomdata
2 replies
11h57m

Go was never intended to be a C/C++ successor, it was intended to solve a class of problems that Pike and gang experienced in the software they worked on. Which is to say network servers. What you are probably remembering is that they assumed from their unique Google lens that it was C++ developers who had those same problems and would see it as an alternative to C++ when faced with those problems, but it turned out that in the "real" world people were writing network servers in Python and Ruby, not C++.

Which isn't surprising to the rest of us. If you remember the days before Go, every second thread on HN was about how "company X", including the company now known as X, saw their Ruby network servers completely falling down under load, forcing a rewrite in whatever the language du-jour was that day. But Googlers tend to live in a completely different bubble with respect to the way software is written.

rob74
0 replies
10h46m

If I remember the legend correctly, the idea for Go was initially conceived while waiting for a C++ program to compile. Not sure about any of the other stuff, but they definitely got the compile times right...

mike_hearn
0 replies
9h55m

Well, a lot of servers are Google are (or were) written in Java not C++. As a GCd language, arguably Go competed with Java internally moreso than C++. One of Go's flagship projects (Kubernetes) started out being written in Java for example.

weinzierl
0 replies
12h24m

This is an interesting question, but I doubt you will get a satisfactory answer here and probably anywhere. There is probably not even a uniform opinion about this within Google.

What I am more curious about is how much actual use Go has within companies and especially Google. What is the percentage of Go within their monorepo? How much of Google search is powered by Go?

trustno2
0 replies
11h4m

One guy that did ML in Google told me that Google indeed tried to use Go for ML problems, then realized it's too slow and went back to C++ there.

remus
0 replies
6h23m

I guess it depends on how you define success, but given there's a lot of people writing a lot of go code inside and outside of google over the last 15 years it seems likely it's doing a decent job at solving problems for those people. I'd call that a success.

dondraper36
6 replies
21h32m

rsc, thank you very much for all the hard work on the language that brought me into software engineering.

Despite playing around with several programming languages, Go still feels like home.

The development experience is terrific and I really appreciate how unapologetically simple and responsible the language and its creators have been.

Good luck and all the best in all your endeavours!

rsc
5 replies
21h16m

rsc, thank you very much for all the hard work on the language that brought me into software engineering.

You're quite welcome, and thank you for this comment. I never expected when we started that Go would have such a positive impact on people's lives, bringing new people into programming and software engineering. That's definitely the impact I'm most proud of.

xh-dude
0 replies
30m

Thanks for helping the OEIS site stay alive. I was absolutely delighted by it the first time I visited it, decades ago. Equally delighted when I visited recently and saw some “Russ Cox” contributed.

slekker
0 replies
10h41m

Thank you very much rsc! Golang not only helps me feed my family but also I created many friendships from using it :)

geoka9
0 replies
20h30m

Thank you guys from another fan! Go literally saved my career as a software dev: got burned out around 2014, tried Go as therapy and have been a happy gopher ever since :)

captainkrtek
0 replies
15h4m

Same sentiment as the above poster. I’ve been working with Go since 2014, after using many languages before, and none match the ease and efficiency of development for my work. Thank you so much!

apitman
0 replies
12h52m

I've been programming for 20 years and Go has proven to have more gravity than any other language I've used. When I just need to get something done, it's what I reach for. Thank you for your part in building such a useful tool.

amiga386
6 replies
17h2m

    thanksStr := "thank you rsc"
    ret, err := sayThanks(thanksStr)
    if err != nil {
        return nil, err
    }
    return ret, nil

cocok
4 replies
11h58m

Can anyone familiar with Go explain why not

  return sayThanks(thanksStr)
I've seen this "if err != nil" pattern before, but I can't help thinking that it's not necessary.

"return ret, nil" ignores err's value, which is nil anyway.

"return nil, err" ignores ret's value, but why? If the caller checks for err before doing anything with ret, it doesn't hurt having ret always passed up.

4 extra lines only to lose the value of ret in case of error.

tptacek
0 replies
11h53m

You can golf it down to

    return sayThanks("thank you rsc")
without losing anything, but then it could just as easily be JS.

randomdata
0 replies
11h27m

It's a joke about how every contrived Go example posted to the internet is in that vein. You wouldn't blindly pass something up the stack like that in a real application. Well, maybe if you hate other developers for some reason.

denysvitali
0 replies
11h50m

In this case, the if err != nil is completely useless.

Usually the pattern is used to perform better error handling (wrapping errors) or in case you call multiple functions that might return an error.

In this case, your suggestion is actually what I would expect to see

amiga386
0 replies
3h58m

It's not needed if it's just on its own, but Go's error handling makes it necessary when chaining functions, which is why you see it so often.

Imagine in Java or Python or C# or ... many languages that use exceptions to handle errors:

    return a(b(c(arg)));
...where a(), b(), and c() can throw some kind of exception, so you don't have to handle them then and there. In Go there aren't exceptions, all error handling is explicit and handled conventionally by returning an error as the last (sometimes only) return value, which isn't composable, so you get:

    cVal, err := c(arg)
    if err != nil {
        return nil, err
    }
    bVal, err := b(cVal)
    if err != nil {
        return nil, err
    }
    return a(bVal) // the final call can be simpler
That's the minimum verbosity required. Since Go 1.13 (2019), they officially added the concept of "wrapped" errors (aka "cause" in languages with exceptions) so instead of returning err you can return errors.Wrap("error in the a-b-c function calling c", err). But nonetheless, _every_ level of the call chain has to wrap or pass on all errors with explicit code. Go does have panic() and recover() which allow for exception-like error handling but it's not idiomatic to use them for normal error handling, go wants that to be explicit.

As for why "return nil, err" rather than "return ret, err"? Because while the caller _should_ check for errors, sometimes they just don't.

    ret, _ := abc(arg) // just ignore the error
    ret.DoSomethingFun()
You as callee don't want to get the blame if you've _partially_ filled an struct because you returned early with an error, and it's then usable but causes a crash because it was partially initalised, because someone ignored the error they got when creating it. That hides where the problem really was. Better to return an empty value, default value or nil.

glii
0 replies
1h47m

Don't forget the context string so you can "unwind the stack" from the error message:

  return nil, fmt.Errorf("expressing gratitude: %w", err)

999900000999
5 replies
18h5m

Thank you.

Golang is easily one of my favorite new languages. It's fast and clean without the difficulty of Rust. I was able to create a small mobile app with Chat GPT without any real experience in Golang.

I would like better mobile and gaming frameworks though. Although I really like Flutter, I think Google missed a major opportunity to use Golang instead of Dart.

What's next? Any good for native Chrome support?

38
3 replies
17h41m

I was able to create a small mobile app with Chat GPT without any real experience in Golang.

so you didn't really create it then did you? ChatGpt created it for you.

999900000999
2 replies
15h56m

I'm shameless when using Chat GPT to assist with personal projects.

It's just another tool.

38
1 replies
14h48m

right but at this point you're not even using your brain anymore, so you really dont have any place in a discussion about programming languages.

999900000999
0 replies
4h26m

I'll put it this way, the same doesn't apply with Rust.

I don't feel ashamed that I didn't manually come up with sorting algorithms. I was able to make a small Golang project and I had fun.

fuzztester
0 replies
17h11m

I was able to create a small mobile app with Chat GPT without any real experience in Golang.

I would like better mobile and gaming frameworks though

er, try asking chatgpt to create them for you.

jgowdy
4 replies
13h57m

Is the new tech lead more likely to get rid of the glibc-isms that Golang won't let go of, like crashing if non-ELF standard parameters like env aren't passed in ELF library initialization, or maybe supporting global-dynamic thread local storage so we can dlopen() shared objects made in Go on platforms that don't hack like glibc?

Go's obsession with glibc-isms is really unfortunate, and it's been many years. If you're using Go with containers on Alpine/musl, keep your code very vanilla, because they won't support you.

liveoneggs
1 replies
5h20m

golang's priority is "works inside of google" and everything else tends to be a bit of a fight

rsc
0 replies
36m

This is definitely not true. "Inside of Google" would have been just linux/amd64 for a very long time. Now it includes linux/arm64 too, but that port happened before Google needed it. And all the other ports are not used inside of Google, except maybe the Mac port if you count developers laptops.

jgowdy
1 replies
2h53m

Here are some citations since people seem to be just downvoting because they don't like the message:

Go requiring non-ELF standard parameters for initialization of supposedly "C ABI" libraries, open since 2015.

https://github.com/golang/go/issues/13492

The Go project specifically acknowledging the glibc-isms here:

"All Linux first class ports are for systems using glibc only. Linux systems using other C libraries are not fully supported and are not treated as first class."

https://go.dev/wiki/PortingPolicy

Go only supporting static-init thread local storage, and thus their "C ABI" libraries can only be dlopen()'ed if the libc pre-allocates memory to hack in libraries later.

https://github.com/golang/go/issues/54805

rsc
0 replies
38m

If you just want to run Go programs on Alpine, it works fine. (I put some effort in back in Go 1.21 to make sure that the downloaded binary toolchains for Linux even work fine on Alpine.)

If you want to use c-shared mode and dlopen, then yes that only works with glibc, but that mode barely works at all anyway. It's not actively supported at all.

jjice
1 replies
20h38m

Incredible blog. I've said it on this site before, but his series on regular expressions is insanely high quality and the fact he just posted it there for all of us is a huge privilege.

mikhailfranco
0 replies
5h20m

Yes, I certainly benefitted very much from the series.

Here is the first episode - devastating, convincing, easy to understand and very well written:

https://swtch.com/~rsc/regexp/regexp1.html

furyofantares
1 replies
18h33m

This is the first time I'm noticing that rsc would be an initialism for the blog.

rsc
0 replies
45m

Me too!

mseepgood
3 replies
21h8m

Please make more Ivy videos

remus
2 replies
6h19m

I think you might be thinking of Rob Pike's project, unless Russ has been involved?

https://github.com/robpike/ivy

bear8642
0 replies
4h17m

Russ has indeed been involved, he's done various videos solving advent of code using Ivy.

Russ has also got a pull request to add an operator, see https://github.com/robpike/ivy/pull/83

rtpg
2 replies
14h30m

gofmt probably has alone saved so much time across the world (and is upstream from every other language ecosystem basically saying "ok let's just autoformat").

I hate what autoformatters do to my code, but I love not having to talk about spacing anymore.

rob74
1 replies
10h43m

Interestingly enough, I hate autoformatters (and use spaces instead of tabs) in every other language, but in Go you just get used to the way gofmt formats your code from the beginning, and then start to appreciate that you don't spend as much time on it anymore, so it's not a problem (at least for most people).

arp242
0 replies
6h3m

I've seen a number of autoformats for other languages be way too obsessive about formatting every little detail and edge case, to the point where it just becomes silly. 100% consistency is a fool's errand, and also contributes very very little Once you deal with some major issues (braces, spacing) you very quickly get diminishing returns.

nasretdinov
2 replies
21h3m

Russ gave us proper vendoring and generics: two things I thought I'd never see in Go... Thanks a lot for the effort!

valyala
0 replies
8h51m

While vendoring is great, generics is bad addition to Go, since they complicated Go type system too much [1]. This makes typical Go code with generics hard to read and hard to maintain.

[1] https://go.dev/blog/type-inference

bruckie
0 replies
19h24m

Ian Lance Taylor did a lot of the work on generics, too. Thanks to both, and the rest of the team!

zakki
1 replies
1h35m

Any reference for a website or book that introduce Go for a beginner in depth?

xyst
1 replies
21h4m

I think the only reason I used go at some point was because of Russ Cox. Have joined the dark side and switched to rust ;).

Wonder what he’s going to do next? Maybe just moving around within G? or another OSS project within G?

dochtman
0 replies
20h41m

The post actually contains some references to what he’s working on next, some kind of LLM agent to facilitate software development processes?

philosopher1234
1 replies
11h42m

Boy, this makes me sad. He’s really changed my life, I’ve learned so much about software and programming from his writing and thinking. I wish it didn’t have to happen, but I guess it’s only ever a matter of time.

rsc
0 replies
41m

Happy to hear that. Still going to write and think. :-)

klartd
1 replies
19h22m

Thanks for all the Go contributions!

I disagree on one point that has nothing to do with Go. Python has not benefitted from GvR stepping down. The new "leadership" is non-technical, tyrannical and has driven almost all true open source contributors away.

Development has stalled except for the few corporate contributions of doubtful quality. The atmosphere is repressive and all that matters is whether you have a position of power at Microsoft/Instagram/Bloomberg.

It is not necessarily the fault of these companies. They may not know that their generosity is being abused.

zmj
0 replies
20h5m

Thanks Russ! Putting tooling on a first-class basis was revolutionary, and it's still Go's standout feature.

wejick
0 replies
17h22m

Thanks RSC, since the past 8 years I really enjoyed working with Go. It's my first experience following a programming language development, all the proposals, debates and how all of them were handled.

tschellenbach
0 replies
22h11m

Thank you, amazing language :)

throwawaygo
0 replies
22h4m

I have so many disagreements on goals for the language with Russ, but have been a fan since his early days of writing the regex package and the c-to-go conversion code. Glad to hear he will still contribute to the lang, and hoping for a bit different direction from the new leads.

skywhopper
0 replies
21h58m

Russ has done a great job of shepherding Go through over a decade of growth and maturity and has led a ton of fantastic additions to the language and built a strong pattern of excellence in how language changes are considered and made that should serve as a shining example for the future of Go as well as any other language out there.

And now he’s continuing the stretch of outstanding leadership by passing the torch. I can wait to see what the next 12 years of Go brings. Thanks for your service, Russ!

simonz05
0 replies
21h46m

https://www.youtube.com/watch?v=wwoWei-GAPo — Project has come a long way since this. Happy that it's still around and thriving. I don't think we expected that in 2009. I don't believe Go would have been where it is without Russ. His contribution to the project has been tremendous.

Thanks Russ.

shoggouth
0 replies
21h54m

Thanks for working to create such a great language!

septune
0 replies
21h10m

Thanks Russ and infinite kudos to you

rollulus
0 replies
21h52m

Since rsc frequents HN: I’d like to thank you for all the work you’ve put into this great language. Peak HN hype cycle I decided to pick up Go and never regretted it. Thank you.

meling
0 replies
21h42m

Thanks Russ for your great leadership and contributions to the Go community. I’ve always enjoy your talks, blogs, and your many contributions to the language. Looking forward to your future contributions to the language and ecosystem.

lagniappe
0 replies
14h26m

F

igmor
0 replies
21h17m

Go team has built a remarkable tool under your leadership. A tool that moved a niddle to the better side of things for the industry. Thank you and God speed!

iJohnDoe
0 replies
15h23m

Want to say thanks to anyone and everyone that made Go happen. It’s been my language for a while now and I appreciate what it has made available to me.

hu3
0 replies
15h58m

Go changed the way I think about concurrency.

Being able to use channels in a modern programming language is such a gift.

rsc thank you for all your contribution to our field. You blog posts also taught me a lot.

denysvitali
0 replies
11h49m

Thank you for all your work Russ!

declan_roberts
0 replies
20h14m

There are features of the Go toolchain that I consider to be a requirement in all future languages.

For example, if a language doesn't come with a built-in formatter that's a huge red flag. Go broke the tyranny of style discussions.

Easy static binaries is right up there for all new languages.

Kudos to rsc and team for all the work that went into making a great language. Good luck on your next projects.

chmike
0 replies
1h36m

humor: I wonder if the upvotes are cheerings that he finally stepped down or a respectful salute. I give my respectful salute.

Go is awesome and I hope it will continue to progress in that direction. Thank you Russ Cox

calini
0 replies
6h59m

Thank you for making my career more enjoyable and productive, rsc! Go is a lovely ecosystem and I'm looking forward to see where it will Go :).

MaiVa
0 replies
14h7m

The Go community is incredibly lucky having had a person as lead with such outstanding technical skills and at the same time a great sense of strategic long term view. As this was not enough, I remember reading some discussions where I thought "Damn, this rsc guy has a lot of patience."

Go evolves slowly but steadily. No drama, no politics (external, I don't know about the internal), not social justice wars, just great technical and community work focussing on the thing at hand: A programming language and ecosystem.

DLA
0 replies
18h7m

Russ thank you so very much for your outstanding leadership, dedication, design wisdom, and technical contributions to Go. This language, its libraries and tools, and especially the Go community are incredible. You are a class act sir!