타고난 사람만 프로그래밍을 잘 할수 있는 걸까?
공부라는것을 하다보면 어떤 사람은 바로바로 알아듣고 훌륭하게 해내는 천재적인 사람이 있다. 그런 사람들을 보면 참 허무하고 억울하기까지 하다. 왜 나는 천재로 태어나지 못했는가!
프로그래밍도 마찬가지다. 나는 몇 시간을 고민해도 안되는 것을 어떤 사람은 순식간에 생각치도 못한 기막힌 코드를 짜내서 문제를 쉽게 해결을 한다. 무엇이 그런 차이를 부르는 걸까?
정말 천재가 아닌 이상 당연히 노력이 선행되어야 하지만, 단순히 열심히 하는것이 아니고 올바르게 열심히 해야 좋은 성과가 나온다. (이에 대해서는 1만 시간의 재발견이라는 책을 읽으면 도움이 될 것이다. 무조건 적인 노력이 아니라 의식적인 연습을 통해야 발전을 할 수 있다) 특히나 나처럼 비전공자이고 나이도 남들보다 많아 시간이 부족하다면 시행착오도 최소화 해야한다.
프로그래밍으로 한정한다면 "나는 프로그래머다 2 (한빛미디어)" 를 참고하기 바란다.
여기서 이광근 교수는 다음과 같은 세 가지를 좋은 프로그래머 되기 위한 자질로 꼽았다.
첫째, 빈틈없이 생각하기
둘째, 머릿속으로 궁리하기
셋째, 커뮤니케이션 능력
"이중 가장 중요한것은 머릿속으로 궁리하기다. 이는 머릿속에 어떤 계단을 만들어서 한 걸음씩 밝고 올라가는 것과 비슷하다. 논리적 규칙을 기억하면서 사고를 발전시키는 능력이다. 이 능력이 부족한 사람은 계단을 밟으려고 하면 계단이 허물어지기 때문에 생각이 발전하지 못하고 제자리 걸음만 되풀이한다."
"다음으로 중요한 것은 빈틈없이 생각하기다. 한 줄의 코드라도 전후좌우를 둘러싸고 있는 엔지니어링적 요소를 꼼꼼하게 생각하면서 짜는 능력은 단순히 반복된 경험이나 훈련으로 생기는 것이 아니다. 코드가 메모리를 낭비 없이 잘 사용하는지, CPU를 효율적으로 사용하는지, 코드가 실전 가이드(best practices)를 잘 따르고 있는지, 확장성이 있는지, 이해하기 쉬운지, 코드 베이스 내부의 다른 코드와 정확한 방식으로 상호작용하는지, 테스트 하기 쉬운지, 로깅이나 모니터링과 관련해서 필요한 내용을 담고 있는지, 그리고 요구사항을 정확하게 반영하고 있는지, 이런 다양한 요소들을 한꺼번에 전면적으로 고려하는 것은 고도의 능력과 경험을 필요로 한다."
"마지막은 커뮤니케이션 능력이다. 개발자가 갖추어야 할 커뮤니케이션 능력을 다음과 같이 정의하였다.첫째, 명확하지 않은 이야기 속에서 지엽적인 것을 걸러내고 본질을 파악하는 능력둘째, 복잡한 논리나 추상적인 개념을 상대방이 이해할 수 있게 설명하는 능력셋째, 타인의 감정을 이해하는 공감 능력"
- 팟캐스트 나는 프로그래머다 2탄 (한빛미디어) 중 일부 발췌
처음에 프로그래밍을 하면 모니터 속 커서는 깜박거리고, 나는 무엇을 만들지 모르겠고, hello world는 찍겠는데 그 다음은 어쩌라는건지 정말 답답했다. (뭐 그렇다고 지금은 뚝딱뚝딱 만드는건 전혀 아니다) 그렇지만 그 답답함과 수수께끼를 풀어가는 단계를 지나가야 혼자 코드를 짤 수 있다고 했다. 그래서 처음 배울 때 강사님은 작은 문제에도 꽤 긴 시간을 주어 생각할 수 있도록 배려하셨다. 정말 답답해서 손발이 오그라들고 초조해지지만 바로 답을 보지 않고 끝까지 풀어보고자 노력한 것은 분명 도움이 되었다고 생각한다.
학습에 있어서 시행착오를 최소화 하기 위해 스킬에 관련된 책 뿐만 아니라 좋은 개발자가 되는 지침서(?) 같은 책들도 즐겨 읽는 편이다. 다음은 개인적으로 읽은 책들의 목록이다.
훌륭한 프로그래머 되는 법(한빛미디어)
소프트웨어 장인 (길벗)
소프트 스킬(길벗)
책마다의 주장이 다르지만, 그 속에 공통되는 의견들이 존재한다. 그게 진리는 아니겠지만 앞서서 간 사람들의 경험을 습득하고 그에 대해 대비를 한다면 시행착오를 최소화 할 수 있을거라고 생각한다.