1. 10

    Reminded of Rob Pike’s 2000 Systems Software Research is Irrelevant, not because they espouse the same viewpoint, but because both fill me with a sense of potential and wonder. Things could be so different if only we could lift ourselves out of our current quagmire of thought.

    1. 4

      Things could be so different if only we could lift ourselves out of our current quagmire of thought.

      To overcome the current thinking, you must design a programming environment that is small, extensible, and reasonably performant. It must speak to a different needs than most industrial languages, favoring individual power over institutional concerns.

      This has all been done before: Lisp, Smalltalk, Rebol, Forth, Wirth, etc. The only missing ingredient in most hacker’s minds is the imagination required to see that their computing substrate should not require millions of dollars of investment to operate.

      That, unfortunately, is a much harder problem to solve.

      1. 1

        None of the environments you mention above require millions of dollars of investment to operate.

        OP explains why building alternatives can accelerate the problem rather than fixing it. This is probably unavoidable: Lisp, Smalltalk, Rebol, and Forth have not become the ‘new normal’ because they have not become widely taught the way C, C++, and Java have, and they haven’t become widely taught because teaching programming is treated as a way to produce new professional software engineers rather than as a way to produce well-rounded people. Unless you have the power to force a thousand universities to change their curricula against the will of professors and administrators, the best you can do is combine a demonstration with a manifesto and keep plugging it.

      2. 2

        The reason most of us are in a quagmire of thought is that it’s how we earn our paychecks. Improvements in software change just what it is that we’re working on in the quagmire. I call it the aggravation conservation law.

      1. 5

        This is bad advice. Code quality failures come in groups, because they are generally the result of misapplying habits that would make sense in another context, and identifying that there are problems with a piece of code doesn’t prevent you from later being more specific about those problems when there’s disagreement about them. On the other hand, when there is disagreement, you tend to get more problems fixed than you would if you were more specific, because it means there were multiple different types of things wrong with the code.

        As an example:

        Sometimes, code gets expanded unnecessarily, and something that’s only one or two conceptual chunks gets strewn across many files or broken into many independent components out of an expectation that it would be more complicated than it really was or a slavish dedication to ideas about encapsulation or the mere fact that the original developer was a lot less experienced than the maintainers & couldn’t mentally chunk the logic as coarsely. This is a common ‘enterprise’ smell – it happens when structure is defined in a contract written by managers or when new graduates recently steeped in classes about java end up doing all the implementation.

        That code can get edited by somebody with a different set of habits or impulses that seems contradictory – somebody who, because their tooling doesn’t have autocomplete or they’re a slow typist or they have an 80x25 display or poor short term memory or they’re sleep deprived and on a deadline, prefers to write overly terse & hacky code that combines multiple operations into a single expression or uses complicated tricks to replace two or three lines of idiomatic code with one line of noise.

        Code written by this person from scratch might actually be terse, but they won’t necessarily have the time or energy to actually refactor code written in an overly expansive style, so instead the code becomes rock soup – a thin broth of thirty layers of wrapper classes that do almost nothing spread across twelve different directories named things like ‘AbstractManagerSupervisorFactoryFactoryManagerFactory’ and 98% of the instructions in the actual compiled object are actually accounted for by five lines in some static function called ‘q’ that combines duff’s device with a cascade of ternary operators and fast inverse square root to convert locales or something with an opaque array of undocumented constants.

        (This example is fictional, but I have in fact encountered equally crazy examples of this kind of behavior in production code.)

        This is ‘bad code’ in two different ways: the dense parts are too dense, and the thin parts are too thin. It needs to be rewritten from scratch, & can probably be turned into a screenful of code that both the original developer & the later maintainer would consider acceptable. If I said “this is too dense” then odds are that the least dense parts would get expanded while the dense parts were untouched (because the original developer couldn’t understand them); if I said it wasn’t dense enough, all the scaffolding would be demolished and there would be no means to determine the intended behavior of the single-letter function names. If I say “this is bad code”, then the inconsistent density is the obvious reason, and the obvious course of action is to make it of consistent density.

        1. 3

          Text rendering can be quite hard even if you avoid or hand off most of the complications mentioned in this document.

          I had some experience with this, as a side effect of working on some internal Xanadu prototypes. We were willing, for the sake of these prototypes, to support only languages written left to right & only in a single full-unicode font; in the non-glyphcache-oriented versions, we also supported arbitrary ligatures by relying upon SDL or QT rendering (and we separated only at line boundaries or at selection boundaries – i.e., if two contiguous characters were from different sources, were part of different sets of links, or had formatting differences). Nevertheless, language-agnostic text layout is tough: when is it safe to wrap when you have a mix of languages? We ended up doing word wrap based on english language rules & then falling back to character wrap if a single ‘token’ was too long, which is bound to be wrong a lot of the time but is ‘sane enough’.

          If you’ve got a big localization team full of professional polyglots then you can add all sorts of special cases & get something that looks professional in most languages, but if you’re two guys working for free three or four hours a week & text rendering isn’t even your main concern, looking professional in both japanese, arabic, & koine greek isn’t in the cards.

          1. 9

            Accurately portraying some of the comedy in i people going “oh I don’t need fancy graphics, I just use text”. To add some fun to just how dark the technical world of the ‘ligature’ can be: Start with this little bundle of joy: https://docs.microsoft.com/en-us/typography/opentype/spec/gsub

            So you get this scary little weird machine hidden inside the font that takes 1..n codepoints and spits out 1..m glyph indices. You basically need to be able to pass it around with complex documents or it won’t be legible, so for a networked application, the ‘font’ is a state blob that needs to be synched on both sides (enter CSS3/cufon), after all, this can turn ‘truth’ into ‘lies’ given the right font. Then you have your other ‘crazy write / unpack’ primitive with the ‘x-advance, y-advance’ output from kerning and hinting.

            A fun little way to say, encode malware payload inside something no AV will unpack or really flag as suspicious.

            1. 1

              some of the comedy in i people going “oh I don’t need fancy graphics, I just use text”

              To be fair, using a GUI means doing all of text ‘right enough’ and having extra stuff on top. It’s just that, so long as you can accurately size chunks of text, the stuff that’s specific to drawing GUIs (like handling positioning of non-overlapping widgets, tying events to potentially-overlapping windows, avoiding drawing hidden items, eliminating flicker, etc.) is trivial in comparison, since it doesn’t need to be an accurate analogue of an ink-and-paper technology.

            1. 2

              This weekend I am replacing my furnace.

              1. 6

                I don’t think it makes sense to adopt it on lobste.rs but on gambe.ro we solved the issue of having such a broad tag by having three separate tags: it-culture, hacker-culture, society. While the last one might not be of interest for lobste.rs, the other two define a better, self-explaining scope.

                1. 3

                  Agreed: the problem with ‘culture’ is that it’s much too vague.

                  I tend to tag with ‘culture’ whenever I post something that has to do with how people (particularly whole groups of people) interact with technical constructs, or whenever the brunt of the point is about social structures. This overlaps heavily with both ‘practices’ and ‘philosophy’! I use it because, the way lobste.rs tagging works, the primary mechanism of a tag is for blocking stories, & this sort of stuff is uninteresting to folks who would prefer their feed to be 100% technical material.

                  But, just as ‘practices’ can mean ‘how you ought to hire’, ‘how you ought to do unit testing’, ‘how you ought to license’, ‘how you ought to learn’, and ‘how you ought to manage pull requests’ (stuff that has partially-overlapping but mostly-distinct audiences), culture can mean everything from ‘google unionization’ to ‘sex pests in infosec’ to ‘the history of infocom games’ to ‘why do we use vomit metaphors when talking about logging’.

                  it-culture / hacker-culture / society is a good start but is probably not specific enough. For instance, debates over sexual politics in tech (something that there’s a lot of vitriol over here & a lot of debate with regard to whether or not it’s on-topic) would easily be classified as all three, since it’s a business concern and a subculture concern.

                  I’m not sure what division makes sense. Just blocking culture entirely probably makes less sense than keeping it & letting people filter it out, because these discussions are relevant to our lives & the way we interact with tech even if there’s a poor signal to noise ratio in the topic, & if we got rid of the tag, we’d still have the same stories and merely have the other applied tags take precedent – stories like mine that were tagged philosophy/practices/culture couldn’t be filtered just by blocking culture, but would need to be filtered by blocking philosophy or practices.

                1. 21

                  This license is, verbatim, the MIT license plus this clause:

                  The software may not be used by individuals, corporations, governments, or other groups for systems or activities that actively and knowingly endanger, harm, or otherwise threaten the physical, mental, economic, or general well-being of individuals or groups in violation of the United Nations Universal Declaration of Human Rights.

                  Setting aside argument/discussion about the human rights bit, I think that it’s noteworthy that “no warranty” clause is still there.

                  I’m kinda curious what train of thought allows developers to claim moral authority about how their software may be used while at the same time denying any responsibility for the quality/reliability of that same software.

                  1. 25

                    “I made this thing. I can’t promise it’s perfect. If you want, you can use it as long as you’re not hurting anyone.”

                    I don’t see the problem (from a moral standpoint). If you don’t like the terms, don’t use the software.

                    From a legal standpoint, I’m unclear on whether most jurisdictions allow you to do disclaim responsibility while dictating use. AFAIK that’s largely untested waters.

                    1. 8

                      Copyright licenses are legal documents. The legal enforceability of the terms is a valid question to ask.

                      1. 1

                        It’s valid, but in practice, if a court is involved in picking over a license then the license has already failed at its task (preemptively avoiding certain behaviors by making the kinds of people who want to engage in them turn up their noses at the software on the grounds of license terms).

                        This is already sufficiently more specific than the JSON license that the people the license is supposed to scare off probably genuinely will be scared off. I’d like it if they struck the ‘underprivileged’ part so that there wasn’t the glaring loophole of having to prove privilege – just make it “no physical, mental, or economic harm to persons” (i.e., it can’t be used commercially or in a military or law enforcement context, because regardless of the ‘greater good’ arguments justifying these things existing, there’s no doubt that individuals are routinely harmed by them).

                        1. 1

                          I’m 100% sure tons of companies are unwittingly using free software with licenses they are technically not allowed to use. Their devs are just concerned with shipping, they don’t really care about the terms. And when they find out, they put migration away from them on the relevant teams’ backlogs and forget about it. If they’re taken to court over it, what do you think their lawyers will do, just say ‘mea culpa’ and incur penalties? No way. They’re going to incur billable hours and fight the licenses.

                          1. 2

                            In any kind of licensing issues I’ve been in, they said “mea culpa” and incurred penalties. I know people have a bad view of lawyers, but companies that have their house in order wrt. to lawyers just agree on mistakes and pay up. Lawsuits also incur organisational costs and there’s not a huge interest there.

                            To be quite frank, if your lawyer never tells you “don’t pick that fight”, he’s a bad lawyer.

                            1. 1

                              Sure. At the same time, a lot of businesses have over-broad policies about what licenses are acceptable (based, pretty much, on the same metric: generalizations about licenses that don’t really involve reading them).

                              Where I work, permissive licenses are fair game, but using anything GPL’d or under a GPL-like theoretically involves getting permission from the legal dept on a per-package basis (more effort than even licensing a proprietary thing for millions) simply because they’re afraid that we might have to make modifications & be forced to distribute those modifications (thus giving away work the company paid for), and any non-EULA license not on their list is supposed to be subject to serious vetting (which functionally means: either we steer clear of it entirely or we don’t tell anybody, because if legal gets involved we won’t be able to touch the project for at least 18 months).

                              In other words: litigation is not where licenses have power (and even pretty well-established licenses may not stand up to serious litigation). Adoption is the point at which licenses exert their power – by scaring people off. This has nothing to do with whether or not they’d be legally effective, and everything to do with whether or not non-lawyers think they could justify the worst case scenario.

                      2. 3

                        So, a more verbose JSON license.

                      1. 8

                        I’m generally opposed to containerization of all forms: packaging most of an OS with every application is incredibly wasteful & allows compatibility problems to balloon longer than they ought to (by letting developers ignore them for longer, producing a greater difficulty in eventual porting). Rather than package extra stuff, it makes more sense to bite the bullet and start off with an awareness of exactly what range of versions & implementations of dependencies you will support – which has the added benefit of forcing you to justify dependencies (almost always resulting in eliminating most of them in favor of a new, often better, implementation of whatever tiny corner of a sprawling library or framework you actually need).

                        Containers are sometimes harder to justify avoiding in a business context, where technical debt isn’t factored into the balance sheet in a serious way, it’s often more important to hit deadlines or streamline scale-related operations like deployments and restarts than to make high quality maintainable code because the business might not survive long enough for maintenance to be necessary, and it’s often cheaper in the short run to buy more computing resources than to pay engineers to get rid of unnecessary resource usage of all kinds. They let operations put out fires in the short term that otherwise would require developers to get up at 3am to debug. Kicking the can down the road may not be good for employees or users or the planet, but for the business it’s often the difference between healthy profit and slow death. (IMO, this is not an argument for containers so much as it is an argument against the way we do business.)

                        There are occasionally other situations where a container makes sense. Volunteer mass-computing projects like the ArchiveTeam’s deploy as images & containers for basically the same reason that businesses do, only moreso: in order to archive all the stuff they want to, they need a very large scale deployment of code that does things of varying complexity, and the scale in combination with the volunteer nature of users means very diverse environments, some of which are guaranteed to be broken in ways that the developers can’t be expected to understand, let alone debug; furthermore, since the workers are set-and-forget, they need to be able to push new configurations to all the connected workers. Unlike a centralized service, they have no control over or information about the environment they’re running on, and they may need to do things that other sandboxes prevent.

                        That said, I see people recommend that twenty-line python scripts be deployed by end users as docker images, and it blows my mind. Like, rather than spend a half an hour making your code compatible with every conceivable platform and version, you’re gonna inflate the size of the code by a factor of a hundred thousand?

                        1. 1

                          If you already have a blessed python base image, you don’t take up any space but the diff between that and the 20 line python app. Which is usually 20 lines. Compare this to a whole xen domU for that 20 line python script and you’re actually quite a bit ahead.

                          Docker is much like a powerful chroot’d process. You have to stick all the libraries you will need in the chroot, but then you can be fairly confident that you will not have issues with that python script reading you main app’s user table. With dockor you also get memory and network isolation.

                          Anywhere I put docker, you could replace with any container technology like OpenVZ, rolling your own cgroups, or rkt.

                          1. 1

                            Sure, but why even bother with chroot? Why not just write properly portable code in the first place? Particularly with modern scripting languages, it’s quite straightforward to write portable code, and the only potential downside is that occasionally you will have to eschew shiny new language features in favor of solid old language features.

                            1. 1

                              Security is the reason you chroot. If someone gets a file read exploit in your app, they can’t read your password file or your ssh keys that can read your github repos or your db files. They can’t install their own ssh keys in a place sshd will look for them. It’s basic defensive operations.

                              1. 1

                                For a service, in a business context. Which is fine, but ultimately uninteresting. As I mentioned in my initial context, all kinds of containerization are justified by business contexts.

                                If you want to install and run a tool, then you explicitly want to be able to compose it with the other tools on your system, use it against data on your system, and so on. Containerization in that context is wasteful and necessitates extra effort – shit that ought to communicate over pipes now needs sockets. And, the first time you set up a docker container, you gotta download the whole thing & store all of it in ram (since it’s never gonna be exactly the same binaries as your workstation), so you aren’t actually saving anything through reuse until you’re running at least several overlapping containers (but probably hundreds, compared to running a regular tool locally).

                              2. 1

                                It’s a mechanical way of giving you a guarantee that you have portable code.

                                It gets you from “I think this is portable” to “I know this is portable”. Very useful when reasoning about systems

                                1. 1

                                  Containerization doesn’t make code portable. It attempts to obviate portability concerns by shipping the whole environment – which only works when interoperability with the existing environment (the core feature of portability) is irrelevant.

                                  Sure, portability is more difficult than shipping a whole environment in a sandbox. It can sometimes be impossible to use non-portable third party dependencies in a portable way. But, when those dependencies aren’t portable (or are less portable than they claim), that is a bug on their part & they should be fixed.

                                  Application isolation isn’t actually a good thing, outside of mass deployment of ‘naturally’ isolatable applications. It means composition is awkward or impossible.

                          1. 1

                            It looks like you don’t want Free Software, but a communist revolution.

                            1. 2

                              You can’t have one without the other.

                              1. 1

                                Your above assertion is not specific enough to test or falsify.

                                Karl Marx didn’t know about falsification (thus science) yet as that was only described after his death. You could write arguments that others can check instead of merely taking your word for it.

                                In the article you say:

                                users and corporations do not have aligned incentives […] therefore, so long as capital has the ability & incentive to influence software production, software will be pitted against users.

                                This is circular reasoning or perhaps a tautology. You give the conclusion as a reason for the conclusion.

                                Quirky, personal software that is aggressively unscalable

                                Software for humans (as opposed to only for some humans but not others) is required to be more scaleable than merely commercial software as there are more than 7G of them. Commercial software merely needs to work with enough humans to extract money, it can ignore the rest.

                                What is more important to you: Human needs/rights or the inability of the software to be used by corporations?

                                Is a communist revolution your goal in itself or is that only your suggested solution? Are there some goals you have where if some other idea could reach them, it would be fine for you not to get a communist revolution?

                                1. 3

                                  Karl Marx didn’t know about falsification (thus science) yet as that was only described after his death. You could write arguments that others can check instead of merely taking your word for it.

                                  I didn’t mention Marx in this essay. However – your statement is incorrect. Marx wrote during the industrial revolution, & his explicitly stated goal was to remove the woo from existing socialist movements (like the fabians) by sticking to rigorously scientific analyses of historical economic data & construct falsifiable models of economics. This is what is meant by the term ‘historical materialism’: an attempt to bring economics out of the realm of Smith’s just-so stories & into the realm of science, submitting it to the same rigors that were then being applied to thermodynamics.

                                  (Last I checked, the scientific method was attributed to Sir Francis Bacon, a few centuries before Marx was born. The nineteenth century was the absolute peak of the kind of scientific reasoning you describe – named and documented by Popper a half century after its moment ended in the wake of the virtual demolition of the analytic movement in philosophy by Godel & Wittgenstein.)

                                  This is circular reasoning

                                  No, I just thought that the incentive misalignment was so obvious that I didn’t need to specify it.

                                  Software for humans […] is required to be more scaleable

                                  This point is fair, so long as you assume the existing division between developer and non-developer. I’ve written at length elsewhere that this division is arbitrary, problematic, and a form of rentseeking, & ought to be abolished. Since you haven’t read those pieces, I can’t blame you for thinking that this is a flaw in reasoning.

                                  What is more important to you: Human needs/rights or the inability of the software to be used by corporations?

                                  Human needs. (After all, like the rest of us, I write software for corporations all day. I maintain that it is problematic in the long run, but in the short run it is necessary for my own survival.)

                                  Is a communist revolution your goal in itself

                                  I’m not really an advocate of revolution per-se. It’s messy & often ineffective, since military structure, while necessary for war, runs counter to an equitable arrangement of people. Gradualism has other problems, but luckily there are solutions that are neither revolutionary nor gradual. My own preference is the scheme outlined in bolo’bolo: the construction of alternatives, independent of existing systems, which people can move to freely. Popular alternatives starve incumbents of labor & resources. In the late stages this is almost guaranteed to result in direct attacks, but by that point, if things are managed well, the incumbents will be too weak to do much damage.

                                  1. 1

                                    Let me repeat my first sentence with a different focus:

                                    You didn’t refer to a specific model of economics.

                                    You can’t have one without the other.

                                    If you specified a correct economic model and matching implementation, that isn’t yet sufficient for that to follow. For your claim, you’ll need to specify properties without which Free Software can not occur. With enough precision so that it is easy to say if something matches those properties or not.

                                    Marx […] construct falsifiable models of economics.

                                    One can state something falsifiable without explicitly having defined falsifiability or deciding on using it for demarcation to non-science. I only mentioned Marx to be a bit more specific than mentioning the word communism. Marx certainly did make non-falsifiable claims in addition to falsifiable ones.

                                    AFAIK Sir Karl Popper defined falsifiability long after Marx was dead and suggested anything not falsifiable is not science. Francis Bacon didn’t require falsifiability.

                                    No, I just thought that the incentive misalignment was so obvious that I didn’t need to specify it.

                                    There are certainly obvious cases of incentive misalignment. What is not obvious is that in all past, current and possible future systems in our reality, “users and corporations do not have aligned incentives”. (For it to be falsifiable you need to specify how to detect a corporation. Does Alice and Bobs collusion constitute a corporation?)

                                    Software for humans […] is required to be more scaleable

                                    This point is fair, so long as you assume the existing division between developer and non-developer.

                                    […] this division is […] a form of rentseeking […]

                                    Doesn’t matter under what economic system or how the labour on that software is organised. That does not change that a human would need to be able to run compatible protocols together with over 7G humans for them to be able to not exclude some of them. Otherwise: Sorry, no internet1 for you, its full. Make your own internet2, which won’t fit everyone either. So some won’t be able to directly talk to some others. This would create the opportunity for those in both internets to seek rent for forwarding. Therefore the non-scalable property enabled what you said to avoid.

                                    Unscalable software would compromise the rights of some humans. Thus it does not serve your stated goals.

                                    1. 3

                                      If you specified a correct economic model and matching implementation, that isn’t yet sufficient for that to follow. For your claim, you’ll need to specify properties without which Free Software can not occur. With enough precision so that it is easy to say if something matches those properties or not.

                                      You’re applying a lot more rigor to a flippant response (to someone’s flippant comment) than to the article itself, wherein I specify exactly what I mean by free software and exactly how it’s currently being prevented & a few ways to close the loopholes that are being exploited.

                                      The goal of free software is to align the incentives of software developers and software users by making them the same group. (If we want to bring Marx into this at all, we have a convenient place to do it: he defines communism as any state of affairs in which the incentives of management and labor are aligned because management and labor are the same group. I wasn’t drawing on Marx in this essay but on Debord, so outside of this point that’s a much more suitable comparison to make.)

                                      The labor of software use always falls upon individuals, so user incentives are best defined by individual incentives. Because almost all individual software users sell their bodies to corporations for at least eight hours a day, during which they are required to perform actions in the ways demanded by corporations rather than in the ways they would naturally perform those actions, points of friction become biased based on standard procedures. It is only in the interests of a corporation to lubricate the points of friction that occur when performing corporate-controlled work, and then only when the people who encounter those points of friction are insufficiently disposable.

                                      Marx certainly did make non-falsifiable claims in addition to falsifiable ones.

                                      Sure, as does everybody. And, Marx was wrong on a number of points (among them, he thought that ‘capitalism with a human face’ was impossible & so thought that the internal contradictions of capitalism would cause it to collapse substantially faster).

                                      He had, as an explicit goal, to be scientific – by which he meant creating systematic models of the entire relevant portion of the problem & testing them against both historical data & new experiments, eschewing metaphysical ideas and wishful thinking in favor of mathematics & mechanisms, and emphasizing the importance of revising models when they have failed to be predictive even when the resulting new model is complicated by this collision between theory and practice. In other words, in terms of Popper’s idea of science (which itself is fairly controversial), Marx’s economics scores higher than many current fields (including practically all of medicine outside of drug testing).

                                      There are certainly obvious cases of incentive misalignment. What is not obvious is that in all past, current and possible future systems in our reality, “users and corporations do not have aligned incentives”.

                                      If we privilege the needs of individuals over the needs of corporations, then any time the two come into conflict and the corporation wins, it is an unnecessary tragedy. When their needs are aligned, it is irrelevant: the equivalent number of individuals coming together in a different structure would have the same power to fulfill that need. When they are not aligned, corporations tend to win, because that is what corporations are for.

                                      you need to specify how to detect a corporation

                                      The usual way will suffice. A corporation is a legal entity that can hold capital and resources the way a person does, and can usually be sued in the way a person can be, in such a way that it forms a buffer between an individual and liability. A corporation continues to exist so long as it periodically pays the government a registration fee, unless it is dissolved by its owners.

                                      This means a corporation always has an incentive to accumulate capital, because accumulated capital is capable of protecting it from all possible risks, & any mechanism for accumulating capital that does not risk losing more capital than the company can afford makes sense (i.e., fines for illegal activity are part of the cost of business & bad PR can be offset by marketing). It also means that the owners of a corporation are incentivized to dissolve a corporation & run off with its capital if they think it’s no longer doing its job. A corporation is a disposable shield that is immortal so long as you keep feeding it, but gets hungrier as it gets bigger: an ideal tool for protecting individuals from the voracious maw of the market.

                                      a human would need to be able to run compatible protocols together

                                      I’m not opposed to the concept of protocols. I’ve got a problem with monocultures.

                                      Software scalability matters a lot with regard to centralization. If one organization owns all the machines for doing a thing, then those machines need to be efficient, because the margins are the difference between skimming enough profit to survive and slowly bleeding to death. In a decentralized system, most of the things we mean by scalability don’t matter: one person isn’t doing maintenance for a thousand machines but for one machine, so it makes more sense for that one person to be comfortable with their one machine than it does for all thousand machines to be interchangable; one person isn’t moderating the feeds of all of malaysia, but instead, everybody tends their own moderation and perhaps helps out with the moderation of their friends.

                                      I’m ultimately less interested in opening up low-level protocols than front ends, because the shape of behavior is controlled by the adjacent possible. I go into this in detail in other essays, but where it intersects with this topic is: when you make software for employees, the people who use it are biased toward acting and thinking like employees, which is a very narrow slice of all the different hats one could wear; likewise, when everybody runs the same software, they think more alike, because their imagination is shaped by their habits.

                                      We know from observing users that they are capable of using an extremely flawed folk-understanding in conjunction with trial and error to produce effective, if convoluted, mechanisms for getting things done with inadequate tooling & inadequate documentation. In other words: all humans are born hackers, and the difference between somebody who rigs up some incredible hairball of an excel spreadsheet to do something & somebody who does it in perl is not a matter of inherent ability or even really skill but of access to the ability to imagine better tooling (i.e., a matter of exposure, education, & identity). Just as MySpace’s willingness to host arbitrary CSS led to often-messy but incredibly personal and expressive profile pages, making the resources available and visible by default to everyone to modify all the code on their system will result in even self-professed ‘non-technical’ users adapting their systems to fit their preferences in extreme ways – and the more available we make that ability to imagine a better fit, the greater variety & the closer fit we will see. (In other words, this is a natural extension of free software: rather than collapsing the distinction between ‘a developer’ and ‘the developer’, truly collapse the distinction between ‘developer’ and ‘user’.)

                                      Even opening up the whole system, we should expect to provide reasonable defaults, because writing an IP stack is an acquired taste – I don’t expect many people to dig that deep when optimizing for a real-world task. Even so, monocultures of implementation are dangerous in many ways, so we ought to have more fully independent reimplementations of just about every protocol. If a protocol cannot be trivially reimplemented, then it has failed at being a protocol. Vary every behavior not specified with ‘must’, bring out the nasal demons, etc: the ecosystem will improve because of it.

                                      Computer software is made for and by people who already like computers, and this prevents problems that are obvious to other groups from being solved. Require less initial buy-in at the level of software creation and you’ll get computers that are worth liking.

                                      some won’t be able to directly talk to some others

                                      If centralized social media has taught us anything, it ought to be that people don’t really want to open themselves up to being talked at directly by seven billion strangers, because scale of direct contact amplifies the power of griefers and low-effort shitposting a lot more than it amplifies useful forms of communication.

                                      SSB has the best model I’ve seen in action. You’re responsible for managing your own feed, but visibility is based on the existing social graph & is asymmetric. Basically, so long as you don’t follow pubs, you can keep the presence of hostile randos looking to bother you down to a dull roar without putting the labor of that on some overworked moderator. Visibility & access follows the usual course of human connectedness, & tactics created by a fully flat network like sealioning and swarming don’t really work.

                                      1. 2

                                        Lots to chew over here. Thanks for taking the time to write!

                            1. 3

                              Paywalled articles should be disallowed.

                              1. 1

                                Clear cookies and localStorage and you get more “free articles”.

                                1. 1

                                  The link I posted bypasses the paywall. But, if you insist upon rewriting the URL to remove the bypass, you can just open it through the wayback machine.

                                  EDIT: I’m sorry, it looks like it wasn’t you but the lobste.rs software that removed the paywall bypass. The link I originally posted is https://medium.com/@enkiv2/freeing-software-3e3ede439f20?source=friends_link&sk=faeed756e13f8fefd93c6c599199dd3b , which is not paywalled. This is a bug, and also a new behavior since the last time I posted a medium article here (when it only stripped the bypass if I hit the ‘detect title’ button).

                                  1. 2

                                    Any reason you prefer to post to Medium instead of your own site?

                                    1. 1

                                      I’ve answered this at length before: https://lobste.rs/s/bykzkm/hide_medium_com_as_personal_filter_on#c_v6frxz

                                      A couple additional notes:

                                      I do periodically mirror all my medium posts on my own website. As a policy, I only post friend links (i.e., firewall bypass) to aggregators like lobste.rs and HN & to social media. Nevertheless, people reading my back catalogue on medium nets me about $5 to $10 a month even if I don’t post anything new, & sometimes I make an additional ten bucks if I do post something new, so this is a reasonable justification for me to have a copy of everything of value that I write present there. (My most popular posts are not monetized at all, & have been rehosted multiple places; my income from medium comes mostly from medium users who encounter it through the site’s own recommendation system.)

                                      So long as services like lobste.rs don’t strip friend links, nobody who sees a link because I posted it is subjected to a paywall. Unregistered users may be subjected to a closable registration wall (though I have never seen this behavior, but I hear it is stupid & confusing). Compared to most web apps that serve up text (including lobste.rs), medium is lightweight & responsive in my experience, & folks who find it too slow are welcome to look at a javascript-free version on my site whenever I get around to mirroring it. So, I don’t feel like I’m inconveniencing anybody particularly by using medium (though I would if the friend link feature didn’t exist).

                                      1. 1

                                        Thanks. I didn’t know Medium had friend links and if Lobste.rs strips they, then that’s a bug.

                                        I just felt that publishing a post extolling the virtues of free software to a site that seems to demand payment was a bit weird.

                                        1. 2

                                          Medium does not do itself any favors in the PR department by foregrounding its paid features. I hear that some unregistered users mistake the registration popup for a paywall on un-paywalled articles because of how much their copy talks about paywalls.

                                1. 5

                                  He may be exaggerating by saying he’s the cheapest, but I think the problem he describes here & in his previous post is pretty common, not least because I experienced it myself on a smaller scale:

                                  I am not a professional game developer, even by indiesphere terms – I have a day job, and write games very slowly when I have the time & energy to do so. The stuff I make is even more niche than Vogel’s (lots of people remember isometric RPGs fondly, and so the indie sphere has almost as many of those as platformers, while western-made VNs are still a little more exotic and ones that aren’t romance-focused are even more rare), & I don’t have the luxury of spending a hundred grand in total on development.

                                  During the development of my last game, it seemed like it had a wide enough appeal to justify investing more money into. I paid some freelancers to redraw my own extremely-janky art, and paid steam their app credit to host it. In the end, I spent about a thousand dollars of my own money on the game, in the hopes that the boosted investment would boost sales, which it probably did. Nevertheless, I ended up still doing most of the character art myself (I paid more than usual for sketches with the expectation that the fully colored version would be cheaper, but the character artist had a nervous breakdown & disappeared off the internet for years about ten minutes after finishing the last sketch, so I had to clean up & color all the sketches & draw all alternate poses), & the background artist’s style ended up often clashing with the material. (I did all the writing, coding, and music myself – and ultimately, despite my investments, ended up doing most of the art myself too.)

                                  I released the game this past February, after a year and a half of development. I made a total of about $250 on Steam – a number that has evened out, despite generally positive reviews, as I haven’t had a sale in months. Steam takes about 30% & only pays out when the payout quantity is above $100, so I got a single payout for $100 & won’t get the rest of my money out of Valve unless I double my sales. I’ve made something like $30 on itch.io during the same period. I will probably never break even on the investment in art, because despite spending a fair amount of money on it, that brought the quality level up to just below what VN players on Steam expect out of a free game.

                                  I don’t have the same out that Vogel does – with a VN, where the appeal is compelling characters, you can’t flip existing assets for those character images & get anywhere (although you can use stock backgrounds, as 07th Expansion famously did – but even then, I can’t actually afford to buy background art at photostock prices). So, on future games, I’m doing 100% of the art myself – and investing no money in the game, only time. That way, if I make five or ten of them, I will probably eventually recoup what I spent on the first one. My own art is only marginally worse than the stuff I paid for (and in some cases, my sketches were better than the ‘finished’ versions I got, because I have a slightly better grasp of single-point perspective than the background artist).

                                  Getting a game to be profitable is tough for a variety of reasons: big studios put out extremely polished games for free as loss leaders, the biggest marketplaces are optimized for dealing with established studios rather than the long tail, escrow rules designed for a pre-stripe / pre-paypal era mean that unless your game sells a lot of units Steam keeps all your money, and marketplaces like itch.io that are really great for devs don’t attract many players. Unless you’re consistently profitable (either through a big back catalogue or through a dedicated fanbase), you can’t quit your job & do this full time, which means that everything takes four times as long. For somebody who can code, short of voice acting (rare), professional-level art is the most expensive thing in an indie game, and that basically means that an individual can’t afford it. So, unprofessional art is unavoidable unless the main dev just happens to be a skilled artist.

                                  I hit the skills jackpot for VN development – I can code, write, compose vaguely acceptable music, and kind of draw. Luckily, VNs spent 30 years as a mostly-doujinsoft thing, so current trends in art aside, VN players often have a tolerance for unprofessionalism in all these areas. So, eventually breaking even is not totally impossible. In another genre, it would be.

                                  1. 1

                                    Thanks for this background info. Have you tried contacting Youtubers covering your sort of game to get them interesting in looking at your game?

                                    1. 2

                                      One guy (who I contacted via steam curation) streamed most of the game on youtube over a period of a few months. (This guy streams VNs exclusively, and is very active, but doesn’t seem to have much of an audience.) I’ve contacted one or two other small-ish youtubers who play similar types of games, with no response.

                                      Ultimately, the title is pretty fringe & I shouldn’t have invested so much money into it. If it actually sold enough copies to break even, it probably would have poor reviews, simply because there aren’t a thousand people on earth who would like it! So, I’m not going to go overboard in bugging strangers to promote it.

                                      1. 1

                                        I see. It’s a cutthroat business! But cool that a one-person team can actually get something out there!

                                        1. 2

                                          Yup. As long as I don’t put any money into it in the future, I’ll be making a profit.

                                  1. 4

                                    Not everything needs to be done with machine learning. Many tools already do this well without it. What is the benefit of using machine learning instead of the more conventional approaches for this problem?

                                    1. 3

                                      I’m not convinced that this approach will lead to more efficient implementation of already-planned designs (not least because even fairly naive completion on large codebases is liable to grind the whole system to a halt, & any RNN is much heavier than even a very naive identifier prefix lookup). However, like Robin Sloan’s similar experiment with prose & the markov-model-backed systems for the same purpose used by Botnik, it’ll probably be interesting for introducing noise into the process of coding & thus slightly scrambling bias, producing weirder results when coding in an exploratory way. (This is worthwhile: almost all bugs are the result of tunnel vision on the part of devs, rather than actual conceptual difficulty.)

                                      1. 1

                                        I don’t have context for what your first sentence is saying. Which approach are you referring to as “this” approach? Which “already-planned designs”?

                                        Although generating an initial sometimes takes a moment, the only time I’ve seen completion bring any workstation to a “grinding halt”, it was a pretty inefficient implementation. Even then, it wasn’t that bad.

                                        I don’t think that’s the kind of tunnel vision that causes bugs either, though…

                                        1. 1

                                          I don’t have context for what your first sentence is saying. Which approach are you referring to as “this” approach? Which “already-planned designs”?

                                          By ‘this approach’ I mean putting neural net generated nonsense code into autosuggest. If you have an existing large codebase and you want to make straightforward known modifications to it, adding noise is not useful – but if you’re writing something weird from scratch & you don’t have any particular direction in mind, adding noise can help break you out of mental ruts.

                                          Although generating an initial sometimes takes a moment, the only time I’ve seen completion bring any workstation to a “grinding halt”, it was a pretty inefficient implementation. Even then, it wasn’t that bad.

                                          Completion in IDEs tends to cause my workstations to freeze for minutes per completion, not even redrawing window contents. Now, I tend to get cheap machines & work them hard, but this is a problem I’ve seen persistently for more than a decade on a whole host of machines with varying degrees of pep.

                                          1. 1


                                            1. 1

                                              IntelliJ, Eclipse, and NetBeans (among others). It’s a persistent problem across IDEs.

                                              Vim CTAGS plugins don’t do this, but they’re also of limited utility.

                                              1. 1

                                                I don’t usually have many problems w/ YouCompleteMe / Python+Jedi on Vim either. Tern is pretty slow :(

                                      2. 2

                                        I’ve been using TabNine for a little while and I find it better than conventional approaches because it tends to suggest longer snippets that are correct.

                                        1. 1

                                          Whilst many tools do this well already, many others do not, particularly for dynamic languages (I’m unaware of a reader-macro-aware autocomplete in the lisp ecosystem, for instance).

                                          1. 2

                                            Can’t one use ctags or similar for most languages? Emacs tags is supposed to handle lisps:


                                            Caveat, I was researching this this morning and couldn’t find any good docs on how to do this with Perl.

                                            1. 3

                                              CTags isn’t type-aware or context-aware at all AFAIK; it’ll suggest everything that matches the current text. That’s the bare minimum.

                                              1. 2

                                                ctags isn’t great since it requires rebuilding large indexes in medium or large projects, though. I think that usability could be improved with machine learning if that’s the only option, but still not convinced that there isn’t a more reasonable approach.

                                          1. 3

                                            It’s good to see that they’re on-track with releasing these bigger models. I’m grabbing the 744M one now, & I’ll see whether or not there’s a noticeable improvement in coherence.

                                            I still suspect that some of the threat is overblown (in no small part because getting a human being to write BS is currently cheaper, more effective, and easier to target than using automated text generation), but I’m glad to see that it wasn’t a way of keeping the model actually secret (like with racter and… well, a long history of text generator projects that people claimed were ‘too dangerous for mere mortals’).

                                            As Gwern Branwen noted, GPT2 output is really only convincing if you’re skimming, & passing for a drunk and/or insane human is still some ways in the future. But, a lot of us skim more often than we ought to, so that’s no great comfort. And, we all know people who would share an ‘article’ with a title they agreed with even if the contents were literally lorem ipsum.

                                            1. 1

                                              I guess optimizing for visualization is not the same as optimizing as comprehension…but we’ll get there…!

                                              Really amazing how they are handling it all.

                                              1. 2

                                                I guess optimizing for visualization is not the same as optimizing as comprehension

                                                I think it actually is (at least, so far as world-model-free or implied-world-model systems go).

                                                Like word2vec, GPT-2 takes a structuralist view of semiotics: that the meaning of words, rather than stemming from correspondence with things in the world, stems from association with other words as they are used, and these patterns of association are biased by their utility in playing language games, some of which have some relationship to the real world. For instance, it’s possible to convincingly describe a building by studying architectural terms in such a way that even architects are convinced, but when drawing a blueprint based on that description, or when building a model based on that blueprint, inconsistencies arise that make it clear that the description could not describe a real building: the language games in architecture are constrained in practice by space and gravity, which a system playing this game needs to learn to model accurately, but reading the writing of architects is not an effective way to learn physics.

                                                The alternative is a model-first text generation system – i.e., a system that has an internal model of the world & procedures for translating between that model and natural language. Usually, these systems are not based on neural nets (though there are a handful of exceptions that don’t work very well). Some good examples of model-first systems are SHRDLU (which is basically a physics model), TALESPIN (which models a small universe of fairy-tale characters who have internal state & drives & can communicate with each other), the lore generator in Dwarf Fortress, and most interactive fiction.

                                                (Grammar-based text generation is somewhere between: it has a model of how text is supposed to look stylistically, but doesn’t generally model how the semantics of that text are supposed to cohere. Advanced structuralist models like GPT-2 do really well at mimicing style – often better than grammars, which necessarily have limited novelty.)

                                                GPT-2’s attention is longer than most structuralist text-generation systems. When producing a numbered list, it can sometimes count to 15 before losing track of where it was. Fifteen points is more than a human skimming can keep track of, but less than a human paying attention can. Getting better coherence will probably involve storing more information about associations internally for each token, rather than merely stuffing in more data.

                                            1. 6

                                              I think this article is using the wrong measure, or at least unclear about what it is saying.

                                              The question is not whether the net value of software is positive, but whether the marginal cost of securing software is greater than the marginal benefit. It clearly isn’t for some companies: Equifax lost billions in market cap.

                                              1. 2

                                                Equifax lost billions in market cap.

                                                That’s an interesting example. Did Equifax lose market share? I.e., was the company’s ability to extract rents from the credit-verification process in any way impeded? Sure, stockholders (among them no doubt the leaders of the company) lost money when the stock went down, but was the company’s bottom line affected in any meaningful way?

                                                Equifax’s customers (the ones seeking to learn the credit-worthiness of the people who were affected by the breach) weren’t affected. Who cares if the bank from which you’re seeking a loan uses Equifax? Would you forgo a cheaper mortgage from one that does, just out of principle - especially if for all you know the competitors are just as bad?

                                                1. 11

                                                  I need to write this up at some point, because the belief that Equifax saw no consequences is really common. The short of it is that Equifax lost several hundred million, multiple executives lost jobs, and the loss of stock market value is important, because

                                                  1. the stockholders own the company (albeit with all the caveats you have to attach to that) and
                                                  2. many key players are compensated in stock

                                                  Everyone involved was incentivized to do better, but they had zero control of their own tech processes.

                                                  One thing I need to look into further is what drove the stock price to take such a big hit. Who expects what about Equifax’s future profits? I can’t answer your question about the impact was to Equifax’s market share, so thanks for that!

                                                  P.S. None of this is to say that they shouldn’t have faced more consequences.

                                                  1. 6

                                                    I look forward to reading anything you write up. I’m sure it’s all a bit more complex than I imagined, and I’d love to know more!

                                                    1. 4

                                                      A lot has happened since the news broke. I’m also interested in a detailed write-up on what costs and effects the breach had.

                                                  2. 1

                                                    Absolutely, & I think the reason so much software is insecure is that so many devs & managers make the same mistake in reasoning as OP (i.e., doing cost/benefit of bad software versus no software, instead of comparing bad software to no software, and thus accidentally constructing a set of practices and norms built on the assumption that good software is not possible).

                                                    The benefits of making marginally better software is generally worth the cost on society as a whole, since the ease of reproduction is an incredible force multiplier: a single developer might take a man-week to fix a particularly nasty bug or a man-month to do a complete refactor, but only days of only hundreds of running copies need to exist for that engineer time to be amoritized in saved machine time.

                                                    Other resources that are harder to quantify are arguably even more important: How much electricity are you saving & what’s the impact on carbon release? How much stress have you saved in the non-technical users who have no choice but to use the application as it exists? A few minutes of work can improve these metrics by orders of magnitude.

                                                    Now, the cost & benefits of society as a whole is very externalized from the perspective of a for-profit business. It’s almost never worthwhile for an individual developer to make their software any better than ‘good enough’, or for a company to do any more than slightly better than the competition. The bad software vs no software division is aligned in praxis with practices like rentseeking through frequent upgrades, writing obfuscated code for the sake of job security, hiring only inexperienced developers, letting upper management control the tech stack based on third-hand hype, wasteful project management styles like scaling scrum to hundreds of developers, and shipping big monolithic applications or using web tech.

                                                    1. 2

                                                      I like the analogy of user data / personal information to toxic waste. In the “good old times”, industries dumped effluent into waterways without any sort of intervention or regulation. After a while, legislation was enacted to prevent this.

                                                      GDPR is a step in this direction, I think. As flawed as it is, it does recognize consumers as having rights outside the dictates of a corporation’s EULA or Terms of Service.

                                                  1. 6

                                                    The author’s explanations are incomplete and likely to confuse.

                                                    The “imprecise definition” at the top cannot tell between a functor and a monad; it isn’t rich enough. For example, this Haskell type has a Functor instance but no Monad:

                                                    data Const b a = C b deriving (Functor)

                                                    Const clearly is a type wrapper with no direct way to get at values of type a, satisfying the imprecise definition.

                                                    The container examples ignore a massive caveat that manifests in every monad-bearing language. Because of the order of evaluation, along with the fact that monoidal structures stack and interact with each other (the Eckmann-Hilton argument, sometimes known as the slogan “monoids in categories of monoids are commutative”), the typical container forms a cromulent functor, but not necessarily a monad. In Haskell, the classic example is ListT and how it can fail to be a monad transformer.

                                                    Indeed, many containers have technical nits in their APIs which prevent monadic behavior. In Haskell, the classic example is the family of data structures in Data.Set; these sets cannot provide Monads due to weaknesses in Haskell’s type system.

                                                    The author briefly touches on continuations, but misses the important connections. A continuation type doesn’t just provide a monad, but a family of monads, via the “mother of all monads” construction. For each continuation type, there is an interesting collection of behaviors, and all of the other different monads can be implemented in terms of the “mother” continuation monad. Constructing a list monad, or another container-shaped monad, on top of continuations is very instructive; the amount of non-determinism in the list monad varies with the number of times and places that the continuations can be called.

                                                    I’m not sure what’s scary about mathematical presentations of category-theoretic concepts. If the author grokked categories of endofunctors, then they would more clearly understand how monads aren’t containers. Alongside their reading recommendations, I’d recommend Seven Sketches.

                                                    As a closing note, why are programmers afraid of maths?

                                                    1. 15

                                                      As a closing note, why are programmers afraid of maths?

                                                      Maybe because they’re told they need to “grok categories of endofunctors” and then linked to a 350 page book on an advanced math topic.

                                                      Look, I love math. I made my career teaching temporal logic to programmers, and it’s awesome. You know what the first major stumbling block for programmers is, though? false => true. That breaks people. Telling them they’re wrong about monads and throwing them in the deep end is a terrible way to get people to like using math.

                                                      1. 4

                                                        I personally feel that the word “implies” is too strong and may have been created by a lack of words for an inability to disprove. “Does not disprove” is probably closer to how most think about it. A false statement can’t be used as evidence against any statement. To actually meaningfully prove something your claims must survive evidence against, so it makes sense to have a term that represents surviving attacks however weak. I’m sure this also captures a little bit of Boole’s biases around what something failing to be disproved means, after all he was intensely religious. Still the operation is pretty useful, and will likely continue to be.

                                                        1. 2

                                                          Sure. I don’t care whether people like using math; math is still an essential part of existence, and in particular of writing code. One does not have to enjoy a task to not fear it. My coworkers react to matrix multiplication like they would to snakes or spiders, and I think that that is ridiculous.

                                                          I will readily admit that I am broken, and further that I believe that it’s not possible to think like a computer without breaking oneself. But the reward of the study of maths is that there is a deep reason why false -> true and false => true show up. If one has already sacrificed their sanity in order to understand how to write code, one might as well take in the beauty of the works of mathematicians, since it is only with this other-than-sane viewpoint that the beauty is visible.

                                                          1. 4

                                                            I mean breaks them as in “it’s really, really hard to get them to understand it”. I lie awake at nights trying to find better ways to explain it. And most programmers don’t need to know that to write code. People who want to write formal specifications of code need to know it. Not everybody needs to do that either.

                                                            But the reward of the study of maths is that there is a deep reason why false -> true and false => true show up [link to (-1)-categories]

                                                            That is a terrible explanation. Here’s a much better one (which still, admittedly, isn’t that great):

                                                            “If x > 5 then x > 0, right? So x > 5 => x > 0. But now let’s pick x = 3. [now] 3 < 5 and 3 > 0, so we have false => true. So you see, intuitively you’re already comfortable with F => T, it’s just that it looks weird when we formalize it.”

                                                            Do you see why that’s a better explanation?

                                                            (edit, added a spacer)

                                                            1. 3

                                                              One reason this is a better explanation is that you sort-of described what the symbol => means though context. I still don’t know specifically what it means though in this context, though. Is this a Haskell symbol or a temporal logic symbol?

                                                              You lost me on “x = 3. 3 < 5 and 3 > 0”, because it’s not immediately obvious that the . denotes the end of the sentence (I had to read it multiple times before I realized you had written x = 3. 3 < 5 and not x = 3.3 < 5. It’s also confusing that two more symbols F and T are introduced at the end, this time with no context clues to infer their meaning.

                                                              1. 1

                                                                Oh to clarify this would be in the broader context of teaching someone propositional logic, so they’d know => means implication. P => Q means that if P is true, then Q is also true. As @voronoipotato said, it’s technically closer to “is at least as strong as”. At this point I’d also have introduced the shorthand for T and F.

                                                                1. 1

                                                                  Thanks for the clarification. I initially tried reading it as “implies”, then as a Haskell fat arrow, and neither made sense to me. Reading it as “is at least as strong as” makes a lot more sense.

                                                                2. 1

                                                                  FWIW => is a pretty standard asciification of ⇒, and -> of →. Both of these symbols are used to mean material implication in mathematical writing. If you see them both in the same place, you’re probably looking at formal logic of some kind, and there’s likely an important technical difference between the two. I won’t get into Haskell or TLA+ syntax here, or even constructive vs classical logic, but yeah there are more subtle distinctions to be confused by here.

                                                                  When I have to explain ->, I just say P -> Q means (not P) or Q. Maybe write down a truth table. In my experience, even programmers can usually figure that out.

                                                          2. 5

                                                            As a closing note, why are programmers afraid of maths?

                                                            My university mathematics ended after the third semester of calculus – a requirement that only existed because, where I went to school, computer science was part of the engineering department. Most working programmers with CS degrees got them from places that didn’t require them to go beyond one semester of calculus. A lot of working programmers don’t have degrees at all.

                                                            Haskell evangelists make the claim that monads provide specific utility to everyday development tasks. Devs who want to determine whether or not this claim is true. Even if they knew it to be undoubtedly true, they would not generally be willing to go back to school & attend four semesters of mathematics courses in order to get incremental gains in reliability or productivity. (Working programmers have a tendency to ignore or avoid techniques that provide much more substantial gains in reliability & productivity because of much smaller initial learning curves than group & category theory.)

                                                            One way to thread this needle is to stop claiming that the benefits of monads are accessible to developers who do not also have a graduate degree in mathematics. (This would probably kill some of the momentum behind the adoption of functional programming techniques – which, though hype-driven, is long overdue & is liable, if it continues, to substantially improve the general quality of software & make software that takes advantage of multiple cores a lot more common.) The other is to write explanations that, while wrong, are less wrong than what your average code monkey already believes about monads while being accessible to said code monkey. (This annoys everybody who knows more than the author, but provides some utility, since readers gain the confidence to actually use monads without fully understanding them.)

                                                            1. 1

                                                              (This annoys everybody who knows more than the author, but provides some utility, since readers gain the confidence to actually use monads without fully understanding them.)

                                                              I wanna add that this is not even necessarily the case. Leaving information out and skewing details are very well known teaching methods. Take continuous functions as an example. In school they’re “functions that you can draw without taking the pen off the paper”. For a mathematician a more fitting explanation is “small changes in inputs cause relatively small changes in outputs”, since even continuous functions can have holes.

                                                              1. 2

                                                                Yup, ‘lies for children’ are almost unavoidable. It’s still annoying to read something when you’re not part of the target audience, though, which seems to be the complaint here – somebody with a strong background in category theory being irritated at the reminder that introductory materials exist.

                                                            2. 5

                                                              Programmers are afraid of math because they never learned it, obviously. We often only have one or two classes on proofs as a prerequisite for programming, and they are introduced near the end of our education. Mathematics without proofs is like painting by number. It’s no wonder most people feel alienated by it, they are asked to trust the conclusions of others without meaningful evidence. Most of these claims are often not readily available to the intuition. People who simply do as they are told and follow instructions perform quite well at “mathematics” as it is taught. The rest, those who are capable of questioning, would perform quite well at actually proving things are weeded out long before they would ever have any opportunity.

                                                              1. 1

                                                                I don’t think most programmers end up studying proofs in university at all. I only did because I took math electives, & most CS degree programmes are much less mathematical than the one I had.

                                                              2. 4

                                                                Writing clearly and concisely in a manner appropriate to the audience is a skill. The author managed this and I’m grateful.

                                                                It would be good to see corrections in the same language (a mix of plain English and commonly-understood programming language).

                                                                Explaining maths in maths doesn’t work very well when the audience aren’t necessarily mathematicians.

                                                                It’s the same problem as programmers explaining programming concepts to non-programmers. Using plain English for this is a hard skill - harder than learning to program.

                                                                1. 2

                                                                  There is no such thing as plain English. (If you still disagree, I respectfully invite you to formally define it.)

                                                                  I do not want the author to correct their monad tutorial; I would like the author to not write monad tutorials. Monad tutorials are deeply harmful. They do violence not only to the concept of monads, but to the audience’s ability to internalize concepts with their own personalized schemata and experiences.

                                                                  By analogy, I’d like to consider another concept which appears in many programming languages and which many people develop an intuition for: Numbers. Imagine if programmers were required to build up a working concept of what numbers are and how they work. Do you suppose that people would write number tutorials? Would they explain how numbers work by analogy? It’s easy enough for me to imagine that the author would write some copy along those lines:

                                                                  Imprecise definition: A number is a type that counts an object of another type. There is no direct way to get each of the ‘inside’ objects. Instead you ask arithmetic to act on the number for you. Numeric classes are a lot like classes implementing the composite pattern, but numbers are capable of returning something composed with another number.

                                                                  Would you really excuse them if they later tried to explain, formally:

                                                                  The concept of numbers comes from arithmetic.

                                                                  A number tutorial would be a folly precisely because we hope that folks will build a robust and flexible concept of numbers which can stretch beyond the integers or other familiar domains. Similarly, monad-tutorial-oriented teaching leaves students without a concept of what monads generally are, once we leave the computer and explore the wider world. How will folks learn about the monoidal behavior of monads without understanding that a monad is a certain sort of monoid? Category theory is the most generic formalism yet for discussing reality at large.

                                                                  Every programmer is a mathematician, as a matter of necessary practice. I studied music, not maths, but I nonetheless am not excused from mathematical thinking when writing code.

                                                                  1. 2

                                                                    You’ve never seen a tutorial about how to start with the everyday concept of counting numbers, and then build up more and more complicated notions of “number” from these until you reach octonions? (Or go down and define natural numbers in terms of ZFC?)

                                                                    1. 1

                                                                      I find it telling that you did not link to any sources. I can produce the evidence, but of course it will favor my position, as I am biased. We’ll look at constructing the reals from the naturals, the octonions from the reals, and natural numbers in ZFC.

                                                                      First, construction of real numbers. Let’s compare some sources. Wikipedia starts from the perspective that there are many different constructions, and that they all involve rational numbers. Wikibooks emphasizes the need to ground the reals in axiomatic foundations, and not to assume that they exist. In both cases, some prior knowledge is assumed; the construction isn’t from-scratch on a single page.

                                                                      Second, construction of octonions. Wikipedia mentions each step of the construction, including the familiar example of complex numbers. Baez is, to me, an extremely casual and friendly approach to the topic, but note that they do not drop formalities:

                                                                      It would be nice to have a construction of the normed division algebras ℝ, ℂ, ℍ, 𝕆 that explained why each one fits neatly inside the next. It would be nice if this construction made it clear why ℍ is noncommutative and 𝕆 is nonassociative. It would be even better if this construction gave an infinite sequence of algebras, doubling in dimension each time, with the normed division algebras as the first four. In fact, there is such a construction: it’s called the Cayley-Dickson construction.

                                                                      And, finally, natural numbers in ZFC. Wikipedia has answers and examples. In particular, Wikipedia contains an important note as its first line:

                                                                      Several ways have been proposed to construct the natural numbers using set theory.

                                                              1. 17

                                                                Do not delete the path part of that URL, yikes.

                                                                Anyway, what is “Suckless”? That’s what I was trying to see, and instead got an image of a naked man holding a bottle of wine.

                                                                1. 16

                                                                  For Suckless, see https://suckless.org/, not the users subdomain.

                                                                  It’s a project/group related to cat-v and classical-unix/plan9 advocacy, rejecting tools that “suck” and wanting to replace them with “simpler” alternatives (dwm for window managment, st for terminals, dmenu for reading keyboard input, …). This often entails that configurations have to be applied pre-compilation and that the default distributions of various tools and projects are pretty lean – hence additional features are collected as patches, which are listed here, showing which can be successfully applied, and which can’t.

                                                                  1. 4

                                                                    I can report that dwm and st are great tools.

                                                                    The only hitch is recompiling them after modifying their configuration files, which are written in C. Many people don’t like this. Some, like myself, don’t mind.

                                                                    1. 3

                                                                      I used st (off and on) for a while (~1yr), and for me the biggest annoyance was having to rebase some patches when multiple patches modify similar lines of code. Once that headache was resolved, it was generally OK unless some st commits triggered rebasing some stuff again. Basically it was all the fun of maintaining your own branch of st with patches someone else wrote.

                                                                  2. 13

                                                                    Suckless was in its heyday around the time of the systemd eruption, as far as I know. This would be around 2010. Slightly prior was this one weird viral video of an artist named Gunther, a self-styled “sex prophet,” who made the rounds with a (completely SFW in the most technical of senses, though apparently not germane to your sensibilities, bheisler, which is fine with me, thus this explanatory note to lessen the blow of freakishness herein) music video called “Ding Ding Dong.” Pop music beats, euro summer beach ditzy style. Not amazing, but pretty good, definitely unique. The naked man is that same gunther. Just wanted to clear that up, because this is a clear case of an overreaction to a misunderstood joke. As far as I know, the suckless community was and is to the extent that it still exists, pretty insular. Probably didn’t anticipate being posted on an HN style board

                                                                    1. 7

                                                                      Probably didn’t anticipate being posted on an HN style board

                                                                      Lobste.rs has even “suckless developer” hat used by several people. Not quite buying the unanticipated part.

                                                                      1. 1


                                                                        Would you, however, admit that Gunther, the individual who presumably is the man behind gunther.suckless org, is not the OP of this link?

                                                                        In admitting this, if you do admit this, are you not therefore forced to agree with me that the post we’re discussing was not intentionally put forth as a display of nudity to eyes averse to that same nudity?

                                                                        If a list of patches to utilities and other programs is hosted at a path of a subdomain which contains the image a naked man holding a vertical wine bottle (with suggestive verticality) is posted without awareness of the suggestive verticality of said bottle, then can’t we conclude that the proximate nature of that suggestively vertical bottle to said list of patches to utilities and programs is in some sense accidental, and therefore unanticipated?

                                                                        By this argument, I intend to demonstrate that your claim, while seemingly reasonable, is eliding the quite clear nature of the circumstances, in an effort to maintain that all suckless developers and subdomain holders should be aware of all possible audiences for their online “speech” (or however you wish to define what the image is), when in fact it is absurd to believe that all speech of all suckless developers would be anticipated to agree with all possible audiences. I’m afraid that, unless Gunther appears to justify his position, we’ll have to remain in a misunderstanding silence regarding the reason why a suggestively vertical bottle and naked man are so closely associated with this list of patches.

                                                                        I tried to explain it, because it seemed necessary to explain, to me. Perhaps one day, your doubt regarding this explanation will itself be exposed to the eyes of someone on a far away news site, and they will be as horrified as if they had seen a vertical and suggestively placed bottle.

                                                                        1. 2

                                                                          @varjag simply wanted to inform you that @FRIGN not only has an account here, but also has the [suckess.org developer] hat. So a lot of the community knows about Suckless (presumably not @bheisler, who asked the question in the first place).

                                                                          I must confess to be in the same position as @bheisler. I knew of suckless, but had no idea what the linked page meant in context of that project.

                                                                      2. 3

                                                                        So the guy probably thought since he had the same name as this weirdo that for internet reasons (remember when memes were cool and unique signifiers of in-group identification?) it would naturally follow to have him around on the ol’ personal page

                                                                        1. 2

                                                                          Sorry for the long-winded explanation, but I miss the old web, and I am not even old! Would you, Herr heisler, have been hip to a tidy game of Flash-powered Sandspiel, even if it were on a subdomain of ebaumsworld?

                                                                      3. 8

                                                                        The suckless project makes and maintains a bunch of Unix programs that meet their definition of “sucking less” - http://suckless.org/philosophy/

                                                                        I’ve been caught off guard by them offering personal subdomains on their site before, too - suckless.org is SFW, but any individual subdomain?

                                                                        I use and like dwm when I can.

                                                                        1. 17

                                                                          They like to send mail from hosts with names like wolfsschanze. You can also see FRIGN’s opinion about diversity as shared on lobsters. Or the time someone pointed out there are torchlit marches at suckless conferences and someone else asked FRIGN to clarify and he basically admitted to being a white nationalist, complete with dogwhistles like “cultural marxism”?

                                                                          I’m not saying that suckless is definitely a white nationalist organization but I am saying someone would have to do a lot of work to convince me otherwise.

                                                                          1. 4

                                                                            Must we do this everytime someone posts something suckless related? Can we please just talk about technology instead of all this political nonsense and random accusations?

                                                                            1. 13

                                                                              Look, for every person who thinks this is “political nonsense and random accusations,” there’s at least one person who thinks this is so damning that they want literally nothing to do with suckless ever again.

                                                                              And despite Lobster’s general “politics is off-topic” policy, this thread is literally someone asking “what is ‘Suckless’?”, so if it’s on-topic anywhere, it’s here.

                                                                              1. 2

                                                                                Please see my reply above.

                                                                                1. 5

                                                                                  Um. Welcome to lobsters? A couple of words to a wise guy:

                                                                                  1. Your previous comment is not “above” this one. The whole tree gets reordered based on upvotes.
                                                                                  2. That stream-of-consciousness-wall-of-text style may play well wherever @enkiv2 invited you from, but it’s gauche here. At least, I find it exhausting more than amusing.
                                                                                  3. For heaven’s sake, please don’t feed the trolls! No matter how many big buckets of troll slop you may have handy.
                                                                                  1. 0

                                                                                    Thank you, minimax! – for your welcome, since it is utterly welcoming. A couple more words in response, and whether they contain a wisdom equivalent to my similar and apparently inherent quality of same is entirely your determination. I am so grateful to have run into an authority on these matters. Perhaps you can finally solve the trolley problem for us all, and divide good people from bad ones, as you scry into your palantir of forum posts.

                                                                                    To wit -

                                                                                    (1) My previous comment is in a tree of comments.

                                                                                    (a) What is the precise and preferred nomenclature, such that an ignoramus could understand?

                                                                                    (b) In the sense that a tree (such as this comment tree) goes from a single node to plenty of nodes, is it entirely inappropriate to say “above” in order to indicate, where n is the depth indicated away from the origin, trunk, root, or base of the tree, the position n - 1? I understand if your perspective is like the protagonist of Ender’s game, and you feel like n-1 compared to n is down, not up, but Ender held that of his enemies, and I am not yours. Are you mine?

                                                                                    (2) I don’t care. Actually, like a total four-year-old, I feel an evil glee.

                                                                                    (a) When you say, “stream-of-consciousness-wall-of-text,” you are committing a grammatical error by hypenating between “chunks” of words. One noun is “stream-of-consciousness” and the other is “wall-of-text,” and, while neither necessitates hyphens, it is an elegant stylistic choice, and redounds back upon my usage of “implied-by-you.” But the nouns you connected simply don’t need to be joined. In fact, they should be separated by a comma. I’m running out of breath just looking at it.

                                                                                    (b) Gauche – what is the meaning of this word in the sense you’re applying?

                                                                                    (b, cont.) John Ohno is no concern of yours in this regard, is he? What are you, a partisan of webbiness that wants to condemn hypertext? What beef could you possibly have with the guy? How do you even go from his proto-post-communism on the one hand and quasi-Ludditic radically conservative ideals of “small computing” on the other, to me? Am I to consider you as thinking that my response, “below,” (in opposition to ngoldbaum’s unfair condemnation of an entire ideal of technical practice in contemporary FOSS on the basis of his own flawed reasoning, equating cultural marxism, which predates the ilk whom ngoldbaum is, in abject ignorance, confusingly attempting to condemn, by about 45 years) the same as enkiv2’s opinions?

                                                                                    (b, cont.) That you find it exhausting to read: good for you. :)

                                                                                    (3) This would be humorless, except it is meaningless.

                                                                                    Please, oh minimax, solve the trolley problem, since you know how to identify trolls and can give advice to the gauche. I am happy to lay on the tracks if you want to flip that switch to experimentally determine once and for all whether it is worth saving some arbitrary group of people as opposed to me. Regarding the basic subject matter at hand, which is suckless, and someone’s unfair-in-my-opinion (see how that’s grammatical?) condemnation of suckless, I should say that I find a policy of opposition to affirmative action intolerant. I support techne, and it follows that I support suckless. It does not therefore follow that I support what ngoldbaum very confusedly understands to be a persecution of the Jews by FRIGN. This seems absurd to have to point out, but here we are. Again: I find intolerance disgusting. I also find vendettas disgusting. Lastly, I find hubris disgusting. I am painfully aware that I, too, sadly lack the cleanliness that would come with an absence of this very quality. However, you have to admit, your hubris in judging me is incomparably greater than my hubris in defending myself against your allegations of . . .

                                                                                    1. Being a “wise guy.”
                                                                                    2. Having a “gauche” “style.”
                                                                                    3. Having an exhausting and unamusing style.
                                                                                    4. Feeding the trolls, in contradiction to the “sake of heaven.”
                                                                                    5. Having handy “troll slop.”

                                                                                    Your welcome is most welcome.

                                                                                    And you’re welcome.



                                                                                    P.S.: “A couple of words” is merely a figure of speech! And you don’t have to type “um,” even if you habitually say it!

                                                                                    1. 4

                                                                                      This sardonic flippancy is tedious and unwelcome. Please treat others better than this.

                                                                                      1. 2


                                                                                      2. 1

                                                                                        (a) What is the precise and preferred nomenclature, such that an ignoramus could understand?

                                                                                        I prefer to simply provide a link to the comment.

                                                                                        (2) I don’t care. Actually, like a total four-year-old, I feel an evil glee.

                                                                                        This is not a good attitude to have on Lobste.rs.

                                                                                        (b) Gauche – what is the meaning of this word in the sense you’re applying?

                                                                                        I’m not @minimax, but I would read it as “socially awkward”.

                                                                                        (b, cont.) John Ohno is no concern of yours in this regard, is he?

                                                                                        Actually he is, as he invited you and has a certain responsibility for that invitation.

                                                                                        1. 2

                                                                                          Yeah, um, @lettucehead, please don’t get yourself banned. I would not have invited you if I didn’t expect you to acknowledge community norms & practices.

                                                                                          1. 0

                                                                                            I just saw your reply to this thread, and I want to thank you again for the invite, and assure you that I won’t be a troll or otherwise possess sardonic flippancy in the future. Well I will try to tone it down. A lot.

                                                                                            I still have all my questions from this thread (how the heck can somebody using the words “cultural Marxism” to discuss radical forms of Marxism having to do with culture, which are genuine phenomena, be considered an anti-Semitic “dogwhistle?” Why was I considered a troll for pointing out this exhausting and unfair absurdity? Will pushcx ever change his mind about my sardonic flippancy, and see it for the charmingly wonderful firehose of Furby-faced unicorns it really is? Like the center of a Tootsie Pop’s per-lick depth scalar, the world may never know)… Thus I have decided to just let it go. Or maybe I’ll start a tech blog and collect $20 from Drew DeVault.

                                                                                            I just wanted to make a splash. I will certainly be more careful moving fwd, and not imperil your reputation. Any further than you yourself do all the time with all the “small computing” heresies I hear you’ve been spreading among the faithful, turning Microsoft customers into the reprobate worshippers of Alan Kay. Tsk, tsk. Cheers

                                                                              2. 1

                                                                                Hey, because minimax decided to play mod with my “gauche style,” and I suspect he just disagrees with what he believes to be my assumptions about what you said, I have some further, legitimate, serious questions. What can you say to substantiate your reduction of the “stream-of-consciousness, wall-of-text style” (to use minimax’s phrase with my improvement) post by which FRIGN “[clarified,] and … basically admitted to being a white nationalist,” in the torchlit marches link, above?

                                                                                I’m honestly confused, I just don’t see how you get that from what he said. Can you, please, substantiate your reduction of what he actually said, to what you said he said?

                                                                                Or, can you remove your unnecessarily politicizing post, in violation of pushcx’s general wishes for this forum? I will happily delete (or respect the deletion of) my replies to it, so that we’re “even.” But let it be known, I do wish substantive answers because I am sincerely curious about your opinion and understanding, and would rather not have the kabosh put on a polite and principled discussion. We’re all crustaceans here, instead of denizens of the orange site, because the discussion is of a much higher quality. At least, that’s what I’m here for, and I care deeply about that.

                                                                                I should also add that I never would have been aware of any rift between certain members of this community were it not for one of your posts on almost the exact same subject several months ago, and while I have picked on specific points of contention regarding the “dogwhistles,” I was glad to receive the intelligence represented by your… saintly screeds… in this regard, both initially and now.

                                                                                1. -5

                                                                                  I believe your characterization of FRIGN and some generally-applicable ad hominem arguments about suckless devs as a whole are accurate and appropriate. Furthermore, I do think it’s not unreasonable to maintain that the qualifier “definitely,” being dropped, would result in a statement of something that you are indeed saying. I encourage you to unequivocally embrace your own opinions, since greater accuracy and forthrightness about a diminished predicate (the implied-by-you “absolute” white-nationalism of suckless being reduced to a mere quality thereof) will remove the difficulty necessitating a disavowal of your own opinion in the first place.

                                                                                  It is an intellectual error to equate white nationalism with opposition to cultural marxism. The preeminent hypervisor over the various and factional containers of that latter opposition, Jordan Peterson, was interested when Zizek pointed out that during the passion of Christ, he said, “Why hast thou forsaken me?,” a point of contention in scholastic philosophy that, from Zizek’s point of view, cut at a certain root of Peterson’s misunderstanding of what communism was all about, in relation to the nominal subject of their appearance together recently. The fact that that seems unrelated, is because it is. However, it is definitely in the strictest possible sense of “relating to definition,” relevant to cultural marxism as such. All this is to say – there is such a thing as conversation, and it is stymied when an equation is made between unequal parts. I dont dispute the apparent co-location of nationalism and anti-Marxism, but this goes without saying, and I don’t dispute the divergent interests of “whiteness” (as concieved by the so-called cultural Marxists) and “culture” (read: “diversity;” as conceived by the self-styled neoreactionaries).

                                                                                  In the final analysis, we’ll all go along with some eventual victory in the political arena, and either condemn or glorify the ideologues of the suckless branch of post- simplicity accordingly, but that victory has not yet been obtained by either belligerent party in this technical and confounded arena. Until then, FRIGN is probably gonna go on with his agenda in every sense, the mods are gonna maintain their positions of relative non-interference, and you might remain willing to conflate ethics with techne. I shall not.

                                                                                  (The only remaining position is cultural Trotskyism!)

                                                                              1. 2

                                                                                What am I looking at?

                                                                                It doesn’t help that the page overflows the margins on my browser (Chrome on maOS, full screen).

                                                                                1. 1

                                                                                  Hm, it works fine for me (chrome linux). Do you have javascript turned off or something?

                                                                                  It’s a digitization of Vladimir Nabakov’s famous parallel novel ‘Pale Fire’, using the XanaduCambridge demo. If you click any of the selected sections, it’ll display a beam/bridge to the corresponding section in the other columns. Ted walks through it and explains in this video, but it’s more interesting to do it yourself than to watch somebody interact with it for you.

                                                                                  1. 1

                                                                                    I don’t bother blocking JS.

                                                                                    Here’s what it looks to me: https://www.dropbox.com/s/750cd1u3wweg5o5/Screenshot%202019-08-09%2020.46.36.png?dl=0

                                                                                    Borderline unusable, especially the horrible ragged right margin.

                                                                                    But it’s cool that Xanadu is actually up and running after half a century in gestation!

                                                                                    1. 3

                                                                                      Hmm, it looks like a legit bug in detecting the window size.

                                                                                      Xanadu Cambridge is one of 2 web-based demo implementations. (The first one, OpenXanadu, was released in 2013 or 2014, & was developed at the Internet Archive; I contributed a couple small things to it, in addition to a bunch of work on a caching proxy that ended up not being used. Cambridge was developed at Cambridge starting shortly before I left the project, and I think it got released around 2017.) There’s a desktop implementation currently under development, but it looks like it’s unrelated to the desktop implementation I worked on from 2011 to 2016 (itself a reimplementation of a desktop client developed by Rob Smith around 2007). Meanwhile, the folks who developed what later became Udanax Green and Udanax Gold (released in 1999) at XOC and Autodesk have, intermittently, been returning to those codebases. So, there’s actually a lot of work on Xanadu and a lot of different versions in a runnable state – though Ted doesn’t like to release or publicize things that he doesn’t consider to be worthy of shipping.

                                                                                      1. 2

                                                                                        Thanks for posting the link anyway.

                                                                                        1. 1

                                                                                          It looks similar here. I can drag the left frame into view if I hit the correct spot on the title bar. (It’s pretty mysterious which parts of the title bar act as drag/resize vertically/resize 2d.) And yeah the hard-wrapped text isn’t particularly readable unless you resize the frame to be wide enough.

                                                                                          1. 1

                                                                                            It’s weird that there’s hard wrapping in the first column (since Ted’s against it), & so I suspect that it’s actually some kind of limitation on how text is laid out in order to support beams. (When we implemented that feature, it was complicated & we had to write a brand new layout engine to support it, in which differences between expected font sizes & actual as-rendered font sizes would produce a lot of jaggedness.) I’ll best the heuristic for layout couldn’t be made reliable because of client-side font availability or something. However, I never worked on this implementation so I don’t know for sure. OpenXanadu didn’t have this kind of jaggedness. (It’s also present in the unauthorized XuCambridge fork that was posted here a few months ago.)

                                                                                  1. 2

                                                                                    This sounds a bit like the Canon Cat (wherein everything is part of a single, perpetually-open text document, most navigation is built on searching, and even code is contextualized as part of the document in which it is embedded).

                                                                                    Alternatively, the author may want to look at the OS of the Cambridge Z88 (the last machine to be produced by Sinclair, albeit not with the Sinclair name). It has an interesting way of combining text documents with spreadsheets & making the same operations apply to both, reusing special column-overwriting rules for layout purposes. (The Z88 has other interesting UI features as well…)

                                                                                    1. 3

                                                                                      This certainly covers the ‘happy path’ of GUIs – the stuff we’re all familiar with, plus a handful of others in the 1980s section – but I’m disappointed that it didn’t cover interesting-but-unfamiliar experiments.

                                                                                      1. 3

                                                                                        Not necessarily the happy path, but the well-trod path at any rate.

                                                                                        1. 1

                                                                                          Like which ones?

                                                                                          1. 2

                                                                                            Plan9’s rio/acme, colorforth, mesa, morphic, swyft, and NeWS, to name a few.

                                                                                            1. 1

                                                                                              Has anyone written about them? I’d love to read a piece on them.

                                                                                              1. 2

                                                                                                I’m working on a book on the subject of unusual UIs, and so I’ve been gathering documents on them here.

                                                                                        1. 21

                                                                                          Just a list and no explanation, quite uninteresting.

                                                                                          1. 8

                                                                                            Hey, so thanks for the criticism (I think). This is the 4 year old party I was talking about. It’s a fun format of rants in a list. I agree it’s not for everyone. https://spaceninja.com/2015/12/07/falsehoods-programmers-believe/

                                                                                            1. 8

                                                                                              I think people have the same problem with every list of this genre: There’s no explanations and no suggestions.

                                                                                              There are, implicitly, problems to avoid, but even that has limits, in that it assumes the programmer is trying to write the most generally applicable software, possible or otherwise. For example, from “Falsehoods programmers believe about time”: “The system clock will never be set to a time that is in the distant past or the far future”. Depending on the software, and how you define “the distant past or the far future”, you can assume this if you document it as a requirement. Kerberos does precisely this as part of its security model.

                                                                                              So in treating these things uniformly as “falsehoods” these lists assume that engineering trade-offs don’t exist, or that making such trade-offs is incorrect somehow.

                                                                                              1. 1

                                                                                                Well the statement that it will “never be set to a time in the distant past or the far future” is a falsehood. If Kerberos engineers had not considered this then their spec would have a gaping hole in it. So it sounds useful to me. The idea that the statement is carte blanche useless because in one extremely niche scenario you can as a working model assume that the time is not in the distant past or far future is pretty contrived. People will still violate the spec, you’ve just made it a scenario you don’t have to concern yourself with.

                                                                                                I do think lists of “Falsehoods” are “Brains not included”, you have to use your own mind and knowledge to consider how these scenarios may apply (or not apply), and that doesn’t mean they aren’t useful. For example in this article I noticed at least 3 things in our application that I hadn’t considered. Pretty useful stuff.

                                                                                                1. 1

                                                                                                  The idea that the statement is carte blanche useless because in one extremely niche scenario you can as a working model assume that the time is not in the distant past or far future is pretty contrived.

                                                                                                  I said the exact opposite: The statement isn’t completely true because of examples like Kerberos, so pretending that it’s necessarily a falsehood is wrong.

                                                                                                  1. 0

                                                                                                    I’m pretty sure you didn’t say the exact opposite, and I don’t even know what that means for this statement. Kerberos does nothing to protect you from getting distant past or future, it just means you are violating the spec by doing so.

                                                                                              2. 4

                                                                                                Almost all of the “falsehoods programmers believe” articles share this problem, though: they’re just a long list of stuff labeled “this is wrong”, but with no explanation of why those things are wrong, or what someone should do instead. This makes them extremely unhelpful.

                                                                                                1. 4

                                                                                                  I strongly disagree that they are unhelpful to everyone, though I do think they are less accessible to beginners. Some of these falsehoods don’t have a thing you can do instead. Some of them don’t have a good explanation as to why it is false. That doesn’t mean it’s not useful to know that it’s a potential pitfall when you hear it. Some of these you will do knowing they are a falsehood because there is no “good option”. In life we don’t always have a clear and obvious best option, but having a heuristic around risks is still useful.


                                                                                                  1. 1

                                                                                                    The typical list-of-bullet-points “falsehoods” article, though, doesn’t provide enough information for anyone to decide “this has no good option, I’ll pick the least worst based on tradeoffs”, because it doesn’t say why the things in its list are wrong. If people were doing comparative explanations of why certain assumptions cause problems, and going over the tradeoffs involved, that would be useful. But they’re not: they’re just posting a list of “this is wrong and no, I’m not telling you why or what you could learn about the problem domain to let you make better choices”. Many of them verge on, or simply are, pure self-congratulatory “I know more trivia about this than you do”.

                                                                                                  2. 3

                                                                                                    Well-structured articles of this type imply underlying situations and behaviors by the order in which elements are listed, so that if you’re following the list, you end up with a general understanding of the landscape being described. This one mimics the structure only shallowly, though: you don’t, by reading it, get an understanding of how search is actually used or what kinds of problems you run into (although search is a pretty diverse space & depending on your data set & your user base’s needs, completely different behaviors are appropriate, which makes it a poor fit for this kind of list).

                                                                                                    I’m sort of tempted to write a different version of this list, keeping the “falsehoods programmers believe” format, to illustrate this point. When such a list is well-written, an intelligent reader (even one with no deep knowledge of the subject) ought to require no explanation for each point, because the order of the points has led them to update their mental model incrementally such that each point can be justified based on a generalization of the unstated logic behind the previous points.

                                                                                                    This one doesn’t do that, but instead just sort of skips around. The points that are obvious to people outside of search are things like “users will not expect search to act like google” – in other words, sort-of-cheap-shots about end users that don’t necessarily apply outside general-audience systems & don’t really need to be said in the situations where they do apply. Other points (like “search is not a database”) are deeper & really do need to be said, but probably ought to be contextualized so that they’re understandable.

                                                                                                    1. 1

                                                                                                      Well-structured articles of this type imply underlying situations and behaviors by the order in which elements are listed, so that if you’re following the list, you end up with a general understanding of the landscape being described.

                                                                                                      I’m not sure that I’d agree with that. Or, at least, I’d dispute how many “well-structured articles of this type” are in existence.

                                                                                                      I’m sort of tempted to write a different version of this list, keeping the “falsehoods programmers believe” format, to illustrate this point. When such a list is well-written, an intelligent reader (even one with no deep knowledge of the subject) ought to require no explanation for each point

                                                                                                      This reminds me of “well-written code doesn’t need documentation because it’s self-documenting”. Which is something that’s perhaps true in theory, but which I’ve always found to be false in practice.

                                                                                                      A little while ago I tried taking a different approach to this sort of article, to show what it would look like: the “truths programmers should know” isn’t a list of bullet points, and does go into detail on the problem domain to explain what’s going on and why common assumptions about it might fail. I don’t see why other “falsehoods programmers believe” articles couldn’t be written the same way.

                                                                                                      1. 3

                                                                                                        I’d dispute how many “well-structured articles of this type” are in existence.

                                                                                                        For sure, they’re a rarity. “Falsehoods programmers believe about names” does this, though.

                                                                                                        This reminds me of “well-written code doesn’t need documentation because it’s self-documenting”. Which is something that’s perhaps true in theory, but which I’ve always found to be false in practice.

                                                                                                        I wasn’t going for that take at all.

                                                                                                        Communication isn’t really a matter of conveying meaning by encoding that meaning (since that kind of communication can only express trivial truths), but by creating an environment that constraints somebody’s existing world model in such a way that the only way to process the message produces a change to the model. A teacher isn’t telling a student a sequence of facts, but asking a question in such a way that answering the question requires them to independently reinvent the theory behind the answer, and a good teacher knows how to do this incrementally so that each discovery is low-effort.

                                                                                                        In other words, this kind of article oughtn’t be a literal list of falsehoods so much as a tour through the intellectual space of the subject being described by way of iterative violations of successive models.

                                                                                                        Doing this requires us to begin with an understanding of what the reader already thinks (in the case of names, that one can implement a name form as two input fields that take ascii text, or in the case of time, the idea of newtonian universal time.) Each ‘falsehood’ in the list causes the reader to transform his mental model of an appropriate implementation in a predictable way, and so the order is determined so that it leads the reader from the most obvious model to the most correct model with a minimum of effort on the part of the reader, while still making the reader actually determine both the reasoning & the solution themselves.

                                                                                                        This is a hard thing to do with search, compared to names or time. Everybody with a CS degree was at one point asked to deal with name records in a naive way as part of some class assignment, & everybody except the sentinelese has basically imbibed newtonian time. Relatively few people think even shallowly about search implementations, so there aren’t obvious-but-false starting points that are easily identified: the points OP rejects are actually more nuanced than what J Random Hacker would probably come up with immediately. And, on the other side, there isn’t a maximally-flexible ending point: ultimately, you need completely different kinds of search systems for different types of data & different types of users (something management learned the hard way when they tried to force patents, trademarks, chemical, and scholarly journals to all use the same underlying search engine!)

                                                                                                  3. 4

                                                                                                    That there’s an equal, large number of upvotes for the article and your comment is itself interesting. Does that mean the content was interesting to half with others wanting different style? Or interesting to most of them who then agreed that it could be better after seeing your comment?

                                                                                                    If anything, it reminds me of the old strategy of having high-level points people can optionally drill down into. They expand, link, pop stuff up, whatever. Some people also did two versions of an article: a short one (eg executive summary) and long one (full details).

                                                                                                    1. 5

                                                                                                      Agreed. I’d rather have a list of only five items with a thorough discussion about why this is, than a way too long and boring list that I’m not going to dig through anyway.

                                                                                                      1. 4

                                                                                                        If you find it uninteresting then you possibly aren’t in the step of implementing or pushing against implementing search in your application. This is a healthy sane checklist of things to consider.

                                                                                                        1. 8

                                                                                                          If you’re pushing against search and bring up a “falsehood”, any good project manager would ask “why?” So having an explanation would help a lot.

                                                                                                          1. 1

                                                                                                            Sure, but this article would be a bajillion pages if they felt obligated to describe every one of these, many of which are obvious on a very small amount of reflection.

                                                                                                            1. 1

                                                                                                              Exactly. Just think about it and use your brain, don’t expect everything served on the silver plate. If you wanted this checklist with explanations, it would be at least 200 pages long book.