주니어 개발자로 성장하기 위해 얻어야 할 역량
자체 제작한 구조도입니다.
제가 정의하는 주니어 개발자는 개발 선배가 해결한 프로젝트를 구축할 수 있는 역량, 실무 문제를 해결하거나 개선할 수 있는 역량이 있는 개발자라고 이야기합니다. 이 두 가지 역량을 갖기 위해서는 프로그래밍 역량, 엔지니어링 역량이 필요하다고 생각합니다.
프로그래밍 역량
프로그래밍 역량을 습득하기 위한 고민은 아래와 같습니다.
프로그래밍 역량 중 개인적 환경에서 습득할 수 있는 역량이 있습니다. 시간적 여유가 있다면 프로그래밍 기본기 역량 개발에 시간 투자를 추천해 드립니다.
프로그래머로 성장하기 위한 고민
•
어떤 철학을 가지고 있어야 협업할 수 있는 프로그래머가 될 수 있지?
•
버그가 발생하지 않도록 프로그래밍하려면 어떻게 해야 하지?
•
단순 구현을 넘어서 효율적인 알고리즘을 적용하려면 어떻게 해야 하지?
•
품질 좋은 프로그래밍을 하려면 어떻게 해야 하지?
더 나은 프로그래머로 성장하기 위한 고민
•
규모가 커지고 복잡해지더라도 논리상 허점이 생기지 않으려면 어떻게 프로그래밍해야 하지?
•
규모가 커지고 복잡해지더라도 성능을 유지하거나 향상하려면 어떻게 프로그래밍해야 하지?
•
규모가 커지고 복잡해지더라도 최적화하려면 어떻게 프로그래밍해야 하지?
•
규모가 커지고 복잡해지더라도 협업에 도움을 주는 프로그래밍을 하려면 어떻게 해야 하지?
프로그래머 역량 개발을 위해 관심 가져야 할 키워드
•
코딩 : 코드 가독성, 안전한 코드, 디버깅
•
패턴 : 아키텍처 패턴, 디자인 패턴, 관형어 패턴
•
컴퓨터 과학 및 기본기
◦
컴퓨터 구조, 컴퓨팅 사고
◦
데이터 이해 및 처리 : 자료구조, 알고리즘
◦
패러다임 : 객체지향 패러다임, 함수지향 패러다임, 절차지향 패러다임
◦
운영체제 : 운영체제에서 사용한 문제해결 노하우를 이해
◦
네트워크, 데이터베이스
개인적인 의견이에요, 참고해주세요
프로그래밍 역량에 관한 키워드를 쉽게 적었습니다.
하지만 키워드 하나하나가 쉽게 얻을 수 있는 것이 아닙니다. 키워드 하나가 적게는 6개월에서 몇 년 동안 익혀야 합니다. 추가로 실전에서 해당 문제에 직면하고 해결해야 비로소 얻어지는 역량입니다.
개인적으로 역량 개발 방법을 추천해 드리겠습니다.
가능하다면 이론과 실무 역량을 따로 습득하는 것이 아니라, 실무에서 직면한 문제를 이론 배경과 원리까지 고민하면서 동시에 역량을 쌓는 것을 추천해 드립니다.
게임 속 목적을 위해 어두운 맵을 돌아다니면서 맵을 밝혀나가듯이, 프로그래밍 역량을 쌓아나가길 추천해 드립니다.
엔지니어링 역량
엔지니어링 역량을 습득하기 위한 고민은 아래와 같습니다.
엔지니어링 역량은 거대한 코드 베이스 관리, 유지보수, 개선해야 하는 조직 환경에 있을 때 얻을 수 있습니다. 엔지니어링은 개발문화, 조직관리, 팀워크와 관련 있습니다. 협업할 수 있는 개발자는 엔지니어링까지 고민하는 개발자라고 개인적으로 생각해 봅니다.
코드 컨벤션에 관한 고민
•
조직이 커지더라도 일관된 코딩 스타일을 유지하려면 어떻게 해야 하지?
•
형식에 집중하기보다 본질에 집중하게 하려면 어떻게 해야 하지?
코드 리뷰에 관한 고민
•
코드 베이스가 일관되게 관리하게 하려면 어떻게 해야 하지?
•
가독성 있고, 안전한 코드인지 미리 확인하려면 어떻게 해야 하지?
•
팀에 속한 코드 베이스에 주인 의식을 가지게 하려면 어떻게 해야 하지?
•
팀에서 얻은 지식을 모든 팀에게 공유하게 하려면 어떻게 해야 하지?
브랜치 전략에 관한 고민
•
거대한 코드 베이스를 여러 명이 유지, 관리, 개선하려면 어떻게 해야 하지?
•
팀원이 한 명이든, 여러명이든 개발할 때 불편함을 없애려면 어떻게 해야 하지?
버전 관리에 관한 고민
•
최신 버전을 추적하려면 어떻게 해야 하지?
•
문제가 있을 때 문제에 속한 프로젝트를 확인하려면 어떻게 해야 하지?
•
버전을 체계적으로 분기하고 병합하게 하려면 어떻게 해야 하지?
•
커밋의 크기와 메시지는 어떻게 남겨야 하지?
문서화에 관한 고민
•
코드와 API에 대한 내용을 팀원이 이해가 쉽게 이해시키려면 어떻게 해야 하지?
•
코드와 API에 관한 질문을 줄이기 위해서는 어떻게 해야 하지?
•
새로운 인력을 팀에 안착시키는 비용을 줄이려면 어떻게 해야 하지?
테스트에 관한 고민
•
단위 테스트는 어떻게 해야 하지?
•
규모가 커질 때 대규모 테스트는 어떻게 해야 하지?
•
시스템의 복잡도에 대응하기 위해 어떻게 테스트해야 하지?
•
리팩터링, 대규모 재설계 상황에서 실수를 빠르게 잡기 위해서는 어떻게 테스트해야 하지?
•
변화하는 기술, 시장 상황, 고객 취향에 더 빠르게 대응하기 위해 어떻게 테스트해야 하지?
빌드 및 배포 시스템에 관한 고민
•
빌드 로직과 씨름하는 대신 프로그래밍에 집중하게 하려면 어떻게 하지?
•
빌드의 속도와 정확성을 높이려면 어떻게 해야 하지?
•
빌드 시스템에서 모듈과 의존성을 잘 다루려면 어떻게 해야 하지?
•
지속해서 통합과 배포를 자동화하려면 어떻게 해야 하지?
엔지니어링 역량 개발을 위해 관심 가져야 할 키워드
•
코드 컨벤션 : 문서화. 모범사례, 소스 파일관리, 포매팅, 명명 등
•
테스트 : 테스트의 범위와 크기, 단위 테스트, 통합 테스트
•
형상 관리 및 빌드 : 커밋 크기, 커밋의 메시지, 브랜치 전략, 버전관리 전략
•
배포 : 안전한 배포 방법, 장애 대응, 운영
•
코드 베이스 유지보수
◦
코드 베이스 이해 : 변수, 데이터, 실행 흐름, 데이터 흐름 이해
◦
의존관계 이해 : 응집도, 결합도, 기술부채와 리팩터링
•
장애대응
◦
장애지표 - 탐지 - 공지 - 전파 - 복구
◦
모의장애훈련
개인적인 의견이에요, 참고해주세요
엔지니어링 역량은 AI가 대체할 수 없다고 생각합니다.
조직이 처해있는 상황과 이해관계자의 상황에 따라 의사결정이 다르기 때문입니다.
예를 들어 의존성에 관한 문제가 있을 때 기술 부채로 남겨둘지 리팩토링을 통해 의존성 문제를 해결할지는 조직의 상황에 따라 다릅니다.
시간에 따라 기업의 규모와 범위가 성장할 때 엔지니어링 역량이 기하급수적으로 요구됩니다.
엔지니어링 역량을 개발할 기회가 있을 때 꼭 개발하였으면 좋겠습니다.
마무리
주니어 개발자로 성장하기 위한 프로그래밍, 엔지니어링 역량을 소개해 드렸습니다. 소개해 드린 역량의 키워드는 어렵고, 무겁고, 개발할 때까지 시간이 오래 걸립니다.
모든 역량을 다 갖추어야 주니어 개발자라고 생각하기보다는, 소개한 역량을 갸발하는 과정 중에 주니어 개발자가 된다고 생각합니다.
이러한 역량을 개발하다 보면 ‘누군가 풀지 않은 문제에 도전할 때’가 올 것으로 생각합니다. 이때가 ‘시니어 개발자로 진입하는 시기가 아닐까’ 생각합니다.
마지막으로 부족한 부분이 있거나 더 나은 생각이 있으면 피드백 부탁드립니다.
mlp.pisik@gmail.com