카테고리 보관물: How to stop sucking and be awesome instead

좋은 테스트/나쁜 테스트


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

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

  • 이걸 어떻게 테스트하지?
  • 어떤 종류의 테스트를 해야 하지?
  • 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. 오픈소스 프로젝트에 참여하기

페인트 통에 적힌 사용법을 제대로 따르는가?


별것도 아닌데 지키지 않으면 엉망이 된다. 그런 의미에서 하라는대로만 하면 잘 된다는 맥락

아래는 페인트 통에 적힌 사용법과 같이 개발을 위한 가이드로서 하라는 건 지키라는 의미이다.

조엘 스폴스키가 작성한 체크리스트

  1. 소스코드 관리시스템
  2. 한방에 코드 빌드
  3. 데일리 빌드
  4. 버그 추적 or 버그 DB
  5. 버그 수정이 새 코드 작성보다 우선
  6. 최신 버전의 스케줄
  7. 요구사항 명세를 가지고 있음
  8. 개발자들은 조용한 환경에서 작업
  9. 최고의 툴을 사용
  10. 별도의 테스터 인력
  11. 인터뷰 수행 후보자들이 인터뷰 도중 코드 작성
  12. 무작위 사용성 테스트

ASPICE나 ISO26262, 혹은 DO-178C같은 것들도 paint 통이 될 수 있겠다.