본문 바로가기
생각정리

개발자 네카라쿠배당토 중 한곳 면접 후기, 느낀점(feat. 함수형프로그래밍)

by for2gles 2022. 12. 25.
반응형

먼저 결과부터 적어보자면, 네카라쿠배당토 중 한곳에서 면접을 보았고 떨어졌다.

하지만 면접 경험 덕분에 많은 것을 깨달을 수 있었다.

단순히 면접 하나만으로 내가 생각하고 있는 개발이라는 부분이 정말 작은부분일 수 있다라는 것이 크게 와닿았다.

 


먼저 지원을 하게 된 계기는 물론 마음속에 가고싶다는 생각하던 곳 이었지만, 운이 좋게도 리크루터분께서 연락을 주셔서 이력서를 넣어보게 되었다. 아무래도 경험사항들이 팀에서 작업하는 부분과 비슷 한 부분이 있었던 것 같다.

덕분에 일사천리로 과제전형으로 넘어갈 수 있었다.

 

과제전형은 주어진시간 동안 문제를 해결하는 문제였는데, 사실 문제 자체는 어렵지 않았다. (다만 확실히 시스템을 구축해본 경험은 있어야 하는 문제였다.)

내 머리카락을 갈아 넣어 과제를 해결하고 제출 후 며칠 후 면접에 기회를 얻게 되었다.

 


과제 및 면접의 자세한 내용은 보안서약으로 작성 할 수 없다.
다만 자기 반성을 위한 작성은 해보고자 한다.

솔직하게 웃기지만, 나는 내 코드에 자신이 있었다.(자만했다.)

확장성, 최적화, 빠른 속도, 확장성, 요구사항에 없던 기타 사항들까지 정말 내 딴에는 꼼꼼하게 혼을 갈아서 만들었다고 자신했다.

하지만 직무면접은 그런 나의 생각을 뒤엎어버리는 내용이었다.

 

아래는 내가 바보같이 생각하던 내용들이다. 특히 첫번째가 정말 기가차게 어이가 없다.

 

1.  잘못된 가치관이 있었다.

가장 잘못된 가치관으로는 FP가 너무 싫었다.

FP는 Functional Programing 즉 함수형 프로그래밍이다.

지금까지, 나는 함수형 프로그래밍을 정말 싫어했다.

왜냐하면 개발자로서 커리어를 시작하고부터의 나는 사실 묻지도 따지지도 않고 명령형(Imperative) 프로그래밍으로 코딩을 시작했다.

면접을 마무리 짓고 생각을 해보니, 개발자로 취직하기 전 취미로 코딩을 하였을 때에도 그러했고, 지금까지도 그러했다.

명령형 프로그래밍으로 코딩을 하는 것에 대해서 단한번도 의문을 가져본적이 없었고, 오히려 선언형(Declarative, 함수형) 프로그래밍이 나에게는 별종이였다.


함수형 프로그래밍이 싫었던 이유는 아래와 같았다.

1. loop 자체가 비효율적이다.

예를 들어 "유저 목록을 가지고 남/녀 각자의 이름을 리턴하는 함수를 만들어보자."

인터페이스

interface User {
	id: number;
	name: string;
    gender: 'male' | 'female';
}

명령형 프로그래밍

function getEachGenderNames(users: User[]) {
	const maleNames: string[] = [];
    const femaleNames: string[] = [];
    for (const user of users) {
    	if(user.gender === 'male') {
        	maleNames.push(user.name);
        } else {
        	femaleNames.push(user.name)
        }
    }
    return {
    	maleNames,
        femaleNames
    }
}

함수형 프로그래밍

function getEachGenderNames(users: User[]) {
    return {
    	maleNames: users.filter(user => user.gender === 'male').map(user => user.name),
        femaleNames: users.filter(user => user.gender === 'female').map(user => user.name)
    }
}

 

함수형 프로그래밍 코드라인 수가 정말 짧을 지 모르겠지만, 나로서는 유저수가 5만명일 경우 5만번 loop만 돌아서 해결되는 명령형 프로그래밍과 15만번의 loop을 돌아야 하는 함수형 프로그래밍을 비교하면 무조건 로직 효율상 명령형이 좋았다.

 

2. 명령형 프로그래밍에 익숙한 나로서는 FP코드가 오히려 이해하기 힘들었다.(익숙하지 않다.)

단순히 함수를 연속호출하여 사용하는것 이외에도 Ramda 혹은 lodash의 pipe, compose를 활용한 코드들을 보면 눈이 돌아버렸었다.

 

3. 고차 함수(고계 함수), 커링(currying)이 싫었다.

이건 코드 취향인 것 같다. 사실 이 취향은 자만에 가까웠다고 생각한다.

나는 함수는 "함수 그 자체로 답을 내놓아야한다." 라는 스타일의 코드를 지향했다.

그래야 for loop에서 그 함수의 결과를 가지고  다음 데이터 처리를 할 수 있었으니 말이다.(하지만 이 말 또한 잘못된 말이었다.)


이렇게 나만의 가치관을 가질 수는 있다. 나만의 가치관을 갖는건 나쁘다고 생각하지는 않는다.

하지만 나에게 있어서의 문제는, 함수형 프로그래밍이 싫기때문에 알아보려고조차 하지 않았던 것 같다.

아무래도 함수형 프로그래밍 적 사고를 하루아침에 할 수는 없다보니, 자연스럽게 함수형 프로그래밍 코드를 보고 이해하기 너무 어려웠고 이는 또 방어기재가 생겨 아예 피해버리게 되었던 것 같다.

 

하지만 이 잘못된 가치관이 나로 하여금 더 다양하게 구성할 수 있는 코드마저도 원천 차단을 해버렸다.

 

A-1 > B > C 로 작동되는 로직이 있을 때, A-2(A-1와 유사하지만 다른 로직) 이 추가된다고 한다면

명령형 프로그래밍에서의 나는

A를 extends 하거나 A를 copy 해서 새롭게 만들어 A-1 or A-2 > B > C 를 만들었다.

 

함수형 프로그래밍에서의 나는

A > B > C 를 만든다. => ???

무슨 말이냐 하면, A 로직을 무상태로 만든다. A 로직이 수행될 때 이 로직은 A-1 유형인지 A-2 유형인지 모른다.

그냥 받은 대로 작동 할 뿐이다.

이 말이 이해가 가지 않을 수 있다.

나도 이번 면접을 보기 전까지는 이해가 가지 않았다.

물론 나도 정확하게 이해가 간 것은 아니지만 이번 면접을 통해서 이렇게 아키텍쳐를 구성함을 통해 확장성을 만들어낼 수 있다는 것을 깨달았다.

 

 

요즘은 나는 함수형 프로그래밍에 대해 공부하고 있다.

명령형 프로그래밍이 무조건 나쁘다는것이 아니다. 어떤 상황에 있어서는 위에 loop와 같이 최적화 부분으로 가게 된다면 명령형이 맞을수도 있고, 상황에 따라서 명령형이 구조가 적합할수도있다.

다만, 명령형/함수형 프로그래밍 모두 익히고, 상황에 따라서 필요한 부분에 적절히 골고루 사용할 수 있는 개발자가 된다면, 훨씬 좋을 것 같다.

나는 지금까지 바보같이 무조건 퍼포먼스 최적화만이 프로그래밍의 최적화라고 생각했다. 물론 퍼포먼스 최적화가 서버 등의 비용을 줄일수는 있다. 하지만 함수형프로그래밍을 사용함으로 인해 부수효과를 없애고 가독성을 향상시킴을 통해 인적 비용 및 커뮤니케이션 비용, 테스트 단순화, 유지보수 단순화 또한 최적화라고 생각하게 되었다.

 

2. 내가 뭔지도 모르면서 사용을 하는 프로그램도 있었다.

물론 어떤 프로그램이던 라이브러리던 사용하기 이전에는 그 이유가 있을것이고, 그 이유와 그리고 이로인한 결과 그리고 부작용 등을 고려하고 사용한다.

이때 문제가 되었던 점은 아무생각 없이 사용하였던 Redis의 keys 기능이었다.

실무에서는 Redis keys를 코드 안에서 사용한 적은 없었다.

하지만 과제에 최적화를 위해 Redis keys를 사용하였었다.

그리고 이것이 나의 무지함이 드러났다.

나는 Redis가 Single Thread라는것을 몰랐다. 심지어 Redis가 Single Thread로 작동되는지, Multi Thread로 작동되는지 궁금하지도 않았었다.

Q: "Redis keys를 사용하셨던데 이것에 대한 문제가 있는것을 아시나요?"

A: "????"

Q: "혹시 Redis가 Single Thread로 작동되는것을 아시나요?"

A: "!!!! 아 목록이 엄청 많으면 다른 요청이 다 delay되겠군요."

 


 

이외에도 정말 느낀점이 많았다. 그리고 아직 많이 부족하다는 것을 느꼈다.

또 어떤 분야에 있어 이렇게 깊은 이해도를 가져야 성공할 수 있다고도 느꼈다.

나는 또 열심히 달려나가야겠다.

반응형

'생각정리' 카테고리의 다른 글

보안에 대한 오늘의 고찰(GraphQL, 파일다운로드)  (0) 2021.07.14

댓글0