3/17/2023

코드 재사용성을 결정하기 전 고려해야 할 것들

요즘IT에 코드 재사용성에 대해 기고를 했다. 업무를 진행하면서 항상 고민되는 점이 “코드 재사용”에 대한 것이었다. 아래 기고글 일부를 발췌했다.

그런데 항상 명확한 결론을 내지 못하고 끝낸 적이 많다. 왜 그럴까? 코드 재사용에 대한 의사결정은 간단해 보이지만 사실 많은 고민이 필요한 일이기 때문이다.

코드 재사용에 대한 논의에서는 종종 다음과 같은 이야기들이 오고 간다.

  • 코드를 재사용할 수 있도록 만들어야 다른 팀, 다른 서비스가 이점을 얻을 수 있고 중복 코드 문제를 피할 수 있다.
  • 코드를 재사용하려고 해서는 안된다. 복제를 하는 것이 좋은 선택이다. 재사용하려고 하면 분기 로직이 추가되는등 오히려 복잡하게 꼬일 수 있다.
  • 다른 팀이 코드를 재사용 할 수 있도록 새로운 서비스를 만들어야 한다.
  • 기존 라이브러리를 재사용해야 할까? 아니면 자체 코드를 만들어야 할까?
  • 인증 로직은 모든 서비스에 동일하게 적용된다. 모든 서비스에서 재사용될 수 있도록 API Gateway에 추가해야 할까? 아니면 프레임워크로 만들어야 할까?

~~ 중간 생략 ~~

자세한 글은 여기서 확인 할 수 있다.

3/15/2023

일정 관리의 중요성

현재 프로젝트는 태스크 관리를 “Jira”에서 하고 있다.

대규모 인원이 오늘 한 업무에 대해서 로깅을 하는 툴중 무난하게 사용할 수 있다는 판단이었다. (물론 회사 공식툴이기도 하다)

어제는 개발 쪽이 아닌 기획 쪽 파트너사와 일정 관련 업무 미팅을 진행했었다.
일정을 따로 관리하고 있다는 얘길 들어서 우리는 Jira로 관리하고 있고, 함께 사용했으면 좋겠다고 의견을 전달했다.
VPN 접속이 어려워서 불편하다. Task가 너무 많아서 느리다. 등 여러 의견이 나왔다.
툴은 툴일 뿐이고 대규모 인원이 같이 Task를 공유하며 효과적으로 사용할 수 있는 다른 방안이 있는지? Task가 많다면 필터를 만들어서 본 적은 있는지? 등을 문의했고, 결국 Jira를 사용하기로 결정했다.

일정을 짜거나 관리해야 하는 것의 문제는, 거의 모든 프로그래머가 원하지 않는 일이라는 것이다.
내 경험상 대부분의 사람들은 태스크를 디테일하게 관리하면서 업무를 진행하지 않는다. (내가 잘못 생각하는 것일 수도 있다.)
그 이유는 일정은 소수의 사람들로 짜여지기 떄문이다. 그리고 대부분 “일정을 제시간에 맞춘 프로젝트는 극소수야”라고 생각한다. 설령 그렇다고 하더라도 일정 목표가 없이 진행하는 것은 더 큰 문제라 생각한다. 그들을 참여시키려면 그들의 불편함을 덜어주는 방법과 이것이 가치가 있다고 믿게 하는 것이다.

데일리 로그 작성 시, 입력 항목을 최대한 심플하게 만드는 것이다. 예를 들어서 이 작업에 쏟은 시간 + 어떤 일을 했는지 요 정도로만 정했다. (진척률은 모듈 리더분들이 관리) 더 세분화되게 관리를 원하는 분은 하위 작업을 생성할 수 있도록 했다. 불편함을 덜어주기 위해 심플 안을 세웠지만, 디테일을 원하는 분들의 기회도 박탈하지 않기 위해서다.

누군가에게 관리를 받는다는 것을 달가와하는 사람은 없다고 생각한다. (나 역시 그렇다.)
회사 혹은 프로젝트에서 진행하는 일은 “혼자”하는 것이 드물다. 거의 대부분 “누군가”와 협업을 해야 하는 경우가 많다. 이 경우에는 일의 순서가 생긴다. 다른 사람이 끝내야 내 일이 시작될 수 있는 상황이 발생한다는 의미이다.
대부분의 사람들은 재미있는 일을 먼저 하고 싶은 성향이 있다. “일의 순서”를 고려하지 않고 모두 재미있는 일을 먼저 한다면 관리하는 입장에서는 매우 난감해진다. 연관된 일이 미뤄지는 상황이 발생하기 때문이다. 불편함은 존재하겠지만, 함께 일하기에 긍정적으로 생각했으면 좋겠다.

문제 해결을 위해 고민해야 할 것들

 

팀원들이 타 부서와 미팅을 하고 와서 상기된 표정으로 불만을 토로했다. 정해진 것이 없는 시간만 낭비한 회의라는 것이다. 기존 방식의 알고리즘을 바꾸기로 방향성은 정해진 것 같았다. 내부에서 돌던 분석 알고리즘이 시스템 밖에서 동작이 될 것이고 그 결과를 받아서 애플리케이션에 적용해야 하는 상황이다. 그리고 화이트보드에 모여서 어떤 방식으로 인터페이스를 할 것인지 논의를 시작했다.

가만히 지켜보다가 몇 가지 질문을 던졌다.

“알고리즘이 바뀌면 어떤 영향이 있을지 파악하셨나요?”

“…..”

우리가 일하는 분야에서는 문제 해결 능력이 매우 중요하다. 문제 해결 능력은 위의 상황들이 반복되면서 키워진다고 생각한다. 하지만, 그냥 지나가 버리면 역량을 키울 수가 없다. 아래의 사항들을 항상 고민하면서 업무를 수행해야 한다.

  1. 문제 해결 과정을 학습 - 문제를 발견하고 해결하는 과정은 다양한 방법과 기술이 포함된다. 본인보다 경험이 많은 동료가 문제를 어떻게 푸는지 학습하고 익혀야 한다. 그리고 주변에서 발생하는 문제들에 대입을 하면서 테스트해봐야 한다.
  2. 새로운 기술을 학습 - 문제점을 파악했지만, 어떤 기술을 사용해서 해결할지는 지식내에서 결정된다. 따라서 계속해서 새로운 기술과 트렌드를 학습해야 한다.
  3. 경험을 쌓자 - 문제 해결 능력은 경험을 통해 발전한다. 다양한 상황에 놓여야 복잡한 문제를 해결할 수 있다. 문제가 생긴 것을 원망하지 말자
  4. 동료와 협력 - 동료와 함께 문제를 해결하면 더 좋은 결과를 얻을 수 있다. 함께 협력하면서 해결하는 방법을 배워야 한다.
  5. 문제의 본질 파악 - 문제의 본질을 파악해야 한다. 문제를 일시적으로 해결하는 것보다 근본적인 원인을 찾아내어 그 문제가 재발하지 않도록 해야 한다.
  6. 예측하고 대비 - 발생할 수 있는 문제를 미리 예측하고 대비하려고 항상 고민해야 한다. 문제가 발생했을 때 대처하는 방법을 미리 계획해두면 더 빠르게 해결할 수 있다.

위의 사항들을 참조해서 아래의 형태로 문제를 해결하자고 논의했다.

  1. 알고리즘이 변경됨에 따라 기존 데이터를 대체하는 것인지, 혹은 일부 유지해야 하는 것인지 확인 (기존 로직을 유지해야 하는지 확인 목적)
  2. 변경에 따른 시스템 영향도 파악
  3. 알고리즘 변경에 따라 schema 변경을 해야 할지, 아니면 유지할지 고민
  4. 3번 사항이 결정되면, 인터페이스 방식 결정
  5. 인터페이스 방식에 따른 연동 규격서 작성 후 논의
  6. 개발

미팅 시, 상호 이해 관계가 다른 상황이 많이 생긴다. 이럴 때 가장 중요한 것은 내부를 먼저 파악하는 것이다. 그리고 상대방의 이해 관계를 파악해야 한다. 그래야 상호간 협의 접점이 생기기 때문이다. 손해를 보면서 함께 하려는 사람은 지구상에 없다고 생각한다. (가족 제외)