요즘은 공식 문서나 레퍼런스 문서만 읽고 따라해도 빠르게 구현 기술을 학습할 수 있고,
챗 GPT 같은 LLM의 발전과 스택오버플로 같은 커뮤니티 덕에 모르는 문제가 생겨도 조금만 노력하면 해결책을 찾을 수 있다.
문제는 어떤 구현 기술을 학습할 것인지 정하는 것이다.
개발자는 it환경의 빠른 변화로 익혀야 하는 지식이 많다. 유행하는 기술들과 트렌드는 파악해야 하겠지만, 구현 기술을 배우는 것은 이런 트렌드와는 분리하여 전략을 세워야 한다.
즉 구현기술을 학습하기 위한 전략이 필요한데, 저자는 아래 2가지를 추천한다
- 현재 사용 중인 기술
- 문제를 해결하기 위한 기술
현재 회사에서 사용 중인 기술이 본인의 취향과 맞지 않더라도 코드를 이해하고 수정할 수 있을 정도의 지식은 있어야 한다.
이는 이미 존재하는 기존 코드
와 공식 문서
를 보면서 기술을 익히면 된다.
사용중인 기술을 학습할 때는 필요한 부분을 우선적으로
익히면 된다. 보통 기술의 일부 요소만 사용하므로 필요한 부분만 알고 있으면 일반적인 기능을 개발하는 데 문제 없다.
즉, 모든 것을 완벽하게 익히려고 하지 않아도 된다.
예를 들어, 스프링으로 개발된 API 서버가 있을 경우,
컨트롤러와 JSON 변환 처리, 데이터베이스 연동과 트랜잭션 처리 정도의 지식만 알고 있으면
기본 코드를 분석하고 수정할 수 있다.
부족한 부분은 스프링 기초 서적을 보거나, 핸즈온
과 검색을 병행하면서 채우면 된다.
스프링 프레임워크와 스프링 웹 MVC 레퍼런스 문서를 처음부터 끝까지 읽고 소스 코드를 분석해가며 학습할 수도 있지만 당장 실무에 적합한 내용을 찾는데 시간이 너무 오래 걸린다.
보통 문제는 2가지 유형으로 나뉜다.
- 당장 해결해야 하는 문제
- 가까운 미래에 해결해야 하는 문제
당장 문제를 해결하는데 필요한 기술이라면 빠르게 찾아서 기본 사용 방법을 익히고 적용해야 한다.
예를 들어, 액티브X 컴포넌트를 개발해야 한다면
언어를 선택하고(비주얼 C++ or 비주얼 베이직), 인터넷 검색이나 책, 마이크로소프트가 제공하는 온라인 문서를 보며 기능을 개발하면 된다.
이때는 요구 사항대로 출력 기능 구현과, 액티브X 컴포넌트를 생성하는 데 주안점을 둔다.
원하는 양식으로 문서를 출력하고, 웹 브라우저에 설치하는 고객이 요구하는 기능 구현에 집중하고,
비주얼 베이직을 사용한 GUI 프로그래밍 등은 당장 필요한 내용이 아니므로 학습 대상에서 제외한다.
가까운 미래에 해결해야 하는 문제는 아래와 같다.
현재 회사 프로젝트가 여러 기능이 혼재되어 있고, 여러 팀이 모놀리식 시스템 코드를 동시에 수정하는 문제가 있다고 하자
이런 경우, 서비스와 데이터베이스를 분리
하는 방법으로 해결하고자 한다면 두 서비스 간의 연동 기술, 데이터의 일관성을 맞추기 위한 기술 등을 조사하고 학습하면 된다. 필요에 따라 PoC로 선택한 구현 기술이 문제 해결에 적합한지 증명해야 한다.
구현 기술을 습득했다고 해도 학습해야 할 양이 많기 때문에 기술의 모든 부분을 제대로 이해하고 다루기는 쉽지 않다. 기술이 발달할 수록 기술 개수도 늘어난다.
지금 서버 개발을 위해 익혀야 하는 기술이 스프링 부트, 마이바티스, 타임리프, JPA, 그레이들 등의 기술을 익혀야 한다. 프런트도 병행하면 리액트같은 자바스크립트 라이브러리도 학습해야 한다. 데이터베이스 또한 오라클이나 mySQL같은 관계형 데이터베이스 뿐 아니라 레디스나 몽고DB같은 저장소도 알아야 한다.
이렇게 현실적으로 모든 기술을 깊게 학습하기가 어렵기 때문에 기술에 대한 이해 부족이나 사용 미숙으로 문제가 발생하기도 한다
예를 들어,
템플릿 엔진의 캐시를 비활성화하면 요청마다 템플릿 처리를 위한 객체가 생성된다.
많은 트래픽을 처리해야 하는 서비스의 경우, 템플릿 관련 객체가 메모리에 빠르게 쌓이고, 이로 인해 메모리 부족으로 Full GC가 빈번하게 발생하고, Full GC 시간도 순간적으로 늘어나 서비스가 먹통이 될 수 있다.
만약 템플릿 엔진을 만드는 사람이 캐시가 성능과 관련이 있다는 것을 모른다면 이런 캐시 관련 설정을 삭제할 수 있다.
현재 사용중인 기술, 혹은 단기간에 해결해야 하는 문제를 해결할 수 있는 기술은 빠르게 기능구현
위주로 학습하려면 기존 코드를 참고하거나 핸즈온이나 동영상 강의, 튜토리얼 문서로 빠르게 해당 기술에 대한 감을 잡는다.
이후 이 기술을 잘 활용하기 위해서는, 자연스럽게 손에 익을 정도로
일상 업무에서 자주 사용하거나 연습을 해야 한다.
더 나은 방법을 찾으려고 노력하기
다양한 일상 업무 도구를 개발할 수 있는 수준까지 기술을 익혔다면 필요할 때마다 기술을 조금씩 더 깊게 학습한다. 여기서 중요한 것은 더 나은 방법을 찾으려고 노력
해야 한다는 것이다. 방법을 잘 모르거나 구현하기 어려운 문제가 생겼을 때 해결하기 위한 더 나은 방법이 있는지 찾아봐야 한다. 그래야 기술을 더 잘 이해하고 활용할 수 있게 된다. 더 나은 방법을 찾지 않고 기존 방법만 답습하면 기술 역량을 높일 수 없다.
[실용주의 프로그래머]에 나온 팁중에 하나가 지식 포트폴리오에 주기적으로 투자하라 이다.
좋은 시니어 개발자가 되고 싶다면 구현 기술을 주기적으로 탐색하고 학습해야 한다.
지금 당장 사용하지 않더라도 주기적으로 요즘 어떤 기술이 주목받고 있는지 조사하고 필요에 따라 핸즈온이나 별도 학습을 해서 빠르게 경험해봐야 다. 이를 통해 왜 그 기술이 주목받는지 이해하려 노력하면 언젠가 그 기술을 적용하려 할 때 수월해질 것이다. 이런 노력으로 개발자로서 미래 경쟁력을 유지할 수 있다.
이를 통한 방법은 스터디를 통해 프로젝트 진행해보기, 뉴스레터/블로그 구독을 통해 관련 소식 꾸준히 접하기 등이 있다.
답이 아닌 질문 따라하기
이때 중요한 것은 구현 기술만을 공부하는 것이 아니라 그 기술을 사용하는 목적을 이해해야 한다는 것이다. 왜 그 기술을 도입했는지 이유를 찾아보고, 내 프로젝트에 도입하는 목적과 목표를 세워야 기술 도입의 장점을 극대화 할 수 있다.