Web Dev

러버덕 디버깅 이야기

DuL2 2022. 8. 17. 23:39

 오늘 지혜님이 재밌는 것을 찾았다며 개발자의 생각 방법에 관련된 포스트를 보내주시며 러버덕 디버깅이란 것을 알았다고 말씀을 해주셨다.

 

러버덕 디버깅

In software engineering, rubber duck debugging (or rubberducking) is a method of debugging code by articulating a problem in spoken or written natural language. The name is a reference to a story in the book The Pragmatic Programmer in which a programmer would carry around a rubber duck and debug their code by forcing themselves to explain it, line-by-line, to the duck.

 러버덕 디버깅 유래를 읽고나니 너무 재미있었다. 실제로 회사에서 중얼거리시는 분들이 있다고 하는데 그렇게 문제와 문제의 원인에 대해 스스로 정리를 하게 되면서 문제를 이해하는데 큰 도움이 되는 것 같다. 나도 나만의 러버덕을 만들어야 할까..?

러버덕아~~ 이건 말이야..!

 다른 글을 또 읽었는데 재밌는 이야기다.

밥은 사무실 구석을 가리켰다. “저기에” 하고 그가 말했다. “오리가 한 마리 있지. 일단 저 오리에게 질문을 해보게.”

나는 오리를 바라봤다. 그것은 사실 인형 오리로, 살아있는 오리가 아니었다. 설령 그것이 살아있었다고 해도, 코드 설계와 관련된 정보를 얻을 만한 곳으로는 적당하지 않았을 것이다. 나는 다시 밥을 바라봤다. 밥은 장난을 하는 것이 아니었다. 그는 나의 상사였으므로 나는 내 자리를 지키기 위해서라도 이 일을 해야만 했다.

나는 엉성한 자세로 오리에게 다가가 고개를 숙였다. 마치 기도를 하기라도 하는 것처럼 오리를 향해 다가섰다. “이봐,” 밥이 말했다. “뭘 하려는 거야?”

“오리한테 질문을 하려고 하는데요.” 내가 말했다.

밥의 부하직원 중 한 명이 사무실 안에 있었다. 그는 이를 쑤시면서 악당 같은 미소를 짓고 서 있었다. “앤디” 하고 그가 말했다. “나는 자네가 오리한테 기도를 하길 바라는 게 아냐. 자네가 오리한테 질문을 던졌으면 해.”

나는 입술에 침을 묻혔다. “큰 소리로 말이에요?” 내가 말했다.

“큰 소리로.” 밥이 엄숙한 표정으로 말했다.

나는 목소리를 가다듬었다. “이봐 오리야,” 하고 나는 시작했다.

“그 친구의 이름은 밥 주니어라네.” 밥의 부하직원이 끼어들었다. 나는 그를 잠시 쏘아봤다.

“오리야,” 하고 나는 계속했다. “U자형 걸이를 사용할 때 말야, 머리 부분을 밖으로 꺼낼 때 스프링클러 파이프가 걸이에서 튀어 오르는 것을 막는 방법이 도대체...”

오리에게 질문을 하는 도중에 해결책이 머릿속에 떠올랐다.

U자형 걸이는 철심의 길이 정도 위에 있는 구조물에 고정돼 있다. 파이프 배관공이 걸이가 파이프 위에 달라붙도록 철심을 자르면 결국 그것이 파이프를 붙잡아서 걸이가 튀어 오르는 것을 막아줄 것이다.

나는 밥을 바라봤고 밥은 고개를 끄덕였다. “이제 알겠지, 응?” 그가 말했다.

“철심이 파이프 위로 지나가게 하면 될 것 같아요.” 내가 말했다.

“맞아.” 밥이 말했다. “다음에 질문할 게 있으면 우선 이곳으로 와서 내가 아니라 오리에게 질문하길 바라네. 큰소리로 물어야 해. 그래도 해답을 알 수 없으면 그땐 나한테 와서 질문해도 좋아.”

“알겠습니다.” 나는 그렇게 대답하고 다시 일하러 내 자리로 돌아갔다.

 

재밌는 이야기이다. 나도 누군가에게 쉽게 물어보기 전에 나의 러버덕을 찾아 스스로 정리하고 누군가에게 설명할 수 있는 준비를 해야겠다고 생각을 하게 되었다.

 

 또한, 문제 해결에 도움이 되는 글을 정리하여 덧붙이려고 한다. 개발자가 문제에 직면했을때 어떠한 자세를 취해서 문제 해결을 해야하는 가에 대한 이야기이다.

 

  1. 문제에 대한 이해
    • 무엇이 문제인지 정확히 알아야한다!
    • 대부분의 어려운 문제는 무엇이 문제인지 알기가 어렵고 난해하다.
    • 문제를 이해했는지 확인하기 위한 방법으로는 글이나 말로 설명할 수 있는지, 다이어그램을 그려보는 방법 등이 있다.
    • 러버덕에게 물어보자.
      • 실제로 주변 동료들에게는 미안하지만 궁금한 점이나 오류가 나는 부분을 설명하고 대화하다보면 내가 놓쳤던 부분을 스스로 찾거나 키워드를 생각해내어 문제를 해결하는 일이 종종 있었다. 누군가에게 도움을 청하기 전에 나의 러버덕에게 물어보는 습관을 들인다면 더 좋은 문제 해결 능력을 가질 수 있을 것이다.
  2. 해결을 위한 계획
    • 계획없이 바로 문제를 해결하지 말자.
    • 바로 뛰어들지말고 문제를 해결하기 위한 절차에 대해 생각해보고 단계별로 구상해놓자.
      • 이 단계를 듣고나니 알고리즘을 풀 때 단계 별로 생각하고 해결해 나가는 연습을 하는 것이 얼마나 중요한 것인지 다시 한번 느끼게 되었다. 직관적으로 풀려고 하는 급한 성격이 이를 방해하기에 알고리즘 문제를 풀며 성장해 나가는 것이 좋을 것 같다.
  3. 문제를 쪼개기
    • 만약 문제가 큰 규모로 구성되어 있다면 문제를 하위 문제로 나누자.
    • 이렇게 하위 문제로 나누게 되면 훨씬 쉽게 문제를 해결할 수 있다.
    • 문제를 나눌 때는 각 하위 문제가 서로를 의존하지 않도록 단순하게 만들어 문제를 해결하고 하나씩 점을 연결해 해결해 나가면된다.
  4. 어려운 문제 난이도로 인한 막힘?
    • 만약 문제가 너무 어려워 해결할 수 있다면 짜증을 내기보다 호기심을 가지고 다음 세 가지 방법을 해보자
      • 디버그: 솔루션을 단계별로 실행하여 잘못된 위치를 찾는 것.
      • 재평가: 한 발 물러서서 다른 관점으로 문제를 바라보기. 좀 더 일반적인 방식으로 추상화 될 수 있는 문제인가?
      • 사이드 노트: 재평가를 위한 또 다른 방법은 아예 새롭게 시작하는 것. 진심으로 이것이 도움이 되며 얼마나 효과적인지 알면 어처구니가 없을 것이다.

위의 방법을 연마하여 좋은 개발자로서 원만히 문제를 해결할 수 있는 실력을 기르도록 하자.

 

 읽은 글에서 "많은 문제를 만나라"라고 조언을 해주는데 코딩을 처음 배웠을때 많은 오류를 만날 수록 성장할 수 있다는 이야기를 들었던 기억이 있다. 같은 맥락의 말이라고 생각된다. 

 

“한 장애물을 넘었다고 생각하면 다른 장애물이 나타납니다. 하지만 그게 인생을 흥미롭게 하는 이유죠. […]
인생은 이러한 장애물들을 뚫고 지나가는 과정입니다. 즉, 우리가 반드시 뚫고 지나야 할 일련의 선들입니다.
매번, 당신은 뭔가를 배울 것입니다.
매번, 여러분은 힘, 지혜, 그리고 관점을 만들어나갈 것입니다.
매번, 경쟁은 조금씩 줄어들 것입니다. 결국 마지막 남는 것은 최고가 된 당신뿐일 겁니다.”
— Ryan Holiday (The Obstacle is the Way)

 

 

 

읽은 글

 

How to think like a programmer — lessons in problem solving

by Richard Reis By Richard Reis [https://twitter.com/richardreeze]If you’re interested in programming, you may well have seen this quote before: > “Everyone in this country should learn to program a computer, because it teaches you to think.” — Ste

www.freecodecamp.org

 

고무오리 문제 해결법 | 위키북스

고무오리 문제 해결법 등록일: 2014. 10. 15

wikibook.co.kr

 

러버덕 디버깅

안녕하세요? 소프트웨어 교육기업 코드스쿼드에서 잉여로움을 담당하고 있는 클라우드 및 디비 마스터 정호영입니다.

codesquad-yoda.medium.com

 

How do I ask a good question? - Help Center

Q&A for computer enthusiasts and power users

superuser.com