상황을 파악하는 메타인지
상황을 정확히 파악하는 메타인지
우리는 어떤 작업을 할 때 상황을 정확히 판단하기 위해 메타인지가 필요하다.
시니어는 비즈니스와 기술의 접점을 최대한 판단하면서, 상황을 최대한 빠르게 정리하기 위한 기술적 메타인지가 필요하다.
비즈니스와 생산성
비즈니스: 회사에서 실제로 돈을 벌게 도와주는 개발자로써의 임무
생산성: 코드 퀄리티, 즉 생산성 수치가 높아질수록 비즈니스 코드 작성이 유연해지고 빨라짐
비즈니스와 생산성 모두 중요하지만, 가장 중요한 것은 "비즈니스를 통해 회사가 살아남는것"
비즈니스가 더 중요하고, 생산성에 시간을 할애할 수 없다면 과감하게 생산성을 포기하고 때마다 새로 작성하는게 낫다. (리팩토링은 밥먹듯이)
비즈니스가 급한데, 여러 도메인의 프로젝트가 들어오는 경우
생산성을 고민할 수 있는데, 여러 도메인의 프로젝트가 들어오는 경우
메타인지가 되었다면
어느곳이든 비즈니스를 제외하고 생산성을 챙길 수 있는 회사는 없다.
현재 인원 규모에 맞춰서 비즈니스와 생산성을 구별하고 인원 배치가 필요하다.
인원배치가 어렵다면 동시에 작업을 하든, 개선은 해야할 상황(정말 어렵다면 차세대 등의 방법도 있다.)
팀 내부적으로 어떤 부분이 어렵고 비즈니스를 개발하게 어렵게 만드는지 측정이 되었다면 다음 단계로 넘어갈 수 있다.
팀이 지금 처한 상황과 개발하는 것의 목표를 조화롭게하여, 목표를 이루는 것이 시니어 개발자이며, 리드이다.
비즈니스는 단순한 일부터 복잡한 일까지 여러가지가 있지만, 이또한 성과와 개발자의 흥미등 여러가지를 복합적으로 이해하고 업무를 분장해야하며, 성장에 대한 부분까지 고민하면서 팀의 기술 목표를 만들어야 한다.
단일 프로덕트가 성장하면서 발생하는 문제들
모든 회사의 시작은 하나의 작은 프로덕트로 시작됨
회사가 성장을 하면서 여러 필요한 코드가 생기고, 해당 코드를 적재하기 위한 대다수의 비슷한 아키텍처를 사용한다.
e.g) Container & Presentational Pattern, Atomic Design Pattern,
가장 단순하게 비즈니스 로직과 레이아웃 로직을 분리하고, 레이아웃 로직도 계층별로 나눠서 관리
n년뒤, 여전히 단순한 코드로 비즈니스를 모두 개발할수 없게된다.
Container - Presentationl의 쌍은 합쳐 몇백개가 넘어가고 Atomic Design에 atoms는 100개가 넘어가는 상황 발생
더불어 프로덕트도 어드민, 모바일 등 추가가 된 상황
시간이 지나면서 생기는 비대해진 코드의 문제와 새로운 프로덕트의 등장
개발자는 코드를 계속 작성하게 되고, 시간이 지날수록 코드는 비대해진다.
코드가 비대해지므로써 중복 코드와, 레거시 코드가 많아져 생산성이 줄어든다. 그에 따라 운영에서의 문제가 발생
회사는 새로운 사업과 인원을 충원하며, 그에따라 소프트웨어의 수도 많아진다.
예를 들어 새로운 사업을 하게 되면, 새로운 페이지와 새로운 소프트웨어가 생기게 된다.
그에따른 신규 프로덕트 구축으로써의 문제
문제 파악을 통해 상황 진단하기
1) 신규 프로덕트가 추가된 경우
기술 스택은 어떻게?
유지보수 인원이 적은 경우 - 높은 확률로 이전 기술 스택을 유지하는게 생산성에 큰 도움이됨
유지보수 인원이 많은 경우 - 이전 기술 스택이 생산성에 문제가 있거나 하는 경우 새로운 기술 스택 고려
기술적으로 챌린지가 없는 경우 - 생산성을 떠나, 현재 팀원의 사기를 고양시킬 목적으로 새로운 기술을 도입할 수 있음
빠르게 개발되어야 하는 경우 - 이전 기술 스택을 유지하여 코드를 빠르게 붙여 넣을 수 있는 작업을 진행하여 생산성을 보장
교집합의 코드는 어떻게 운영?
여러 프로덕트가 생기다보면, 여러 프로덕트에서 공통으로 필요한 코드를 추가하는 경우가 존재,
해당 코드를 관리하기 위해
npm library
를 만들 수 있고, 단순히 폴더로 분리해서 사용할 수 있다.npm library가 필요한 경우 - 코드가 빈번하게 수정될 수 있는 유지보수성 업무가 많은 경우 사용되어야함
빈번히 수정되어도 버저닝이 되므로, 버전에 따라 마이그레이션을 하고, 마이그레이션 후 영향범위를 수정만 하면 됨
필요 없는 경우 - 코드가 빈번히 수정되지 않는 constant 등의 레벨이거나 정말 긴급한 상황이고 적은 인원이 개발한다면 교집합 코드는 별도의 폴더로만 추출되어 사용할 수 있다.
배포 프로세스는 어떻게?
기존 프로젝트와 동일하게 갈지, 아닐지 선택
프로젝트에 SEO를 사용하거나, SSR 등의 CPU Intensive 한 작업이 필요한 경우 - 노드 서버 기반의 인프라 스트럭처를 그리고, 배포 방식을 서버 배포 형태로 구축
단순 어드민 서비스인 경우 - Route53 - Cloudfront - S3 형태로 간단히 구축, 이 방법은 운영 리소스가 적거나 빠르게 개발되어야 하는 경우 유용
인원은 어떻게 배분?
회사의 업무 방식에 따라 다름
회사의 업무방식이 어드민, 서비스 따로 운영되는 경우 - 이 경우 서비스별로 담당자를 지정
다만, 이 경우 각 서비스에 배정된 인원이 성장 혹은 흥미를 잃을 수 있기 때문에 로테이션 정챌을 정해야 한다.
회사의 업무 방식이 애자일 형태로 피쳐 단위로 나오는 경우 - 이 경우는 피처 별로 담당자를 정해서 관리
가장 좋은 방식은 페어 형태의 개발 방식, 이는 실제로 리소스가 많이 들기에 어려울 수 있다.
2) 프로덕트의 성장으로 코드가 과다해지는 경우
코드 분리를 어떻게 할것인가?
기존 코드에서 코드 분리가 필요한 기준을 마련
예를 들면, 한 폴더에 10개 이상의 파일을 두지 않는다던지
하나의 도메인에 몰려있다면, 하나의 도메인을 잘게 쪼갤 수 있다.
e.g) 배달의 민족 주문 내역이라면, 주문 내역 수많은 상태 떄문에 코드가 여러벌 있을 수 있는데, "주문내역"으로만 퉁 쳐져있는 것을 "배달중/배달완료/배달전"등으로 도메인 단위 폴더링을 쪼갤 수 있다.
코드를 분리하는 과정에서 폴더의 하이어라키 뎁스가 깊어진다면 더 단순한 폴더 형태를 민해야 한다.
Next.js의 App Router 형식과 Page Router 형식을 참고
커다란 프로젝트의 경우 App Router 형식이 적합할 수 있음(추상화)
과제에 따른 업무 분담을 어떤 방식으로 진행할 것인가?
프로덕트의 성장으로 코드가 과다해져 리팩토링을 진행해야 하는데, 리팩토링을 하는 시간이 어려울 수 있음
유지보수 인원의 여유가 있는 경우 - 최소한의 SUS만 진행할 수 있는 인원을 최대한 리팩토링으로 리소스를 빼내고, 다른 담당자들이 비즈니스를 커버해야 함
유지보수 인원의 여유가 없는 경우 - 아키텍처를 정해두고 추후 비즈니스가 적어지면 그 때 리팩토링 시도
메타 인지에 도움을 주는 요소
비즈니스 현황
비즈니스의 진행 방향, 속도, 진척률 등을 체크하여 앞으로 과제가 무엇이 있는지 대략적으로 파악한다.
이후 파악된 것을 바탕으로 미래 계획을 설계하고, 팀원들에게 전파하므로 예측가능한 상황으로 만든다.
팀원
현재 팀원(프론트)의 개발 역량 및 속도 그리고 휴가 현황등을 파악
작업이 진행되려면 팀원의 정보를 알고 있어야 하며, 비즈니스 현황과 더불어 일을 진행시키는데 가장 중요한 체크리스트 중 하나
아키텍처
이전의 아키텍처와 이후의 아키텍처의 차이를 체크하여, 비즈니스 현황에 맞춰 개선 phase를 분리하고 미래에 대해서 구축할 수 있도록 설계를 진행해야 한다.
아키텍처 관점에서 우리가 어느정도로 인원에 비해 낮은 수준 혹은 높은 수준의 설계가 되어있고 인원이 효율적으로 업무하는지 체크할 수있다.
리더쉽
비즈니스 현황과 팀원의 정보를 모두 쳋크하고, 아키텍처를 훌륭하게 만들어도 정작 팀원들과의 유대관계등이 존재하지 않는다면 동작하지 않을것이다.
주기적으로 팀원들과의 교류를 통해 앞으로 나아가고자 하는 것이 무엇이고 어떤 도움이 필요하며 무엇이 좋은지 등의 이야기를 해야 한다.
또한 개인적인 친밀감을 만드는 것도 굉장히 중요한 일
Last updated