Wednesday, December 1, 2010

Refactoring - a #Reverb10 reflection

#reverb10 December 1 One Word.

Encapsulate the year 2010 in one word. Explain why you’re choosing that word. Now, imagine it’s one year from today, what would you like the word to be that captures 2011 for you?
(Author: Gwen Bell)


Years ago, interested in my then-boyfriend's work, I read a book from his shelf called "Extreme Programming." This is a book about software development for software developers, but it is more than that - it is a philosophical treatise. I was struck, at the time, that despite technical language and limited scope, the approaches described held significant application to human systems, change management, and personal development. One key concept is "refactoring."

Here's the Wikipedia definition:
Code refactoring is the process of changing a computer program's source code without modifying its external functional behavior, in order to improve some of the nonfunctional attributes of the software.
In general, functional attributes define what a system is supposed to do, whereas non-functional attributes define how a system is supposed to be. Behaviours and Values. 

Software is very human in some respects. There is no bug-free software. Period. It's full of old processes and dead ends that used to try to do something, errors in logic, outdated functions, cobbled together ideas from many people of varying competence and vision, and other weirdnesses. The result is instances of spinning wheels, confusion, and sometimes, total and complete shutdown - but only under certain circumstances and demands.  Software isn't complicated - it's complex. Like life. Like us.

And, software is in use - it's not optimal to take it off line (any more than I can go hide out in a monastery for a year). It's not practical to start over. Instead, Extreme suggests refactoring the system - an ongoing, disciplined approach that identifies particular areas of concern, and allocates time to systematically analyze and understand just what the implications might be for changing or removing something that seems problematic (as well as how to do it). There are always side effects. 

Essentially, refactoring involves reflection, understanding, and trial-and-error tinkering with a system within safe spaces and times, in ways that are invisible to the external world. When it's important to take specific areas temporarily off-line, it's done in a planned way that provides detours (preferably invisible) for external needs. The rest of the system continues to function.

Complex systems will always be flawed, just like grass will always grow back when you mow it. I will always be flawed, and I am always growing. I am as complex a system as they come. When I look back over 2010, I realize that I am becoming more skilled at refactoring myself. I create spaces when I need to go offline. I don't try to tackle the whole system at once - I prioritize, and take the time to really understand. All my processes are inextricably linked and hopelessly tangled, and I am untangling the worst ones, often freeing whole sections by undoing a single knot. I am tinkering daily.

How?  Exercise. Music. Yoga. WRITING. Present play with my kids. Intimacy with my husband (this doesn't just mean sex). Connecting on Twitter. Reading outside my zone. Conversing with my universal, sometimes out loud. Laughing. Appreciating. Contemplating the abundance I have in my life, and my outrageous good luck before I go to sleep. 

How? Crying. Freaking out. Facing my own dark pockets where hatred might find a cool place to grow. Feeling despair. Feeling afraid. Feeling futility. Letting my universal be sad with me and comfort me. 

How?  Making a little time and space every day, sometimes throughout the day, to feel deeply and think about what I'm feeling. Checking in with myself regularly. Creating reminders that help me to stop and remember who I am. Checking in with my touchstone people when I start to crumble. 

How? Giving myself permission to be just as I am, and encouraging myself to specific, achievable improvements. Failing, and trying anyway.

How? Practicing presence. Practice.

I'm reprogramming myself, slowly, often painfully, to keep my mind more open, my heart more open, my skin thicker and my core clear and centred enough to withstand the assaults of unskilled "users." These are just a few of the "non-functional attributes" that I want to embody in my system architecture. I'm finding my dead-end paths and disruptive processes, and slowly picking away at removing them safely.

Refactoring tries to make the system more resilient and extensible, easier to read, and more clear about its individual decision points and functions, without impacting functionality. It's a bonus if refactoring improves functionality. 

I always did want to go for the bonus marks.

(the word for 2011? Still thinking...)