992 karma · joined April 30, 2015
And it will run Linux! No kid of mine will grow up thinking proprietary software is normal! The source is yours to command!
Take the China example - China as of this September holds $3.055 trillion in foreign currency reserves. This makes the US and China mutually interdependent - if China stopped selling products to the US then it would cause a massive recession in China. If the US couldn't find buyers to finance its spending, it would default on its debt. If the US defaults, the entire international economy would likely go up in flames.
So it's like mutually assured destruction, but instead of stockpiling nukes (though we do that, too), we're actually producing useful goods and services. And it doesn't make war impossible, but it does mean that war won't happen on a whim - it will be an utter last resort, with millions of wage earners and business owners wanting to try to make any other solution work, lest they lose their livelihood.
It's hard to take the article seriously without this sort of analysis.
But before that I prefer to get a book and work my way through all the examples, otherwise I'm just making up what "idiomatic" means.
| | ref | agent | atom | var |
| coordinated | x | | | |
| asynchronous | | x | | |
| retriable | x | | x | |
| thread-local | | | | x |
Turns out I have never needed coordinated, synchronous stuff. I have dabbled with agents, but just for an Advent of Code problem.I do like that 63% (!!) of clojure repos have no mutable references at all - that tracks very strongly with my experience. And that the average number of mutable references is less than 2! Immutability can carry you a long ways, and I love that I can trust that contract. On the other hand, it's nice that I can opt in to mutation really easily if I need it.
"Hazel is a live functional programming environment that is able to typecheck, manipulate, and even run incomplete programs, i.e. programs with holes. There are no meaningless editor states."
It's a programming language and IDE that's fully integrated with the semantics of the language. I saw the demo at Strange Loop in 2019[1], and it was really cool to see the interactive, dialogue-esque development workflow that I love from super dynamic lisps - but working with a strong, statically, dependently typed language. It reminded me of Idris, but even more integrated.
[0]https://hazel.org/ [1]https://www.thestrangeloop.com/2018/hazel-a-live-functional-...
It's incredibly flexible, but here are some things that I do all the time in Magit that I hesitate to do when I'm just using the cli:
- stage individual lines from a hunk
- rebase fearlessly
- resolve merge conflicts
- view the list of all commits that touched a file
- view a file from the above list at a point in time next to the current version
- name my stashes!
All of these are possible from the cli or other git uis, but they are very discoverable using Magit - I didn't even know you could name stashes until I was prompted for a name while stashing. And Magit will happily log all the actual git commands that it runs, so if you're curious how it works you can easily peak behind the curtain.
Matrix-CRDT posted here should abstract most of the nitty gritty stuff, but there are no shortcuts to designing with CRDTs so familiarizing yourself with those is important.
Other than that, just start playing and asking questions! The #matrix:matrix.org room is full of friendly and helpful people and I'm sure you'd be able to get answers.
I get that Element needs to focus on one use case in order to pay the bills, but there's a lot of room for applications that have barely been explored - calendars, contacts, games, social media, heck - you could build a federated gitlab-like collaboration site with truly federated data. You get multi-device sync, e2e encryption, and identity management out of the box.
Thanks for putting this together, I hope there will be a gold rush as people realize how much low-hanging fruit there is!
I like this because it emphasizes the community's commitment backwards compatibility, which I greatly value. I've spent a good deal of time writing Javascript, where library developers seem to have very little respect for their users and constantly break backwards compatibility. In ecosystems like that, upgrading fills me with dread. When I see a library on version 4, I have learned to keep looking - if they weren't thoughtful enough about their API design for the first 3 major releases, I shouldn't expect it to be much better going forwards.
For an application, I'm pretty open to version numbers signifying big features - Firefox and Chrome do this, and it's helpful with marketing. But for a programming language? A programming language is a tool, and when upgrading you need to carefully read the changelog anyways. A programming language is no different from a library (in Clojure it literally is a library), and backwards compatibility is /literally/ the main thing I care about. Is my tool going to intrude on /my/ schedule, and force me to make changes /it/ wants instead of being able to spend my time making changes /I/ care about? I want to know that.
[0]This is apparently an awful example as I've just learned that Java is actually doing the major version only thing. It still sort of works because the only reason they can do that is because they Will Not Break Compatiblity.
You can play with it here: https://vlojure.io/
Now, society has decided that incentivizing growth in energy consumption isn't a winning strategy in the long run. Or, at least, politicians have signed into law various incentive programs to change the business calculus of energy companies, wherein an energy company can get reimbursed for energy efficiency campaigns that it runs and, if total energy consumption is less than a certain rate year over year, the energy company can claim a prize to offset the profit forgone by promoting energy efficiency.
However, it is not so straightforward to account for how much energy _isn't_ being used on account of a specific intervention. Enter here the entire EM&V industry! We would run studies to account for this missing energy, and it was a very thorough business - comparing lists of equipment replaced under industrial efficiency programs, measuring Watt-hours offset, surveying households to figure out how many of them actually installed those complementary LED lightbulbs. Every year we would run through the same process with the same energy companies and then they'd find out how much energy they saved.
At times it felt surreal to be a part of this giant industry competing for a chance to count how much of something wasn't used, but it looks like that industry is only going to grow as carbon caps and offsets become a bigger deal.
I don't think it's a bad thing, just a profoundly weird one. In 50 years I wonder how many people will derive their income from counting things that don't exist :)
I wonder if a patron-driven community that sets its own moderation policy wouldn't have this problem, because when a topic gets too large it will inevitably splinter into smaller communities where the preferred moderation style of each subset can be catered to.
If you've never tried it before, I highly recommend giving it a shot - it's extremely satisfying. I use Clojure, but other lisps also have fantastic repl environments that facilitate this style of development. "Bottom Up vs Top Down Design in Clojure"[0] is the talk that really made it clear to me how to design programs this way.
[0]https://www.youtube.com/watch?v=Tb823aqgX_0&list=PLZdCLR02gr...
It even has nice use-package integration, so if you're already using that you likely won't have to change all your config.
And I can stop feeling like my fingers have all lost a knuckle when I'm writing Typescript :)
Mutability is really a result of the fact that computers are physical machines. So I think if you're going to teach software development, you should really start at the machine architecture and build up (ala NAND to Tetris) or start with an immutable-by-default language and only dip into mutation as an "advanced" concept, only to be used by experts and definitely not by beginners.
I endorse the second way, as I've seen it work very well, whereas I've seen more than one ship crash on the shore of understanding pointers...
Of course, my N is small.
Cerulean is looking great! Does it support e2e threads? I'm about to take a stab at implementing e2e in my application and I'm curious how much overhead it is.
I was really impressed with how it encouraged decoupling, and it has positively affected how I write code and think about dependencies.
I think modern Java has better support for it, but if you've got mutable state spread throughout your application you're going to have a hard time no matter what.
And it turns out that most services that I find myself working on these days are distributed systems, so having a healthy respect for all the ways things can break is a useful place to be.