We all have varying degrees of exposure to Big Tech. Some of it seems fine, stable and can be relied on. Some of it feels like shifting sand under your feet. React seems to move a lot on whims, I don’t envy tracking that. Go seems like it might be fairly stable? With the current geo-political climate I don’t find massive corporations to be a guarantee for stability. People may be getting fired even though they chose IBM. The world is wild right now.
I personally think that golang falls more or less in the same category as typescript. Google has a track record of not addressing any community feedback and pushing their agenda, that can be seen clearly about them not addressing a critical issue of polluting types with nullable values, something that even old languages like c# managed to address.
Another case was when I stumbled upon the period when they were making an active effort of maximally constricting running embedded binaries in an android application. There was no logical reason anyone but google would benefit from such a limitation.
I notice this has been submitted to HN. If people want to upvote it then we can participate in such discussions as “What’s wrong with implementing ‘not being owned by big tech’ on the JVM?”
Just want to say for the record that this is something that matters to me a lot, and it’s one of the reasons I write Elixir every day. Thanks for keeping it real everyone
Elixir is small, Rust is big, Go is much bigger.
In terms of how often these languages used, Elixir has much smaller share than Go which is one of “default” languages for server-side web software. That’s a fact, I think no one here would argue it.
Why is it like this?
I think that two biggest things that Google did for Go were
- Created a brand of the language which is “made and used in Google”, “created by ex-Unix devs”. Those who want to be as successful as Google now rewrite their projects in Bigtable and Go (lets put aside the fact that it doesn’t work like it, because important thing is that people think that it does) and those who want to work in Google now learn Go.
- Provided top-level engineers core team with top-level salaries. I am not saying that Elixir/Erlang core team is not top-level, I am saying that they lack the Go budgets. They can’t just hunt the MIT students to implement the preemprive concurrency on unix signal handlers. They can’t just provide support for the Google-scale projects. If you open the OTP team blog on new JIT, they say that they chose asmjit as a backend because it was small enough to support and extend. At the same time Google supports LLVM and Go compiler which is written from scratch.
It is important to note that Go language itself is not a breakthrough and most of the feature it offers are pretty simple and well-known in the industry.
How it affects the industry?
Well, Go has broader share, more projects using it, more developers using it, thus more opensource, wider ecosystem. Important thing is that Go was born in Google, but it is now everywhere and even if Google disappears, the language will continue to live. And it all boils down to the key situation: when someone is making a decision about the language for their backend and compares Go vs Elixir it is seen as “default” vs “exotic” where Go is perceived as a less risky, “default” one language
If you are a huge company with an infinite firehose of cash it is not difficult to will a new programming language into existence. I think the first company to really do this was Sun, which spent hundreds of millions advertising Java back in the day. Twenty years later it totally worked - people still use it!
For the record, I think the biggest thing Go did was easy cross compilation. This is something we still really struggle with, and for the most part it relegates BEAM languages to docker containers on the server. There are tools like Burrito, which help, but it would be nice if we could natively bundle to an actual static binary. I am veering off-topic here, though
99.9999999% of Go is running on Linux servers. Most of it is x86_64 too.
I don’t know the real number, to be honest, but that’s my assumption xdd)
I don’t know if you are aware but direct linking to Hacker News submissions actually tend to mean incoming upvotes from that source gets ignored, and it might factor into whether a post gets blocked for vote manipulation/botting.
HN is weird and particular to avoid being too heavily gamed. I would prefer not linking the thread if you don’t mind. The site and the commenters is how it is but the spread is good and useful in promoting Elixir.
I suppose Oracle is slowly fading into no longer being a proper megacorp. Java will become indie eventually
Oh man, I did not know that. TIL and I’m sorry.
I think it’s very important to specify in the detail what is the actual issue. BEAM files are architecture agnostic, you could simply change the runtime for the right architecture and everything would work as expected. The problem comes from using native binaries, which are all the result of NIFs to c/c++/rust etc. All ecosystems that “cheat” in this way will suffer from this, python being a prime example. The easiest way to solve this is to have precompiled binaries for the right architecture and this is what a lot of projects that rely on NIFs are doing.
Even go itself suffers from this, just like rust. Once they try integrating with e.g. C they also need to fiddle around trying to handle the layers for cross compilation – the reason for people opting for zig to deal at that point to enable true cross compilation.
In my short golang career I’ve never dealt with libraries doing bindings to other native binaries but it makes complete sense, as the c ecosystem is a goldmine of libraries that were developed for 10s of years.
Indeed, the zig build system and compiler is truly an amazing effort in addressing such an old issue that everyone had to deal separately in each ecosystem. I used zig build system when just it just got released and it was already working pretty well with x86_64 and apple silicon, I can guess it’s only getting better now.
No worries
Oh! Off topic but this is me working from my couch today:
Was gonna say that it arrived and forgot (it’s been a month or so at this point).
EDIT: Despite my gaff in my previous post of linking HN when I shouldn’t have, I neglected to link in this one when I should have. Get @lawik’s shirts here.
It used to be Java vs C++, nowadays “kids” argue Go vs Rust
When the topic of programming starts, I feel like an old wizard who can explain computers since the dawn of vacuum tubes.
The shock on CS freshman faces when I explain scaling in Elixir is priceless, friends keep calling me Elixir cult member lol
Well I was trying to avoid going off-topic so I didn’t go into detail, but what I mean is it’s somewhat annoying to “ship” an Elixir/BEAM project as a binary. For example, databases like Tigerbeetle (Zig) or CockroachDB (Go) come as a static binary which is easy for people to install. On the other hand, something like RabbitMQ requires OTP to be installed on the server which can be annoying because distro packages are often old.
Obviously this is not the end of the world, it’s just a friction point. Go does this really well which is why I mentioned it.
Go is very popular for CLI tools which have to run on user machines. As a random example, Flyio’s flyctl is written in Go, probably for this exact reason.
Elixir (the language) would be a dream for writing CLI tools, but Elixir (the runtime) is not, unfortunately.
Oracle is a black hole into which hope, dreams, and copyrights enter never to return. Nothing that crosses that event horizon will ever be seen again…
As someone who never installed rabbitmq directly, looking at this on their site, this is a very strange requirement. Unless I am missing some details, this should not be relevant if rabbitmq were to bundle the runtime together with the software, you would have to download 30-40 MB more though.
At the same time if you are using elixir, simply using elixir releases will create a self-contained release that will not require you to install anything* on the deployed machine (cross-compilation of NIFs aside). Using that is not different in any way from having a single binary.
It’s also important to note that golang doesn’t have a proper VM and not even a part of features that BEAM provides, hence why it can get away with single binaries with their micro runtime embedded in each one of them.
Can you elaborate on that? It’s been the most stable library to work with in JS ecosystem from my experience.
Oracle is doing just fine AFAIK, their profits and stocks are steadily growing. You don’t see the things they do because they focused on the core business and remember that all the “cool” stuff was inherited from Sun, which went bankrupt because these cool stuff didn’t make them money.
It’s different because you have to build the release somewhere, and that somewhere has to match the target (as we all know). Remember the context in which I brought this up: I was talking about easy cross compilation.
I love Elixir but we can’t kid ourselves here, it’s not good for shipping a binary to users. That’s the only claim I was trying to make.
There are tools (Burrito) to do this which can at least build a static binary, but my understanding is that it has to be unpacked before it can be run. It does this behind the scenes, which is a big improvement, but it’s still not perfect.
Look at how Tigerbeetle ships their DB. It’s a single static binary with no dependencies at all which you can run under systemd or whatever. The nodes cluster with like 3 lines of CLI config. The entire database is stored in one (and only one) file which they manage completely themselves (with io_uring
no less). Upgrades are done by replacing the binaries on each server with the next one, after which the cluster seamlessly upgrades itself. Those guys have it down.