•
소프트웨어 공학자에게 기본 재료는 인간의 두뇌이며 도구는 자신의 손이다.
1. 성격은 주제를 벗어난 것이 아닌가?
•
프로그래밍의 내적 탐구에 있어서 개인의 성격이 특히 중요하다.
•
지성은 어떻게 할 수가 없고 고전의 지혜도 마찬가지지만 개인의 성격에 대해서는 무언가를 할 수 있다. 그리고 성격은 훌륭한 개발자를 만드는 결정적인 요소다.
2. 지성과 겸손
•
뛰어난 지성은 필요 없다. 일반적인 프로그램을 완전하게 이해하려면 세부 사항을 받아들이는 무한한 포용력과 그것들을 파악할 수 있는 능력이 동시에 필요하다.
◦
생각을 집중하는 방법이 지능보다 더 중요하다는 뜻이다.
•
다양한 좋은 프로그래밍 습관이 달성하고자 하는 목표는 뇌의 부담을 덜어주는 것이다. 다음은 몇 가지 예다.
◦
시스템 분해의 핵심은 그것을 이해하기 쉽도록 더욱 간단하게 만드는 것이다.
◦
재검토와 조사, 테스트 작업은 예상된 인간의 오류 가능성을 보완하는 한 가지 방법이다.
▪
자신의 지적 능력을 스스로 올림에 한계가 있음을 인지하고 있기 때문에 다른 사람의 지적 능력을 이용해서 올리는 것이다.
◦
메소드를 짧게 만들면 뇌의 부담이 줄어든다.
◦
구현 세부 사항 수준의 관점 대신 문제 도메인 관점에서 프로그램을 작성하면 정신적 부담이 줄어든다.
•
경험적으로 자신의 오류 가능성을 보완하려 노력하는 겸손한 개발자는 자신뿐만 아니라 다른 사람도 이해하기 쉽고 오류가 적은 코드를 작성하는 것으로 밝혀졌다.
3. 호기심
•
뛰어난 개발자가 되는 과정에서 기술적인 문제에 대한 호기심은 매우 중요하다.
•
빠르게 변화하는 프로그래밍 세계에서 그러한 변화를 따라갈 호기심이 없다면 한물간 개발자가 될 것이다.
•
다음은 호기심을 훈련하고 배우는 것에 우선순위를 두기 위해 할 수 있는 몇 가지 구체적인 활동들이다.
◦
개발 과정에 대한 자신의 인식을 구축하라.
▪
책을 읽거나 소프트웨어 개발 과정을 직접 관찰하면서 개발 프로세스에 대해 더 많이 알게 될수록 변경 사항을 이해하고 좋은 방향으로 나아갈 수 있게 된다.
▪
자신만의 가치관을 여러 경험들을 통해 쌓으라는 조언같다.
◦
실험하라.
▪
프로그래밍을 효과적으로 학습하는 방법 중 하나는 프로그래밍과 개발 프로세스를 작성해보는 것이다.
▪
언어의 기능이 어떻게 작동하지 모른다면 해당 기능을 사용할 수 있는 프로그램을 작성한 다음 어떻게 동작하는 지 확인해본다.
◦
문제 해결에 관한 책을 읽어라.
◦
행동이 앞서기보다 분석하고 계획을 세워라.
◦
성공적인 프로젝트를 학습하라.
◦
문서를 읽어라.
▪
설명서 좀 읽고 프로그래밍하자.
◦
다른 전문가들과 관계를 맺어라.
▪
컨퍼런스에 참여하거나 지역 사용자 그룹에 가입하거나 온라인 토론 그룹에 참여하라.
◦
전문적인 개발자가 될 수 있도록 노력하라.
▪
다음은 저자의 회사를 비롯한 몇몇 회사에서 사용하는 전문적인 개발 단계다.
•
1단계: 초보, 초보자란 한 가지 언어의 기본 기능을 사용할 수 있는 개발자를 말한다.
◦
클래스와 메소드, 조건문을 작성할 수 있으며 해당 언어의 많은 기능을 사용할 수 있다.
•
2단계: 입문, 초보 단계를 넘어온 중급 수준의 개발자는 여러 언어의 기본 기능을 사용할 수 있으며 적어도 한 가지 언어를 능숙하게 다룬다.
•
3단계: 유능, 유능한 개발자는 한 가지 언어나 환경, 또는 둘 모두에 관한 전문적 기술을 갖고 있다.
•
4단계: 리더십, 리더는 3단계 개발자의 전문적인 지식을 갖고 있으며 프로그래밍이 컴퓨터와의 의사소통 15와 사람과의 의사소통 85%로 이뤄진다는 사실을 알고 있다.
▪
가독성을 강조하지 않는 코더는 아마도 3단계에 머물러 있거나 아마 보통은 그 아래 단계에 있을 것이다.
4. 지적인 정직함
•
전문적인 개발자가 되기 위해서는 지적인 정직함과 타협하지 않는 능력을 개발해야 한다.
•
지적인 정직함은 보통 다음 같은 방법들로 명백하게 드러난다.
◦
전문가가 아님에도 전문가처럼 행동하지 않는 것
◦
실수를 기꺼이 인정하는 것
◦
오류 메시지를 막기보다는 컴파일러 경고를 이해하려고 노력하는 것
◦
컴파일해서 프로그램 작동 여부를 확인하기보다는 먼저 프로그램을 명백하게 이해하려고 노력하는 것
◦
현실적인 상황에 맞춰 해결안을 제시하는 것
◦
현실적인 일정표를 제공하고 관리자가 일정을 조절할 수 있는지 물었을 때 자기 뜻을 지키는 것
5. 의사소통과 협동
•
프로그래밍은 다른 개발자와의 의사소통이 우선이며 그 다음이 컴퓨터와의 의사소통이다.
6. 창의성과 훈련
•
창의성을 발휘하기 위해선 적절한 제약 조건이 필요하다.
•
코드를 작성하기 전에 요구사항을 분석하고 설계하는 제약 조건이 없다면 프로젝트에 대한 상당 부분을 구현 중에 알게 될 것이며 작업한 결과는 좋지 않을 것이다.
7. 게으름
•
게으름은 다음과 같은 방법으로 표출된다.
◦
재미없는 작업을 미루는 것
◦
재미없는 작업을 신경 쓰이지 않도록 빨리 처리하는 것
◦
재미없는 작업을 다시 수행할 필요가 없도록 툴을 작성하는 것
•
첫 번째는 유익한 게으름이라고 말하기 어렵다.
•
두 번째는 재미없는 무언가에 최소한 시간을 투자함으로써 문제를 해결하려 노력하고 있다. 다만 이때 게으름이 앞서 꼼꼼함을 놓치지 않도록 하라.
•
세 번재는 재미없는 일을 처리하기 위해서 툴을 작성하는 것이다. 이는 장기적인 게으름이며 가장 생산적인 게으름이다.
•
무리하게 하거나 노력하는 것은 더 이상 효과적이지 않다. 무리함은 부가적이고 불필요한 노력이다.
•
효과적인 프로그래밍은 생각하는 것인데, 생각하지 않는 프로그래밍은 그 어느것에도 도움이 되질 않는다.
8. 덜 중요한 특성
인내심
•
포기할 때를 알기란 어렵지만 그 시기를 꾸준히 확인하는 것은 중요하다. 좌절하고 있다는 것을 알아차릴 때가 그러한 질문을 하기 좋은 시기다.
◦
이 접근 방법을 사용하여 30분 안에 해결할 수 없다면 10분 동안 다른 접근 방법을 생각해 본 후 최적의 해결책을 한 시간 동안 시도해볼 것이다.
경험
•
소프트웨어 분야에서 책에서 얻는 학습과 비교한 직접 경험의 가치는 여러 이유로 다른 분야이 비해서 작다.
•
진정한 경험을 쌓으려면 행동해야 한다. 지속적으로 학습한다면 경험을 얻게 될 것이다. 그렇지 않으면 아무리 많은 시간이 지나도 경험을 얻지 못할 것이다.
별난 프로그래밍
•
프로그래밍에 몰입해야 한다. 밤을 새워 뭔가를 했다는 것은 자랑할 것이 되지 못한다.
•
내가 무엇에 흥분하고 있는지를 기억하자.
9. 습관
•
프로그래밍에서는 도움이 되는 습관을 개발하도록 노력해야 한다.
◦
코드를 작성하기 전에 의사코드에 클래스를 작성하는 습관을 들인다.
◦
컴파일하기 전에 코드를 주의 깊게 읽어보는 습관을 들인다.
•
나쁜 습관을 버리는 것은 새로운 습관이 자리를 차지하게 되면 자연스럽게 떨어져 나간다.
요점 정리
•
성격은 컴퓨터 프로그램을 작성하는 능력에 직접 영향을 미친다.
•
가장 중요한 성격을 겸손과 호기심, 지적인 정직함, 창의성과 훈련, 생산적인 게으름이다.
•
뛰어난 개발자의 성격은 대부분 재능과는 아무런 상관이 없으며 개인적인 발전을 위한 꾸준한 노력과 연관이 있다.
•
놀랍게도 지력과 경험, 인내심, 지구력은 이로운만큼 해롭기도 하다.
•
많은 개발자가 능동적으로 새로운 정보와 기술을 찾지 않는다. 대신 그들은 우연히 일을 통해 새로운 정보를 얻는다.
◦
프로그래밍에 관한 책을 읽고 배우는 데 약간의 시간을 투자한다면 몇 달 혹은 몇 년이 지난 후 다른 일반 개발자과 확연히 차별화될 것이다.
•
훌륭한 성격은 주로 올바른 습관 형성의 문제다. 뛰어난 개발자가 되려면 올바른 습관을 개발하여 나쁜 습관을 대체하도록 하자.