I’ve been out of the tech blogging loop lately working on a really big contract creating a GUI for a big modeling application in .NET. It’s a good contract, with lots of hard aspects and challenges (which I like) but many of the challenges involve things that, while difficult for me, are easy for people who code in C# more than once every 5 years.1 I like writing blog posts as I learn things- to add to the Google Ecosystem of “how the heck do I…?” Sadly, many of the things I’ve been learning in C# are things I should already know, so I’ve been letting this lapse.
Lately, while I’ve been programming, I’ve been thinking a lot about culture. It’s a topic that’s dear to my heart because there’s a part of me that will always be an anthropologist- but it’s been coming back recently in an unexpected way because of my current work- which involves simultaneously programming in five different programming languages: C#, Python, Ruby, Java, and Scala.
A wee bit of background: I started programming long ago in Basic on a TI99/4A, and have learned many languages along the way. Much later in life, after some military time, I went to college as an anthropology major and eventually took a course called “Language and Culture” taught by one of the most influential teachers I’ve ever had: Dr. E. Moore Quinn.
I’ll skip the fawning over her and her class and summarize by saying that it was wonderful to me to dive into the subtleties of how culture, thought, and language are all so beautifully intertwined.2 More importantly than the mere integration of culture, thought, and language was the perspective that language infused everything we did- and thought. Language is far from being merely a medium with which we can transmit our culture and ideas. Language is an ocean of thought in which we swim, in which we live. Words are just the surface of that. We may see waves and the occasional breaching of a thought above the surface of our linguistic ocean- but the depths are those of thought itself, and as such, are unfathomable.
Dr. Quinn changed my life, because she made me see language as depth- rather than as mere words.
Recently, I’m realizing more and more that the depths of language are farther than I thought, especially as I create software in increasingly diverse spheres. This is coming to the foreground especially as I code in multiple programming languages.
Programming languages each have their own culture. Much like like human languages, they come with their own mores and folkways, their own codes and practices. The way you create a class in Ruby is going to be different from the way you do so in PHP, Java, C# or C++. All of them might have methods, members, and attributes, they will all have their different cultural feelings.3 The subtleties of a method in Ruby are vastly different from a method in C#.
Much like human languages, the purpose of each language is different, the culture from each language is different. The language influences the culture of the programmers that use it- but the culture of the programmers also influences the language itself.
Our thought influences our language, to be sure. But our language also influences our thought. In Lakhota, there is a word (transliterated as best we can): tiospaye. There’s no similar word in English- and there’s no similar meaning either. In fact, the meaning of this word could take a book in English. And just as there’s no similar word, there’s no similar concept. There’s no similar feeling.
If people used that word, placed value in that word- in the meaning behind that word- then that value would find a place in the culture. Likewise, if people place now value in that meaning- then the word carrying that meaning will disappear, or change.
Language influences thought influences culture influences language influences culture influences thought influences language.
This is similar in programming. There are vastly different cultures in Python programming community than in the C++ programming communities. But I remember programming in Python in the early/mid-90s, when the Python language was much more similar to the C++ language. The syntax was more similar, the way one created and used functions and methods was more similar. Back then, the culture of the two was much more similar as well.
Back then, many of the programmers in Python were recently converts from C++ and other low level languages. We programmed with some of the same conceptual constructs that we used in C++. As time went on, Python changed, and the language itself changed as well.
Python today is quite a bit different than in 1995. The syntax is somewhat different, but mostly the use is different. And likewise, the community is different. The community started thinking differently, was infused by programmers from other languages who had and ideas about things like functional programming, and the language responded to include words like “lambda.”4 Later, this language, which had lambdas as such an integral part of it, changed the culture of the Python community to think more functionally- we started thinking in lambdas.
I programmed years ago in C#, when it seemed like little more than C++ with garbage collection. I hated it. Recently, in this current contract, I came back to C# after years away, and have found that it seems a lot like Java- it “feels” Java-like. The language has changed, and I’ll bet the driving force behind that change is that a lot of people either liked Java, or “thought” in Java. Likewise, I bet any new programmer learning C# as their first language would be able to “think in Java” pretty easily.
Language influences thought influences culture influences language influences culture influences thought influences language.
This is neither here nor there from a “day to day,” “getting stuff done” programming perspective. But bears on my choice of programming language, on my use of language, and on my thought processes as a programmer.
I picked up Ruby as a language and I know that it affected me- it changed the way I think about code. Ruby (and Rails) are cultures that hold testing and testability as highly important. As a consequence, I started testing my code- and writing code differently because it needs to be testable. I know that everything I write, I write with this new concern for how it will be tested. My thinking as a programmer has changed, and it’s the language that changed me.
And as I program more in Scala, that will change me as well. But, I am part of that culture, and so I will change it. Some things I like in Scala will bleed over into Ruby. Some things I like in Ruby will bleed back into Scala. Words and thoughts will affect the language’s culture, and the language’s culture will affect my words and thoughts.
The more I program, the more I learn that human language and computer language is not so different. They are merely different linguistic aspects of culture.
one sad observation regarding natural languages is the rate of their extinction: on average, one a week. This means all these unique ways of seeing, thinking, and expressing ourselves vanish forever. This is a huge , largely hidden, loss. There's a good talk about this (which I'm sure you'd appreciate) at the long now foundation website.
I do appreciate it, as the language of my people is one of the ones that was lost- thanks to the "soul-saving" of missionaries. I think of it quite a lot, as a matter of fact. The loss of a language is the loss of a way of thinking.