Keep America Great

Days before this election season came to an end, I shut people out who tried to talk to me about it. I voted, I have strong political opinions, but emotionally, I couldn’t handle the discussion—even though nearly everyone attempting to instigate opined the same beliefs. Anxiety washed over me.

And as the election results came in, and I watched, I broke down and cried. I’m not angry. I don’t like Donald Trump. I don’t like Hilary Clinton either. I don’t like Gary Johnson. I don’t like Jill Stein. I didn’t want any of them leading our country.

But I voted for one of them because I felt victimized by another,  and there’s a lot of emotional weight that comes with that when you desperately are clinging to a dream of never allowing yourself to be a victim and when you’re doing so out of utter sadness that someone has established an entire campaign to make both you and people you love and respect feel that they don’t matter—that the country they live in is not “great” with them in it.

When Joel and I decided to try to have a child, a big part of my own reasoning for that was that I wanted more people like him in the world. He’s kind-hearted, patient, optimistic, calm, and loving. He rarely loses his temper and even though he can certainly get in funks, he tends to find good in most things and reframe his views when he can’t. I’m not so great at those things, but I am extremely passionate, compassionate, loyal and determined and those are my positive contributions to the world. I figured a good blend of all of those qualities in one person would be a gift. I wanted more positive people in the world.

But I was fearful because I kept thinking “How can I bring a life into the world on the verge of a political administration led by such a hateful, terrible person?” And how can I keep my head high, as an adult, in light of that?

These fears have been realized. And are now struggles I—you—we—he—will face.

My son will be born into a world where hatred sometimes wins and the outcome of it is harsh and dark. And I was born into a world where hatred sometimes won. And some of the people I admire most also lived and fought in a world where hatred dominated. They didn’t let that hatred paralyze them. They used their voice. They yelled. And I think that’s important to remember right now. This is not a dismissal that bad things have happened or a lie that it hasn’t made me cry or left me feeling bitter or saddened. It’s a reframing of an outlook, because honestly, that’s all we have right now.

This isn’t party affiliation vs. party affiliation. These words are spoken from a place of love vs. hate. Today I will spread love because that’s all I can do.

You’re still you. And you still matter. You will continue to matter. You don’t deserve to be “othered” or victimized. And if there’s ever a time to fight, it’s now. Fight to set an example, love each other to show that love is what matters. Don’t let hatred permeate inside of you and make you cold too. You’re loved and your love is honestly the thing making America great. Don’t let some jerk steal that sentiment.

Como siempre.

While packing up Joel and I’s apartment to move into the house that we just bought in preparation for our soon-to-be-here son, I found a paper diary of mine that I started in February 2012. It was all about a flakey drama-filled soap opera of a relationship I had been in. I started re-reading it out of entertainment of how silly it was going to read, but I noticed that as time passed, it didn’t really read that dumb at all. It read like a young adult figuring out who they were, what mattered to them most, and where they wanted to be. The very last entry was conveniently exactly 3 years ago on September 6, 2013, written from my apartment in Austin.

I continued to journal after this, but I guess for some reason, it just felt back then like this was the appropriate place to end the chapter on this part of my life so I could run gleefully headfirst into the next part. And while I’m sure that wasn’t really deliberate of me, I’m really happy that it turned out the way it did:

September 6, 2013

Heading to visit family today. I promised my mom that I’d visit and told my cousin that I would stop by and visit her newborn son, Blaine, but my true motivation here, aside from my feet once again shuffling relentlessly with wanderlust, is to go see Joel.

I’m not sure how I feel because after he left Austin this spring–after I left for Croatia, I was left with a sense that he wanted more than I did. And I like him a lot but I don’t know if I’m ready to be liked at a time in my life where all I’ve been doing is letting myself disappear over and over again. I don’t know why I am doing anything that I am—all I know is that life is good and for once, ever, good is the one thing keeping me on course.

Chris invited me to visit Colombia but I said no, which is strange of me because I used to love him and I think in some other time and place, I would have said yes, but those circumstances are neither here nor there—I’ve changed. Now he is going to Singapore and I don’t know if I will ever see him again. I like to think that the situation is more in line with other fragments of my past and that my whole relationship with him isn’t just recycled bits of Bob Dylan’s “Tangled Up in Blue,” because I just don’t have the patience for that sort of drama.

Maybe it’s just age. Maybe it’s just my asceticism reflecting on me. Because I can’t even help but feel that any more time I give it, the more I’m wasting the only life I have.

I wrote this just a few hours before Joel and I had dinner together, before having a great evening, and before even having even the slightest inkling that the person I was going to see was someone I’d completely fall in love with.

It’s been 3 years since this day and some moments in those 3 years were spent at interminable crossroads where I felt conflicted urges to both book 1-way plane tickets to remote locations but also contrarily take the greatest journey I could think of, going literally nowhere and being forced to face my life’s own greatest challenge: myself in the context of stability.

And although I stubbornly booked those journeys to Mexico City, South Africa, Iceland, Argentina, Denmark, and so on… Joel managed to play to my whimsy and either follow along, or let me do my thing and just go my own way.

And in those times he wasn’t there, I felt tethered enough to his good that, as I sat on airline websites seconds short of clicking “make reservation,” those 1-way tickets turned into round trips that safely brought me back. It’s hard to stay away too long from the things you love the most.

Although technically we’ve known each other longer than 3 years (little known fact: We probably would not be together if not for GitHub and SimCity for Super Nintendo) and had a bunch of wacky adventures as friends sky-diving and wandering aimlessly through honky tonk dive bars together beforehand, today is 3 years since we’ve been together.

And with a Tiny Human kicking me relentlessly in the gut as I type this, a new house that is actually our own, and recently getting engaged in the backyard of said house, it felt just as good a time as last time to dog-ear the page and say, “Hello!” to the future, and also fondly remark that although it hasn’t always been pretty, it’s always been pretty good: como siempre.

It certainly doesn’t feel like 3 years when it’s spent with someone I really love who’s been there with me through everything good and bad, but lately mostly just good.

I Hope My Child Isn’t a Jerk (or Why Learning Empathy Starts in the Womb)

I’m currently 16 weeks pregnant. Around this time in the pregnancy, my little one’s ears are fully developed and are slowly turning on. He or she first hears the sound of my heartbeat and blood pumping and very gradually begins to hear me speak. Shortly after will follow the muffled hushes of their father and other people around me.

Even though I know my words can’t be understood this early, I can’t help but be self-conscious. My tone will impart happiness, sadness, anger, and a range of emotions that I don’t yet want permeating into the safety of my womb. And yet the world goes on around me, and I have to harness these emotions while conceding to my child’s personal fragility. That is the start of motherhood, scary as it is.

giphy

Being self-conscious of my voice means being more aware of how I talk and interact with others. I have a much broader span of empathy than I have ever had before and yet at the same time, if there was ever a time to yell loudly and proudly, it’s now. I don’t want my baby to be a jerk, and I want to lead by example in being a kind person.

Here is what the early days before being a mother have taught me about my voice and your voice and how collectively they work together, in a series of minor vignettes.

When I sing praise, I need to sing a song not a verse.

It’s important to thank people for things. Expressing gratitude is seen as a formality or a lost art that gets glossed over in a fast-paced society. But it doesn’t stop at saying “thank you.” It’s important to express why you are saying thank you and express it in a way that is sincere.

anigif_original-grid-image-13114-1415388845-12

I recently called a support line for an online product I had used trying to get some old information that had likely been archived a long time ago. I wasn’t even sure if the data was still there; it was just a shot in the dark.

The man I spoke with was so persistent in trying to find for me what I was looking for, and each time he failed in one place, I thanked him for trying before he continued looking further. It was an exercise in futility.

When we came to a dead end, even though I hadn’t gained anything, it was still important to say to him, “That’s okay, you really went above and beyond as a customer service rep. I had no expectations that you would find anything and it’s admirable that you tried as hard as you did. I’m definitely not upset about years-old data that no one promised would be there forever. You did an awesome job looking and I am appreciative of the amount of time you put into that effort!”

It’s important to tell people why you’re pleased with what they’ve done, because that feedback is important, especially on a microtransactional level.

I want my child to know that feedback loops are an important part of life. I don’t want to tell my child “you’re so smart” because they don’t really get value out of a passive compliment like that.

I want to tell my child, “I think it’s awesome that you studied hard and did really well on that test! Keep it up!” And likewise, when my child does something less than subpar, I don’t want to admonish them for it. I can only hope in those moments, I say, “Uh-oh! It’s okay! We all have moments where we don’t get everything right. Let’s review this thing you’re having trouble with and keep trying!”

I’m human, so there’s chances I won’t ever do this with perfect grace, but it’s important to get practice on other less tiny humans while I can.

When all I hear is the echo of my own voice over yours, I need to shut up.

I’m a senior developer for Treehouse. Some level of leadership comes with that job role, and it’s often very organically created and self-fulfilled leadership. I am no one’s boss, I’m not a manager, but in some way I serve as a leader. Yet, I sometimes forget that being a “leader” has very little to do with authority and much more about empathy and humanity. Trying to be a leader is more than barking at others, it’s about hearing and listening beyond my own thoughts and opinions.

980x

A few weeks ago, I joined a new work team where initially I was the only developer on the team. I had really liked the team I was on previously and felt a real sense of camaraderie with everyone, so it was bittersweet to disband and start anew with other people.

I struggled for a few moments in my new team because I wasn’t letting myself personally relate to all the non-developers I was now surrounded by. They didn’t think the same way as me, their priorities and outlooks on things were different from mine, and I found myself alienating myself from them by making comparisons that were full of contrast. I think this is a common place to be when put in a new environment with new people.

I was trying to define my place in a group by trying to see how we were all different rather than how we were alike, and that’s not what a team is. Eventually, another developer joined the team, which I was incredibly happy about. But despite that, I saw that there was a growth opportunity for me in understanding other people better.

So I started looking for opportunities to do this. I had to stop thinking, “Why doesn’t this person understand my point of view?” and instead start to think, “Why don’t I understand this person’s point of view?”

I am starting to appreciate other people a lot more and see human qualities in them that I missed before from changing my perspective. I worried so much that people viewed me as a robot that I failed to see that I was viewing them as robots. And that’s not fair of me.

I want my child to see by example that life is not all about working towards the end game of getting what you want. You may not get everything you want all the time, but if you invest in other people and other people’s happiness, you’ll generally be happier as an outcome. Sometimes this is just a simple matter of compromising, other times it’s making personal sacrifices in pursuit of doing the right thing for others when they need it.

When I’m nice and you’re not nice, I still need to continue being nice despite your behavior.

I recently had to contact a former employer over what was potentially a historical accounting error on their end. On one hand, I should have caught the error as it was happening, but on the other, it shouldn’t have happened to start.

Hoping to get a better understanding of what had actually taken place so I could rectify the situation, I politely e-mailed someone from that company, explaining the situation and requesting more information.  I was fairly tactful but the response I got was near-vicious, not helpful, and made me cry.

The response I received was quite inappropriate. I was stunned. How had I come in so soft and been retaliated at so fiercely?

84413729

Sitting at my laptop, I couldn’t stop crying. I didn’t understand how I could be so polite and understanding about a potential error made, and have them be so rude to me in return.

What would my son or daughter read of me upon witnessing an interaction like this? Is mt kindness a flaw? Is bullying the only way you can be assertive? And is crying when the world is not fair to you a sign of weakness?

All I can do here is reframe. One person being an asshole should not be representative of my whole outlook on what I can expect out of being, or trying to be at least, a good person.

Me being a nice person and you being a raging asshole are mutually exclusive behaviors. My kindness didn’t provoke you to act like an asshole. You being an asshole provoked you to act like an asshole. And that’s what this person was to me.

anigif_enhanced-8501-1414925508-7

I will continue to assert my voice, kindly and calmly but confidently, regardless of your unwillingness to reflect the respect I extend to you. That is the role model I want to be for my child. I can’t control people around me and sometimes those people will serve as horrible barriers.

Regardless, I will not return abuse with abuse or violence with violence. And it’s important that my child see, again, that it’s important to live by your principles even when others choose to take advantage of them.

My tears and laughter are part of my voice too.

I cry sometimes in what others might deem completely inappropriate situations. I currently could blame that on pregnancy hormones, but I won’t, because the reality is that I have always been this way on some level. Other people sometimes say this is the result of “really feeling things strongly.” And at some point, I considered that maybe it was a flaw to feel strongly enough that I cried. Maybe it prevented me from rationally or logically approaching things during moments of problem-solving. Maybe crying wasn’t very adult-like of me. And likewise, maybe laughter was a sign of immaturity.

Of course, anecdotally, I have never been in a situation where I opened myself up to being vulnerable with another person–whatever the setting–and failed to walk away from it feeling a stronger connection with them. Plenty of people, people I would have never expected, have seen me cry, and that is okay. These people do not need to be my best friend, parents, or life partner. They just need to be humans that understand what it feels like to be overcome with emotion.

anigif_enhanced-10155-1455225031-8

Although this is not a story I like to focus on exceptionally, when I first started my job at Treehouse, I had an enormous miscommunication with Ryan Carson, the company’s co-founder. I was sitting in the airport in Portland, flying home from an engineering team meetup, using some of Treehouse’s internal communication tools. I hadn’t met Ryan in person, so I couldn’t really pin down his personality or his voice, and so I misread something he said to me. I read it over and over again, but in that panic, I kept misreading it and broke down in tears. I sobbed the entire rest of the way home.

When I got home, I reached out to the person who was my mentor at the time (Treehouse was a flat company then, and there we no managers) and asked him what he would do in that scenario, but he wasn’t really sure either in the moment, but I could sense he felt horrible too just being involved and advocated for me where I was too upset to do so myself, and I’ve always been incredibly thankful for that.

I admitted that I was crying and hadn’t stopped crying since I saw the comment. And how awful I felt. I was already in such a negative place that I knew the only thing I had left to connect me to the world was how I was feeling.

anigif_enhanced-buzz-27951-1389480918-24

As you might have guessed, this was all a huge misunderstanding. It was explained to me what meaning had actually been intended and of course, once Ryan realized that there was some other way to read it that he never had even thought since it wasn’t what he had intended, he felt horrible and was profusely apologetic.  It’s really funny to me now, today, but for that one day, it felt like my world was coming to an end! For a while after that, any time we ever talked, he’d apologize again, and I’d laugh, because really, it wasn’t a huge deal anymore.

Although making myself vulnerable in that moment made me feel terrible, I don’t regret it. It was smarter of me to quickly share with others how upset I was so that the miscommunication was quickly resolved, and is laughable in hindsight, given I’ve never had anything but very positive interactions with him since then.

I want my child to know that crying is a natural outlet for emotion and shouldn’t be suppressed if it’s just where you happen to be at the moment. Sometimes you just have to get all snotty and gross for people to truly see who you are and what your intentions are. This doesn’t mean you’re weak. It means you have a heart.

I am the first person my child will ever know and I certainly hope that just as much as it can hear my heart being while it’s in me, it knows that heart is full of love for it and others.

On The Balance of Giving and Taking and Gratitude

Give What You Don’t Need

In spring 2013, I spent several weeks living in Belgrade, Serbia. Near my little neighborhood was a camp of Romani people (what a lot of people refer to as gypsies). Every day I would walk by this wall that was labeled “Daj šta ti ne treba.” In Serbian, that translates to “Give what you do not need.”

The wall’s contents rotated out on a daily basis. People left things. People took things. It looked like junk to me, meaningless, valueless goods. But individual items on that wall had purpose and function to someone else, whether it helped them achieve some task or just kept their spirits high in a rough world.

When You’re In So Much Darkness That You Can’t Understand Good from Bad

Several years ago, I entered a dark world I never thought I’d come back from. I’ve written about it before, in a different light. I was the victim of identity theft committed by a close family member. It took me a long time to sort out the emotion of betrayal. But underneath that emotion is a darker one that even today drags behind me and haunts me. Sometimes when I turn around, I catch a glimpse of my past: a frail shadow hiding around the corner eyeing me suspiciously. I eye her back suspiciously. She is a part of me and she makes an impact on how I connect with others.

Identity theft is a painful life experiences that often yields Post Traumatic Stress Disorder. I wouldn’t wish it on anyone. Years after it has happened, I still have panic attacks, flashbacks, and moments of self-doubt. The very core of my being is shaken and I have very little trust in bureaucracy as a side effect. I’m paranoid and when things go wrong, I often expect the worst—because I never want to be so blindsided like I was then.

But from dark holes sometimes there is a shining light from outside. And as a human, I recovered with profound amounts of emotional scar tissue, largely due to my own unwavering persistence, but also with incredible amounts of gratitude showered over the people who surrounded me at the time. People who, at age 23, I didn’t understand how much I was indebted to their kindness.

When There’s Nothing Left for You To Give and Only Plenty to Take

A major part of resolving my identity theft was hiring a lawyer to help me prepare a fraud affidavit. In cases of identity theft, this typically includes collecting circumstantial evidence from around the time(s) the crime took place. In my case, one of these steps was collecting legally binding documents that contained my signature. While this might sound like a simple task, it took me several months and involved a significant amount of sleuthing, exhausting phone calls, and… again… unwavering persistence.

Because I was so young, there just weren’t that many legal documents with my name on them. I was only listed as an occupant on my lease, not a lessor, and none of the utilities were in my name. And because the crime had taken place anywhere from 7 to 2 years prior and again, I was very young, I didn’t have anything that old laying around. And it was really hard to remember anything I had signed from 2 or more years ago.

I cried a lot, but I realized there wasn’t significant value in crying. It did nothing for me and put me no closer to resolution. And that sense of clarity was what kept me moving and kept me thinking.

I reached out to people who I had not been in contact with for years. The circumstances in which I was reaching out to these people were so depressing and I hated myself for being a burden on their time.

I reached out to former employers requesting any signed employee records of scans of signed checks. I reached out to my high school principal to see if she could think of anything. Of course, she remembered me, but she had nothing to help. There were small victories. And each time I finally retrieved a long lost signature, it was like finding a Golden Ticket for the Willy Wonka factory tour… only I couldn’t stop at one.

I was really close to giving up and accepting that life had chosen to screw me over, when on a whim I contacted an old college advisor. We had to fill out advisement forms regularly, but I was sure that was something that the university would send to the paper shredders on an annual basis. A week went by and I hadn’t heard from her, so I assumed that was a dead end.

And then one day, as I sat in my office, drinking coffee and feeling existentially dead, I saw I had a new e-mail. She had replied. She had been in surgery the past week and had only just seen my e-mail the night before. Still under the influence of post-operative drugs, she still managed to make her way to her office that evening… dig through so many old boxes, and find my advisement form from years ago. Within two hours, she was at my office with a copy.

And that was it. I was able to go see my lawyer, finish my affidavit, and take the last steps towards resolving what, by then, had been a six-month long journey.

This is what life is and this is what good people are. We live in a world that is click-bait-oriented and constantly one-upping each other, but at the end of the day, the things that make the hugest impact are small acts of kindness.

Many acts of kindness added up to save me. What if my boss at the time had not been empathetic to my situation? I juggled a large portion of my workday between doing work very efficiently (more so than normal) and using the leftover time to make phone calls and visit the police and my lawyer.

What if the person who recommended my lawyer, an older client of the company I worked for, hadn’t? I don’t know what I would have done.

What if the person I had been dating at the time had just decided to let me lay in bed and whimper helplessly rather than give me the tough love I needed to get up and face the world?

What if my parents hadn’t raised me to be a strong, independent warrior of a woman? I’d have crumbled.

What if this advisor had decided to stay home and peacefully recover from her surgery? That would have been completely reasonable on her part, and maybe I’d have gone on to find some elusive other signature, but maybe I wouldn’t have.

When It Comes Back to You, Don’t Forget and Don’t Fight It

This past week, someone asked me to do a favor for them that I found to be extremely inconvenient. I was really annoyed because they didn’t express to me any “thanks” or respect for my time. And it broke me down into a frustrated mindset that I am always giving and yet it feels like the world is always taking from me. And the reality is that I just wasn’t thinking or being truly appreciative of all the times that people have given to me and I had forgotten or failed to see their efforts.

Every day you are given opportunities to do small, seemingly inconsequential things that might be life-changing to others. And maybe, in doing those things, the people who you do them for won’t be able to express gratitude in the moment for them. You might be tempted to think, “Gee, thanks.”

Years down the road, when the people you give these inconsequential things to or do these kind gestures that seem so small to you for, and they are hopefully in a better place, they will remember.

But it doesn’t matter if they do or not. The important take-away is that you understand the balance of giving and remembering all that has been given to you. Your life is an accumulation of things you do for yourself, elevated by an uncountable groundwork of little, beautiful acts of kindness from everyone around you.

Give what you do not need: whether that’s junk, money, or when you have nothing else to give–even your spare time. Someone needs it. And one day you will too.

On Software Development and Fuck-Ups

I posted on Twitter earlier today something from Timehop. For whatever reason, historically, around April 14th, I just seem to always fuck something up. I don’t know why. There’s nothing significant about that date to me, but for three years in a row, I have managed to do something every year. Possibly for more than just 3 years, but maybe then I just sheepishly hid in a corner then.

I reserve the word “fuckup” for things that have painfully huge aftershocks. For perspective:

In 2014, shortly after joining Treehouse and implementing a way for our support team to issue refunds through our admin tools, I shipped something to production that completely broke that refunding tool for invoices paid via PayPal. This was humiliating for me. I was sure everyone I worked with thought I was an idiot.

In 2015, I upgraded a large portion of our billing library to a new version of Braintree’s API and while doing so, added a client-side validation for postal codes that completely blocked out British people (fortunately we noticed this almost immediately). I felt so incredibly awkward and frustrated with myself. How dare I screw up a regular expression? Who in the history of the world has ever done that?

In 2016, I accidentally hit backspace on a portion of a WHERE clause in a query and, as a result, ended up sending an e-mail to a large number of people who shouldn’t have received it. This bit me hard. All it took was a single keystroke. After reviewing the query multiple times, I failed to review that one. last. time. before hitting “export to CSV.”

If you look at those three stories together, you might decide I’m a really shitty developer. Those are very painfully embarrassing mistakes to make, but I won’t deny that I’ve learned something from all three of them.

I’m in my 12th year of my career as a software engineer and I share these stories because it’s taken me 12 years to understand that owning your fuck-ups is more valuable than trying to save face. There is something suspicious about a person who has made it over a decade without fucking up. All of the developers I respect the most have a story or ten. They laugh at them in hindsight. And so do I. I don’t think, “what a dumbass.” I think, “Oh man, yeah, I feel you.”

I thought for a very long time that if I could stealthily fix a problem without outing myself, that I should. I feared the shame of people losing trust in me to be able to do something correctly. I feared that they would talk about me behind my back. That they’d be angry with me. I’m a very sensitive person and very self-critical already, so making mistakes can take a huge personal toll on me, so much that I sometimes will cry because I’m so embarrassed.

I can’t say I don’t cry when I screw up, but I’ve since learned that people will trust you more if you are open and honest about your mistakes, especially when you are earnest and heart-felt in your mission to remedy what you’ve done wrong. Would it be nice if you hadn’t made a mistake? Sure, but good luck with that.

So, I’ve recently resolved myself to a few different things. When I know I’ve screwed something up, I:

    • Immediately notify other people that I feel should know.
    • I take a step away for a moment and clear my head. If I’m distracted, I’m not going to be able to fix the problem.
    • I make an action plan. I think it’s easy to panic here and try to fix something super quickly and instead stir more trouble into the mess.
    • I document the problem. Very thoroughly. I try to use laymen’s terms so that anyone can understand what has gone wrong.

I reflect back on my mistake. It’s mine. In a year’s time, it’s going to be a funny story. Right now, it’s a moment to learn how I can prevent it.

Value your fuck ups. They make you who you are.

What the Hell Should I Stub in My Tests?

Until very recently, one of my job responsibilities at Treehouse was serving the role of a mentor to a junior developer. It was a role that I appreciated because it sometimes called to question my own understanding of things that I have always assumed I knew as someone with over a decade of experience.

And sometimes I know things without really knowing why I know those things, and that makes a spectacular challenge in helping educate someone who is eager to learn–to the extent that I sometimes had to relearn things I already know, this time with more intellectual foundation.

Another of my job responsibilities is attempting to make significant improvements to our codebase at a higher level. Not long ago, these two things collided when I decided to try my hand at cleaning up our test suite, which can take upwards of 15 minutes (with parallel pipelines!) to run in CodeShip. That’s a far cry from where we were a few months ago, when our test suite was finishing builds in a speedy 3-5 minutes.

Beyond feature tests, which are meant to be literal end-to-end tests, I noticed that it’s not always obvious to developers when you should stub objects or calls to methods in unit tests. And as I had a discussion with my former mentee, Monique, about it, I realized it’s sometimes not even clear to me what my principles are on the subject sometimes.

What better a way to document your principles than by deconstructing them? Here’s some of my principles, that you might be able to relate to.

Unit tests should adhere to single responsibility patterns

If your class adheres to single responsibility patterns, why wouldn’t your tests for it? This should be a no-brainer.  Pretend you have a service object called SignupUser. Its purpose is mostly clear in its name and it might be obvious to you that it’s going to use instances of other classes in fulfilling its purpose, namely User. This is contrived, but bear with me.

This is such a simple class but you can see that this method is creating a User object and subsequently making calls to a mailer and an event-logging system. As the app evolves, it may grow as well, but generally the things it does are limited to this particular interaction.

Who knows what’s happening in the event logger or mailer? You shouldn’t need an awareness of how other class’s methods work when you’re building a unit test. The unit test should test the behavior of the class being described and so it is fair game to not extend your unit tests to the behaviors of those classes. The methods for those classes should be tested within their own respective unit test class.

Another old favorite is when a controller calls a method on a model and the controller is tested against behavior that took place inside of the model:

This is testing behavior dictated by Item. Simple behavior, yes, but you could just set an expectation that the method was called, which stubs it in the process:

Let’s be clear here, though: This approach to testing walks a really fine line when it comes to ensuring full test coverage. I showed this example to my boyfriend, also a developer, and we almost broke up over it. The police even came out to our apartment to break up the ensuing fisticuffs. I mean not really, but what I’m getting at is this: you may have your own opinions here. And that’s cool. As long as you know why you have that opinion and that you’ve decided that what you write is the best fit for your test! Capisce?

Don’t test the framework you’re using.

Occasionally, I come across unit tests for ActiveRecord models that test against the behavior of Rails and ActiveRecord. This isn’t necessary and it can actually lag your test suite’s runtime because it is guaranteed to produce database transactions.

For example, you shouldn’t need to test for persistence on creation of an ActiveRecord model. If you have a valid model, it’s implicit that it will properly be saved. However, behaviorally, it’s fair game to test your validations.

Bad test:

Good test:

In a similar fashion, it’s also not uncommon to see record persistence being tested within a controller test:

anigif_optimized-12950-1454940032-1

This is completely unnecessary and testing that the controller makes a call to save should suffice:

Don’t Test Against APIs

This came up during a conversation with a friend of mine. He was working on a side project developed in Rails and was a bit green with test-writing and was asking for my opinions on a few things and somehow it came up that he wasn’t mocking requests to an API he was using.

This wasn’t for any “dumb” reason—he just wasn’t sure how you were supposed to account, in your own application, for changes in response objects from third party APIs. And well: you shouldn’t. That’s not on you. But I can understand that that is a hard answer to swallow (the real answer, in my opinion, is that any API that changes so drastically that it breaks your app without bumping version number is a really crappy API and you should consider not using it).

Disable everything by default.

I appreciate gems like Webmock, which allow you to universally prevent all outside requests in your test suite. Not just because they can lead to slow test suites and oh-so-joyous timeout-related failures, but because well, some APIs really suck.

Recently in my job, I was reviewing a pull request for someone and noticed something curious. He had added an initializer which disabled all outbound requests to this API in development or staging environments. I immediately questioned that. “The API doesn’t have a sandbox, just production.” And I grimaced.

But imagine a world where Webmock didn’t exist and someone forgot to stub a request and suddenly there it is: test data in your production environment. Gross. What a nightmare.

Spec helpers can be your friend.

If you’re using Rspec, consider building spec helpers for mocking frequently used API calls.

Mocks and stubs for API calls can be verbose. And, if you’re in a position where you have to upgrade which API version you’re calling, can be a real nuisance to update every place in your test suite where you’ve mocked response objects.

Last year, I had to switch Treehouse’s credit card payment processing library to use a newer version of Braintree’s API. We had quite a number of tests that involved credit card transactions. And what a sigh of relief I breathed when I realized all of these stubbed requests were centrally located in a single spec helper like so:

With this, I can simply call stub_successful_cc_purchase from any test and know I will reliably get that result. If Braintree were to change their API response for their sale transaction endpoint, I could just update this one line of code instead of having to update hundreds of tests.

Don’t stub because you’re feeling lazy

Look, I know how it is. You’ve got a deadlined PR open. And you just did. not. have. time. for. specs. So you throw together some half-assed specs like a house of cards. There’s a difference between stubbing for good reason and stubbing literally everything, including private methods in the same class.

Terrible contrived example:

Your tests should cover your private methods in the same class. Don’t stub those. Doing so is like leaving a time-bomb for the next person that works on the code. Or leaving them to defend themselves from a roving pack of football players or whatever.

84413715

Ignore my principles and establish your own through deep introspection and personal experience

The cool thing about being a developer is that for something so logically driven, it’s highly subjective. There’s no one right way to do things. You might hate my principles. And I don’t care. What I do care is that people establish reasons for the things they do and feel comfortable defending those decisions, using their best judgment to write quality code.

dont_care_lol_bye_dolphin

30-Minutes-a-Day Development or How Not to Burn Out on Your Projects

One thing that destroys me as a developer on single-person projects is over-enthusiasm. That is, I have an idea, I get very excited about it and the following things happen:

  • I dedicate a night or a weekend to executing on it.
  • In the course of that time, I finish roughly 50-75% of the work on it.
  • The next day or next week comes and I don’t have time to finish it because my schedule is full of other things.
  • I burn out and abandon it.

This all changed when I first decided to start my side business, Creepy Postcards. If it hadn’t, I wouldn’t be calling Creepy Postcards my side business.

Creepy Postcards is a largely offline business. Customers fill out a brief form giving me information about a friend or family member, I exercise my creative writing prowess, we converse a little bit more, and I ultimately mail a postcard through the United States Postal Service.

The last thing I want as a business owner is to waste an inordinate amount of time working on a web application. That’s why I took to single-owner project planning.

As a developer, it’s easy to associate project planning with bureaucracy. It’s something I experience in my day job and although I know it has some value, I still loathe the downtime, the calls, the slow pace, and the feeling of a million sighs passing through me as I think, “I could be using this time to be productive.

It’s especially hard to see the value of it in my side project, but that’s where it’s more valuable. In my one-person business, I don’t have product managers, data scientists, or designers. I need to list out what features I want to add now.

The 30-Minute Task

In order to be quick-moving on a project, I need to break features down into short tasks, tasks that I can resolve in 30 minutes or less. Tasks that keep me actively working on the project, but allow me to walk away from it after that time has passed.

I hate project management tools like Pivotal Tracker. I hate the concept of something relative like “points” driving the meaning of a feature, for a couple of reasons:

  • As one of my coworkers, Ryan Manwiller, pointed out once: 1 point to you does not necessarily mean the same thing as 1 point to another person.
  • There becomes a problem with “inflation” of points where the value of 1 point cannot be broken down any further. You can have 2 tasks, each worth 1 point, and one of those tasks could take 15 minutes while the other could take 3 hours. If someone is dependent or blocked by one of those tasks, “1 point” does not communicate to them when they can expect to become unblocked by your work.
  • When a task hits an unexpected bump, which is fairly typical in development, it is harder to account for that in a point-based system. Say I am refactoring a class and have allotted 3 points to that task, only to discover halfway through my refactoring that there is some gnarly coupling between this class and another class that is going to take a couple of days to resolve. What am I supposed to do there? Do I update my points? And if so, what metric am I basing the point value on now? This gets confusing.

That’s why I think point-based project planning is idiotic. And not just for developers. It lacks a human element to it. It has its heart in the right place, but it just does not work.

Instead, I find value in writing down feature ideas, in language that is readable to any human being, and then breaking that idea down, as I said before, into 30 minute tasks. The tasks do not have to be accessible to a layperson. They do not need to be customer-focused. They can be as technical as I want, as long as they accomplish something.

The value here is that if my assessment is off on one item, I generally have a really strong idea of how skewed my timeline is because each task represents the same amount of time. But, more importantly, I break things down into such atomic pieces, that I generally can foresee issues before I hit them and can plan around that.

Real Example of a Start-to-Finish Project Feature Planned in 30 Minute Blocks

Let’s use a concrete example. Last year, a friend made a really good suggestion to me: Offer people the opportunity to type the content of their own postcards and automate the process more at a discounted price, leaving the possibility for a full custom order.

This sounds like a simple idea but there are a lot of moving parts to it:

  • My ordering system was not advanced enough to build on top of it. It was simply a call to Stripe’s payment processor from a controller with a hardcoded price.
  • Users had no awareness of what cards were in my inventory and because of that, they didn’t have a true sense of how much content could fit on a card.
  • My order form was a pain point in itself. It was cutely designed to fit entirely on top of an image of a postcard. Any additional complexity there would destroy the simplicity of that UX. And I’m not a designer so it’s hard to gauge how to handle that!

To get around this, I needed to do the following:

  • Inventory my entire postcard stock.
  • Implement some sort of management for that in my app using Carrierwave and AWS S3.
  • Refactor my billing “system” into a true library that was capable of processing differently priced orders.
  • Re-envision my order form, possibly being a bit more crafty with how I build orders through calls to action.

Piece-by-piece, these are huge undertakings, so let’s break this down some:

  • Inventory my entire postcard stock:
    • Take front and back photos of each card (about 100 in stock at the moment).
    • Clean up photos on computer.
    • Store photos in S3 bucket.
    • Build a model in my app to represent cards in inventory.
    • Populate my production database with each card.
  • Implement some sort of management for that in my app using Carrierwave and AWS S3.
    • Add Carrierwave and S3 gems to Gemfile.
    • Update my dotenv file and export ENV to Heroku with my S3 credentials (public access key, secret, and bucket name).
    • Update my Carrierwave initializer to use S3.
    • Build a new controller for card inventory items that includes an action for adding new cards.
    • Build out views for uploading and building new cards.
  • Refactor my billing “system” into a true library that was capable of processing differently priced orders.
    • Extract billing logic out of my CardRequestsController and move any Stripe API interaction into its own class in /lib.
    • Evaluate what is part of the card request creation process and establish a service class that will create a billing task and then handle follow-up record processing.
    • Break my CardRequest model up a bit further to store price. In my case, a CardRequest is not unlike an Invoice–it maintains record of the Stripe transaction and is a state machine.
  • Re-envision my order form, possibly being a bit more crafty with how I build orders through calls to action.
    • Establish an “available cards” gallery
    • Add “order this card!” buttons to each gallery item that pre-populate the order form.
    • Make order customizable or specific.

That’s a lot of items, but each one takes about 30 minutes (or less) total. The important part being that I feel confident that I can sit down and completely finish the item in one easy session. This means if I know I have a difficult problem ahead, I can continue to ponder on that some and keep the project fresh in my mind since I am actively contributing to it on a daily basis.

Doing a breakdown here, you can easily catch your trouble spots. If you can not break a task down into small atomic pieces that are not vague, there is a chance you are hitting a paint point in how you understand your work.

In my case, my whole section of “Re-envision my order form” is vague and hazy and doesn’t have truly actionable items. I know these things will take me more than 30 minutes since I don’t have good UX experience. That’s why these things are at the end of my list, so I can mull over them some more and revise my actionable items before I get to them.

Using This Practice for Your Day Job

30-minutes-a-day is the bare minimum. You could apply this practice to your day job too and fill 5 hours of development with 15 unique 30-minute tasks. Given how many distractions most developers face day-to-day from external forces (critical issues, unplanned calls, drop-in discussions with other developers about things you’re not directly involved with), having small atomic tasks works really well since there’s a good chance you will find uninterrupted 30 minute windows of time to do your work. You might feel really good if you knock out about 10 of the things on your list.

Deadlines

In the case of Creepy Postcards, I’m not hard deadlined. After taking my business offline last fall due to an overwhelming number of orders and not having time for order fulfillment, I decided recently to reopen shop for at least the month of June 2016 in response to customer demand (I never thought there would be true demand for something as silly as creepy postcards, but here we are!), so I gave myself an easy deadline of 3 months, which is way more time that I would need to add features I want.

But for you, you might have greater external forces driving your deadlines. Deadlines should be a compromise of what’s needed and what is actually reasonable. When you understand what you’re working on at the smallest unit of time possible, you should have a better understanding, ultimately, of how much time overall you will need to dedicate to your project. If you’re smart, you’ll approach this conservatively and buffer your estimate some to cover the unthinkable (development problems) or the unforeseeable (illness).

If used in a multi-developer project, it’s a must for all developers working to follow the same practice if you expect to understand your time estimate.

If external forces insist that the deadline must come sooner than what you know to be your reasonable timeline, you know at this point that compromise is needed, whether that’s additional resources (other developers) or removing scope from your project to fit within the timeline.

Skeptical?

I understand. It sounds too perfect, right? Try it for a day though. Really, just a day. That’s all the time it takes to wrap your head around whether it will work for you. Start the day by breaking your work down into 30-minute tasks. Write those tasks down. And do those things. Even if you think, “that sounds like nothing…”–write it down. At the end of the day, you will have a much better understanding of how much work you have actually accomplished that day.

How to Use Searchkick and ElasticSearch in Your Rails App For Complex Search Indexing

For reasons that elude me, I have always been obsessed with “speedcoding.” That is, I like to see how fast I can implement a very large feature in a ridiculously short amount of time. I won’t lie: this kind of trait goes hand-in-hand with phrases like “cowboy coding” and “Balmer peak,” and with age, I’ve largely outgrown it, but the mood still hits me every now and then.

I recently enjoyed one of these moments while toying around with some code for Treehouse, for the fun of it.

imageedit_5_3400066282

In a past life, I spent about a year working on a team for DeviantArt whose sole purpose was to improve search results on the site. If you were not aware, DeviantArt’s search is done entirely in-house by people who have PhDs in math. They’re brilliant people who will talk your ears off about facets, scoring, histograms, and tagging metadata. I didn’t work on any of the search indexing services myself (which were all written in C++), but I was heavily exposed to the bits of it that were included in the main app, written in PHP. And as a result of that, I know more about search indexing than I’d like to say I know.

CloudSearch or Ransack?

So, seeing poorly implemented search indexing tools also causes me mental anguish. That’s how I feel about Amazon CloudSearch, in general, which is a tool Treehouse has used for one of its most major site features. It’s not the worst indexing tool in the world but I really dislike that you have to hit your indices through an API since it’s all hosted externally, which seems unnecessary, unlike hitting a CDN for assets. That’s like hosting your Redis stores on a third-party service: why. But, worse, for a few internal tools, Treehouse uses a Rails gem called Ransack.

I don’t mind Ransack. It has its heart in the right place, but it leverages ActiveRecord for its querying and so, you’ll have to put a lot of effort into optimizing indices on your database tables if you expect it to work even halfway decently as the size of the table you’re querying grows. This also assumes you’re not doing expensive table joins as part of your query.

Searchkick to the Rescue

I recently decided to see what would happen if I used ElasticSearch for a fairly complex search, using a gem called Searchkick. I really like Searchkick because out-of-the-box, there’s no configuration needed. If you want to index your User model, it’s as simple as adding the gem to your Gemfile and a searchkick directive to the class:

And then reindexing the model:

The cool thing here is that you can also do your reindexing asynchronously so that it won’t block processes or have a dramatic impact on your application’s performance.

You can then search all attributes of User (i.e. name, e-mail, city) like so:

And you’ll find plenty of demos and tutorials for that all over the place, but who ever needs the simplest use case?

I had a few different needs:

1. Because Searchkick uses ElasticSearch, you can’t chain scopes off of the model prior to running the search like so:

I mean, you can, but — it’ll ignore the named scope and still run your search against all User records. So I needed to be able to account for different scopes, and the above piece of code simply does not work and cannot be made to work.

2. I needed to be able to sort my results by a variety of things which weren’t necessarily attributes on the model itself. For example: I needed to sort by the time difference between the model’s created_at attribute and its updated_at attribute. Or I needed to sort by the created_at timestamp on a child association. ElasticSearch’s DSL supports a sort order constraint, but how do you sort by a value that isn’t indexed with the model?

3. As I started to index more things, I noticed my controller logic was growing wily. I needed some sort of presenter type class or simply a PORO to organize my Searchkick search.

So I’m going to walk through how I developed this search feature, stopping to explain my thought process along the way. Because I didn’t feel like getting sued by my employer for any potential intellectual property theft, I’ve used a completely different search feature that has absolutely nothing to do with what I was originally building a search for.

Once I was finished writing this code, I was able to roll out a second sortable, filterable, search tool for another model in about 20 minutes reusing the same pattern.

Where I Started

I wanted to index a model called Movie. Each Movie is directed by a Director and has many Actors through a relational model called ActorRole.

Searchkick allows you to override which columns are used in searches via a method called search_data. My first step is to find out what things I need to index here!

What this does is allow me to continue indexing the attributes on the model itself, but also includes a couple of other pieces of denormalized data from associations, namely the name of the Director who directed the Movie and the names of anyone who acted in the movie, both pieces of data that are not stored on the Movie record.

So, assuming that I have a Movie with the title “The Room” directed by esteemed actor, director, and writer Tommy Wiseau, I can now search for “Tommy Wiseau” and “The Room” will be one of my search results–both because he acted in the movie and directed it.

If you’re used to working with relational databases, seeing denormalized data stored this way might bother you, but it shouldn’t. Remember, the purpose of these indices is for aiding in searching, not for data management. Your indices do not need to look pretty–they need to simply be a collection of values that you search with, mapped to their respective data types. That’s why it’s a separate data store from your primary database, afterall.

You should always reindex after making changes to the search attributes, so that ElasticSearch can pick up anything new.

Implementing This In A Controller

As you can see, the search method, provided by Searchkick, takes 2 parameters. The first is a query string. The second is an options hash. Already, I’m passing two options to set up pagination support. You might imagine how hairy this will start to get once I need to do more complex search functionality.

I’d like to move this logic into its own service object for a couple of reasons:

1. I’m a big fan of keeping controller actions skinny (as most Sandi Metz fans are)
2. If I later decide to add additional searches, I am likely going to reuse this logic.

So let’s do that.

I still don’t like this though. It’s not generic enough, and we’ll see why in a minute as we continue to build it out. I prefer to get something working before trying to refactor it.

Extra Beef – Filtering

I don’t know about you, but I’ve never been to a movie site that didn’t offer browsing by genre. That’s just an obvious thing about movies, yeah? So we need to work that into our search somehow. The problem is, since we’re using ElasticSearch, we can’t do any initial filtering through ActiveRecord scoping. Everything needs to take place within the Searchkick options. So we need to consider that in our search class.

The options hash is now starting to get polluted and messy, which means it’s probably time to extract parts of it out into its own method:

These are simple use cases. But what if you wanted to filter on something a bit less obvious that doesn’t necessarily seem like it would be a search keyword–like say, filtering Movie based on whether the director is still alive or has died before a certain date. Sure, that’s not a common thing to filter on, but a majority of our lives as developers are building out logic that has some special meaning to our product or customer, otherwise we’d all be using pre-existing open source software and calling it a day.

To do this, I need to add that denormalized data to the search index.

When you reindex your model, Searchkick will pick up that you’re indexing a date and you’ll be able to evaluate it as such in your search:

lte and gte are both parts of the ElasticSearch DSL, if you were curious. And honestly, I think it’d be weird if someone had a future death date listed but, again, we’re just toying with data here 😉 You could even filter within a range if you had two date objects, using both lte and gte.

I could continue adding ways to filter on additional attributes, but it’s largely rinse and repeat from here, with some mild Ruby refactoring along the way.

Sorting

This was the one part that gave me pause, but it’s not wildly different from filtering via where. Say I present Movie results in a table that contains columns for its title, genre, release year, and director’s birth year. The first three items are simple to sort on because they’re already indexed attributes. Just like we had to add the director’s death date for filtering on that, we’ll need to add the director’s birth year in order to provide sorting options for that:

And add a sorting option to our search call:

Pretty simple. One thing I want to point out here is that ElasticSearch allows you to sort by _score. You can sort by multiple attributes, so you might want to consider continuing to sort by score, because that’s one of the niftier things about Elasticsearch–as it receives more queries and its indices grow, it grows more intelligent about which results are relevant, and sorting by score will weight the more relevant results towards the top.

Moving on! Now, our MovieSearch class, in full, looks like this:

Refactoring

And this is where we can start to think about refactoring potential. Some of the logic in this class is tightly coupled to the Movie class, but some of it is generic enough that it could be used for any model using Searchkick for searching. So maybe it’s time that we break this into a base class which our MovieSearch class can inherit from:

I added a new method called search_class that raises a “Not Implemented” error on the base class. If the child class fails to implement that, as it should since it specifies which model to search, that error will be raised. Because we were able to extract so much into the base class, the MovieSearch only had to include the search_class method and a where method for movie-specific filtering logic. You could potentially override the order method as well if you wanted to have a default sort order, like say, if you were filtering by the director’s death date, you always wanted to make sure you sorted results by that attribute in descending order.

Final Thoughts

Cache-busting

There’s a lot more you could do here. I just wanted to dig in a little bit beneath the surface of all the tutorials that choose to cover the most basic use case. One thing, I’d like to point out though is that when you use ElasticSearch on a model that has child associations in its search data, you’ll need to make sure that the parent model gets reindexed when the child object gets altered. Searchkick automatically reindexes when the model itself changes, so just as you would handle cache-busting, you need to make sure your associations have a touch: true directive to trigger this reindexing!

One of my coworkers, Amos, also shared with me an interesting, alternative approach to handling these kinds of issues by adding instrumentation to the child model’s lifecycle that notifies when it needs to be reindexed and then subscribing to those notifications to ensure that a reindex takes place. I really like this approach too and would heavily advocate it if your searches start to get heavily burdened by ActiveRecord associations.

“I hate service objects and think aspect-oriented programming is the way of the future!”

That’s fine and I understand there’s a couple of different ways you could propose to architect the code I wrote here. Instead of building a service object, you could make a Searchable aspects module that is included in your model and override the where and order methods within your model instead of building separate search classes. On one hand, I’m not a gigantic fan of this because it places logic that doesn’t belong on the model in the model. On the other hand, if you look at how Searchkick works, it’s already doing this by forcing you to override its search_data method on the model. In short: ¯\_(ツ)_/¯

Code Climate and Flog

True story: Flog will hate you if you have even the slightest bit of complexity in your search_data methods and if you choose to extract out relational data into their own methods in cases where you were needing to pass blocks to map, you’ll start to get that stinky feeling that you’re violating the Law of Demeter. So, in a way, I feel like having search_data on the model is a code smell that Searchkick forces you to commit, but, to reiterate: ¯\_(ツ)_/¯

“I love you for writing this but I know something you don’t know and want to contribute!” /
“I love you for writing this but I’m a hands-on learner and want to download the code to play with myself!”

Did you find this article useful but want to have a more hands-on learning experience? Good news! I’ve put this code on Github where you can clone it and play with it on your own.

1Q84 – Books 1 and 2

I’m currently 700 pages into the 1159-page Haruki Murakami novel 1Q84. Here are the thoughts I’ve collected, spoilers and all, in no particular order thus far.

There be spoilers below. 

  • What if the novel that Tengo is working on after Air Chrysalis is actually the novel I am reading, 1Q84? What if Aomame has been written into the novel? After all, the foundation of the book is based on 1984, where history is rewritten. Perhaps Tengo is in a future where the past is forgotten and he is rewriting history, reminiscing of a childhood love he never saw again.
  • I really appreciate that Tengo has forgotten his girlfriend’s name. I feel like so much of life is repetitive events with people we know without really knowing. And it’s not that you don’t care about these people, but just that in going through the motions, you forget to get to know them further.
  • I don’t know if it’s just me but I had no idea what the Willow House was supposed to be for the first two chapters of Aomame’s story that mentioned it.
  • I can’t not picture the Dowager as an American southern aristocrat with Cruella Deville hair.
  • In that same respect, I also can’t not picture The Professor as a Japanese version of Edward James Olmos. I have no idea why.
  • They keep quoting lyrics from Frank Sinatra’s “It’s Only a Paper Moon.” Given the two moons in the story, what does it mean? In the song, love isn’t real without that other person–it’s a fairytale. Is 1Q84 a fairytale as well until Aomame or Tengo remember they’re in love and then suddenly become a part of it?
  • Janacek’s Sinfonietta is such an odd choice of a song to have recur throughout a book. The intro fanfare is so cacophonous and discordant. It’s a war theme.
  • There’s a lot to make me think a primary theme of this novel is feminism. So much sexual abuse and vengeance in the name of sexual abuse. Aomame doesn’t want a lover. Ayumi doesn’t have time for a lover.
  • Speaking of which, Aomame’s revenge on her dead best friend’s husband? I can’t think of anything more annoying than literally having to replace every. single. item in my house. That is some skilled shit.
  • I love the way Murakami describes the first appearance of Ushikawa:
    • “…some creepy thing that had crawled out of a hole in the earth — a slimy thing of uncertain shape that in fact was not supposed to come out in to the light.”
    • “…black, curly hair that had been allowed to grow too long, hanging down shaggily over the man’s ears. Ninety-eight people out of a hundred would probably be reminded by it of pubic hair. Tengo had no idea what the other two would think.”
    • “It was not just that he had terrible style: he also gave the impression that he was deliberately desecrating the very idea of wearing clothes.”
  • Tengo’s girlfriend’s dream about the cottage in the woods really freaks me out. She says she has a sense of dread about why the food was left at the table, why after hours, it’s still steaming hot, why it’s getting dark and whoever left it is still not back, as if they abandoned it to run away from a monster. And Tengo suggests that she is the monster and she gets offended. But what really freaks me out about that is just the continuity of the scene. All alone with the forever-steaming food. Isn’t that what hell is? Being stuck forever with dread?
  • Book 2 is really boring and drawn out. I feel like he was trying to be really dramatic in spending 8 pages describing a handgun and how it’s handled, but the deep impact of that really falls short. Yes, guns are kind of more heavy than they look. Yes, they’re made of metal. Yes, they’re powerful and you have to be extremely safe with them. I get it. I did appreciate the Chekhov reference that once a gun appears in a story, it has to be used. I feel like, at this point, I don’t really care if the gun gets used or not, though. Murakami makes it really hard to care about Aomame given that she’s not a very emotional person.
  • I have really appreciated how blunt Aomame is though about her sexuality, from her telling a guy in a bar that she likes big cocks down to her weird sensation the morning after of her asshole having been stretched open from anal sex. It’s a little bit shocking, from someone who presents herself so properly in all other venues of her life.
  • The Little People make me think of The Lilliputians in Gulliver’s Travels. I can’t really figure out what their angle is though. I know they’re not good, but I don’t know that they’re bad either. They’re just… chaotic supernatural forces, as far as I can tell, that are tied to events that do seem bad–child molestation, disappearances, cults, exploding dogs?
  • Fuka Eri asking what Tengo what “real” meant was interesting given her character’s whole existential crisis in Air Chrysalis upon learning she had this dohta clone.
  • Murakami is obsessed with breasts. I know more about Fuka Eri’s breasts than her face.
  • I don’t know what to feel about the whole concept of the maza and the dohta. Is Fuka Eri being separated from her dohta (the shadow of her heart and mind) the reason she is perceived as dyslexic or is she actually dyslexic anyway?
  • What are the criteria for being chosen as the Perceiver and Receiver? Is it just a coincidence that the Leader and his daughter (or her dohta?) are both? What happens if the Perceiver and Receiver don’t know one another? Do the Little People have to orchestrate that whole shebang? Are they a global force or just a Japanese thing?
  • I feel like there is a bigger conspiracy laying ahead. The first time that Tengo got a call from Fuka Eri when she was in hiding, he could hear children in the background. I feel like she was staying in the same condo that Aomame is staying in after killing the Leader. Which I think means that two opposing forces are actually working together (possibly the Dowager knows the Professor? Or… the Dowager’s long lost son is the Leader) Who knows.
  • I really hope this book wraps up in a way that doesn’t just feel like the whole thing was a homage to Orwell’s 1984, because I’d be really disappointed with that. I just think Murakami can rise to the occasion to not need to use another literary work as a plot crutch, especially for his longest work yet.

You Can’t Live On In Anger / 7 Months After Miscarrying

31 weeks ago, on Father’s Day 2015, I rode my bike to CVS. For two weeks, I’d had a really obnoxious cramp in my lower abdomen. I thought I had an ovarian cyst because it was sharp and stabby. But the doctor didn’t find anything wrong and sent me home.

I made the trip to CVS every couple of weeks usually, to purchase a home pregnancy test. It was just a formality for me, to the point that when I took the test, I typically just set it aside and would glance at it later in confirmation that things were normal. Normal for me, anyway.

But this time, before I could even fully lift the test back up, something was off. It was positive. Extremely positive. And like most people with an unplanned pregnancy, I started to pace around frantically, trying to catch my breath, before calling my boyfriend. Then I took another test. And another. A real Hollywood cliche, but it’s grounded in so much reality.

We walked around the neighborhood like zombies for an hour. It felt like a nightmare. Not because I hate children or because I don’t love Joel. My brain just couldn’t comprehend the amount of responsibility.

The baby changed things. It changed me. It changed my relationship. And it grew. And as it grew, I grew inside. I bonded with it. I ate a lot of kale suddenly. I sang songs like “Hey Jude” to it even though I know fetuses that small can’t hear. Some days, I felt like a whole bright world awaited me. Other days, it felt like it was just me and baby versus the world.

Then I found out that one baby was actually two. And I felt disconnected again. I felt ashamed for feeling disconnected. It’s hard feeling like you spent time bonding with one person only to find out that all along, you were actually bonding with two people. It felt weird knowing there was another member audience to my singing. It felt weird knowing the different foods I craved… that maybe each one was triggered by a different baby.

And when the doctor said the words, “high risk,” it terrified me. Then came abdominal pain I’ve never felt before. Pain I’m sure is not even half as bad as labor pain, that caused me to double over, lose my breath, and not be able to stand. And the babies were gone.

I had to take a week off of my job to recover from the loss. I didn’t know back then what all that sedentary navel-gazing would do to me. Like the twins changed me, their loss changed me. And my reaction to the loss was nothing like my boyfriend’s reaction to the loss. And that changed the dynamic between us as well. Seeing happy families made me cry. Hearing people complain about their young children annoyed me because I felt like they had lost sight of what they had. I felt lost.

And worse, I felt no finality. When you are pregnant, you get a due date. My original due date was February 23, 2016. Because they were twins, the due date was actually more like around 36 weeks, since twins are typically born premature, so January 23, 2016. But twins vary greatly in when they decide to come. Anywhere from 32 weeks to a normal full-term. It was impossible to have the feeling of “this is when they’d have been born. I can let go.”

Shortly after I found out I was pregnant, I began a cross-stitch piece, not knowing how epic it would be, of the Overworld map of World 1 in Super Mario Brothers 3. After the loss, I continued. Somewhere around November, I knew, even though I was nowhere near finished with it, that whenever I finished this map is when they would have been born. It was a pregnancy-length piece.

And sure enough, I finished it on January 24, 2016, 1 day past 36 weeks. And not that the piece dictated where my grief ended, but I looked up from the piece and realized I’m in a better place now than I was before.

For months, I was angry. I thought my grief would be channeled through sadness. Instead it came through in anger. I was angry at everything in my life. I was angry with Joel. I was angry with where I was living. I was angry with my job. I was angry with myself. Nothing could make me happy because I wasn’t even willing to give it the chance to do so. I was defensively preventing myself from moving forward with my life.

And then, through some magic grace in the universe, a calm surged up and embraced me. And I was able to breathe again. I still get angry. But I’m a little less so now.

And strangely, the map from start to finish… it works. There were a lot of hills. And hammer brothers. And invincibility stars. And mushrooms. And Koopas. And magic flutes. And three lives at the very start. And I lost a couple along the way, but I somehow made it to the end of World 1.

IMG_0366