3,465 Matching Annotations
  1. Aug 2022
    1. no matter how ill-adapted it is to our needs

      I dunno. I think the common argument that the Web was not intended to be an application delivery platform is both (a) ignorant of basic facts in subtle ways that are materially relevant to the particular use case described here and (b) poorly applied to this use case, given those particulars.

      I don't like most traditional Web apps or what passes for best practices in the contemporary culture. I don't write them, and I'm not defending them.

      But we're talking about scientific literature here. I'll dispute the general argument as it applies to the specific use case under discussion by pointing out that a document-centric platform is in fact exactly the correct tool for the job in this case. The only thing that could be better is if you were able to write your paper more or less as you ordinarily do for journal publication and then feed the journal article into a machine able to comprehend the methods at a deep level and then simulate what it describes. We don't have that, though. But we can to author documents that are a little more explicit instead. This is not a terrible consolation prize. So we really should start seizing the benefits of the current circumstances, lest the Web platform actually turn into something unsuited for this. (Which, perversely, is most likely to happen as a result of pursuing the vision of making it more suited for traditional software development.)

      Again—by all means, don't compile to asm.js (or WASM, or from TypeScript, etc.). Put it to use on its strengths and in the spirit of its original vision.

    2. perhaps we will end up compiling our software to asm.js and run in the browser

      Better yet, not compiling to asm.js at all. Just WYGIWYG (What You've Got Is What You Give [Me, Too]).

    3. Note however that it’s not “any of today’s virtual machine managers”

      I agree. And this very reason (along with the complexity, mentioned in the following paragraph) is what should disqualify VirtualBox.

      The virtual machine manager you should use is the one you assumed would be available when you published this post (and that you were correct about, and that I am using right now to read it): the Web browser.

    4. For the 2013 Web platform, you may hope that its sheer popularity will motivate someone to keep it alive, but I wouldn’t bet on it either. The Web platform is too complex and too ill-defined to be kept alive reliably when no one uses it in daily life any more.

      There's some sleight of hand here, which treats "when no one uses it in daily life anymore" as a given. That (folks continuing to use it) is the stability of the Web platform.

      Besides, even if we suppose that people have stopped using it (dubious), the entirety of what constitutes "the 2013 Web platform" is not necessary—only the parts that are actually used for computation and I/O. That's much smaller.

    1. The more I think about it, the less I think there is a meaningful definition of the one true run time. I have put significant effort into making sure that runtimes are consistent but, however we do this, it makes our experiments less realistic. With rare exceptions (perhaps some safety critical systems) our algorithms will not be used in highly controlled situations, moderated to reduce variability between runs or to maximise speed of this particular process. Algorithms will be run as part of a larger system, in a computer sometimes with many other processes and sometimes with few and, because of the way that computing has developed, sometimes in raw silicon and sometimes in virtual machines. So the more I think about it, the more I think that what matters is the distribution of run times. For this, your experiment on your hardware is important, but so are future recomputations on a wide variety of VMs running on a variety of different hardware.

      The truth of this has consequences not just for the metaissue of recomputation, but the entire raison d'etre of doing performance studies to begin with.

    2. We are not asking people to send us VMs, but to send us what they think we need to get the experiment to run. This is usually a few megabytes of code and maybe executables. Assuming we can run it in a standard environment, we can make our own VM without one ever being sent to us.

      X for thee, not for me

    3. There has been significant pressure for scientists to make their code open, but this is not enough. Even if I hired the only postdoc who can get the code to work, she might have forgotten the exact details of how an experiment was run. Or she might not know about a critical dependency on an obsolete version of a library.
    1. the reason a lot of studies are made of these price and volume variables is that now, in the age of computers, there are almost endless data available about them. It isn’t necessarily because such studies have any utility; it’s simply that the data are there and academicians have worked hard to learn the mathematical skills needed to manipulate them. Once these skills are acquired, it seems sinful not to use them, even if the usage has no utility or negative utility.

      Applicable as criticism for: - marketing analytics for "data-driven" campaigns - the sort of resume-driven development that is fashionable on Github - naive code reuse, generally

    1. In a world where all scientifically relevant information is stored in stable and well-defined open file formats, software tools can evolve much more freely without disturbing ongoing work or harming reproducibility.

      Good formulation! All scientifically relevant information—this demands that the programs themselves be "stored in stable and well-defined open file formats". This is precisely what is missing (both the mindset and the practice).

      I suspect, though, that the author themself has missed this and is thinking of the "software environments" (that he later refers to in this conclusion) as being outside this purview. But it need not (and should not) be.

    2. David Cournape made the interesting observation that no technology less than 20 years old is better than Python in terms of stability.

      Not true. The standardized Web platform is not just more stable than Python, it's probably one of the most stable platforms in existence. It just moves (read: improves) slowly.*

      Most people don't recognize this, because they pack the stable, standardized parts all in the same mental bag as the shiny, non-standardized parts (like Flash, for an example of decades past, or experimental vendor-specific stuff for a more evergreen problem), then end up getting bit in a similar way and blaming the environment rather than communal tendencies towards recklessness.

      It also turns out that the Web's original academic underpinnings are deeply aligned with the goals of researchers looking for a way to work together—even if the final puzzle piece (ECMA-262) didn't come into existence until later in the decade when the Web first appeared. It's still old enough that it passes the litmus test proposed here.

      * for good reason; after all, look at the evidence

    3. My conclusion: the scientific computing community—and many Python programmers, generally—have done themselves a disservice by standardizing on Python. The problems that have been shown to arise here and in similar cases comes down to an impedance mismatch between what these programmers want Python to be and what Python actually is.

      Another insight comes from observing the way in which folks from the affected group have tended to approach the problem—wading in with a sort of undisciplined, YOLO mindset and then thrashing when they've gotten in over the heads because it turns out that a lack of discipline permeates the actions of everyone else, too—which includes, crucially, those they look for to be disciplined so that there's something that can be relied upon.

      Food for thought: although I'm not a Java programmer it's not hard to see that had they standardized instead on the JVM (doesn't necessarily have to be Java—could be a Python lookalike), then this would have almost certainly served them better here on the matter of stability and had the nice benefit of sidestepping the performance issues that Python is known for.

    1. Finally, in anticipation of an argument that I expect to see, let me stress that this is not a technical issue. Computing technology moves at a fast pace, but that doesn’t mean that lack of stability is a fatality. My last Fortran code, published in 1994, still works without changing a single line. Banks have been running Cobol code unchanged for decades. Today’s Java implementations will run the very first Java code from 1995 without changes, and even much faster thanks to JIT technology. This last example also shows that stability is not in contradiction with progress. You can have both if that’s a design goal. It’s all a matter of policy, not technology.
    1. What I find surprising in the frequent heated debates is that the nature of the type system is rarely even discussed. People talk about static vs. dynamic types as if there were only one static and one dynamic type system.

      Good point.

      We can go further. Suppose I have a project written in TypeScript, and your affinity for TypeScript is well-known. Only—surprise!—I'm actually using TypeScript 1.x from n years ago. Are you still happy?

    2. every computation on a modern computing system is actually a staged computation, with reproducibility of the last stage (the one we most care about) requires the reproducibility of all prior stages

      This is not strictly true, but it's not the worst thing in the world to pretend that it is.

    1. explicit documentation of both the execution environment used to run the software and all requirements and dependencies of systems, software, and libraries should be clearly noted in the code and/or readme file (Benureau and Rougier 2018). While time passing can make software obsolete, it also fades the memories of researchers. For that reason alone, it is important to annotate source code to explain the intended operations, which supports reproducibility for the original research team while also supporting future reusers (Benureau and Rougier 2018)
    1. today’s notebook implementations require note-book authors to take various precautions to ensure repro-ducibility, which are exactly the same as required for makingscripts reproducible: a detailed documentation of the soft-ware environment that was used, listing all dependencieswith detailed version information
    1. over the seven years of the project, I ended upspending a lot of time catching up with dependencies. Newreleases of NumPy and matplotlib made my code collapse,and the increasing complexity of Python installations addedanother dose of instability. When I got a new computer in2013 and installed the then-current versions of everything,some of my scripts no longer worked and, worse, oneof them produced different results. Since then, softwarecollapse has become an increasingly serious issue for mywork. NumPy 1.9 caused the collapse of my MolecularModelling Toolkit, and it seems hardly worth doing muchabout it because the upcoming end of support for Python 2in 2020 will be the final death blow.
    2. Accept that your construction is short-lived. In caseof collapse, start from scratch

      This seems to be the position adopted by many developers. More than is reasonable. #3 and #4 probably account for most developers.

    1. What I call software collapse is what is more commonly referred to as software rot: the fact that software stops working eventually if is not actively maintained. The rot/maintenance metaphor is not appropriate in my opinion because it blames the phenomenon on the wrong part. Software does not disintegrate with time. It stops working because the foundations on which it was built start to move.
    1. The “work around” was to detect users in an IAB and display a message on first navigation attempt to prompt them to click the “open in browser” button early.

      That's a pretty deficient workaround, given the obvious downsides. A more robust workaround would be to make the cart stateless, as far as the server is concerned, for non-logged-in users; don't depend on cookies. A page request instead amounts to a request for the form that has this and this and this pre-selected ("in the cart"). Like with paper.

    1. We also see the usual conceit of totalizing systems like Microsoft Word: plain ASCII text files are accepted, as input files, but only “for compatibility reasons”. Ugh.

      Huh?

    1. A complete description on implementing eventhe simple IMGUI would take too much space. Iinvite you instead to watch Casey’s video lecturemirrored on my web site, and look at the samplecode I’ve posted. I’d like to thank Casey Muratori, JonathanBlow, and Atman Binstock for feedback on thisarticle, some of which you can read on Casey’sweb site forum.

      See http://silverspaceship.com/inner/imgui/

    2. Instead, we simplydescribe them from scratch every frame, whichdoesn’t actually result in more code. It’s more likewe run the “create” code every frame.

      Now imagine, as a performance optimization, a lib where you can write in IMGUI style, so you write the same amount of code, but behind the scenes, the lib is managing things, so it's actually free to do all the retained mode heavy lifting.

      We just invented declarative programming.

    3. This is less efficient than the previousapproach, but it’s less likely to have bugs.If we have CPU speed to spare, we can get rid ofall the bugs.

      Interesting remarks, given the Muratori school on profligate misuse of computing resources by modern developers.

    1. This describes one of the most pleasing hacks I've ever come across. I just now tracked it down and added it to my bookmarks. (Not sure why it wasn't already there.)

      You could also conceive of going one step further. When your app (doesn't actually have to be a game, though admittedly it's much easier for you if it is) is compiled with tweak.h, it gives it the power to paint the source file on the screen—so you don't actually have to switch over to your text editor to save it, etc. Suppose you want to provide custom inputs like Bret Victor-style sliders for numeric values. You could edit it in your text editor, or you could derp around with it in-app. Tweaking the value in-app should of course both update it wrt the app runtime but also still write the file to disk, too, so if live reloading is turned on in your text editor, whatever changes you make inside the live process image gets synced out.

  2. scattered-thoughts.net scattered-thoughts.net
    1. I like to organize all the state in a program so that it's reachable from some root pointer. This makes it easy for the reader to understand all the resources allocated by the program by just following the tree of types. It also makes it easy to find any piece of state from within a debugger, or to write little debugging helpers that eg check global invariants or print queue lengths.
    1. I've gotten to where "if I can't make sense of it and be productive in it with just vim, grep, and find, your code is too complex".

      See Too DRY - The Grep Test.

      But even allowing for grep is too lax, in my view. It's too high a cost. If I've got some file open and am looking at some Identifier X, I should be able to both deterministically and easily figure out exactly which file X lives in.

      Violating this is what sucks about C's text-pasting anti-module system, and it's annoying that Go's "package" system ends up causing similar problems. I shouldn't have to have a whole-project view. I should be able to just follow my nose.

    1. Maybe that’s why Wordpress has always struggled so much with building any kind of network effect

      I think it is the beneficiary of a network effect—it's just driven by a professional class, and not end users.

    1. and free of globals

      Ah! This remark highlights a fundamental difference in understanding between two camps, which I have been (painfully) aware of, but the source of this confusion has eluded me until only just right now. (Really, this is a source of frustration going back years.)

      In one camp, the advice "don't use global variables" is a way of attacking a bunch of things endemic to their use, most notably unnecessary coupling to spooky state. In another camp "no global variables" is understood to mean literally that and taken no further—so you can have as much spookiness as you like, and so long as the value is not directly accessible (visible) from, say, another given piece of code appearing at the top-level ("global") context, as with the way i is bound to the activation record in this example but is not accessible outside the scope of getGetNext, then you're good.

      That is, there are two aspects to variables: visibility and extent, and the first interpretation seeks to avoid the negative effects on both dimensions, while the second is satisfied by narrowly prohibiting direct visibility across boundaries.

      I find the latter interpretation bizarre and completely at odds with the spirit of the exhortation for avoiding globals in the first place.

      (What's worse is the the second interpretation usually goes hand in hand with the practice of making extensive use of closures, which because they are propped up as being closely associated with functions, then leads people to regretfully refer to this style as functional programming. This is a grave error—and, to repeat, totally at odds with the spirit of the thing.)

    1. I don't like bloat and the JavaScript fuelled Win98-isation of the web. Therefore I tend to write very spartan webpages. This one for example is generated from a lightweight markup format that I created, and uses only the P and A elements.
      • The Web has suffered bloating
      • This page, therefore, is simple:
      • All that's involved here is a de novo language that was created in such a way that this page has to be generated from a separate, canonical source file written in that format

      This is silly set of statements to make in series.

      Just make the published form of this document the canonical representation—treat it as suitable for reading and editing alike (since it is).

    1. I avoided using languages that I don't know how to bootstrap like node.js

      There's a weird (read: "weirdly obvious") category error here. NodeJS is not a language. (This wouldn't be so notable if the comment didn't go on to say "The key point is writing to an interface and not an implementation.")

      The puzzle piece that fits the shape of the hole here is "JS". JS is the language, NodeJS is one of its implementations—and chubot knew both of these things already, so it's odd that it was expressed this way. Plus, there's a lot more diversity of JS implementations than exist for e.g. Python...

    2. IMO avoiding things like CommonMark and Python will just make your site worse right now

      I don't see how avoiding Python "will just make your site worse"—whether right now, or ever. Is there supposed to be something inevitable about Python?

    1. I basically think of it as an "executable README". A README or blog post often contains shell commands. So I just copy those into a script.

      Suppose that instead of shell commands, the snippets were JS, and the README, rather than being named README.markdown or README.txt, were actually named e.g. README.txt.htm. it wouldn't be basically like an executable README—it would actually be executable. You could double click it to open, and then read through it and use it to actually do the stuff that the README is documenting (like build the project in question).

  3. gbracha.blogspot.com gbracha.blogspot.com
    1. Static variables are bad for re-entrancy. Code that accesses such state is not re-entrant. It is all too easy to produce such code. Case in point: javac. Originally conceived as a batch compiler, javac had to undergo extensive reconstructive surgery to make it suitable for use in IDEs. A major problem was that one could not create multiple instances of the compiler to be used by different parts of an IDE, because javac had significant static state.

      Walter Bright described similar issues with the Digital Mars compiler in a recent NWCPP talk "Adding Modules to C in 10 Lines of Code", albeit Walter's compiler sounds like it was far easier to fix.

      It's funny that this happens with compilers. Wirth's Oberon compiler (module ORP) also depends on static state. But compilers seem natural to me to be something that you want to allow multiple instances of—it's not even among the list of things I'd expect people to make excuses for (cf https://kentonshouse.com/singletons).

    1. Since the original Pascal was implemented with a one-pass compiler, the language believes strongly in declaration before use.  In particular, procedures and functions must be declared (body and all) before they are used.  The result is that a typical Pascal program reads from the bottom up - all the procedures and functions are displayed before any of the code that calls them, at all levels.  This is essentially opposite to the order in which the functions are designed and used.

      Worth noting that almost every C program is impaired by a similar limitation in the C language (despite the disclaimer that follows this passage about the use of the preproccessor), and many programmers' thought processes suffer because of it—no consideration for the presentability of code (even when not in languages that are affected by this limitation!)

    1. And second it was not immediately visible in a program text, where an imported identifier was declared.

      The problem of multiple import forms plagues ECMAScript today. Additionally the lack of "immediate" visibility of "where an imported identifier was declared" continues to plague Golang, to an extent even worse than described here for Modula-2 (because at least when you're iteratively jumping through the file with naive text search, you'll eventually reach the Modula-2 import statement, even though it involves wrapping around after reaching the bottom). It's explicit at some point. With Golang, on the other hand, having not been sufficiently wounded by the problems of C, the team designed it such that it has magical name resolution, making it tedious to carry out (as a human) the process that the compiler uses.

    Annotators

    1. I've been perusing codetriage.com/ this morning and most projects are essentially for the benefit of other developers.

      This is the dirty secret of the neo-OSS era—that it's mostly devops shovelware (to a degree that makes it look like Sturgeon was being conservative)

    1. The creator of CodeTriage, Richard Schneeman, was surprised to learn one day that the Ruby on Rails core team (of about 7 or so people) were responsible for handling ALL the issues opened on the Rails GitHub repo. At the time, there were about 700 or so issues. These maintainers are hugely valuable to the project due to their depth of knowledge, however keeping up with issues was taking a huge amount of time. Would you rather these highly specialized maintainers spend their time developing new features and actually fix bugs, or would you want them to spend their days responding to hundreds of issues? Asking for simple questions like "what version of Rails are you using?", and "can you provide an example app?", and "is this fixed on master?”. While asking these questions might only take 5 or 10 minutes of time, the sheer volume of issues per maintainer was unreasonable. This was highlighted by the herculean efforts of another developer Steve Klabnik, who went through every single issue and responded to all of them in a marathon session spanning multiple days. The effort got him accolades and commit access to the Rails repo. While he deserves the praise, the efforts were ultimately unsustainable.

      Surprise: going all in on GitHub—including abandoning traditional practices governing bugtrackers in favor of GitHub's anemic project management tools—has a negative impact.

    1. I feel those implications are very intellectually liberating and are far more cognitively organic than the print paradigm which currently shapes our intellectual mindset

      There's a lot to be gained by reflecting on pre-Web paradigms and hewing to similar approaches—electing to be bound by the constraints. Print is a discipline, and the practices surrounding the print-based publishing industry comprises a form of technology itself.

      Related: lineality is a virtue.

  4. Jul 2022
    1. TI’s effective monopoly power hurts these kids as much as it has chilled the development of better graphing calculators with superior feature sets from other manufacturers.

      I'm not sure the argument of chilling effect holds up in light of the high price. A high-priced incumbent should be easier to dislodge than one priced reasonably.

    1. We never got there. We never distributed the source code to a working web browser, more importantly, to the web browser that people were actually using. We didn't release the source code to the most-previous-release of Netscape Navigator: instead, we released what we had at the time, which had a number of incomplete features, and lots and lots of bugs.
    2. People only really contribute when they get something out of it. When someone is first beginning to contribute, they especially need to see some kind of payback, some kind of positive reinforcement, right away. For example, if someone were running a web browser, then stopped, added a simple new command to the source, recompiled, and had that same web browser plus their addition, they would be motivated to do this again, and possibly to tackle even larger projects.
    1. readable

      Readable how? I think the better approach over what we do now, where we run source code through what are essentially compilers for making websites and then treat the output similar to object files—i.e. opaque blobs that are unsuitable for anything other than either (a) executing/experiencing, or (b) publishing to others—would be to pursue non-destructive compilation. So after the Markdown is compiled (if there is any compilation step at all), you don't have to keep the original sources around. The tooling should be sufficiently advanced to work with the publishable form as input, too, and not demand only Markdown. In instances where the Markdown files are kept around because the spartan experience of opening a plain text file where the content is almost entirely unadorned by formatting concerns is the preferred way to get things done, the tooling should be able to derive the original Markdown (or a good enough rendition) from the output itself. HTML is rich enough to be able to encode the necessary structure for this on the first Markdown-to-HTML pass. Systems that implement this kind of thing could be said to support a sort of "reversible Markdown", making the publishable form a suitable source of truth—a treatment that is right now reserved only for the originals that are collected and kept off-site.

      Make the writing and editing experience more like Word or Google Docs and less like LaTeX.

    2. A CMS for hosting, editing and maintaining markdown files AND a hosting service for publishing these as blogs.

      Another solution, in two steps:

      1. make your SOPs executable
      2. give them a promotion; make them first-class content (they should live on the site that you're publishing—although not necessarily front-and-center—not hidden away in the README of some ghost repo)

      See also: A New Publishing Discipline.

    3. I think Mozilla would be a great steward for a project like this.

      From a former Mozillian's perspective, Mozilla would be a terrible steward for this. They would be a terrible steward now, and they'd have been a terrible steward in 2018.

    1. Finally, there is the nuclear option: the move the authors label the “hollow man”. With this, one does not even try to refute the substance of an argument; instead, one claims that whatever one’s opponent has to say in favour of proposition P is in reality a smokescreen for their real (and terrible) reasons for holding P. One can label one’s opponent a “racist”, a “bigot” or a “fascist”, and suggest that an audience is safest by ignoring the arguments altogether, for fear of being duped into bigotry itself.

      Did this require a new term ("hollow man")? Isn't "ad hominem" sufficient?

    1. Unlike .NET, JavaScript does not have a rich set of base class libraries. It has been dependent on the community to fill that gap by writing open source projects and publishing shared packages to NPM.

      What always gets me when people bring this up is that none of those repeating it ever seem to have thought of shamelessly copying the superior libraries they have in mind, rather than buying in to the purportedly lower quality system.

    1. I also don't think you know what you're talking about when you talk about code readability. By and large, the vast majority of opinions on code readability, when you break them down, are based on a personal stance about preferences in writing
    1. In order to keep your service online, you are required to keep a positive account credit balance. If your account balance drops low, our system will automatically send multiple warning emails. If despite that, you still fail to recharge your account, the system will automatically suspend your account and all your pull zones. Any data in your storage zones will also be deleted after a few days without a backup. Therefore, always make sure to keep your account in good standing.

      Should be able to separate storage balance and credits for servicing traffic.

    1. Not saying I agree or disagree with this, but the existence of a class system in tech jobs is the OP’s central point.

      I'm continually surprised when someone posts and HN fails to understand even very basic points in a piece of writing, even when they're very clearly made like they were here. PragmaticPulp's top comment (and the fact that is the top comment) is completely mystifying, for example.

    1. Yes, it’s making it easier than ever to write code collaboratively in the browser with zero configuration and setup. That’s amazing! I’m a HUGE believer in this mission.

      Until those things go away.

      A case study: DuckDuckHack used Codio, which "worked" until DDG decided to call it a wrap on accepting outside contributions. DDG stopped paying for Codio, and because of that, there was no longer an easy way to replicate the development environment—the DuckDuckHack repos remained available (still do), but you can't pop over into Codio and play around with it. Furthermore, because Codio had been functioning as a sort of crutch to paper over the shortcomings in the onboarding/startup process for DuckDuckHack, there was never any pressure to make sure that contributors could easily get up and running without access to a Codio-based development environment.

      It's interesting that, no matter how many times cloud-based Web IDEs have been attempted and failed to displace traditional, local development, people keep getting suckered into it, despite the history of observable downsides.

      What's also interesting is the conflation of two things:

      1. software that works by treating the Web browser as a ubiquitous, reliable interpreter (in a way that neither /usr/local/bin/node nor /usr/bin/python3 are reliably ubiquitous)—NB: and running locally, just like Node or Python (or go build or make run or...)—and

      2. the idea that development toolchains aiming for "zero configuration and setup" should defer to and depend upon the continued operation of third-party servers

      That is, even though the Web browser is an attractive target for its consistency (in behavior and availability), most Web IDE advocates aren't actually leveraging its benefits—they still end up targeting (e.g.) /usr/local/bin/node and /usr/local/python3—except the executables in question are expected to run on some server(s) instead of the contributor's own machine. These browser-based IDEs aren't so browser-based after all, since they're just shelling out to some non-browser process (over RPC over HTTP). The "World Wide Wruntime" is relegated to merely interpreting the code for a thin client that handles its half of the transactions to/from said remote processes, which end up handling the bulk of the computing (even if that computing isn't heavyweight and/or the client code on its own is full of bloat, owing to the modern trends in Web design).

      It's sort of crazy how common it is to encounter this "mental slippery slope": "We can lean on the Web browser, since it's available everywhere!" → "That involves offloading it to the cloud (because that's how you 'do' stuff for the browser, right?)".

      So: want to see an actual boom in collaborative development spurred by zero-configuration dev environments? The prescription is straightforward: make all these tools truly run in the browser. The experience we should all be shooting for resemble something like this: Step 1: clone the repo Step 2: double click README.html Step 3: you're off to the races—because project upstream has given you all the tools you need to nurture your desire to contribute

      You can also watch this space for more examples of the need for an alternative take on working to actually manage to achieve the promise of increased collaboration through friction-free (or at least friction-reduced) development: * https://hypothes.is/search?q=%22the+repo+is+the+IDE%22 * https://hypothes.is/search?q=%22builds+and+burdens%22

    1. Old clients, bosses, colleagues?

      This presupposes something; is this step #1 or not? (In other words, "Where did those people come from?")

      I see lots of handwaving on this part—which is silly, because for the people who are the main audience for pieces like this, this is the part that's most interesting. It's easy to see their frustration.

      The thing I really admired about Chris Lattner in an interview I listened to during lockdown was the fact that (one of?) the first things he mentioned about success was the role that luck played in his life. There's a tacit admission there that, although he's Chris Lattner and a really smart guy and clearly deserving of his success because of the facts from our now-foregone past that serve as proof, if you reset and tried to "replay' it all, then things might not actually work out like they did the first time. It's a tacit admission that replicability is not guaranteed.

    1. This polemic identifies CS as the culprit. That seems empirically wrong. As stated, it's "not a prerequisite for most programming" even in theory, and in practice, there are mountains of GitHub programmers, at least, who don't have CS backgrounds. Non-CS folks probably account for most of the "frontend"/"full stack" development today. This has exacerbated the Tower of Babel, not improved it.

      HCI is CS—and that's what we should focus on. There's a fair bit of emphasis on engineering due, too. To be able to look at a problem and ask, "What should it take?" and ocnversely, "What isn't required here (contra cultural imperatives)?"

    1. these concerns also exist when using vanilla JS

      These concerns also exist if you're using frameworks.

      I also see people regard libraries like DOMPurify as magic. There is no magic. Even using these libraries, you have to know what you're doing; you have to make sure DOMPurify is configured correctly in order to carry out your intent. You can be just as vulnerable if you're not paying attention with a library as you are when using one.

    2. it falls within TACE

      Does it? Most jQuery is served minified. Even if not, the "full fat" version is not especially readable.

      There are bad reasons to despise jQuery (e.g. because it's old). But there are good reasons, too (because it's bloated and just not very good).

    1. I actually do it all the time myself - in my own private git source tree. I send git patches to Junio by email, and I don't publish my own git tree any more

      Git as He Is Poke(d)

    1. the straw man fallacy

      I've come around to preferring the term "strawchild".

      • It de-genders the term (important for some people)
      • It evokes the imagery of the kind of loser* who is only willing to engage in battle with children and/or is perhaps prone to striking them
      • It conveniently sidesteps the cliche/fatigue associated with invocations of the term "strawman"

      * Is this aspect of "strawchild" an instance of failure to elevate the other (i.e. steelman/starman them)? Yes.

    1. The language is academic, which has contributed to the confusion around the topic, but it is clear enough that most developers should be able to understand it.

      This I disagree with. Even Fielding's "... must be hypertext driven" rant (which is great and in my bookmarks) is sabotaged by the curse of knowledge. If you know what REST is—and how most "REST" isn't REST (including the things that try to stand out as doing REST right and still just doing it wrong, but with nuance) then "REST APIs must[...]" makes sense. If you don't already get it, though, then it's nigh impenetrable—funnily enough, you need an a priori understanding of REST to be able to understand these attempts to explain REST and what Fielding is trying to communicate about REST not requiring *a priori" knowledge!

    1. The trouble with redefining "REST" to mean "not REST" is that the first step in learning known techniques to solve a problem is learning the terminology that people use to explain the techniques. If you think you know the terminology, but you have the wrong definition in your mind, you will not be able to understand the explanations, and you will not be able to figure out why you can't understand them, until you finally figure out that the definition you learned was wrong.
    1. @54:25:

      There's this debate about whether those games are truly interactive, because there's no way to actually transcend the intent of the designer (other than with, like, glitches or that sort of thing)

      They're talking about video games—"authored experience[s]"—but it's relevant of other types of games (boardgames, like chess), too.

      cf Carse:

      Finite players play within boundaries; infinite players play with boundaries

    1. @2:10

      They didn't publish the code. They published the algorithm. And they prided themselves on—the computer scientists at the time—of describing the algorithm, not GitHubbing the code. These days we don't—we GitHub the code. You want the algorithm? Here's the code.

      This is not always reliable. There are some non-highly-mathematical things that you'd prefer to have the algorithm explained rather than slog through the code, which is probably adulterated with hacks for e.g. platform gotchas, etc.

      There is a better way, though, which is to publish a high-level description of the workings as runnable code that you can simulate in a Web browser. Too many people have misconceptions about the stability of the Web browser as a platform for simulations, however. We need to work on this.

    1. So that’s when I came across Hypothesis. At the time, I was like, “Hey, this is cool,” but I also resonated with the company — like the web ethos being open-source. Being embedded into this distributed web of conversation was super cool to me, but at the time that wasn’t important for the Sidekick product. And then, when we pivoted Sidekick into a chatbot for youth apprenticeships, we didn’t need anything like annotation anymore, but also what happened is I basically reorg’d myself out of a job. So I was kind of looking around, but just casually looking because I didn’t have any end date, and then a recruiter reached out, and I was like, “I know these people,” and I really liked the company.

      This reads like a (fairly raw) transcript of a spoken-word interview. Hard to read.

    1. It uses the jsdoc syntax, and strives to document all the tools and members available to front-end developers. To generate documentation, you'll also need the jsdoc utility available via npm. See the disclaimer above about the node package manager, of course. # npm install jsdoc -g

      This approaches it backwards. Consider a TypeScript-free codebase where the type annotations live in the documentation—which isn't generated. Your "compiler" then is really just a program verifier. Given the JS program text and the availability of docs, it takes the fusion as input and runs the verifier on that. No source-to-source compilation or mangling. The code that runs is the code you write—not some intermediate file output by tsc.

    1. Another key idea here is to separate meaning from tactics. E.g. the meaning of sorting is much simpler and more compact than the dozens of most useful sorting algorithms, each one of which uses different strategies and tactics to achieve the same goal. If the “meanings” of a program could be given in a way that the system could run them as programs, then a very large part of the difficulties of program design would be solved in a very compact fashion. The resulting “meaning code” would constitute a debuggable, runnable specification that allows practical testing. If we can then annotate the meanings with optimizations and keep them separate, then we have also created a much more controllable practical system.

      See also http://cr.yp.to/qhasm/literature.html

    2. This opens the possibility of doing a design much better than Squeak's, both fundamentally and at the user-level, to create a model of an entire personal computer system that is extremely compact (under 20,000 lines of code)

      See: Oberon

    3. the Squeak system, which was derived from PARC Smalltalk, includes its own operating system, GUI, development tools, graphics, sound, Internet sockets, and many applications including Etoys and Croquet, yet is only about 230,000 lines of code. The executables are about 2.8MB and only half of this code is generally used.
    1. @52:20

      We know it will happen, barring some radical change in human psychology, because that is what we're living with now. Everyone is walking around with a smartphone in their pocket that not even the president of the United States could have gotten his hands on in, you know, the year 2000. It's pure science fiction. And yet now it's just a basic necessity of life [...] we reset to the new level, and again, we keep comparing ourselves to others

      There's a submarine counterargument to the overall point here (and the last half of the sentence quoted here), and it lies in the words "necessity" and "new level". (I realize that when it was spoken, "necessity" was chosen for effect and meant as a slight exaggeration, but it's not as exaggerated as it would need to be in order to erase the force behind of the counterargument.)

      In other discussions like these, you can often find people bringing up the argument that Keynes's remark about 15-hour work weeks wasn't wrong, provided that you're willing to accept the standards of living that existed at the time when Keynes was saying it. But that's not exactly true, because it doesn't really ever come down to a true choice of deciding whether you'd like to opt in or not.

      You could take the argument about smartphones and make the same one by swapping out automobiles instead. The problem is that even if you did desire to opt out of the higher standards, the difficulty lies in the fact that the society that exists around you will re-orient itself such that access to a car is a baked-in requirement—because it's taken as a given in others' own lives, it gets absorbed into their baseline of what affordances they expect to be available to people who are not them ("new level"). This continual creation of new requirements ("necessities") is the other culprit in the pair that never gets talked about in these conversations. Everyone focuses on the personal happiness and satisfaction component wrt comparison to others.

    1. It makes it really hard often to reason about the impact of this kind of work, because there are no easy metrics. One of the takeaways that I take from it is that making tools easy to use, fast to use, and pleasant to use is really powerful. It’s really powerful in ways that are hard to predict until you’ve done it, and so you should just take it as axiomatic that it’s worth a little bit more time than your organization otherwise would spend investing in tool quality, because people will change how they relate to those tools.They’ll find new ways to use it. They’ll use them more often. It often leads to this productivity flywheel in somewhat non-obvious ways.

      Surprise! The point of technology is that it's supposed to make things easier. Why not make sure it's easy to make things easy while you're at it?

    2. it shows that any time that you make something easier or harder to do, either because it’s faster or slower, or just because you’ve reduced the number of steps, or you’ve made the steps more annoying, or you’ve added cognitive overhead, then people react by changing how they use your tool.
    1. a lot of the time i get a lot of questions these days

      @3:07:14:

      Blow: A lot of time I get a lot of questions these days by people who are asking, "How do you do a lot of work?", or, "How do you get started?" and all that. And very often these questions are themselves a procrastination, right? It's like, "Obviously, I'm in the state where I can't do a lot of work right now. So I need somebody to give me the answer before I can." And actually the secret is you sit down and decide to do it. That's all it is, right?

      Jaimungal: Seinfeld is like that. That's his famous advice to comics, to comedians.

      Blow: Mmm. Yeah. I mean—

      Jaimungal: Comedians always want to know what's the secret. He says, "Just work. Stop talking about it."

      Blow: Yeah. [...] Because that's an exc— it's like, "Oh, someday— I have permission to not actually do this work until someday somebody bestows upon me the magical[...] baton[...]"

    2. i mean i have a whole speech about that

      @03:06:54:

      Blow: I mean I have a whole speech about that that I can link you to as well.

      Should that be necessary? "Links" (URLs) are just a mechanical way to follow a citation to the source. So to "link you" to it is as easy as giving it a name and then saying that name. In this case, the names are URLs. Naming things is said to be hard, but it's (probably) not as hard as advertised. It turns out that the hard part is getting people to actually do it.

    1. maybe people today are more complacent about emergencies because they think someone will come along and save the day.

      The actual phrasing here (@39:03):

      maybe people today are more complacent about emergencies because at some implicit level they see there's more division of labor and they think someone will come along and save the day

      (No idea what's up with the transcript here. It omits some crucial wording/context.)

    1. @18:08:

      The interesting thing is when you read, say, extremely foreign fiction—so fiction that's very alien to you in terms of mental models—the author may assume you understand the mental models, but you may not. So for example Japanese comic books—the couple of times I've tried to read them, they just feel so bizarre to me—the sort of conventions for indicating, you know, emotions and actions and so forth. They're just so unintuitive to me that the world[...] that should be in the background and implicit and I should just be able to reference it like an operating system, it sort of becomes a little too visible for me to read the fiction seamlessly.

    1. @37:52:

      Again, when I was traveling around in 2004 giving talks, the predominant attitude I had was a misconception about Darwinian processes that—most people I talked to thought that we must be at the best place that we could be because look at how many millions of people are participating in this thing. And if you know about Darwinian processes, they aren't optimizers at all. They're "satisficers"—a term made up by one of the most famous professors ever to be at Carnegie—and satisficing is not the same as designing something great.

    1. @18:09:

      So the real question is not whether we can improve on this but "what is the actual level of improvement?", which is tantamount to asking, "how complex is the actual problems we're trying to solve compared to the complexity we're creating by just bumbling around?"

    1. I guess my hesitation in answering your question is that I hate essentialism. It’s the same way that I hate it when people say women are better leaders because we are more empathetic. The problem with essentialism is, the moment you pay yourself a compliment based on gender, caste, religion, color of your skin — whatever — country of your origin — if you’re going to accept one generalization is true, then you’re going to have to suck up the generalizations and the caricatures that aren’t so flattering.
    1. One thing that I didn't hear considered is to kill modelessness by allowing selection anytime. If you want to select something, then just draw the shape that you want using whatever tool you already have, and then invoke some action that transforms it after the fact.

      This falls in line with the principle of preferring to make it easy to undo something rather than making it difficult to do in the first place.

      The relevant analogy is that if you were in your office in dialogue with someone and you had a printout of your WIP, then in order to communicate your intent, the most likely course of action would be to mark up the work in its current state using whatever tool is handy, explaining what it is you want to happen, passing it to your partner in dialogue, and then trust that they'll return to the source and get to it wrt to carrying out your desire.

    1. The thing that bugs me when I listen to the Muse podcast—it's something that's present here along with the episode with gklitt—is that there's this overarching suggestion that the solution to this is elusive or that there are platform constraints (especially re the Web) that keep any of these things from being made. But lots of what gets talked about here is possible today, it's just that no one's doing it, because the software development practices that have captured the attention of e.g. GitHub and Programmer Twitter value things that go against the grain of these desires. This is especially obvious in the parts that mention dealing with files. You could write your Web app to do that. So go do it! Even where problems exist, like with mobile OSes (esp. iOS), there're things like remoteStorage. Think remoteStorage sucks? Fine! Go embrace and extend it and make it work. It's not actually a technical problem at this point.

    2. @18:52:

      I wanna also dig a little more into the kind of... dynamism, ease-of-making-changes thing, because I think there's actually two ways to look at the ease of making changes when you solve a problem with software. One way is to make software sufficiency sophisticated so that you can swap any arbitrary part out and you can keep making changes. The other is to make the software so simple that it's easy to rewrite and you can just rewrite it when the constraints change.

    3. @14:18:

      So, for example, if you want to make a very basic static site: well, okay, now you need the static site generator, and now you need a library system, you need a package manager, you need a way to install the package manager, you need a way to check for security vulnerabilities in all the packages, you need a web server, you need a place to run the app. It's a whole thing, right?

    1. It made sense when JS was doing small simple things in HTML - it doesn’t make much sense anymore

      No, it still makes sense.

      Insisting that everyone use === everywhere, on the other hands, makes as much sense as disallowing method declarations that accept a parameter that implements an interface (in favor of formal parameters that insist on a certain class or a derivative), or injecting a bunch of instanceof checks for no good reason...

    1. But I later realized writing is many things, one of which is the finished article you’re reading now. Mainly though, it’s a tool for thinking things through.

      I've mentioned this elsewhere, but I'm skeptical of this popularly recurring take that says writing is thinking, or that thinking without writing really isn't thinking. If writing helps you think, it's better for you to know that than the alternative. But thinking is thinking, and writing is writing.

      I worry with all the insistence around this view of writing as a precondition to real thinking that people who are thinking at or near capacity without writing will believe they're somehow missing something and waste a lot of cycles in frustration as they attempt to write and find that it doesn't do anything for them thoughtwise that they weren't already getting before.

    2. Think about the sad essay we all used to write for your (insert language here) class: back then you didn’t have permission to generate original ideas.

      I'm not sure that's the correct diagnosis.

      Alternative take: you were not, at that point in your life, equipped to understand that you could be generating new ideas and that you should walk away from that writing course with an appreciation for writing as a vehicle for what you'd like to accomplish with a given subject/format. It's fine that you didn't—many people don't—and your instructors, institution, parents, community, etc. probably could have done a better job at communicating this to you, but it was there, and it was the point all along.

    1. The type for an item is given as the value of an itemtype attribute on the same element as the itemscope attribute.

      The presence of an itemtype attribute should imply the existence of an item, and thus make the presence of itemscope optional—itemscope should be required only when there is no explicit itemtype declared.

    2. It's important to note that there is no relationship between the microdata and the content of the document where the microdata is marked up.

      Wait, really? That's unfortunate. It seems plainly useful to be able in e.g. the datetime example to correlate the text content of the element with the datetime property with the datetime value.

    1. There is no inherent virtue in insisting that paths continue to use backslash even though we're well past the days of CP/M and DOS. There are good reasons not to use it, however.

      I do recognize that it provides a source of the type of obscurantism that Windows users take delight in. At this point, though, backslash-as-path-separator is a liability, and application authors should work to eradicate it from every UI surface that users come in contact with. Microsoft themselves should scrub their own apps so that e.g. even Windows Explorer favors the common solidus in any displayed path name.

      Consider this to be a straw proposal for an "are we slash yet?" movement.

    1. // NB: Since line terminators can be the multibyte CRLF sequence, care // must be taken to ensure we work for calls where `tokenPosition` is some // start minus 1, where that "start" is some line start itself.

      I think this satisfies the threshold of "minimum viable publication". So write this up and reference it here.

      Full impl.:

      getLineStart(tokenPosition, anteTerminators = null) {
        if (tokenPosition > this._edge && tokenPosition != this.length) {
          throw new Error("random access too far out"); // XXX
        }
      
        // NB: Since line terminators can be the multibyte CRLF sequence, care
        // must be taken to ensure we work for calls where `tokenPosition` is some
        // start minus 1, where that "start" is some line start itself.
        for (let i = this._lineTerminators.length - 1; i >= 0; --i) {
          let current = this._lineTerminators[i];
          if (tokenPosition >= current.position + current.content.length) {
            if (anteTerminators) {
              anteTerminators.push(...this._lineTerminators.slice(0, i));
            }
            return current.position + current.content.length;
          }
        }
      
        return 0;
      }
      

      (Inlined for posterity, since this comes from an uncommitted working directory.)

    1. Free as in ...? Points out that freedoms afforded by foss software to the average computer user are effectively the same as proprietary software, because it's too difficult to even find the source and build it, let alone make any changes. Advocates the foss developers should not think only about the things that users are not legally prevented from doing, but about what things they are realistically empowered and supported in doing.

      Previously: Open Source Is Not Enough and Free software is not enough: on practical user freedom.

      See also: "Even GNU's philosophy has a few puzzle pieces missing from the box."