275 karma · joined July 11, 2013
I'm not going to defend capital's ability to ruin things, but this is framing is not helpful. Enshittification as it was described by Cory Doctorow, who invented the term, requires two additional things:
1. A platform that tries to attract both producers and consumers. Amazon is the canonical example. The platform does what it can to attract enough consumers that producers have to use the platform to reach them. Then it squeezes out the value to the producers (e.g., hiking acquisition fees, etc.; competing with them and underselling them with cheaper alternatives). The final step is to destroy the value to the consumer, by degrading quality and increasing price. By this time, neither producers nor consumers have many levers to fight back.
2. Non-physical pricing levers. Enshittification requires the ability to observe consumer behavior and jigger pricing at great speed. We see this in Amazon again; ridesharing apps introduced surge pricing; ads are priced according to what platforms know about you. In a physical store, the logistical cost of changing the price of goods is nontrivial, so we don't see the same sort of gaming there.
Enshittification is a novel and illuminating concept, so we need to be careful not to let it turn into some vague "things got worse" meaning.
I've always felt that the biggest problem with the Javascript ecosystem is that it's entirely too preoccupied with syntax. Remember CoffeeScript!? Some of the most influential forces in the community can waste entire years bikeshedding some syntactic thing that is mostly a matter of personal aesthetics. And this trickles down to the grunts trying to ship a product.
It's a fundamental drawback to Javascripts other strengths. And that's the reason it's so easy to find Express apps that are hot garbage. It's one of the most enduring myths that If you know Javascript, you can write a Node app.
It only works because software has been such an economically productive force, that having thousands of professionals spending weeks deciding whether semicolons are good or bad, or fighting their webpack configs, or migrating for loops to array methods... whatever... it still makes money at the end of the day.
I lean toward the pro-functional style, but I also put a few strong constraints on when to use reduce. Namely, I would almost never use it in cases where I either want to (a) mutate something other than the accumulator or (b) include more than two branches of control flow in the reducer function.
This kind of goes for all the functional array methods. Many people are tempted to use them simply as alternate syntax for iterating through the array (i.e., a simple loop), where the loop body could contain several statements -- i.e., data mutation side effects, taking different execution paths based on certain conditions, etc. The functional style is way less clear in this sort of code.
The benefit of the functional style in the context of javascript array methods is when you can see at a glance what the shape of the resulting value is with respect to that of the source array. This is usually best done when the body of the reducer/mapper/filterer is a single expression.
Why is he so popular? And how did he get so rich on Wall Street if he just thinks randomness blows all the statistical experts out of the water? I know I'm missing something.
I have had to push for leveraging postgres for data validation (including typing columns with enums where applicable), and sometimes it's hard to convince people, but all you have to do is (a) poke around your existing data and find cases where you have junk because of some out-of-band process that created data without using your main app's validation, and (b) do a couple out-of-band things like an ETL or two and see how it saves you from creating junk.
I don't know where I picked this adage up, but it's also something I constantly think about:
Your data will outlive your application code.
IME, if you value the data's integrity, it's not really a question whether you should be pushing validations down to the db layer.
I can't imagine you'll find a sane place to work where senior people are only capable of learning something after consuming a tutorial or a manual. The nature of the work is to drill down one layer below what you're working on. Do you need to know how to smelt steel in order to be a good car mechanic? No, of course not, but it sure helps to have taken an engine apart. And if you're trying to build the next, better engine, it's really great to see the internals (and the commented motivations!) of previous implementations.
Of course you won't understand everything on first read. But you will learn really good things if you know how to look at something confusing and identify what it is you don't understand; then you can go find didactic materials to fill in the gaps.
This is an amazing way to learn. You get to see how some of the most used, or cutting-edge tools are implemented (for free!). You learn about the tools themselves and thus gain expertise in them. And, you gain the meta-skill of working in unfamiliar territory, which I think is a fundamental key to being considered "advanced".
We started using Asana so that we could stop having nervous breakdowns every week. It worked. Now we use it for stuff like coordinating anything that doesn't fit on a notecard. Shopping lists generally are just on a kitchen whiteboard and you take a pic before you leave.
As for "self-congratulatory", I was responding to the old chestnut that mainstream media is too far to the left. Next time we talk about GMOs and anti-vaxxers, I'll have a chance to chastise the people who are more likely to be on my side of the political spectrum.
The Right Wing (in the US, our Republican Party) is less identifiable by its right-wing policies as it is by its right-wing epistemology: they reject all scientific evidence for climate change, biological and geological history, medicine, etc. For the religious, this manifests itself in the old epistemology that says the Bible is the sole source of all Truth. For the non-religious, this tends to manifest itself as total nihilism, which is expressed in the more heartless strains of Libertarian Objectivism; for these people, might equals right and society is a zero-sum game where the only truth is winning and losing.
And this epistemological divide is the one that is tearing us apart. When you say there's no serious right-leaning counter-weight to (the NYT et al.), what you mean is that there is no serious news outlet that doesn't hold the Enlightenment values. And when you put it in this light, it's an obvious statement, isn't it? Politically speaking, the WSJ and the Economist can very much be considered right of center (leaving aside that the median center has moved right over the last 40 years), but they are still rooted in Enlightenment science and rationalism.
Point is, although the political right wing is currently the main base of the epistemological right wing, it doesn't necessarily have to be that way. And the problem with saying we need more right-wing voices in mainstream media is that there are so few of them who meet the basic epistemological requirements; when they do, they are often rejected by the broader right wing for being too far left!
You should have asked your friends why a black person can't be racist, because to most white people it's an absurd proposition. So allow me to explain a bit here.
Racism, unlike what we mostly think, is not a state of mind or an emotion. Racism is a sociological system that transcends the intentions of any one individual. In case US history is not forefront in anyone's mind: 150 years ago, a black person had the same legal status as a pig; 100 years ago, it was illegal for a white person to marry a black person; 60 years ago, it was illegal for a black person to drink at a water fountain.
Today, the likelihood that you'll be shot by a cop if you're black is astronomically higher than if you're white. If you have a black sounding name, you're less likely to have a company respond to your job application.
These things are institutional. When we say a black person can't be racist -- we don't mean they can't be prejudiced. They can, just like all people. But the privileges and paved roads that a white person enjoys simply aren't there by default for a POC, so they can't benefit from institutional racism.
TL;DR - false equivalency. "Black X Thing" is in the context of a historically disenfranchised people overcoming an entire country hellbent on keeping them disenfranchised. "White X Thing" is ridiculous because it's redundant: "Thing" is already White by default.
Assuming that you essentially want to keep your hooks coupled with your source code (or, at least, it's ok to do so), I've found that Make works pretty well here.
In the root of the project directory, you have a subdirectory containing all the hooks you need (or use a git submodule), and then you create a Make target to copy those hooks (and make them executable) to your .git/hooks directory. Make is nice because it won't clobber existing ones (unless they are older, in which case you probably want them overwritten).
Then, whenever someone first clones the repo (or whenever you make a change to the hooks), they just need to run make on that target again.
Obviously, not an ideal choice for everyone, but it's pretty simple and works well for me.