Skip to content

최승현을 소개합니다#

최승현.png


VISION#

WHY: 저는 추상적인 아이디어를 현실로 끌어내는 힘을 가지고 있습니다.

HOW: 기술의 수직적인 레이어를 이해하고 그 아래 숨겨진 복잡성을 분석하는데 익숙합니다.

WHAT: 제가 이해한 지식을 팀원들과 공유하고 끊임없는 정반합을 통해 함께 성장하고자 합니다.


VALUE#

신뢰자산을 높게 가져가는 것. 아무것도 하지 않으면 숨겨진다는 것을 알기에, 가능한 모든 것들을 공유하고자 합니다.

코드에는 의도가 담길것. 하나의 Pull Request에는 하나의 의도만 담기게 브랜치를 나누는 습관을 가지고 있습니다.

Show me the code: 말로 떠드는 것 보다 동작하는 코드로 설득하는 것이 훨씬 효과적이라는 것을 알고 있습니다.


STRENGTH#

제 강점은 에너지 입니다. 저와 동료들이 함께 성장하는 모습에 희열감을 느끼기 때문에 혼자 공부하려고 하지 않습니다. 사람은 환경에 쉽게 적응한다는 사실을 알기 때문에 우리가 더 나은 환경에 놓여있도록 주변을 정돈합니다. 힘들어도 동료를 만나면 힘차게 인사하고 그 에너지가 다시 돌아오는 것을 느낍니다.

저는 도구를 잘 다루는 편입니다. 생산성을 높이는 도구에 언제나 관심을 가지고 있어 일상의 불편을 해소하고 유료 애플리케이션을 대체하는 오픈소스 도구들을 찾곤 합니다. 리눅스 CLI 환경의 불편함을 잘 알고 있으므로 셸 단축키, vim 에디터, OpenSSH, diff 등을 활용하여 복잡한 요구사항에 빠르게 일 처리를 할 수 있습니다.


STACK#

Tech Icon Programming Language
NestJS ![[js.png|100]]
socket.io ![[js.png|100]]
TypeORM ![[js.png|100]]
Django ![[python.png|100]]
DRF ![[python.png|100]]
OpenGL ![[opengl.png|100]]
Qt
SceneKit ![[swift.png|100]]


자기소개#

본인을 가장 잘 나타낼 수 있는 자기소개를 해주세요

안녕하세요, 코드 자체가 문서의 역할을 할 수 있도록 의도를 담아내는데에 관심이 많은 프로그래머 최승현이라고 합니다. 얻어갈 수 있는 것에 대한 욕구가 크기 때문에 지식관리툴인 옵시디언과 구글킵을 활용하여 스크랩, 아카이빙, 연관 지식과의 연결, 블로그 포스팅으로 이어지는 파이프라인을 가지고 있습니다.


프로젝트 경험#

어떤 프로젝트 경험을 가지고 계신가요?

NestJS와 Socket.io를 활용하여 온 오프라인 레크리에이션 진행을 도와주는 서비스인 RecRe1를 만들었습니다. 호스트가 게임을 만들면 플레이어들은 스크린에 올라온 QR코드를 통해 웹브라우저에서 게임을 진행하는 아주 간단한 흐름을 가져 진입장벽을 낮췄습니다. 또한 레크리에이션의 특성인 활동적이고 들뜬 분위기를 조성하기 위해 휴대폰을 직접 흔들어야 아바타가 앞으로 나아가는 "무궁화꽃이 피었습니다" 게임, 호스트가 그린 그림을 다 같이 맞추는 게임을 제작했습니다.


최근에 진행한 프로젝트 중에서 특히 자랑하고 싶은 부분이 있나요?

다수의 플레이어가 동시에 하나의 세션에서 게임을 즐기기 위해 In Memory Database를 사용한 점을 꼽고 싶습니다. 게임을 진행하기 위해 필요한 데이터로 Host, Game, Player가 있습니다. 처음엔 socket.io 소켓 객체와 더불어 모든 데이터를 Map 타입으로 정의하였고, 그림 맞추기 게임을 해당 규격에 맞추어 구현하였습니다. 이 방식으로 게임을 구현하니 에러가 정말 많았는데, 호스트 없는 게임, 게임 없는 플레이어와 같이 데이터 무결성 관리가 되지 않았기 때문입니다. 따라서 관계형 데이터베이스 사용이 필요해졌고, 영속성이 필요 없었기 때문에 In Memory DB를 지원하는 SQLite를 도입했습니다. 호스트를 지우면 연관된 테이블의 데이터도 연쇄적으로 지우는 CASCADE 기능 덕분에 버그 발생 가능성을 줄였고, 코드 길이도 감소했습니다.


본인이 개발한 어떤 기능이나 시스템에서 발생한 문제를 해결한 경험이 있나요? 어떻게 해결했나요?

SQLite In Memory DB를 사용하여 게임의 상태를 관리하자 Map으로 관리할 때는 없었던 문제가 생기기 시작했습니다. 바로 비동기 문제였습니다. 동시다발적으로 들어오는 웹 소켓 이벤트의 일부를 처리하지 못해 게임이 종료되지 못하는 버그가 있었는데, async-lock을 활용하여 이벤트 핸들러를 임계영역으로 만들어 요청을 차례대로 처리하도록 강제했습니다.


팀 리더 경험#

팀을 이끌면서 마주한 가장 큰 도전은 무엇이었고, 그 상황에서 취한 조치에 대해 설명해 주세요.

두 대의 EC2 인스턴스에 각각 NextJS 서버와 NestJS 서버를 실행시킨 뒤 호스트 계정으로 회원가입 / 로그인을 할 시에 쿠키를 저장하지 못해 인증 오류가 났습니다. 리소스 간의 호스트가 다른 문제는 Cross Origin을 명시적으로 정의하면 되겠다고 생각했으나 의도한 대로 작동하지 않았고 어느새 중간발표날이 눈앞으로 다가왔습니다. 시간의 압박 속에서 퍼뜩 생각난 아이디어는 바로 집에 있는 데스크톱을 활용하는 방법이었습니다. 팀원 모두에게 SSH 연결 권한을 부여하고 서로 다른 포트를 통해 테스트하도록 만들었습니다. 호스트도 하나고 TS 컴파일 시간도 매우 빨라 개발에 가속이 붙어 중간발표 전까지 MVP를 구현할 수 있었습니다.


팀원들과의 관계 조성 및 팀 내 협업을 촉진하는 방법에 대해 이야기해 주세요.

저는 깃허브 프로젝트와 이슈를 기준으로 일거리를 분배하는 방향으로 협업을 진행했습니다. 매일 오후 1시 스크럼 회의마다 전날까지 완료한 이슈, 맡을 이슈를 정리하여 칸반보드에 위치를 조정했으며, 주기적으로 Done에 쌓인 이슈들을 아카이브해 오늘에 집중하게 했습니다. 깃허브의 Pull Request는 반드시 연관 이슈를 연결하도록 권장했으며, Pull Request가 승인되어 main 브랜치로 합쳐질 때 연결된 이슈들이 자동으로 닫혀 시간 낭비를 줄였습니다.


팀을 이끌면서 설정한 목표가 있었다면 그에 대해 언급해 주세요. 이를 달성하기 위해 취한 전략이나 계획은 무엇이었나요?

제가 협업에서 가장 중요시하는 가치는 신뢰 자산이라고 이야기했듯이, 팀 안에서 일어나는 모든 문제를 가능한 자주, 많이 공유하도록 지시했습니다. 제일 먼저 코어타임을 정해놓아 팀원들이 물리적으로 가까이 붙어있는 시간을 확보했고, 둘이 대화하더라도 다른 이들이 언제든지 대화를 캐치하고 자기 아이디어를 말할 기회를 부여했습니다.