1.  

    Great article! Although this link was posted here before. Here’s the discussion on this topic from around a month ago.

    1.  

      Since the article was written (and discussed), Golang switched to using [] for generics, which is the correct choice.

      1.  

        Oh, I missed it when it was posted the first time! It seemed strange that Lobsters didn’t warn me that the article was already posted, given that it’s just a popular topic.

        1.  

          So I figured that the other post contains a different link that resolves to the same URL. I’ve added a comment on the GitHub issue for this.

      1. 6

        Interesting article, but saying we can’t truly fix free software until we destroy capitalism feels at once both a bit extreme and unhelpful.

        It’s a nice idea (Who doesn’t want to live in a world where everything is free? Oh wait. A lot of people :) but I’d rather focus on ideas that help us iteratively improve the current situation.

        1. 17

          I think the author’s point is that the free software movement is already a radical philosophy, but one which is doomed to failure by its individualist focus. As a movement, it doesn’t offer a solution for how to make free software the natural choice (where the structure of our systems inherently directs people to select it as the best option), preferring instead to focus on convincing individuals that it is the right choice (which may be true, but doesn’t scale, and will constantly fight against whatever the natural choice is, which is why open source has eaten free software’s lunch).

          So the choice is between an ineffective radical philosophy and a potentially effective one.

          1. 4

            how to make free software the natural choice…the best option

            There are many things that changed since the late 1990s when free software was the dominant ideology. One is that Google, and ultimately all of big tech, co-opted open source to mean “you are free to have all of the source code to the client that talks to our centralized proprietary service.” Having done so, free software isn’t the natural choice, because the benefits of freedom in being able to change the system to do what you want is not present. Its capabilities are limited to what the proprietary service provides, and it only works if the client implements what the proprietary service requires.

            1. 3

              I’m not sure in what sense it’s the case that “open source has eaten free software’s lunch”. At the moment, free software and open-source software are basically synonymous. An open-source library developed by paid programmers working for some Microsoft- or Facebook-sized corporation is free in exactly the same way that GNU Emacs or Firefox is.

              There are people who would like to change this situation - create and popularize software licenses that are “open-source” in the sense of having the source code be publicly available, but non-free in the sense of imposing four-freedoms-violating conditions on the use of that software. But the two main motivations for doing this are to prevent large cloud providers (such as Amazon specifically) from releasing products based on open-source software that might compete with smaller companies that develop such software, and to prevent organizations and people with political views specific activist programmers find distasteful from being able to freely use useful software. The former consideration is an attempt to limit the power of well-capitalized corporate institutions, and the latter is associated with “culturally leftist” politics but doesn’t directly help or hinder such institutions.

              1. 1

                At the moment, free software and open-source software are basically synonymous.

                I disagree, because “free software” is actually less free (as in freedom) than open source.

                For example, let’s say that “Bob” wants to release a videogame toolkit. He starts with the Quake III Arena source code (released under the GPL). He spends months building a complete game creation toolkit around it the likes of which could be compared to any modern AAA game engine.

                But, there are still sections of code that are recognizably Quake. If he tries to sell this thing that he spend so long on, he could get a cease-and-desist (and likely will).

                Imagine a similar situation where “Alice” does the same thing with the Sauerbraten engine (zlib license). She gets to sell her work (and it is hers if she’s spent months working on it). She can then decide later that she would like to release the source on her own time.

                Who had more freedom?

                This is a contrived example, because no reasonable person would start with GPL software who wants to sell something. The point is that “Bob” can’t use the Quake source for his own gains even though ID has decided that they are done using it.

                1. 3

                  I don’t know how long you’ve been in the open source/free software realm, but these arguments were done to death 20 years ago.

                  The difference is perspective: freedom for the developer vs. freedom for the user. When GNU started, AT&T was exercising its “freedom” to maintain exclusive control of UNIX, and RMS wanted the “freedom” to control what happened on his computer.

                  From time to time this is intentionally confused by people with an agenda, as in “free software isn’t free because it doesn’t let us freely screw users.”

                  1. 4

                    I don’t know how long you’ve been in the open source/free software realm, but these arguments were done to death 20 years ago.

                    Well, I’m only 20.

                    The difference is perspective: freedom for the developer vs. freedom for the user.

                    As the developer you always have the freedom to not release the source. As the user, you can choose to ignore the license (at your peril). Your freedom ends where another person’s freedom begins. It’s selfish and arrogant to think that you “deserve” to control other peoples use of your product.

                    I like to draw a parallel with firearms. You have a right to not own one, but you cannot prevent me from owning one. Substitute any politically correct item for firearm if you wish.

                    From time to time this is intentionally confused by people with an agenda, as in “free software isn’t free because it doesn’t let us freely screw users.”

                    This is attributing the (perceived) malice of large corrupt corporations to people like me who prefer to keep personal liberties intact. It’s shameful.

                    1. 5

                      This is attributing the (perceived) malice of large corrupt corporations to people like me who prefer to keep personal liberties intact. It’s shameful.

                      I didn’t mean to attribute it to you. As I said at the beginning of the post, I’m not sure about your background (thanks for clarifying it.) I do mean to say that the argument you provided is also provided by people with an agenda, and I’d encourage you to think critically about it.

                      Your freedom ends where another person’s freedom begins. It’s selfish and arrogant to think that you “deserve” to control other peoples use of your product.

                      Very true, but consider what that means in the context of software. Software released without source is trying to exercise control over the use of the product by preventing the user from altering it or improving it. These days it often goes further with code signing, DRM, online activation, etc, which is increasing the degree of control.

                      The point of copyleft is that if we accept as a society that authors control the use of their product, then authors are free to prevent what they would see as misuse of that product, including distributing it without source code. There is an alternate universe where authors have much less control in general, but we happen to live in this one.

                      The genius of RMS, IMHO, was more about economics than software. He observed that in a market where fixed costs are high and marginal costs are low, which software takes to the extreme, the result will be a small number of vendors and a large number of users. In that context, users do not have a remedy through competition: they cannot choose a vendor that gives them the level of freedom they want. Market forces would push any user-respecting vendor out of existence. Taking your example, find a games publisher that releases source code [edit: to their new release game]. In the ultimate, he observed that the degree of vendor control would only increase over time, without limit, which has since proven to be true. In the last 15 years we’ve moved from a world where anyone can write a device driver or application to a world where these need to be approved by platform vendors, for example, and entire classes of software are unavailable to users as a result.

                      If competition among vendors can’t deliver the products users want, then the issue needs to be around restricting what vendors can do to ensure users can do what they want. As you put it, one person’s freedom ends where another person’s begins - but if we accept that anything which restricts the freedom of vendors is bad, then we accept that users should have no freedom whatsoever.

                      1. 2

                        Prologue: This thread has ended up way longer than I thought. Thank you for your time.

                        I think we agree on a lot of principles, we just disagree on where the line between author and user freedom is.

                        Fair warning, my firearm analogies got a little out of hand. If you are unfamiliar, feel free to ask for clarification.


                        I didn’t mean to attribute it to you.

                        Yes, I re-read the comment and I think I was being a little paranoid :)

                        Software released without source is trying to exercise control over the use of the product by preventing the user from altering it or improving it.

                        The same thing happens when somebody releases a product without specifying exactly how it was put together. For example: there are a fair amount of proprietary firearm designs, but the most popular rifle (AFAIK) is the AR-15. A modular design that pretty much anybody is allowed to manufacture and sell (well, if the government lets them).

                        These days it often goes further with code signing, DRM, online activation, etc, which is increasing the degree of control.

                        I see code signing as a net good. I appreciate the assurance that when something runs with administrative privileges that the program is (sort of) verified. DRM can be done well, but most companies do it wrong. Steam is pretty good, but if they were a smaller company I wouldn’t trust them as much (mostly because I would have no guarantee that they would stick around).

                        The point of copyleft is that if we accept as a society that authors control the use of their product, then authors are free to prevent what they would see as misuse of that product, including distributing it without source code. There is an alternate universe where authors have much less control in general, but we happen to live in this one.

                        Code authors cannot control the use of their product, in the same way that a firearms manufacturer cannot prevent people from murdering people. All you can say is “we do not warranty this software if it is used for anything other than…”.

                        The genius of RMS, IMHO, was more about economics than software. He observed that in a market where fixed costs are high and marginal costs are low, which software takes to the extreme, the result will be a small number of vendors and a large number of users. In that context, users do not have a remedy through competition: they cannot choose a vendor that gives them the level of freedom they want. Market forces would push any user-respecting vendor out of existence.

                        I agree with this statement, but I believe the solution is more information. If more people knew how corrupt big tech was then they would use them less.

                        Taking your example, find a games publisher that releases source code.

                        I think the new Unreal Tournament is “public” source. UE4 and Crytek are also “public” source (with EULAs and royalties of course).

                        In the ultimate, he observed that the degree of vendor control would only increase over time, without limit, which has since proven to be true.

                        I assume by he you mean Richard Stallman.

                        In the last 15 years we’ve moved from a world where anyone can write a device driver or application to a world where these need to be approved by platform vendors, for example, and entire classes of software are unavailable to users as a result.

                        Sure anybody can write a device driver. The approval process is IMHO necessary because otherwise somebody could socially engineer people into installing a malicious driver or application (technically still possible, but more difficult). It’s like a carry permit. It (ostensibly) proves that you are competent and stable, and that you won’t use your thing (firearm, device driver) to intentionally harm an innocent person.

                        If competition among vendors can’t deliver the products users want, then the issue needs to be around restricting what vendors can do to ensure users can do what they want. As you put it, one person’s freedom ends where another person’s begins - but if we accept that anything which restricts the freedom of vendors is bad, then we accept that users should have no freedom whatsoever.

                        How does not restricting vendors lead to users having no freedom? I don’t mean to be snarky, I just don’t understand.

                        1. 6

                          I think the high level observation I’d make is that each of us exist in a society that establishes certain “normal” practices. Those practices change over time. When RMS was starting in software, “normal” meant that commercial vendors provide sources, and moving away from that was a redline for him. When I was starting in software, “normal” meant closed source but no signing/activation/forced updates, and moving away from that was a redline for me. Over the next couple decades, “normal” will continue to change and the things which seem normal for you now will become more restrictive due to competitive forces. When you see it happen, RMS stops looking crazy.

                          I see code signing as a net good. I appreciate the assurance that when something runs with administrative privileges that the program is (sort of) verified.

                          “Verified” in this context means it does what the vendor intended, not that it does what you want. If it was done to verify that it does what you want, then you’d be in control of the certificates that you’re willing to trust, and would be able to use software that is trusted by anyone you trust. As it stands, you’re not allowed to run code that you wrote yourself, because the vendor doesn’t trust you.

                          Code authors cannot control the use of their product…

                          (I’m avoiding firearms comparisons since it’s a business I don’t know anything about.) Code authors have an unusually high amount of control due to things like the DMCA which give legal protection to any measure they can create. Control is just an arms race - if it can be enforced somehow, it’s legal and legitimate. The makers of devices have a lot of resources to ensure they retain control of things like the applications that run, and they are highly motivated to exercise that control since they get a 30% cut. The maker of a hammer cannot control how it is used, but the maker of a technical device can and does control the software that runs on it (although you are free to use it to drive nails into a wall, which is often its most valuable use.)

                          I believe the solution is more information. If more people knew how corrupt big tech was then they would use them less.

                          Users are given the choice to use tech or not use tech. They do not have a competitive remedy. Your cell phone company knows where you are at all times and sells that information to marketers. Your remedy is to not carry a cell phone. It is true that if everyone rejects the entire category of tech then the problem goes away, but that seems like a big societal failure that gives us a choice between dystopia or dark ages.

                          I think the new Unreal Tournament is “public” source.

                          It’s an interesting model to be sure, but note that UT4 is cancelled. You’re free to get the source code so long as anything you do with it has copyright assigned such that your contributions can be released as part of UT4. This is a volunteers-develop-a-commercial-product model. I think the reason this thread started - taking issue with the idea that “free software” is more free than “open source” - is because “open source” is often a volunteers-develop-a-commercial-product model. This one happens to be far more explicit than most.

                          Sure anybody can write a device driver. The approval process is IMHO necessary because otherwise somebody could socially engineer people into installing a malicious driver

                          To be clear, you can write a device driver, but you cannot run the thing you just wrote.

                          The argument about needing approval amounts to an argument that users cannot be trusted to make their own decisions. Logically, it applies to anything. Can you socially engineer people into installing a malicious usermode program? Can you socially engineer people to visit a website with a bitcoin miner? Can you socially engineer people to visit a phishing website? If the solution is an explicit approval step, then we’d live in a very different world - perhaps our conversation might need explicit approval, because we might be engaging in social engineering right now.

                          How does not restricting vendors lead to users having no freedom? I don’t mean to be snarky, I just don’t understand.

                          This is exactly the argument you made about one person’s freedom ending where another’s begins. It’s easy enough to illustrate by example, but that relies on examining the examples with an open mind, and remembering that in the not-that-distant past things which appear as normal today were not remotely normal.

                          Personally I’m in the strange position of developing device drivers professionally. There’s a lot of value in them - I’m paid pretty well really - but I haven’t written any open source drivers. Why not? Because nobody could run them. I have written open source applications, because people can run those. But when you’re on both sides of the same fence and realize that you have a skill which is valuable but can’t contribute it to the community, the lack of user freedom becomes very visible.

                          1. 1

                            To be clear, you can write a device driver, but you cannot run the thing you just wrote.

                            I thought that (on windows at least) you could develop the driver and run in unsigned on your own machine? I’ll take your word for it if I’m wrong because I looked at your blog and it looks like you’re a lot more knowledgeable on the subject than I am.

                            This is exactly the argument you made about one person’s freedom ending where another’s begins. It’s easy enough to illustrate by example, but that relies on examining the examples with an open mind, and remembering that in the not-that-distant past things which appear as normal today were not remotely normal.

                            I would appreciate an example. My point is that practically speaking a vendor cannot limit the freedoms of a user. They can get the user to agree not to do something, but what cost would be incurred in trying to enforce that agreement?

                            Personally I’m in the strange position of developing device drivers professionally. There’s a lot of value in them - I’m paid pretty well really - but I haven’t written any open source drivers. Why not? Because nobody could run them. I have written open source applications, because people can run those. But when you’re on both sides of the same fence and realize that you have a skill which is valuable but can’t contribute it to the community, the lack of user freedom becomes very visible.

                            You have a very interesting vantage point, thank you for your contribution to the conversation.

                            1. 3

                              I thought that (on windows at least) you could develop the driver and run in unsigned on your own machine?

                              The bootloader has no way to know whether the unsigned code it’s loading came from your compiler or came from a malicious source on the Internet. The “obvious” way to fix this is to allow for self signed code and allow the user to manage which certificates they trust, but attestation signing is doing the exact opposite of that.

                              The way I develop drivers is by running systems under a kernel debugger, which disables driver signing requirements. A kernel debugger runs on a second machine. So you could run arbitrary drivers if you configure a machine to run multiple VMs so one can act as a debugger for the other, but realistically there’s no point writing drivers for that set of users, and nobody is going to run in that configuration to run code that’s not written.

                              It’s hard to describe the things that don’t exist as a result of restrictions. I can’t point you to a giant repo of things you can’t run; nobody bothered to create the repo because nobody can use what’s in it. But note that every app store restriction exists to prevent some developer from doing something that users want. (If developers didn’t want to build it or users didn’t want to run it, there’d be no point preventing it, because it wouldn’t have a market.) I don’t know how you feel about this, but I don’t think my cell phone has more amazing software now than it did six years ago. Either human creativity just ended, or something is preventing that creativity from getting to our phones - and it’s not hard to find what’s between the developers and the users.

                              Edit: To be a bit more concrete, note that most commercial phones have locked bootloaders, and most PCs are capable of booting arbitrary operating systems. As a result, there’s a large PC Linux community, but a very small Android developer community. Since the community is smaller, there’s not as much benefit to a user using a community Android distribution. I don’t know exactly what we’re missing out on, but the PC Linux community has contributed a ton of value, and there’s no equivalent on the phone, because our phones have locked bootloaders.

                              1. 2

                                So you could run arbitrary drivers if you configure a machine to run multiple VMs so one can act as a debugger for the other

                                But note that every app store restriction exists to prevent some developer from doing something that users want.

                                Ok, I was sorely mistaken on the kernel driver point. You’re also correct that most app store restrictions are BS. Code signing would also be a lot better if you could permanently “trust” an application like on macOS (or a driver).

                                I don’t know how you feel about this, but I don’t think my cell phone has more amazing software now than it did six years ago.

                                The crazy thing is that I feel like we go backwards in a lot of ways. I’m with you on this one.

                                1. 2

                                  If developers didn’t want to build it or users didn’t want to run it

                                  One of the common complaints in the Windows world is bundled browser toolbars. While there are people who actually like the Ask Toolbar and Yahoo Search, does anybody want it bundled with the JRE?

                                  In a strict neoliberal sense, I suppose that users do willingly run the Java installer and consent to everything it installs, but describing it as something that the end users “wants to run” doesn’t ring true. The JRE itself is usually just a means to run some other app, and the bundled toolbars are probably not part of the end-user goal.

                                  After all, free software distributions like Debian and Fedora have rules about what they allow in their repositories. And plenty of people complain about those rules. But do you actually think they’re trying to be user-hostile?

                                  I don’t know how you feel about this, but I don’t think my cell phone has more amazing software now than it did six years ago. Either human creativity just ended, or something is preventing that creativity from getting to our phones - and it’s not hard to find what’s between the developers and the users.

                                  Or, as an alternative explanation, the easy and low-hanging fruit has already been exhausted. Web apps haven’t really gotten better now as quickly as they were improving ten years ago, yet it isn’t any more proprietary now than it was in the past (If you say “Google’s fault”, I’ll reply by reminding you of IE6).

                                  1. 2

                                    While there are people who actually like the Ask Toolbar and Yahoo Search, does anybody want it bundled with the JRE?

                                    No, clearly not. But as you say, there are people who want them, outside of the JRE. Platforms which restrict classes of software will invariably exclude software that some people do want. At least personally, I did use the Google toolbar back when it added value to me by displaying Pagerank. Somewhat cynically, I can’t help but notice these things are designed to redirect traffic to obtain revenue, and platform owners would like to keep that revenue for themselves, so they have an interest in preventing things unrelated to user benefit.

                                    software distributions like Debian and Fedora have rules about what they allow in their repositories…do you actually think they’re trying to be user-hostile?

                                    No, I don’t. But as distributions, they don’t have a monopoly on software, and a feedback loop exists. If some piece of software is released that breaches a repository rule but a lot of people end up going around the repository to install it, it will spark a conversation about whether the repository’s policies are correct. That’s why people are able to complain about rules. In more closed ecosystems, that new piece of software just can’t exist, so users are excluded from the feedback loop.

                                    If you say “Google’s fault”

                                    I think the comments and criticisms I’m making here apply to pretty much all of the tech majors and are comments on restrictions that exist now among multiple vendors which did not exist 15 years ago. I don’t mean to single any one of them out.

                    2. 2

                      Both engines are Free Software. Both engines are Open Source. The FSF and the OSI both define their licensing criteria, and the GPL and ZLIB licenses both comply with the Four Freedoms and with the Open Source Definition.

                      You’re contrasting copyleft with permissive licensing, which is a totally different distinction.

                      1. 1

                        Thank you for pointing this out. I thought Stallman’s definition of free software required copyleft.

                        I stand behind my arguments for permissive licensing though.

                        1. 1
                          1. 2

                            Thank you for linking it. I’ve just read it. I still disagree with a lot of Stallman’s assertions.

                            1. 4

                              I’m not asking that you agree with him. I certainly don’t.

                              I just don’t want you to misrepresent him, or anyone else.

                              1. 1

                                Understandable. We could do with less misrepresentation these days.

                      2. 2

                        I don’t quite follow the argument you’re making, nor what distinction you’re drawing between “free software” and “open source”. It sounds like you’re saying that even though a piece of software like Quake III Arena is “free software” (that is, released under the GPL free software license), someone forking that software, writing a derivative work, and trying to sell it would be subject to legal action from Id Software for violating their Quake-related intellectual property rights - whereas some other piece of software Sauerbraten (which I’m not familiar with), released under a different-but-still-FSF-approved license, wouldn’t have this problem?

                        1. 1

                          @notriddle hit the nail on the head. I am talking about copyleft vs permissive licensing, the zlib license doesn’t preclude inclusion in proprietary software. The GPL does.

                          1. 2

                            I am talking about copyleft vs permissive licensing, the zlib license doesn’t preclude inclusion in proprietary software. The GPL does.

                            Interestingly, that makes GPL software less free in its own right, copyleft people seem to disagree that this matters but its the root of why some of us dislike it. Sometimes I just want to get my job done and don’t want to involve the legal team. Its also why I don’t put anything I do up as GPL unless I have to. I want others to do the same.

                            GPL’s virality is both a pro and a con. I lean to it being more of a con in that it imposes a philosophy of world upon source code that I find too extreme. We can differ on this but axiomatically they are approaching free from different starting points.

                        2. 1

                          remember that free software has no restrictions on commercial use. so when you say “if he tries to sell this thing that he spend so long on, he could get a cease-and-desist,” you are either mistaken, or employing a rhetorical trick.

                          it would be more honest to say that bob can’t prevent people from reading and modifying the source code of his game. this may or may not make it more difficult to make money on, depending on the circumstances.

                          with a clear view of the situation, people can decide for themselves whether the freedom to violate other peoples’ freedom is a worthy criteria for what makes a license “free.”

                          1. 1

                            it would be more honest to say that bob can’t prevent people from reading and modifying the source code of his game. this may or may not make it more difficult to make money on, depending on the circumstances.

                            The reason I chose a game engine rather than a game, is because the product is the source code. Sure, there are a handful of image assets for the GUI but those can easily be replicated. Am I wrong in my understanding that you cannot sell a GPL program without providing the source for free? (or at least allowing the purchasers to distribute it for free?)

                            with a clear view of the situation, people can decide for themselves whether the freedom to violate other peoples’ freedom is a worthy criteria for what makes a license “free.”

                            My point is that GPL violates more freedoms than permissive licenses.

                            1. 4

                              Am I wrong in my understanding that you cannot sell a GPL program without providing the source for free? (or at least allowing the purchasers to distribute it for free?)

                              yes, the latter is correct.

                              My point is that GPL violates more freedoms than permissive licenses.

                              yes, it violates the freedom to violate other people’s freedoms.

                              1. 1

                                yes, it violates the freedom to violate other people’s freedoms.

                                What “other people’s freedoms” does a permissive license allow people to violate?

                                1. 2

                                  the freedom to read/modify/share the code.

                                  1. 1

                                    Using a closed-source program that is based on open-source software is a choice. Don’t make it if you don’t want to. Vote with your money.

                                    Here’s something I think we can all agree on: selling a program based on open-source software without putting any significant work in is immoral.

                                    My additional point, is that one can put enough effort into something that they earn the right to keep the source to themself.

                                    1. 1

                                      Using a closed-source program that is based on open-source software is a choice. Don’t make it if you don’t want to. Vote with your money.

                                      i don’t see your point. same goes for software that was proprietary to begin with. in each case the software violates freedoms. or does it not?

                                      1. 0

                                        Yeah, looking back I wasn’t really saying anything there.

                                        What I should’ve said is: I don’t believe that seeing how everything works and being able to pick it apart/audit it is an inalienable right. (This may have something to do with the fact that I’m a Catholic and I believe things that have no scientific explanation, and to criticize them would be heresy.)

                                        1. 2

                                          nor is it an inalienable right to keep proprietary control over one’s modifications to a code base.

                                          that’s why complaints that the GPL is “less free” come off as concern trolling. if you care about software freedom, you would at least acknowledge that the only freedom the GPL takes away is the freedom to take away other people’s freedom. preferring a license that allows modifications to be proprietary would suggest that you don’t actually care about software freedom, so complaining about the GPL being less free seems hollow.

                                          if you simply disagree with free software and would prefer to be able to keep control over a digital artifact with no reproduction cost, fine, but you aren’t arguing for freedom at that point.

                                          1. 0

                                            if you simply disagree with free software and would prefer to be able to keep control over a digital artifact with no reproduction cost, fine, but you aren’t arguing for freedom at that point.

                                            I think it depends on your definition of freedom. In a communist sense, the GPL is more free. If property rights factor in at all, then permissive licenses are still superior (even if you don’t think it’s more free).

                                            The only issue I have with the GPL is that people who legally obtain your source code can distribute it for free, which would destroy any business that I built off of it. As an anti-communist, I won’t participate in the spread of the GPL virus.

                                            I wish more licenses required that modified source be distributed, but only if they don’t allow users to distribute it further.

                                            1. 4

                                              Whether property rights should apply to intangibles like software is an open question.

                                              “Intellectual property” is actually an artificial monopoly enforced by the state.

                                              1. 1

                                                The only issue I have with the GPL is that people who legally obtain your source code can distribute it for free, which would destroy any business that I built off of it.

                                                So what’s your take on Redhat? Their product is GPL’ed, and you can even argue that it benefits them, because anyone who chooses to also use and improve their software, necessarily has to give back their contribution, so that Redhat benefits from it again.

                                                1. 1

                                                  I wish more licenses required that modified source be distributed, but only if they don’t allow users to distribute it further.

                                                  what do you mean

                                                  1. 1

                                                    The GPL requires that modified source be available to users. That’s something that I wish caught on more. I just don’t like the part where the users can distribute the source themselves.

                                                    1. 1

                                                      so who can modify the source? only someone with a specific license agreement with the company/person that wrote the code?

                                                      1. 1

                                                        The idea would be that anybody who obtains/buys the software can modify it, but they would need a specific license agreement to distribute/sell it.

                                                        The point would be to put such a clause on an open-source project so that if somebody uses it in a proprietary application, the users can at least modify that portion of the software.

                              2. 1

                                This point has been made may times, and it boils down to “localized” or “downstream” freedom. Do you give Alice the power to restrict/control their users? Alice could have extended the engine with a mechanism that requires her to be paid every month, or that (for whatever reason) only works on Intel CPUs. By not releasing the source, and allowing the software to be modified+shared, “Carol” is dependent on Alice, or is not allowed to port the engine to her Raspberry Pi. That’s certainly less freedom for her (setting aside that this is “just” a game engine we are discussing). And there are a lot more “Carol”s than there are “Alice”es.

                                I’m quite pro-copyleft, and I see it in the same terms (albeit less extreme) as we would dismiss anyone who claims that the fact he can’t own a slave limits his freedom. It’s the freedom to restrict others (“permissive”) vs the freedom from foreign control.

                                1. 2

                                  You can also draw an analogy (I think direct but perhaps not quite) to negative vs positive rights. Permissive licenses grant negative rights to do whatever you want with the software, while copyleft grants positive rights to have access to free software.

                                  I’m rather sad that all rhetoric about rights tends toward negative rights, even though that’s not what most people care about once a baseline of negative rights is established.

                              3. 1

                                and to prevent organizations and people with political views specific activist programmers find distasteful from being able to freely use useful software

                                what do you mean by this exactly?

                                is there any reason releasing code under the GPL would not satisfy the wants of these smaller companies?

                                1. 1

                                  what do you mean by this exactly?

                                  The people who promote licenses like this want to be able to write software under a license that is widely-accepted as open-source but that also bans their political enemies from using the software.

                                  is there any reason releasing code under the GPL would not satisfy the wants of these smaller companies?

                                  The GPL allows software licensed under it to be used for any purpose, and creating a SaaS product that competes with the SaaS product the core developers of the software use to fund themselves is “any purpose”.

                            2. 4

                              challenging capitalism is perfectly compatible with iterative improvements. you can make iterative steps to put more resources and power in the hands of working people, and less in the hands of corporations. the importance of free software comes when you see that proprietary software is one lever of power that corporations can use against working people.

                              1. 5

                                It’s a nice idea (Who doesn’t want to live in a world where everything is free? Oh wait. A lot of people :) but I’d rather focus on ideas that help us iteratively improve the current situation.

                                Capitalism != markets. If you’d like I’d be happy to answer questions, but this is my usual recommendation for friends who have been taught that all market systems are “capitalism”. https://m.youtube.com/watch?v=ysZC0JOYYWw

                              1. 9

                                Because it’s the one text editor that doesn’t murder me with RSI.

                                1. 4

                                  Same. I tried using Emacs for a while and the constant need to hold down modifier keys made it physically painful.

                                  1. 3

                                    As an Emacs user I have to agree. It’s just that the benefits I get from using Emacs outweigh the pain…

                                    1. 3

                                      vim user rolls eyes… Causing physical pain in a completely avoidable way imho means that emacs is not meeting very basic prerequisites, however great the rest may be :)

                                      1. 2

                                        Ever heard of Evil mode? It is possible to get the best of both worlds, and I have trouble understanding why someone wouldn’t want that.

                                        1. 1

                                          I don’t know if it’s avoidable, beyond taking breaks from time to time. I’ve tried emulation packages (viper, evil), and different editing ideas (lispy, objed) but they always confuse me.

                                    2. 1

                                      I had this problem with Emacs until I learned how to press Ctrl key with the palm instead of the pinky finger.

                                      1. 5

                                        Wait, doesn’t everyone remap caps lock to control when they set up a new computer?!

                                    1. 18

                                      Great points about editing, but the use case shouldn’t be glossed over: “You might need to edit files via SSH.”

                                      It’s wonderful to have the powerful edit commands, but this use case shouldn’t be understated. Every time I’ve needed to edit or examine a file on a remote linux server, VIM’s always been there.

                                      I’ve spent thousands of hours writing code in VIM, but it’s not a true IDE. However, it doesn’t require X running, uses few resources itself (plugins are another matter), has regex search/replace built in, and you can run it inside screen or tmux in case your connection drops or to resume editing sessions. Knowing VIM in 2020 is like showing up to a job site and your toolbox is already there.

                                      1. 15

                                        The other side of editing over SSH is Emacs and TRAMP mode: Use your local Emacs to transparently edit files over SSH. The remote system doesn’t need to have any editors at all installed, necessarily.

                                        https://www.emacswiki.org/emacs/TrampMode

                                        1. 7

                                          TRAMP also allows you to use your local emacs setup and doesn’t incur network latency when editing, neither of which apply to vim through ssh.

                                          1. 5

                                            And it allows you to have different buffers in the same Emacs instance connected to different remotes. This means, among other things, that you can use dual-pane (orthodox) file manager Sunrise in Emacs with each pane pointing to a different remote, and copying and editing files between them as if they were both local.

                                            1. 1

                                              Can it keep a single buffer for multiple remotes? To push all changes in the buffer to all of the remotes.

                                              1. 2

                                                That’s not something I’ve explored. My best guess would be “no, not out of the box, but probably combined with some other mode that keeps multiple buffers synchronised.”

                                                1. 1

                                                  Isn’t some sort of source control a better tool for this task?

                                          2. 7

                                            People always bring up this point, but - and I say this being proficient with both vim and emacs - for those who aren’t doing sysadmin/devops/sre work, is this a good reason to spend time learning more than insert mode, arrow keys, esc, and :wq? And for those who are in the business of regularly editing files remotely: don’t they already know? For those of us who don’t spend a lot of time connecting to remote machines:

                                            • How often should we be editing files on remote hosts? Don’t we have “better” tools for configuring remote machines, e.g. ansible?
                                            • I’m only ever connecting to remotes that I’m in control of. If I need a program to be available, it’s easy to make it happen.
                                            • The few times I do have to edit a file on a remote host, I typically only have to make small edits to unbreak something. What degree of competency with an editor is really required to change a few lines?
                                            • If I weren’t comfortable with vim, but needed to do some heavy lifting on a remote, many editors have features for making this happen.
                                            1. 2

                                              You might edit files on remote servers rarely but I do it all day every day. For the reasons mentioned in sibling posts, tramp on emacs makes it both a transparent and rich editing experience.

                                              1. 1

                                                is this a good reason to spend time learning more than insert mode, arrow keys, esc, and :wq?

                                                On my terminal setup, arrow keys aren’t interpreted correctly so I have to use hjkl ;)

                                                Also :q! is great for when you’ve messed everything up and need to start over…

                                              2. 2

                                                If I wrote a post on vim I would deliberately skip this point because I get so little value out of it that it feels almost derogatory to how great modal editing is to make a big deal about just being there.

                                                I seem to be alone in how small a percentage of my time is spent doing serious editing on remote servers though.

                                                1. 2

                                                  Not necessarily, considering that part of Vi’s history is that it was developed in high-latency environments, where you wanted to compress as much “editing information” into as few keystrokes. This fact still turns out to be helpful over slow connections today. Holding backspace for a few seconds and then undo because (due to the lag) it went a few characters too far, is more annoying that pressing dd to remove a line.

                                                  1. 3

                                                    Holding backspace for a few seconds and then undo because (due to the lag) it went a few characters too far, is more annoying that pressing dd to remove a line.

                                                    I can’t tell if this example is representative of how Vi users use non-Vi text editors (holding backspace for a few seconds to delete a line) or if this is representative of how Vi users think users of other text editors delete a line.

                                              1. 2

                                                I’ve have some free time so I started learning XCB to write a small non-skeuomorphic Go (as in the game) client. I’m sad to see that XCB lacks documentation/explanations at so many points, that I have to fall back to searching GitHub for how functions are used. I managed to get a quite comportable C setup (haven’t set up eldoc yet), so I might write an article on what I did, because it doesn’t seem to be common knowledge.

                                                And I have a few patches I have to finish.

                                                Edit: It finally draws the way I want it to: https://0x0.st/i3r9.png

                                                1. 5

                                                  Regular Expressions are a great example of where Lisp/Scheme’s Code = Data approach shines. Take the Scheme Regular Expression SRFI, or Elips’ rx. The same could be done in other languages, but writing something like

                                                  RE urlMatcher = new SequenceRe(            // start matching an url
                                                    new RE.Optional("http://"),
                                                     new RE.OneOrMore(
                                                        new RE.Group("domain", 
                                                           new RE.Sequence(new RE.OneOrMore(RE.Word), ".")
                                                        )
                                                     ),
                                                     // etc. ...
                                                  )
                                                  

                                                  is far more cumbersome, even if it would allow you to insert comment, structure the expression, statically ensure that the syntax is valid.

                                                  1. 4

                                                    There are libraries that do this: https://github.com/VerbalExpressions

                                                    tester = (verbal_expression.
                                                                start_of_line().
                                                                find('http').
                                                                maybe('s').
                                                                find('://').
                                                                maybe('www.').
                                                                anything_but(' ').
                                                                end_of_line()
                                                    )
                                                    
                                                    1. 3

                                                      I still find

                                                      (rx bol "http" (? "s") "://" (? "www.") (* (not (any " "))) eol)
                                                      

                                                      nicer, plus it evaluates at compile-time. But good to know that other languages are thinking about these ideas too.

                                                      1. 6

                                                        So the regexp this represents is this one I think?

                                                        ^https?://www\.[^ ]+$
                                                        

                                                        I don’t know … I find the “bare” regular expression easier. Especially the Scheme/Lisp variant essentially uses the same characters, but with more syntax (e.g. (? "s") instead of s?). Maybe the advantages are clearer with larger examples, although I find the commenting solution as mentioned in this post much better as it allows you to clearly describe what it’s matching and/or why.

                                                        1. 3

                                                          This example is rather simple, but in Elisp, I’d still use it, because it’s easier to maintain. I can break the line where ever I want, insert real comments. Usually it’s more verbose, but in one case, I even managed to write a (slightly) shorter expression using rx, than a string literal because of escape-symbols:

                                                          (rx (* ?\\ ?\\) (or ?\\ (group "%")))
                                                          

                                                          vs

                                                          "\\(?:\\\\\\\\\\)*\\(?:\\\\\\|\\(%\\)\\)"
                                                          

                                                          but with more syntax (e.g. (? “s”) instead of s?).

                                                          If that’s the issue, these macros usually allow the flexibility to choose more verbose keywords. The example from above would then become (combined with the previous points)

                                                          (rx line-start
                                                              "http" (zero-or-one "s") "://"	;http or https
                                                              (zero-or-one "www.")		;don't require "www."
                                                              (zero-or-more (not (any " ")))	;just no spaces
                                                              line-end)
                                                          

                                                          Edit: With Emacs 27 you can even extend the macro yourself, to add your own operators and variables.

                                                          1. 2

                                                            Right; that example shows the advantages much clearer. It still looks kinda unnatural to me, but that’s probably just lack of familiarity (both with this method and Scheme in general; it’s been years since I did any Scheme programming, and never did much in the first place: my entire experience is going through The Little Schemer and writing two small programs). But I’m kinda warming to the idea of it.

                                                            One way you can do this in other languages is by adding a sort of sexpr_regex.compile() which transforms it to a normal regexp object for the language:

                                                            regex = sexpr_regex.compile('''
                                                            	(rx line-start
                                                            		"http" (zero-or-one "s") "://"	;http or https
                                                            		(zero-or-one "www.")		    ;don't require "www."
                                                            		(zero-or-more (not (any " ")))	;just no spaces
                                                            		line-end)
                                                            ''')
                                                            

                                                            And then regex.match(), regex.find(), what-have-you.

                                                            Dunno if that’s worth it …

                                                            1. 1

                                                              It would be possible, but you’d lose the fact that rx and similar macros can be expanded and checked at compile-time.

                                                              1. 2

                                                                You already don’t have that in those languages anyway, so you’re not really losing much. And you can declare it as a package-level global (which isn’t too bad if you’re consistent about it) and throw an exception if there’s an error, so you’ll get an error on startup, which is the next best thing after a compile-time check. You can also integrate it in your test suite.

                                                                1. 2

                                                                  Well Elisp does (Byte compilation), and some Schemes do too (but SRFI 27 couldn’t make use of it in most cases anyway).

                                                        2. 2

                                                          I agree – the problem with the chained-builder approach is that it’s shoe-horning this abstract idea of a regex through the lens of the syntax of a programming language. Designed from first-principles, a regex syntax is much more likely to look like the s-expression syntax.

                                                          1. 2

                                                            That is really pretty. Is this elisp?

                                                            1. 1

                                                              Yes.

                                                            2. 1

                                                              An aside about compile-time: There exists a C++ compile-time regex parser, surely one of the most terrifying examples of template metaprogramming ever. It’s also quite feasible to compile regexes at compile time in Rust or Nim thanks to their macro facilities.

                                                              That LISP syntax is nice, though.

                                                              1. 1

                                                                That sounds very appealing to me!

                                                                1. 1

                                                                  Do you have a link to some site that describes the C++ parser?

                                                                  1. 1

                                                                    No, sorry, or I’d have given it. I just remember a video of a conference presentation, by a woman with a Russian name…

                                                                    Edit: a quick search turned up this, which looks familiar: https://youtu.be/3WGsN_Hp9QY

                                                            3. 1

                                                              I program in Lua, and there, I use LPEG. There’s a submodule of LPEG that allows one to use a BNF-like syntax. Here’s the one I constructed from RFC-3986.

                                                            1. 3

                                                              lispy

                                                              The term is a bit disappointing, because one of the trills of Lisp is that you embed languages into Lisp, that simply interoperate with the rest of the language just like primitives. Think of the picture language in SICP. This seems to have conventional lisp syntax and a few forms, but sadly it’s totally disconnected from the rest of any lisp environment. “Lispy” is to Lisp, as hoverflies are to wasps.

                                                              1. 5

                                                                The language is being developed in conjunction with the structural editor, and so it was a lot easier to start with some very simple fundamentals and build from there. It has a lot of guarantees an impure Turing-complete language doesn’t.

                                                                In the meantime, “lispy” seems a reasonable shorthand for a language that uses S-expressions and lisp evaluation rules.

                                                                1. 1

                                                                  I know how “lispy” is used, I just consider it a pity when people go down that route, instead of embedding, because I feel like it looses a lot of the power it could very easily have.

                                                                  1. 3

                                                                    Sure, but sometimes power is bad! :)

                                                                    Or rather, it’s a trade-off.

                                                                    Some things I can do with this simple language that I wouldn’t be able to do if I embedded a general lisp:

                                                                    • Guarantee termination
                                                                    • Re-evaluate programs on change because they have no side effects
                                                                    • Statically know all variables in scope (many general lisps can create variables as a side-effect)
                                                                    • Statically infer the names of function arguments for every call
                                                                    • Interpret it safely so programs can be shared without XSS attacks etc.
                                                                    • Use a simple layout algorithm that works pretty well

                                                                    It is much easier to provide tooling for non-turing complete languages. Take a look at Dhall for more of this philosophy.

                                                                    1. 1

                                                                      Why couldn’t these things be guaranteed within a Lisp-DSL? Racket’s Plot library seems to do all these things (in a way that makes sense for it’s application). The lesson of Lisp is realizing that there is no difference between the given (Scheme RnRS, ANSI Lisp), the created (whatever code one writes in the given language) and the “limited” (the language created by the “created” language) language. Embedding is just the step from the “created” to the “limited” language.

                                                                      1. 1

                                                                        They can be guaranteed within a DSL. That’s what this is!

                                                                        If you’re trying to say I can increase power by using a general purpose lisp and still guarantee termination, you’re on shaky ground ;)

                                                                        1. 1

                                                                          All I’m saying is that if you’re going to make a “lispy” DSL, you might just as well make a DLS in Lisp.

                                                                2. 1

                                                                  My read here is that the interactive realtime hybrid text/graphic interface is the current focus of this project, and to that end, I’m not surprised that metaprogramming isn’t a top priority. There are plenty of realtime1 audio-oriented2 lisps with macro systems to play with.

                                                                  1. 1

                                                                    Also from ccrma is this, which uses scheme instead of common lisp—the excellent s7

                                                                1. 1

                                                                  The title doesn’t make it clear, but this is only about Common Lisp rather than the Lisp family of languages.

                                                                  1. 6

                                                                    I’ve recently seen a fair argument on a textboard that when you say “Lisp”, it makes the most sense to infer “Common Lisp”. And I kind of get it, if your language retains a direct linage to implementations from the 60’s, it does seem legitimate to call that “a Lisp”, as compared to Scheme or other syntactic-lookalikes, no?

                                                                    1. 6

                                                                      It’s a long standing convention that unqualified “Lisp” means Common Lisp. Other than Scheme, Emacs Lisp, Clojure, and AutoLisp, it’s the only general purpose Lisp anybody still uses, and if somebody means one of the others they’re sure to use the more specific name.

                                                                      #Lisp on Freenode is dedicated to Common Lisp, for example.

                                                                      1. 3

                                                                        Small correction, but it’s #lisp that’s dedicated to Common Lisp. ##lisp is for the family of languages.

                                                                        1. 2

                                                                          Oops, thank you! Corrected!

                                                                        2. 4

                                                                          It’s a long standing convention that unqualified “Lisp” means Common Lisp.

                                                                          It’s a long-standing convention among Common Lispers only.

                                                                      1. 5

                                                                        In the scope that was presented in this article, I think it’s better to consider pandoc+markdown. Raw TeX can also be accepted, but if you keep your markdown clean, you can export it to any format that pandoc supports (HTML, Epub, Word, Groff’s ms, etc.).

                                                                        1. 1

                                                                          I don’t like markdown.

                                                                          Pandoc also supports latex, though; so if you need to convert formats, you can still use pandoc.

                                                                          1. 3

                                                                            Markdown is fine for blog comments and things of that complexity. I would never want to write a paper in it though; the syntax simply can’t express things of that complexity like references.

                                                                            1. 1

                                                                              Markdown is fine for blog comments and things of that complexity. I would never want to write a paper in it though; the syntax simply can’t express things of that complexity like references.

                                                                              Markdown itself is wierd, but pandoc’s version does have citations, and at least some kind of identification.

                                                                        1. 7

                                                                          Rust just joined the ranks of Paxos and monads.

                                                                          1. 11

                                                                            Not quite. The title may refer to “easy english”, but what’s meant is the reduced linguistic subset often also called “simple” or “basic” English.

                                                                            “Paxos made simple” is not such a text.

                                                                            1. 3

                                                                              You mean the subset used in https://simple.wikipedia.org/wiki/Main_Page ?

                                                                              1. 3

                                                                                Yep, exactly that.

                                                                              2. 1

                                                                                often also called “simple” or “basic” English.

                                                                                Isn’t “Basic English” the name? Why are you putting it in quotes?

                                                                                1. 4

                                                                                  Quotes for readability. Basic is the correct name, but e.g. the Wikipedia itself uses and lists simple as another way to refer to it (and has a “Simple English Wikipedia”).

                                                                                  1. 4

                                                                                    It would appear the word “basic” isn’t in the Basic English vocabulary (but “simple” is. And “base” - but I don’t think there’s a (grammar) rule to define/derive “basic” - except maybe the “use words from industry etc.” (special terms).

                                                                                    So it would make sense that the Basic English term for Basic English is Simple English…

                                                                                    1. 1

                                                                                      Ha, that’s a great find!

                                                                              3. 11

                                                                                The borrow checker is like a burrito.

                                                                              1. 1

                                                                                I’ve been unknowingly using Emacs Lisp since much earlier – not in the sense of writing packages – my old man taught me how to use Emacs when I was nine

                                                                                (This makes me jealous)

                                                                                I decided to scrap my BMP encoder and go with PPM instead. Netpbm is text-based

                                                                                I was playing around with a NetPPM encoder myself in Scheme, just a few weeks ago, having have read the same article, and storage-wise, it’s helpful to remember that NetPPM can also be generated using binary data. The header stays the same, but after the P6 100 200 256 part, you just write bytes.

                                                                                Clojure’s license makes it a complete non starter for me, sorry. Live free or die.

                                                                                What’s this about? I recently read RMS saying that an argument to not consider Clojure a proper lisp is that it’s (allegedly, idk) based on cons-cells, so that “the most basic programming techniques of Lisp don’t work in Clojure”.

                                                                                1. 6

                                                                                  What’s this about?

                                                                                  EPLv1 isn’t GPL-compatible. Not totally evil, but it’s enough for me to want to avoid using it.

                                                                                  https://www.eclipse.org/legal/eplfaq.php#GPLCOMPATIBLE

                                                                                  1. 3

                                                                                    Fun facts:

                                                                                    • the EPLv2 is GPL-compatible
                                                                                    • the Clojure developers have collected copyright assignment from all contributors, which would be needed to update the license to use it
                                                                                    • despite this, the Clojure developers have indicated that they are uninterested in doing so
                                                                                    1. 1

                                                                                      Would it make you feel better or worse if it were MIT?

                                                                                      1. 2

                                                                                        If Clojure were licensed under MIT? I would feel better, as it’s compatible with the GPL.

                                                                                    2. 3

                                                                                      If you’re interested in Clojure, by the way, Phil Hagelberg (who wrote Leiningen, the standard Clojure build tool) is nowadays contributing a lot to Fennel (which is also mentioned in the article, and compiles down to Lua).

                                                                                      Libre Lounge has a really fascinating interview with him that covers that topic – caveat auditor, I ended up buying his Atreus keyboard after listening to the podcast.

                                                                                      1. 5

                                                                                        Careful, for he lurks among us. Some say that if you say the word “technomancy” out loud three times he may appear.

                                                                                      2. 2

                                                                                        From what I can see, Clojure uses the Eclipse Public License? (based on https://github.com/clojure/clojure).

                                                                                        Is the EPL that problematic?

                                                                                      1. 17

                                                                                        Here’s the thing: I don’t think you, the Open Source Initiative (OSI), or anyone else gets to single-handedly define a One True Definition of Open Source. Even if the OSI would have unambiguously coined the term Open Source (which is complicated, more on that later) then that still doesn’t mean they get to be the arbiter of all usage of it; it’s just not how language works. If trademarks can be come generic then so can neologisms such as Open Source.

                                                                                        Whether you like it or not for many people – especially those not deeply invested in the entire movement – Open Source means “there is access to the source code in some way”, with varying levels of things you are and aren’t allowed to do with it. They generally don’t mean “it fits the definition according to this checklist some organisation drafted”.

                                                                                        This guy wants to be able to label as “open source” software with licenses that violate OSI definition points 5 and 6 (“No Discrimination Against Persons or Groups” and “No Discrimination Against Fields of Endeavor”), so that he can promote software written by or influenced by political activists who want the cultural cachet of being involved in open-source software but who also want to discriminate against people, groups, and fields of endeavor they see as politically unacceptable. (In fact I think this about developers who specifically hate US Immigration and Customs Enforcement). I don’t want him and people who share his politics to get away with that.

                                                                                        Consequently, I will be pedantic about the label “open source”. I will insist in any space where I have the power to do so that software licensed under terms that discriminate against people, groups or fields of endeavor is not open source software.

                                                                                        1. 10

                                                                                          In fact I think this about developers who specifically hate US Immigration and Customs Enforcement

                                                                                          No, it’s not. You may surprised to learn that not the entire world is obsessed the political situation in the United States.

                                                                                          Most the discussions about this revolve around “almost Open Source” licenses – such as the Business Source License, Commons Clause, Reciprocal License, etc. – which restrict various commercial usage to protect the interests and long-term financial viability of the original author(s).

                                                                                          I don’t care much for the Hippocratic License as I feel it’s too ambiguous and unworkable in practice, although I don’t really mind if people call this “Open Source”.

                                                                                          1. 9

                                                                                            I will insist in any space where I have the power to do so that software licensed under terms that discriminate against people, groups or fields of endeavor is not open source software.

                                                                                            Seconded. I swear I will do this as well, here on Lobsters and on Hacker News and on Reddit. I already do anyway, but I heard public proclamation is also valuable.

                                                                                            1. 6

                                                                                              There’s good reason that in the list of Four Freedoms, “The freedom to run the program as you wish, for any purpose” is Freedom Zero: it’s the foundational freedom that the others build on (also the authors didn’t realise it needed to be made explicit until after they’d written Freedoms 1-3). The Open Source Definition is the Debian Free Software Guidelines with the word “Debian” replaced, so it’s unsurprising that “the freedom to run the program as you wish, for any purpose” should be foundational to Open Source, and I stand with you in asserting that.

                                                                                              The original blog post stands in a history that was initiated by the OSI. In wanting to downplay the tricky, political and social aspects of Free Software (and the tricky, homophonic resonances with No Money) they created a term that could be associated with existing business/technology terms like Open Systems and carried none of the political connotations. This opened up the possibility for making arguments that are, accidentally or deliberately, about promoting open source for a particular line of business independent of or even contrary to the social aims.

                                                                                              Where I agree with this blogger is that the OSI don’t have the authority to dictate how the phrase “Open Source” is used, because they didn’t trademark it. This is a bug, not a feature. Where the Copyleft idea subverted the intended protections of copyright, the FLOSS communities have been unable to do the same with trademark protection and have explicitly avoided trying the same with patent protection.

                                                                                            2. 3

                                                                                              A few days ago, someone who was (probably) using my software was annoying me, and I thought to myself “What can I do as the author of this software, to get back at him”. But then I realized, that it is exactly the vice of free software (or “open source” if you insist) that I have no way of excerpting my power over this user, beyond deluding, manipulating of lying.

                                                                                              I argue that this has to be kept in mind as a critical factor when talking about software licenses: “How can the author/owner exercise [power] over me?”. From simple things such as breaking my workflow by changing the UI, or preventing my from using the software, for personal or political reasons. As long as I don’t have the last word, I am at the mercy of someone else’s good will.

                                                                                            1. 4

                                                                                              I’ve got to love that the meat of 2 out of 3 examples showed in the video involve Editing MACroS ;)

                                                                                              1. 4
                                                                                                (car (reverse (split-string (getenv "SHELL") "/" t)))
                                                                                                

                                                                                                isn’t

                                                                                                (file-name-nondirectory (getenv "SHELL"))
                                                                                                

                                                                                                more idiomatic?

                                                                                                In my configuration, I just use registers for files I just a lot. Binding jump-to-register to a better key (I suggest C-x j) is the key in getting used to it.

                                                                                                1. 1

                                                                                                  more idiomatic?

                                                                                                  Absolutely! I definitely overcomplicated that one! :-)

                                                                                                  In my configuration, I just use registers for files I just a lot. Binding jump-to-register to a better key (I suggest C-x j) is the key in getting used to it.

                                                                                                  I like registers for jumping to single files, but when you want to have some universal command to discovers files you can’t really apply them. For an individual config they’d be fine though. And yeah - C-x r j is not a very convenient keybinding for sure. I’m thinking something like s-j might be cool.

                                                                                                  1. 1

                                                                                                    I like registers for jumping to single files, but when you want to have some universal command to discovers files you can’t really apply them.

                                                                                                    Sure, you mention using various shells but I’m not the kind of person that changes my shell mid-session ^^.

                                                                                                    1. 1

                                                                                                      For a single person the only practical implication is having to remember 3-4 registers for all the possible shell init files for their current shell. Yeah, most of the time you do end up editing just one on them (e.g. .bashrc or .zshrc), but still.

                                                                                                1. 18

                                                                                                  The essay doesn’t cover the most important way to improve your technical writing: have someone else read a draft. You can’t see your own blind spots.

                                                                                                  1. 8

                                                                                                    Not everyone can do that. Especially young people or when one just starts writing, it’s hard to even get anyone to care let alone thing enough about what you’re writing to improve it.

                                                                                                    In my experience the next best thing is to forget about it for a week, and then re-read the text.

                                                                                                    1. 8

                                                                                                      Given the comments left by @healeycodes and @jakob here, perhaps there’s merit to staring a lobste.rs “proofreading group”? I know we have several authors here that regularly post their articles; perhaps they would benefit from having them reviewed. I worry that the generous proofreading offers in this thread may eventually be forgotten or go unnoticed by the people who’d benefit from them.

                                                                                                      1. 5

                                                                                                        What about a “What are you writing?” thread? It could be created on a weekly/monthy basis, where people share drafts and ask other members to comment.

                                                                                                        1. 1

                                                                                                          I like this idea of a thread that you and @rustybolt suggested! In my opinion, something weekly would be good. Perhaps it can be posted on Mondays, so that people writing over the weekend can get feedback soon after?

                                                                                                        2. 3

                                                                                                          I’d like to say I’d also like to read and review technical writing. I also write occasionally – mostly quite mathy stuff.

                                                                                                          Also, maybe it’s a good idea to start a weekly “who’s writing?” thread where we can all post stuff and review each others’. Alternatively we can start an old-school mailing list (or even just a group mail would work, where everyone just replies to all on the latest one, then everyone could send feedback in private – this has the disadvantage that it wouldn’t be visible on lobste.rs so it would be hard for new people to join).

                                                                                                        3. 6

                                                                                                          I agree that it’s hard (especially when starting out) to find people to read your technical writing before publishing it.

                                                                                                          To anyone reading this comment: I’m happy to review your technical writing and provide feedback.

                                                                                                          (You can find my email via my website’s about page.)

                                                                                                          The last time I posted this on here, I read about some really cool topics and concepts, as well as new experiences, that I would have not read otherwise!

                                                                                                          In my experience the next best thing is to forget about it for a week, and then re-read the text.

                                                                                                          This helps me. However, it’s hard to step away from a piece of writing that is exciting for you!

                                                                                                          1. 5

                                                                                                            That’s a kind offer, and I’m happy to see it being made. I feel quite indebted to the wonderful community here, so I will offer the same. I am also happy to review your technical writing and provide feedback. Similarly, my email address can be found on my website.

                                                                                                            1. 3

                                                                                                              Same!

                                                                                                        4. 2

                                                                                                          An alternative I’ve found that works (for me at least) is to wait a couple of weeks, print the page, and read it very carefully.

                                                                                                          1. 1

                                                                                                            I was going to post the same thing! You can be your own affordable second set of eyes. Time is a safe way to clear your head. A lesser alternative is to work on another significant mental problem while not thinking of the sitting draft, so that when you look back at your draft, your mind is somewhat clear and you can review.

                                                                                                        1. 10

                                                                                                          Taking control of your personal knowledge is one of the greatest experiences I’ve had. I switched to emacs purely for Org-mode, stayed for the elisp in ~2006 or so.

                                                                                                          Plain text also has a wonderful property of being a super sturdy format you know you’ll be able to read. I’ve made all kinds of quick reports out of my org files because I can just run grep | sed | awk quickly, and then write up elisp if I want to keep it around longer.

                                                                                                          Unfortunately, it also has the property of being a filesystem/local interface, and thus most mobile/ipad/etc users would balk at the steps you need to go through to get your notes where you’d like them. Dropbox is probably the only solution that works well for users, but then it’s dropbox. Note the auto-committing logic here makes it very difficult to actually use your backups as you’re fighting against ongoing commits running in the same workspace. I really need to write the emacs extension that allows me to use tramp w/arbitrary binary that handles data reading/writing.

                                                                                                          1. 3

                                                                                                            Taking control of your personal knowledge is one of the greatest experiences I’ve had

                                                                                                            I’m in the same boat. I strongly believe that personal knowledge, such as one’s personal notes, should be based on a future-proof system.

                                                                                                            Unfortunately, [plain-text note taking] also has the property of being a filesystem/local interface, and thus most mobile/ipad/etc users would balk at the steps you need to go through to get your notes where you’d like them

                                                                                                            We may not be able to create as smooth an UX as all those mobile note taking apps, but I believe we should be able to come close enough. I currently dogfood my own app (called Cerveau based on the open-source neuron project) which allows me to edit git-backed plain text notes from web browser and mobile. It basically allows you to use Git(hub) as storage, while providing a nice editing and browsing interface.

                                                                                                            1. 2

                                                                                                              I’m in the same boat. I strongly believe that personal knowledge, such as one’s personal notes, should be based on a future-proof system.

                                                                                                              Strongly agree here.

                                                                                                              I manage my knowledge via a web-based system which uses text files as its base data storage format, which I can always zip, move, and adapt to a new system.

                                                                                                              1. 1

                                                                                                                That sounds interesting, what tool do you use?

                                                                                                                1. 1

                                                                                                                  Thank you for your interest.

                                                                                                                  I use a system called “hike” at this time, which you can see a demo of here: http://hike.qdb.us/

                                                                                                                  The username and password are both admin, I use that to keep out crawl bots, because at this time they fill the system with lots of junk.

                                                                                                                  It’s still a work in progress, and I think only useful to myself, but here are some general ideas:

                                                                                                                  Textfiles are identified by their hashes.

                                                                                                                  You can attach something an existing file using the >>hash format

                                                                                                                  Hashtags are used for grouping and categorizing.

                                                                                                                  A hash-tag in a parentless item is assigned to that item. However, if an item has a parent (using >>), the hashtag is assigned to the parent item.

                                                                                                                  Let me know if you have any questions.

                                                                                                            2. 2

                                                                                                              Unfortunately, it also has the property of being a filesystem/local interface, and thus most mobile/ipad/etc

                                                                                                              This is something that has held me back many times from using such system. In the past I did only use markdown notes in a single directory more like a journal (so no wiki and pretty messed) and syncing with Syncthing or Dropbox, which I believe is one of the best big providers for just plain text. And still editing on mobile was a pain back then, not sure if currently there’s any better interface to work on plain text.

                                                                                                              When that started not filling my needs I tried Evernote and moved to Notion.so which I have been using since then. I’m open to explore alternative, which made me end up here looking at VimWiki which I could couple up with WebDAV to sync with my vps.

                                                                                                              On a note: Notion has a nice export to Markdown and CSV, that almost nails it for me. Basically following up directory structures for the content you have in the platform.

                                                                                                              1. 5

                                                                                                                This is why Joplin fits my need perfectly.

                                                                                                                • Syncs via WebDAV
                                                                                                                • Great mobile apps
                                                                                                                • Markdown everything.
                                                                                                                • On desktop it has an option to spawn your favorite external editor of choice so Vim away!
                                                                                                                • 100% open source

                                                                                                                I’m in love. I haven’t ever felt this ‘together’ in terms of my personal and professional knowledge bases ever (no hyperbole).

                                                                                                              2. 2

                                                                                                                I’m not sure how great plain text is compared to say sqlite. Faster tagging, full text search, one file, are all things that would make a note-system better in my eyes, than having free-format files lying around in a file system. And it’s not like data has to be plain-text for it to survive, sqlite and a lot of other formats with public domain/free software parsers are just as accessible, perhaps even more when considering how file-system unfriendly mobile devices are (often there’s not even a proper file manager).

                                                                                                                1. 1

                                                                                                                  SQLite is one of the more compatible formats, but I still can’t edit it by hand.

                                                                                                                  My solution is to have a tree of plaintext files, which are then indexed into SQLite for indexing and searching.

                                                                                                                  1. 1

                                                                                                                    This feels like putting the cart before the horse to me. If you want optimized search why not retain the power and recoverability of plain text and use sqlite for indexing and metadata storage?

                                                                                                                    1. 2

                                                                                                                      I don’t recognize any special power in plain text. You just need a tool to access the database, and it’s as good as plain text, when it comes to unix utilities. Plus you don’t have to bother with duplicate states and updating the indexing or metadata storage, since it’s all in one file.

                                                                                                                      1. 1

                                                                                                                        Your sqlite file gets corrupted - Game Over.

                                                                                                                        One text file gets corrupted? You lose whatever bytes from that one text file.

                                                                                                                        Every decision is a trade off between utility and convenience.

                                                                                                                        1. 2

                                                                                                                          Your sqlite file gets corrupted - Game Over.

                                                                                                                          Not necessarily, I mean first of all it’s easy to create a backup, and then there are tools to recover as much as possible. Sure you could engineer an attack to corrupt just the right bytes, but then I could just as well say “what if you run rm -f *.md.

                                                                                                                    2. 1

                                                                                                                      Doing this now and it’s great. Title and content of notes are text fields, tags and links are structured many-to-many relations. Keeping metadata out of the note contents means I don’t have to parse anything and querying notes is super easy.

                                                                                                                      1. 1

                                                                                                                        What tool do you use for that?

                                                                                                                        1. 1

                                                                                                                          I wrote my own.

                                                                                                                  1. 4

                                                                                                                    Is it a mistake on my end, or why are your code blocks rendered with double-scrollbars? And while I’m writing about unrelated stuff, kill $(pgrep ..) can be replaced with pkill ..., on most systems.

                                                                                                                    1. 2

                                                                                                                      Is it a mistake on my end, or why are your code blocks rendered with double-scrollbars?

                                                                                                                      Seems like a bug with my Jekyll theme, I used a workaround, will investigate later, thanks for reporting

                                                                                                                      kill $(pgrep ..) can be replaced with pkill …, on most systems

                                                                                                                      Added in the post, thanks for pointing this out :)

                                                                                                                    1. 6

                                                                                                                      ;; Really likes lists, carries around their own 300 line file of helper procedures

                                                                                                                      I feel personally insulted.

                                                                                                                      1. 5

                                                                                                                        I’m actually pretty surprised that there doesn’t seem to be a strong backlash against the idea. Perhaps it’s simply because of who the thread participants are? My impression, so far, has been that C programmers tend to be fairly anti-Rust, for one reason or another.

                                                                                                                        1. 9

                                                                                                                          I’m not a fan of Rust at all but it’s a more logical language to add support to the kernel for than many. Indeed I can’t think of a better candidate from currently popular languages. It has the same “compile to efficient code without a massive runtime or any garbage collection” emphasis as C, more so than C++.

                                                                                                                          1. 2

                                                                                                                            Arguably Zig has even more emphasis on “better C” rather than “better C++”, but it also has the same downsides (single main implementation tied to LLVM rather than being a standardized language with multiple independent implementations) while Rust has way more maturity and momentum.

                                                                                                                            1. 3

                                                                                                                              Usually technologies that are same-but-better have difficulty getting adopted, because an incremental benefit doesn’t seem worth a big switching cost.

                                                                                                                              Rust dodges this by being significantly different at the same time. It’s not just C with a borrow checker, but brings new programming style and new idioms into the systems programming niche.

                                                                                                                          2. 4

                                                                                                                            I assume it’s because despite whatever problems the language may have, it seems to be the only safe language that doesn’t require a whole supporting runtime

                                                                                                                            1. 2

                                                                                                                              There’s a great talk from Bryan Cantrill about the whys: https://youtu.be/HgtRAbE1nBM

                                                                                                                              1. 1

                                                                                                                                I have minimal experience in the realm of such low-level programming, but I am very interested in programming languages. As an outsider, I have heard many positive things about Rust, but perhaps my view of the subject is limited. Out of curiosity, what informed your impression that C programmers tend to be anti-Rust? As an outsider and programming language enthusiast, I am always very interested to know how people approach new programming languages.

                                                                                                                                1. 3

                                                                                                                                  I don’t know if C programmers are generally anti-rust (I’ve seen some people who do regular work in C and really enjoy Rust. I think Bryan Cantrill is one). But the people I’ve seen negative comments from tend to use C, C++ or Go for lower level programming and not see the point.

                                                                                                                                  1. 1

                                                                                                                                    FWIW: Bryan Cantrills new company (oxide) is a Rust shop.

                                                                                                                                  2. 3

                                                                                                                                    I have some experience with OS/low-level C, but not kernel-maintainer level, but I’ll guess anyway:

                                                                                                                                    C is at it’s core rather simple. When using the language for real-world applications, you’ll encounter all the concepts pretty quickly. There are a few quirks in the syntax that one might not expect (eg. interleaving a switch-case and a loop is possible), but all in all, the core is clean. Rust, from my experience has more primitives, it changes a lot, quickly (afaik).

                                                                                                                                    Another thing that comes to mind is the development environment/tooling. C’ development environment is basically everything and nothing, because a properly setup *nix operating system is basically already a development environment. The system is sort of defined and expanding in terms of itself, with make and such. Rust brings it’s own keychain, for reasons I don’t think are illegitimate, but makes it seem “alien”, not as “native” as C.

                                                                                                                                    That’s just my take from someone who still hasn’t finished more than 20% of the Rust Book (though not just because of the points I just mentioned), so my possible misconceptions about the language are intentional.

                                                                                                                                    1. 7

                                                                                                                                      My impression is that C is only simple if maintaining and debugging the code is someone else’s problem.

                                                                                                                                      1. 0

                                                                                                                                        One doesn’t maintain a language, one maintains software. C “the language” is simple. The memory model is transparent, the syntax is clean, but of course too much simplicity can lead to an overcompensation of site-local complexity in larger projects, to make up for concepts you are missing (both from a usability and safety perspective), which is probably what you are referring to – but that’s not the same as to say that C is complicated.

                                                                                                                                        1. 6

                                                                                                                                          The problem is that “simplicity” isn’t worth anything when it creates complexity everywhere else.

                                                                                                                                          You want thread safety? Good luck! You want optimized, reusable containers? Ugh, maybe an include header hack will do? You want memory safety? Better get fuzzing. You want dependencies, portability or cross-compilation? You’ll never stop getting bug reports about your build scripts.

                                                                                                                                          1. 1

                                                                                                                                            Fair enough, but the people who value the simplicity of the language over the environment, as to probably those who prefer C over Rust, would disagree, which is fine.

                                                                                                                                          2. 6

                                                                                                                                            the syntax is clean

                                                                                                                                            https://cdecl.org

                                                                                                                                  1. 3

                                                                                                                                    So, and I mean this only slightly facetiously, is there any point in learning any language other than Rust at this point? I feel like all the momentum is with Rust and that languages like Go (which I prefer to Rust), the ML languages, and C++ are all dead in the water and basically just in maintaining-existing-codebases mode…

                                                                                                                                    In other words, for the vast majority of non-web/non-desktop projects it would seem silly given the current zeitgeist to start them in any language other than Rust/JavaScript.

                                                                                                                                    (I say this because the Linux kernel is notoriously conservative on language use, and with good reason…obviously other languages are gonna be around a long time but it seems like the only compiled typed language I hear about anymore is Rust.)

                                                                                                                                    1. 11

                                                                                                                                      the ML languages … are dead in the water

                                                                                                                                      Haskell and Ocaml are still moving forward well. Haskell recently merged in Linear Types, which goes a long way to making the type system both richer and more intuitive.

                                                                                                                                      C++ are all dead in the water

                                                                                                                                      Take a look at C++20. It has some great features. Some undoubtedly inspired by Rust, but many others that have been working their way into the standard for over a decade. C++20 has lambdas, option types, awkward[1] sum types, designated initializers, and more.

                                                                                                                                      In other words, for the vast majority of non-web/non-desktop projects it would seem silly given the current zeitgeist to start them in any language other than Rust/JavaScript.

                                                                                                                                      At the end of the day, Rust is still a low-level language [2], which means the programmer is in charge of keeping track of when data is copied, when references to data are passed around, and when data goes out of scope. While the borrow checker certainly helps in this process, it’s still something that the programmer needs to be aware of while coding, and this has its own cognitive load. Often times, when programmers reach for a low-level language, it is specifically because they want to tackle some aspect of memory management (whether that’s custom allocation, data sharing, real-time performance, or other things) differently from the way a more standard managed runtime would. This can lead to situations where the borrow checker can actually make it more, rather than less, difficult (due to non-standard memory management techniques that the programmer consciously wants to undertake) to develop and reason about code.

                                                                                                                                      Rust is also difficult to use in the following situations:

                                                                                                                                      • Interfacing with binary libraries
                                                                                                                                      • Using an alternate libc
                                                                                                                                      • Using a custom memory allocator
                                                                                                                                      • Developing for the Android NDK

                                                                                                                                      Moreover, Rust is a complicated language. The surface area of the language is large and that makes understanding its nuances both difficult and, at times, time consuming. Other languages like Nim and Zig take alternate decisions that also enable low-level development with greater safety and lower cognitive load than C.

                                                                                                                                      Then there’s the world of scientific computing. C++, C, and Fortran have long been the stalwarts of scientific computing, but now we have a new crop of dynamic languages like Python, Julia, and R, that are all great. Rust still lacks interfaces to many of the really big scientific-computing frameworks[3], whereas many frameworks (such as Stan or CLASP) are written in C++ and offer C++ libraries out of the box, along with Python, R, and sometimes Julia wrappers. One can certainly wrap the interface for these libraries themselves into Rust, but in C++ or Python, I can just grab the library and start developing.

                                                                                                                                      I think it’s unfortunate that due to the vocal Rust fanbase on certain parts of the internet that some folks feel pressured to use Rust. Rust is a fantastic language (IMO), but there certainly are interesting, performant, and practical alternatives out there that can often be better for certain usecases.

                                                                                                                                      [1]: I call them awkward because they aren’t as neatly baked into the language as they are in Rust, but C++ offers the well written any and variant types.

                                                                                                                                      [2]: It’s funny because literature from a few decades ago largely considered C++ to be a “higher level language”, but here we are.

                                                                                                                                      [3]: Others often call this machine learning, but the proliferation of scientific computing is not at all restricted to ML. Stan is a Bayesian inference library and CLASP is an Answer-Set Programming language/environment.

                                                                                                                                      1. 9

                                                                                                                                        Take a look at C++20. It has some great features.

                                                                                                                                        I think C++’s problem has never been its lack of features.


                                                                                                                                        My approach has served me quite well: If I see new software being written in C or C++, I’m going to ask “why?” – and if there is no really really convincing reason – I stay away.

                                                                                                                                        1. 4

                                                                                                                                          Developing for the Android NDK

                                                                                                                                          With my initial contributor of Android support for Rust hat on, I am curious about this. Yes, it always could be better, but what’s the specific problem? Rust for Android is production ready, in the literal sense of the word. It has been years since Firefox for Android (>100M installs) shipped millions of lines of Rust code in production. Cloudflare also shipped WARP for Android, whose WireGuard implementation is written in Rust.

                                                                                                                                          1. 3

                                                                                                                                            It’s funny because literature from a few decades ago largely considered C++ to be a “higher level language”, but here we are.

                                                                                                                                            “High” is a great term for describing languages this way, because it’s inherently context dependant; you can be high on a ladder or high on an aeroplane. That the heights are so different is not a problem; you wouldn’t use an aeroplane to clean your roof.

                                                                                                                                            1. 2

                                                                                                                                              Haskell recently merged in Linear Types

                                                                                                                                              I guess you mean GHC, not (standard) Haskell, insofar that even exists.

                                                                                                                                            2. 4

                                                                                                                                              I think for down and dirty systems programming, probably not.

                                                                                                                                              For distributed systems, Java is still in the mix at most companies. Rust isn’t really what I would call “web yet” (despite what the web site says) and Go is a much easier lift for that sort of backend work.

                                                                                                                                              I think there is still a good number of options on the backend.

                                                                                                                                              For the front end, I would only consider TypeScript at this point.

                                                                                                                                              1. 2

                                                                                                                                                i’m personally perfectly happy using ocaml, and i think the language has a decent bit of momentum these days. it’s a really good statically compiled applications language; it’s not quite a systems language but then neither is go, both of them depend on a gc.

                                                                                                                                                for a systems-level language i’m really hoping that D will catch on as cleaner than C++, more capable than go and easier to use than rust, but it doesn’t seem to be gaining popularity as fast as it should. rust is a perfectly fine language too and i keep meaning to do a serious project in it, but it definitely has a higher entry barrier than D does.

                                                                                                                                                1. 2

                                                                                                                                                  I don’t think it’s so black and white. Go has some serious momentum right now. It’s a very pragmatic and practically useful language. Rust is great but has many downsides, e.g. the compiler isn’t anywhere close to as fast and it is far more complex to learn and use.

                                                                                                                                                  1. 4

                                                                                                                                                    Go has occupied the “devops tools” niche, but thankfully it didn’t really take off anywhere else.

                                                                                                                                                    the compiler isn’t anywhere close to as fast

                                                                                                                                                    It’s gotten really good at being incremental though. Even on my low-power laptop, cargo run after changing a couple source files is pretty quick. Faster than TypeScript for sure. Also I wonder how many Linux users are just losing lots of time to linking with some awfully slow linker like GNU BFD ld instead of LLD.

                                                                                                                                                    1. 1

                                                                                                                                                      but thankfully it didn’t really take off anywhere else.

                                                                                                                                                      Not sure what you mean here. It’s the language of the cloud. Every major cloud provider has an official Go SDK and the Go team at Google is actively involved in supporting this. Many of the CNCF projects are written in Go.

                                                                                                                                                      e.g. see go-cloud or the support in gcloud functions.

                                                                                                                                                      For CLI tools as well, it’s become preferred over scripting languages like python and ruby. e.g. fzf is written in Go, the new GitHub CLI is in Go. While rust is used in newer CLIs as well, it’s usually only for performance critical CLIs like ripgrep.

                                                                                                                                                      It’s gotten really good at being incremental though.

                                                                                                                                                      Agreed. I still appreciate just how insanely quick Go is, especially when building on a new machine or pulling a dependency. I never have to really wait for things to compile.

                                                                                                                                                      1. 4

                                                                                                                                                        Many of the CNCF projects are written in Go

                                                                                                                                                        That is exactly what I meant by ‘the “devops tools” niche’! Maybe I should’ve used the “cloud” buzzword instead of “devops”, but I like calling it “devops”.

                                                                                                                                                        e.g. fzf is written in Go

                                                                                                                                                        fzf is hardly a unique tool, I have a list of these things here :) Personally I use fzy, which is pretty popular and actively developed, is packaged everywhere, has a very good matching algorithm.. and is written in C, haha.

                                                                                                                                                        the new GitHub CLI is in Go

                                                                                                                                                        Yep, that kind of thing is what I’m not very happy about, but it’s still a pretty small amount of things still, and I can successfully avoid running any Go code on any of my personal machines.

                                                                                                                                                        1. 3

                                                                                                                                                          Yep, that kind of thing is what I’m not very happy about, but it’s still a pretty small amount of things still, and I can successfully avoid running any Go code on any of my personal machines.

                                                                                                                                                          Why does it matter whether a binary you use on your machine is written in Go or not? If you’re building it from source, presumably your distribution’s build scripts should take care of orchestrating whatever Go code is necessary in order to compile the package; and if you’re just pulling an executable why does it matter what language was used to produce the binary?

                                                                                                                                                          1. 6

                                                                                                                                                            I think GP’s answer is great and insightful, just adding my own take:

                                                                                                                                                            I try to avoid code by people who think LARPing programming-in-the-1960ies is a reasonable choice to build things in 2020, because I’d rather not find out which other “reasonable” choices they have made further down the line.

                                                                                                                                                            Also, the community’s anti-intellectualism is off-putting for me.

                                                                                                                                                            1. 6

                                                                                                                                                              I’m the kind of person who cares about how the sausage is made :) If I can “boycott” things I just don’t like, I’ll do it. Here’s a great criticism of the language, but what made me hate it was the internals of the implementation:

                                                                                                                                                              • the fully static binary thing, not even using libc syscall wrappers
                                                                                                                                                                • first obvious practical problem: you can’t hook syscalls with LD_PRELOAD in go binaries! I don’t want any binaries where LD_PRELOAD does nothing.
                                                                                                                                                                • they do raw syscalls even on FreeBSD, where libc is the public API and raw syscalls are not. They completely ignored FreeBSD developers’ messages about this and went ahead with the private API. Yeah sure, the syscalls are backwards compatible, it works fine (until someone disables COMPAT_FREEBSDn kernel options but whatever)..
                                                                                                                                                                • but porting to a new platform is hell! Yeah, for the most popular ABI (Linux) there’s enough contributors to write custom syscall wrappers for all CPU architectures, but any {less-popular OS + less-popular CPU ISA} combo just won’t be supported for a long time. I’ve started porting Go to FreeBSD/aarch64, abandoned it in frustration, but others have picked it up and finished it. Cool, I guess. But we’ll have the same problem with FreeBSD/powerpc64, FreeBSD/riscv64 etc! (This is the most “practical” consideration here, yes.)
                                                                                                                                                              • which brings me to how these syscall wrappers (and other things) have to be written.. Go uses a very custom toolchain with a very custom assembler which is completely alien to normal unix conventions. It’s not easy to write it. Oh, also, it is rather half-assed (this affects applications way more than it affects porting Go itself):
                                                                                                                                                                • it doesn’t support SIMD instructions, and if you want to call something fast written in C or normal sane assembly, you’d have to take the overhead of cgo (because the Go calling convention is custom)
                                                                                                                                                                  • and to not take the overhead, people have written things like c2goasm. Just read that readme and let that sink in!!
                                                                                                                                                                • it doesn’t even seem to support all addressing modes of amd64! When writing a binding to SIMD base64, I couldn’t use c2goasm because I couldn’t express mov al, byte ptr [rax + base64_table_enc] in Go assembly. (There were probably ways around it, like only passing the offset into the normal-assembly functions and letting them use that offset to look up in the table.. but I was already fed up with the awfulness and just used cgo.)
                                                                                                                                                              1. 2

                                                                                                                                                                (I’d like to point out that I too care how the sausage is made and I loved your phrasing on that point.)

                                                                                                                                                                Obviously what follows is solely my opinion, but I feel like some of those criticisms are unjustified.

                                                                                                                                                                From your comment:

                                                                                                                                                                The static binary thing is a huge boon in some situations. We have a remarkably heterogenous mix of Linux versions in the field and yet the same Go binary “just works” on all of them. That’s an enormous burden off our backs.

                                                                                                                                                                That Go’s assembler is weird is I suppose problematic, but for the “average user” of Go that’s just an implementation detail that can be safely ignored.

                                                                                                                                                                From the linked rant:

                                                                                                                                                                Yes the file permissions APIs are weird because the models for Windows and *nix are so different. I feel like that’s a very specific issue that the rant generalizes to the whole language. In general, a large part of the rant focuses on how Go doesn’t do the right thing for Windows which may be true but it doesn’t seem to be quite that bad…I know a lot of people who have written large Go codebases that run on Windows and are very happy with it. In the rant it comes across, IMHO, as nitpicking.

                                                                                                                                                                Later on the rant goes on about how a Go project pulls in a bunch of dependencies and then transitively pulls in even more and so on…I feel like comparing that to Rust isn’t quite fair. I’m not super-familiar with Rust but several of the projects I’ve looked at pull in huge numbers of crates which pull in more crates and so on. It seems like it might even be worse in Rust because of the smaller standard library and, given the Actix controversy, it doesn’t seem like you can rely on third-party Rust crates being inherently safe.

                                                                                                                                                                Finally, though, and these are again my opinion:

                                                                                                                                                                • Rust feels chaotic. There’s no formal specification of the language. The Rustonomicon says this:

                                                                                                                                                                  Unfortunately, Rust hasn’t actually defined its aliasing model. 🙀 While we wait for the Rust devs to specify the semantics of their language, let’s use the next section to discuss what aliasing is in general, and why it matters.

                                                                                                                                                                  That does not fill me with warm fuzzies.

                                                                                                                                                                • Documentation seems lacking. There are a lot of TODOs everywhere.

                                                                                                                                                                • There’s a new release every six weeks so I always feel like I’m playing catch-up. The “Editions” mechanism seems to help some here, but I went to try to build a Rust program (alacritty) and my Rust version was too old…and it wasn’t that old.

                                                                                                                                                                • I don’t like the community. I know that this may come as a shock but I have gotten this “superiority complex” feeling from the Rust community. Any criticism of or concerns about the language seems to be met with “no, you’re wrong, Rust is the best! Your language sucks! Why would you use any tool other than Rust?” Sometimes it’s more polite but it’s still there. Any time someone talks about another language (Go, C++, whatever), someone has to come in and say “why don’t you rewrite it in Rust?” There have been times where I’ve seen on SO or Twitter people almost being made to feel foolish for daring to use some language other than Rust.

                                                                                                                                                                • Again on the community, one of the core developers made a joke about C being designed by men and breaking constantly and COBOL being designed by women and just working. When a guy on Twitter said that was kinda sexist, she accused him of “mansplaining” and said he was telling her the joke was sexist rather than understanding its “obvious meaning” (which apparently wasn’t so obvious)…which I found kind of bothersome, especially since the community seemed to agree and anyone who took offense was called sexist (and trust me, I’m as leftist/feminist as they come but that doesn’t and shouldn’t mean that I hate men). This again felt like the “Rust community is superior” thing again: the Rust community was correct and those who disagreed with them were wrong, inherently so.

                                                                                                                                                                1. 2

                                                                                                                                                                  We have a remarkably heterogenous mix of Linux versions in the field and yet the same Go binary “just works” on all of them

                                                                                                                                                                  Sure, do that on Linux where the syscalls are the public API. Zig does that too, but IIRC it has an option to use libc on Linux, so you could make LD_PRELOAD work and everything, say when you’re building distro packages or personal binaries that you don’t want running on ancient distros.

                                                                                                                                                                  I just really don’t like that a) there’s no choice, only direct usage of syscalls and b) this is forced on platforms that don’t consider raw syscalls as public API.

                                                                                                                                                                  (Also, something dynamically linked to glibc will work on all glibc distros of the last N years if you use the headers from an N years old version. With a language like Rust that has its own definitions of libc symbols instead of C headers, these definitions usually are as backwards-compatible as possible already.)

                                                                                                                                                                  for the “average user” of Go that’s just an implementation detail that can be safely ignored

                                                                                                                                                                  Yes. Well, I’ve seen what’s inside, so it’s my mission to tell everyone how cursed it is there. Feel free to ignore me!

                                                                                                                                                                  After all, all of computing is cursed on the inside somewhere :D But these particular experiences are what made me scream at computers the most, so I’m sharing them. Some people do care about implementation details of a thing even when they don’t modify that thing specifically.

                                                                                                                                                                  There’s a new release every six weeks so I always feel like I’m playing catch-up

                                                                                                                                                                  Use nightly! :P

                                                                                                                                                                  someone has to come in and say “why don’t you rewrite it in Rust?”

                                                                                                                                                                  At least on /r/rust this kind of stuff usually downvoted into oblivion.

                                                                                                                                                                  Twitter is a trash fire that brings the worst out in people. Heck, some people tweeting that might not have written a line of Rust ever, just shitposting memes they’ve heard somewhere.

                                                                                                                                                                  trust me, I’m as leftist/feminist as they come but that doesn’t and shouldn’t mean that I hate men

                                                                                                                                                                  Well that should mean hopefully having a (n extremely-online ironic millennial) sense of humor :) I wouldn’t start serious Discourse™ in defense of the joke, but I’m okay with the joke. “sexism against men” isn’t really meaningful because men are the more dominant group in current societies. (oops did I just start a Discourse?) Anyway tbh you don’t have to “hate” anyone to find this funny.

                                                                                                                                                                  1. 3

                                                                                                                                                                    trust me, I’m as leftist/feminist as they come but that doesn’t and shouldn’t mean that I hate men

                                                                                                                                                                    Well that should mean hopefully having a (n extremely-online ironic millennial) sense of humor :) I wouldn’t start serious Discourse™ in defense of the joke, but I’m okay with the joke. “sexism against men” isn’t really meaningful because men are the more dominant group in current societies. (oops did I just start a Discourse?) Anyway tbh you don’t have to “hate” anyone to find this funny.

                                                                                                                                                                    No doubt. The joke itself was funny. What bothered me was that someone responded with a polite “hey, that seems uncool” and then that person was called “sexist” and a “mansplainer”. I’m all for off-color humor but if someone you’re ostensibly trying to welcome to the community says that it bothered them, the correct response is “sorry, it was a joke but I could see how it could be taken in that manner and I apologize”…not attacking them. That this behavior was from a Rust core team member made it even worse.

                                                                                                                                                                    But that whole thing was really just a footnote. What pushes me away more is the constant slamming of other tools and languages, which really gets grating. I don’t hang out on Reddit (if I wanted to hear about how COVID-19 is a plot by Obama to make Trump look bad or how same-sex marriage is Satanism I’d just talk to my father-in-law) but the…zealous…behavior of Rustaceans pops up just about everywhere I frequent, including my beloved lobste.rs from time to time..

                                                                                                                                                                    Long story short (too late!), I like Rust quite a bit, but there are some negatives that I wish would be addressed.