현역 엔지니어가 소프트웨어 엔지니어를 목표로 하는 학생에게 소프트웨어 개발 작업 수행에 중요한 조언 10가지를 소개해 눈길을 끈다.
먼저 대학은 일에 필요한 준비를 해주지 않는다는 것. 취직을 위해 대학에 가는 건 수영장에 들어가기 전에 수영 방법을 설명해주고 움직임을 기억시키지만 물은 절대로 만지지 않고 5년 뒤 수영하라는 면허증을 발급해준 뒤 갑자기 학생을 수영장에 걷어차는 것과 같다고 비유한다. 소프트웨어 엔지니어 직업을 갖게 된 졸업생은 처음 6개월간 물에 익사하고 필사적으로 빠져 나오려 하는 것과 같다며 하지만 대부분 대학에서 가르친 내용은 일상 업무와는 거리가 멀다면서 대학 교수 대부분이 훌륭한 소프트웨어 엔지니어가 아니라는 말로 코딩을 배워야 한다고 주장한다.
둘째 제로부터 프로젝트를 시작해 진행하는 일은 거의 없다는 것. 대학이나 캠프에선 제로부터 프로그램을 쓰는 과제가 많이 부여된다. 하지만 실제로 소프트웨어 엔지니어가 되면 대부분 기존 프로젝트를 다루게 된다. 회사에선 자신 혼자가 아니라 여러 명이 수천 줄 코드가 포함된 프로젝트를 반년에서 수 년이라는 오랜 기간 동안 진행한다. 누군가가 작성한 코드를 읽고 코드 몇 줄을 수정하거나 불쾌한 코드를 수정하는데 일주일을 지내야 한다. 또 동료와 대화해 프로젝트에 대한 정보를 교환하고 상사에게 솔루션 승인을 요청할 수 있다.
셋째 깨끗한 코드를 쓰는 것에 집착하지 않아도 좋다는 것. 프로젝트 멤버 등은 깨끗한 코드를 쓰는 걸 요구하지만 이를 칭찬받는 일은 거의 없다는 것이다. 소프트웨어 엔지니어로서의 주요 작업은 사용자에게 가치를 창출하는 것이며 코드를 작성하는 건 이 목표를 달성하기 위한 수단일 뿐이라는 설명이다. 사용자는 코드가 뭔지 알지 못하며 제품이 제공하는 기능을 확인하기만 하면 된다. 예정대로 버그가 없는 상태로 끝내는데 중점을 두라는 것이다.
4번째는 무능한 사람과 일하는 경우가 있다는 것. 보통 IT 업계에서 일하는 건 현명하고 유능한 사람만 있다는 편견이 있다. 하지만 다른 일과 마찬가지로 소프트웨어 개발 현장에서도 무능한 사람은 존재한다. 무능한 사람은 시간을 낭비하고 비생산적이며 유독한 환경을 만든다. 이런 환경에 의해 프로젝트에 지연이 생겨 기업 자금과 자원을 낭비한다.
이에 대한 조언은 가능하면 효율적이고 생산적이 되도록 노력하고 타인이 아닌 자신에 집중하라고 말한다. 해당인이 프로세스에 관여하지 않는 해결책을 시험해보고 자신이 할 일을 모두 문서화하며 그 사람이 일을 하지 않기 위해 작업을 붙잡고 있다면 가능하면 다른 사람에게 의뢰한다. 무능한 사람과 직접 대화하고 뭘 어떻게 개선할 수 있는지 전한다. 그들을 싫어할 필요는 없다.
5번째는 몇 시간이나 미팅에 참가하는 것에 익숙해져야 한다는 것. 소프트웨어 개발 진행에서 미팅은 중요하다. 그 중에는 의미가 있는 것도 단순한 시간 낭비인 것도 있다. 매일 또는 매주 정기 회의 대부분은 생산적이지 않더라도 강제로 이뤄진다. 존재 목적을 증명하기 위한 공허한 프로토콜에 불과한 경우가 많다. 하지만 일부 회의에는 생산적이고 의미 있는 것도 있다. 소프트웨어 엔지니어 대다수는 회의를 싫어하지만 회의는 팀 구성원과 정보를 공유하고 적극적으로 의사소통하고 다른 팀 작업을 이해하는데 도움이 된다.
6번째는 견적은 몇 번이나 요구된다는 것이다. 비즈니스에서 숫자는 중요하다. 모든 프로젝트에는 비용이 있으며 관리자는 비용과 시간을 추정해야 한다. 소프트웨어 자신도 자신의 작업을 추정해야 한다.
7번째는 버그는 평생의 적이 된다는 것. 코딩을 할 수 있도록 코드 곳곳에 버그가 숨어 있는 걸 알 수 있다. 직장을 시작한지 얼마 안 되면 코딩하고 문제없이 동작하면 끝이라고 생각하지만 실제로는 자신의 코드뿐 아니라 타사 라이브러리나 하드웨어 장애, 전력 문제 등 버그를 일으킬 가능성은 무수하다. 따라서 모든 것에 버그가 있다고 가정해야 한다.
8번째는 불안은 항상 함께 한다는 것. 소프트웨어 개발 업무에선 거의 항상 불안을 느끼게 된다. 그 밖에도 프로젝트 변경, 전직, 고용 안정, 기술 진화, 마감일 직전 버그 보고 등 소프트웨어 엔지니어가 불안정해질 요소는 많이 존재한다. 하지만 이런 불안은 더 나은 소프트웨어 엔지니어가 되는 원동력이 될 수 있다.
9번째는 일로부터 떠나는 건 거의 불가능하게 된다는 것. 소프트웨어 엔지니어는 항상 자신의 업무나 문제, 버그에 대해 생각하게 되어 버린다. 일과 비업무를 제대로 나누기 위해 일이 끝나면 노트북 끄기, 휴대전화로 업무 메일 체크하는 시간 결정하기, 퇴근 후 슬랙 알림 끄기, 일을 생각하고 있을 때만 휴식을 취하고 휴식을 취하도록 자신에게 말하기, 일한 뒤 산책이나 스포츠를 하는 등 궁리를 하는 것도 방법이다.
마지막은 뛰어난 기술 스킬보다 뛰어난 소프트 스킬이 도움이 된다는 것. 소프트 스킬이란 예를 들면 타인과의 커뮤니케이션이나 팀워크, 학습에 대한 생각, 시간 관리 능력, 공감력, 친숙함, 인내력 등 개인 능력과 특성을 말한다. 다양한 프로그래밍 언어를 습득하고 다양한 상황에 대처할 수 있는 기술적 스킬은 확실히 소프트웨어 엔지니어에게 중요하지만 이런 기술은 연습으로 습득할 수 있다. 하지만 소프트 스킬은 개선하려면 상당한 정신력이 요구된다.
뛰어난 소프트 스킬이 있으면 다른 이들에게 더 선호되고 승급과 승진 가능성이 높아진다. 기술적으로 재능이 있더라도 협력적이지 않으면 기회는 줄어든다. 또 뛰어난 소프트 스킬이 있으면 주위 사람은 평가를 해주며 자신이 모르는 사이 다양한 일에 추천해줄 수도 있다. 관련 내용은 이곳에서 확인할 수 있다.