Debug it! 실용주의 디버깅


일반적인 Automotive SPICE 컨설팅이었다면 이 책을 볼 필요는 없었을지도 모른다. 대개 그런 컨설팅할 때 코드 개발의 디테일한것까지 알려달라고 하지 않기 때문이다. 내가 개발 part leader도 아니고, 그런건 알아서 해야지 하나하나 가르치기에는 시간이 너무 부족하지 않겠는가?

(그런데 최근의 고객사 경험에서는 그럴 필요성이 있었다!! 나름 재미있고 유쾌한 경험이었다. 개발 파견직원처럼 3일간 파견나가서 죽어라 개발일을 했는데, 생각보다 그런 부분에 취약했다는 점에 놀랐다.. 물론 모든 업체들이 그렇다고 일반화하는 것은 아니다만..)

그런데 최근에 수행중인 A-SMGCS에서의 나 자신의 role을 생각했을 때, 이런 부분에 대한 가이드도 필요할 수 있을 것이라 생각해서 읽게 되었다. 어떻게 해서라도 그 project를 성공시켜야 하는 것이 나의 사명이고 나의 목표이기 때문에..

근데, 이 책은 생각보다 상당히 디버깅을 하기 위한 여러가지 고려사항을 알려준다. 책 한번만 읽고 넘기기에는 너무나도 precious하다. 개발 프로세스와도 연관이 있고 sucking하는일을 멈추고 awesome할 수 있도록 (최근에 본 책 제목처럼..ㅋㅋ) 상당한 교훈들을 제공한다.

70%정도 완료한 상태에서 상당히 맘에 드는 내용이 많아 일단 서평을 이렇게 올려본다.

물론 난 개발자도 아니라서 그런걸 알 필요가 없을지도 모르지만, 최근에 별걸 다하는 컨설턴트가 되어야 하는 입장에서는 이런것 조차도 알아야 할 필요가 있고, 재밌기도 해서 행운이라 생각함.

좋은 테스트/나쁜 테스트


단위 테스트의 장점: 잠시 손을 멈추고 테스트에 대해 생각하게 만든다

이런 질문을 자신에게 하게 된다.

  • 이걸 어떻게 테스트하지?
  • 어떤 종류의 테스트를 해야 하지?
  • expected result가 뭐지?
  • 흔하지는 않지만 발생할 수 있는 예외가 있는가?
  • 어떤 종류의 시스템 오류를 발생시킬 수 있는가?
  • 이 코드에는 외부 의존성이 얼마나 있지?

단위 테스트를 통해 프로그램이 올바르게 동작하는 것을 보장하지는 않음. 단지 위의 질문을 통해 보다 옳은 방향이 되도록 인도한다는 것일 뿐.

단위테스트를 너무 철저하게 하는 것도 문제다. 단위 테스트를 너무 철저하게 하면 코드 수정시에 문제가 발생한다. 리팩토링을 하게 되면 지금껏 했던 단위테스트를 모두 버려야 할 수도 있다. 그렇다고 리팩토링을 하지 않느냐? 그것도 쉽지 않다. 코드 개선은 지속적으로 이루어져야 한다. 그럼 어느 수준으로 단위테스트를 해야 할까? 이 부분에 있어서 적절한 지점을 찾는 것은 쉬운일이 아니다.

그래서 내 개인적인 생각으로는 public interface의 경우에는 철저하게 고민하고 가급적 변경하지 않도록 해야 한다. 충분히 고민할 시간적 여유가 있어야 한다. interface만 unit test하도록 하는 정도가 적당하지 않을까 싶다.

Ultimate code kata(궁극의 코드 카타)


There is a person who aims at fun for whatever it is, and there is a person aiming at improvement of a skill through some training. Such is the act of driving. Even if you drive for several years, your driving ability does not increase more than a certain level. That’s because drivers feel that enough.

There are people who play a lot of games at the same time, and others who do not improve their skills. The difference is whether or not they practice to improve their skills.

In addition to playing ping pong before, I have also played table tennis in addition to exercising various techniques. I have never really learned anything to anyone.

People who maintain a physically fit body exercise regularly and continue to exercise. If you do not, your body will be broken. Programming and engineering are the same.

Skill-up is achieved through “effort-filled learning”. So, even if you have worked for 10 years, their skill level is not the same.

Ericsson argues that the important thing is not the experience itself, but the “effort-filled learning” that is constantly endowed with a level of challenge that is somewhat beyond the ability of a person now. That’s why well-trained students outperform their skills in a relatively short time, while ordinary people spend thousands of hours dealing with chess, golf, or musical instruments, but do not get off to amateur level. For example, it is interesting to note that the time spent in chess placement, even including the time to participate in the tournament, does not significantly affect the person’s chess ability compared to systematic training. The main value of training in such games is to take current weaknesses for future learning.

What is my training on my personal stand?

  1. Read and organize books. Blogging the main content. (What I do now)

  2. In order to make the activities required for consulting better, listen to the training and apply the training quickly.

Advice for Developers

  1. Reading the code

  2. Maintaining the wrist cord

  3. Join the open source project

 

제목: 궁극의 코드 카타

무엇을 하더라도 재미를 목적으로 하는 사람이 있고, 어느 정도의 수련을 통해 실력향상을 목적으로 하는 사람이 있다. 운전하는 행위가 그러하다. 몇년간 운전을 해도 운전실력은 어느 정도 이상 늘지 않는다. 그것은 운전자들이 그 정도만 되면 충분하다고 느끼기 때문이다.

같은 시점에 여럿이 게임을 해도 엄청난 고수가 되는 사람이 있는가 하면, 실력이 고만고만하여 나아지지 않는 사람이 있다. 그들의 차이점은 실력향상을 위한 수련을 하느냐 하지 않느냐의 여부일 것이다.

전에 탁구를 칠때에도 운동을 하는 목적 외에도 다양한 기술을 연마하면서 탁구를 친 적이 있다. 딱히 누구에게 정식으로 배운 적은 없지만..

신체적으로 좋은 몸매를 유지하고 있는 사람은 정기적으로 운동을 하고, 계속 운동을 한다. 그렇게 하지 않으면 몸매가 망가지기 때문이다. 프로그래밍과 엔지니어링도 이와 마찬가지다.

skill-up은 “노력이 담긴 학습”을 통해 달성된다. 그래서 10년간 어떤 업무를 했다고 하더라도 그들의 능력 수준이 다 같은 수준이 아닌 것이다.

에릭슨은 중요한 것은 경험 그 자체가 아니라 어떤 사람이 현재 가지고 있는 능력을 약간 뛰어넘는 수준의 도전이 끊임없이 부여되고 그에 대응하는 ‘노력이 담긴 학습’이라고 주장한다. 평범한 사람들이 체스나 골프 혹은 악기를 다루는 일에 수천시간을 보내고도 아마추어 수준에서 벗어나지 못하는 반면, 제대로 훈련을 받은 학생은 상대적으로 짧은 시간 안에 그들의 실력을 뛰어넘는 이유가 여기에 있다. 예컨데 체스를 두는 데 들어가는 시간이, 심지어 토너먼트에 참가해서 두는 시간까지 포함해도, 체계적인 훈련에 비해 그 사람의 체스 실력이 느는 데 큰 영향을 주지 못한다는 사실은 흥미롭다. 그러한 게임에서 훈련의 주된 가치는 미래의 학습을 위해 현재의 약점을 한단계 끌어 올리는데 있다.

개인적 입장에서의 나의 훈련은?

  1. 책을 읽고 정리한다. 주요 내용을 블로깅한다. (지금 하는 것)

  2. 컨설팅 시에 요구되는 활동을 보다 능숙하게 하기 위해 교육을 듣고 그 교육을 빠른 시간 내에 적용한다.

개발자를 위한 조언

  1. 남이 짠 코드 읽기

  2. 남이 짠 코드 유지보수하기

  3. 오픈소스 프로젝트에 참여하기