On Design and Normativity
Do you know what an opinionated technology is? The topic came up naturally in conversation at work. It started with some first year cadets talking about projects they were working on before starting at WiseTech, and somehow it transformed into a comparison of various programming languages. But how can you compare programming languages? Fundamentally all languages that hobbyist and even professional software developers use have the same computational power. In fact, within the same programming paradigm all languages have more or less equivalent constructs and keywords that allow programs to be seamlessly translated between them. I argued, the real discussion to be had was about design and philosphy. Things like level of support, libraries, and expertise within a team are all important but are somewhat arbitrary across programming languages and what a dev finds mature, well-documented and easy to use is not inherently built into the language itself but is instead an artefact of marketing, culture and luck as the language is either eagerly adopted or silently neglected. In that sense it is impossible to discuss a langauge seriously as a theoretical, bounded object in a vacuum, instead it is a dynamic, growing tool that shapes the world and the broader community of programmers that use it shape it in turn. Trying hard to stick to the first (rigid and uncompromising) model of a language does not give us many easy handles for making comparisons and reverse engineering use cases- but it does concede a few. And so we began to talk about opinionatedness.
Zen of Python
“Python is an opinionated language”
What does that mean? Well to Year 9 me, it meant you could type import this
into IDLE and you would be hit with this pretty nifty but somewhat abstract and cryptic poem making vague references to things I knew were programming-related but did not understand, like Readability, Implicitness and Namespaces. Now, I can confidently say that no programmer is entitled to make rules and expect them to be correct, understood or followed. And even then, rules should never be universal. Only siths deal in absolutes. Imo SWEs should humbly propose suggestions for programming rules to be critically examined and evaluated by the wider community. Following that thinking, The Zen of Programming is nothing more than a neat piece of Python culture. As we’ve seen time and time again with “Composition over Inheritance” and “Don’t Repeat Yourself”, we should be making rules of thumb not laws of nature! But that aside, Python’s opinionatedness still stands.
“Opinionated” on one level simply means the language heavily encourages you to follow some rules when using it- to the point where it is easier to follow the language’s rules than to not. By repeatedly following the rules your programs take on similar familiar shapes, in line with how “good” programs should look according to the language. Python wants your code to be readable. In languages with C style syntax e.g. C#, C++, Java, there are very few rules about where lines end, where lines begin, where brackets go and where semicolons must be. But Python wants your code to look good and be readable, so it has whitespace requirements. Famous idioms like list comprehension, while not strictly required, make your code neat and easy to understand. Next.js is an opinionated React framework. React gives you basic language features to build web pages, but developers still have the ability to choose various tools to solve common problems such as routing between pages, fetching data and controlling file layouts. Next.js makes these decisions for you by packaging a selection of libaries together to solve these problems- it has the “opinion” that complexities should be navigated a certain way.
1
2
3
public static class Sample
{
public static int Add(int x, int y) {; ; return x + y; ; } }
This kind of poor styling won’t fly in Python
Use cases
Now I want to abstract one layer away. What we are calling “opinion” is very similar to the notion of a “use case”- these concepts are dual. A use case is where the language says “you may use me here” and the user then gets to decide how. An opinion is where the user initiates and says “I want to use you” and the language then gets to decide how. Programming languages become first order functions and “act” on a domain of use cases which in the case of Python includes ML, data science, scripting, web dev etc. Use cases extend beyond technologies that are considered classically opinionated since use cases are relevant anywhere in the wider realm of design, and everything is designed. Design is an abstract term, I will define it as “all conscious or unconscious thought by the implementer of a system that precedes implementation of the system.” In other words, any thinking that comes before the making. Naturally when we design things we have visions of how we want them to be used, visions that can be formalized through requirements or shared through documentation and tutorials- but are inevitably formed and iterated on as the world embraces a technology and makes it their own.
Programming languages aren’t the only technologies that have been designed- consider a hammer. A hammer is opinionated, or dually has defined use cases. Although you can use it to massage yourself or crack open pistachios, and it is totally reasonable to buy a hammer intending to use it for either of these things, the hammer maker and the hammer seller would expect you to use it to put nails into wood.
Beyond Technology
Let us abstract away once more. What other objects are first order functions and “act”?
‘System’ is about as abstract a word as there is. I will define it as “a collection of components as a process that does something”- in a mathematical sense it is a process, considered as an object, that changes global state. It does something, it makes a measurable change on the surrounding context. All human-created systems are designed, all human-created systems have use cases. And if you want to get philosophical, there is an argument to be made that natural systems do too. Society is a system, that acts on people who in turn modify society. It is dynamic, as a programming language is. The implementer is us. Society is opinionated because it is built with a certain type of person in mind, an “ideal” person that uses society exactly how it was intended to be used to get the most out of it and give the most back to it. And I, having lived in society for 20 years, can reverse engineer this person. He isn’t vegetarian- why would he be, and choose not to be able to eat most food at most restaurants? He is straight, as his wedding form has a bride section and a groom section. He is white and unaffected by institutionalized racism that may have slowed him down. We call this opinionatedness “normativity”.
Society has observable emergent opinions, since its opinions are built from those of the subsystems within it- but there are rules and nuances to get the most out of society, to “use it better”, that nobody seems to have defined yet are undeniably there. People in positions of power don’t like to admit that you need to be rich to get the most out of society- yet, I wouldn’t be able to work the job I do now without parents that were well off enough to support me through school. People propagate ‘The American Dream’ yet we have cold hard numbers- in this case social mobility indices- that directly refute it.
Many valuable people, ideas and skills are illegible to systems such as academia or bureaucracy. To gain access to resources you often have to translate yourself into a legible form, such as degrees, past jobs, or portfolios. People respond to signals- signalling confidence and competence sometimes matters more than skill, such as in a corporate environment. Humaan brains categorize for efficiency and so people tend to be seen as projections of the roles they represent (e.g. Engineer, Woman, Immigrant) rather than themselves. Networks open more doors than talent. Society has layers of exclusivity from high end restaurants to private jets, none of which were invented by any one person (they are products of society like everything else). What makes university “for the common man” and private jets not? Is health care any more fundamental than tertiary education? There are various types of privilege and some are harder to measure than others.
Of course none of these ideas are groundbreaking or novel. But identifying and analysing patterns is a great first step in the process of helping people that are not living productive, happy, fulfilled lives by fixing the broken system they are in. Realising that there is a system is the first step to being able to exit it, and then reason about it from the outside. Let the next generation of systems engineers put on their thinking caps, let them look at society the same way they look at a failed machine and ask “Why?”.