232 stories

decodering: Dos and don'ts on designing for...



Dos and don'ts on designing for accessibility

Karwai Pun, GOV.UK:

The dos and don’ts of designing for accessibility are general guidelines, best design practices for making services accessible in government. Currently, there are six different posters in the series that cater to users from these areas: low vision, D/deaf and hard of hearing, dyslexia, motor disabilities, users on the autistic spectrum and users of screen readers.

[…] Another aim of the posters is that they’re meant to be general guidance as opposed to being overly prescriptive. Using bright contrast was advised for some (such as those with low vision) although some users on the autistic spectrum would prefer differently. Where advice seems contradictory, it’s always worth testing your designs with users to find the right balance, making compromises that best suit the users’ needs.


Read the whole story
13 days ago
12 days ago
All of these tips -- designing for humans. Also, why final versions of content should be produced by design professionals, not by content experts.
14 days ago
Overland Park, KS
14 days ago
Seattle, WA
Share this story

agoodcartoon: nidoranduran: yournewfriendshouse: zinglebert-be...
















Guys who complain about the friendzone often don’t care about their female friends’ personal boundaries, forcing their female friends build more walls up. A good cartoon.

- submitted by Gene

why is he tearing down a wall with an axe

i hate it when your put in the friendzone and made to tear down a wall

Mr. Gorbachev…tear down this friendzone

how you gonna draw some shit that makes you look like Jack Nicholson in The Shining and still feel like you’re the victim


“I’m going to wall you up now, Fortunato.”

“Ha ha, and then what? ;) ”

“For the love of God, Montresor!”
-Cask of Amontifriendzone, Edgar Allan Poe

Incessantly, I heard a smacking,
as of some entitled dipshit whacking,
whacking on my chamber door.

Resignedly, I placed another layer,
voicing a quiet, repeated prayer,
“This dude thinks he’s a player,
but I am not a point to score,
he should fuck off and bother me no more.”

Quoth the friendzoned, “Fucking whore.”

- The Craven, by Edward Allen Bro

edgar allen bro

Oh my god

holy shit

“Nice guy!” said I, “Total dildo–nice guy still if nerd or dudebro,
Whether reddit sent, or whether romcoms tossed thee here ashore,
Barely known yet still entitled, holding now your Tom Waits vinyl,
Begging me for something primal, tell me truly, I implore
Is this–is this shit for fucking real? Tell me, tell me, I implore!
Quoth the friendzoned, “Fucking whore.”

“Nice guy!” said I, “Total dildo–nice guy still if nerd or dudebro,
By the mores that you abuse thus, by those films we both adore,
Tell this soul with sorrow laden if, by stalking me through Facebook,
You have gained a twisted outlook of whom those tropes are for,
Paint a rare and radiant dream girl whilst you remain a bore,
Quoth the friendzoned, “Fucking whore.”

“Be that slur our sign of parting, creep or douche!” I shrieked, upstarting,
“Get thee back to lonely anguish and your friend’s used comic store!
Leave no white rose as a token of the lust you claim heartbroken,
Leave my scathing words to soak in! Quit the name calling of ‘whore’,
When you lust for every girl, but when they say nay they are whores!
Quoth the friendzoned, "Fucking whore.”

And the friendzoned, never scoring, still imploring, still imploring,
On some fetid old subreddit for a girl who will adore
The nicer guys and not the “douchebags”, unaware that it’s a red flag
To be his soulmate o'er him learning they both like the movie Thor
To fuck him for being nerdy even though he is a bore,
Then she says no–fucking whore.

that internal rhyme scheme is a fucking master class

Read the whole story
20 days ago
Seattle, WA
21 days ago
Share this story

The Stages of Grief Explained With Dim Sum

1 Share
Grief is imposing, like a looming sky of crackling clouds, a sentence of oppression without form or shape, an exile in catastrophe in chaos. We are afraid to yield to it, to speak truth in its wake, lest we be consumed by torrents of absurdity, detained indefinitely by esoteric laws of feeling. But grief is […]
Read the whole story
30 days ago
Seattle, WA
Share this story

Humans Are Weird

8 Comments and 21 Shares











So there has been a bit of “what if humans were the weird ones?” going around tumblr at the moment and Earth Day got me thinking. Earth is a wonky place, the axis tilts, the orbit wobbles, and the ground spews molten rock for goodness sakes. What if what makes humans weird is just our capacity to survive? What if all the other life bearing planets are these mild, Mediterranean climates with no seasons, no tectonic plates, and no intense weather? 

What if several species (including humans) land on a world and the humans are all “SCORE! Earth like world! Let’s get exploring before we get out competed!” And the planet starts offing the other aliens right and left, electric storms, hypothermia, tornadoes and the humans are just … there… counting seconds between flashes, having snowball fights, and just surviving. 

To paraphrase one of my favorite bits of a ‘humans are awesome’ fiction megapost: “you don’t know you’re from a Death World until you leave it.” For a ton of reasons, I really like the idea of Earth being Space Australia.

Earth being Space Australia Words cannot express how much I love these posts

Alien: “I’m sorry, what did you just say your comfortable temperature range is?”

Human: “Honestly we can tolerate anywhere from -40 to 50 Celcius, but we prefer the 0 to 30 range.”

Alien: “……. I’m sorry, did you just list temperatures below freezing?”

Human: “Yeah, but most of us prefer to throw on scarves or jackets at those temperatures it can be a bit nippy.” 

Other human: “Nah mate, I knew this guy in college who refused to wear anything past his knees and elbows until it was -20 at least.”

Human: “Heh. Yeah everybody knows someone like that.”

Alien: “……. And did you also say 50 Celcius? As in, half way to boiling?”

Human: “Eugh. Yes. It sucks, we sweat everywhere, and god help you if you touch a seatbelt buckle, but yes.” 

Alien: “……. We’ve got like 50 uninhabitable planets we think you might enjoy.” 

“You’re telling me that you have… settlements. On islands with active volcanism?”

“Well, yeah. I’m not about to tell Iceland and Hawaii how to live their lives. Actually, it’s kind of a tourist attraction.”

“What, the molten rock?”

“Well, yeah! It’s not every day you see a mountain spew out liquid rocks! The best one is Yellowstone, though. All these hot springs and geysers from the supervolcano–”


“Shit, man, we swim in the groundwater near them.”

Sounds like the “Damned” trilogy by Alan Dean Foster.

“And you say the poles of your world would get as low as negative one hundred with wind chill?” 

“Yup, with blizzards you cant see through every other day just about.”

“Amazing! when did you manage to send drones that could survive such temperatures?”

“… well, actually…”

“… what?”

“…we kinda……. sent……….. people…..”




“we sent-”

“no yeah I heard you I just- what? You sent… HUMANS… to a place one hundred degrees below freezing?”


“and they didn’t… die?”

“Well the first few did”


My new favorite Humans are Weird quote


aka The History of Russia

aka Arctic Exploration

aka The History of Alaska

‘But surely you have records of volcanic activity doing tremendous damage to human settlements.’

‘Yep.  Pompeii is legendary.  Entire cities went. Towns buried under lava, peoples’ brains boiled in the first rush of heat, loads more killed by falling pumice.’

‘ah, good, they learned their lesson and didn’t build there again.’


‘Are you seriously telling me this volcano is legendary for killing several urban conurbations and you built on top of it AGAIN?’

‘In our defence it hasn’t actually done it since.’ 

‘What about earthquake-prone areas? Tell me you’re at least vaguely sensible about those.’

‘Oh yeah.  After the first major earthquake that flattens a city, we build them better.’

And then the aliens learn what it means to “facepalm” despite not having palms per se….

Read the whole story
33 days ago
33 days ago
Seattle, WA
33 days ago
Overland Park, KS
Share this story
7 public comments
20 days ago
🤦‍♂️ <- There is on iOs
20 days ago
no palm *facepalm* emoji
32 days ago
Meanwhile the tardigrades of the universe are laughing at us for being so weak...
New York, NY
32 days ago
On the other hand, there's the fascism, which I assume advanced spacefaring civilizations wouldn't tolerate.
33 days ago
I love all the Humans are Weird posts. What if Earth is Space Australia?
Louisville, Kentucky
33 days ago
Mediocrity principle, people
The Haight in San Francisco
33 days ago

wakeupontheprongssideofthebed: emo420: enderkevin13: I want someone to explain to me this… How...

1 Share




I want someone to explain to me this…

How are there more than just two genders?
How is it that gender is different from sex?
Why would you consider gender to be a social construct?
How is gender a spectrum?
Why do you feel the need to disassociate gender and sex when biologist have already proved that gender and sex are the same thing?

Personally speaking, I don’t understand why anyone would want to try and push gender identity shit down other people’s throats in the most radical way possible, but it’s fucking annoying as hell. To think that you know better than what biologist have studied for years makes me question your intelligence.

Here’s some food for thought people:

XX chromosomes = Female
XY chromosomes = Male

Penis = Male
Vagina = Female

Testosterone = Male
Estrogen + Progesterone = Female

Gender = Sex

Until you can come up with a reason as to why gender isn’t biological and why I’m a piece of shit for not believing your bullshit, then please stop trying to change around shit just because you hate to hear the opposing voice and accept the facts as they are.

This is an open response to those who believe in the multiple genders/gender spectrum bullshit.

oh boy, you’re in for a hell of a ride. and don’t worry, there will a TL;DR at the bottom of this post just in case you’re too lazy to read the evidence (that you specifically asked for, just saying) or are simply unwilling to have your ignorant worldview dismantled by actual concrete facts.

but first, let’s look into the social construction of the gender binary and gender itself. 

the narrow-minded idea that there are only two genders has been continuously debunked by biologists, psychologists, anthropologists, and doctors alike, first of all. second, gender and sex aren’t necessarily the same thing, but they are both the same in the sense that they are both social constructs made to describe natural phenomenon, not actually based in any scientific reality. much like the concept of species; it’s a model, and no model is an actuality.

gender is only your sense of, and internal mental relationship to masculinity, femininity, and androgyny, which can be expressed through words, behavior, or clothes. in other words, it is simply an intimate and personal sense of self in relation to gender, gender roles, and one’s physical body. it does not actually have anything to do with biology—even less so than sex. suggesting your gender relies solely on your genitals is not only transphobic, but is also very harmful for people who are intersex. ultimately, your gender is in your head and it is mutually exclusive from your physical body. there is truly no scientific, biological, or medical basis for any sort of binary system of gender, and in fact the gender binary completely contradicts the laws of natural human variation.

The Yogyakarta Principles on The Application of International Human Rights Law in Relation to Sexual Orientation and Gender Identity further elaborates on the definition of gender to be “each person’s deeply felt internal and individual experience of gender, which may or may not correspond with the sex assigned at birth, including the personal sense of the body (which may involve, if freely chosen, modification of bodily appearance or function by medical, surgical or other means) and other expressions of gender, including dress, speech and mannerisms.” the principle 3 of this document reads as follows: “A person of diverse sexual orientation and gender identities shall enjoy legal capacity in all aspects of life. Each person’s self-defined sexual orientation and gender identity is integral to their personality and is one of the most basic aspects of self-determination, dignity and freedom”.

citations from other works of literature:

Judith Butler, Gender Trouble (1990)

- “If gender is the cultural meanings that the sexed body assumes, then a gender cannot be said to follow from a sex in any one way. Taken to its logical limit, the sex/gender distinction suggests a radical discontinuity between sexed bodies and culturally constructed genders. Assuming for the moment the stability of binary sex, it does not follow that the construction of ‘men’ will accrue exclusively to the bodies of males or that ‘women’ will interpret only female bodies. Further, even if the sexes appear to be unproblematically binary in their morphology and constitution (which will become a question), there is no reason to assume that genders ought also to remain as two. The presumption of a binary gender system implicitly retains the belief in a mimetic relation of gender to sex whereby gender mirrors sex or is otherwise restricted by it. When the constructed status of gender is theorized as radically independent of sex, gender itself becomes a free-floating artifice, with the consequence that man and masculine might just as easily signify a female body as a male one, and woman and feminine a male body as easily as a female one.” (p.g. 10) 

Justin Clark, “Understanding Gender”  (2015) 

- “Western culture has come to view gender as a binary concept, with two rigidly fixed options: male or female, both grounded in a person’s physical anatomy. When a child is born, a quick glance between the legs determines the gender label that the child will carry for life. But even if gender is to be restricted to basic biology, a binary concept still fails to capture the rich variation that exists. Rather than just two distinct boxes, biological gender occurs across a continuum of possibilities. This spectrum of anatomical variations by itself should be enough to disregard the simplistic notions of a binary gender system. But beyond anatomy, there are multiple domains defining gender. In turn, these domains can be independently characterized across a range of possibilities. Instead of the static, binary model produced through a solely physical understanding of gender, a far richer tapestry of biology, gender expression, and gender identity intersect in a multidimensional array of possibilities. Quite simply, the gender spectrum represents a more nuanced, and ultimately truly authentic model of human gender. (p.g. 1) 

- “Like other social constructs, gender is closely monitored and reinforced by society. Practically everything in society is assigned a gender—toys, colors, clothes and behaviors are just some of the more obvious examples. Through a combination of social conditioning and personal preference, by age three most children prefer activities and exhibit behaviors typically associated with their sex. Accepted social gender roles and expectations are so entrenched in our culture that most people cannot imagine any other way. As a result, individuals fitting neatly into these expectations rarely if ever question what gender really means. They have never had to, because the system has worked for them.” (p.g. 1)

Gerald N. Callahan, Between XX and XY: Intersexuality and the Myth of Two Sexes (2009)

- “We understand that gender—the ways that society molds us into proper girls or boys, men or women—is complicated. Gender depends on lots of things—upbringing, culture,the stories fed to us by television and movies, hormones, and power struggles.” (p.g. x-xi)

- “…there is a naivete about the way we ignore the fact that some people don’t fit neatly into the either-or of gender. I believe that gender is rather a continuum than an either-or proposition.” (p.g. 108)

there are no limitations on who you are, how you feel, or what identity you construct for yourself, therefore people can and do construct more gender than the two traditional ones, and all of them are valid. plus, the simple fact that some people don’t identify as one of the two binary genders is proof that there are other genders. if someone identifies are nonbinary, then nonbinary people exist. it’s that simple. even if that’s just one person, it exists in society, ergo it is.

now this is a fun one; let’s move on to the social construction of “biological” sex. 

even if gender was the exact same thing as sex, neither would be a binary or a scientific absolute. while modern science measures “biological” sex by these 5 specific measures,

1. chromosomes (male:  XY, female: XX)
2. genitalia (male: penis, female: vulva and vagina)
3. gonads (male: testes, female: ovaries)
4. hormones (male: high testosterone, low estrogen, low progesterone; female: high estrogen, high progesterone, low testosterone)
5. secondary sex characteristics (male: large amounts of dark, thick, coarse body hair, noticeable facial hair, low waist to hip ratio, no noticeable breast development; female: fine, light colored body hair, no noticeable facial hair, high waist to hip ratio, noticeable breast development)

very few people actually match up with all five categories. estimates by the Intersex Society of North America notes the frequency and prevalence of intersex conditions, and puts the total rate of human bodies that “differ from standard male or female” at one in 100, while biologist Anne Fausto-Sterling estimates this number to be around 1.7%. both of these estimates are somewhat outdated, so the actual number of intersex people in the world may be much higher.

humans naturally fall along a wide spectrum of variation; it’s a normal and expected biological occurrence. in fact, the more we study sex, the more we discover that reality does not fit the narrative. our estimates of how many people have chromosomes that don’t fit in the XX=female/XY=male binary continue to grow as we actually test people’s chromosomes more often (esp. since most people don’t actually know what their chromosomes are).

there are lots of people out there with XY chromosomes, testes, a vulva, a vagina, female secondary sex characteristics, and female hormone patterns; there are people with XX chromosomes, testes, a penis, male secondary characteristics and male hormone patterns; and there people with both male and female secondary sex characteristics or hormone patterns at the same time, regardless of their genes, gonads, or genitalia. these people are technically intersex assuming that the two sex system is absolutely true. however, in order for the binary to even be considered real, every single person on earth must completely match up on all 5 markers of sex, all the time. that’s not what happens in real life. in real life, there are literally tens of millions of people whose very existence defies the socially constructed concept of a two sex system.

there is no immediately obvious way to settle what sex amounts to purely biologically or scientifically. deciding what sex is involves evaluative judgments that are influenced by social factors. in actuality, the only thing in your body that has a “biological sex” in any real sense is your gametes, which 1) some people don’t even produce, 2) which your body can easily stop producing, and 3) which are a very minuscule part of the rest of your body. the rest of your body, including your genitals, has no “biological sex” at all.

moreover, as far as medical issues are concerned, treating common correlations as discrete categories is very harmful to people who don’t fit in those categories. modern medicine acknowledges that chromosomal sex, gonadal sex, hormonal sex, morphological sex, and behavioral sex (extensive overlap with but not the same as gender and/or gender role) are different and need to be considered differently under different circumstances. no one thing is biological sex. there is no reason for a male/female binary of it; not only is it intersexist and transphobic, but it’s just bad science.

citations from other works of literature:

Anne Fausto-Sterling, Sexing the Body: Gender Politics and the Construction of Sexuality (2000)

- “We stand now at a fork in the road. To the right we can walk toward reaffirmation of the naturalness of the number 2 and continue to develop new medical technology, including gene ‘therapy’ and new prenatal interventions to ensure the birth of only two sexes. To the left, we can hike up the hill of natural and cultural variability. Traditionally, in European and American culture we have defined two genders, each with a range of permissible behaviors; but things have begun to change. There are househusbands and women fighter pilots. There are feminine lesbians and gay men both buff and butch. [Transgender people] render the sex/gender divide virtually unintelligible.” (p.g. 101)

-  “Because of their loyalty to a two-gender system, some scientists resisted the implications of new experiments that produced increasingly contradictory evidence about the uniqueness of male and female hormones. Frank, for example, puzzling at his ability to isolate female hormone from ‘the bodies of males whose masculine characteristics and ability to impregnate females is unquestioned,’ finally decided that the answer lay in contrary hormones found in the bile.” (p.g. 191)

- “…not everyone responded to the new results by trying to fit them into the dominant gender system. Parkes, for example, acknowledged the finding of androgen and estrogen production by the adrenal glands as ‘a final blow to any clear-cut idea of sexuality.’ Others wondered about the very concept of sex. In a review of the 1932 edition of Sex and Internal Secretions, the British endocrinologist F. A. E. Crew went even further, asking ‘Is sex imaginary?… It is the case,’ he wrote, ‘that the philosophical basis of modern sex research has always been extraordinarily poor, and it can be said that the American workers have done more than the rest of us in destroying the faith in the existence of the very thing that we attempt to analyze.’” (p.g. 191-192) 

Penelope Eckert  and Sally McConnell-Ginet, Language and Gender (Second Edition) (2013) 

- “People tend to think of gender as the result of nurture—as social and hence fluid—while sex is the result of nature, simply given by biology. However, nature and nurture intertwine, and there is no obvious point at which sex leaves off and gender begins. But the sharp demarcation fails because there is no single objective biological criterion for male or female sex. Sex is based in a combination of anatomical, endocrinal and chromosomal features, and the selection among these criteria for sex assignment is based very much on cultural beliefs about what actually makes someone male or female. Thus the very definition of the biological categories male and female, and people’s understanding of themselves and others as male or female, is ultimately social. Anne Fausto-Sterling (2000) sums up the situation as follows:  

labeling someone a man or a woman is a social decision. We may use scientific knowledge to help us make the decision, but only our beliefs about gender – not science – can define our sex. Furthermore, our beliefs about gender affect what kinds of knowledge scientists produce about sex in the first place. (p. 3)  

Biology offers up dichotomous male and female prototypes, but it also offers us many individuals who do not fit those prototypes in a variety of ways. Blackless et al. (2000) estimate that 1 in 100 babies are born with bodies that differ in some way from standard male or female. These bodies may have such conditions as unusual chromosomal makeup (e.g., 1 in 1,000 male babies are born with two X chromosomes as well as a Y, hormonal differences such as insensitivity to androgens (1 in 13,000 births), or a range of configurations and combinations of genitals and reproductive organs. The attribution of intersex does not end at birth–for example, 1 in 66 girls experience growth of the clitoris in childhood or adolescence (known as late onset adrenal hyperplasia).” (p.g. 2) 

 Sarah Richardson, “Sexing the X: How the X Became the ‘Female Chromosome’” (2012)

- “…the human X chromosome carries a large collection of male sperm genes.” (p.g. 909)

- “Currently, there is a broad popular, scientific, and medical conception of the X chromosome as the mediator of the differences between males and females, as the carrier of female-specific traits, or otherwise as a substrate of femaleness… associations between the X and femaleness are the accumulated product of contingent historical and material processes and events, and they are inflected by beliefs rooted in gender ideology.” (p.g. 927) 

Gerald N. Callahan, Between XX and XY: Intersexuality and the Myth of Two Sexes (2009)

- “In truth, humans come in an amazing number of forms, because human development, including human sexual development, is not an either/or proposition. Instead, between “either” and “or” there is an entire spectrum of possibilities. Some people come into this world with a vagina and testes. Others begin their lives as girls but at puberty become boys. Though we’ve been told that Y chromosomes make boys, there are women in this world with Y chromosomes, and there are men without Y chromosomes. Beyond that, there are people who have only a single unpaired X chromosome. There are also people who are XXY, XXXY, or XXXXY…There are babies born with XYY, XXX, or any of a dozen or more other known variations involving X or Y chromosomes. We humans are a diverse lot.” (p.g. xi-xii)

- “Nondisjunction can happen with any chromosome, including the sex chromosomes X and Y. A single sperm or egg may end up with two, three, or more X chromosomes, and a single sperm may hold more than one Y chromosome. In truth, sperm and eggs come in variety packs. If that alone isn’t enough to derail the simple XX/XY, female/male idea, a mystery known as anaphase lag can also cause developing sperm or ova to lose an X or a Y chromosome along the way. And even after fertilization, sex chromosomes can be lost or gained. And even among men with the normal 46,XY karyotype, the size of the Y chromosome can vary. That means that my Y chromosome might be three times the size of Arnold Schwarzenegger’s Y chromosome. Here certainly, quantity matters; perhaps size does as well. The end product is a panoply of possible sexes by any definition, an array of human beings as grand and as varietal as the fragrances of flowers: 45,X; 47,XXX; 48,XXXX; 49,XXXXX; 47,XYY; 47,XXY; 48,XXXY; 49,XXXXY; and 49,XXXYY.” (p.g. 62)

- “Intersex people are not a few freakish, unfortunate outliers. They are instead the most complete demonstration of our humanity… We, as a society, are very hard on people who don’t fit out preconceptions, especially our preconceptions about sex. What intersex people have shown us is the truth about all of us. There are infinite chemical and cellular pathways to becoming human. […] Sex isn’t a switch we can easily flip between two poles. Between those two imaginary poles lies an infinite number of possibilities.” (p.g. 163)

 Anonymous Author, “The Problematic Ideology of Natural Sex” (2016)

- “Around the world, over the past four or five hundred years, people have been cajoled, threatened, beaten, imprisoned, locked in mental hospitals, put in the stocks, publicly humiliated, mutilated, and burnt at the stake for violating one or more of the precepts of ‘[Biological] Sex.’ That’s the sure sign of enforced ideology, not a true natural law.” 

 Courtney Adison, “Human Sex is Not Simply Male or Female. So What?” (2016) 

- “While these gendered binaries play out in social life in reasonably clear ways, they also seep into places conventionally seen as immune to bias. For example, they permeate sex science. In her paper ‘The Egg and the Sperm’ (1991), the anthropologist Emily Martin reported on the ‘scientific fairy tale’ of reproductive biology. Searching textbooks and journal articles, she found countless descriptions of sperm as active, independent, strong and powerful, produced by the male body in troves; eggs, in contrast, were framed as large and receptive, their actions reported in the passive voice, and their fate left to the sperm they might or might not encounter. Representations in this vein persisted even after the discovery that sperm produce very little forward thrust, and in fact attach to eggs through a mutual process of molecular binding. Martin’s point? That scientific knowledge is produced in culturally patterned ways and, for Euro-American scientists, gendered assumptions make up a large part of this patterning.”

- “In Gender Trouble (1990), the feminist theorist Judith Butler argues that the insistence on sex as a natural category is itself evidence of its very unnaturalness. While the notion of gender as constructed (through interaction, socialisation and so on) was gaining some acceptance at this time, Butler’s point was that sex as well as gender was being culturally produced all along. It comes as no surprise to those familiar with Butler, Martin and the likes, that recent scientific findings suggest that sex is in fact non-binary. Attempts to cling to the binary view of sex now look like stubborn resistance to a changing paradigm. In her survey paper ‘Sex Redefined’ (2015) in Nature, Claire Ainsworth identified numerous cases supporting the biological claim that sex is far from binary, and is best seen as a spectrum. The most remarkable example was that of a 70-year-old father of four who went into the operating room for routine surgery only for his surgeon to discover that he had a womb.”

- “Looking to other times and to other cultures, we are reminded that sex is to some degree produced through the assumptions we make about each other and our bodies. Modern science is moving towards consensus on sex as a spectrum rather than a simple male/female binary, and it is time to start casting around for new ways of thinking about this fundamental aspect of what we are. Historical and anthropological studies provide a rich resource for re-imagining sex, reminding us that the sex spectrum itself is rooted in Euro-Western views of the person and body, and inviting critical engagement with our most basic biological assumptions.”

 Asia Friedman, Blind to Sameness: Sexpectations and the Social Construction of Male and Female Bodies (2013)

- “Thomas Laqueur argues that in the past, specifically prior to the 19th Century, male and female bodies were seen very differently than they are today. They were perceived as more similar than different, and instead of two sexes, there were just two variations of one sex. Laqueur further demonstrates that the shift in perception to seeing the sexes as two categorically different things was not the result of gaining more scientific knowledge, since many of the relevant discoveries were actually made after the fact… So the question for Laqueur is, if it was not due to advances in specific scientific knowledge of sex differences, what was responsible for that shift from seeing one to seeing two sexes? And his answer is essentially cultural change. He argues that sex or the body is the epiphenomenon, while gender, what we would normally take to be the cultural category, is what is primary. Marian Lowe makes a similar point when she argues that ‘if race, sex, and class were not politically and economically significant categories it is likely that no one would care very much about biological differences between members of these groups. To pay attention to the study of sex differences would be rather peculiar in a society where their political importance was small.’” (p.g. 45-46) 

- “Further, regarding chromosomes, keep in mind that XX and XY are 50% the same, and the egg and the sperm actually have the same sex chromosomes every time both contribute an “X” to make a female. Sarah Richardson offers a much more scientifically precise version of the same fundamental argument in her critique of recent accounts claiming significant genetic variation between males and females. 

Sex differences in the genome are very, very small: of 20,000 to 30,000 genes, marked sex differences are evident in perhaps half a dozen genes on the X and Y chromosome, and, it is hypothesized, a smattering of differently expressed genes across the autosomes… In DNA sequence and structure, sex differences are localized to the X and Y chromosomes. Males and females share 99.9 percent sequence identity on the 22 autosome pairs and the X, and the handful of genes on the Y are highly specific to male testes development. Thinking of males and females as having different genomes exaggerates the amount of difference between them, giving the impression that there are systematic and even law-like differences distributed across the genomes of males and females, and playing into a traditional gender-ideological view of sex differences. (Richardson, Forthcoming: 8-9) 

The essential point is this: Males and females are much more genetically similar than different.” (p.g. 206)

basically, “biological sex” is just as biased, unscientific, and subjective as the concept of gender is, and to base sex or gender on chromosomes or genitals or some other arbitrary feature is to ignore and marginalize the truth. there are millions of people who have different genitalia or lack them all together, individuals who are infertile, people with differing karyotypes (i.e. XXY, XXX, XYY, X, etc) or chimerism (a body where some cells are of one karyotype and others are of another), and there are people with all kinds of secondary sex features or genetic/epigenetic/biological conditions. these are all normal, natural variations of the human body that aren’t inherently connected to each other. to say sex or gender is defined by any of these features is erasive, intersexist, transphobic, and entirely contrary to what actual scientists, biologists, and geneticists have been saying for decades.

not to mention, the idea of a gender binary is a very, very recent concept solely rooted in colonialism and racism, not science.

in fact, the idea of third and nonbinary genders is as old as human civilization. (the list below is a very VERY brief history of nonbinarism):

§ 2000 BCE: in mesopotamian mythology, among the earliest written records, there are references to types of people who are neither men nor women. in a sumerian creation myth found on a stone tablet from the 2000 bce, the goddess ninmah fashions a being “with no male organ and no female organ”, for whom enki finds a position in society: “to stand before the king".

§ 1800 BCE: inscribed pottery shards from the middle kingdom of egypt, found near ancient thebes, list three human genders: tai (male), sḫt (“sekhet”) and hmt (female).

§ 385-380 BCE: aristophanes, a comic playwright, tells a story of creation in which “original human nature” includes a third sex. this sex “was a distinct kind, with a bodily shape and a name of its own, constituted by the union of the male and the female: but now only the word ‘androgynous’ is preserved.”

§ 77 BCE: genucius, a roman slave is denied inheritance on the grounds, according to art historian lynn roller, of being “neither a man nor a woman.” he is “not even allowed to plead his own case, lest the court be polluted by his obscene presence and corrupt voice.”

§ 1871: british administrators pass the criminal tribes act in india, effectively outlawing the country’s hijras—a community that includes intersex people, trans people, and even cross-dressers. celebrated in sacred indian texts, hijras had long been part of south asian cultures, but colonial authorities viewed them as violating the social order.

§ 1970: mexians in oaxaca state establish vela de las intrepidas (vigil of the intrepids), a festival celebrating ambiguous gender identities. the zapotec culture embraces a third-gender population called muxes. muxes trace back to pre-columbian times, when there were “cross-dressing aztec priests and mayan gods who were male and female at the same time”.

§ 2014: india’s supreme court recognizes the right of people, including hijras, to identify as third-gender. the court states, “it is the right of every human being to choose their gender.”

the idea of third and nonbinary genders is as old as human civilization, because gender is socially constructed and therefore subjective. thus, people’s ideas about gender have changed over time and between cultures, and continue to change. 

this binary gender system of ours is comparatively very new, and has been forced upon the rest of the world by white europeans in destructive and violent invasion, genocide, and complete appropriation and destruction of the original cultures of each land. really, it is the binary system that is unnatural. multiple genders have always existed in this world. and despite the best attempt of european colonialists, they continue to exist today, indicating that it is part of human nature to not fit in a neat binary and instead have multiple genders.  even within the united states, multiple native american tribes have a system that includes up to six distinct gender categories.

multiple countries and cultures around the world have either three or more genders officially recognized, or no genders recognized at all. plus, there are also many completely gender-neutral languages, where gendered pronouns and/or gendered categories don’t exist whatsoever.

citations from other works of literature:

Maria Lugones, “Heterosexualism and the Colonial /Modern Gender System” (2007)

- “…gender itself is a colonial introduction, a violent introduction consistently and contemporarily used to destroy peopks, cosmologies, and communities as the building ground of the ‘civilized’ West.” (p.g. 186)

- “As global, Eurocentered capitalism was constituted through colonization, gender differentials were introduced where there were none. Oyeronkk Oyewhmi has shown us that the oppressive gender system that was imposed on Yoruba society did a lot more than transform the organization of reproduction… many Native American tribes were matriarchal, recognized more than two genders, recognized ‘third’ gendering and homosexuality positively, and understood gender in egalitarian terms rather than in the terms of subordination that Eurocentered capitalism imposed on them. Gunn’s work has enabled us to see that the scope of the gender differentials was much more encompassing and it did not rest on biology.” (p.g. 196)

Gerald N. Callahan, Between XX and XY: Intersexuality and the Myth of Two Sexes (2009) 

- “ Like Hinduism, many other religious traditions speak of deities and humans who are neither men nor women, including the androgyny of the Judeo-Christian Adam. But those are very old stories that have passed through many hands. Much may have changed or been lost in translation. A better way to test the foundations of the two-sex mythology would be to look at the peoples of our modern world and see if such beliefs are universal among human societies. Do people raised with different worldviews see the sexes differently? The answer is an emphatic yes.” (p.g. 144)

 Justin Clark, “Understanding Gender” (2015) 

- “This diversity of gender is a normal part of the human experience, across cultures and throughout history. Non-binary gender diversity exists all overthe world, documented by countless historians and anthropologists. Examples of individuals living comfortably outside of typical male/female expectations and/or identities are found in every region of the globe. The calabai, and calalaiof Indonesia, two-­spirit Native Americans, and the hijra of India all represent more complex understandings of gender than allowed for by a simplistic binary model.” (p.g. 2) 

• Phoenix Singer, “Colonialism, Two-Spirit Identity, and the Logics of White Supremacy” 

- “Colonialism as practiced by Western culture is used to erase traditional non-binary roles of gender orientation and systems of sexuality, i.e. the Two-Spirit. Identifying as Two-Spirit becomes not just a traditional way of expressing Indigenous beliefs of gender orientation and sexuality but a political identity in resistance of colonialism. Through the use of inherently violent, assimilative measures, these traditions of the Two-Spirit in Indigenous societies are lost in many of our communities and are replaced by the Western gender binary and spectrum of sexual orientation. As this paper will show, this plays into the colonialist logic of white supremacy and how it relates to the Indigenous body, colonizing Two-Spirit identity.” (p.g. 1)

- “When Europeans came to Turtle Island, much of their culture, their ideals, their beliefs and institutions came with them through the continued centuries of settler-colonialism. Building their own nation upon this land, they were able to more permanently construct and impose their culture upon others. The Western colonization of the Americas brought forth many institutions which sought to erase and displace Indigenous cultural traditions and beliefs. Through the use of violence, forced assimilation, demonization of Indigenous beliefs and then appropriation of Indigenous culture, the subjugation of Native sexuality and gender roles have continued unquestioned in the minds of the settler and of our own people. It can be said and will be shown, that the Western binary is a system of oppression and repression and is actively a form of institutional violence against the Two-Spirit. This is all connected to the idea of white supremacy and domination over Indigenous bodies and beliefs, of colonization of our very selves. Thus an analysis of colonization and white supremacy is not complete without an approach towards Two-Spirit identity in our own communities.” (p.g. 1-2)

- “Before the colonization of this land, there were as many as six traditional gender orientation roles among numerous tribes. However, due to boarding schools erasing these traditions […] the Christianized related the existence of the Two-Spirit as sin… The Western Gender Binary is thus superimposed upon all cultures and their histories seen through the gaze of not only male dominance but a male/female paradigm that does not account for the existence of third, fourth, fifth and even more varieties of non-male/female expressions and identities. The Western Gender Binary does not see the Two-Spirit, the Western Gender Binary only sees a Man acting in ‘Unmanly’ ways or a Woman acting in ‘Unwomanly’ ways… As part of the settler mentality, we can see these actions as colonial violence against the Two-Spirit and are also the results of genocide. To reiterate previous statements, the Western gender binary is a form of superimposed and universalized colonialism upon Indigenous bodies and minds.” (p.g. 5-6)

Anonymous Author, “The Problematic Ideology of Natural Sex” (2016)

- “…we have ignorance of the long and violent history of the imposition of the Ideology of Natural Sex under European colonialism. The genius behind framing an ideology as ‘natural’ is that its history erases itself. Why would anyone study the history of something natural and eternal? We don’t study the history of covalent bonds in chemistry or cumulus clouds in meteorology.  And so we don’t study the spread of European binary sex ideology under colonialism. If you do, you’ll find that all over the world before European colonialism there were societies recognizing three, four, or more sexes and allowing people to move between them—but that’s a subject for another post. Suffice it to say that societies were violently restructured under European colonialism in many ways, and one of those was the stamping out of nonbinary gender categories and stigmatization of those occupying them as perverts.” 

to say that nonbinary genders don’t exist would not only be historically and scientifically incorrect, but it would also be saying that the cultural traditions of hundreds of cultures are invalid, it would be ignoring millennia of history, and it would be insisting that only the white european standard of gender, which was used to justify colonialism and was forced onto indigenous people via genocide and forced assimilation, is “correct”. trying to enforce western concepts of gender on other cultures is an act of racism and imperialism, and presumes that one group somehow knows more about the human condition, which is, on all levels, factually as well as historically and ethnically wrong.


neither gender nor “biological” sex is innate or binary, and the vast majority of biologists, scientists, doctors, psychologists, historians and anthropologists have been debunking these ignorant claims for decades and proving that both of these concepts are socially constructed. and since gender is completely subjective, nonbinary genders have existed since the dawn of human civilization, even dating back to mesopotamia, the VERY FIRST human society, at that. there are many countries today where there are officially more than two genders recognized, and there are multiple languages that are entirely gender-neutral. the gender binary itself is an entirely european theory based on a complete lack of understanding of science, and was only recently forced on the world via colonialism and genocide. saying that nonbinary genders aren’t real is an act of transphobia, racism, and imperialism, and is the same as saying that thousands of cultures around the world, millions of personal experiences, and entire societal structures throughout history are not real, which is not only dehumanizing, but makes no sense. it is literally part of human nature and basic natural variation to not fit into oversimplified binary categories.

but you know, curse those special snowflakes, or whatever.

EDIT: this is the final UPDATED version of my original response, please reblog this edited version of my post instead if you’ve already reblogged (any of) my previous/original version(s).

Sorry for putting such a long post on everybody’s dash, but this is something that everyone can put aside 6 minutes to read. 

Read the whole story
39 days ago
Seattle, WA
Share this story

A Rebuttal For Python 3

2 Comments and 4 Shares

Zed Shaw, of Learn Python the Hard Way fame, has now written The Case Against Python 3.

I’m not involved with core Python development. The only skin I have in this game is that I like Python 3. It’s a good language. And one of the big factors I’ve seen slowing its adoption is that respected people in the Python community keep grouching about it. I’ve had multiple newcomers tell me they have the impression that Python 3 is some kind of unusable disaster, though they don’t know exactly why; it’s just something they hear from people who sound like they know what they’re talking about. Then they actually use the language, and it’s fine.

I’m sad to see the Python community needlessly sabotage itself, but Zed’s contribution is beyond the pale. It’s not just making a big deal about changed details that won’t affect most beginners; it’s complete and utter nonsense, on a platform aimed at people who can’t yet recognize it as nonsense. I am so mad.

The Case Against Python 3

I give two sets of reasons as I see them now. One for total beginners, and another for people who are more knowledgeable about programming.

Just to note: the two sets of reasons are largely the same ideas presented differently, so I’ll just weave them together below.

The first section attempts to explain the case against starting with Python 3 in non-technical terms so a beginner can make up their own mind without being influenced by propaganda or social pressure.

Having already read through this once, this sentence really stands out to me. The author of a book many beginners read to learn Python in the first place is providing a number of reasons (some outright fabricated) not to use Python 3, often in terms beginners are ill-equipped to evaluate, but believes this is a defense against propaganda or social pressure.

The Most Important Reason

Before getting into the main technical reasons I would like to discuss the one most important social reason for why you should not use Python 3 as a beginner:


Python 3’s adoption is really only at about 30% whenever there is an attempt to measure it.

Wait, really? Wow, that’s fantastic.

I mean, it would probably be higher if the most popular beginner resources were actually teaching Python 3, but you know.

Nobody is all that interested in finding out what the real complete adoption is, despite there being fairly simple ways to gather metrics on the adoption.

This accusatory sentence conspicuously neglects to mention what these fairly simple ways are, a pattern that repeats throughout. The trouble is that it’s hard to even define what “adoption” means — I write all my code in Python 3 now, but veekun is still Python 2 because it’s in maintenance mode, so what does that say about adoption? You could look at PyPI download stats, but those are thrown way off by caches and system package managers. You could look at downloads from the Python website, but a great deal of Python is written and used on Unix-likes, where Python itself is either bundled or installed from the package manager.

It’s as simple as that. If you learn Python 2, then you can still work with all the legacy Python 2 code in existence until Python dies or you (hopefully) move on. But if you learn Python 3 then your future is very uncertain. You could really be learning a dead language and end up having to learn Python 2 anyway.

You could use Python 2, until it dies… or you could use Python 3, which might die. What a choice.

By some definitions, Python 2 is already dead — it will not see another major release, only security fixes. Python 3 is still actively developed, and its seventh major release is next month. It even contains a new feature that Zed later mentions he prefers to Python 2’s offerings.

It may shock you to learn that I know both Python 2 and Python 3. Amazingly, two versions of the same language are much more similar than they are different. If you learned Python 3 and then a wizard cast a spell that made it vanish from the face of the earth, you’d just have to spend half an hour reading up on what had changed from Python 2.

Also, it’s been over a decade, maybe even multiple decades, and Python 3 still isn’t above about 30% in adoption. Even among the sciences where Python 3 is touted as a “success” it’s still only around 25-30% adoption. After that long it’s time to admit defeat and come up with a new plan.

Python 3.0 came out in 2008. The first couple releases ironed out some compatibility and API problems, so it didn’t start to gain much traction until Python 3.2 came out in 2011. Hell, Python 2.0 came out in 2000, so even Python 2 isn’t multiple decades old. It would be great if this trusted beginner reference could take two seconds to check details like this before using them to scaremonger.

The big early problem was library compatibility: it’s hard to justify switching to a new version of the language if none of the libraries work. Libraries could only port once their own dependencies had ported, of course, and it took a couple years to figure out the best way to maintain compatibility with both Python 2 and Python 3. I’d say we only really hit critical mass a few years ago — for instance, Django didn’t support Python 3 until 2013 — in which case that 30% is nothing to sneeze at.

There are more reasons beyond just the uncertain future of Python 3 even decades later.

In one paragraph, we’ve gone from “maybe even multiple decades” to just “decades”, which is a funny way to spell “eight years”.

Not In Your Best Interests

The Python project’s efforts to convince you to start with Python 3 are not in your best interest, but, rather, are only in the best interests of the Python project.

It’s bad, you see, for the Python project to want people to use the work it produced.

Anyway, please buy Zed Shaw’s book.

Anyway, please pledge to my Patreon.

Ultimately though, if Python 3 were good they wouldn’t need to do any convincing to get you to use it. It would just naturally work for you and you wouldn’t have any problems. Instead, there are serious issues with Python 3 for beginners, and rather than fix those issues the Python project uses propaganda, social pressure, and marketing to convince you to use it. In the world of technology using marketing and propaganda is immediately a sign that the technology is defective in some obvious way.

This use of social pressure and propaganda to convince you to use Python 3 despite its problems, in an attempt to benefit the Python project, is morally unconscionable to me.

Ten paragraphs in, Zed is telling me that I should be suspicious of anything that relies on marketing and propaganda. Meanwhile, there has yet to be a single concrete reason why Python 3 is bad for beginners — just several flat-out incorrect assertions and a lot of handwaving about how inexplicably nefarious the Python core developers are. You know, the same people who made Python 2. But they weren’t evil then, I guess.

You Should Be Able to Run 2 and 3

In the programming language theory there is this basic requirement that, given a “complete” programming language, I can run any other programming language. In the world of Java I’m able to run Ruby, Java, C++, C, and Lua all at the same time. In the world of Microsoft I can run F#, C#, C++, and Python all at the same time. This isn’t just a theoretical thing. There is solid math behind it. Math that is truly the foundation of computer science.

The fact that you can’t run Python 2 and Python 3 at the same time is purely a social and technical decision that the Python project made with no basis in mathematical reality. This means you are working with a purposefully broken platform when you use Python 3, and I personally can’t condone teaching people to use something that is fundamentally broken.

The programmer-oriented section makes clear that the solid math being referred to is Turing-completeness — the section is even titled “Python 3 Is Not Turing Complete”.

First, notice a rhetorical trick here. You can run Ruby, Java, C++, etc. at the same time, so why not Python 2 and Python 3?

But can you run Java and C# at the same time? (I’m sure someone has done this, but it’s certainly much less popular than something like Jython or IronPython.)

Can you run Ruby 1.8 and Ruby 2.3 at the same time? Ah, no, so I guess Ruby 2.3 is fundamentally and purposefully broken.

Can you run Lua 5.1 and 5.3 at the same time? Lua is a spectacular example, because Lua 5.2 made a breaking change to how the details of scope work, and it’s led to a situation where a lot of programs that embed Lua haven’t bothered upgrading from Lua 5.1. Was Lua 5.2 some kind of dark plot to deliberately break the language? No, it’s just slightly more inconvenient than expected for people to upgrade.

Anyway, as for Turing machines:

In computer science a fundamental law is that if I have one Turing Machine I can build any other Turing Machine. If I have COBOL then I can bootstrap a compiler for FORTRAN (as disgusting as that might be). If I have FORTH, then I can build an interpreter for Ruby. This also applies to bytecodes for CPUs. If I have a Turing Complete bytecode then I can create a compiler for any language. The rule then can be extended even further to say that if I cannot create another Turing Machine in your language, then your language cannot be Turing Complete. If I can’t use your language to write a compiler or interpreter for any other language then your language is not Turing Complete.

Yes, this is true.

Currently you cannot run Python 2 inside the Python 3 virtual machine. Since I cannot, that means Python 3 is not Turing Complete and should not be used by anyone.

And this is completely asinine. Worse, it’s flat-out dishonest, and relies on another rhetorical trick. You only “cannot” run Python 2 inside the Python 3 VM because no one has written a Python 2 interpreter in Python 3. The “cannot” is not a mathematical impossibility; it’s a simple matter of the code not having been written. Or perhaps it has, but no one cares anyway, because it would be comically and unusably slow.

I assume this was meant to be sarcastic on some level, since it’s followed by a big blue box that seems unsure about whether to double down or reverse course. But I can’t tell why it was even brought up, because it has absolutely nothing to do with Zed’s true complaint, which is that Python 2 and Python 3 do not coexist within a single environment. Implementing language X using language Y does not mean that X and Y can now be used together seamlessly.

The canonical Python release is written in C (just like with Ruby or Lua), but you can’t just dump a bunch of C code into a Python (or Ruby or Lua) file and expect it to work. You can talk to C from Python and vice versa, but defining how they communicate is a bit of a pain in the ass and requires some level of setup.

I’ll get into this some more shortly.

No Working Translator

Python 3 comes with a tool called 2to3 which is supposed to take Python 2 code and translate it to Python 3 code.

I should point out right off the bat that this is not actually what you want to use most of the time, because you probably want to translate your Python 2 code to Python 2/3 code. 2to3 produces code that most likely will not work on Python 2. Other tools exist to help you port more conservatively.

Translating one programming language into another is a solidly researched topic with solid math behind it. There are translators that convert any number of languages into JavaScript, C, C++, Java, and many times you have no idea the translation is being done. In addition to this, one of the first steps when implementing a new language is to convert the new language into an existing language (like C) so you don’t have to write a full compiler. Translation is a fully solved problem.

This is completely fucking ludicrous. Translating one programming language to another is a common task, though “fully solved” sounds mighty questionable. But do you know what the results look like?

I found a project called “Transcrypt”, which puts Python in the browser by “translating” it to JavaScript. I’ve never used or heard of this before; I just googled for something to convert Python to JavaScript. Here’s their first sample, a demo using jQuery:

def start ():
    def changeColors ():
        for div in S__divs:
            S (div) .css ({
                'color': 'rgb({},{},{})'.format (* [int (256 * Math.random ()) for i in range (3)]),

    S__divs = S ('div')
    changeColors ()
    window.setInterval (changeColors, 500)

And here’s the JavaScript code it compiles to:

(function () {
    var start = function () {
        var changeColors = function () {
            var __iterable0__ = $divs;
            for (var __index0__ = 0; __index0__ < __iterable0__.length; __index0__++) {
                var div = __iterable0__ [__index0__];
                $ (div).css (dict ({'color': 'rgb({},{},{})'.format.apply (null, function () {
                    var __accu0__ = [];
                    for (var i = 0; i < 3; i++) {
                        __accu0__.append (int (256 * Math.random ()));
                    return __accu0__;
                } ())}));
        var $divs = $ ('div');
        changeColors ();
        window.setInterval (changeColors, 500);
    __pragma__ ('<all>')
        __all__.start = start;
    __pragma__ ('</all>')
}) ();

Well, not quite. That’s actually just a small piece at the end of the full 1861-line file.

You may notice that the emitted JavaScript effectively has to emulate the Python for loop, because JavaScript doesn’t have anything that works exactly the same way. And this is a basic, common language feature translated between two languages in the same general family! Imagine how your code would look if you relied on gritty details of how classes are implemented.

Is this what you want 2to3 to do to your code?

Even if something has been proven to be mathematically possible, that doesn’t mean it’s easy, and it doesn’t mean the results will be pretty (or fast).

The 2to3 translator fails on about 15% of the code it attempts, and does a poor job of translating the code it can handle. The motivations for this are unclear, but keep in mind that a group of people who claim to be programming language experts can’t write a reliable translator from one version of their own language to another. This is also a cause of their porting problems, which adds up to more evidence Python 3’s future is uncertain.

Writing a translator from one language to another is a fully proven and fundamental piece of computer science. Yet, the 2to3 translator cannot translate code 100%. In my own tests it is only about 85% effective, leaving a large amount of code to translate manually. Given that translation is a solved problem this seems to be a decision bordering on malice rather than incredible incompetence.

The programmer-oriented section doubles down on this idea with a title of “Purposefully Crippled 2to3 Translator” — again, accusing the Python project of sabotaging everyone. That doesn’t even make sense; if their goal is to make everyone use Python 3 at any cost, why would they deliberately break their tool that reduces the amount of Python 2 code and increases the amount of Python 3 code?

2to3 sucks because its job is hard. Python is dynamically typed. If it sees d.iteritems(), it might want to change that to d.items(), as it’s called in Python 3 — but it can’t always be sure that d is actually a dict. If d is some user-defined type, renaming the method is wrong.

But hey, Turing-completeness, right? It must be mathematically possible. And it is! As long as you’re willing to see this:

for key, value in d.iteritems():

Get translated to this:

__d = d
for key, value in (__d.items() if isinstance(__d, dict) else __d.iteritems()):

Would Zed be happier with that, I wonder?

The JVM and CLR Prove It's Pointless

Yet, for some reason, the Python 3 virtual machine can’t run Python 2? Despite the solidly established mathematics disproving this, the countless examples of running one crazy language inside a Russian doll cascade of other crazy languages, and huge number of languages that can coexist in nearly every other virtual machine? That makes no sense.

This, finally, is the real complaint. It’s not a bad one, and it comes up sometimes, but… it’s not this easy.

The Python 3 VM is fairly similar to the Python 2 VM. The problem isn’t the VM, but the core language constructs and standard library.

Consider: what happens when a Python 2 old-style class instance gets passed into Python 3, which has no such concept? It seems like a value would have to always have the semantics of the language version it came from — that’s how languages usually coexist on the same VM, anyway.

Now, I’m using Python 3, and I load some library written for Python 2. I call a Python 2 function that deals with bytestrings, and I pass it a Python 3 bytestring. Oh no! It breaks because Python 3 bytestrings iterate as integers, whereas the Python 2 library expects them to iterate as characters.

Okay, well, no big deal, you say. Maybe Python 2 libraries just need to be updated to work either way, before they can be used with Python 3.

But that’s exactly the situation we’re in right now. Syntax changes are trivially fixed by 2to3 and similar tools. It’s libraries that cause the subtler issues.

The same applies the other way, too. I write Python 3 code, and it gets an int from some Python 2 library. I try to use the .to_bytes method on it, but that doesn’t exist on Python 2 integers. So my Python 3 code, written and intended purely for Python 3, now has to deal with Python 2 integers as well.

Perhaps “primitive” types should convert automatically, on the boundary? Okay, sure. What about the Python 2 buffer type, which is C-backed and replaced by memoryview in Python 3?

Or how about this very fundamental problem: names of methods and other attributes are str in both versions, but that means they’re bytestrings in Python 2 and text in Python 3. If you’re in Python 3 land, and you call obj.foo() on a Python 2 object, what happens? Python 3 wants a method with the text name foo, but Python 2 wants a method with the bytes name foo. Text and bytes are not implicitly convertible in Python 3. So does it error? Somehow work anyway? What about the other way around?

What about the standard library, which has had a number of improvements in Python 3 that don’t or can’t exist in Python 2? Should Python ship two entire separate copies of its standard library? What about modules like logging, which rely on global state? Does Python 2 and Python 3 code need to set up logging separately within the same process?

There are no good solutions here. The language would double in size and complexity, and you’d still end up with a mess at least as bad as the one we have now when values leak from one version into the other.

We either have two situations here:

  1. Python 3 has been purposefully crippled to prevent Python 2’s execution alongside Python 3 for someone’s professional or ideological gain.
  2. Python 3 cannot run Python 2 due to simple incompetence on the part of the Python project.

I can think of a third.

Difficult To Use Strings

The strings in Python 3 are very difficult to use for beginners. In an attempt to make their strings more “international” they turned them into difficult to use types with poor error messages.

Why is “international” in scare quotes?

Every time you attempt to deal with characters in your programs you’ll have to understand the difference between byte sequences and Unicode strings.

Given that I’m reading part of a book teaching Python, this would be a perfect opportunity to drive this point home by saying “Look! Running exercise N in Python 3 doesn’t work.” Exercise 1, at least, works fine for me with a little extra sprinkle of parentheses:

print("Hello World!")
print("Hello Again")
print("I like typing this.")
print("This is fun.")
print('Yay! Printing.')
print("I'd much rather you 'not'.")
print('I "said" do not touch this.')

Contrast with the actual content of that exercise — at the bottom is a big red warning box telling people from “another country” (relative to where?) that if they get errors about ASCII encodings, they should put an unexplained magical incantation at the top of their scripts to fix “Unicode UTF-8”, whatever that is. I wonder if Zed has read his own book.

Don’t know what that is? Exactly.

If only there were a book that could explain it to beginners in more depth than “you have to fix this if you’re foreign”.

The Python project took a language that is very forgiving to beginners and mostly “just works” and implemented strings that require you to constantly know what type of string they are. Worst of all, when you get an error with strings (which is very often) you get an error message that doesn’t tell you what variable names you need to fix.

The complaint is that this happens in Python 3, whereas it’s accepted in Python 2:

>>> b"hello" + "hello"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

The programmer section is called “Statically Typed Strings”. But this is not static typing. That’s strong typing, a property that sets Python’s type system apart from languages like JavaScript. It’s usually considered a good thing, because the alternative is to silently produce nonsense in some cases, and then that nonsense propagates through your program and is hard to track down when it finally causes problems.

If they’re going to require beginners to struggle with the difference between bytes and Unicode the least they could do is tell people what variables are bytes and what variables are strings.

That would be nice, but it’s not like this is a new problem. Try this in Python 2.

>>> 3 + "hello"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

How would Python even report this error when I used literals instead of variables? How could custom types hook into such a thing? Error messages are hard.

By the way, did you know that several error messages are much improved in Python 3? Python 2 is somewhat notorious for the confusing errors it produces when an argument is missing from a method call, but Python 3 is specific about the problem, which is much friendlier to beginners.

However, when you point out that this is hard to use they try to claim it’s good for you. It is not. It’s simple blustering covering for a poor implementation.

I don’t know what about this is hard. Why do you have a text string and a bytestring in the first place? Why is it okay to refuse adding a number to a string, but not to refuse adding bytes to a string?

Imagine if one of the Python core developers were just getting into Python 2 and messing around.

# -*- coding: utf8 -*-
print "Hi, my name is Łukasz Langa."
print "Hi, my name is Łukasz Langa."[::-1]
Hi, my name is Łukasz Langa.
.agnaL zsaku�� si eman ym ,iH

Good luck figuring out how to fix that.

This isn’t blustering. Bytes are not text; they are binary data that could encode anything. They happen to look like text sometimes, and you can get away with thinking they’re text if you’re not from “another country”, but that mindset will lead you to write code that is wrong. The resulting bugs will be insidious and confusing, and you’ll have a hard time even reasoning about them because it’ll seem like “Unicode text” is somehow a different beast altogether from “ASCII text”.

Exercise 11 mentions at the end that you can use int() to convert a number to an integer. It’s no more complicated to say that you convert bytes to a string using .decode(). It shouldn’t even come up unless you’re explicitly working with binary data, and I don’t see any reading from sockets in LPTHW.

It’s also not statically compiled as strongly as it could be, so you can’t find these kinds of type errors until you run the code.

This comes a scant few paragraphs after “Dynamic typing is what makes Python easy to use and one of the reasons I advocate it for beginners.”

You can’t find any kinds of type errors until you run the code. Welcome to dynamic typing.

Strings are also most frequently received from an external source, such as a network socket, file, or similar input. This means that Python 3’s statically typed strings and lack of static type safety will cause Python 3 applications to crash more often and have more security problems when compared with Python 2.

On the contrary — Python 3 applications should crash less often. The problem with silently converting between bytestrings and text in Python 2 is that it might fail, depending on the contents. "cafe" + u"hello" works fine, but "café" + u"hello" raises a UnicodeDecodeError. Python 2 makes it very easy to write code that appears to work when tested with ASCII data, but later breaks with anything else, even though the values are still the same types. In Python 3, you get an error the first time you try to run such code, regardless of what’s in the actual values. That’s the biggest reason for the change: it improves things from being intermittent value errors to consistent type errors.

More security problems? This is never substantiated, and seems to have been entirely fabricated.

Too Many Formatting Options

In addition to that you will have 3 different formatting options in Python 3.6. That means you’ll have to learn to read and use multiple ways to format strings that are all very different. Not even I, an experienced professional programmer, can easily figure out these new formatting systems or keep up with their changing features.

I don’t know what on earth “keep up with their changing features” is supposed to mean, and Zed doesn’t bother to go into details.

Python 3 has three ways to format strings: % interpolation, str.format(), and the new f"" strings in Python 3.6. The f"" strings use the same syntax as str.format(); the difference is that where str.format() uses numbers or names of keyword arguments, f"" strings just use expressions. Compare:

number = 133

This isn’t “very different”. A frequently-used method is being promoted to syntax.

I really like this new style, and I have no idea why this wasn’t the formatting for Python 3 instead of that stupid .format function. String interpolation is natural for most people and easy to explain.

The problem is that beginner will now how to know all three of these formatting styles, and that’s too many.

I could swear Zed, an experienced professional programmer, just said he couldn’t easily figure out these new formatting systems. Note also that str.format() has existed in Python 2 since Python 2.6 was released in 2008, so I don’t know why Zed said “new formatting systems“, plural.

This is a truly bizarre complaint overall, because the mechanism Zed likes best is the newest one. If Python core had agreed that three mechanisms was too many, we wouldn’t be getting f"" at all.

Even More Versions of Strings

Finally, I’m told there is a new proposal for a string type that is both bytes and Unicode at the same time? That’d be fantastic if this new type brings back the dynamic typing that makes Python easy, but I’m betting it will end up being yet another static type to learn. For that reason I also think beginners should avoid Python 3 until this new “chimera string” is implemented and works reliably in a dynamic way. Until then, you will just be dealing with difficult strings that are statically typed in a dynamically typed language.

I have absolutely no idea what this is referring to, and I can’t find anyone who does. I don’t see any recent PEPs mentioning such a thing, nor anything in the last several months on the python-dev mailing list. I don’t see it in the Python 3.6 release notes.

The closest thing I can think of is the backwards-compatibility shenanigans for PEP 528 and PEP 529 — they switch to the Windows wide-string APIs for console and filesystem encoding, but pretend under the hood that the APIs take UTF-8-encoded bytes to avoid breaking libraries like Twisted. That’s a microscopic detail that should never matter to anyone but authors of Twisted, and is nothing like a new hybrid string type, but otherwise I’m at a loss.

This paragraph really is a perfect summary of the whole article. It speaks vaguely yet authoritatively about something that doesn’t seem to exist, it doesn’t bother actually investigating the thing the entire section talks about, it conjectures that this mysterious feature will be hard just because it’s in Python 3, and it misuses terminology to complain about a fundamental property of Python that’s always existed.

Core Libraries Not Updated

Many of the core libraries included with Python 3 have been rewritten to use Python 3, but have not been updated to use its features. How could they given Python 3’s constant changing status and new features?

What “constant changing status”? The language makes new releases; is that bad? The only mention of “changing” so far was with string formatting, which makes no sense to me, because the only major change has been the addition of syntax that Zed prefers.

There are several libraries that, despite knowing the encoding of data, fail to return proper strings. The worst offender seems to be any libraries dealing with the HTTP protocol, which does indicate the encoding of the underlying byte stream in many cases.

In many cases, yes. Not in all. Some web servers don’t send back an encoding. Some files don’t have an encoding, because they’re images or other binary data. HTML allows the encoding to be given inside the document, instead. urllib has always returned bytes, so it’s not all that unreasonable to keep doing that, rather than… well, I’m not quite sure what this is proposing. Return strings sometimes?

The documentation for urllib.request and http.client both advise using the higher-level Requests library instead, in a prominent yellow box right at the top. Requests has distinct mechanisms for retrieving bytes versus text and is vastly easier to use overall, though I don’t think even it understands reading encodings from HTML. Alas, computers.

Good luck to any beginner figuring out how to install Requests on Python 2 — but thankfully, Python 3 now comes bundled with pip, which makes installing libraries much easier. Contrast with the beginning of exercise 46, which apologizes for how difficult this is to explain, lists four things to install, warns that it will be frustrating, and advises watching a video to help figure it out.

What’s even more idiotic about this is Python has a really good Chardet library for detecting the encoding of byte streams. If Python 3 is supposed to be “batteries included” then fast Chardet should be baked into the core of Python 3’s strings making it cake to translate strings to bytes even if you don’t know the underlying encoding. … Call the function whatever you want, but it’s not magic to guess at the encoding of a byte stream, it’s science. The only reason this isn’t done for you is that the Python project decided that you should be punished for not knowing about bytes vs. Unicode, and their arrogance means you have difficult to use strings.

Guessing at the encoding of a byte stream isn’t so much science as, well, guessing. Guessing means that sometimes you’re wrong. Sometimes that’s what you want, and I’m honestly ambivalent about having chardet in the standard library, but it’s hardly arrogant to not want to include a highly-fallible heuristic in your programming language.

Conclusions and Warnings

I have resisted writing about these problems with Python 3 for 5 versions because I hoped it would become usable for beginners. Each year I would attempt to convert some of my code and write a couple small tests with Python 3 and simply fail. If I couldn’t use Python 3 reliably then there’s no way a total beginner could manage it. So each year I’d attempt it, and fail, and wait until they fix it. I really liked Python and hoped the Python project would drop their stupid stances on usability.

Let us recap the usability problems seen thusfar.

  • You can’t add b"hello" to "hello".
  • TypeErrors are phrased exactly the same as they were in Python 2.
  • The type system is exactly as dynamic as it was in Python 2.
  • There is a new formatting mechanism, using the same syntax as one in Python 2, that Zed prefers over the ones in Python 2.
  • urllib.request doesn’t decode for you, just like in Python 2.
  • 档牡敤㽴 isn’t built in. Oh, sorry, I meant chardet.

Currently, the state of strings is viewed as a Good Thing in the Python community. The fact that you can’t run Python 2 inside Python 3 is seen as a weird kind of tough love. The brainwashing goes so far as to outright deny the mathematics behind language translation and compilation in an attempt to motivate the Python community to brute force convert all Python 2 code.

Which is probably why the Python project focuses on convincing unsuspecting beginners to use Python 3. They don’t have a switching cost, so if you get them to fumble their way through the Python 3 usability problems then you have new converts who don’t know any better. To me this is morally wrong and is simply preying on people to prop up a project that needs a full reset to survive. It means beginners will fail at learning to code not because of their own abilities, but because of Python 3’s difficulty.

Now that we’re towards the end, it’s a good time to say this: Zed Shaw, your behavior here is fucking reprehensible.

Half of what’s written here is irrelevant nonsense backed by a vague appeal to “mathematics”. Instead of having even the shred of humility required to step back and wonder if there are complicating factors beyond whether something is theoretically possible, you have invented a variety of conflicting and malicious motivations to ascribe to the Python project.

It’s fine to criticize Python 3. The string changes force you to think about what you’re doing a little more in some cases, and occasionally that’s a pain in the ass. I absolutely get it.

But you’ve gone out of your way to invent a conspiracy out of whole cloth and promote it on your popular platform aimed at beginners, who won’t know how obviously full of it you are. And why? Because you can’t add b"hello" to "hello"? Are you kidding me? No one can even offer to help you, because instead of examples of real problems you’ve had, you gave two trivial toys and then yelled a lot about how the whole Python project is releasing mind-altering chemicals into the air.

The Python 3 migration has been hard enough. It’s taken a lot of work from a lot of people who’ve given enough of a crap to help Python evolve — to make it better to the best of their judgment and abilities. Now we’re finally, finally at the point where virtually all libraries support Python 3, a few new ones only support Python 3, and Python 3 adoption is starting to take hold among application developers.

And you show up to piss all over it, to propagate this myth that Python 3 is hamstrung to the point of unusability, because if the Great And Wise Zed Shaw can’t figure it out in ten seconds then it must just be impossible.

Fuck you.

Sadly, I doubt this will happen, and instead they’ll just rant about how I don’t know what I’m talking about and I should shut up.

This is because you don’t know what you’re talking about, and you should shut up.

Read the whole story
58 days ago
Seattle, WA
Share this story
2 public comments
58 days ago
As someone new to python, the people fighting against python 3 make me think the python community is a bit insane.
58 days ago
58 days ago
It took me about two weeks to get used to Python 3(.4, at the time) and now I find it mildly irritating whenever for some reason I have to use version 2. 3 really is a better language and I would argue that it is _easier_ to learn if you're starting from scratch. There's only one kind of object! Lazy iteration is the norm, not something you have to remember to ask for! The standard library is much better organized! You don't have to jump through cryptic hoops to use Unicode text! The only thing I really _miss_ from 2.x is `"6920616d206865726f".decode("hex")` and that's mostly because I was playing a lot of _The Talos Principle_ at the same time as I was trying to get used to v3.
Mountain View, CA
Next Page of Stories