뛰어난 프로그래머가 되기 위한 가장 중요한 덕목은 뭘까? 개인적으로;
* 바로 부지런히 새로운 것을 배우려는 자세라고 생각한다.
일단 난 게으른 편이고 새로운 지식이나 스킬을 배우는 속도도 정말 느리다. 그래서 이런 주제에 대해 이야기하는게 정말 부끄럽다. 그런데 한 가지 내가 잘한다고 느끼는 것을 말해보까? '바로 쪼잔하다는 거다.'
* 쪼잔하다? 그게 뭔 소리니?
쪼잔하다는 게 뭔 소리인데 풀어서 설명을 해볼까? 코드를 한 줄 추가할 때나 분석할 때 스스로 나에게 다음과 같은 질문을 던진다.
* 배열의 인덱스가 제대로 처리되고 있나?
* 배열을 초기화하지 않고 사용하면 문제가 되지 않을까?
* 이 코드 구간에서 레이스 컨디션이 발생하면 어떻게 될까?
* 지금 보는 코드가 실행 중에 Preemption이 되거나 인터럽트가 발생하면 어떻게 될까?
* 이 함수가 실행할 때 스택은 얼마나 쓸까?
* 지역 변수를 추가하면 스택을 얼마나 증가할까?
* 이 코드를 추가하면 GCC는 어떤 어셈블리 코드로 변환할까?
* 함수로 전달되는 포인터가 NULL이면 어떻게 동작할까?
* 전달되는 메모리 포인터는 슬럽일까? 슬럽이면 어떤 슬럽 오브젝트일까?
* likely/unlikely 와 같은 GCC 빌트인 함수를 쓰면 GCC는 어떻게 코드를 재배치할까?
* 이 함수가 혹시 인터럽트 컨텍스트에서 실행하면 어떻게 될까?
* 시그널을 보냈는데 시그널을 받을 프로세스가 Preemption이 되면 어쩌지?
* 이 코드를 실행할 때 동적 메모리의 사용량이 부족하면 어떻게 될까?
정말 코드를 피곤하게 본다고 생각할 수 있다. 그런데 여기서 그치지 않는다. 내게 던진 질문에서 한 걸음만 더 나가볼까?
* 배열의 인덱스가 제대로 처리되고 있는지 어떻게 알 수 있을까?
* 배열을 초기화하지 않고 사용하면 문제가 되지는 어떻게 검출할 수 있을까?
* 이 코드 구간에서 레이스 컨디션이 발생해 문제가 발생할 것 같으면 어떻게 방지할까?
* 지금 보는 코드가 실행 중에 Preemption이 되거나 인터럽트가 발생해 문제가 된다면 이를 어떻게 방지할까?
* 이 함수가 실행할 때 스택을 많이 써서 스택 오버플로가 된다는 이를 어떻게 방지하고 검출할까?
* 지역 변수를 추가해 스택이 많이 증가한다면 이를 어떻게 검출할까?
* 이 코드를 추가하면 GCC가 변환된 어셈블리 코드는 어떤 모습일까?
* 함수로 전달되는 포인터가 NULL라 문제가 발생한다면 이를 어떻게 방지할까?
* 전달되는 메모리 포인터는 슬럽이라면 남은 슬럽 오브젝트의 갯수는 몇 개일까?
* likely/unlikely 와 같은 GCC 빌트인 함수를 써서 GCC가 재배치하는 코드는 어떤 모습일까?
* 이 함수가 혹시 인터럽트 컨텍스트에서 실행해 문제가 생기면 이를 어떻게 방지해야 할까?
* 시그널을 보냈는데 시그널을 받을 프로세스가 Preemption이 된다면 이를 어떻게 방지해야 하나?
* 이 코드를 실행할 때 동적 메모리의 사용량이 부족해 어떤 문제가 발생할까?
여기서 두 걸음만 나가볼까? 이제는 적기도 귀찮다.
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자

최근 덧글