Life lessons learned while learning to code
Today is graduation day, but I’m gonna miss the ceremony. Final projects finished up last Saturday, and I arrived home to two sick kids and a tired husband. My daughter’s sickness led to pneumonia. So I’m home with her today. She’s still sleeping, and it seems like a good time to sit down and reflect on the journey toward learning to code while juggling work and family.
I’ve been a technical writer for nearly 20 years. And I’ve prided myself on never writing something without understanding it. I’d read src code, related docs, ask engineers questions, and write simple code to appear alongside my docs. I’ve also never been afraid to jump in and help build the doc servers for our content, but I’ve always known my limitations. I’m a tech writer, not an engineer.
Then a few years ago working with a Chromium engineer on the new developer.chrome.com doc server, he encouraged me to work alongside of him. I did my best to dive into the back end. I even became a Chromium committer for my efforts. But my work was hacky and I only understood some parts of the server, and by no means the sum of all parts. The desire to fully own that doc server going forward was enough to convince me to enroll in Stanford’s Foundations in Computing program.
During the first trimester of the program, I worked long hours, combined with launching developer.chrome.com. I also had a baby. My son Patrick was six months old when I started the course. I attempted to breastfeed while writing code. It was nuts. I finished with a C+ after 10 grueling weeks. My assignments were all A marks, but I didn’t do well on the exams. I was exhausted from being up most of the night before both exams. I also had this overwhelming sense of imposter syndrome, and it seemed to paralyze me during exam times.
After the course finished, I felt as if I had failed. I work for Google and many of the engineers I work with graduated from Stanford with high marks. I wasn’t them. I was merely a C+ student. Both my husband and my mom kindly but firmly said it wasn’t the time to learn to code. My husband is an excellent engineer, and somewhere deep down I read this as affirmation of my lack of ability. If I’d have shown more potential, he’d have encouraged me continue. I know now this is ridiculous, but I was tired, defeated, and I had let myself internalize my fears.
Fast-forward another couple of years, and it happened again. I was working on an intense project, trying to keep up with the fast pace of Google’s AMP project, co-launching ampproject.org. Another engineer encouraged me to dive in as much as I could to help build the site (I am very lucky to get to work with these engineers). We worked together, long hours, pushing through to a successful launch. But again, there were these moments where I knew I could only do so much in terms of helping to make the doc server better.
I had a long chat with a peer in work, and he encouraged me to go with my gut, to find a way to learn to code. He was confident in my abilities, and said he would be a fierce advocate should I choose to go down this path. But that imposter syndrome was still strong and the memories of how I didn’t give my family the time they needed when I got swept up on the code, kept me from re-enrolling in the Stanford program.
It’s then that I came up with the idea to apply to give a talk at Grace Hopper. Part of that talk would be to build something real, tangible, full-stack, pushing me through all the gaps in my knowledge. I told myself that the chances of getting accepted to talk at the conference were low. But if I did, I’d be able to justify making it an official 20% project. I submitted a talk idea, it was accepted, and I organized a reasonable coding schedule so that work and home weren’t affected. There was only a couple of weeks leading up to the talk that things got hairy, and it was short enough that it didn’t impact work or family all that much.
Also, a very talented engineer and friend helped me push through an ugly duplicate data bug. I remember his kind words in the middle of chaos. “It’s totally normal, Meg, for this to happen when you haven’t done it before. Next time you see the same bug, it won’t be the same. You just have to keep facing the bugs to get better at fixing them”.
The talk was a success. Afterwards though, I experienced this strange feeling that can only be described as loneliness. I built this thing, it was exciting in the act of building it, but now I felt sorry for myself, which is super weird, as that’s not something normal for me. I just did this cool thing, and I felt sorry for myself.
If you are reading this blog post and thinking about learning to code, it’s important to tell you that I now understand this loneliness isn’t actual loneliness. I’ve experienced the same feeling after coding pushes enough times to recognize it as the reaction to my body after it produces way too much adrenaline to get through a push. That adrenaline isn’t free, and as I continue on my coding journey, I’m gonna have to find ways to get better at dealing with the feeling of isolation after the push. Your post-adrenaline rush is likely to be different than mine, so figure out what it is, and find ways to navigate through it.
Grace Hopper was in October, the election in November. On the night after the election, I gave my Grace Hopper talk to a group of women attending the Women Techmakers dinner before the Chrome Dev Summit. I almost didn’t show up. The election hit me hard. I couldn’t understand how so many women could have voted for this man (51% of white women voted for Trump). Having to tell my daughter that this happened was one of the hardest things I ever had to do. And that night, having to face a room full of women made me sick to my stomach. But another ally, co-worker, friend (I genuinely do work with the most amazing team of people) talked me off the ledge, and I got through it.
After that night, I made the decision to face my fears and find a way to follow-through on my desire to learn to code. (I guess you could say that President Trump was a catalyst.) I started researching all sorts of programs trying to find one that would match my lifestyle as best as possible, and I came across UC Berkeley’s full-stack engineering program. The Stanford Foundations program is 5 x 10 week courses. You take the same classes as full-time Stanford undergraduate engineering students, but instead of attending classes in-person, along with helpful sections and study groups, you can only participate in class time via online videos. The out-of-class coding time is about 20 hours.
The UC Berkeley course is at least 10 hours mandatory class time (it turned out to be around 15 hours) plus about 20 hours of coding (some weeks were 10, and some were 40+). The course is 26 weeks all in one go, compared to Stanford’s 50 weeks over three years. Perhaps the biggest difference between the two programs is that the Berkeley course is made for working students, with class times in the evenings and weekends. And there’s a huge support network from the awesome professor and TAs.
Before applying, I sat down and wrote out on paper a plan for how this might work, how I could be successful in this course, while still being present at home, and fulfilling reasonable expectations at work. Then I had a long chat with both my manager and my husband about how we could pull it off. I will slow down in the writing aspect of my job, try to be the best manager I can be, and in exchange for my husband having to take on quite a bit more responsibility in the evenings and weekends, I would work from home on class days to be able drive the kids more, get dinners ready, do laundry, etc., easing more of the general home tasks to balance my time in class. Both my manager and my husband were supportive, not just in helping me make this decision, but throughout the six months of the course, and I’m so very grateful to both of them. My team was also very forgiving when I had to reschedule all the things.
If you are considering your own journey toward coding, here’s another key piece of advice: get help all the time and say thanks often. (Anyone reading this who helped me… a thousand thanks, and yes, I still plan on thanking you properly once Amelia’s lungs are back to full capacity).
Over the six months of study, I learned a whole lot about coding. But this post is about life lessons. And perhaps the most important life lesson I’ve learned is that coding is one part natural ability, 10 parts experience, and 1 part, on equal par with natural ability, a relentlessness to solve the problem and keep going. Anyone feeling any kind of imposter syndrome, remember this — so long as you keep trying to gain more experience, your natural ability becomes less and less important in the long run. I’m not even sure if natural ability plays that much into — because if you love to code, and you are hard working and don’t give up, you will eventually get enough skills to be able to keep on pushing forward.
Weirdly enough, I’ve come to realize that learning better ways to fail is far more important than learning ways to succeed. As I got deeper and deeper into harder and harder code, the skill that really helped me push forward the most was figuring out how to purposefully fail, and watch those failure points, making slight adjustments, as I eventually had that ‘omg it actually worked’ moment. Over the course of six months, I went from writing all methods at a time before testing them, to writing one line of code at a time, building in a test, and expecting it to fail, only pushing to the next line of code when things start to take shape. Occasionally, I’d gain a bit of confidence, and write a full method before testing, but that would only be if I’d done something similar successfully, and I had the scars to prove it (thanks, Matt, for teaching me this and for answering my annoying questions all the time).
As I’ve been writing this blog post, my coding partner on the final project has been writing more code. Our final project is submitted and we pulled off our crazy MVP, but there’s still so much we want to do before we can launch it for reals. And today, she’s managed to fix the next tricky bug as I’ve been writing words. It feels good to write the words though. I needed a pause from the code to give time to my family. But it won’t be a pause for long. The final project taught me perhaps the most important coding lesson of all — find a coding partner who offers sympathy when you break all the code, who is relentless, comfortable in their own failure, and who most importantly, fixes bugs while you take much needed time out. Thanks very much to my coding partner, Crystal. The course is over, but our project lives on.
Over the next few weeks, I’m gonna make sure my kids are healthy, my husband has some much deserved rest, we all take a family vacation. I’m also gonna properly thank all those who’ve helped me in finally feeling brave enough to self-identify as a mother, writer, and coder. And then, it’s back to juggling all these sides of self.