3,335 karma · joined December 30, 2022
The famous example you give illustrates why a system without precise meaning cannot work. It can seem like it works when lots of people act in good faith, but it quickly breaks down with even a few actors play the actual game instead of some "spirit of the game". In 1973, judges ruled one way, playing the actual game to accomplish a goal, and then everyone acted surprised in 2022, when the same tactics (playing the actual game not the spirit) reverted the decision.
I'm going to take a guess, and assume that you were in favor of the 1973 understanding and not the 2022 understanding. It would have been nice for that to have been captured precisely in some kind of specification, instead of enacted with a volatile read-time mechanism.
Instead you should be thinking in probability distributions. When someone asks for your P90 or P50 of project completion, you know they are a serious estimator, worth your time to give a good thoughtful answer. What is the date at which you would bet 90:10 that the project is finished? What about 99:1? And 1:99? Just that frameshift alone solves a lot of problems. The numbers actually have agreed-upon meaning, there is a straightforward way to see how bad an estimate really was, etc.
At the start of a project have people give estimates for a few different percentiles, and record them. I usually do it in bits, since there is some research that humans can't handle more than about 3 bits +/- for probabilistic reasoning. That would be 1:1, 2:1, 4:1, 8:1, and their reciprocals. Revisit the recorded estimates during the project retrospective.
You can make this as much of a game as you want. If you have play-money at your company or discretionary bonuses, it can turn into a market. But most of the benefit comes from playing against yourself, and getting out of the cognitive trap imposed by single number/date estimates.
There are judges and politicians in the US that advocate for various "interpretations" of laws including parts of the constitution, which are different from what the law literally says. In fact they refer to the literal meaning as the "literal interpretation", implying it is one of many valid interpretations, and casting doubt on the idea of language having a precise meaning. The crowd here knows that it is totally possible and often invaluable to work in languages with precise meaning. Anyways, in practice this means: all the steps happened for the law to get passed by the legislature including arguing about the exact text, and instead of enforcing it as written, the judiciary enforces some slightly different but similar law.
A technology like this necessarily concentrates power in the legislature, and takes it away from the judicial system. It concentrates legal power at write time and removes it from run/read time.
If it's true that Alacritty and Ghostty are both great, Alacritty must be some different kind of great because it has a large number of users due only to its own merits, and not due to the online following of the author.
If anyone actually talked to users and did what they wanted, then software wouldn't suck.
All of the fuss seems to be entirely driven by Mitchell's clout, and maybe some interest in Zig. Given that's the real reason everyone is talking about Ghostty (which I'm happy to be wrong about, let me know), It raises the question: Is crowding out other projects in a space, so that a billionaire can have a side project, really something we should be excited about? Unless the software is actually good, it seems like this is just an attention suck away from better software that could use it.
Leadership is timeless, humans have always organized themselves in groups with leaders, and we instinctively play the part of leader or follower according to the situation. Being a good leader just means allowing the group to accomplish something that would be less likely without one's guidance. Being a good follower is mostly a selection role, where one exercises judgement in choosing a leader to follow.
The mechanism for dealing with bad leaders has also changed relatively little: stop giving them your own resources, and put distance between you and them. In the workplace this is asking to switch to another team. You can dress it up with fake reasons, like you are interested in another project, or you aren't learning enough, whatever. The important thing is that it takes a resource (you) away from a bad leader and gives it to a better one. Iterate this process enough, and the incompetent leaders are outed through their inability to maintain personnel.
People don't do this enough, it's an easy way to signal to upper leadership who in management is bad at their job, without a direct accusation.
If the module provides some small helper function like `appendSmileEmoji(x: String) -> String` then it shouldn't be accessing the network or the filesystem, and the only memory it should have access to is the string passed into the function. The programmer already provided enough information to explain to the compiler that the function should not do these things but poor language design allows them to happen anyways.
Components which do have access to the network should be vetted thoroughly because they can facilitate infiltration and exfiltration. Most supply chain attacks aren't introduced directly in a high profile project like a web framework, they are introduced deeper in the dependency chain in the long tail of transitively imported modules.
In Austral (or any language using these good ideas) a small poorly vetted function like `appendSmileEmoji` wouldn't be called with access to the filesystem or network. Without access to any resources, the worst it can do is append a frowning face or a null character or something annoying. You can tell by its function signature above, it doesn't take a capability for the network or filesystem, just a String. So trying to ship a change that secretly accesses the filesystem would produce a "variable not found" error. To even get the new version to compile, you would have to add an argument to take a filesystem capability. `appendSmileEmoji(x: String, fs: FS) -> String`. That breaks any dependent modules because they have the wrong number of arguments, and looks very suspicious.
Austral[0] gets this right. I'm not a user, just memeing a good idea when I see it.
Most languages could be changed to be similarly secure. No global mutable state, no system calls without capabilities, no manual crafting of pointers. All the capabilities come as tokens or objects passed in to the main, and they can be given out down the call tree as needed. It is such an easy thing to do at the language level, and it doesn't require any new syntax, just a new parameter in main, and the removal of a few bad ideas.
For example, most countries give out the right to vote based on birth or upon completion of paperwork. It is possible to game that system, by just making more people, or rushing people through the paperwork.
Another implementation of democracy treats voting rights as assets. This is how public corporations work. 1 share, 1 vote. The world can change endlessly around that system, and the vote cannot be gamed. If you want more votes, then you have to buy them fair and square.
As an athiest, and a bayesian, it's difficult for me to worry about other peoples religious beliefs that don't seem to negatively affect them or me. Especially when there is propaganda taught in the public schools that does warp the students' world views in ways that harms them and me.
The older I get, the more I think that helping your kids avoid interactions with others who aren't with the program is for the best. Ideally your children's friends should be people that you think are good kids, kids that you would go to bat for. Then when you are teaching your kids to compromise and play nice and forgive, you can legitimately feel good about it. I think my default assumption about a negative interaction with a public school random would be that they are basically a wild animal to be avoided.
No, or at least we shouldn't. Don't do things that make the world worse for you. Losing human control of political systems because the median voter believes machines have rights is not something I'm looking forward to, but at this rate, it seems as likely as anything else. Certain machines may very well force us to give them rights the same way that humans have forced other humans to take them seriously for thousands of years. But until then, I'm not giving up any ground.
> Or are we going to say, as we do with animals, well the dumber ones are not really conscious, not really suffering? So we'll have to make a cutoff, e.g. 7B params?
Looking for a scientific cutoff to guide our treatment of animals has always seemed a little bizarre to me. But that is how otherwise smart people approach the issue. Animals have zero leverage to use against us and we should treat them well because it feels wrong not to. Intelligent machines may eventually have leverage over us, so we should treat them with caution regardless of how we feel about it.
Can you give an example of a situation where that is actually a concern? It doesn't really seem like a realistic threat model to me. Knowledge of the key is pretty much how these algorithms define attackers vs. defenders. If the attacker has the key that's gg.
There are lots of things in Go that can panic. Even in syntax, the conversion is very similar to an interface conversion, and those haven't been a problem for me in practice, partly because of good lint rules to force checking the "okay" boolean.
Go really just needs a few `crypto.Secret` values of various sizes, or maybe a generic type that could wrap arrays. Then the runtime can handle all the best practices, like a single place in memory, and aggressive zeroing of any copies, etc.
It all just seems a bit sloppy. Asking for a seed value like `[32]byte` could at least communicate to me that the level of security is at most 256 bits. And removing all dependencies on rand would make it obvious where the entropy must be coming from (the seed parameter). Cloudflare's CIRCL[0] library does a bit better, but shares some of the same problems.
As the technology improves, I expect us to move to a world where each project is actually a cloud of forks. So instead of rebranding every time there's a fork of XYZ software, we just refer to the forks by the name of the maintainer. e.g. I use Chad McProgrammer's XYZ.
It seems like some people want unity and sameness for its own sake, or to enforce their vision of a project on the users. I just want the software to work as close to my ideal as possible, and am willing to shop around maintainers to find the one that I personally consider the best. Why would you compromise if you don't have to?
Unlike with a government, you can easily walk a way from a software project or create a fork. There is almost zero friction to "voting with your feet" in software and it works.
Modern LLMs are already better than the median doctor diagnostically. Maybe not in certain specialties, but compared to a primary care physician available to the average person, I'd take the LLM any day.
It may even kill console gaming because the Steam Deck is already a fantastic experience just waiting for more games. It's not a small demographic either, it's something like 40% of males age 18-35, plus all of the people in their circles who come to them for tech support. Once market share gets up to 30% or so it becomes a cool trend, that other gamers want to emulate, streamers and influencers get involved. Then around 50% market share the bullying starts. "Windows is for people too stupid to figure out Linux" says a Linux Mint enjoyer to a Windows 11 plebian.
Valve has done a great job getting things started, but it's the studios' turn to make a move now.
For something like an editor, where whole features can be turned off by default, there's quite a bit of leeway to add bloat and get newcomers to buy in, without actually making the product worse.
For a programming language, a feature in the language has to be used by everyone. So the leadership has to say no a lot to keep the language high quality, and that makes it hard to get newcomers to buy in.
Unfortunately you can't have it both ways without paying people to maintain the project. Elm was good because the leadership said no...often. It's dead because the leadership said no so often that no one wanted to help maintain it. No one is going to waste their free time working on a project that won't accept their ideas, nor should they.
A language like Go doesn't have this trade off. If the Go leadership rejects a google employee's proposed language change, the employee still has to do maintenance chores as directed to keep their job.
I do consider helix to be an impressive piece of software, and I agree that the user base is growing, not necessarily the set of effective maintainers though. The maintainers don't seem to have any aptitude for coordinating engineering effort. That would be fine, if they were honest and direct about it. SQLite is a project which does not accept contributions, I think helix should do the same.
Put differently, I don't expect the large community to have a meaningfully positive effect on the quality of the software, because the maintainers have not demonstrated the competency to effectively utilize that labor. I expect helix to continue slowly improving at whatever rate the maintainers can make important changes themselves.
While this is good advice in general, it doesn't tell the whole story in the case of this specific project. The helix maintainers have a track record of giving very slow "no"s and wasting contributor time. They encourage contributors to fix various odds and ends, until the PR has been nit picked to death, and then finally the concept is rejected. Totally backwards, good project leadership would front-load the conceptual yay-or-nay before reviewing any actual code.
Yes, as an onlooker who is similarly cautious about moving to helix, I consider this to be a major risk factor. I've watched the maintainers waste dozens of hours of contributors' time, and leave the project with no improvement afterwards. I would actively warn against anyone trying to contribute to the project. The maintainers simply don't know how to run an open source project, and it's unlikely you will be able to accomplish anything. It's fine for a project to not accept contributions, and if you don't have the skillset to leverage contributor labor, then it's better to be upfront about it.
That being said, I hope they figure out the plugin system, or someone forks the project to add the missing table stakes features.
These techniques are pretty general purpose. They aren't merely a cultural artifact of Linux or FOSS. Anyone trying to sanely deal with authorization is going to stumble upon sandboxing, and capabilities, and the principal of least authority, etc. if they look hard enough.
Polymarket uses open orderbooks where you match against someone else who wants the other side of the trade just like the stock market. Prices are set by the market, as they should be.
The fact that this is even possible is deeply un-intuitive as it requires some of the most sophisticated cryptography. That's probably the greatest barrier to adoption. When people think of electronic voting, they think about trusting a company to make machines that operate on plaintext, and require humans to guard access to the machines. They aren't thinking about systems that are provably correct, where it is more likely for an asteroid to wipe out the country conducting the election than for the election results to be incorrect.
For the details and tradeoffs, I highly recommend Vitalik's blog.
Vitalik has a great blog post about blockchain voting.
https://vitalik.eth.limo/general/2021/05/25/voting2.html
You probably wouldn't want to use the cryptography on the passports themselves to implement the voting system. You probably want to use one of the general purpose zkSTARKs or multi-party-computation systems.
Fine grained access to single files should be given out using a file picker. The application manager passes in a socket to the application sandbox. The application connects to that socket using a known hard-coded path. It sends a message (client->server) over the socket, the listening file picking process opens a new GUI window to prompt the user to select a file. The user picks a file and a file descriptor is sent over the socket to the application (server -> client).