Surfing a wave of complexity
Recently, I’ve been trying to work on my surfing a bit more consciously by looking into the fundamental elements of the sport. By better understanding the basic concepts, I try to develop patterns that will become ingrained in my muscle memory and subconscious thinking. I’ve been exploring numerous tutorials throughout my journey, and I’ve come across many explanations about various aspects of surfing. However, there are many interesting points of view, one of which caught my special attention. There is an organisation, or rather a movement from the Gold Coast called OMBE, which stands for Ocean, Mind, Body and Equipment, highlighting the critical points in surfing that, when working together, form a great wave rider. They built a prominent framework that helps to understand the art of surfing by focusing on one thing at a time to build confidence in and out of the water. While exploring OMBE, I saw how those principles, looking at it from a slightly higher level of abstraction, can apply to the art of programming or broader building of complex systems.
The ocean, as the first element, is the environment in which you work. To surf well, you need to understand how the water moves, where to expect the waves to break and how they are generated. You cannot change it, so you should accept this and learn how to read it to make the most of it. In programming, I see the domain that we work in as our ocean. For example, if you build a platform for a sporting event organiser, the sports industry is your domain. You should understand it deeply, knowing what is essential and finding the right point to start solving the problem, but fighting it is hopeless. Focusing on the real problem we are trying to solve, rather than technical nuances, and minimising accidental complexity is crucial for moving the product forward efficiently. As the swell forms far away in the ocean and travels a long distance to finally break in a way that we can ride, the same complexity builds deep in the domain. Forgetting the root cause can lead us to miss opportunities to solve the right problem at the right time, ultimately causing us to stall and regret not having checked the forecast more closely. While paddling out, we need to remember that water flows and whatever is pushed toward the shore will eventually be pulled out to the ocean, so paddling like crazy in the wrong spot will give us little to no effect. The only result of it would be our frustration after 15 minutes of staying in the same position. Instead of fighting against the power of the ocean, we can be patient and gently move forward. If we’re not moving forward, we are likely in the wrong spot. We should walk out and reassess our understanding of the situation. It translates one-to-one to solving complex problems. We shouldn’t fight with the domain; often, a second calm look and accepting that we could be wrong can help us gain a new perspective. This allows us to go back without hassle and solve the real issue more optimally, ultimately helping us reach the initial goal.
The mind, as the second part, is a vast topic. Being mindful and always present helps us to focus on the right thing. It could be surfing, coding, or anything else. I often find myself rethinking my previous mistakes that block me from actual progress. For instance, missing a great wave makes me anxious, as I worry about creating a gap in front of me or accidentally bumping into someone in a crowded area. This anxiety stops me from catching the waves. I believe we should always learn from our mistakes and make a concerted effort not to interfere with others. However, dwelling on past mistakes doesn’t help. Being mentally strong and persistent will assist you in achieving the end goal, whatever it may be. While exploring the world of Stoic philosophy and Cognitive Behavioural Therapy, I realised that we take ourselves too seriously. Of course, we take all our mistakes personally, and we don’t want others to see us as silly people, but often it leads to exaggeration. Once we learn to look at ourselves from another person’s perspective, it can be highly beneficial in programming, surfing, or other aspects of life. If someone else has a better idea, it’s crucial not to be stubborn; instead, we should humbly accept that there is a better solution, set aside our assumptions, and move forward. Since we have experience in something, we often think we no longer need to learn and can use our expertise. I believe this is wrong and leads to stagnation. No matter what level we are at, we always have room to improve ourselves. Hitting the roof and not having a place to grow would be a pretty sad perspective.
The body part encompasses all the skills and abilities we possess. In surfing, this is pretty obvious. On one side, strength and mobility; on the other, muscle memory, encompassing speed generation, maneuvers, and a solid technique for riding the waves. I believe that in the world of programming, it translates well to all the basic knowledge about coding itself and good practices. Creating a well-designed, composable, easy-to-use, understand and extend design is part of the programming craft one can have. All the object-oriented techniques based on encapsulation and communication via messages, functional immutability and composability, and practices around asynchronous programming that are platform agnostic help us ride the wave of complexity and build pleasant systems to work in.
The equipment part is the board we ride in the surfing context. Using the right tools for the style of surfing, skill level, and conditions is an essential part of the sport. Also, we should understand how different designs and setups influence our abilities. In the programming context, I believe the equivalent of the equipment is the framework we work in. It is possible to surf a 10ft wave on a foam board or write an Android app in Scala, but it would not be easy nor efficient. Finding the right tool for the job requires knowledge about the toolbox and being conscious of its limitations. From a surfing perspective, it is beneficial to understand what different board designs offer. In programming, having at least a basic understanding of various technologies is valuable. If you have only a hammer in the toolbox, everything will look like a hammer.
In summary, surfing and coding, or more generally building complex systems, have much more in common than they may seem at first. So even though those two disciplines are very different, many common patterns can help you get better at both.