Lombok had a bunch of great things that should’ve been part of the java language to begin with. They’ve slowly been folded in (so now you have to work out which @NotNull annotation you want) but the language does still improve.
- 0 Posts
- 15 Comments
gedhrel@lemmy.worldto
Programmer Humor@programming.dev•How I, a non-developer, read the tutorial you, a developer, wrote for me, a beginner - annie's blog
22·4 months agoThe issue here is that the author of that post, and potentially the fictional author of the thing being lampooned, are not drawing a distinction between a tutorial (or an explanation) and a how-to.
Either you want to get a task done, or you want to spend a lot longer learning how to work that out for yourself.
(Many tutorials will include small set of how-to-like instructions because emulating the actions of a master will improve one’s vocabulary of what can be done as well as how it is achieved.)
I’ve a couple of GP friend who used to describe “Dr Google” as their online colleague.
The point being, they were somewhat trained in interpreting risk as opposed to the stereotypical googler-of-symptoms. Once upon a time search engines were quite useful.
gedhrel@lemmy.worldto
Programmer Humor@programming.dev•Everyone knows what an email address is, right? (Quiz)
1·5 months agoI kind of expected a lot of this; I remember the sendmail 4 book from back in the day when O’Reilly had that, DNS and BIND, and Perl as the entirety of its corpus.
And as for your specific question: typechecked code doesn’t get to production with a type error; it won’t compile. There’s a common phrase, “left-shifting errors”. It means catching bugs as early in the development cycle as possible. In terms of things like developer time (and patience), it’s far more cost-effective to do so.
I worked on OpenStack back in the day: millions of lines of untyped Python.
Let’s say you’ve got an X509 certificate. You know you can probably pull the subject out of it - how? Were I using Java (for instance), the types would guide my IDE and make the whole thing discoverable. The prevalent wisdom at the time was that the repl was your friend. “Simply” instantiate an object in the repl then poke at it a bit.
And it’s not just that kind of usability barrier. “Where is this used?” is a fantastic IDE tool for rapid code comprehension. It’s essentially impossible to answer for a large Python codebase.
Don’t get me wrong: python is still a great go-to tool for glue and handy cli tools. For large software projects, the absence of type enforcement is a major impediment to navigation, comprehension and speed of iteration.
gedhrel@lemmy.worldto
Programmer Humor@programming.dev•Whatever 'Clean Code' you write now, it'll be shit eventually and in need of a complete rewrite
1·1 year agoI’m coming around to it.
gedhrel@lemmy.worldto
Programmer Humor@programming.dev•Whatever 'Clean Code' you write now, it'll be shit eventually and in need of a complete rewrite
1·1 year agoThat’s a cracking article.
My own use of jvm errors tends to follow the same kinds of patterns: I think the major fault with that model is having RuntimeException as a subclass of Exception, because it’s really intended for abandonment-style errors. (The problem is that lots of people use it instead as an exception system in order to cut down on boilerplate.)
I find it eye-opening that the author prefers callsite annotation with
try(although I’m not going to argue with their experience at the time). I can see this being either “no big deal” or even “a good thing” to Rust users in particular - mutability and borrowing annotations at both callsite and definition aren’t required to make the language work afaict (your ide will instantly carp if you miss 'em out) but the increased programmer visibility is typically seen as a good thing. (Perhaps this is down to people largely reviewing PRs in a browser, I dunno.) Certainly there’s tons of good food for thought there.
gedhrel@lemmy.worldto
Programmer Humor@programming.dev•Whatever 'Clean Code' you write now, it'll be shit eventually and in need of a complete rewrite
2·1 year agoI’m not sure why it’s “obviously” good to move from one mechanism to two: as a user I now have to categorise every path to work out which is appropriate.
What I said was less about adding to a function signature than it was about adding to a facade - that is, a system boundary, although the implementation may be the same depending on language. People typically use exceptions pretty badly - a function signature with a baggage-train of internal exceptions that might be thrown by implementation guts is another antipattern that gives the approach a bad rep. Errors have types too (or they should have), and the typical exception constructor has a wrapper capability for good reason.
gedhrel@lemmy.worldto
Programmer Humor@programming.dev•Whatever 'Clean Code' you write now, it'll be shit eventually and in need of a complete rewrite
3·1 year agoThat’s fine, and for that there are sum types. My own opinion differs - it’s a question of taste. Being able to bundle the handling of exceptional situations aside from the straight-line logic (or use RAIi-style cleanup) is notationally convenient.
Yes, you can do the same with monads; use the tools available to you.
gedhrel@lemmy.worldto
Programmer Humor@programming.dev•Whatever 'Clean Code' you write now, it'll be shit eventually and in need of a complete rewrite
9·1 year agoChecked exceptions are powerful but misunderstood. Exception types are a useful part of the facade to a module - they express to a caller how it can go wrong even if used correctly.
Runtime exceptions are typically there to express contract-breaking by callers; although as an alternative return mechanism I’ve seen them used to simplify the inner workings of some frameworks.
I think they get a bad rep because there aren’t a ton of good examples of how to use them - even the java classpath had some egregious misuse initially that helped turn people off the key ideas.
gedhrel@lemmy.worldto
Selfhosted@lemmy.world•Stop services while creating snapshots during backup?English
2·1 year agoThe other thing to watch out for is if you’re splitting state between volumes, but i think you’ve already ruled that out.
gedhrel@lemmy.worldto
Selfhosted@lemmy.world•Stop services while creating snapshots during backup?English
2·1 year agoI’d be cautious about the “kill -9” reasoning. It isn’t necessarily equivalent to yanking power.
Contents of application memory lost, yes. Contents of unflushed OS buffers, no. Your db will be fsyncing (or moral equivalent thereof) if it’s worth the name.
This is an aside; backing up from a volume snapshot is half a reasonable idea. (The other half is ensuring that you can restore from the backup, regularly, automatically, and the third half is ensuring that your automated validation can be relied on.)
gedhrel@lemmy.worldto
Open Source@lemmy.ml•The Xz Backdoor Highlights the Vulnerability of Open Source Software—and Its Strengths
1·2 years agoThe test case purported to be bad data, which you presumably want to test the correct behaviour of your dearchiver against.
Nothing this did looks to involve memory safety. It uses features like ifunc to hook behaviour.
The notion of reproducible CI is interesting, but there’s nothing preventing this setup from repeatedly producing the same output in (say) a debian package build environment.
There are many signatures here that look “obvious” with hindsight, but ultimately this comes down to establishing trust. Technical sophistication aside, this was a very successful attack against that teust foundation.
It’s definitely the case that the stack of C tooling for builds (CMakeLists.txt, autotools) makes obfuscating content easier. You might point at modern build tooling like cargo as an alternative - however, build.rs and proc macros are not typically sandboxed at present. I think it’d be possible to replicate the effects of this attack using that tooling.

That’s a good point. You can get away with that with a new language, but adding nullability as a non-default option would break existing code much like making things const by default in C++ would, I suppose.