A few days ago at work we did an exercise on company culture that got me thinking so I thought I'd share some of those thoughts here. I've been interested in organizational culture for a few years now. Some organizations seem to have a great culture while other organizations have a not so great culture. Sometimes culture is improving, and other times it is declining. The declining case can be particularly frustrating because in my experience everyone can see it's getting worse, everyone wants to change it, but nobody knows how.
One of the reasons I chose to come work for Microsoft is that they seem to be one of the few examples of a large, established organization that intentionally and dramatically changed their culture. I've been curious how they did that, and what other organizations can learn from that.
It seems like an important part of it is to have regular conversations about culture, such as by doing exercises like the one I'm going to discuss in this post. So with this background in mind, let's talk about the exercise.
At the start of the exercise, we were reminded of the company mission statement. Then we were asked to spend a couple of minutes coming up with a sentence explaining how we personally contribute to it.
According to Microsoft's About page, Microsoft's "mission is to empower every person and every organization on the planet to achieve more."
This mission actually speaks to me a lot. I feel like computers should be tools that help people do the things they want to do. Too often today, computers seem to actively work against their user instead. I have a kind of lengthy rant on this subject that I should probably write down someday, but that will be for another time.
So how did I respond to the exercise? I wrote:
In my work, I empower people to achieve more by creating powerful and accessible languages and APIs, and by helping to build a team that effectively does the same.
I felt rather proud of this answer, which is why I wanted to write about it in more depth. I want to do this by going into more detail about the main phrases I used.
The first is powerful and accessible. In my mind, Rust fits the bill really well here. Rust is an incredibly powerful language. Features like the borrow checker can ensure safe memory access for some complex patterns without any runtime overhead. The trait system provides incredible opportunities for abstraction. Rust provides good support for low level programming, while still including potent functional programming features like lambdas and algebraic data types. But what really impresses me about Rust is that it manages to make all this power usable to many programmers. Rust isn't the first language to do all these things, but some of the other languages essentially require a Ph.D. to use them effectively.1 On the other hand, things like Rust's extreme attention to detail in its error messages greatly increases that chance the programmers will be successful with such a powerful language.
The second is languages and APIs. I thought about writing "languages and libraries" because I like the alliteration but libraries seem too broad. I don't often write an entire library, while I might add a single function to an existing library. I felt like "API" better expressed that scope, and I've even heard a library called an API at times so this can generalize if needed. The reason I mentioned these two together is that I believe it's best to consider a programming language and its standard library as a unit. As a language nerd, I can easily get caught up in the excitement around designing new language syntax and semantics. These language features need to be supported by a solid, well-rounded library. To make an analogy to spoken languages, I think of the programming language as the grammar and the standard library as the vocabulary, It's hard to say much of anything with only one.
Finally, I mentioned the importantance of helping to build a team. This is the aspect I have the least experience in, but it's important and I'm trying to learn more about how to do it. A well-functioning team can accomplish far more than an individual! These teams don't form (or at least, aren't maintained) by accident. So it's important to do things like mentor new team members and to create a welcoming place so new people can feel comfortable joining the team. It's important to find ways to help grow members into new roles so that the team can outlive any one member. It's important to foster a sense of shared purpose and values so we can effectively work together. It's important to make space for disagreement, since often I find the best outcomes are a result of hashing out our differing perspectives.
Doing an exercise like this can feel pretty cheesy but this one resonated with me a lot. It was a chance to put into words why I do the things I do, both in my day job and how I bring those things into the Rust community. And now, having put this into words, I can use it as a guide when deciding how to approach my work in the future. While this post was specific to my role within Microsoft, I think doing a similar exercise with Rust's mission would be illuminating. Maybe I'll do that in another post. What about you? What values do you hold and how do you put those into action?
I feel like Rust does not need a Ph.D. to use well, but given that I have one, I may not be the most qualified person to make this claim.↩