00:00:24.849
My talk today is titled 'Even Hemingway Wasn't Hemingway.' It details the creative process and reflections on writing.
00:00:27.650
At a happy hour last night, many people asked me what I would be discussing, leading to some interesting conversations. I would say, 'Well, you know, it's a talk about refactoring,' but then I realized I never really explain how to refactor!
00:00:34.190
Instead, I tend to discuss the types of refactoring, what they can offer, when you might want to do them, and what they can and can’t do. However, my primary goal is to convey why you should be excited to refactor.
00:00:43.670
I want to frame this discussion by looking at what real writers do. Writers frequently change their words, and it's a part of the writing process. They produce multiple drafts to hone their work into something shorter and more concise.
00:01:01.100
Writers edit their work, but honestly, I’ve struggled to understand the concept of editing, despite having worked as an editor. Writers rewrite their pieces, which is a more descriptive approach. If you were to Google this concept, you might find the quote from E.B. White: 'The best writing is rewriting.'
00:01:10.580
Interestingly, when I search for Hemingway and drafts, I come across numerous results about how valuable rewriting is for writers. The act of rewriting sharpens their message and helps clarify the story they are trying to tell.
00:01:56.560
Ernest Hemingway was very blunt about first drafts. If you look at anything related to him, you often find a consensus that his drafts were not perfect. Hemingway is known for his precision, terseness, and clarity, qualities I also aspire to achieve in my own coding.
00:02:31.720
He was open about the effort it took to develop his style. He never claimed to be a magical unicorn who could produce perfect first drafts and be done with it. Some of you may ask why I keep drawing parallels between writing prose and coding.
00:03:06.889
It’s essential to recognize that coding is also a form of writing. While it may seem distinctly different, both involve storytelling. Your code tells a story, whether it is a simple one or a complex narrative with various branching paths.
00:03:25.310
At the time I captured this screenshot, the Rails master branch had around 53,000 commits, which might now be up to 54,000. That reflects a multitude of drafts, each one being a developer's attempt to correct or improve the underlying story they've created with their code.
00:03:51.139
Although we may call it 'refactoring' instead of 'rewriting,' the essence is still akin to rewriting. By embracing the concept of coding as writing, we can grapple with the idea that our initial drafts, just like those of writers, are often lacking.
00:04:13.159
This acknowledgment leads us to an important understanding: if coding is akin to writing and if even acclaimed authors like Hemingway have struggled with drafts, then we too should accept our early attempts at coding may not be flawless.
00:04:58.480
Like genuine writers, we will need to rewrite our code. And as we engage with our code, we’ll gradually learn the story it endeavors to convey. The process of refactoring and rewriting improves the clarity and intent of our code.
00:05:39.200
However, while real writers can sometimes publish their work, programmers' code is never really finished. It continually evolves as long as it is operational. That means your code will always be in draft form, constantly being refined and improved.
00:06:20.600
This ongoing process emphasizes the necessity of honing our skills in rewriting, even if we choose to label it as refactoring for the sake of comfort.
00:06:50.260
Simply telling someone to 'get better at refactoring' lacks actionable wisdom. It’s akin to advising someone to learn how to dance by dropping them off at a concert hall and saying 'good luck.'
00:07:40.790
The topic of refactoring is immense, with numerous approaches all having distinct goals. Each method is independent and should be selected based on what you are trying to achieve. Let's explore two general families of refactorings to see what they can and cannot do.
00:08:40.330
Take, for instance, a common approach for clarity. When we revise prose, we often cross out unnecessary words, replacing them with ones that convey messages more clearly. The same applies in programming, where we can improve variable names to reflect their functionality better.
00:09:56.970
While aesthetic changes enhance comprehension, they don’t alter the core narrative your code conveys. In this case, we might stylistically rework the variables to make them clearer without changing the broader functionality of the code.
00:10:12.400
The story remains unchanged, even if the code reads more smoothly. These stylistic refinements, often referred to as 'litter pickups' or 'comprehension refactorings'—terms coined by Martin Fowler—serve to clarify the code’s intent without altering its plot.
00:10:59.000
To that end, we should consider how much of our time gets allocated to improving code aesthetics versus actually changing the code's functionality. In my experience, a significant portion of my work revolves around modifying the story my code tells rather than merely refining its style.
00:11:43.680
To achieve that, we can return to Hemingway and investigate his revision process. His rewrites involved major structural changes; for example, he wrote multiple chapters before realizing he needed to change the main character, which required him to discard his earlier work completely.
00:12:17.560
This detail about Hemingway illustrates a crucial point: allowing flexibility in our narratives. Just like Hemingway discovered his story through several drafts, we, too, uncover what our code needs to express through cycles of development and revision.
00:13:11.050
The process serves as a feedback loop: by engaging with the code, we learn and adapt our understanding of the story that our implementation is attempting to convey. From there, we apply the insights we've gained and continue this iterative process indefinitely.
00:13:59.740
For coding, this drafting step is about creating multiple iterations of your code—initial drafts may be sloppy, yet they pave the way for refinement. The subsequent stage involves learning about your story, whether through encountering bugs, receiving feature requests, or noticing usability hurdles.
00:15:20.430
The critical step is applying what you've learned until you reach a point of improvement in your code. This process is transformative, and it's documented in numerous resources that may be gathering dust on your bookshelf.
00:15:54.060
Returning to the lemur renaming example, after understanding user requests, we might adjust our code to include a feature that allows users to rename their lemurs based on their preferred names while retaining defaults when needed.
00:16:54.000
Thus, even with seemingly minor adjustments, we can shape the narrative our code tells by modifying its underlying structure. While we may not realize it at first, these structural changes amplify the breadth of what the code can do.
00:17:32.300
In conclusion, crafting code is an iterative drafting process akin to writing literature. Like every renowned author, our path forward involves ongoing drafts, rewrites, and gradual improvements.
00:18:18.000
My contact information is available, and I want to extend gratitude to those who supported me in preparing this talk. Its format evolved far beyond my initial expectations.
00:18:39.170
I appreciate your time and attention. If you have questions, feel free to approach me later. Thank you!