Lessons from the Trenches: Part I

I randomly came across this article that I wrote in 2015 for my teammates in the Intelligent Robotics Group but haven’t shared on the blog. Reading this article, on best practices for software engineering, as a filmmaker has been *really* interesting because there is a potential for crossover into filmmaking; namely, the concept of being “agile”, importance of “planning and reflection” for each iteration, and the cost of change increasing as time moves forward.

Since last August, I have been taking classes at Carnegie Mellon University, Silicon Valley (conveniently located at NASA Ames Research Park) as a Masters student. My co-workers are often eager listeners of the stories of my adventures in learning software engineering at CMU SV. They asked me to document what I learned on a blog, so here I go 🙂

For my graduate school class “Foundations in Software Engineering”, I built a project planning tool as a team of five, using Extreme Programming Practices. I enjoyed the experience so much and I learned a lot. Now, I would like to share with you what I learned from programming in XP style.

So what is extreme programming?

It’s an Agile software development methodology with focus on programming technique, clear communication, and teamwork.

You should consider XP if your code is a mess, many bugs, and has integration problems. Release causes lots of stress, it is difficult to release more frequently, difficult to add new functionality, and testing takes too long (or non-existant).

XP is special because of the XP Practices, emphasis on simplicity, quality, and testing, and can keep the cost of change low.


Here’s a chart that shows the cost of change with respect to time. Using traditional software engineering methods, as we do in this group, it is extremely expensive to change the code towards the end of the cycle. With XP, the cost of change is low.


Here are all the XP Practices. Some XP Practices aren’t very special. I’ll focus on the ones my team, Rail Byters, learned the most from  🙂


First practice is “whole team”. These are my teammates for CMU, “Rail Byters”

For the class project,

the Whole team negotiatesfeatures list

the Whole team estimates each feature

the Whole team implements the features by rotating pairs


Whole team is also about having a sense of wholeness, and feeling like “we belong”, “we are in this together”, “we support each other’s work, growth, and learning”.

I would like to share with you a quote from a book called “Extreme Programming Explained” that maybe (sarcastic) relevant to IRG:

“Some organizations try to have teams with fractional people: “You’ll spend 40% of your time working for these customers and 60% work for those customers.” In this case, so much time is wasted on task-switching that you can see immediate improvement by grouping the programmers into teams. The team responds to the customers’ needs. This frees the programmers from fractured thinking. The customer receives the benefit of the expertise of the whole team as needed.

People need acceptance and belonging. Identifying with this Program on Mondays and Thursdays and that program on Tuesdays, Wednesdays, and Fridays, without having other programmers to identify with, destroys the sense of “team” and is counterproductive.” – from Page 914 of Extreme Programming Explained

Energized Work is another XP Practice. It’s about working only as many hours you can be productive and only as many as you can sustain. I particularly like this quote: “Software development is a game of insight, and insight comes to the prepared, rested, relaxed mind.”


In this chart, you see 5 constraints of software development: Scope, Resources, Quality, Sanity, and Time. The only negotiable constraint is scope.

Rail Byters decided early on to not sacrifice quality over quantity of the implemented features. And in order to do so, we would de-scope rather than be in the crunch mode. This discussion helped us stay sane and healthy during our last iteration. Often times we were tempted to implement as many features as we could, but we went back to what we agreed on and decided to set out a scope, not deviate from the scope, and polish the code for the final presentation.


Here’s a really important XP Practice: Pair Programming.

Here are some advantages of pair programming are:

  • Keep each other on task
  • Brainstorm refinements to the system.
  • Clarify ideas.
  • Take initiative when the partner is stuck, thus lowering frustration.
  • Hold each other accountable to the team’s practices.

My team pair programmed every single line of code we wrote for the tool we built. Ideally, you would sit side by side and look at one monitor together. But since our team is partly remote, a majority of our pair programming sessions were done remotely via Google Hangout. For the first two weeks of developing our tool, we held all-hands programming session with one driver who shared the screen with the rest of the team. This helped establish a general process and guidelines for later programming sessions that were performed in pairs or triplets. Once we got used to pairing, we rotated the pairs at each pair programming session and chose the least experienced person at the current task as the “driver”. This practice spread the knowledge so that all members of the team to understand the entire codebase. And it really saved us when some team members became unavailable. Other members were able to step up and continue the task that was left off. Another thing pair programming was good for was keeping each other accountable for following XP Practices, especially writing the tests first. I will talk about test first programming in the later slides.


We planned using stories, which are units of customer visible functionality. For example this would be a story: “Provide a tool tip for astronauts in the surface telerobotics workbench”. Requirements are usually set in stone. But stories are not definite even when they are written down. In XP, you plan with the full expectation that these stories will change as you make progress. In XP, stories are estimated very early in the process.This early estimation was really helpful because it gives you a chance to interact with your customer and discuss priorities. And when you know the cost of each feature, you can split, combine, or extend the scope based on what you know about the feature’s value. With Rail Byters, we estimated each story card by using something called “story poker”, where each member of the team draws a card with numbers between 1 and 8. These numbers on the cards are story points, and higher the points, more complex the story card. The number with the majority of votes becomes the estimate assigned for that user story.


We tracked our progress each week and all the meetings were held on a weekly basis. Planning meetings were in the beginning of the week and reflection meetings were at the end of the week. The weekly cycles were helpful for us to set up a routine of planning and reflection, as well as an expectation of how many story cards we should be able to accomplish at each cycle. And the value of weekly reflection was paradigm shifting. It really ensured that we improve our process every week since we reviewed the reflection notes from the past week during current week’s planning meeting.


Continuous Integration is important because it can prevent large merges and merge conflicts, and help us identify bugs early in the process. In Rail Byters, we integrated after each pair programming session. We programmed, ran all the tests and made sure they all passed, then we committed the changes, and automated build was triggered by the commit. When the build passed we proceeded to the next task.


Test Driven Development is about writing a failing, automated test before changing any code. This practice addresses many problems:

  • Scope creep– it’s easy to get carried away and start working on something that’s cool but not a priority. If you really want to put that extra code in, you have to write another test. This extra step is effective in preventing scope creep.
  • Modular Design: If it’s hard to write a test, it means you have a design problem. Break the design down into modular chunks.
  • Trust: It’s hard to trust the author of the code that doesn’t work. When your tests are passing, you give reasons to your teammates to trust you.

Once you start, the rhythm of test, code, refactor is fun and enjoyable.


Getting Started:

There is no one right place to start.

Start by changing one thing at a time.

Change starts at home. Only person you can actually change is yourself.

Speaking up

I feel a little bit helpless again, and it’s the same helplessness I felt when I was hearing the stories shared by my undocumented immigrant friends. This time, the helplessness comes from hearing about the tragedy of George Floyd’s murder in Minneapolis.

I feel very careful in writing about an incident and a community outside my direct experience. But I don’t want to be complicit by remaining silent. There are so many subgroups in America that live their daily lives in fear, and that is unjust.

I don’t know what it feels like to be an African American citizen in the United States. But I can imagine. I can observe. I can learn.

I grew up in a relatively-homogenous country, South Korea, where a sense of belonging was never in question but rather a given. My family then immigrated to Indonesia where foreigners and expats were treated with privilege and respect. Then we moved to California, a state so diverse that we were told we would be protected from racism that is rampant in other states. California did protect us from outright racism. But we were still part of a bigger system that left immigrants, especially the low-income, non-English speaking, in temporary or no status, vulnerable and in fear. My family and I made it to the other side after fourteen years, but I’ll never forget the fear and anxiety we felt during those years.

This fear is definitely not the same as the one that black community feels and voices. And yet, I feel that they are somehow related. And in suffering, I dare to say, these two communities (and more) are united. And if I had to use the word “against”, it would be to say against injustice and needless suffering in the United States and the world.

I promise to myself that when I see injustice or action that goes against my values, I will speak up. Even if it’s as small and meek as saying, “Excuse me, but I don’t subscribe to this view”. Just something to make the perpetrator of racism / sexism / any kind of fear-based behavior, uncomfortable enough to ask themselves some questions.

On the virtue of lazy mornings

In the past few days, I started to remember what makes me happy. It might be that free time has opened up over winter break. The students have gone away and with them the pressure to always be working. Solitude, which seemed so unbearable in the first day or two so much so that I ran away to my parents’ house to spend time with them rather than be alone, has once again become pleasurable.

The thing that gives me greatest joy is the hours in the morning, when I get to wake up relatively early and make myself breakfast. I will make my bed (rare), go downstairs to a kitchen that is unoccupied by my housemates (important), where I can make myself a bowl of oatmeal with nut butter and a soft boiled egg. I will enjoy this meal in absolute silence, uninterrupted by anyone, and read few chapters from Murakami’s memoir “What I Talk About When I Talk About Running”. And I will remember again what gives me joy.

I don’t exactly know why mornings, specifically the “lazy” mornings when I can actually cook breakfast, are so meaningful to me. I think back to my undergraduate years at Berkeley when this habit of making breakfast started. It must have started after I read the “French Women Don’t Get Fat book. It feels embarrassing to say that I’ve read this book repeatedly over the last decade or so. This book is really a meditation on joyful living, as Murakami’s book is a meditation on running. I like these stories that talk about the mundane in specific terms. These artists and writers remind me that true joy lies within the smallest moments. And this thought helps me pause from relentless striving and reminds me that being an artist, which I want more than anything, is also living your life artfully with beauty, quiet moments, joy, wonder, awe… all the things that feeds one’s soul.

When I look forward to the future into the life that I want to live, I see myself waking up early to spend the early morning hours in solitude writing in a beautiful Maybeck House with tall ceilings and lots of wood with windows that look out to nature. And then the day would begin with a loud, busy breakfast with my family, then continue to meetings with other creatives to collaborate on projects. It would conclude in a long run in nature passing through quaint houses, little hills, small animals, brooks, and lots of trees. And it’s important to remember that this kind of life doesn’t require fame, prestige, or lots of wealth. It would be more about having the respect of my peers who are also creating, a loving family, luxury of time each day for myself, and moderate savings to live a healthy and balanced life while also being able to help others who are in need.

I don’t yet know how the confluence of my training in writing, producing, directing, and technology will come together to create this lifestyle for me. And maybe I already have part of this life, and all I need to do is remember to exercise it. What I can do now is wake up early to write, make myself breakfast, collaborate with lots of creative people, and go for a run even on a treadmill. This is a note to myself to do these small things even when I’m in a funk. To wake up early, make myself some good breakfast, write, converse and collaborate with interesting and creative people, and go for a run to refuel my soul.

Telling Our Stories

Angel Island Immigration Station in SF

Below is an essay I wrote in 2010 as an undergraduate at UC Berkeley for an immigrant student advocacy organization called Immigrants Rising. This piece was written and read out loud in front of the 150 guests at the “Day of Immigrants” event that took place on the Angel Island in 2010.

For my college application essays, I avoided the gloomy topics of immigration and living in a low-income family. Each of the college admissions books I read and internalized had an underlying theme: college essays ought to focus on the positive aspects of one’s life, with humor injected in between the sentences. I simply couldn’t do this with stories about immigration; my memories were too depressing. How could I inject humor into nights filled with anxiety when I overheard my parents arguing whether or not we should give up and go back to Korea, phone calls with my landlord to fight for the deposit she refused give back, or moments of panic whenever I thought about paying for college? I asked my counselor if I should write my college essays on these experiences. “Ten thousand other immigrant students probably wrote about overcoming adversity much greater than yours,” she replied. So I concluded that stories about immigration are all too similar, all too pervasive, and all too serious as a topic to be handled by a teenager. In the end, I wrote about how I played piano for the Alzheimer’s patients at the local hospital, how I won a motor-building contest during the summer technology program at MIT, and how I am the only service-learning teen-ambassador in all of Orange County. And all the essays I wrote came out detached and cliché, as if I was hoping my readers could fully grasp who I was just by looking at my shadow.

I wonder how many immigrant students feel as if we ought to bury our painful memories and underscore the humorous and hopeful moments of our lives. It is easy to write about wonders of a new land, the nice neighbor who taught you English, and the teacher who changed your life. But there is nothing harder than sharing your experiences of extreme anxiety as you sleep in fear of deportation, or the feelings of guilt and bitterness at making your parents pay so much tuition when they already work ten hours a day just to put food on the table. With happy events, words pour out like honey and milk. There is no need to worry that you might sound self-pitying, no need to recall unpleasant events that will drain you emotionally. But by focusing on the happy and hopeful events of our lives, by pretending we are the same as stable and happy middle-class American families, we unconsciously erase the sacrifices our families have made to get us to where we are today. We erase ourselves. Writing about past experiences, whether pleasant or unpleasant, forces us to reflect and re-evaluate the past and the present, as well as what we truly want to achieve in the future. So let us rely on words and their ability to capture even the most fleeting emotions, no matter how sad or depressing they are. Let us preserve our memories before they slip away into oblivion. Let us preserve ourselves.

Lourdes 2019

Serving as a stagiaire at Lourdes was a profoundly beautiful experience I can’t yet put into words…

Here are some pictures from the trip 🙂

Waiting to register as Stagiare at Notre Dame de Lourdes

Notre Dame de Lourdes in sunset before the Marian procession.

-2692691235749733360_IMG_2404 3
Serving the pilgrims at the train station.

Pretty town of Lourdes

Our Lady of Lourdes at the Grotto of Massabielle