Simon 𐕣he 🪨 Johnson

they/them

Lord, where are you going?

  • 1 Post
  • 32 Comments
Joined 1 month ago
cake
Cake day: April 22nd, 2025

help-circle

  • Just a reminder that Reddit was once difficult for people to understand.

    I honestly don’t believe this at all.

    Snapshat was popularized by a generation that grew up only using apps, and it was designed to be obtuse, mysterious and difficult to learn in comparison to other apps as a feature. It grew regardless.

    To be honest though, I’m a bit disappointed by the other users here. The quality of comments is really poor, both idiotic and adversarial. I’m talking fox news comment section level.

    Yeah so is reddit. The best moderation and engagement in fediverse typically exists in the highly moderated communities that people constantly complain about not respecting their freeze peach and antisocial tendencies.





  • It seems naive to believe that the Chinese firewall acts purely as a benign protector of the assaulted Chinese citizen. Chinese people are not like stupid children in need of protection, they are smart and strong.

    Yeah it’s equally naive to believe that the Chinese firewall acts purely as a hostile censor, Chinese people aren’t uneducated, oppressed, impoverished individuals, they are accomplished, politically active, and well to do. The Chinese people have comparatively derived a larger individual and collective benefit from their government than Americans have in the last 50 years.

    If you read actual comparisons of “censorship regimes” there are tons of commonalities that are just ignored by Westerners and their Chinese counterparts are made out to be uniquely evil and beyond the pale. For every news article you read about how the National Security Police invites a satirist to “drink tea” you’re ignoring all of the times the FBI does the exact same thing, and uses various psychological tactics to escalate into a position of legal authority to get around their limited authority to collect evidence.

    You know why it’s “soooo hard” for the cops to arrest rich people even if they know where they are? It’s because the tactic of escalatory arrest (an arrest that happens without a warrant as the result of an “investigation”) doesn’t work on rich people, they have gates, intercoms, staff, and know their rights. They aren’t easily cajoled into the position of opening their home to a cop, or allowing a cop access to their body. Isn’t is very strange that these very technical legal distinctions aren’t told explicitly to the “freedom loving people” of America? Meanwhile the agents of “evil Chinese government” don’t need to play games like this, because the cards are all on the table.

    People in other countries get “dissapeared”, but when ICE or the Department of Corrections shuffles prisoners around for political purposes such as Mahmoud Khalil. People in other countries are “political prisoners” but in America we have the WGAD which is a nice rhetorical trick so that the government can “honestly label” it’s political prisoners (upon a opaque and deliberatley difficult review process only undertaken by those who actually want to go through it for the benefit of being labeled a political prisoner. WGAD has not authority to enforce anything.

    People in other countries get thrown in jail because of political corruption, in the US saying such a thing is insulting the honor of the judiciary as a whole, a judiciary that allows the same practices the jailed Stephen Donzinger for the crime of taking on a legal case against Chevron in Ecuador. Furthermore it’s processes are abused to provide legal procedural punishments for missteps in engaging with the system such as the contempt charges the Donzinger case. Donzinger is still disbarred and cannot leave the country, despite winning all of his appeals. All at the behest of a corporation that doesn’t want to create a precedent that it must pay for poisoning people.

    The reality here is that you’re not actively comparing things, you are just going on hunches or whims, and if you take a look that’s how a lot of information you receive is actually structured. That is what allows labels like “authoritarian” to have a spooky evil weight. In essence the US has simplify codified the abuse into law, which is how it gets around these icky little moments of “Are we the baddies?” the reply is a thought terminating cliche of “No we’re all just following legal orders, in the freest country in the World”. China doesn’t need to Nuremburg because it’s goal of social cohesion ensures that people understand how and why things are happening to them.



  • The self censorship that exists on the Chinese internet is a matter of moderation scale and techniques. It doesn’t exist in the West because Western companies have the incentive to keep you interacting with their products.

    In China moderation is meant to:

    1. Protect the rest of the users from bad behavior
    2. Signal to the bad user that they are engaging in bad behavior.

    Western moderation is meant to:

    1. Protect the rest of users from a bad behavior
    2. Keep bad users engaged in order to drive ad revenues.

    1 and 2 are inherently at tensions with one another. Thus you have the problem where 1 is diluted by 2 leading to a much more limited set of what is considered bad, and an ever changing and political understanding of it based on the whims of the ownership and their relation to the party in power. Facebook changes its moderation policies based on presidential administration.

    2 also leads to non-deterministic systems of gating users into fake interaction or limiting their reach to other similarly bad users.

    Another reason is cultural / social. Praise is often used ironicly in China, they have a very fine line between legitimate praise and what in the West would be considered saccharine or gassing someone up. In China when you overly praise someone it’s read as a criticism of the person for what you’re praising them for. So typically censorship structures do not take into account sentiment unlike in the West esp. because Chinese is more of a figurative language than English. There is a lot of context lost in communicating text only and audio only Chinese due to how the language is constructed. In essence they prefer to police topic not types of speech (e.g. hate speech, criticism, etc).

    The last reason this happens is a lot of the Chinese Internet’s moderation policies are based on the fact that their level of public social acceptability is much more constricted think PG not even PG-13. In that sense the codified language works to create a space where you’re able to have conversations on things that would “rock the boat” without getting everyone hot and bothered. Unlike the Western Internet where social media companies want these clashes to happen because they drive more engagement and thus more revenue.

    For example instead of posting about censorship and getting into an internet pile on where nothing happens and nobody learns anything because they’re talking past each-other why not just post a picture of a river crab wearing 3 watches. Anyone who cares knows what that means and they know that arguing about it online isn’t actually the way to change anything in China. Everyone having a take while barely understanding the thing they have a take on is only beneficial to Western capitalists running internet companies that act as treats. Higher education is affordable in China, you can actually go learn about censorship at an accredited program. Surprisingly because Chinese citizens on average are protected by their government from being wrung dry for all their profit potential by their capitalist class they have time/energy to do these things.








  • you are restricted to a set of statements that can be expressed using a particular type system

    What I’m saying is that most good static typing systems do not practically have such limitations, you’d be very hard pressed to find them and they’d be fairly illogical. Most static typing systems that are used in enterprise do have limitations because they are garbage.

    So in such shitty type systems you often have code that’s written for the benefit of the type checker rather than a human reading it. In good type systems any code that’s written for the benefit of the type checker is often an antipattern.

    For example, Lemmy devs prefer this trade off and it has nothing to do with enterprise workflows.

    Rust has HKT support through GATs and typeclass support thru traits. Rust has minimal code you write for the benefit of the type checker.

    Typescript technically has HKT support but it’s a coincidence and the Typescript team doesn’t care about it, since the beginning Typescript was made to be Enterprise Javascript by Microsoft. Though systems like fp-ts exist they’re hard to get rolling in enterprise.

    Typescript does have problems with code that’s written for the benefit of the type checker rather than a human reading it in a large part due to inefficiencies of the compiler itself. In a small part due to some corner cases that still exist because even though it’s type system while more advanced than others in it’s enterprise grade class, it’s still written in that style for that purpose so the inconsistencies it makes to support the janky workflow (plus some EMCA stuff e.g. Promise is not functionally typeable since the spec breaks set theory for convenience reasons) leads to that problem.

    However in Typescript these are avoidable problems and you are able to write code without dealing with the type checker’s bullshit a good amount of the time if you follow the correct patterns – certainly better than any other “enterprise grade” static typing system.



  • Static typing itself is a trade off as well. It introduces mental overhead because you are restricted to a set of statements that can be expressed using a particular type system, and this can lead to code that’s written for the benefit of the type checker rather than a human reading it. Everything is a trade off in practice.

    You mean code that’s written to the benefit of a low efficiency enterprise workflow, which is my love hate relationship with Typescript. Best out choice out of a pile of shit.



  • That’s been the opposite of my experience using Clojure professionally. You’re actually far more likely to refactor and clean things up when you have a fast feedback loop. Once you’ve figured out a solution, it’s very easy to break things up, and refactor, then just run the code again and make sure it still works. The more barriers you have there the more likely you are to just leave the code as is once you get it working.

    This is more of a how the saussage is made issue in my experience than a tooling selection issue. Clojure may make it easier to do the right thing but the actual forcing function is the company culture. Self-selection of Clojure as the company’s tooling may create a correlation.

    Most companies have the ability to implement fail fast workflows for their developers they simply choose not to because it’s “hard”. My preferred one is Behavior Driven Development because it forces you to constrain problems into smaller domains/behaviors.

    When you’re dealing with types or classes they exist within the context they’re defined in. Whenever you go from one context to another, you have to effectively copy the data to a new container to use it. With Clojure, you have a single set of common data structures that are used throughout the language. Any data you get from a library or a component in an application can be used directly without any additional ceremony.

    An Adapter is typically a piece of code that transforms data between formats at various boundaries. Typeclasses remove the need for Adapters for functionality at library boundaries e.g. most thing have map where in javascript I can’t do {}.map with the EMCA standard. However typeclasses do not solve the problem of the literal data format and functionality differences between different implementations.

    For example I call some API using a Client and it returns bad gross data based on how that API is written, I would use an Adapter to transform that data into clean organized data my system works with. This is extremely helpful when your system and the external system have references to each other, but your data taxonomy differs.

    A real example is that Google Maps used to have a distance matrix API where it would literally calculate matrices for you based on the locations you submit. Circa 2018 Google changed it’s billing driving up the prices, which lead a lot of people to use alternative services like Here.com. Here.com does not have a distance matrix API. So in order to build a distance matrix I needed to write an adapter that made N calls instead of Google’s 1 call and then stuff the Here.com responses into a matrix response compatible with Google’s API which we unfortunately were using directly without an internal representation.

    These concepts are still used/useful within functional contexts because they are not technical concepts they are semantic concepts. In functional languages an Adapter may just be a function that your responses are mapped over, in OOP style it might be a class that calls specific network client and mangles the data in some other way. Regardless of the technical code format, it still is the same concept and procedural form, thus it’s still a useful convention.


  • Outside Lisps, I have not seen any environment where you can start up your app, connect the editor to it, and then develop new code in the context of a running application.

    This is absolutely true, however I don’t particularly value this feature because most engineers typically already cannot separate concerns very well in industry so IMO if I had this I would not want people to use it. Very much a “it works ship it” trap.

    . I also find that language design very much impacts conventions and architecture. Clojure’s focus on immutability naturally leads to code that’s largely referentially transparent and where you can reason about parts of the application in isolation without having to consider side effects and global state.

    I’m with you here. I basically force almost every code base I end up working on into functional forms as much as possible.

    When you pass data around, you can always simply look at the input/output data and know what the function is doing. Transforming data also becomes trivial since you just use the same functions regardless of what data structure you’re operating on, this avoids many patterns like wrappers and adapters that you see in OO style

    Yep agreed, almost every role I step into I push the org to enforce this style of work.

    Transforming data also becomes trivial since you just use the same functions regardless of what data structure you’re operating on, this avoids many patterns like wrappers and adapters that you see in OO style.

    This is where you lose me, you still have wrappers and adapters, they’re just not classes. They’re functions. I still use those words regardless if I’m in Haskell or Typescript. Semantic meaning shouldn’t be lost in functional style because it’s part of architecture. Functional programming simply gives your basic building blocks better names and better division of responsibility, e.g. functor, applicative, monad, etc.


  • I found Clojure jobs were generally pretty interesting. One of my jobs was working at a hospital, and we were building software for patient care. So we got to go to the clinics within the hospital observe the workflow, builds tools for the users, and then see how it improved patient care day to day. It was an incredibly rewarding experience.

    Sounds like you got double lucky. Hasn’t really been my experience in the medical space. I find larger institutions like that very unreceptive to how software is made and often the environments are constricting and lead to bad outcomes that “nobody can really figure out why”. It often starts at timesheets and gets worse from there.

    For me, the language matters a lot, and Clojure is the only language that I’ve used for many years that I’m still excited to write code in. Once you’ve worked with a workflow that’s fully interactive, it’s really hard to go back. I really enjoy having instant feedback on what the code is doing and being able to interrogate the app any time I’m not sure what’s happening. This leads to an iterative development process where you always have confidence that the code is doing exactly what you expect because you’re always exercising it, and experimentation become much easier. You can just try something see the result, and then adjust as you go.

    Yeah you can definitely have this kind of stuff in other languages. It’s gonna be similar workflows that are generally BDD & REPL based but you have to have someone who knows what they’re doing do architecture, tooling selection, setting conventions, and helping to put it all together into a maintainable system. Very often that’s skipped at most companies, and I’ve found it to be a lucrative skill in my career.