1. index와 data를 일치하게 하라.
- bitmap technique
2. sort를 이용하라.
sort의 목적
1. 보기 좋으라고
2. 빠른 찾기 - binary search
3. 공간을 적게 먹으면 일반적으로 시간도 절약된다.
4. juggling action (n칸 건너 뛰기를 이용하면 n칸 shift를 구현할 수 있다.)
5. (aT bT)T = b a
(aT bT cT)T = c b a
(T는 array reverse)
이것을 이용하면 n칸 shift를 더 쉽게 구현할 수 있다.
그리고 이 방법은 언뜻보기에 juggling action보다 2배의 시간을
소요할 것 같지만 memory의 locality를 증가시키기 때문에
cache의 hit ratio를 높혀서 더 빠르게 수행될 수도 있다.
6. 전철어구, soundex matching
- sort를 먼저하고 비교하라.
7. 반복되는 작업은 array를 이용하라.
8. 반복되는 작업을 모아 sub module로 만들어라.
9. 복잡한 구조는 캡슐화하라.(encapsulate)
10. 최신의 도구를 사용하라.
(있는 도구를 최대한 활용하라.)
11. 데이타 구조가 프로그램이 되게 하라.
(data structure를 잘 설계하면 프로그램이 이해하기 쉬워지고
성능도 향상된다.)
12. data와 control을 분리하라.
(MVC 모델 - Model, View, Control)
13. divide and conquer를 사용하라.
1. 문제를 잘라서 sub problem으로 만든다.
2. 문제의 boundary를 점점 좁혀 나간다.
3. 가장 간단한 문제만 푼다.(recursion)
14. Requirement, Algorithm design, Data structure
15. Profiling을 통해 Hot spot를 먼저 개선하라.
16. Algorithm 개선이 hardware independent 일 필요는 없다.
17. 실행시간을 미리 추정해보라.
18. Compiler의 모든 최적화 옵션을 활용하라.
19. test by dimension
20. 상식에 맞는 값인지 check해 본다. - performance test
1. 실험을 통해 간단하고 중요한 파라미터들을 알아낸다.
단위 operation, 초기화, 최소 boundary, 최대 boundary
2. 간단한 계산을 미리해서 비슷한 지 살펴본다.
21. 입력, 출력 등을 예상할 수 없을 때는 safety factor를 크게 잡아라.
(6~10배로 잡을 것)
그것은 잠재적인 문제를 피할 수 있게 해준다.
safety factor는 우리의 실수와 approximation을 보상해 줄 만큼 커야한다.
22. Little의 법칙
단위시간당 Queue를 떠나는 object의 갯수
x Object가 Queue에 머무르는 시간
= Queue에 머무르는 object의 평균 갯수
물리학의 연속방정식과 비슷함.
Enrico Fermi problems (페르미 근사)
back of the envelope
23. 자신의 한계를 인식하는 것이 중요하다.
24. dynamic programming
25. preprocessing
26. scanning algorithm
27. accumulation
28. lower bound, upper bound
Reference
1. The art of computer programming
2. Code complete - A Practical Handbook of Software Construction - Steve McConnell
3. Rapid Development
4. Software Project Survival Guide
5. Writing Solid code
6. Practice of Programming - Kernighan, Pike, Addison-Wesley
7. How to solve It - Polya
8. How To lie with Statistics - Darrel Huff
9. Innumeracy: Mathematical Illiteracy and Its Consequences(Farrar, Status and Giroux) - John Allen Paulos
10. Mythical Man Month
논문
1. Multiplicative speedup of systems(Perspectives on Computer Science, Academic Press)
2. http://www.research.microsoft.com/%7Elampson/
배운 점
1. 내가 industry에서 생각하고 있는 많은 문제들과 해결책이 들어있어서
놀랐음. 대부분의 사람들은 비슷한 환경에서 비슷한 생각을 함.
2. software engineering도 다른 공학과 마찬가지임.
다른 분야의 기본적인 것들이 여기에서도 충분히 응용될 수 있음.
독서 소요시간 : 2004년 7월 24일 ~ 7월 31일(1주일)
댓글 없음:
댓글 쓰기