brunch

You can make anything
by writing

C.S.Lewis

by 판뚜 Jun 12. 2019

신입 개발자에게 하고픈 말 - 있는 걸 갖다 쓰자

회사는 코딩을 하기에 앞서 팀원들과 일을 하는 곳입니다.


프로젝트의 새 구성원이 됐다면 어떤 점들을 파악해야 할까요? 우선 이 서비스 도메인 지식에 대한 이해도를 높여야 합니다. 그리고 이 개발 프로젝트가 어떤 플랫폼, 프레임워크를 사용하는지, 어떤 라이브러리들이 포함되어 있는지 등의 프로젝트 구조를 살펴야 합니다. 그래야 일을 할 수 있을 테니까요.


갓 입사한 신입 개발자들은 일단 의욕이 앞서다 보니 빨리 코딩을 하고 싶어 합니다. 코드보다 중요한 것들이 많은데도 말이죠. 오늘은 이에 대한 얘기를 해볼까 합니다.


저 같은 서비스 level 개발자인 경우에 해당되는 내용입니다.
좀 더 low level의 개발자라면 상황이 많이 다를 수 있습니다.




신입이의 첫 과제


매우 얼토당토않은 예시이지만 이해를 돕기 위해 넣어보겠습니다. 


어느 날 기획이는 이런 제안을 합니다.

기획이 曰
우리 서비스 웹페이지가 너무 심심해.
밑에 로또 번호 생성기를 넣자.
의미는 없어. 걍 재밌으라고 넣는 거야.

개발이는 생각합니다. 디자이너의 시안을 보니 사용성을 해치지 않아 보이네요. 작업량이 크지도 않고 현시점에 급한 이슈도 없습니다. 지난주에 입사한 신입이에게 첫 과제를 할당하기로 합니다.

개발이 曰
신입이님, 로또 번호 생성기 만들어볼래요?
우리 웹페이지에 하단에 넣을 거예요.
프로젝트 구조도 익힐 겸 한 번 해보세요.

입사 후 일주일 동안 책만 읽고 있던 신입이는 자신에게도 드디어 일이 생겼다며 매우 기뻐했습니다. 


(기획이가 개발이에게 반말하는 이유는 개발자 하대가 아니라 서로 친구라는 설정 때문입니다.)




신입이의 코드


로또 번호 생성기쯤이야 대학교 1학년 기초 과제 수준인 데다가, 이 회사의 빡센 코딩 테스트를 만점으로 통과한 신입이에겐 이 정도는 일도 아니기에 거침없이 눈감고 코드를 짰습니다. 


(중요한 코드는 아니므로 귀찮으면 안 보셔도 됩니다. 그만큼 별거 아닌 일을 쓸데없이 귀찮게 처리했다는 맥락입니다.)

function lotto() {
    // 6개 숫자가 들어갈 결과 배열
    var result = [];

    // 뽑은 로또번호의 개수
    var pickedCount = 0; 

    // 번호 중복 여부
    var duplicated = false; 

    // 6번 얻을 때까지 반복.
    while (pickedCount < 6) {   
        // 1 ~ 45 중 하나 뽑기
        var picked = parseInt(Math.random() * 45) + 1;

        // 지금까지 뽑은 것들과 방금 뽑은 수가
        // 중복되는지 비교 후 마킹
        for (var i = 0; i < pickedCount; i++) {
            if (result[i] == picked) { 
                duplicated = true;
            }
        }

        // 중복이 없다면
        // 결과 배열에 넣고 인덱스 증가
        if (!duplicated) {
            result[pickedCount] = picked;
            pickedCount++;
        }

        duplicated = false; // 초기화
    }    

    // 정렬
    for (var i = 1; i < result.length; i++) {
        for (var j = 0; j < i; j++) {
            if (result[i] < result[j]) {
                var x = result[i];
                result[i] = result[j];
                result[j] = x;
            }
        }
    }    
    return result;
}

(비개발자 분들이 보시기엔 많이 복잡해 보일 수도 있으나 사실 거창한 건 아닙니다. 단지 1 ~ 45의 임의의 숫자를 뽑아서 6개를 채우는데, 중복이 없도록 하고 정렬된 숫자 6개 배열을 리턴하는 함수입니다.)


신입이 曰
개발이님, 제가 완벽하게 동작하는 함수를 만들었어요!
풀 리퀘스트 보냈으니 머지해주시면
즉시 배포하겠습니다!

개발이 曰
어.. 음.. 잘 짰어요. 
근데.. 잠깐만...

개발이는 뭔가 탐탁지 않은 구석이 있었습니다.


"풀 리퀘스트", "머지"는 코드 저장소 플랫폼 github 관련 용어입니다.
쉽게 말해 "제 코드 확인해주세요."라는 의미로 생각하시면 됩니다.




굳이 모든 걸 직접 해야 할까?


만약 대학교 1학년 컴퓨터 프로그래밍 수업 과제였다면 위 코드는 무난히 통과했을 겁니다. 잘못된 부분도 딱히 없으며 결과도 정확하기 때문입니다. 하지만 여긴 회사입니다. 개발이는 "일"을 할당했지 "코딩 테스트 과제"를 준게 아닙니다.


"프로젝트 구조도 익힐 겸 한 번 해보세요."

이 간단한 과제에 개발이는 "구조를 익히라"라고 말했습니다. 이미 이 프로젝트에는 많은 유용한 라이브러리들이 포함되어 있었기 때문에 개발이는 이 점을 잘 파악한 후 효율적으로 코드를 짜길 주문했던 것입니다.

개발이 曰
잘하셨지만, 굳이 코딩 테스트 때 처럼 안해도 돼요.
이 프로젝트에서 어떤 라이브러리를 쓰는지 파악한 후 좀 더 간단하게 해 볼래요?

신입이 曰
아...... 네... ㅠㅠ


신입이는 이 프로젝트에서 사용하는 라이브러리들을 살펴보았고, lodash가 import 되어 있음을 알았습니다. 그리곤 큰 깨달음을 얻고 위 코드를 전부 삭제했습니다. 그리고 아래처럼 완성했습니다.

function lotto() {
    const numberPool = _.range(1, 45); 
    const shuffled = _.shuffle(numberPool);
    const picked = _.take(shuffled, 6);
    return _.sortBy(picked);
}

개발이는 코드 확인 후 수고했다는 코멘트를 남기고 머지해주었습니다.




잘 만들어진 것들을 가져다 쓰자.


개발자를 꿈꾸는 학생들의 질문지들을 인터넷 상에서 몇 번 본 적이 있습니다. "현업에서 자료구조/알고리즘 코드를 잘 짜야하나요?"라는 궁금증을 품은 분들이 꽤 있었습니다. 저는 이렇게 말해주고 싶습니다.

그냥 java.util 쓰세요. 당신이 직접 짠 거보단 훨씬 나을 테니까.
그 시간에 서비스 도메인 로직 파악에 더 집중하세요.

(다만, 동작 원리는 알아야 합니다. 이 알고리즘은 어떤 퍼포먼스를 내는지, 이 데이터에선 어떤 자료구조가 효율적 일지 등을 알아야 작업이 가능하니까요.)


java.util은 상징적 표현이고요. 위 예시의 lodash처럼 남들이 잘 만들어 둔 라이브러리들을 의미합니다. 또, 이는 코드 레벨의 라이브러리에만 국한되는 것은 아닙니다. 잘 짜인 보편적으로 이용되는 인프라 혹은 그 외의 솔루션 일수도 있습니다. 요즘은 여기저기 갖다 쓸 수 있는 고퀄의 솔루션들이 많으니까요.


온라인 세계엔 이미 수많은 유용한 라이브러리들이 있습니다. 이것들을 도입함으로써 서비스 개발자들은 쓸데없는 코딩으로 낭비하게 될 시간을 아끼고 "도메인 로직"에 더 집중할 수 있습니다. 더 나아가 유지 보수도 용이해집니다.


물론, 어떤 라이브러리를 도입할지는 구성원 간 협의가 필요합니다. 무분별한 import는 필요 이상의 리소스만 잡아먹을 수 있으니까요.




마치며


그리고 가장 중요한 것은, 남들이 잘 만들어 둔 것들이 당신이 만든 거 보단 몇 백배 더 낫습니다. 따라서 그거 신경 쓸 시간에 더 중요한 것에 집중합시다.

작가의 이전글 서버 개발자가 꺼리는 일 - 마이그레이션
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari