![]() |
|
![]() |
| I agree with you, though if you live in a Linux+podman world, you can literally scp whole containers, so at least we made some progress. |
![]() |
| It's like what, $0.01 per GB these days? I bought a 2 TB NVMe for Linux 4 years ago, on which I also game, and it's 50% full.
Disk space hasn't been a serious concern in two decades. |
![]() |
| As opposed to writing everything from scratch? Python has a huge standard library. Making it bigger to avoid dependencies would add more bloat to the distribution. |
![]() |
| Oracle requiring commercial licensing for their JVM has made it so radioactive that my workplace firewalls "oracle.com" to prevent anyone from accidentally using it. |
![]() |
| IMHO, that's not part of learning the language. You don't really even need half of the packages you mentioned unless you don't know the language and, instead, rely upon third-party crutches. |
![]() |
| > read the second quarter of the book
And then never get to the third and fourth quarters because the practise you get from actually typing stuff is far more valuable? :) |
![]() |
| > in the sense that you never see a snippet of Go code and think "wtf, you can do that?" or "hang on, why does that work?"
I am extremely doubtful that this is true and would like evidence. |
![]() |
| I feel this way... very often.
* Init functions * Top-level variables being shared between all files in a package * For-loop sharing (fixed in 1.22 [0]) * ldflags (this is more of build behavior, but it took me a while to figure out how some variables were being set [1]. Note: Go does embed some data by default, but an app I was working on introduced more metadata) * Go build directives prevent IDEs/linters from analyzing a file at all. E.g. if you edit a linux-only file on macOS, you get _zero_ help. I dunno, there are a lot of other weird, confusing things that Go does. It is less than most other languages, though. [0] https://go.dev/wiki/LoopvarExperiment [1] https://www.digitalocean.com/community/tutorials/using-ldfla... |
![]() |
| That's true. I agree. Python is the only language I ever really learned to a deep level and properly, and it makes a huge difference! (And I'm still learning of course.) |
![]() |
| ChatGPT accelerates this timeline significantly. As a senior programmer you can largely skip the "junior" phase of the learning, almost like pair programming with a very proficient junior programmer. |
![]() |
| IME, engineers and "the discourse" when we argue on the Internet often conflate "ease of use" and "ease of learning". When we say "ease of use", we usually mean "ease of learning."
If you're a hobbyist, yeah, you should heavily value "ease of learning." If you're a professional, the learning curve is worth it if the tool's every day leverage is very high once you're ramped up. Too many developers don't put those 3-4 months in, in part due to the over-emphasis on "ease of learning" in our discussions/evaluations of things. I was a part of a very large go project (https://news.ycombinator.com/item?id=11282948) and go-based company infra generally some years ago, and go is emblematic of the classic tool that is amazing at ease of learning, and quite mediocre at "ease of use" as time goes on. I personally end up resenting those tools because I feel tricked or condescended to. (This is a little silly, but emotions are silly.) I'd wager this is also why Rust is a perennial "most loved" winner in the surveys: it gets better as your relationship with it deepens, and it keeps its promises. Developers highly value integrity over trickery, and hard-earned but deep value feels like integrity and wins in the long run. (other examples: VIM, *nix, git) |
![]() |
| Oh god why. I thought (and hoped) that GP didn't actually mean this.
I see how a team or an organization can eventually get to this point. It just saddens me that they got there. |
![]() |
| In practice that’s not too crazy. It’s fast easy to debug and works with most CI/CD tools.
If you ever want to work in teams that kind of setup works extremely well. |
![]() |
| Do you have experience implementing ETL pipelines in Go? I think it'd be a better fit for us over our current language, but I'm curious to hear from people who've actually done it. |
![]() |
| Yes. It works fairly well. With that said, I've got a feeling that life would be a lot easier to change around if we weren't using it, we end up writing a lot of code to do relatively simple things. |
![]() |
| My experience is different to that.
I'd say people and businesses that best understand and balance risks against potential rewards are the most successful. I know a couple of skydiving accountants... Use of innovative tech in finance is one way for companies to gain an "edge" which can make them a lot of money. I wouldn't characterise people working in those particular areas as more risk averse. OTOH finance businesses (esp. those that manage other peoples money) are regulated and can't put new tech into Production without careful change control. But this evolves over time, and controls were looser in the past. There's a steady creep of regulation and control into tech used in finance outside and around IT: so called EUC (End-User Computing). This can be a source of "wrong tool for the job" syndrome. I've seen some hellish SQL written by non-IT people, but it got the job done. It's also an area where source code control, testing, and release processes are inevitably more human and error-prone. There is a culture clash internal to large finance between "move fast and break things!" and "nothing can change, ever - too risky!" This leads to a mixture of the very old and very new, and inevitably, more complexity. Achieving homogeneity once the heterogeneous is out of the bottle is very hard - attempts to do so often (always?) lead to a variation on the xkcd "Standards" situation https://xkcd.com/927/ |
![]() |
| I've almost entirely replaced Pandas with DuckDB in my day-to-day work. I wonder if it would be an easier lift for someone who is familiar with SQL, and doesnt want to pick up Pandas/Polars. |
![]() |
| This comment might finally push me to try DuckDB, thanks. I’m quite proficient with scientific python in general, but Pandas API is just alien (and slow). SQL is more natural for its domain. |
![]() |
| The author lists multiple reasons for this, but for me the biggest one is the first one: Go is good for almost everything.
I have extremely good productivity when using Go. Once your project exceeds 100 lines it is usually even better than python. And yes, I am aware that Rustians did a survey where Rust was crowned as the most efficient language but in my reality (which may differ from yours) Go is simply the best tool for most tasks. Why is that? Well, for me there are 3 reasosns: 1. The language is extremely simple. If you know 20% of C you are already a Go expert. 2. The core libraries are extremly well thought. 3. Batteries are included. The toolchain and the core libraries alone can do 90% of what most people will ever need. When people argue about the validity of these claims, I simply point them to this talk https://go.dev/talks/2012/concurrency.slide#42 |
![]() |
| Or servers, and about anything that really benefits from concurrency.
Even a lot of games could be made with go. The gc wouldn’t really kill the frame rate of a game unless you really push it. |
![]() |
| https://ebitengine.org/en/documents/install.html
For anything other than windows: > Installing a C compiler > A C compiler is required as Ebitengine uses not only Go but also C. I mean, even on platforms without cgo, it's it working magically? No; it's using https://github.com/ebitengine/purego, which is: > A library for calling C functions from Go without Cgo. Like... I mean.... okaaaay, it's not cgo, but it's basically cgo? ...but it's not cgo so you can say 'no cgo' on your banner page? If you're calling c functions, it's not pure go. If calls some C library, and it doesn't work on any other platform, its like 'pure go, single platform'. hmm. Seems kind of like... this is maybe not the right hammer for gamedev; or, perhaps, maybe not quite mature yet... Certainly for someone in the 'solo dev pick your tools carefully' team, like the OP, I don't think this would be a good pick for people; even if they were deeply familiar with go. |
![]() |
| Note that Go has very different GC behavior to what .NET GC and likely Unreal GC do. At low allocation rates the pauseless-like behavior might be desirable, but it has poor scaling with allocation rate and cores and as the object graph and allocation patterns become more complex it will start pausing and throttling allocations, producing worse performance[0].
It also has weaker compiler that prevents or makes difficult efficient implementation of performance-sensitive code paths the way C# allows you to. It is unlikely game studios would be willing to compensate for that with custom Go ASM syntax. Almost every game is also FFI heavy by virtue of actively interacting with user input and calling out to graphics API. Since the very beginning, .NET was designed for fast FFI and had runtime augmentations to make it work well with its type system and GC implementations. FFI call that does not require marshalling (which is the norm for rendering calls as you directly use C structs) in .NET costs ~0.5-2ns, sometimes as cheap as direct C call + branch. In GoGC it costs 50ns or more. This is a huge difference that will dominate a flamegraph for anything that takes, for example, 30ns to execute and is called in a loop. It is also more difficult to do optimal threading with Go in FFI context as it has no mechanism to deal with runtime worker threads being blocked or spending a lot of time in FFId code - .NET threadpool has hill-climbing algorithm which scales active worker thread count (from 1 to hundreds) and blocked workers detection to make it a non-issue. Important mention goes to .NET having rich ecosystem of media API bindings: https://github.com/dotnet/Silk.NET and https://github.com/terrafx cover practically everything (unless you are on macOS) you would ever need to call in a game or a game engine, and do so with great attention paid to making the bindings efficient and idiomatic. For less intensive 2D games none of these are a dealbreaker. It will work, but unless the implementation details change and Go evolves in these areas, it will remain a language that is poorly suited for implementing games or game engines. [0]: https://gist.github.com/neon-sunset/72e6aa57c6a4c5eb0e2711e1... |
![]() |
| A lot of times you want to be able to cmd+click on something and actually see what the hell the code actually does and not get dead-ended at an interface declaration. |
![]() |
| Uh. No. Why would I ever waste my time proving something I said? If I'm right, I'm right. If I'm wrong, you'll be sure to tell me. No reason for my involvement. |
![]() |
| That of course works, but the problem is then using this. Take a simple JSON like `{"list": [{"field": 8}]}`. To retrieve that value of 8, your Go code will look sort of like this:
And this is without any error checking (this code will panic if myjson isn't a json byte array, if the keys and types don't match, or if the list is empty). If you want to add error checking to avoid panics, it gets much longer [0].Here is the equivalent Python with full error checking:
[0] https://go.dev/play/p/xkspENB80JZ |
![]() |
| Sure, in production you'd definitely want something like that, but the context was an interview exercise, I don't think you should go coding generic wrappers in that context. |
![]() |
| Go has had a dict-like data type from the jump; they're called "maps" in Go.
Some of early Go's design decisions were kinda stupid, but they didn't screw that one up. |
![]() |
| I haven't looked too deeply into it but I came across https://github.com/ergo-services/ergo not too long ago and thought it could be pretty interesting to try using OTP in Golang
Packaging a Go service in Docker and dumping it into k8s is probably the easier/better understood path but also deploying Go services onto an Erlang node just sounds more fun |
![]() |
| There is no good reason to pursue a project like this (or if there is, it would be very surprising to me), so it would reek suspiciously of "not invented here". |
![]() |
| Also anything that requires interop/FFI, syscalls, and lower level stuff. It's extremely hard to record your screen on Go, for example. On Rust this is much more doable and there even are crates for it
It's not impossible with Go, though. There's an amazing windows impl here: https://github.com/kirides/go-d3d ...but if you look at the code, it's clear that you have to work against the language in some capacity |
![]() |
| Personally I don't find it great for prototyping. There's just too much boilerplate, which is why I use other languages for fun/personal projects. |
![]() |
| Is there much boilerplate aside from err checks and JSON tags? Even then, your IDE / copilot should automatically insert those along with imports and package names. |
![]() |
| Python upgrades are fine, actually. The python library ecosystem is a bit of a mess in general, which does affect this, but the tools have actually improved to make this more manageable lately. |
![]() |
| > What JVM do I use?
latest LTS (longterm-support) version, so currently 21, next 25 (late 2025). > Does it matter? new is always better > what if I have to install/manage multiple versions? > If I want to write a web service can I use vanilla Java stdlib or do I have to use Spring or some framework? Spring > If I use Spring, do I have to get into the weeds of dependency injection yes, but it's not hard (or I've done it long enough) > other complexity that might just be inherent complexity when have to deal with a webservice. personally I dislike have to configure security So basically go to Spring Initializr (https://start.spring.io/) pick the latest LTS Java&Maven (or Kotlin&Gradle-Kotlin) and You're off to the races. |
![]() |
| I agree with Go being simpler, but modern Java and Spring Boot is also fine. Backend programmers are spoiled with riches nowadays with all the completely workable options we have. |
![]() |
| Dependencies in Java are a pain in the ass.
Publishing libraries for your own consumption is even harder. Publishing libraries for world consumption means now you also need to be a PKI expert. |
![]() |
| Go has very little story when it comes to desktop or mobile GUI apps, which is too bad because it would be a very productive language for that kind of thing. |
A surprising number of people think this is a very long time. It isn't. This is typically the time it takes to understand enough of the language, the compiler, the runtime, the standard library, and idiomatic ways to do things. It is the time it takes to where you can start to meaningfully contribute to evolving how the language is used and meaningfully coach architects, programmers and system designers. It is also what you need to absorb novices into the organization and train them fast.