I’ve been meaning to write this reflection ever since I came back here in the Philippines last 2018. This is definitely long overdue— albeit in a good way: working in the industry for a year helped me internalize some of the points I’ll discuss to provide a more thorough reflection on craftsmanship.
This is a long post encompassing some of my reflections on craftsmanship, software, and life. I’ll start off by narrating my first cathartic encounter with a craftsman, then move into my journey of finding my craft, and how it manifests into my work life. In the end, I’ll provide a short meta-reflection on how I’m doing today and what these reflections meant for me and my career.
Similar to my previous blogpost, this is a highly-personal essay on my journey, but I hope that a few nuggets of insight will surface as you read through my stories and reflections.
The soba story
The year was 2017, and I’m still fresh into my grad school journey in Japan. I’m starting to settle down, moved to a newer apartment, and made friends with other foreign students in my cohort. As we’re all wide-eyed foreigners in a beautiful country, we took part in some Japanese cultural activities provided by the school— one of which is making soba noodles.
I didn’t expect much from spending the weekend making soba noodles, how life transforming could it be? So I entered the function hall and saw around six tables laid out with some utensils already set up. In front, of course, are the welcoming faces of the Japanese cultural group. With them, I presume, are the soba chefs. I could tell because they have these aprons around them and a colorful handkerchief tied on their foreheads, similar to those 90’s rappers in the Philippines. All of them are quite old, probably in their early 70s, still healthy and strong as with the standard for most Japanese seniors.
After some greetings and remarks, one of the soba chefs, probably the most senior of them by his looks, came to the front and demonstrated how to make soba. He stepped on the small makeshift stage, dipped his hands in water, and started his handiwork. It was very methodical: he first made small clumps of buckwheat flour in a large bowl, then kneaded it, flattened it, and sliced it into strips. While making soba, one of the translators mentioned that he’s been making soba noodles all his life. I was so entranced watching him: he seemed to retain the same vigor and enthusiasm of making soba from his childhood years. I was also confused as a question stuck on me: “How can you do one thing for all your life and not be bored by it?”
“How can you do one thing for all your life and not be bored by it?”
The day went on: we made our own noodles, cooked some zaru soba (ざるそば), ate it, and went home. Little did I know that watching an old man making soba1 will become a theme of my Japanese journey. Looking back, Japan seems to have a strong tradition of craftsmanship. Be it in pottery, brewing sake (酒), or making fountain pens, there’s always this recurring image of an old person doing something all their lives.
The idea of a craftsman has been stamped on me ever since that day. Being able to build things and manifest oneself into something tangible is very meaningful. For the next few days, and during the rest of graduate school, I sought ways on finding and honing my craft.
Seeing software as craft
“The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds his castles in the air, from air, creating by exertion of the imagination.
Yet the program construct, unlike the poet’s words, is real in the sense that it moves and works, producing visible outputs separate from the construct itself…The magic of myth and legend has come true in our time. One types the correct incantation on a keyboard, and a display screen comes to life, showing things that never were nor could be.
Programming then is fun because it gratifies creative longings built deep within us and delights sensibilities we have in common with all men.”
— The Joys of the Craft, Mythical Man-Month, Brooks, 1975
The quote from Frederick Brooks struck me when I was reading Mythical Man-Month. The way he describes the art of programming as building castles in the air— as if you’re a wizard conjuring thought-stuff from mere incantations— reflects how magical I see programming even up to this day.2 Another reason is that he likened a programmer to a poet, and this brought back some memories of my undergraduate years.
In hindsight, I may have been looking for a semblance of craftsmanship early on when I was an undergrad. I joined Heights, an artistic and literary publication, and practiced writing poems and making art. Encountering various works and artists during deliberations and workshops gave me an insight on how a medium is used to convey an idea or express one’s self. The experience of expressing yourself through a medium has enamored me, and it’s something that I want to recreate in my field.
Again, I imagine the recurring image of the soba-maker: using the flour as his medium, he trudges the long nights kneading dough and making noodles under some faint tungsten light. At the end of it all, he looks to his creation and says to himself: “this is how I make soba, this is different from how other’s make soba because it’s mine.” Expressing yourself through the medium is a way of marking yourself to that object— and a deeper connection to one’s work.
Fast forward to today, I realized that working in open-source allowed me to recreate the same experience of craftsmanship during my Heights days. I’d consider myself lucky that my initial experience of “serious programming”3 is as an open-source hobbyist. I had the freedom to choose what projects I want to create, and in no way restrained by any spec or requirements that I should adhere to. It’s like someone gave me a blank piece of paper and told me: “draw whatever you want.” This may be different, say, if I took a computer science degree laboring over machine problems or started out programming in a job where I have lesser freedom to the projects I’ll take. Starting out in open-source has been vital in internalizing the idea that software can be treated as a craft.
With software, the dark terminal has become my canvas and the blinking cursor my brush
With software, the dark terminal has become my canvas and the blinking cursor my brush. I was able to build things and express myself in a way I want to. The best part is that it is integral to my field in technology, and has allowed to express myself through my medium. When I was building PySwarms back in grad school, I imagine myself trudging the long nights typing on my keyboard under some faint fluorescent light. I push to PyPI, look at my creation, and tell myself “this is how I make software, this is different from how other’s make software because it’s mine”.
Due to this, there are three things I learned when treating software as craft. I don’t want to romanticize these points, thus, I’m adding a counterweight to discuss the challenges involved for each learning:
Deeper connection to your work I think one of the main strengths of craftsmanship is one’s connection to his/her work. Open-source projects, which I believe are good exemplars of crafted artifacts, thrive because of the community (or the creator) that cares for it.
Of course, the downside is that in this highly-industrialized world, things that work stays and things that don’t are left behind. Laboring over some software that in the end, will not be used or worse, triggered negative responses from users may be seen as a personal injury to the craftsman. I try to practice some level of stoicism to these disordered attachments. This bullet-point deserves its own post.
Maintaining a high-standard of software quality Craftsmanship allowed me to acquire “taste,” by creating a large volume of work and/or by refining the software projects I’ve created. I never realized the extent of my learning back then until I started introducing some open-source software practices right away a few weeks into my job.
However, in most cases, we don’t have the luxury of time to refine and refactor our work. One thing I learned on-the-job is that there will always be reasons to polish our software, so it’s important to know when to call something as done and start shipping. There’s an element of practicality that’s lost in pursuing perfection so a healthy amount of agility (coupled with continuous integration and development) is necessary.
Sharing the craft to the community Seeing software as a craft goes beyond the individual as it is shared to the community. I am lucky because I can share my passion in open-source and software craftsmanship in Thinking Machines. Last month, we launched Open TM, and did a lot of strides in open-source this year.
Open-source is always about community, but this can be a double-edged sword. Communities can be toxic: rude comments, gatekeepers, you name it! I guess the good thing is that most of the communities I’ve been into have the kindest and most talented people in tech. I’m happy to be inspired by them!
I decided to reflect on this because the archetype of a craftsman has become an anchor in my professional life. I build things, and I find my purpose in the act of creation (and creative destruction when refactoring code!). I guess the next step for me is to learn how to organize people to create bigger things, and to learn how to share my craft to a wider audience.
I’ve been talking a lot about open-source because it is my primary vehicle for craftsmanship, but I think that same concepts can be applied to any aspect of technology.
I feel that this approach in life has worked for me so far. I feel that the ability to create is now crucial in this rapidly-changing world. Sometimes it’s better to shape your surroundings than blindly-accept what’s being handed to you. Perhaps I’m wrong, and I’ll look back to this post full of disagreement, but I’m hinging on the idea that I’m approximately correct.
- 03-01-2020: Add some Splash photos
- 10-15-2019: Update some grammar mistakes
Of course, he followed this with a chapter called “The Woes of the Craft,” which is equally true. ↩
Let me qualify this word further. Serious programming in this sense means being attuned with industry practices such as testing, documentation, and CI/CD. Although I’ve learned how to program since high school, I just type-in things without any sensibility if my code is idiomatic. ↩