107 – GCC 옵션(자주 사용되는)

많은 옵션들 중에서 정리하고 싶은 옵션들을 리스트로 정리해보았다. 이젠 이 옵션들을 하나 하나 살펴보도록 하겠다. 내용은 최대한 간단하게 적고, 예시를 많이 보여주려고 하였기 때문에 은근 스크롤이 긴 편이다.

  • -o

C 코드를 컴파일할 때 생성되는 출력 파일 이름을 지정하는 옵션이다. 사용법은 다음과 같다.

스크린샷_2017-06-19_13-11-15.png

컴파일 할 파일과 옵션 순서를 바꿔도 똑같이 동작한다. 이전에 gcc의 작업 순서를 보여주기 위해서 다시 만들었던 hello world 소스코드이다. 아무 지정도 없었을 때에는 a.out이 나왔지만, -o 옵션을 통해 file이라는 파일이 만들어졌다. 이 파일을 실행하면 똑같이 hello world를 출력한다.

-o 옵션을 생략하고 컴파일 하면 실행 파일 이름이 자동으로 a.out이 되는 것 외에도 주의해야 할 것이 있다. 두 가지 다른 소스를 차례로 컴파일할 때, 먼저 생성된 a.out을 덮어쓸 수 있다. 근데 이 작업이 경고 없이 그냥 막 덮어쓰게 된다. 앞에 예제들은 그런 거 신경 안쓰고 했었지만, 나중에 프로그램을 만들고 할 때에는 중요한 요소가 된다.

  • -E

앞에서 C 소스 파일을 컴파일하는 과정에 네 단계가 있고, 각 단계를 수동으로 조정할 수 있다고 했다. -E 옵션은 컴파일의 첫 단계인 전처리까지만 실행한 결과를 화면에 출력한다. 실제로 실행을 해본다. 아래처럼 뭔가 막 실행된 것을 볼 수 있다. 이게 전처리된 결과를 보는 것이다.

-E 옵션만 주면 전처리된 결과가 화면에만 출력되고 파일로는 저장되지 않는다.

그러므로 파일로 저장하려면 -o 옵션을 함께 주어야 한다. 그러면 전처리 결과를 디스크에 저장할 수 있다. 아래 예시가 실제로 실행한 결과다. 화면에는 보여주지 않고 그대로 파일로 저장했으며, 저장된 파일을 vi로 열어보니  이전에 출력된 것이 그대로 출력된다.

  • -c

전처리, 컴파일, 어셈블까지 실행하여 오브젝트 파일(.o)을 생성한다. 이 오브젝트 파일은 나중에 실행 가능한 링킹 작업만 끝나면 되기 때문에 이 오브젝트만 가지고 gcc로 돌려도 실행 가능한 파일이 만들어진다. 우선 -c 옵션을 이용해서 오브젝트 파일을 만드는 것을 보도록 하자.

file.o 파일이 만들어진 것을 확인할 수 있다. 이제 이 오브젝트로 실행 파일이 만들어져서 무사히 hello world가 찍히는지 확인해보도록 하자.

a.out 파일을 지우고 그대로 file.o 파일을 가지고 컴파일을 완료한 후, 실행해보니 그대로 실행이 된다.

근데 이 옵션이 왜 필요한지 궁금한 사람들이 있을 것이다. 프로그램이 좀 커지고 프로젝트가 대형화 되어 수백, 수천 단위의 소스 파일을 컴파일 하는 경우에는 -c 옵션을 통해 하나의 프로그램을 여러 파일로 분리해 작성한 다음, 함께 컴파일하는 “분리 컴파일”을 할 때에 많이 이용된다. 즉, 왠만큼 규모가 커지게 되면 다 이용한다. 이걸 위해 간단한 예제를 하나 더 만들어보았다.

01 폴더 안에 main.c와 hi.c 파일을 작성하였다.

이 두 파일을 컴파일 하는 것은, 앞의 예제에서 여러 파일을 컴파일하는 예제를 다룬 적이 있다. 이 둘을 함께 컴파일하는 것을 분리 컴파일이라 한다. 아래와 같이 하면 정상적으로 실행되는 것을 확인할 수 있다.

그러나, 이 작업을 하나의 파일마다 각각 하게되면 오류가 발생한다. 당연히 서로가 참조해야 할 정의를 찾을 수 없어서 발생하는 것이다. hi랑 main 함수를 몾찾는 거다.

하지만, 오브젝트까지만 만들어진 파일에 대해서는 나중에 링크를 할 수 있다. 링크가 진행되는 구조와 실행 결과는 아래와 같다.

이 나중에 링크가 될 수 있는 기능 덕분에 여러 사람들이 자신이 개발한 작업 소스에 대해서 해당 소스만 수정하면 되는 그런 상황이 된다. 예를 들어, hi 함수에 기능을 수정하고 싶으면 hi만 수정해서 다시 오브젝트를 만들면, 나중에 수정된 오브젝트만 가지고 한번에 진행하면 된다. 그러면 main.c를 다시 컴파일 할 필요가 없어지므로 컴파일 시간도 줄어들게 된다.

이 옵션은 make와 함께 쓰면 상당히 강력한 기능이 된다. make에 대한 설명을 할 때, 한번 더 다뤄보기로 한다.

-I

C 소스는 표준 디렉토리에 있는 헤더 파일을 이용하여 개발을 할 수도 있지만, 표준 디렉토리가 아닌 위치에 있는 레더 파일을 가져와서도 개발을 할 수 있다. 그 때 그 디렉토리의 위치를 지정해주는 옵션이다. 이 옵션 또한 예제를 보고 하면 금방 진행할 수 있다.

02라는 폴더에 예제를 만들어보았다. 그리고 예제의 구조 및 사용되는 소스코드를 먼저 작성해보고 시작한다.

myheader.h 파일에는 나이가 적혀있고, mydir 폴더 안에 들어있다.

이 상태에서 age.c 파일을 컴파일하면 myheader.h 파일이 없다는 오류가 나타난다.

표준 디렉토리에 없기 때문에 오류가 발생한 것이다. 이제는 옵션을 주고 실행을 해보겠다.

옵션에 해당되는 디렉토리의 위치를 지정해줬더니 바로 컴파일 오류가 나지 않는 것을 볼 수 있다.

이처럼 기본적으로 이용되는 옵션들에 대해서 예시와 함께 살펴보았다. 이 옵션들은 뒤에 더 많은 리눅스 개발 환경을 다루다보면 하나 둘은 반드시 보게 되는 기능들이기 때문에 이런 기능이 있다는 것은 꼭 알아야 하는 것들만 정리해보았다. 이제 다음에는 라이브러리 지정 옵션에 대해서 살펴보겠다.

106 – GCC 옵션 (요약)

gcc에 대해서는 솔직히 다 다루는 거 자체는 무리다. 진짜다. 그래서 정말 자주 사용하는 옵션, 라이브러리 지정 옵션, 디버깅 옵션, 최적화 옵션 등에 대해서만 다루더라도 엄청나게 많아지는데, 그 중에서도 좀 갈려서 다뤄야 할 거 같아서 내용을 쪼개고 옵션들을 하나하나 천천히 살펴보았다.

그래서 몇 단위로 하려는 옵션들을 아래와 같이 쭉 한번 요약해보았다. 옵션에 대한 간단한 설명이나 특수한 설명들은 다음 글에서 조금씩 다뤄보기로 하겠다. 당장 이것만 봐선 일단 이런 옵션들이 많이 쓰인다고만 알아두면 된다.

  • 옵션 | 의미
  • -E | 전처리를 실행하고 컴파일을 중단한다.
  • -c | 소스 파일을 컴파일만 하고 링크를 수행하지 않는다. 오브젝트 파일이 생성된다.
  • -o | 바이너리 형식의 출력 파일 이름을 지정한다. 지정하지 않으면 기본 출력인 a.out이 적용되어 결과물이 만들어진다.
  • -I | 헤더 파일을 검색하는 디렉토리 목록을 추가한다.
  • -L | 라이브러리 파일을 검색하는 디렉토리 목록을 추가한다.
  • -l | 라이브러리 파일을 컴파일 시 링크한다.
  • -g | 바이너리 파일에 표준 디버깅 정보를 포함시킨다.
  • -ggdb | 바이너리 파일에 GNU 디버거인 gdb만이 이해할 수 있는 디버깅 정보를 포함시킨다.
  • -O | 컴파일 코드를 최적화시킨다.
  • -ON | 최적화 N단계를 지정한다.
  • -DFOO=RAR | 명령라인에서 RAR의 값을 가지는 FOO라는 선행 처리기 매크로를 정의한다.
  • -static | 정적 라이브러리에 링크한다.
  • -ansi | 표준과 충돌하는 GNU 확장안을 취소하며, ANSI/ISO C 표준을 지원한다. 이 옵션은 ANSI 호환 코드를 보장하지 않는다.
  • -traditional | 과거 스타일의 함수 정의 형식과 같이 전통적인 K&R C 언어 형식을 지원한다.
  • -MM | make 호환 의존성 목록을 출력한다.
  • -V | 컴파일의 각 단계에서 사용되는 명령을 보여준다.

극단적인 착각 – 알고리즘에 대한 과도한 칭찬과 과도한 멸시

개소리 오브 개소리 – CS Fundamental, 자료구조, 알고리즘 깊이 몰라도 된다는 개소리에서 적은 글이랑 성격은 비슷하지만, 좀 다른 이야기를 하고 싶다. 페이스북에다가도 똑같이 적었는데, 트위터로 날 접하는 사람들한테도 좀 들려주고 싶다.

알고리즘… 이게 언제부터 막 그렇게 거창한 거였나 싶었다.

그냥 단순 서비스 개발을 하면서도, 기술서에 나와있는 내용이나 기술 협의를 하면서 나온 내용에 대해서도 우리가 어떤 식으로 구현할 수 있을까를 머릿속에서 짜내는 것 또한 알고리즘이다. 그걸 수학적으로 풀어 써야지만 알고리즘이라고 한다면 프로그래머는 죄다 수학자여야만 하는 건가?

알고리즘을 공부하면서 생각의 폭이 넓어지는 것이지, 굳이 “정답은 하나입니다!”와 같이 정답만 찾아 헤메는 수능 공부를 하는 게 아니란 말이다. 별 것 아닌 생각으로도 상책을 내어 해결할 수 있다면, 굳이 복잡한 알고리즘 갖다 붙일 이유 또한 없는 거 현업에서 개발해본 사람이라면 누구나 다 안다. 오히려 조직 플레이를 잘 하라, 협업을 위한 기술들을 더 잘하자고 하면 더 하지. 근데, 뭔 문제 생겼을 때 해결하려는 수단 중 별 거 아닌 듯한 생각, 의외의 생각들이 있다. 그런 조금이나마 더 유연한 생각, 더 해볼려고 하는 노력에서 유연한 사고에서 나오는 거라는 것 정도는 이미 알고 있는 거 아닌가? 그거 땜에 조금이나마 더 오픈소스들을 보고 참고하고, 어느 정도의 구조적인 알고리즘까지 조금이나마 더 이해하려는 거 아닌가? 왜 그런 것 까지 싸잡아 무시하는 거지?

대학에서 알고리즘 수업을 수학적 증명이니 뭐 그딴 식으로 가르치는 건, 그냥 그 교수들이 그렇게 가르치는 것 뿐이다. (근데 그걸 맹신하는 일부 교수들이 있어서 문제.) 어차피 맨 첫 시간에 잠깐 이야기 한다. 아니면 알고리즘들 책 앞쪽 부분에도 똑같은 이야기들이 있다. “알고리즘은 문제 푸는 해결력을 높이는 데 필요합니다.”라고 적힌 책들 많다. 심지어 Art of computer programming에서도 나와있는 거지만 “프로그래밍 접근법에 대한 참고 내용입니다.”, “수학적 증명이 어려우면 그냥 넘기셔도 됩니다.”라고 나와있다. 단순히 생각 넓히기일 뿐이다.

근데 그걸 프로그래밍에 대한 일종의 종교적 믿음? 거기에 대한 불편함? 하. 그런 믿음, 그런 불편함. 인공지능 기술 이전에 이미 미친듯이 진행된 프로그래밍 자동화 기술들 갖다 들이밀면 단 한방에 무너질 믿음이다. “그럼 당신보다 이 자동화 기술이 더 발전하는 게 효율적이겠네요?”라고 하면 뭐라고 할 껀가? 그 툴 잘 쓰면 된다고 반박할껀가? 그런 레벨이면 이미 몸으로는 CRUD하고 있는 본인 스스로를 부정하고 있는 거나 마찬가지인 거다. 아니면 이야기가 너무 진행되었다는 식으로 회피하겠지.그런 불편함 또한 갖다 버릴 고정관념이다.

사실 알고리즘에 대한 경고는 일종의 미래에 대한 경고다. 생각이 굳어지는 그런 개발자들이 되지 말자는 거지 그게 뭐 “당신은 Art of computer programming에 나오는 문제 하나도 풀지 못하는 사람이니 개발 할 가치가 없습니다.” 라고 하는 그런 게 아니다. 그런 고차원적 수학을 요구하는 건 아니지만, 그렇다고 해서 그게 뭐 아예 수학을 못해도 된다고 직결되고 하는 그런 건 아니다.예상 외의 것일지도 모르지만, 이미 우리는 프로그래밍 언어를 공부할 때부터 필요에 의한 최소한의 수학적 사고를 같이 익히면서 시작한다. 그게 몇 년 단위로 계속 프로그래밍 언어 몇 가지를 써보고 하면서 본인 스스로가 모를 뿐이지. 그리고 그 정도의 사고도 못하면 다른 사람과의 협력 따윈 기대할 수도 없다.

알고리즘에 대해서 너무 극단적으로 몰고 가지 말자.

Swift를 쉽게 배울 수 있는 playground – 이런 툴들 덕에 언어는 더더욱 오랫동안 공부하면 안된다.

스크립트 언어 뿐만 아니라 요즘 언어들의 공통적인 것이 있다면, 바로바로 결과 떠서 보여줄 수 있는 환경이라는 것이다. 언어를 배울 때 내가 쓴 코드가 바로바로 결과가 어떤 것인지를 보여줄 수 있으면서 하게 되면 재미를 더 붙이기 쉽게 된다. 게다가 디버깅이라는 개념 자체가 상당히 쉬워져서 금방금방 한다. 그게 당장 필요한 언어를 써보려고 할 때, 시간을 줄일 수 있는 장점이이 있다.

파이썬의 경우에는 파이썬 쉘 안에서 동작하다 보면 금방 금방 결과가 나오는데, 이런 방식이 신기한 방식은 아니다. 매스매티카나 매틀랩 같은 수식 연산에 최적화된, 흔히 사이언티픽 프로그래밍을 하다보면 그런 경우의 환경들이 상당히 많이 나와있다. 일반적인 프로그래머들의 환경에서는 그렇게 잘 쓰이는 환경이 아니어서 신기할 뿐인 것이다.

그러다 보니 교육용 언어에서는 이렇게 바로바로 보여줄 수 있는 기능들이 기본적으로 딸려오는 편이다. 스크래치도 본인이 구성한 코드가 거의 바로 실행될 수 있는 수준으로까지 되어있다. 그걸 통해 애들이 직접 코드를 구성하고 나서 바로 클레이 버튼으로 해당되는 부분만 줄줄 실행되거나 전체 실행을 시켜서 바로바로 볼 수 있게 되어있다. 다른 교육용 언어도 마찬가지고…

일반적인 개발에서 쓰일 정도면 그 코드를 연습할 수 있는 연습 공간을 제공하게 되는데, 애플의 스위프트의 경우, playground라는 코드 라인이 하나 하나 실행되어 볼 수 있는 환경이 존재한다. Xcode 안에도 존재하고, 아이패드 앱으로도 존재한다. 이걸 통해 스위프트를 배우는 튜토리얼까지 존재할 정도니, 이미 말은 다 했다고 본다. 이를 통해 스위프트 언어를 배우는 시간을 엄청 짧게 해주면서 동시에 코드 테스트용으로도 잘 써먹는 사람들이 있다.

내가 여기서 주목하는 것은 바로 교육적인 것이다.


아이패드의 Swift Playground에 있는 튜토리얼이다. 원하는 코드를 입력하면 이 코드가 실행되는 특정 게임을 만들었다. 요즘 이런 교육 프로그래밍이 엄청 많은데, 이런 교육을 진행하게 되면, 프로그래밍 배우는 데 필요한 최소한의 기술에 대해서 직접 입력하면서 배우기 때문에 정말 빠른 시간 안에 배운다.

근데, 이 방법이 참신하냐?

오래전부터 말 많이 했던 것들이다. 예제 좀 많이 해봐라. 코드 1만줄 넘게 해보면 금방 는다. 이런 이야기들이랑 별 차이 있나 싶을 정도로 똑같은 상황을 그대로 하고 있을 뿐이다. 근데 이게 사람들이 책 보고 하나하나 하다가 뭐가 문제인지 모르는 것이랑 더 쉽게 배울 수 있는 환경이랑의 차이일 뿐…

난 오히려 이런 거 보면 더더욱 확신이 든다. 절대 프로그래밍 언어는 길게 공부하면 안된다. 언어에서 지원하는 특수한 기술이나 프로그래밍 패러다임은 좀 공부해 둬야 하지만, 언어 자체에 대해서는 오래 걸릴 필요가 없는 것이다.

뭐, 그냥 잡소리다…ㅡㅅㅡ

가상화랑 경량 컨테이너 – 뭐든 좋지 ㅡㅂㅡ

요즘은 클라우드 환경에서 자신들의 서비스를 띄우는 곳들이 상당히 많다. 이들이 주로 띄우는 방식으로는 가상화를 통해 가상 머신을 띄우는 방식과 경량 컨테이너(일명 도커)를 띄우는 방식이 있다. 각각의 서로의 장단점이 있기 때문에 뭐가 더 좋다 안좋다를 따지고 싶지는 않다. 성능 차이로는 도커쪽이 덜 거치고 들어가는만큼 훨씬 가볍다는 결론이 난 지도 오래고…

가상 머신을 띄우는 곳의 경우라면, 가상머신을 띄워서 필요한 시스템을 그대로 옮겨가고자 할 것이다. 주로 오래된 레거시 서버를 그런 식으로 띄우는 경우가 많은 거 같다.

반면에 신규 개발 환경에서는 요즘은 도커를 이용하는 경우가 정말 많다. 컨테이너 기술 자체가 사실 개발환경 구성도 편한 데다가 어디나 잘 때려박고 돌리기도 편하고..

사실 어느 클라우드나 다 지원한다고 하는데….. 둘 다 지원이 잘 되는 건 애저밖에 못 본 거 같다. 얼마나 잘 지원해주는 클라우드가 나중에는 개발자들한테 사랑받는 클라우드 환경이 될 것이라는 것 하나만은 확실하게 짚고 넘어가고 싶다.

개소리 오브 개소리 – CS Fundamental, 자료구조, 알고리즘 깊이 몰라도 된다는 개소리

난 사실 OKKY 별로 안좋아한다. 옛날에 개발 공부할 때 대부분의 사람들이 하던 SI식 개발방법론을 많이 배웠던 곳이기도 해서 그런지 별로 좋지 않다. 회원들도 너무 폭이 넓어서 그런지 배울 게 많은 사람도 있는 반면에 배울 게 없는 사람들도 너무 많다.

근데 여기에 아주 폭탄 하나 떨궈놓은 글이 있다.

이런 거 떠들 수 있다는 거 자체는 그다지 좋은 게 아니다. 당사자들이 싸우거나 어이없게 논점 흐려지는 거랑은 전혀 다르게, 이런 걸 받아들일 주니어나 학생들 입장에서는 진짜 개판적인 사고를 심어준다. 결과적으로, 그 커뮤니티가 정체된다. 이런 이야기는 나중에 술마시고 적어야 하니 이쯤으로 하고…

저 글이 대체 뭐가 문제냐면, 고도의 추상화가 되고 있기 때문에 우리는 그것들을 쓰면서 구현을 하고, 그러면서 그에 해당하는 알고리즘을 익히고 한다는 것이다. 즉, [개발 경험이 풍부하다 = 고급 알고리즘을 알 수 있다]라는 개소리 오브 개소리다.

기술이 발전했으니까..? 그러면 그 기술을 발전시키는 사람들은 대체 어떤 곳에서 태어나는 것인지는 깊이 생각 안해보는 건가? 당연히 기본적인 CS 기본 지식들과 자료구조, 알고리즘을 엄청나게 학습한 상태에서 현재의 기술들에 문제점을 파악하고 그것을 발전시킨 사람들이다. 굳이 대학원이 아니어도 기업의 연구소, 국가 연구소, 개발 중 나온 신기술들 또한 그런 구조다. 구글이나 페이스북, MS, 애플은 뭐 그런 거 안하고 그냥 누가 만드는 수준으로만 대충 구현만 해서 기술 만드는 사람들인 줄 아나?

지금 당신들이 쓰는 컴퓨터의 메모리 관리 구조도, 멀티코어 관리 기술들도, 파일 시스템들도, 네트워크 기술도 죄다 기초적인 기술들이 모이고 모인 기술들이다. 그 중에서 그냥 제공되는 프레임워크와 API 쓸 줄 안다고 해서 그 안의 기술을 알 수 있다? 그리고는 게임 개발에 쓰이는 OpenGL이 20년전 유행기술이었지만 지금은 다른 기술들도 많다? 그들 또한 그 아에 있는 기본 기술들을 다른 식으로 응용한 거라는 건 모르겠나?

기술의 발전이라는 걸 무시하는 것이다. 특히나 특정 “계보”에 의해 진화된 기술들에 대해서 개무시하는 것이다. 선택받지 않은 기술은 다 죽은 기술인 것이다. 저들은 과거에 아이폰이 나왔을 때, 개발에 오브젝티브-C가 쓰였을 때에도 해당 언어 까기 바쁜 사람들이었다. 그리고는 C++로 할 수 있는 방법 없냐를 자주 물었다. (실제로 그런 사람들을 위한 책도 나왔었다.) 그러나, 다들 그냥 해당 언어를 빠르게 배워서 먼저 개발 싹 했고, 필요한 프레임워크나 기능들을 오브젝티브-C로 짜내기도 했다. 코드 연동 또한 잘 되는 편이라 기존부터 많이 이용되었던 알고리즘도 그대로 써보니 성능 잘 나와서 크게 바뀔고 할 것도 없던 것도 있고… 이런 응용의 모든 방식을 죄다 부정하는 것이나 마찬가지다.

이런 사람들이 주로 하는 소리는 여럿 있다. 수학 못해도 개발하는 데 지장 없다는 소리, 내가 해봐서 아는데 알고리즘 깊게 알 필요 없다는 소리 등등… 다 개소리 집합체다. 가뜩이나 그런 개소리 하는 사람 양성하는 곳들도 많은 상황에, 그것도 대학까지 거들고 있어서 병신소리 하는 마당에! 그냥 안드로이드 앱 개발, 윈도우 MFC 프로그래밍, 자바 어플리케이션 개발, 웹 개발 등 UI랑 엮인 응용 프로그램 개발자들이 저런 경우에 많이 빠진다. 저들은 그냥 오픈소스로 되어 있는 프레임워크 갖다가 쓰기만 하면 되니깐 별 생각을 안하게 된다. 그러다가 좀 더 접해보다보면 한정된 상황에서 어떻게 더 잘 할 수 있을까 아닐까를 고민할 때쯤에 저렇게 익힌 사람들은 “자원이 모자라요. 좀 더 좋은 하드웨어 쓰세요.” 같은 소리로 돈을 쓰는 개발을 하게 된다.

그럼 이제, 저들이 왜 저런 디자인 패턴, 코드 패턴 등에 저렇게 찬양을 하는 걸까? 실제로 보면 저런 거랑 아무 연도 없는 그런 개발을 하는 게 엄청나게 많은 사람들이?

“코드, 패턴 그리고 소프트웨어”를 읽어본 사람들은 알겠지만, 아니면 요즘 유행하는 클린 코드, 리펙토링, 디자인 패턴 등등에서도 말하는 것이지만, 언어론적인 이야기다. 설계 문제에 대한 이야기, 문제 해결법과 그 배경에 대한 이야기들, 그 해법 과정에서 생기는 협력 관계나 책임, 그리고 그로 인한 결과론… 즉, [프로그래밍 언어론 + 소프트웨어 엔지니어링]의 문제다. SI 개발을 하는 사람들한테는 저게 되게 중요한 문제가 된다. 구현만 잘 되는 입장에서는 그냥 남들이 봐도 문제 없는 코드, 남들도 다 잘 써먹을 수 있는 코드, 코드 제작에 있어서의 책임과 성과가 정확하게 나오는 구조가 좋은 구조이기 때문에 오히려 그쪽을 더 중요시 하는 것이다.

그리고 이런 건들은 일에 대한 내용이지 컴공의 이론과 관련된 내용과는 좀 많이 동떨어져 있다. (얼마나 이론적인 내용과 많이 떨어져 있으면 자신이 컴퓨터공학 대학원 박사과정이거나 석박 통합과정인데 어정쩡한 위치에서 쉽게 박사학위 논문 따고 싶으면 주제를 이쪽으로 하면 쉽게 딴다는 소문도 있다.) 그런고로 주로 관리자 입장에서 있던 사람들은 이런 이론에 빠삭한 사람들을 좋아한다. 이런 것이 이해되는 사람들이라는 것은 “이해가 되니 그대로 구현해라”라고 할 수 있는, 즉 앉아서 바로 일할 수 있는 사람인 것이다. 거기에 구조가 바뀌더라도 그 구조에 맞춰서 그대로 일만 할 수 있다면 그 사람이 일을 하던 다른 사람이 일을 하던 상관없는, 그런 환경에서 죻아한다.

마지막으로, 이런 환경이 아직도 정~~~말 많다. 대한민국의 SI 비율은 70% 이상은 된다고 한다.

그리고 그 정도 수준의 개발자들은 언제든지 만들어질 수 있고, 저연봉으로 일한다.

소수의 성공한 개발자가 되라고 말하는 게 아니다. 자신의 위치와 상황에 대해서 정확하게 알라는 것이다. 연봉 협상도 제대로 못해서 연봉 좀 더 올려달라고 하면 “너같은 수준의 개발자 많아”라면서 개찬밥 취급 당하거나 해고당하지 않는 것만으로도 다행이라고 생각하는 그런 하찮은 수준으로 앞으로를 살 것인가? 그렇게 있다가 신규 개발자들한테 안치이려고 그대로 “알고리즘 자료구조 그런 거 쓸모없어”라고 지껄일 껀가? 그리고 거기에 안주해서 모자란지식 있으면 “개발 못해요” 라고 할 것인가?

그냥 있는 API 갖다가 단순하게 뭐 만다는 건 일도 아닌 시대가 오는데… 아직도 이런 개소리가 나도는 게 참 한심하다. 그리고 거기에 동조하는 덧글들 또한… 그리고 이런 거에 놀아나는 대학들 또한 한심하다.

학생들이 착각하는 기준 – 채용공고 기준

이미 아는 이야기이고, 아마 취업 상담할 때 여러 곳에서도 많이 하는 이야기지만, 아까 글 적다보니 좀 해야 할 거 같다.

학생들의 경우에는 자꾸 어떤 기준을 만든다. 그 기준이 자격증으로 이어지기도 하고, 경진대회로 이어지기도 하고, 포트폴리오로 이어지기도 한다. 그 중에 제일 잘못 전달되어 가는 것이 있다.

“XXX 개발 경험자.”

뭐, 특정 기술에 대해서 경험자를 찾는다는 소식이 구인 공고에 보면 있다. 아니면 이런 글로도 적어놨다.

“안드로이드 앱 개발 경력 3년 이상”
“nodejs 개발 경험”

이럴 때, 학생들이 대부분이 여기에 맞추려고 “nodejs 써봤어요.” “안드로이드 앱 만들어봤어요.(근데 까보니 수준미달)” 이런 식으로 준비하고는 그냥 학점과 어학점수나 그런 것에 신경을 더 쓰는 걸 많이 봤다. 그리고 이걸 개발자 취업 설명회때도 예시라면서 그대로 이야기하는 곳이 있었다. 게다가 뭐 만들어 본 게 아니라, 스스로들 그냥 스터디 하면서 이런 저런 기능이 있더라로 외우는 친구들도 있는데, 현업에서 있는 사람들 뭐 새로운 기술 익히는 데 들어가는 시간은 아무리 오래 걸려도 2~3주다. (그 이상은 넘어갈래야 넘어 갈 수도 없다.)  학생들 수준으로 주에 1~2번 만나면서 느긋하게 진도 나가는 것 가지고 떠들어봤자란 것이다. 다 뽀록난다.

그리고 그에 대한 배경지식 쌓는다면서 일반인들 대충 이해하도록 만들어진 포스트나 블로그 글 보고는 그걸 쫙 외워서는 “나 이거 기술 알아요.”라고 떠드는 사람도 있는데, 이것도 다 뽀록난다. 원하는 게 그런 게 아니다. 진짜다.

하고싶은 결론은 학생들이 생각하는 사고는 시야가 엄청 좁기 때문에 절대로 그대로만 생각하면 안된다. 절대 좋지않다. 저 기준들은 “실제로 회사 업무에 써봤으며, 업무를 통해 사용해보면서 익힌 기술 및 특정 이상의 경험을 요구한다”는 것이지, 그냥 이력서상으로 좀 해봤다 할 정도의 몇 라인 추가하는 정도로는 전혀 쓸모 없다. 오히려 다 뽀록난다.

어디까지의 수준이나 내용을 맞춰놓고 공부하면 쉽게 한다. 그 습관이 들어서 이젠 그런 경계가 거의 없는 분야를 뛰어들려 하니 답이 없는 거다. 그러면 뭘 해야 하는지, 뭐 하나라도 해보던지 해서 조금씩 쌓아야 하는데, 그건 안한다. 그러니 뭐… 답은 정해졌다.

어디까지 공부해야 될까요?

학부생들한테 참 많이 듣는 질문이다. 아니면 취업 준비생들한텐도 엄청나게 많이 나오는 질문이 있다면 이거라고 당당하게 말할 수 있을 거 같다.

사실 현업에 계신 분들은 이 질문을 상당히 싫어하신다. 이와 유사한 질문으로는 “자격증은 뭘 따야 할까요?” “꼭 컴공 나와야지만 개발자 되나요?” 랑 같은 류의 질문이다. 정형화된 기준을 알고 싶어서 질문하는 것인데… 정형화된 기준 따윈 없는 게 개발자란 존재들이다.

개발자들은 흔히 평생 공부를 한다고 하는데, 맞는 말이다. 나도 그렇고, 내 앞 세대에서 개발했던 형님들도 지금도 여러 기술들 공부하면서 “아, 이건 이전에 이런 거랑 비슷한 개념이구나.” “오, 이건 또 다른데? 저기 쓰면 편하겠다”라는 식으로 계속 신기술을 접하고 계속 습득한다. 그렇게 하면서 자기 프로젝트에 필요한 것인지 아닌지를 파악한 다음에 그 기술을 이용한다.

근데 학생들은 반대로 행동한다. “이 프레임워크는 어떤 환경에서의 GUI 인터페이스를 만드는 거래” “이걸로 딥 러닝을 공부하니 이걸로 졸업하고 나서도 쓰겠지?” “안드로이드는 무조건 안드로이드 스튜디오에서 개발해야 한대.” “유니티가 게임 개발하기 쉽다고 하니 우리 유니티 공부하면 되는거지?” 이런 식이다. 진심으로 말하면, 되게 편협한 생각이다.

그렇기 때문에 이런 사람들이 개발자가 되면 개발이 힘들어진다. 단기적인 기술에 대해서는 이야기 하는 게 쉬운데, 정작 그 안에 들어가있는 프로젝트의 전체적인 구조라던가, 프로젝트를 위해 필요로 하는 최소한의 기술적 이해보다는 우선 아는 대로 뭐 할 수 있는지 없는지만 보고, 그게 만약 안된다면 거기에 맞는 환경 혹은 기술이 뭐가 있는지를 맞춰보는 데 급급해진다. 즉, 해결 방법에 대해서 상당히 좁은 시야를 가지게 된다. 프로젝트 완성을 할 수 있음에도 불구하고 못하는 상황도 발생한다.

개발자가 된다는 상태에서는, 기본적으로 뭐만 따로 꼬집어서 공부한다는 거 자체를 이야기 할 수 는 없다. 단, 최소한의 지식들은 컴공과에서 다 배웠을 것이다. 그리고 프로젝트를 하면서, 아니면 자기가 원하는 프로그램 뭐 하나 만들어본다면서 이것저것 익혔던 언어나 기술들까지 합쳐져서 뭔가 딱 보여줄 것이 있는, 마지막으로 그 보여줄 거 하나 만들어보겠다면서 이런 저런 생고생 했던 경험들. 이거면 된다고 본다.

p.s. 단, 대학원생들의 연구실 프로젝트는 될 수 잇으면 포함 안시키는 것으로 하겠다. 이건 별도로 이유를 적어주겠다.

다른 글에 대한 리퀘스트가 들어왔다.

요즘 하는 기술에 대해서도 글을 좀 써달라는 리퀘가 왔다.

쌓인 글도 많긴 한데….

몇 분 안되는 분이지만 블로그에 적힌 메일로 피드백을 주셔서 고맙다. ㅠㅠ

p.s. 워드프레스 닷컴은 덧글 시스템이 한국 사람들한텐 그닥 편리한 기능은 아닌듯.

“니가 한 번 영업 뛰어봐.”

아까 밥먹고 잠깐 잠이 들었었는데… 옛날 기억이 떠올랐다. ㅡㅅㅡ 이미 완성은 커녕 준비 단계도 진행 안된 말만 나온 기획 가지고 기능을 대충 막 넣고는 미리 브로슈어 만들고 영업맨들한테 죄다 들려줘서 밖에다가 홍보한다. 그리고는 실제로 사람들이 써보려고 앱 깔면 “왜 이 기능 없어요?” “아, 그건 지금 거의 다 만들어서 업뎃 준비중이에요.” 이라고 사기로 입 털고…

그러다가 문제 생겨서 일정 늦어지고, 영업쪽에서 개발팀에 욕 미친듯이 퍼붓기 시작하고, 그리고 개발 도중에 여러 문제 터지는 것까지 죄다 개발자들이 뒤집어 쓰는 탓에 서비스 되는 데까지는 이전 보다 더 걸렸다.

이걸 가지고 이제 죄다 개발자들이 욕먹고 피해 뒤집어 쓰고 해서 억울해서 한 소리 했었다. 그런 식으로 주먹구구식으로 일을 하냐고.. 그러고 나서 들었던 소리.

“니가 한 번 영업 뛰어봐.”

저런 거 없으면 안된다는 개소리였다. 근데…. 지금 보면 그때 그 삽질은 죄다 거품이었다. ㅡㅅㅡ 그때 잠깐 반짝이로 영업 실적 오르는 건 있지만, 그 외에는 약빨 금방 떨어진다. 그러면 또 다른 아이디어 내놓고…(반복)…(반복)…

근데 정작 저런 거 아니어도 영업 실적 무지 잘나오는 다른 영업팀이 있었다. 결국은 영업맨의 자질 문제…ㅡㅅㅡ

p.s. 써보니 진짜 잡소리네….