Monday, October 8, 2018

프로그래밍 언어를 잘 아는게 실력 향상에 도움이 되는가?

여러 커뮤니티 사이트와 네이버 까페 등을 가보면서 junior 레벨의 프로그래머가 항상 궁금해 하는 것들이 여럿 있다.
  • 제가 javascript를 열심히 공부하면 서버 개발하는데 도움이 될까요?
  • 제가 java로 네트워크 소켓 프로그래밍은 해봤는데 c#으로 하려면 어떻게 해야 하는 거죠?
  • java 공부를 열심히 하면 취업 할 때 도움 되나요?
  • angularjs를 이용해서 front-end 개발한지 2년 됐습니다. vue.js가 핫하다는데 배우면 이직할 때 도움 되겠죠?
뭔가 다들 중요한 포인트를 놓친 채 프로그래밍 언어 혹은 프레임워크에 의존적인 얘기들만 하고 있다. 더 이상한건 경력이 조금 되는 친구들도 뭔가 다른 영역에 도전하는 걸 많이 두려워 하고, 새로운 걸 도전해 보고 싶기는 한데 생각만 가득한 채 실천도 못한채로 질문을 하는 경우도 많이 있다.

결론 부터 말하면 어떤 특정 프로그래밍 언어나 특정 프레임워크에 의존적인 개발을 하다 보면, 기본적으로 자기가 개발이라는 걸 잘 못하고 있거나 잘 모르고 있다는 전제가 깔려 있을 떄 그런 생각이 들고 질문을 하게 된다. 그리고 이런 걸 질문할 수준이면 자신이 여태까지 개발을 제대로 하고 있었던 건지 되돌아 볼 필요가 있다고 본다.

질문을 하나하나 짚어보면서 분석해 보면

javascript 를 열심히 공부해서 서버를 개발하고 싶다.


우선 javascript를 먼저 배울게 아니라 서버가 하는 역할이 뭐고, 어떤 프로토콜을 써서, 어떤 데이터를 주고 받고, DB에서 데이터를 빠르고 효율적으로 가져와서, 어떤 유용한 결과를 request한 쪽에 줄 건지를 먼저 고민해야 하는게 서버를 개발하는 거라 얘기해 주고 싶다. 그런데 이게 중요하다고 얘기를 해 줘도 자꾸 javascript를 배워야 한다는 생각 먼저 한다. javascript로 된 서버 코드 예제를 분석하고 돌려보고 하면 자기도 서버를 개발할 수 있게 될거라 생각하는 것 같다. 그런데 그런 식으로 하면 처음엔 쉽고 빠르게 되는 것 같아 보여도 결국 내가 처음에 언급한 내용을 되짚어 보면서 구현을 하게 되어 있다. 프로그래밍 언어를 잘 아는게 개발을 잘 하는거라 착각하고 있는 것이다.

java로 네트워크 소켓 프로그래밍은 해봤는데 C#으로는 어떻게 하는 건지 잘 모르겠다.


이 친구는 첫번째 친구보다 더 심각한 상태이다. 최소한 네트워크 프로그래밍을 해야 하는 이유와 네트워크 프로그래밍을 통해 클라이언트와 서버가 뭘 하고 싶어 하는 건지 알고 있다면 프로그래밍 언어를 잘 알고 모르고가 크게 중요하지 않다. 다른 프로그래밍 언어를 경험 안해봐서 그런 것 뿐이지 사실 java나 c#이나 배워서 익히는 수준은 대동소이 하다. 자기가 여태까지 해 왔던 프로그래밍 언어는 익숙하니까 이게 전부인줄 알고 열심히 한건데, 세상에는 같은 동작을 하지만 다양한 다른 프로그래밍 언어로 네트워크 프로그래밍의 비지니스 로직을 구현할 수 있다는 사실을 알아야 한다. 마치 java+spring 프레임워크를 배우는 것 만이 개발자 최종 테크트리의 끝판왕이라 생각하고 다들 미친듯이 java만 한다면 그렇게 java와 spring 프레임워크에 익숙해 지다가 다른 언어 다른 프레임워크를 만나게 됐을 때 뭔가 해볼 생각을 하지 않는다. 그게 문제인 것이다. 다시 생각해 보라 그게 진짜 프로그래머의 모습인지를.

java 공부를 열심히 하면 취업할 때 도움이 되는지


이미 앞에서 설명해서 더 추가로 설명해 보자면, 특정 프로그래밍 언어가 더 취업이 잘 되고 안되고가 정해져 있다면 다들 그 프로그래밍 언어를 하는게 더 득이 되는지 경제학적으로 생각해 보면 된다. 모두 다 취업에 유리한 java만 배웠다고 하면 상대적으로 java를 할 줄 아는 사람이 많아지게 된다는 거고, 대체할 수 있는 프로그래머의 인력 풀도 시장에 많다는 뜻도 된다. "너 아니어도 할 사람은 많다" 라는 말을 들으면 가슴이 아프겠지만 실제로 수요가 그렇게 만들어져 있다면 거기에 탑승한게 잘한건지 아닌지 본인 스스로 판단 가능하다.
그런 시장의 수요가 극단적으로 일어나는 분야를 얘기해 보면 html, css 할 줄 아는 웹 퍼블리셔 분야다. 이 직군에 채용공고를 올리면 하루에 신입 이력서만 30개나 올라온다. 이틀이 지나면 50개가 찬다. 거짓말 아니고 진짜다. 그 중에 CS 전공자는 한명 있을까 말까다. 반대로 OpenCV, Machine Learning 분야에 Python, C++ 할 줄 아는 사람 채용 공고를 올리면 이것도 거짓말 안하고 2~3일에 이력서 1개 올라온다. 그것도 신입으로 올라오는데 그나마 다행인건 CS 전공자가 생각보다 좀 있다는 거 정도다. 상황이 어렇다 보니 취업성공패키지로 취업시켜 준다고 하고 따라하기식 반응형 웹사이트 만들기 몇 달 한거 가지고 취업하려고 하니 취업이 잘 될리가 없다. 남들이 잘 안하는 걸 해보라. 그러면 실력이 형편 없어도 당신을 모셔갈 회사가 있을 가능성이 높다.
또 어떤 기술을 택해서 뭔가 해 봐야 취업이 되는 건 사실이나, 그 기술이 중요한게 아니라 그 기술로 뭘 해봤냐가 더 중요하다는 사실을 잊지 말아야 할 것이다. 로그인 세션 관리, 결제 페이지 연동, 게시판 관리 등등 실제 비니지스 로직을 구현하고 만들어낸 결과물이 뭔지 그 경험을 통해 내가 성취한 업적이 뭔지를 잘 설명하는게 중요한데도 단순히 java라는 프로그래밍 언어를 잘 하면 취업 잘 되냐는 되도 않는 소리를 하면 맥이 빠지는게 사실이다.
또 취업을 하기 위해 java를 열심히 할게 아니라 취업을 하기 위해 java로 프로그래밍 하는 게 적성에 맞고 즐거운지 한번 되돌아 보자. 취업하고 나서 적응 못하고 적성에 안맞아서 괴로운것 보다 내가 정말 하고 싶은게 취업이었는지 IT 기술을 배우고 그걸 익히는게 즐거웠는지를. 이 생각이 들 때가 되면 내가 java라는 기술을 배우고 익혔던게 크게 의미가 없다. 당장 마음이 불안하여 취업을 하는게 목표인 사람들이 생각 못하는 건, 내가 이 직업을 가지고 일하게 되면 즐거울지 아닌지에 대한 것이다.

angularjs를 이용해서 front-end 개발한지 2년 됐습니다. vue.js가 핫하다는데 배우면 이직할 때 도움 되는지


이 친구도 여태까지 웹이라는 걸 잘 생각해보지 않고 회사에서 시키는 대로 열심히 일하다 보니 2년이라는 시간을 보낸 안타까운 케이스인 거다. 이 친구의 신입 시절은 아마 절대 그렇지 않았을 것이다. 회사에서 주어진 업무를 빨리 배우고 익히면 스스로 잘 하게 될거라는 생각에 그냥 열심히 했을 것이다. 심지어 angularjs를 잘 알고 할 줄 아는게 잘못된 점도 아니라는 것이다. vue.js도 사실 해보고 경험해 보면 다른 경험을 할 수 있으니 이직할 때 조금이라도 도움이 되는 건 사실이다. 그런데 프론트엔드라는 것이 angularjs던 vue.js던 뭘 더 잘해야 하느냐가 중요한게 아니다. 프레임워크를 잘 쓴다는게 쓰고 경험해 보면 아는 것이지만, 조금이라도 직관적으로 그리고 조금 편하게 개발해서 생산성이 얼마나 될 것인지, 나중에 수정 및 유지보수가 쉬운지 등등 프레임워크가 가져야 하는 본연의 기능을 잘 훈련하는 것 즉 방법적인 것에 불과하다는 것이다.
그러니까 웹 프론트엔드 개발을 하는데 중요한게 어떤 프레임워크를 잘 쓸줄 아느냐가 아니라 어떤 목적을 가진 사이트를 개발할 거고 거기에 맞게 뭘 적용해서 해야 하느냐가 더 중요하다는 얘기다. 그런데 이미 angularjs를 통해서 웹에 대한 이해 프론트엔드에 대한 이해가 충분히 잡혀 있다면 다른 유사한 프론트엔드 프레임워크가 추구하는 가치가 뭔지, 특징이 뭔지 정도는 찾아보면 알 수 있는 건데도, 또 배워야 한다는 생각을 한다는게 잘못됐다는 것이다. 심지어 언어도 javascript로 같은데도 말이다.
닭 잡는데 소잡는 칼 쓴다는 논어에 얘기도 있듯이 웹 프론트엔드가 하는게 뭔지 한번이라도 조금 더 생각해 보면 angularjs를 잘 쓰냐 vue.js를 잘 쓰냐가 크게 중요하지 않을 수 있다는 뜻이다. 오히려 이런 프레임워크를 쓰는 방법을 익히는 것 보다 각각의 프레임워크가 어떤 작업을 하는데 효과적이고 효율적인지 알아보고 적용할 수 있는 안목을 키우는게 더 중요하다. 그런 안목을 키우는 차원에서 토이 프로젝트로 이것 저것 실험적인걸 해보는 수준이면 크게 나쁘지 않으며, 거기서 다른 프론트엔드 프레임워크와의 차이점을 발견할 수준이면 더 없이 좋을 것이다.
다시 정리하자면 이직할 때 도움이 되는게 vue.js 쓰는 법을 아는게 중요한 것이 아니라 현재 써 왔던 angularjs와 어떤 차이점이 있고 내가 뭘 만드느냐에 따라 어떤 프레임워크를 선택하느냐의 기준을 얘기할 수 있으면 충분히 도움이 될 것이다.

결론


프로그래밍을 오래 하다 보면 점점 특정 프로그래밍 언어 의존적, 프레임워크 의존적, 더 나아가서는 툴 의존적인 경력이 쌓이게 된다. 그런데 그 기간이 길어지면 프로그래밍 능력, 생각하는 능력, 발전적인 능력이 쌓인다기 보다는 일하는 방법에 대한 훈련과 반복되는 익숙함에 시간을 보내게 되어 있다. 그리고 시간이 가면서 스스로 내가 잘 하는지 못하는지 불안해 지지만 쉽게 자신의 손에 익숙한 언어, 프레임워크, 툴을 버릴 자신이 없어진다. 물론 비지니스 로직 처리 하면서 시켜서 해야 하는 일 외에 더 좋은 방법에 대해 고민하고 구현하고 정리해 봤다면 프로그래밍 능력이 조금 좋아질 가능성이 높긴 한데, 대부분 회사 일 하느라 바쁘다 보니 생각은 있어도 실천하기가 쉽지가 않다. 이 상태에서 또 다른 프로그래밍 언어를 배우는게 프로그래밍 능력을 향상시키는 방법이 아님에도 불구하고 다른 프로그래밍 언어를 배우는 것이 나의 개발 커리어도 쌓고 실력이 향상될 것이라고 굳게 믿고 있다. 물론 방법을 어떻게 하느냐에 따라 실력을 쌓을 수 있냐 아니냐가 다를 수 있지만, 그냥 튜토리얼 실행해 보기 책 따라해보기 정도로 깔짝대는 수준으로는 어림없다는 것도 알아야 한다.

기술적으로 프로그래밍의 실체를 접한 친구들은 "실무 일을 열심히 하는 것" = "프로그래밍 실력 향상" 이라는 착각을 하는데, 왜 이런 문제가 발생하는지 진지하게 고민해 보도록 하자. 그리고 이 때가 되면 기술 적인 배움 보다는 조금 더 학문적인 수준에서 접근을 해야 할 필요가 있다. 학문적인 것이라 해서 논문을 쓸 수준의 연구를 하라는 뜻이 아니라 프로그래밍 이외의 것들에 대해 접해보고 생각할 시간을 가져야 한다는 뜻이다. 그렇게 해서 프로그래밍이라는게 어떤 것이고 그것을 통해 어떤 결과를 얻고 싶은 것이며 그 과정 중에 왜 이렇게 코드를 짜야 하는지에 대한 이해를 해야 할 때가 실력이 높아질 수 있는 때이다. 이제 프로그래밍이라는 행위를 왜 하는지, 소프트웨어가 추구하고자 하는 본질이 무엇인지를 조금 더 생각해보자. 여태까지 해 왔던 프로그래밍 언어 의존적, 프레임워크 의존적인 개발을 해 왔던 생각이 많이 달라질 것이다.

Tuesday, September 11, 2018

프로그래머가 되기 까지의 회고 (3) - 대학 입학 부터 군 입대 전까지

프로그래머가 되기 까지의 회고 (1) - 초등학교 시절
프로그래머가 되기 까지의 회고 (2) - 중고등학교 시절

----

그렇게 프로그래밍 하는 법을 기억은 하고 있지만 실제로 뭔가 해본 게 없는 체 대학에 입학하게 됐다.
진로 탐색을 하다 보니 컴퓨터공학과가 있다는 사실을 알았고, 게임 잡지나 컴퓨터 잡지를 둘러 봐도 프로그래밍을 하려면 컴퓨터공학과를 나와야 한다는 얘기를 접하다 보니 수능 점수에 맞춰서 컴퓨터공학과가 있는 대학으로 알아보고 진학하게 됐다.

사실은 프로그래밍 하는 거에는 크게 흥미가 있진 않았다. 초등학교때 학원 다니면서 배웠던 걸로 화면에 그림 그리고 적절한 로직을 짜면 되는 거 정도는 해봤기에 그런 것도 있었다. 사실 BASIC에서 짰던 허접한 게임 보다는 중고등학교 시절 열심히 그리고 재밌게 했던 화려한 그래픽의 컴퓨터 게임들을 실제로 만들 줄 아는 게임 프로그래머가 되어야 겠다는 생각을 해서 대학 진학을 한게 가장 큰 이유였다.

여러 학교에 지원했는데 최종적으로 한성대학교에 합격하게 됐고, 아빠 엄마도 나한테 과외 시켜준 적 한번 없고 학원도 제대로 보내주지도 못했는데 서울에 있는 4년제 대학교에 합격했다고 하니 좋아하셨던 것 같다. 난 이때 한성대학교가 서울에 있다는 사실을 처음 알았지만 학교 보다는 뭘 배우러 가냐를 더 비중을 뒀기에 학교 간판에 대해서는 신경쓰지는 않았다. 그러니까 좋은 학교를 먼저 선택한 후에 아무 과나 들어가는 친구들과 나는 목적의식이 다르고 내가 선택한 길이 옳다고 생각을 했다. 그리고 사실 수능 점수로만 따져서 갔다고 했을 때는 조금 더 좋은 학교에 갈 수도 있었다. 입학 후에도 동기들끼리 수능 점수 얘기할 때도 내가 과에서 수능 점수로만 Top5 안에 들었을 정도였으니까. 그때는 대학부심, 과부심 이런게 중요하다고 생각했고 조금 더 좋은 대학에 진학 못한게 아쉽다고 생각할 때도 있었는데, 지금 생각해 보면 조금 더 좋은 대학을 가는게 무슨 의미가 있고, 내가 남들보다 조금 더 잘나고 우위에 있다는 생각이 지금 다시 회고해 봐도 쓸데없는 생각이었다고 본다.

컴퓨터 공학과 라는 곳에 입학을 하다 보니 입학 전에 새 컴퓨터를 장만해야 공부할 수 있다고 엄마한테 얘기했다. 사실 중학교때 쓰던 286 PC는 초등학교 때 컴퓨터학원 다녔을 때 배운거 써먹고 공부하라고 사준 거였다면, 이번에 사준 컴퓨터는 정말로 대학에서 공부하는데 필요한 거라 목적성이 있어 얻게 된 컴퓨터였다. 6년간 잘 써왔던 286 PC에서 그 당시 인기 있던 586 PC로 업그레이드를 했고, 바로 그 PC에서 돌렸던 게임이 286 PC에서 돌렸던 것 보다 너무 잘 돌아서 좋았던 기억도 있다.

그렇게 대학에 가서 컴퓨터 공학과에서 배우는 과목들을 보니, 프로그래밍 수업은 C언어 배우는거 하나 정도였고 나머지는 다 이론적인 거나 수학 관련된 과목들이었다. 논리 회로, 공업 수학, Unix 시스템 이해, 선형 대수 등등의 과목이 있었는데, 수학은 고등학교때 잘 배웠던거 복습 반, 새롭게 배우는거 반 이정도였고 Unix라는 것도 처음 봐서 그때 까지 쓰던 DOS의 명령어들과 다른 것에 흥미가 있기도 했다.

<Unix console window 화면, 지금은 이런 화면으로 컴퓨터를 쓸 일이 거의 없지만 내가 처음에 BASIC으로 프로그래밍 했을 때만 하더라도 이런 화면으로만 썼었다. 지금도 Windows power shell로 unix나 linux system에 ssh로 접속하면 콘솔 화면으로 신나게(?) 컴퓨터를 사용할 수 있다. 문서 편집, 프로그래밍, 심지어 웹 브라우징 까지 모두 cmd로 가능하다!
출처: Unix wikipedia>

난 솔직히 같이 입학한 친구들 중에 프로그래밍에 대해 전혀 모르고 온 친구가 있다는 사실에 많이 놀랐다. 그러니까 나는 컴퓨터공학과에서 프로그래밍을 한다는 거 쯤은 알고 들어왔는데 동기들 중에는 컴퓨터 활용하는 법을 배우러 오는 곳이라고 잘못 이해한 친구도 있었고, 컴퓨터 타자 연습하는거 좋아해서 온 친구, 컴퓨터 조립하는 걸 좋아해서 들어온 친구, 컴퓨터라는 물건을 알고 있긴 했지만 한번도 써본 적도 없는 친구 등등 다양했다. 내가 그나마 조금 나은 케이스였던 것 같다고 그 당시 생각했지만 지금 생각해 보면 역시 부질없는 생각이었다.

가장 중요한 C언어 얘기를 해보면, 수업 시간에 코딩하고 실행하고 결과를 보는 실습을 하는데 그걸 따라가는 친구들이 몇 안됐었다. BASIC 아는 친구는 좀 있었는데, C는 나도 처음이었고 거의 대부분 C는 모른체 그렇게 수업을 들었다. 나도 변수, 반복문, 배열 까지는 BASIC과 큰 차이는 없어 보여 곧잘 따라하고 옆 자리 친구들에게 자랑도 했는데 지금 생각해 보니 그게 뭐 대단한거 했다고 자랑까지 했는지 조금은 부끄럽다.

게다가 C언어 말고 컴퓨터 쓰는 법 자체를 모르는 친구들이 꽤 되다 보니 그런 것도 옆에서 알려주면서 했던 기억이 난다. DOS와 Unix나 명령어는 다르지만 하려고 하는 목적은 같기에 교수님이 알려준 명령어를 잊지 않고 잘 기억했다가 실습시간만 되면 이것 저것 해보는게 재밌었고, 교수님이 뒤에서 지켜보다가 Unix 명령어를 막 쳐가면서 코딩도 하고 이것 저것 하는 모습을 보더니 눈썰미가 있는 학생이라면서 칭찬을 들었던 기억도 있다.

<Unix 실습 시간 외에는 Dos 환경에서 했기 때문에 프로그래밍은 Turbo C를 띄워서 했었다. 지금이야 워낙 IDE가 잘 되어 있어서 마음만 먹으면 얼마든지 쉽게 프로그래밍을 하고 배울 수 있다.
출처: turbo-c.soft32.com>

하지만 자랑질은 거기까지였고 역시나 포인터라는 이해하기 어려운 부분에 들어가면서 부터 그 후에 어떻게 코딩했는지 잘 모를 정도로 공부 안하고 포기했던 것 같다.

지금 대학생들은 안그러겠지만 나 때만 해도 공부하는데 집중한 친구들 보다는 놀고, 술마시고, 연애하는 걸로 입시 스트레스를 푸는 친구들이 많던 때였다. 나도 동아리 활동도 하고 과 친구들과 어울리고 하면서 술도 많이 마시고 많이 놀았었다. 얼마나 놀고 공부를 안했는지 학점 관리가 제대로 안될 지경이었고 F 학점도 있었다.

다시 기억해 봐도 대학 입학하고 첫 해에는 공부를 제대로 한 기억이 거의 없다. 그나마 있는 기억은 내가 남들보다 조금 더 많이 안다고 잘난척 한거 정도다. 결정적으로 그해 말 IMF 사태가 일어나면서 회사들이 줄줄이 부도 파산이 나고, 이제 회사 입사하려는 대학 졸업생 부터 20대 모든 남자들이 IMF 외환위기를 피해 모두 군대에 몰려 있다는 소식이 계속 들려왔다.

Thursday, August 30, 2018

성적 없는 성적표, 그리고 멘토링의 가치

지난 주 성적 없는 성적표라는 책을 읽었다.

성적 없는 성적표
성적 없는 성적표
『성적 없는 성적표』

『4차 산업혁명, 교육이 희망이다』를 펴낸 류태호 교수의 두 번째 저서다. 이전 저서가 4차 산업혁명 시대의 교육을 개괄한 개론이었다면, 『성적 없는 성적표』는 그 연장선에서 역량 중심 교육을 깊이 파고드는 일종의 각론이다. 저자는 먼저 역량 중심 성적표 도입을 준비하는 미국 교육계의 최근 동향을 자세히 설명한다. 그러고는 공교육 시스템의 기원과 미래 교육의 방향을 소개하면서 역량 중심 교육이 전개될 수밖에 없는 이유를 제시한다. 마지막으로 최신 기술을 활용한 교육 플랫폼, 빅데이터에 기반한...
Yes24 출처의 책 이미지와 내용은 위 부분을 참고하면 된다.

내가 지금부터 얘기 하려는 건 이 책에서 언급한 중요 내용이 내가 멘토링 활동을 하고 있는 가치와 일치한다는 점이다.

이 책의 내용은 4차 산업혁명에 대한 얘기와 그에 맞게 교육이 이루어 지려면 역량 중심의 교육이 이루어져야 한다는 주장이 주를 이룬다. 사실 이 책을 읽기 전에 같은 저자의 책 <4차 산업혁명, 교육이 희망이다>를 보고 개요를 파악해야 한다. 물론 나도 이 책을 먼저 읽은 후에 성적 없는 성적표를 읽었다.

여기서 언급하는 역량 중심 교육이 이루어 지려면 여섯 가지의 핵심 내용이 이루어져야 한다는 얘기를 하는데, 사실 책 읽다가 내가 하고 있는 활동의 가치와 너무 부합해서 놀라웠다.

게다가 나도 기존의 교육 방식 말고 프로그래머가 되려는 후배들에게 어떻게 하면 도움이 될 수 있을까를 몇 년 간 시행착오를 겪으며 활동을 해 왔다. 그리고 지금 하는 멘토링 과정에 이르러서야 뭔가 제대로 된 걸 하고 있다는 생각이 들었는데, 그 내용이 류태호 교수의 책에 고스란히 담겨져 있어서 사실 내가 제대로 하고 있구나 하는 느낌이 많이 든 건 사실이다.

역량 중심 교육 여섯 가지 핵심 내용

  • 학습자 중심
  • 과정 위주 평가
  • 수업의 개인화
  • 학습 시간의 자율화
  • 역량 평가의 공정성
  • 연속적인 역량 관리
여기서 역량 평가의 공정성을 제외한 다섯 가지 항목이 내가 하고 있는 멘토링 과정과 맞기에 그 내용을 내 멘토링 소개 페이지에도 업데이트를 했다.


자세한 내용은 위 링크 페이지에 적었기 때문에 한번 보면 좋을 것이다.

어쨌든 이 책을 읽고 느낀 바가 있어, 지금 하고 있는 활동을 꾸준히 그리고 부지런히 할 계획이다.