2018년 4월 6일 금요일

SW Developer라는 직업 - 개발자는 무슨 일을 할까?

안녕하세요.

아래 글은 제가 얼마 전에 다른 카페에 올렸던 글인데, 최근 1-2년 사이에 저에게 메일이나 행아웃 등으로 연락을 주시는 분들의 연령대가 낮아지고, 아직 개발자 커리어를 시작하기 이전에 고민을 하시면서 연락을 주시는 분들도 많아 제 블로그에도 포스팅을 합니다.

주제에는 벗어나는 이야기이지만 최근 1-2년 사이에 현재 고등학생이시거나, 대학생이신 10대 후반에서 20대 초중반이신 분들이 이민에 부쩍 관심을 가지시는게 아닌가 싶기도 합니다. 블로그를 처음 시작했던 시기만 해도 저와 비슷한 또래이거나 저보다 좀 더 형님 세대에서 연락을 많이 주셨는데, 요즘에는 오히려 30세 미만이신 분들이 더 많은 것 같네요. 미세먼지 때문인지, 아니면 좀 더 개방되고 세계화 된 환경에서 성장하셔서 더 빨리 더 넓은 곳으로 눈을 돌리시는 것인지는 모르겠지만, 요즘 메일을 보면 조금 신기하기도 합니다. 아, 어쩌면 Express Entry 이후로 나이가 차면 이민이 힘들어져서 미리 포기하시는 분들이 많아져서 그럴 수도 있겠고요.

그러면 카페에서 옮겨 온 글을 시작합니다.

===================================================================

이미 개발일을 하고 계신 분이라면 별다른 이야기도 없고 어쩌면 너무 저수준의 이야기만 풀어놓아 제 생각과 많이 다를 수도 있습니다. 하지만 어쩌겠습니까. 제가 그렇게 훌륭한 지적수준을 지니지 못했고 그냥 열심히 하는 개발자일 뿐인지라 웬만한 것은 다 단순하게 생각하고 처리하니 제 생각도 그 수준에 머물러 있는 것을요...

개발자라는 직업에 대해 생각해보면 이는 분명 전문 기술직입니다. 

일을 하기위해서는 정규교육이건 독학이건 일정 수준 이상의 학습과 경험을 갖추어야 합니다. 또한 개발자라는 직업은 지식 노동자입니다. 육체노동이라고 하면 타이핑을 하고 마우스를 컨트롤 할 때 필요한 손가락과 손목운동 정도입니다. (하지만 거북목 증후군과 터널 증후군이 빈번한 것은 비밀이에요)

그런데, 다른 지식노동 전문 기술직과는 조금 다른 것이 정규교육을 전혀 거치지 않은 사람들도 얼마든지 이 직종에 종사할 수 있으며 또 잘 할 수 있습니다. 근본적인 이론은 아무래도 학사 이상의 교육을 받는 것이 좋겠지만, 업무 자체를 처리함에 있어서는 독학으로 혼자 공부해도 별다른 무리가 없기도 합니다. 온라인에 워낙 많은 학습자료들이 있기 때문이기도 하지만, 기술 변천이 매우 빠른 분야 중 하나인지라 배운 지식을 그대로 활용하는 것 보다 더 중요한 것은 기존에 알고있는 내용을 기반으로 새로운 기술을 빨리 습득하고 활용하는 능력이기 때문이기도 합니다.

아주아주 단순하게 살기위해 노력하는 저의 머리에서는 SW 개발이라는 일을 '긴가민가의 공학' 이라고 생각합니다.
즉 true or false에 대해 계속해서 명확하게 정의하고 확인하는 과정이 무한히 반복되면서 제품이 만들어지고 작동하게 됩니다.



컴퓨터는 0과 1 외에는 아무것도 모른다는 말을 이미 들어보셨을 것입니다. 네, 양자 컴퓨터가 아직 없는 지금은 컴퓨터에서 하는 일이라고는 따지고 보면 0과 1을 처리하는 것 외에는 없습니다.  아무리 복잡한 시스템이라고 해도 이는 마찬가지입니다.

SW 공학은 다른 공학분야들에 비해 근래에 생긴 분야입니다. 그렇다보니 여기에서 만들어내는 제품들은 보통 기존 아날로그 방식의 프로세스나 물건 등을 디지털화 하여 사람보다 좀 더 빠르게 처리하도록 만들죠.
고급 개발자들은 상황이 다르겠지만, 저와같은 저랩 개발자라면 아무리 크고 복잡한 상황이라도 계속해서 단순화하고 분할하여 '긴가민가'의 논리로 모든 것을 처리할 수 있는 단계로 나누는 것만 잘해도 일을 하는데 큰 문제가 없습니다.

10년 전에 제가 했던 일을 다시한 번 떠올려 예를 들어보겠습니다.

요즘 스마트폰에서는 어떤지 모르겠는데, 예전 피쳐폰을 생각 해 보시면 지인에게 전화를 걸 때에 보통 두 가지 중에 한가지 방법으로 전화를 걸으셨을 것 같습니다.
하나는 단축 다이얼 기능으로 0-9까지 번호 중 하나를 길게 눌러서 미리 설정 해 둔 번호로 바로 전화가 걸리게 하는 것이고, 다른 하나는 일명 '초성 검색'으로 이름의 초성만을 입력하면 그 초성과 매칭되는 사람들이 리스팅 되어 사용자가 선택하여 전화를 걸 수 있게 하는 것이지요.
아, 전화번호를 그냥 통채로 외워서 전화를 걸고 계시다고요? 폰북에 들어가 ㄱ-ㅎ까지 주루룩 검색을 하신다고요? 만약 그렇다면 당신은 핸드폰 문화가 퍼지기 시작했던 90년대 말에 이미 중년에 접어드신 분들이거나, 매우 강한 아날로그 적 감성을 지닌 예외적인 분들 일 것입니다.

먼저 단축 다이얼 기능을 단순화하여 보면 이렇습니다.

핸드폰의 키패드는 매 xx millisecond마다 계속해서 사용자가 버튼을 눌렀는지 안눌렀는지 확인을 합니다.
    - 0번키 지금 눌려있니? 아니니?
    - 1번키 지금 눌려있니? 아니니?
    - 2번키 지금 눌려있니? 아니니?
     ...

예를 들어서 사용자가 1번 버튼을 누르면 눌리자마자 기계가 버튼이 눌린 것을 인식하고 동작하는 것이 아니라, 아주 짧은 시간이지만 매 xx millisecond마다 각 개별 버튼의 눌림 상태를 확인해서 눌린 것인지 아닌 것있지 알아내는 방식이지요.

버튼이 눌린 상태에서도 핸드폰은 계속해서 xx millisecond마다 각각의 버튼을 한 번 씩 돌아가면서 눌림 상태가 true인지 false인지 지속적으로 확인을 합니다.

그러다가 특정 순간에 1번 버튼의 눌림 상태가 True에서 False로 바뀌면 또 다른 긴가민가 테스트를 합니다.

    - 버튼이 눌린 후 떼어질 때 까지 시간이 1초보다 크니 아니니?

만약 1초 보다 오랜 기간동안 눌려 있었다면 이건 버튼 길게누름으로 인식을 하게되어 단축 다이얼로 동작을 하게 합니다. 만약 1초 미만으로 눌렸다면 일반 버튼 누름으로 인식을하고 단순히 화면에 1을 출력하고 끝내죠.

1초 이상 눌린 경우엔 다시 한 번 긴가민가 테스트를 진행합니다.

    - 1번 단축 다이얼이 설정이 된 적이 있는지 아닌지 긴가민가 테스트를 합니다.

기라면, 이미 등록된 번호를 가져와 전화 걸기를 합니다.

아니라면, 사용자에게 1번 단축다이얼을 등록 할 것인지 아닌지 물어보는 화면을 뿌립니다. 그리고 사용자의 입력이 Yes인지 No인지 다시 한 번 확인을 하죠.

조금은 더 복잡하지만, 한글 이름의 초성검색 기능도 따지고 보면 다 이러한 식의 긴가민가 테스트의 반복입니다. (검색속도 향상을 위해 초성들 따로 인덱싱을 하는 등의 로직이 추가되었지만, 아주아주 기본으로 보자면 그러합니다)

초성 검색은 따로 초성검색 메뉴로 들어가지 않고 그냥 전화기 메인 화면에서 숫자를 누르면 누른 숫자와 매칭되는 전화번호 검색이나 혹은 누른 숫자키에 매칭되는 한글 초성으로 검색이 됩니다.

위에 버튼 길게눌림 긴가민가 테스트를 통해 버튼 짧게 눌림을 인식했다고 가정하고...

    - 눌린 숫자와 매칭되는 한글이 자음이니 모음이니?

모음인 경우라면 이건 그냥 숫자키로 인식합니다. (중성 검색 기능은 없기에...)

이런 식의 키 입력이 지속되어 계속해서 한글 자음과 매칭되는 숫자 키가 눌렸다고 가정하면, 버튼이 눌릴 때 마다 또 이런 테스트를 합니다.

    - 지금 2글자 이상 입력을 한 것이니 아니니?

초성검색은 보통 2자 이상 입력을 할 경우에만 동작을 시작하기에 (1글자로 검색을 하려면 워낙 많은 검색 결과가 나오기에...) 이런 검사를 합니다.

만약 입력한 버튼 중에 초성과 매칭되지 않는 숫자가 섞여있다면 지금까지 입력한 숫자열은 모두 초성검색이 아닌 일반 전화번호 검색 기능으로 동작합니다. 예를들어 전화번호 뒷 4자리 검색 같은 기능 말이죠.

자, 사용자가 2글자 이상 입력을 했고, 모두 초성에 매칭되는 숫자키라면 초성검색 기능를 작동시킵니다.

초성검색을 하는 방법은 여러가지이지만, 지금은 편의상 가장 무식하지만 단순한 방법으로 설명 드립니다.

먼저 입력된 숫자키에 매칭되는 한글 자음의 조합들을 전부 만들어 냅니다.
예를들어 삼성 천지인 자판에서 4번 버튼은 ㄱ 과 ㅋ에 매칭됩니다. 그리고 5번 버튼은 ㄴ과 ㄹ에 매칭되죠.
그러면 4, 5번 버튼이 연속으로 눌렸을 경우 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ 라는 초성의 조합이 나올 수 있습니다.
아, 쌍자음을 까먹었군요. 쌍 'ㄴ'이나 쌍 'ㄹ', 쌍 'ㅋ'은 없지만 'ㄲ'이 있으니 이 조합도 추가를 해서 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ, ㄲㄴ, ㄲㄹ 조합이 만들어 집니다.

그 다음에는 주소록에 저장된 모든 사람의 이름들을 한 번 씩 다 확인을 합니다.

이미래
강래원
김개똥
...

이렇게 이름이 있으면 먼저 처음에 있는 '이미래' 부터 가봅니다
이미래과 이전에 만들어 둔 초성 조합인 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ, ㄲㄴ, ㄲㄹ을 하나씩 비교 해 봅니다. 이름의 첫 글자 '이'에서 초성인 'ㅇ'을 가져옵니다.

    - 미리 만들어 둔 조합의 첫 자음과 'ㅇ'이 매칭 되니?

답은 No이니, 다른 긴가민가를 해봅니다.

    - 그 다음 이름도 있니?

그 다음에 '강래원'이 있으니 가져옵니다. 그리고 그 중 첫 글자의 초성인 'ㄱ'을 가져오죠.

    - 조합 내에 첫 글자로 'ㄱ'이 있니?

네 있습니다. 그러면 비교대상 조합군을 ㄱㄴ, ㄱㄹ, ㅋㄴ, ㅋㄹ, ㄲㄴ, ㄲㄹ 6개에서 ㄱ으로 시작하는 ㄱㄴ, ㄱㄹ 두 개로 줄여줍니다. 그리고 그 다음단계로

    - 이름에 '강'다음에 글자가 있니?

네 있죠. 그러면 그 다음 단계로 다음 글자를 가져와 그 중 초성인 'ㄹ'을 뽑아냅니다.

    - 혹시 조합 내에 두 번째 글자로 'ㄹ'이 있니?

네 조합 내에 있습니다. 축하합니다! 드디어 초성검색에 부합되는 검색결과 중 하나를 찾았습니다. 이제 이 이름은 입력한 값과 매칭되니 화면에 출력하고, 그 다음 이름을 또 가져와 하나씩 긴가민가를 해 주는 것입니다. 전화번호부의 맨 끝에 갈 때 까지요. 그렇게 하여 매칭되는 초성 조합을 가진 이름들을 모두 찾아내서 보여주는 것이지요.

이렇게 SW라는 것은 사실상 "긴가민가 테스트"를 주어진 목록과 상황 상에서 "반복" 하는 방식으로 이루어져 있습니다.

별 것 아닌 것 같지만 의외로 이련 일을 하면서 자주하는 실수로는....
첫 번째 글자 비교를 완료했으니 그 다음 글자로 넘어가야하는데, 실수로 같은 글자를 반복 비교한다거나, 이름의 첫번째 글자 자음과 만들어 둔 조합의 두번째 자음을 비교하여 매칭한다거나 식의 실수가 자주 발생하기도 합니다.
혹은, '강래원' 이름은 세 글자이지만 입력한 숫자는 2글자 뿐이기에 앞 두글자만 비교를 하고 넘어가야 하는데, 구지 세번째 글자를 비교하려고 덤비는 경우도 있지요. '원'의 'ㅇ'과 아무런 값도 없는 것 간의 비교를 하는 것이지요. 이 경우에는 비교 방식에따라, 사용하는 프로그램 언어에 따라 폰이 재부팅 될 수도 있고, 그냥 강래원은 4, 5번키 입력에 맞지 않는 것이라고 치부하고 넘어 갈 수도 있고, 아니면 잘못해서 비교를 했지만 또 잘못해서 비교한 것이 맞다고 하여 2중 오류로 최종 결과는 강래원은 4, 5번 키와 맞는 이름이라고 올바른 답을 찾을 수도 있습니다.

SW가 이세돌 9단을 바둑으로 이기기도 하고, 처음 가는 길이라도 막히지 않는 구간으로 잘 찾아 최적 구간의 길을 찾아주기도 하는 등 참으로 복잡한 일을 하는 것 같지만, 복잡한 것은 최종 완성된 제품일 뿐 세분화 하여 나눠놓고 따지고 들어가면 각각의 논리 구성은 이와같이 긴가민가 테스트를 각각 주어진 조건과 환경에 맞게 지속적으로 반복을 하는 작업입니다.

그렇다보니 복잡한 세상을 잘게 쪼개서 아주아주 단순하게 생각하는 능력이 좋다면 전문적인 고등교육을 받지 않아도 얼마든지 혼자서 할 수도 있는 일이기도 하죠. 공학이라고는 하지만 다른 공학과는 달리 높은 수준의 수학적 지식을 필요로하기 보다는 Yes/No의 논리연산에 대한 능력이 더 필요합니다. 

여기에서 오는 작은 문제가 하나 있는데, 아직 실무를 경험 해 보지 못한 학생들의 경우 1,2학년 때에는 과연 내가 배우는 것으로, 지금까지 배운 것으로 뭘 만들어 볼 수나 있으려나? 맨날 숫자 비교나 하고, 글자 비교나 하고, 그거 반복하고... 아주아주 단순한 것 밖에 만들지 못하는데, 내가 뭘 할 수 있으려나? 졸업하면 일이나 할 수 있으러냐? 코업 나가면 일이나 할 수 있으려나? 걱정을 많이 하기도 합니다.

벌써 20여년 전인데... 저도 예전에 대학생 때 그랬습니다. 학교에서 이것저것 많이 배우기도 했고, 또 혼자서 학교에서 가르치지 않는 다른 기술들도 공부하고 연습 해 보기는, 매냥 하는건 긴가민가의 반복만 하는데 어떻게 엑셀같은 프로그램을 만들고, 어떻게 핸드폰을 만들 수 있는지 도무지 감이 오지 않았죠.

하지만 엑셀이건 핸드폰이건 너무 큰 숲만 봐서 그런 것이고 그것들도 다 잘게 잘라서 보면 이렇게 지금까지 배운 것들 위주로만 구현이 된 것이니 혹 지금 SW 공학 전공을 하시는 학생들이 있다면 너무 걱정하지 말라고 이야기 해주고 싶습니다. 대신, 큰 숲을 작은 나무와 작은 나무에서도 각각의 나뭇잎 한장 한장으로 잘게 쪼개서 볼 수 있는 능력을 키워야 합니다. 자기가 배운 단순한 기술들을 조합해서 무언가 소소하게나마 의미있는 제품으로 만들어 내는 훈련을 해야합니다. 이런건 학교에서 잘 가르쳐주는 것도 아니고 가르쳐준다고 다 아는 것도 아니기에 혼자서 이것저것 많이 해보는 것이 좋지요.

추가로 말씀드리자면 사실 위에 예제는 실제 핸드폰에 구현된 코드 구조와는 사뭇 다릅니다. 앞서 말씀드린 것 처럼 구현할 수 있는 수 많은 선택지 중 가장 단순한 방법을 말씀드린 것입니다. 보통은 이런 식으로 검색을 할 경우 검색 속도의 문제가 있기에 사전에 초성 인덱싱을 미리 하는 방법등 다른 방법 등을 쓰지요. 예를들어 '김개똥'이라는 이름을 저장할 때에 초성 검색시 매칭되는 숫자 키인 '4, 4, 6'이라는 키 조합을 미리 찾아서 '김개똥'이라는 이름과 함께 저장하는 것 같은 방식이 그 중 하나라고 할 수 있습니다.
이렇게 하면 사용자가 버튼을 누를 때 마다 모든 조합을 다 찾아내고 각 조합마다 계속해서 비교하는 등의 반복된 작업을 하지 않고 사용자가 입력한 숫자키의 배열이 '4, 4, 6'과 매칭되는지의 여부만 확인하면 되니 훨씬 더 빨리 검색 결과를 얻을 수도 있죠.

이렇게 인덱싱을 하는 방법을 연구하여 남들보다 빨리, 효율적으로 검색하는 것을 찾아내는 것이 SW 개발자라는 직업을 단순 기술직이 아닌 지식 노동자로 만듭니다. 단순하게 계속해서 Yes No만 반복하다보면 아무리 빠른 컴퓨터라고 해도 입력된 데이터가 많아질 수록 점점 느려질 수 밖에 없는데, 아주아주 작고 보잘것 없는 아이디어 같지만, 전화번호를 저장할 때에 작은 계산만 하나 미리 해서 실제 사용 시에 반응속도를 향상시키는 것이지요.

또 이러한 새로운 방식으로 검색을 하지 않는다 하여도 앞서 했던 긴가민가 테스트들의 순서나 이를 반복하는 순서만 바꾸어도 성능에 큰 영향을 주기도 합니다.
제가 예전에 대학생때 후배들에게 세미나를 하면서 한 적이 있는 말인데, 만원짜리 한장과 천원짜리 한 장이 있을 때, 사람 세계에서는 어떻게하건 11,000원이지만, 컴퓨터 세상에서는 만원짜리가 앞에오고 천원 짜리가 나중에 올 경우 만 천원이지만, 천원이 앞에오고 만원이 나중에오면 천만원이 되기도 합니다.

컴퓨터 공학의 시초는 사실 수학인지라, 정말 고성능에 뛰어난 연산이 필요한 제품을 만들기 위해서는 수학적인 지식과 다양한 수학 공식들의 활용/적용 능력이 필요하기도 합니다. 하지만 저처럼 저랩 개발자들의 경우 그런거 별로 필요 없습니다. 복잡한 실제의 인간 세상을 단순화해서 네/아니요의 구조로 잘게 자를 수 있고, 계속해서 무한 반복되는 긴가민가에서 내가 확인해야 하는게 기인 것인지 아닌 것인지 헷갈리지 않을 능력만 있으면 적어도 저처럼 밥벌어 먹고 살 수는 있습니다. (그런데 종종 긴가민가의 숲에서 길을 잃고 헤메기도 합니다 ㅠㅠ)

혹시나 이쪽 분야에 새로 커리어를 시작을 고민하시는 분들이나, 전공 고민을 하시는 분들께서 만약에 제 글을 읽고 뻘써부터 머리에 쥐가나기 시작한다면 어쩌면 이 분야가 적성에 맞지 않는 것일 수 있습니다. (아니면 제 필력이 형편없어서 읽기 힘들어서 그럴 수도 있고요)

어찌되었건 저의 개똥같은 작은 생각이 고민하시는 분들께 조금이라도 도움이 될 까 싶어 몇 자 적어봅니다.


댓글 없음:

댓글 쓰기