음 알고리즘을 정말 잘해야 프로그래밍을 잘하는 걸까요?

BrownBear의 이미지

저는 사실 뭐 프로그래밍을 정형화된 방법대로 공부한게 아니라 이것저것하면서 소위 말해서 "내가 좋아하는 분야"만 공부를 해왔고 집중적으로 파왔거든요.

그래서인지 문제풀이는 상당히 제가 약해요.

모 보안회사에 면접을 갔는데 사실 저는 이 회사에 면접보러 간 이유가 이 회사가 판매하고 있는 보안 솔루션에 대한 수십가지 취약점과 그걸 해결할 수 있는 방법을 제시하러 간것이거든요.

(사실 사전에 메일로 어떻게 하면 그 솔루션을 무력화 시킬 수 있고 어떻게 하면 방어할 수 있다 라는 코드와 방법을 제시를했는데, 그거 받고 면접보러 올라오라고 하더라구요)

근데 가자마자 프로그래밍으로 수학?문제를 시키더라구요. 뭐 strrev를 직접 구현해라, strcpy를 구현해라 등등의 뭐 제가 말하는건 이정도겠지만 나름대로의 정형화된 방법을 공부한 사람들만이 풀수있는 문제더라구요 (예로들어서 char A[3] = 123이 있고 이것을 int형으로 반환하는 문제, 뭐 나눗셈 등등?)

사실 그 문제 솔직히 말해서 힌트 안받고 하나도 못풀었는데 (힌트받고 2개) 면접이 끝나자 마자 하는말. 프로그래밍 실력이 없으시네요.

(그래놓고 나중에 PoC 있으면 달라, 원격으로 일해보고 결정해보지 않겠느냐. 못한다고 해놓고 왜 그런건 요구를 하는지 속이 들여다보이는데)

물론 정형화된 방법, 그런쪽은 하나도 못푼다고 자부?할 수 있습니다. 이건 정말 뭐 속일래도 속일 수가 없는 부분인데

저는 그 회사에 정형화된 방법, 그러한 수학문제로 보안 문제를 해결하려고 면접을 보러 간게 아니라 제가 몇년동안 쌓은 보안 노하우를 제공하려고 면접을 보러갔는데

면접보면서 계속 젤리나 야금야금거리고 문제푸는데 폰이나 들여다보고 면접관이 그렇게 하는데 아 물론 이 회사는 들어가자마자 마음에 안들었지만

정말 정형화된 방법으로 그러한 문제를 못푼다고해서 프로그래밍을 못하는 취급을 받는게 당연한건지, 그러한 문제를 반드시 풀어야 프로그래밍을 잘하는지

어떻게 생각하시는지요?

체스맨의 이미지

말씀하신 정도의 문제를 못 푸셨다면, 프로그램 구현을 못하시는 상태일 것 같고요.
지원 분야를 프로그래머로 하셨다면, 떨어지는 게 맞을 것 같네요.
지원 분야에 대해 고민해보시던가, 프로그래머를 하고 싶으시면, 프로그래밍 소양을 더 키우시는 게 맞겠지요.

면접관의 태도에 대해서는 글쎄요... 서로 대화하는 중에 폰을 만지작 거린 거면 문제가 있다 보고요.
문제를 푸는 동안 그런 거면, 문제 푸는 동안 면접관이 어떤 행동을 해주길 바라시나요?
빤히 쳐다보고 있으면 더 신경 쓰일 수도 있을 것 같은데요.

그리고 프로그래밍은 매우 복합적인 지식을 필요로 하기 때문에, 프로그래밍을 잘 한다라는 걸
알고리즘만으로 규정 지을 순 없겠지만, 알고리즘 비중이 큰 건 맞고요.

Orion Project : http://orionids.org

BrownBear의 이미지

보안 프로그래머로 지원해서갔거든요.

정형화된 , 문자열을 복사해서 무슨 공격을 방어하는것도 아니고

음 솔직히 저는 상대방에 대한 예의를 조금 갖추고갔다고 보는데 면접관은 면접하면서 젤리씹고 폰보고하더라구요

이래서 대기업 대기업하는구나 느꼈는데

체스맨의 이미지

보안 프로그래밍도, 모든 코드가 보안으로 가득차 있는 건 아니어서...
그리고 저 질문 내용을 보면 상당히 기본적인 걸 물었습니다.
면접관 입장에 프로그래머로서 채용하기는 좀 무리였다고 봅니다.

Orion Project : http://orionids.org

BrownBear의 이미지

제가 기본적으로 보안 침입 및 탐지를 중점으로 공부했거든요.

뭐 저런 내용은 어딜 검색하든 다 나오기때문에 사실 뭐 공부하지도 않았고 그렇긴한대

기본적으로 저런 기술?은 쓸필요도 없다고 생각되구요. 이미 구현되있는걸 뭣하러.

차라리 보안 프로그래머를 뽑으려면 저런것보다는 니가 우리 회사에와서 뭘 할줄 아느냐, 뭘 막을줄아느냐 이런게 묻는게 현실적이지

뭐 냅다 문자열 복사해라 변환해라. 쩝

물론 이건 그러한 공부를 안한상태에서 이것만 본다면 떨어지는게 맞는데

그래놓고 구현한 PoC나 방어코드 공격코드 이런건 왜 달라하는지 도저히 이해가 안되서 물어봅니다.

본인 입으로 실력없다 뭐 없다 해놓고 이것 보내달라 저것보내달라; 굳이 PoC 공격코드 보내줬는데도 불구하고 뭐 보내주면 검토해보겠다 원격으로 일 같이 얼마 해보고 검토해보겠다

솔직히 재정신인지 의문이 들기도하고...

체스맨의 이미지

면접 후 이상한 요구는 대응하지 마시고요. 다른 회사 알아보시는 게 좋을 것 같네요.

하지만 면접만 놓고 볼 때, 저 정도 질문을 했다면 그 쪽에선 프로그래머로서 기본 소양을 물어본 것으로 생각됩니다.
개발 경험이 어느정도 있다면 저 정도 문제는 효율성을 배제하고 적어도 답은 낼 수 있어야 합니다.
지금 너무 보안에만 치중해서 생각하시는데, 동료들과 협업하려면 기본적인 개발은 가능해야되지 않겠어요?

그리고 이미 구현된 함수가 있다해서, 유사 알고리즘을 구현할 일이 없을까요? 절대 그렇지 않습니다.

Orion Project : http://orionids.org

BrownBear의 이미지

직접 구현할 일도 있죠. 있기는한데 음 뭐랄까?

제가 진짜로 그냥 단순한 프로그래머로 면접을 보러갔다가 저런 소리를 들으면 이해를 하겠는데

그 회사에서 서비스하는 보안 솔루션에 대한 공격과 방어 PoC코드 중 공격 PoC코드를 제시하고 방어쪽은 코드없이 제공했거든요

영 필요가 없으면 오라고 하지 않을건데 무슨 미끼던지는것도 아니고 원룸대준다 전세대준다 하는 말부터 시작해서 면접볼때 무슨 아무말도안했는데 병역특례알아요? 묻고

딱 가자마자 회사가 그냥 원룸은 무슨 사택도 지원못해줄것처럼 보이더만

사실 이 회사가 게임회사에서 많이?쓰는 솔루션을 서비스하거든요. 솔루션 이름만 대도 다들 알건데

뭐.. 그래서 공무원 대기업 공기업 외치는걸 깨달았네요.

정말 근무 환경이 열악하다 못해 개판인것같고.. 그러한 회사가 비단 저기뿐인지 아니면 서울이라는 허울을 달고 그렇게 여러군데 있는지 저는 모르겠는데

사실 메일 보낼때도 나는 취약점 헌팅및 픽스 분야다 라고 말을했거든요.. 실제로 그 솔루션에 대한 헌팅 코드와 픽스 코드도 다 제작해서 가지고있기는한데

이게 이 회사의 솔루션에만 적용되는게 아니라 비슷한걸 만드는 다른 회사에도 전부 적용시킬수가있는데도 불구하고..

뭐 소양이 부족하다면 부족한채로 살아야죠..

문자열 복사하는 함수가지고 보안 설계할바에 printf 하나 가지고 오버플로우 일으켜서 서버하나 만드는게 낫겠습니다..

체스맨의 이미지

그래서 말씀 드린 게, 분야를 잘 못 설정하고 있는 것 같단 겁니다.
컨설팅 쪽에 가깝지 않을까 하는데요.

Orion Project : http://orionids.org

BrownBear의 이미지

확신이 들지 않았는데 이야기를 듣고 보니 드네요.

야심한밤에 덧글 감사하구요.

좋은 하루 되시길.

jw8704의 이미지

어이가없지만 현실적으로 그회사 면접관들하고 님이 맞지않았던듯싶네요..

면접관으로 어떤분들이 들어오셨었는지는 모르지만.. 모든 면접이그렇지는 않습니다.

아무래도 , 님과 인연이아니었었던듯싶구요..

그냥 , 지금 하시던대로 공부열심히 하시면서 다른곳에도 면접을 봐보세요..

무슨 보안프로그래머 뽑는데 , 씨언어 기본함수 구현하라고 하는진 저도 이해가안되네요..

그사람들보고 그러면 컴퓨터의 기본인 낸드게이트 오알게이트 , 플립플롭 지금 풀수있냐고 해보시지그러셨어요 ㅎㅎ

아니면 2차방정식하나주고 기울기 0 되는 지점 찾아보라고하던가.. 이것도 함수니까 ㅋㅋ

그사람들 못할겁니다.. 차라리 말이라도 그렇게하고나오시지..

BrownBear의 이미지

윗분이 하신말대로 완전 프로그래머 보다는 보안 컨설턴트에 가까운것 같네요.

처음에 메일을 주고 받고 보안 정보를 주고받다보니 내가 졸업전이고 부산이라 올라갈수가 없다, 재택근무도 생각해보고 있다 하니 집이나 사택 지원해주면 올 수 있겠냐,

면접비 15만원 줄태니 올라와라 해놓고

막상 가보니 진짜 근무 환경은 개판에... 이래서 공무원 공기업 대기업 하는구나 싶었습니다. 물론 안그런곳도 많겠지만 제같은 부산촌놈이 봤을때는 서울에 대한 로망? 이 있었는데 가보니 그냥 한마디로 "서울" 딱 한마디만 붙여놓고.. 그냥 세상 공부 시작부터 거하게 경험했네요.

나름 예의 갖춘다고 정장입고갔는데도 면접관은 기술 이사 라는 직함 단 사람 들어와서 면접을 보는데 헛개차에 젤리 몇개 들고들어와서 젤리 냐금 냐금 씹어먹으면서 이력서 뒤지고

문제 몇개 내주고 풀어라할때 폰을 그렇게 줄창나게 들여다보더만

솔직히 애초부터 프로그래머 뽑습니다 하고 오세요 하고 가서 이것도 못풀어요? 하고 말하면 저도 할말없습니다.

당연히 일반적으로 정형화된 프로그래머라면 그것을 풀 수 있는게 맞겠지만 저는 윈도우, 리눅스, 안드로이드 시스템 및 웹 환경에 대해서 어떤 부분으로 인해서 애플리케이션이나 프로토콜 부분에서 취약점이 발생하고 이를 공격할 수 있는 방법 및 방어, 설계법을 10년간 연구, 개발해서 제 노하우로 삼고있는것이고

또한 그 회사가 서비스하는 게임 보안 솔루션에 대한 취약점 공격법 및 방어법을 제시하러간거지 문자열 복사하는 사람으로 간 건 아닌데

이건 무슨 상대방을 물로보는것도 아니고

면접도중에 무슨 미끼던지듯이 병역특례알아요? 이러고

문제 풀고나서 이건 못풀겠다하니깐 뭐.. 사실 문제 나왔을때부터 이런 문제 풀러온게아니라 보안 컨설턴트로 온거다 라고 말을했어야됬는데

쩝.. 뭐 그러고나니 프로그래머로서의 자질이 떨어지네요 이래놓고 나중에 그냥 한번 이렇게 던져봤죠

방어 PoC 3개정도면 충분하겠습니까 하니깐 아 ... 3개..음.. 이러고 그것보다는 뭐 원격이나 도움이 될만한 코드를 보내주면 검토를 해본뒤에 연락을 주겠다

또 졸업전까지 같이 원격으로 일해보고 검토해보고 괜찮으면 연락을 주겠다

아니면 저번에 보내준 공격 PoC가 우리회사에 도움이 되는걸 검토해보고 연락을주겠다

이렇게 말하던데

솔직히 기술 이사 라는 직함달고있으면 그 간단한 공격 코드를 그걸 방어 코드로 쓸수도 있는것 조차 모르면서 무슨 검토를 하겠다는건지 이해도 되지않고

프로그래밍 실력이 떨어진다, 우리 회사에는 맞지 않겠다 라는 말까지 해놓고 왜 남의 코드에 탐을 내는지 이해도 되지않고..

부모님도 그냥 세상 경험했다..생각해라고 하시더라구요.. 그 말이 백번 맞는것같구요..

세상 참 남 등처먹으려는 사람도 많고..

차라리 그러면 애초부터 우리는 대학 컴공학과는 기본으로 나온 사람 뽑습니다. 문자열 복사로 보안 프로그래밍 합니다 이래놓으면 말을안하지..

공격 PoC 보내주고나니깐 면접비준다, 간이고 쓸개고 다 빼줄태니 와라 할 것처럼 이야기하더만

결국 사람 속 긁고 병역특례, 사택 등등의 미끼던져서 도전의식 만들게 해놓고 코드 뺴가려는 얕은수가 보이는데.. 쪽팔리지도 않는지 나원참..

jick의 이미지

면접관의 태도는 문제가 있는 것 같지만 그건 일단 논외로 하고, strcpy 함수를 구현 못한다는 건 "정형화된 방법"이 문제가 아니라 C와 포인터에 대해 기초적인 이해가 심히 부족하다는 이야기인데요...

나중에 진로를 뭘로 잡으시든지간에 이정도는 가볍게 할 수 있도록 기초실력을 다져놓는 것이 좋습니다. 안 그러면 IT업계에 있는 한 계속 커리어에서 발목을 잡히게 될 겁니다. (뭐 아예 C와 포인터를 볼 일이 없는 web frontend 같은 분야로 빠진다면 또 몰라도...)

BrownBear의 이미지

1 * 1000 + 2 * 100
같은문제는 못풀었네요
포인터류는 풉니다 이건 너무 밀접해서 안풀래도 안풀수가 없는 부분이고 사전 개발자 인터뷰에서 받은거라 이것가지고 꼬집지는 않는데 어디 가서 푸는 문제중에 정보올림피아드 경시대회에서 나올법한 문제가 있더라구요.. 이건 머 죽을때까지 저랑은 못풀어도 연관없지만..
제가 여기서 말하는 문자열 복사류는 정말 이걸 말하는게아니라 위와같은거네요
문서 인터뷰 문제로 이게나와서 그냥 일반적으로 하는소리지... 제가 포인터류 못풀정도면 쪽팔려서 올리지도않죠 ㅋㅋㅋ...

hxploit의 이미지

대다수의 "일반적인 회사" 에서 저 정도 문제는 충분히 물어볼 만 합니다.
지원하신 부분이 보안 솔루션 개발 같은 쪽이라면 저런 질문은 당연히 물어볼 수 있지만
아니라도 사실 물어봐도 문제 될 건 없는 부분입니다.
(물론 저는 보안 쪽이라면 굳이 그런 건 안 물어 봅니다.)

다만 흔히 정올이나 ACM-ICPC 등에 나오는 그런 류의 문제들 같은 경우는
글쓴 분이 아니더라도 일반적인 개발자 중에서도 못 푸는 사람이 태반인 것들입니다.
준비해 본 경험, 따로 공부해 본 경험이 없고 문제를 풀어보지도 않았다면 사실 못 풀죠.
대부분의 중소규모 회사에서는 그런 문제는 내지도 않습니다.

하지만 말씀하신 strrev strcpy 같은 건 솔직히 어느 분야라도 거의 기초 수준입니다.
윗 분도 얘기했지만 면접 담당자 입장에선 뽑는데에 주저할 수 밖에 없고요.

무엇보다 애초에 분야를 잘못 알고 가신게 아닌가 싶은데, 지금 말씀하시는 걸로 봐선
순수 솔루션 개발 업체에 지원하신거 같은데 지금 배우셨다는 분야는 컨설팅(모의해킹) 쪽으로 보입니다.
애초 방향 설정 자체가 잘못되었다면 뭐라 하실 필요도 없고, 제대로 맞는 곳에 지원하시면 됩니다.
면접관 태도나 PoC 요청 등은 별개의 문제니까 말할 필요가 없습니다.

그래서 제목에서 물어보신 "알고리즘을 잘해야 프로그래밍을 잘하는 건가요?" 라는 질문에 대해선
애초에 프로그래밍을 "잘한다" 라는 것 자체가 기준을 잡기 어렵기 때문에 답이 없습니다.
다만 지금 글쓴 분은 애초에 개발을 하려는 게 아니기 때문에 질문 자체가 의미가 없다고 보시면 됩니다.

여담이지만 지원하셨다는 곳이 I모사 아니면 W모사 인가요?
이쪽이면 모의해킹 인원을 뽑을 이유가 없습니다. 차라리 적합한 곳은 A3 나 NSHC 같은 곳이나
아니면 http://dailysecu.co.kr/news_view.php?article_id=12670 이런 쪽이죠.
글쓴 분이 이런 쪽의 제로데이 헌팅을 공부하신 건지는 잘 모르겠습니다만.

BrownBear의 이미지

정확히 말하자면 사전 답사에 문제가 4개 나왔어요. 3개는 다 풀었고 4번째 문제는 프로그래밍이라기보다 어떻게 풀것이냐 이런거였는데 다 적어서 갔고, 4번째는 strcpy 형식이라 직접 구현해보라는데서 구현해봤구요

제가 지금 C 포인터 이딴거나 해결못해서 글 올렸겠습니까

솔직히 C 포인터 구현못했는데 올리면 양심없는거구요

그냥 코드 두개 첨부합니다. 나머지는 첨부하지 않겠구요.

W모사입니다.

PoC보고 면접비 15만원 줄태니 올라오라 한건 W쪽이구요.

처음에 제가 직접 메일로 당신네 회사 솔루션에 이러이러한 방법으로 공격할 수 있고, 나는 이러이러한 방법으로 공격을 방어할 수 있다. 라고 말했더니 추상적이다, PoC를 보내달라 해서 공격과 방어에 쓰일 수 있는 코드 첨부했더니 저런소리 한거지

hxploit의 이미지

굳이 여기에 코드 올리실 필요는 없고요.

다만 한 가지 말씀드리고 싶은 건, 저도 이 쪽 분야를 오랫동안 해 오면서
많은 학생들을 봐왔고 어떻게 되는지도 봐와서 드리는 얘기입니다만
아실지 모르겠지만 어릴 때부터 해킹/보안 쪽을 혼자 공부해온 학생들의 경우
(물론 케바케지만) 상당히 자존심이 강하고, 좋게 말하면 자기 주장이 강합니다.
또한 어떤 일에 대해 문제를 자기 자신에게서 찾아보는 경우가 거의 없습니다.

이런 성향은 장기적으로 봤을 때 전혀 도움되지 않습니다.
지금까지 수 없이 봐와서 알지만 말 한다고 해서 들을 것도 아니고,
고칠 것도 아니니 제가 글 쓴 분에게 행동을 강요하지는 않겠지만
최소한 인터넷이라도 표현할 때는 신중하게 하시는 것을 권해드립니다.
회사에 대해 좋지 않은 감정을 갖고 쓰신 거니 그렇다고는 해도,
조금 마음을 가라앉히고 진중하게 글을 쓰시기 바랍니다.

이쪽 업계는 좁아서 이런 작은 글 하나로도 정보 공유가 다 됩니다.
그리고 원래 이런 류의 글은 한 쪽 얘기만 들어서 판단하면 안되는 것도 있고
글도 두루뭉술하게 쓰셔서 더더욱 알 수가 없습니다. 그래서 제가 판단하긴 어렵습니다.
그래서 다른 건 제쳐두고, 일단 글을 쓸 때 표현에 좀 더 신경써서 쓰시면 좋겠네요.

BrownBear의 이미지

아니 글쓴이분은 내가 문제가 있다고 말을하시는데

도대체 어디가 문제가 있으신건지?

내가 포인터를 못풀어서 욕을듣는건 뭐라안합니다. 포인터 이런 문제는 다 풀었고.

정보올림피아드 경시대회에 나오는급의 문제들만 못풀었는데

내가 윗분들한태 욕을했나 나 참 어이가 없어서.

업계 좁든 말든 그건 내 알바아니고 요점은

과연 저러한 경시대회급의 문제를 못푼다고 프로그래밍 못한다 잘한다 이걸 논할 가치가 되느냐, 이러한 취급을 받아야되느냐 이런걸 묻는거지 지금

내가 회사 욕을했나? 나는 지금 그러한 면접이 있었다 라고 사실을 이야기할 뿐인데 부풀린것도 아니요 축소시킨것도 아니요 그대로 본떠왔을뿐인데 뭐가 문제라는건지?

"또한 어떤 일에 대해 문제를 자기 자신에게서 찾아보는 경우가 거의 없습니다." -> 대리고 와보세요 그 분.

내가 문제가 있는것처럼 말하시네.

아니 그럼 댁은 면접볼때 젤리나 후드리챱챱 씹으면서 폰들여다보고 그래유?

hxploit의 이미지

뭐 보통 그렇게 반응합니다. 굳이 더 대응하진 않겠습니다.
원래는 이런 게 귀찮아서 이런 류의 글에는 댓글 안다는 편인데
괜히 달았네요.

BrownBear의 이미지

어잌후 너무 잘나신 분이 댓글달아주셔서

제가 감히 범접할 수가 없습니다. 이를 어쩝니까. 시간 버렸네요.

BrownBear의 이미지

(1) 메일로 채용 형태가 어떻게 되느냐 전송 (정규직 or 비정규직)
(2) 수신 : 여러가지 채용 형태가 있다. 도움이 될 만한 기술 내놔봐라.
(3) 이러이러한 것을 나는 보완해줄 수 있다.
(4) 너무 추상적이다. 상세 분석 보고서나 PoC 코드를 달라.
(5) 프로젝트 명 attack_vectors로 IAT Hooking, DLL Injection, Code Cave, Trampoline Hook 전송.
(6) 서비스 중인 게임에 대한 보안 솔루션 드라이버 우회 방법 및 내부 프토토콜 분석 취약점 전송 및 해결법 전송
(7) +재택 근무 가능하냐 전송
(8) 가능하다. 근데 왜 굳이 6개월로 근무 기간을 잡아놨냐. 언제 한번 올라올 수 있으면 이력서 회신해라.
(9) 6개월은 혹시나 모를 군 문제때문에 그렇다. 이력서 회신
(10) 다음주에 언제 면접볼 수 있느냐, 15만원 면접비 지원해주겠다. 그리고 사택 또는 전세등의 거주방법을 제공해주면 일할 수 있겠느냐
(11) 다음주 월요일날 보자. 개발자 사전 인터뷰, 이력서 회신. (정확히 사전 인터뷰 1번 들어온 버퍼만을 이용해서 문자열 뒤집어라, 2. 3번 루프 및 재귀함수, 4번 n개의 문자열이 들어있는 집합 S에서 X의 문자열을 카운팅 하는 방법을 적어라)
(12) 다음주 월요일 3시 와라.
(13) 간다 회신
(14) 갔다.
(15) 만났다. 시작부터 헛개수차 거하게 들이마시며 젤리 후드리챱챱 씹어대시더라.
(16) 뭐 기본적인 질문하고 병역특례아느냐 부터 시작해서 포인터 문제인지 뭔지도 모를 문제 화이트 보드에 적었다.
(17) 질문끝나고 정형화된 문제 주더라.
(18) 푸는 와중에도 휴대폰 들여다보면서 만끽중.
(19) 못품 -> 프로그래밍 실력이 없다. 일하기 힘들지 않겠느냐.
(20) 아니면 졸업하기 전까지 우리랑 같이 원격으로 일해보거나 코드를 달라. 도움이 된다면 검토해서 생각해보겠다.
(21) 넌지시 "방어 PoC 3개면 충분하겠느냐" -> 아... 뭐 3개 음 갯수가지고는 아니면 저번에 보내준 코드가 검토해보고 도움이 된다고 생각하면 연락주겠다.
(22) ㅃㅃ 간다.

아니 프로그래밍 실력 없는 "사람" 껄 왜 굳이 보거나 시간아깝게 졸업식전까지 원격으로 같이 일해보자고 제안도 하면서 아니면 다른 코드라도 보내봐라고 하는지?

뭐 난 표현 이런거 신경안쓰고 있는 일 그대로 옮겨서 왔으니 생각하는건 자유이시겠지만

원래 "면접"볼때 면접관이 앉아서 젤리 후드리 챱챱씹어대면서 폰을 보는지?

그리고 나는 이 질문에서 이런걸 물어보려고 올린게 아니라

과연 그러한 문제를 못 풀었다고해서 프로그래밍 실력이 없는것인가 아닌가를 따지고 있는거지.

내 태도? 내가 윗분들한태 욕을 한마디라도했나 도저히 이해가 되지 않는 말씀이신데

어디 잘못된점 지적좀 해보시쥬?

hsnks100의 이미지

어떤 분얀지는 모르겠는데 기본적으로 정형적으로 프로그래밍을 공부하든 안하든

strcpy 나 strrev 정도는 구현하는게 맞습니다.
C언어를 모른다쳐도 의사코드로나 ... 그것도 힘들면

플로우 차트로라도 해야하는게 맞습니다.

보안도 남의 코드 들여다 볼 때가 있고 기본적인 코드 인젝션이나 등등 할 때도 간단한 프로그래밍은 해야되고요.

말씀하신 strcpy strrev 는 문제 풀이축에도 못낍니다.

처음 프로그래밍 배우면 반복문 + 포인터 배우면 연습 예제삼아 만들어보는겁니다.

소위 알고리즘이라고 말하기도 힘든 레벨이고요. 제가 볼 땐, 면접관이 뽑기엔 무리였는 듯 싶습니다.

----------------------------------------------------
개인 블로그: https://kangssu.com

BrownBear의 이미지

아예 못하는걸로 알고계시는데

사전에 메일로 리스트로 구현한 DLL 및 코드 케이브 인젝터 소스코드 및 Ticketing Trampoline Hook 코드까지 사전 제작 및 첨부해서 보냈습니다.

PoC 코드보고 면접비 15만원 줄태니 와보라고 한건 저쪽이었고요.

*그건 다 구현했다하니깐요..

BrownBear의 이미지

그 문제 못푼다고 프로그래밍을 아예 못하는걸로 알고계시는데

strcpy strrev는 다 풉니다 푸는데 정확히 사전 답사 문서 4번째와 1번째가 그 문제였구여 2, 3은 루프 및 재귀함수

이건 다 풀었습니다.가서 물어보는 질문에서는 답못했구요. 나온 문제가 포인터가 아니라서 말하는거지. 이건 굳이 말할필요도 없는건데 쓸때없이 PoC보고 오라가라할까요

RNG니 Injector니 누구나 구현할 수 있고 널린코드라고 생각하실수도 있겠는데

누가 PoC 보낼때 저딴것만 보냅니까.

정말 포인터 못하면 올라가지도 않았죠.

C한다는 사람이 포인터 하나 못다루는게 말입니까?;

jick의 이미지

면접관에게 무례한 취급을 받은 게 열받아서 함께 회사를 욕해줄 분을 찾으시는 게 글을 쓴 목적이라면, 그냥 처음부터 그렇게 쓰셨으면 지금보다는 긍정적인 반응이 나왔을 것 같습니다만...

* 참고로 많은 회사에서 코딩만큼 중요하게 보는 능력이 문서작성 능력입니다. 아무리 똑똑한 사람이라도 자기 생각을 오해 없이 남에게 전달하지 못하면 같이 일하기 힘들거든요.

BrownBear의 이미지

그건 인정합니다.

문서 작성능력이 중요합니다.

근데요, 나는 회사 같이 욕해줄 사람이 필요해서 찾는게 아니라 프로그래밍을 잘한다 못한다를 구분짓는 기준을 물어보고 있는겁니다.

과연 저러한 문제를 못푼다고해서, 프로그래밍을 못하다는 기준이 되는건지, 그렇다고 저러한걸 잘푼다고해서 "프로그래밍을" 잘한다는 기준이 되는건지

회사욕은 저분들은 그 회사를 모르니깐 뭐 욕하실것도 없는데

중점적으로 그러한 기준이 되는걸 물어봤네요.

jw8704의 이미지

제생각은 프로그래밍 처음 공부할때야 C언어 300제 같은 교재를 많이 풀어보기때문에 , strcpy 류의 함수는 금방 구현합니다.
그렇지만.. 다른 좀더 큰 규모의 프로그래밍을 하다보면 strcpy 를 혹 직접 구현해야할때가 있지만, 그때 책이나 인터넷을 참조해서하지.. 직접 구현하지는 않다보니 그런쪽으로는 못할수도있다는 생각이드는데..

아무튼.. 그회사가 님하고 맞지않았다고생각하고

저는 컨설턴트나 보안프로그래머의 차이가 , 프로그래머는 솔루션을 제작하기때문에 처음부터 완성품이나올때까지 , 데코레이션 및 유저인터페이스 포함하는 부분까지 프로그래밍을 하는것이라 생각하고
컨설턴트는 일종의 모의해킹처럼 , 취약점을 찾아내고 그에대해 보완할수있는 방법을 제시하는것까지라 한정지어도된다고 생각하지만.

컨설턴트라고해서 프로그래밍을 할줄 모른다? 이렇게 생각하진않습니다. 단지 두 분야에서 일정기간이상 일한사람들의 경우 노하우의 차이가 많이날테고 그게 그분야의 실력이겠지만요.

그런데 그 잣대를 , strcpy 류의 함수로 테스트를 하는것은 좀..

차라리 오픈북이나, 오픈웹으로하고 좀더 생각해야하는 문제를 내는것이 더 적합할것같긴한데.. 세상을 자신에게 맞출순없으니..

그냥 회사가 님하고 맞지않았다고 생각하시고..

모의해킹/컨설팅 쪽으로 알아보시면 좋을것같네요...

그리고 코드는 님의 지적노력이 포함된건데 이렇게 공개된곳에 올리시면 님만 손해입니다.

그쪽회사에 코드주지마시고.. 여기올리신 코드도 지우세요..

자신의 지적노력이포함된건 노력해서 지키셔야합니다.

BrownBear의 이미지

저 두개는 어딜 검색해도 나오는 기술입니다.

뭐 똑같은 코드야 없겠지만 DLL Injector, TRNG 부류의 코드는 어딜가나 나오는 코드이구요..

C언어 300제라는 제목을 가진 책이 흔한가보네요. 오래전 사놨는데 필요할때만 보다보니 뭐...

조언 감사드리구요

쩝.. 100프로 맞는 사람 100프로 맞는 회사가 어디있겠습니까.

절이 싫으면 중이 떠나는것처럼 머 회사들어가고싶으면 맞춰야되겠죠..

컨설턴트라고해서 프로그래밍을 할 줄 모르는게 아니라 제가 아는 보안 컨설턴트는

프로그래머가 만든 프로그램 내지는 프로토콜을 알려면 프로그래머가 어떻게 설계를 했는지

프로그래머의 입장에서 생각을 해봐야 하기때문에 기본적으로 솔루션을 제작한 프로그래머보다 의뢰 분야에 대해 알면 많이 알지 적게

안다고는 생각이 안들구요.. 물론 분야는 있겠죠

네트워크 윈도우 리눅스 안드로이드 아이폰 등 다양하겠는데

주로 컨설턴트는 이제 회사나 설계자로부터 보안 취약점을 분석해달라, 의뢰를 받으면

취약점을 찾고 이러이러한 부분에 문제가 있다, 이걸 보완할 수 있는 방법은 이러이러한것이다.

뭐 이러한 문서만 단순히 제공하는 형태로 계약이 될 수도 있고, 직접 가서 보완을 해주는 방식으로 계약할 수도 있는데

제가 아직까지 그러한 일을 하고 있는건 아니니 말을 삼가겠습니다.

차라리 문자열을 복사해라, 머 이 수학같은 문제를 풀어라.. 이것보다는 니가 우리 회사에 온다면 뭘 할 수 있느냐, 여기서 한 가지라도 보여줄 수 있느냐 이게 가장 현실적인 질문같게 느껴지는데

그런 회사가 어디 흔합니까..

codewiz의 이미지

안녕하세요.

문제의 면접을 진행했던 면접관입니다.

우선 다른 모든 점에 앞서 면접을 보셨던 분께서 불쾌한 느낌을 가지셨다면 제가 잘못한 부분이 많이 있다고 생각합니다. 이 자리를 빌어서나마 죄송하다는 말씀 먼저 드립니다.

몇가지 내용, 사실이지만 뉘앙스가 잘못 전달된 부분들이 있는 것 같아서 변명 아닌 변명 차원에서 내용을 추가합니다.

1) 젤리
프로그래머 면접을 진행하는 경우 통상적으로 손코딩을 진행하고 있습니다. 이 부분에 대해서 긴장을 많이 하시는 분들의 경우에는 원래 실력이 있음에도 잘 풀지 못하는 경우가 많았습니다. 그래서 아이스브레이킹을 통해서 분위기를 좀 누그러뜨리고 진행하고 있습니다. 젤리도 그런 것 중의 하나인데요. 분위기를 좀 가볍게 만들기 위한 도구입니다. 면접자 분께도 똑같이 젤리와 음료를 제공해 주었습니다. 먹으면서 진행을해도 된다고 이야기를 하였구요.

2) 핸드폰
손코딩 문제를 풀거나 노트북을 이용해 코딩 문제를 푸는 경우 계속 빤히 쳐다보고 있으면 면접자가 당황하는 경우도 있고 긴장을 더 하는 경우가 많습니다. 천천히 생각하고 있는데 면접관이 오버해서 먼저 질문을 하는 경우도 마찬가지입니다. 그래서 서로 커뮤니케이션 없이 문제를 푸는 시간에는 책을 보기도 하고 핸드폰을 보기도 합니다. 당연한 이야기겠지만 면접자와 커뮤니케이션을 진행하는 중에 핸드폰을 보거나 하는 일은 없었습니다.

3) 알고리즘 경진대회 급의 문제
총 세개를 진행했습니다. 더 있었지만 면접 보시는 분께서 포기하셔서 거기까지만 진행했습니다. strcpy, atoi, itoa의 구현이었습니다. strpy의 경우 함수 원형을 모른다고 하셨고 그래서 그러면 복사하는 것을 그냥 만든다고 생각하고 제작해 보라고 했습니다. strdup를 구현했습니다. 도긴개긴이니 그러려니 하는데 NULL을 복사하지 않는 등의 문제가 있었지만 코드를 설명하는 과정에서 바로 잡았습니다.

이후에 이어진 문제가 atoi와 itoa였습니다. atoi의 최초 구현이 다음과 같았습니다.

int func(char *s)
{
return *((int *) s);
}

사실 여기서 조금 당황했습니다. 코드를 설명해 달라고 했습니다. 지우시더니 사실 알고리즘은 약하다는 이야기를 했습니다. 그래서 어떤 부분을 모르겠냐는 질문을 했습니다. 손코딩을 보는 이유가 실제로 구현을 할 수 있는지도 보지만 모르는 부분등에 대한 힌트를 얻었을 때 어떻게 사고를 전개해서 문제를 해결하는지 보려는 의도가 많습니다. 앞서 다과를 제공한 이유도 이런 과정을 부드럽게 진행하기 위함이었습니다. 어떤 부분을 모른다는 대답대신 컴퓨터로 직접 해봐야 풀 수 있을거 같다는 이야기를 했습니다. 그래서 이후는 노트북을 들고왔고 VIsual Studio로 직접 코딩을 진행했습니다.

한참이 지났습니다. 잘 안 된다고 모르겠다고 했습니다. 그래서 어떤걸 모르겠냐고 했습니다. 직접적인 이야기가 없어서 힌트를 주었습니다. 두 가진 힌트를 주었는데 한 문자를 숫자로 변환하는 법 '1' => 1과 123 = 1 * 100 + 2 * 10 + 3 * 1로 구성된다는 것이었습니다. 힌트를 듣고 해당 문제를 구현하였습니다.

이후 itoa를 진행했고 한참이 지났고 힌트가 없냐는 질문을 했습니다. 아까는 곱하기였으니 이번에는 나누기를 쓰면 되지 않을까라는 이야기를 해주었습니다. 해당 문제는 풀지 못했고 면접이 끝났습니다.

이 세 개의 문제를 바라보는 관점에 대해서 차이가 있었던 것 같은데요. 면접 보신 분께서는 알고리즘 경진대회 급의 문제라고 하셨는데 저는 기본적인 수준의 문제라고 생각했습니다. 그리고 기본적인 수준의 구현을 못한다면 더 복잡한 내용에 대해서는 어떻게 풀 수 있을까라는 생각을 했습니다. 위에서 인터넷에 검색해보면 금방 나온다는 이야기가 있습니다. 맞습니다. 바퀴를 굳이 새로 만들 필요는 없습니다. 다만 바퀴를 새로 만들 수 있으면서 기존의 것을 사용하는 것과 새로 만들 줄 몰라서 기존의 것을 사용하는 것에는 많은 차이가 있다는 생각입니다.

4) 면접을 보게 된 경위 및 제안
면접을 보기 전 위에 글에 나온 것과 같이 면접 보신 분이 자신이 의미 있다고 생각하는 내용들에 대해서 자료를 보내 주셨습니다. 안타깝지만 윗글에 나온 것처럼 그 내용이 상당히 인상적이어서 면접을 진행한 것은 아니었고 나이가 어린 친구가 관심과 열정이 있다고 판단되어서 면접을 진행했습니다. 면접 과정 중에 일반적인 지식 보다는 도메인 지식에 더 자신이 있다는 윗글에서와 비슷한 논조의 인상을 받았고 그래서 졸업하기 전까지 만약 유의미한 자료를 제공한다면 다시 고려를 해보겠다는 이야기를 했습니다. 당연히 제공할지 말지는 본인이 결정하는 것이고 제공하지 않겠다는 답변을 받았습니다.

여기에 대해서도 사안을 바라보는 관점 차이가 존재할 것 같은데요. 제 기본적인 생각은 남의 잔을 먼저 채워야 내 잔이 채워진다는 것입니다. 자본주의 기본 원리기도 하구요. 실력을 증명하는 것이 먼저라는 이야깁니다. 일반적인 면접 과정을 통과하거나 그게 아니라면 진짜 의미있는 자료를 생각해 날 수 있다는 것을 보여주는 것이 먼저라는 의미입니다.

5) 실력이 없다
제가 만약 면접을 토대로 면접자 분의 실력이 없다는 이야기를 했다면 잘못됐다고 생각합니다. 저는 그럴 자격도 없을 뿐더러 실력도 없습니다. 다만 제가 드린 워딩이 그런 논조가 아니라 저희 회사 채용 기준에는 부합하지 않는다는 이야기였습니다. 각 회사의 채용 기준은 저마다 다르기 마련입니다. 그런 저희만의 주관적인 기준에 부합하지 않는다는 이야기를 드린 것이지 면접자분의 실력이 객관적인 관점에서 없다는 이야기를 드린 부분은 아닙니다. 3-4시간의 짧은 시간을 가지고 누군가의 객관적인 실력을 검증한다는 것은 불가능하다고 생각합니다.

서두에 말씀드린 것처럼 면접자분께 죄송하다는 말씀을 다시 한 번 드리구요. 이 글을 통해서 오해가 조금이나마 풀렸으면 하는 마음입니다.

덧붙여 면접자 분께서 원래 하신 질문에 대해서 인생을 약간이나마 더 살아본 선배 입장에서 코멘트를 약간 달아본다면 이렇습니다.

실력이 있다, 없다는 사실 중요한 문제가 아닙니다. 세상의 많은 일들이 알고리즘 대회의 등수를 정하는 것과 같은 방식으로 진행되지는 않기 때문입니다. 알고리즘 경진 대회는 룰이 있고 누가 얼마나 빨리 많이 정확하게 푸느냐를 측정합니다. 대회가 끝나는 순간 1등이 있고, 꼴지도 정해집니다. 하지만 우리가 인생을 살면서 겪는 많은 일들은 그렇게 실력을 겨루고 순위를 메기는 방식으로 진행되지 않습니다. 예를들면 이런 겁니다. 존카맥(둠 개발자)와 리누스 토발즈(리눅스 개발자) 중에 누가 더 실력이 뛰어날까요? 정말 의미없는 질문입니다. 금방 대답하기도 쉽지 않지요. 그렇다면 의미 있는 것은 무엇일까요? 존 카맥은 둥이라는 게임을 만들어서 많은 사람이 재미있게 할 수 있게 만들었고, 리누스 토발즈는 리눅스라는 운영체제를 개발해서 많은 사람들에게 무료로 사용할 수 있도록 기여를 했다는 점입니다. 즉, 그들의 실력이 중요한 게 아니라 그들이 세상을 위해서 어떤 일을 했느냐가 중요하다는 이야깁니다.

앞으로 살면서 면접자 분에게 어떤 사람은 실력이 있다고 말할 것이고, 또 어떤 사람은 실력이 없다고 폄하할지도 모릅니다. 하지만 그런 것들은 크게 중요하지 않고 마음 쓸 일도 되지 않습니다. 중요한 것은 면접자 분의 실력이 아니라 알고 있는 지식을 이용해서 사람들이 좋아할만한 어떤 일을 했느냐로 결정되니까 말입니다.

그래서 앞으로는 면접자 분께서 내 실력은 100점일까? 80점일까? 를 고민하기 보다는 내가 알고 있는 지식을 이용해서 무엇을 해보면 의미 있을까를 고민하는 프로그래머가 되셨으면 하는 바램입니다. 건투를 빕니다 ^^;;

BrownBear의 이미지

직접 말을 달아주셨네요.

물론 제가 일반적인 프로그래머의 기준에 부합하지 않는다. 이것도 잘 알고 있습니다.

이것가지고 걸고 넘어져도 저는 할말이 없습니다. 정말로 일반적인 프로그래머의 기준에 부합하지 않거든요.

물론 말씀하셨던 것처럼 사과를 하셨지만,

제가 면접보러 간 입장에서는 곧 이제 사회 초년생이 되고 졸업하는 학생입니다. 물론 이건 그 회사에서 면접을 보는사람에게 맞춰줄 필요도, 양해를 구할 필요도 없다고 생각됩니다만

제 입장에서는 사실 상당히 불쾌?하게 느껴졌습니다. 기본적으로 면접을 한다면 그냥 질문을하고, 문제를 풀어라 하면 그렇게 하는걸 생각을했는데

책상을 사이에두고 앉아서 젤리를 냐금냐금 씹고 헛개차를 마시는 모습은 사실 속으로 제가 삐뚤어 졌다 이렇게 생각하실수도 있겠지만, 무시?하는 기분이 사실 살짝 들더군요.

더군다나 문제를 풀고 있는 도중 휴대폰을 지속적으로 들여다보는건 저에게는 "니는 풀어라 나는 휴대폰 보고 놀겠다" 이런 식의 뉘앙스를 풍기셨고

덤으로 메일로는 사택, 전세지원 그리고 면접할때는 병역특례같은 초년생이라면 솔깃?할 말들을 하셨습니다. 사실 뭐 이런 부분은 미끼?라고 느껴질수도 있는 부분이긴 한대

물론 이 부분에 대해서는 앞서 말씀하신 것처럼 사과를 하셨기에 더 이상 짚고 넘어가시지 않겠습니다.

저는 W사에 지원하게 된 이유가, 제가 일반적으로 저는 정형화된 식으로 프로그래밍을 배우지 않았습니다. 사실 그러한 부분에 있어서 너는 실력이 없다! 라고 말해도 할 말은 없습니다.

그런데 저는 그 회사에 strcpy, strrev, itoa, atoi 등의 문제를 풀러간게 아니라 제가 갈고 닦은 기술을 가지고 그 회사에 대해 뭘 해줄 수 있을까 라는 생각으로 간것입니다.

그래서 메일도 제가 회사의 솔루션에 대해 이러이러한 보완점을 제시 할 수 있다. 물론 그 메일에 대해서 추상적이라 말씀하셨지만 그렇게 말씀하셔도 할 말 없습니다.

저는 제가 가지고 있는 노하우라던지 이러한 부분을 코드나 문서로 제시하지 않고 "내가 솔루션에 대해 이러한 점을 제공할 수 있다" 이렇게 말한것뿐이지 코드를 제공한게 아니기 때문에 말입니다.

하지만 그 면접에서 제가 보여줄 수 있었던 것은 "너는 우리 회사에 입사한다면 뭘 해줄 수 있느냐, 니가 회사 발전에 대해 어떤점을 기여 할 수 있느냐"

이게 저에게 현실적인 질문이었으며 조금더 회사에 부합하는 면접인이 되었을지도 모릅니다. 물론 면접관분이 면접하러 온 상대에게 이런말을 할 필요도 없습니다. 그건 순전히 면접관의 마음이고, 제가 관여할 부분은 아니라고 생각됩니다.

물론 면접관분께서 우리 회사는 이정도는 할 줄 알아야 우리 회사에 들어와서 코드를 볼 자격이 있고 수정할 자격이 있다! 이렇게 말하셔도 할 말 없습니다.

애초부터 회사가 면접보러 오는 사람에게 맞춰야 하는것이 아니라, 면접인이 회사에게 맞춰야 되는것이라고 알고 있습니다.

물론 이 부분에 대해서 면접을 보러가는 사람으로서 저도 어느정도 부족했다 라고 생각을합니다.

뭐 개인적으로 마음속으로 쌓아두고 있는 부분이 있기는 해도, 직접 이렇게 말씀을 해주신것 보면 영 경우가 없는 분은 아니라고 생각됩니다.

제가 어느정도 오해한 부분도 있는것 같구요.

다시 한번 감사하다는 말씀드리고 싶구요, 물론 제가 그러한 쪽으로 실력이 안됬거니와, 인연이 안됬다고 생각하고, 사회 경험 배웠다고 생각하고 묻어가겠습니다.

codewiz의 이미지

사택, 전세 지원 관련해서 메일로 말씀 드렸고, 병역특례는 제가 면접 때 그 제도를 알고 있냐고 여쭤봤던 거구요. 저희 회사는 병역특례 업체가 아닙니다. 병역특례 업체에 지원하시는 게 더 유리할 것 같아서 드린 질문이었습니다. 대부분 제도 자체를 모르는 경우도 많아서요.

당연히 면접자 분을 채용한다고 판단을 했다면 사택을 제공해 드리던 전세를 지원해 드리던, 월세를 지원해 드리던 어떤 방법으로든 주거 문제를 해결해 드렸을 겁니다. 힘든 부분은 아니니까요. 저희 회사의 경우 공식적으로 전 직원 월세를 지원하고 있습니다. 월세를 살지 않는 경우에는 상응하는 비용을 복지비로 지급하고 있습니다. 지방에서 올라오시려면 주거 부분이 걸리실 것 같아서 말씀 드린 부분이구요. 미끼 용도로 쓰려고 했다면 지원되는 공식 복지를 전부 썼지 그것 하나만 썼을리가 있을까요? 부모님 여행 경비, 건강 검진 비용, 하계 휴가비, 개인 건강 검진 비용, 월세, 출퇴근 교통비, 중식, 석식 비용, 다과 제공 (음료, 과자, 아이스크림, 과일 등), 개인 도서 구매비, 개인 문화 생활비, 결혼 축하금, 출산 축하금, 법인 대리, 법인 택시, 법인 콘도, 5/10년 장기 근속 격려금 등 공식적으로 제공되는 복지를 다 썼겠지요 ㅠㅜ~

BrownBear의 이미지

그건 제가 회사에 채용되지 않아서 모르는 부분이구요

무쪼록 좋은 분 만나셔서 채용하기를 기원하겠습니다.

ifree의 이미지

아무리 보안 분야를 집중적으로 한다 해도 보편적인 지식과 능력은 가지고 있어야죠.
hxploit 님에 대한 댓글을 보니 인격적 소양도 부족한 듯 보이네요.
우선 자기 자신에 문제가 없는지부터 돌아 보시길 바랍니다.

BrownBear의 이미지

이건 또 어디서 굴러들어온 개뼈다귀인지

ifree의 이미지

글쓴이: BrownBear 작성 일시: 금, 2016/01/22 - 1:09오후

어잌후 너무 잘나신 분이 댓글달아주셔서

제가 감히 범접할 수가 없습니다. 이를 어쩝니까. 시간 버렸네요.

글쓴이: BrownBear 작성 일시: 토, 2016/01/23 - 4:54오후

이건 또 어디서 굴러들어온 개뼈다귀인지

BrownBear의 이미지

다른분이 단 글가지고 니 인격적 소양이 어쩌구 저쩌구

이것도 좋은건 아니라고 생각하는데요?^^

DarkSide의 이미지

여기는 일베가 아니니 언행에 조심하시기 바랍니다.
KLDP는 특히 프로그래머 사이에 검색에 잘 걸리는 곳이고, 이미 이력서로 신상이 드러나 있을텐데...
세상이 좁아요.

BrownBear의 이미지

세상이 좁든 크든, 이력서로 신상 드러났던 말던 그건 내 알바아니고.

여기서 일베가 왜 나옵니까?

jeff_an의 이미지

지원자 입장에서 불쾌할 수도 있겠네요 ㅋㅋ 근데 지원자도 너무 답정너아닌가요?
아니 뭐, 있는거 쓰면 되지요, 근데 있는거 써도 성능이 안나오면 스스로 구현해야하는 상황이 오고, 회사 입장에서는 스스로 구현해야할 능력이 필요할 때 어떻게 프로세싱 할 거냐 그걸 보는건데,
문제가 자기 마음에 안든다고 이런 글 쓰는게 참...
난 이만큼 공부했는데, 고작 이런걸 묻냐식과 못 풀어서 떨어진거에 자존심 상해하시는데, 이번 일을 계기로 알고리즘에 투자하세요.
CS 학부생이 알고리즘 괜히 배우는줄 아시나봐요.

이응준의 이미지

면접관이 젤리를 먹거나 문제를 푸는 동안 휴대폰을 보고 있었던 것은 아무 문제 없어보입니다.

왜 문제라고 생각하는지 잘 이해가 안되네요.

handrake의 이미지

그정도는 해야 되는게 맞습니다.

hogil123의 이미지

개발자 취준생입니다 .
해킹/보안에 관심이 많아 따로 공부했구요(쓸데없이 offensive쪽에 관심이 많음...)
개발, 서버보안, 취약점(리버싱이 선행되더군요)

그냥 저렇게만 놓고보니 풀스택이네요 ...(서버, db, 프로그래밍 전부 해봤으니 -_-;)
하지만 전부 살짝 맛뵈기만 해봤달까요 ?

취약점은 윈도우 위주로 공부했고, 리눅스는 워게임정도만 풀어보았구요.

조금 이해가 가지 않아 댓글남깁니다.

글쓴이분께선

"모 보안회사에 면접을 갔는데 사실 저는 이 회사에 면접보러 간 이유가 이 회사가 판매하고 있는 보안 솔루션에 대한 수십가지 취약점과 그걸 해결할 수 있는 방법을 제시하러 간것이거든요."

"사전에 메일로 리스트로 구현한 DLL 및 코드 케이브 인젝터 소스코드 및 Ticketing Trampoline Hook 코드까지 사전 제작 및 첨부해서 보냈습니다."

추측이지만.. 소위 나뭇잎 책이라는 곳에 전부 나와있는걸로 알고 있어요.
설마설마 하지만... 혹여나! 책 예제코드들만 그냥 좀 바꿔서 보내신걸까 싶기도 하고..
상용 제품에 injection 하셔서 Crashing 하신건지 궁금하기도 하네요.

또, 제가 알기론 윈7이상부턴 권한문제가 있어 인젝터의 경우도 좀 더 까탈스러운걸로 알고있습니다..
(직접 몇일 삽질한적있음..)
실제로 사용율이 높은 7이상 버전에서 하신건지도 궁금하구요,

보안 프로그래머도 개발자라는게...
저런 기초적인 알고리즘조차 구현 불가능하다면
프로그래머 지원자격이 없다 봐도 무방할거 같아요..
취약점이 간단하다면 모를까 얽혀있는 경우 설계부터 뒤집어 까야하는 경우도 많을진데...

보안 프로그래머로 지원을 하였고.. 상용 제품의 poc 구현까지 가능한데
왜 저정도 수준의 문제를 풀지 못하는건지 이해가 되지 않네요 ..
(제가 보안 프로그래머를 잘못 알고있는건가요 ?)

또, 저정도 구현이 불가한데 어떻게 poc 구현을 하신건지요..
궁금.. 아니면 제가 exploit 못하는 병에 걸린건지 ..ㅜㅜ
poc 방어코드 또한 알고리즘에 따라 오버헤드를 줄일 수 있으니
당연히 필요하다 보이긴 합니다..
(농담치레로 하는말이지만 3요소 아시잖아요 ~ 기밀성 무결성 가용성 ^^;
가용성 떨어지면 누가 쓰나요~)

밑에 댓글로 실제 면접관께서 적어두신 atoi 의 답은 살짝 컬쳐쇼크네요..
int func(char *s)
{
return *((int *) s);
}

진법변환 정도야 중고등수학 수준이고..
그렇게 있는거 가져다 쓸거면 itoa 같은 경우는 표준도 아니고
오히려 _snprintf 사용하면 더 간단하지 않을까요 ^^?;

"저는 사실 뭐 프로그래밍을 정형화된 방법대로 공부한게 아니라 이것저것하면서 소위 말해서 "내가 좋아하는 분야"만 공부를 해왔고 집중적으로 파왔거든요. 그래서인지 문제풀이는 상당히 제가 약해요."

좋아하는 분야를 공부했단 점이
저도 비슷한 케이스인것 같습니다만.. (위에 쓴듯이 쓸데없이 Offensive 에 관심이 많음..ㅜㅜ)
기초없이 기법만 익히신게 아닌가 싶구요 .

제 생각은 다른분들 말씀대로 보안 프로그래머보단 컨설팅이 더 적합하다 보여요...
(컨설팅도 만약이지만 어플리케이션만 하셨다면 말꺼내기가 좀 그러네요..)

기초적인 알고리즘 정도는 공부하시는게 많이 도움될 것 같구요 ..
알고스팟이나 프로젝트오일러 등.. 찾아보시고 문제 몇개 풀어보세요.
(솔직히 저정도 입사문제는 .. 문제도 아니얏 ㅠㅠㅠㅠ)

실제로 유명대기업 입사문제는
1에 1을 더하는 프로그램을 작성하세요. 이런 문제가 있어요. 것도 고효율....
(이건 아직도 아리까리하네요.. 차라리 제가 문제를 봤더라면 물어라도 봤을텐데)

댓글 잘 안쓰는데..
같은 보안 관련 계열 준비하시는것 같아서
글 보다가 이렇게 남기게 됬구요 .

같은 취준생으로써 화이팅 해요 ~

ps. 올림피아드 문제는 더 어렵지 않나요 ? 경험이 없어서 모르겠네요 ..

BrownBear의 이미지

(A)
책에 있는 예제들 살짝 살짝 바꿔서 보내는 행동은 정말 개념없는 짓이죠.

기본적으로 제가 회사쪽에 제시한 PoC 부분들은 그 회사에서 서비스 하고 있는 솔루션에 대한, 공격법에 대한 예시였습니다.

윈도우 비스타 이상의 운영체제에서 사용이 되는 Thread Injection 예제가 일부 포함되어 있었습니다. 물론 관리자 권한만 있으면 정상적으로 작동이 되었습니다.

뭐 아시겠지만 Session 0에 대한 프로세스는 일반적으로 CreateThread로 Injection되지 않는건 알고 계실거고 대중적으로 사용되는 윈도우 비스타 이상(7, 8, 8.1, 10)의 운영 체제에서 NtCreateThreadEx를 사용하여 작동하도록 예제가 구성되어 있었습니다.

codewiz분이 말씀하셨던 것처럼 이미 있는 바퀴를 만들 필요는 저는 없다고 생각합니다. 뭐 뒤에는 만들어야 할 필요성을 조금이나마 이야기 하고 계시지만, 저는 atoi라던지 strcpy, 뭐 기타 기본적인 함수들은 저는 사실 구현할 능력도 없고 구현해볼 생각도 없습니다.

필요한 부분은 그러한 함수의 사용법들이 나와있는 부분들만 찾아서 하면된다고 생각하거든요.

간단히 말해서 프로그램을 설계하는데 하나의 함수가 중요합니까 프로그램이 설계된 대로 작동하는게 중요합니까?

저는 프로그램을 설계한 대로 작동되도록 프로그래밍하는것을 배웠습니다. 많은 개발자들이 이 부분에 대해서 동의못할수도 있습니다. 기존에 있는 함수를 설계하지도 못하는데 어떻게 프로그램이 의도한대로 작동되도록 설계할 수 있느냐.

이 부분에 대해서는 저는 어떠한 함수가 그러한 역할을 하고 있는것을 알고있으며, 그러한 함수들을 결합시켜서 만들면 된다고 말하고 싶습니다.

말씀하셨던 것처럼 PoC의 방어부분 또한 어떻게 설계하느냐에 따라 오버헤드를 줄일 수 있다. 이 부분 역시 맞는 말씀입니다.

실시간으로 작동하는 프로그램에 올라가서 수 많은 데이터를 수집하고 분류하고 검사하는 작업에는 어떻게 설계하고 어떤 함수를 사용하느냐에 따라 성능은 천차만별입니다.

저는 제가 저 회사에서 서비스 하고 있는 솔루션에 대해 부족한 부분의 방어 PoC를 설계했을 때 성능에 대한 부분을 생각을 많이했습니다.

게임과 관련된 보안 프로그램일 경우, 이러한 부분을 신경써야 한다는것 또한 알고있습니다.

저의 프로그래밍 스타일을 간략하게 말씀하자면 이러한 결과를 도출하려면 이러한 함수들이 필요하고, 이러한 상황에 대해서는 이렇게 대체를 해야 한다.

저는 이러한것에 중점을 둬서 설계를 합니다.

(B)
예로 들자면 어떤 기업은 자동차를 만드는 회사입니다. 우리는 A라는 공장에서 바퀴를 주문시켜서 조립을 합니다. 우리는 B라는 공장에서 프레임을 주문해서 조립을 합니다. 하지만 우리 회사는 바퀴와 프레임을 당신이 직접 만들 수 없으면 당신은 이 회사에서 일을 할 수 있는 자격이 없습니다.

물론 저의 이러한 부분에 대해서는 그 회사와 저와 맞지않았다고 생각합니다.

그 회사가 추구하는 방향이 있을것이고, 그 회사가 원하는 인재가 있을것입니다.

단순하게, 그 회사에 대해서 제가 맞는 인재가 아니라고 생각합니다.

(C)
기초없이 기법을 익혔다고 말을 하고싶지는 않습니다.

이미 나돌아 다닌 기법, 책이나 인터넷에 있는 수 많은 사람들이 누구나 할 수 있고, 수 많은 사람들이 따라할 수 있는 기법가지고 저는 제가 "할 수 있다, 그러한 능력이 있다"라고 저는 말하지 않습니다.

언급하신 것처럼 저는 나뭇잎책을 통해(하나의 예시입니다.) 그 지식을 고스란히 습득한것이 아니라, 그 책을 통해 그 기법을 고스란히 받아들인것이 아닌, 새로운 기법을 연구한 사람입니다. 어떻게 보시던 그건 자기마음이겠지만

제 성격상 책에 있는 기법이나 내용 그대로 습득하자니 자존심이 용납하지 않고

솔직하게 말씀드리자면 책에 있는 예제만으로 나는 이런것을 할 수 있다? 이런건 쪽팔려서 어디가서 이야기도 못꺼냅니다. 그렇지 않은가요?

저는 strcpy, atoi등의 기초적인 함수들을 직접 구현할 수 없다 라고 말씀드릴 수 있습니다.

하지만 위와 같은 함수를 직접 구현 못한다고 해서 PoC를 작성할 수 있는 능력이 되지 않는다? 저는 이 부분에 동의하지 못하겠습니다. 그 함수가 어디에 사용되는지 알고, 구조적으로 어떻게 설계를 해야 그렇게 작동을 하는것을 아는데 설계 못할건 뭐가 있습니까?

바퀴를 직접 만들지 못한다고 해서 자동차 회사에서 바퀴를 끼우지 못할까요?

제가 여기서 말하고자 하는 "알고리즘"이란 정의를 잘못말하고 있는지 모르겠습니다.

저는 단순하게 말해서 기존에 존재하는 저런"류"의 함수들을 설계할 수 없다고 말하고 싶습니다. 하지만 그러한 함수들을 똑같이 설계를 하지 못한다고 해서 프로그래밍을 못하는 것이며, 과연 그렇다고 해서 어떠한 부분에 대한 설계를 할 수 있는 능력이 없는건지 를 묻고있는겁니다. 제가 알고리즘이라는 정의에 대한 이해를 다르게 알고있을 수도 있는거겠죠.

Ps.

상용 솔루션에 대한 취약점을 분석해보신 경험이 있다는 전제하에 말씀드리겠습니다.

말씀하신것처럼 취약점을 분석하려면 설계를 뒤집어봐야합니다. 원본 코드도 없고, 패키지에 대한 보안이 활성화되어있으면 말그대로 역공학이 힘들어지는건 알고계실겁니다.

저는 제 개인적인 분석 경험으로는 프로그래밍을 몰라서는 안된다, 이 부분은 확실합니다. 기본적으로 C언어, 어셈블리언어에 대한 지식은 있어야 하는거겠지요.

하지만 strcpy, atoi등의 함수들의 코드를 "모른다"고해서 그것이 분석이 어렵거나 쉽거나 하지는 않습니다.

리버싱은 개인적인 테크닉이라고 생각됩니다. 함수 하나하나에 대해서 어셈블리언어를 해독한다기 보다, 내가 그 개발자라면 어떻게 이러한 함수들을 설계를 했을까, 이것에 중점을 맞추는게 중요하다고 저는 생각합니다.

과연 그러한 부류의 함수 원본의 코드를 안다고해서 리버싱이 쉬워지며, 모른다고 해서 더 어려워질까요? 저는 아니라고 봅니다.

이 부분에 있어서는 개인적인 차이가 있겠지만.

*어디가서 저는 남들이 다 할수있는 Injection, Buffer Overflow, Race Condition 등의 기법가지고 나는 해킹을 할 수있는 사람이다, 나는 이러한것을 할 수 있는사람이다. 말하지 않습니다. 컴퓨터 책좀 들여다보면 죄다 할 수 있는것들 가지고 나는 보안 개발자다, 보안 컨설턴트다, 뭐 이런건 개인적으로 정말 쪽팔리는 일이라고 생각합니다.

*올림피아드 문제도 여러종류가 있는걸로 압니다. 기초적인 문제들은 위와 같은 논리?같은 문제겠지만 상위 문제들은 수학적인 부분의 해결을 위한 알고리즘 작성을 요구합니다.

hogil123의 이미지

댓글로 장황하게 말씀해 주셨는데..
좀 더 구체적,직설적으로 조금의 과장을 해서 다시 전달해드릴게요 .

atoi 나 itoa 같은 경우.. 아스키값이나 바이너리에 대한 이해가 있는지 판단하는 문제인데..
과장 안하고 컴공1학년 학부생들도 다 아는 개념입니다.

비슷한 예로 들어볼까요 ?
1 ~ x 까지 더하는 가우스 공식을 f(x) 라고 지정해봅시다.
근데 덧셈을 모르는데 f(x) 의 값이 뭔지 안다 라고 해서 그게 괜찮다 라고 통용될까요 ?

곱셉을 모르는데 팩토리얼의 결과값이 어떻게 나오는지 안다?
진로가 개발자 지망이시라면 진짜 심각한겁니다.

막말로 상용 프로그램의 분석까지 하시는분이 이런 기본적인 이해조차 없다는게 진실인지 의문이 들어요.

국내에서 알아주는 보안업체에 계신 선배님께서 저에게 해주신 말씀이 생각나네요.

"보안이란 키워드에 얽매이지 마세요."

딱 글쓴이 분에게 좀 와닿을 수 있다 생각하네요.
프로그래머와 보안 프로그래머가 각각 따로 존재하는게 아닙니다.
보안에 능통한 프로그래머가 있는거죠.

하지만 그 프로그래머는 어플리케이션 보안에 능통하다 라는것 뿐입니다.

물리학자 두명이 있네요.
한명은 양자역학이 전공이고, 한명은 열역학이 전공이네요.
그럼 이 둘은 물리학자가 아닌가요?

예제를 IT스럽게 바꿔볼까요 ?

서버보안담당자 라고 생각해봅시다.
서버보안만 책임진다고 서버에 대한 이해도가 부족하다(?)

서버관리자가 서버보안에 대해 깊게 알고 있는 것 뿐이지 카테고리가 나뉘는게 아닙니다.

막말로 따지고 들어가자면 보안 프로그래머라는건
프로그래머 중에 보안에 특화된 인재라는 것 뿐이에요.

더 나아가 보면
글쓴이분께서 생각하시는게 모의해킹에 좀 더 적합하다 보이지만
모의해킹 분야라고 해서 코딩을 하는일이 없을까요 ?
코딩도 당연히 해야하죠.

하지만... 그래요 당연히 말씀하신것처럼 내부 동작원리 모르고도 코딩이 가능해요.

근데 알고 쓰는것과 모르고 쓰는것과 차이가 굉장히 크다는거에요.

안그래도 프로그래머에 지원하셨는데 학부생보다 못하다면 회사입장에선 꺼려질만 하죠.

그럼 코딩을 주로 하지 않는 분석가들은 저런걸 모르고 있을까요 ?
분석도 하셨으니 당연히 잘 아시지 않나요 ?
어셈블리어에 대해서도 잘 아실터이고..

'1' 과 1 이 같은 값을 가지나요 ?

상용 소프트웨어에 대한 PoC 까지 제작하신분이 ..........

BOF 의 경우 또한 저런 기본적인 개념에서부터 시작 되잖아요.
뭐 스택이 어떻고 어떤 특징을 가졌으며 어떤 모양을 가지고 ... 궁시렁궁시렁

PoC 구현 시 무조건 DLL Injection 만이 답이던가요 ?
Injection 만 성공하면 바로 취약점에 대한 증명이 되던가요?
쉘코드를 전달할땐 어떤 방식을 이용할 수 있던가요 ?
아스키로 쉘코드를 전달 할 수 있을까요 ?

물론 개발자 지망생의 경우에 말씀드리는 겁니다만,
처음에도 말씀드렸지만 기초없이 기법에만 매달린듯 한 부분밖에 보이지 않아요..
학부생도 아는걸...

그리고 글쓴이분의 성향도 조금은 문제가 있을 수 있다 생각합니다.
이 사회생활이란게 혼자 하는게 아니다보니...

자기 주관이 뚜렷하신 분 같은데 좋게 볼때는 모르겠으나 멀리 볼때는 조금 겸손해지는 자세도 중요하다 생각됩니다 ^^;
물론 주관적인 생각일 뿐이니 그러려니 하고 넘어가주시고,

남의 의견도 수용할 줄 아는, 더 나아가서는 저 사람이 왜 저런 생각을 했는지 조차
생각을 해보시면 많이 도움이 될 것 같네요.

글 써놓고 보니 내 생각만 너무 주입하려는 꼰대(?) 같이 보이기도 합니다만...

너무 기분상하지 않으시고 봐주시면 좋겠네요.

이건 여담이지만 Major 7 이상부턴 Inction 시 CreateThread 는 불가하다 하셨는데.. RemoteCreateThread 말씀하셨다 생각하고 말씀드립니다.
결론만 말씀드리면 안되지 않습니다. 권한만 수정해주면 원격쓰레드 생성 가능합니다. ( 물론 관리자 권한으로 실행을 말하는게 아닙니다. )
NtCreateThreadEx 와 RemoteCreateThread 와 무슨 차이점이 있는지, 세션 경계에 대한 차이, 각각 프로세스 권한과 권한 따른 메모리 엑세스는 어떤 방식으로 이루어지는지
나중에 찾아보세요 ~

BrownBear의 이미지

CreateRemoteThread를 CreateThread로 적었네요. 수정합니다.

PoC를 단순히 Injection하나만으로 구현해놓고 PoC구현했다 이런식으로 받아들이시는것 같으신데, PoC를 Injection으로만 구현해놓고 나 이런거 할줄압니다.

정말 심각한겁니다.

A라는 회사에서 B라는 제품을 서비스중인데, 학부생이 위에 나열한것들만 할줄안다고해서 B라는 제품의 서비스에 대해 영향을 끼칠까요??

세상 살아가는 방법은 여러가지 입니다. 물론 사람도 그렇습니다.

단순히 그 방법을 모른다고해서 상위의 방법을 모른다는 이치 또한 존재하지 않습니다.

atoi itoa? 솔직히 말씀드리자면 이것을 똑같이 아무런 정보없이 구현못한다고해도 상관없다고 봅니다.

그것을 어디에 끼워맞춰서 사용하고 어떻게 쓰느냐 이것을 알면되지 그것을 똑같이 구현못한다고해서 저것을 이용한것을 만들지 못할거라고 보시나요???

바퀴를 직접 만들줄 아는것하고, 바퀴를 어디에 끼우는지 아는것하고, 조립된 바퀴를 어떻게 해체하는지 이 3개는 서로 몰라도 가능한거에요.

바퀴를 직접 만들지 못한다고해서 바퀴를 끼우지 못하며, 그렇다고해서 바퀴를 직접 해체하지 못하던가요??

*기분이 상하지는 않습니다. 물론 개인적으로 자기주장이 조금 강?하다 보니 글이 장황하게 보일수도 있습니다.
물론 저도 제가 어떠한 부분을 변화시켜야 하는지, 어떠한 부분을 통해 조금더 발전할 수 있는지 나름대로 생각을 하는데, 10년전을 생각해보면 확실히 계속 발전하고 있다는 느낌은 듭니다. 이런 충고 한마디 한마디가 저를 변화시키는 하나의 요인이겠지요.

--개인적인 경험으로는 상용화된 여러 제품과 관련되어 공격 부분과 방어하는 부분을 작성하는데는 별로 어려움이 없었습니다.

모르는 프로그래밍 지식이야 그때 그때 익히면 되는것이고, 사용하면 되는것이라고 저는 생각합니다.

물론 개발기간을 단축시키기 위해서, 어떠한 상황에서 최적의 방향을 제시하기 위해서 그러한것을 할 줄 알아야된다에는 동의하는 바입니다.

제가 이 글에서 처음 말하고자 했던건 회사 면접상황과, 더불어 itoa, atoi, strcpy, 등의 기존에 존재하는 함수들의 원형 설계를 못한다고해서 다른것도 설계를 못할까? 이러한 부분에 대해 질문을 던졌던것입니다.

정말로 학부생, 누구나 다 할줄아는것가지고 나 이런거 할줄압니다. 라고 말하는건 위에서 말씀드렸던 것처럼 정말 쪽?팔리는 일이라고 생각합니다.

제가 이 회사로 처음 방향을 잡았던것은, 이 회사가 상용화하고 있는 제품에 대한 공격, 그리고 그것에 대한 방어 방법을 제시, 설계하러 간것이지 itoa, atoi, strcpy, 남들이 다 할 수 있는 Injection등에 대한 기법이나 던지려고 간것은 아닙니다.

기초없이 기법에만 매달렸다면 상용화하고있는 제품에 대한 공격과 그에 대한 방어법조차 제시하지 못하겠지요.

누구나 다 할 수 있는 방법은 누구나 다 따라할 수 있고, 누구나 다 막을 수 있으니깐요.

*관리자 실행 권한이 아닌, Session 1의 프로세스는 Session 0의 프로세스에 대한 원격 스레드 생성이 불가능하다고 알고있습니다. 물론 다른 방법을 쓰면 가능하겠지만 이전의 운영체제 버전에 대한 "일반적인 방법"으로는 작동하지 않는다는걸 의미합니다.
(윈도우에서 서로 다른 세션에 있어서 어떠한 종류의 공유는 원칙적으로는 불가능하다고 알고있습니다.)

emptynote의 이미지


atoi 나 strcpy 의 경우

첫번째 c언어 초급 수준을 벗어났다는것을 보여줄 기회

두번째 버퍼 오버플로우 공격과 같은 고전적인 보안 이슈에도 폭 넓은 관심을 갖고 있는지 보여줄 기회

세번째 알려진 해법에 대한 내 생각과 더 나은 방향을 제시할 기회

BrownBear의 이미지

이미 알려진 버퍼오버플로우에 대해서는 관심없습니다.
strcpy등의 기본적인 C언어 함수등에 대한 버퍼오버플로우는 보안관련책자가 아닌 기본적인 프로그래밍책자에도 명시를 하는데 그걸 보여주고 말고할 기회가 뭐가있습니까??

그리고 그런 부분에 대해서 여기서 제시하고말고 할 부분이 아닌것 같은데요?

널리고 널린게 기회인데 기회가 뭐 한번만 있던가요??

jeff_an의 이미지

이건 뭐 자기 듣고 싶은것만 들으니... 참 답답하게 사시네.
회사 입장에서도 이득이겠네요, 서로 윈윈했다 치세요.

DarkSide의 이미지

정신 승리라고 하죠.

BrownBear의 이미지

말을 하려면 똑띠하셔야죠??

가 다르고 어 다르다고 말을 이따위로밖에 못하시나??

"야, 임마 그래도 니가 바퀴를 조립할줄아는건 아는데, 그래도 바퀴를 만들어봐야 더 자세하게 알 수 있지 않겠느냐?"하고

"이 어디 근본도 없는놈이 응? 바퀴를 만들지도못하면서 조립부터하려고해?" 이거하고 같은지??

이건 무슨 기술자들 곤조부리는 콘테스트도 아니고 말을 이따위로하시네 ㅋㅋㅋ

충고도 충고다워야지 받아들이는 입장에서 이건 머 근본도 없는놈이 바퀴 조립하고 자빠졌네 이렇게 들리는데 충고는 무슨 충고

hogil123의 이미지

바퀴에 대해 좀 더 상세한 개념이 있는지 물어보는겁니다.
당연히 조립하는 사람은 바퀴에 대한 자세한 정보가 필요 없죠.
바퀴의 인치수부터 휠모양 타이어두께에 대한 마찰력, 접지력에 따른 연비비례 등 역학에 대해 전문적으로 하는 사람이 있습니다.
또 거기에 들어가는 볼트, 너트를 설계하는 분들도 계시죠.

프로그래밍도 마찬가지로 알고리즘에 대한 전문적인 연구를 하는분들이 있습니다.

하지만 저 예시에서 말하는건 바퀴의 인치수가 크면 상대적인 힘이 덜들어간다, 접지력이 높아진다 같은 개념정도는 알고 있어야 된다는겁니다.

바퀴가 둥글다 정도는 유치원생도 알죠.
유치원생도 구글링하면 바퀴가 커지면 접지력이 높아진다 당연히 알 수 있습니다. ( 물론 접지력 같은 개념조차 없긴 하겠지만 )

바퀴가지고 돈버는 사람이(프로라고 하죠) 사람이 유치원생 만큼만 안다는게 어불성설이죠.

알고리즘을 만들라 하지 않습니다.

최소한 기초적인건 익히고 갑시다..

리버싱 얘기도 말씀하셨는데 그 사람이 어떻게 설계 했는가에 포커스를 맞춰 보는거 좋지요.
근데 라이브러리에도 없던 함수를 구현해서 사용했다면, 그 원리를 파악 할 수 있겠나요 ?
자꾸 atoi 얘기를 꺼내게 되네요. (아직도 넘 쇼크..)
'1' 과 1 이 어떤 차이점을 가지는지 어떻게 처리가 되는지 이해를 못했는데
atoi 의 함수 역할을 이해할 수 있겠어요 ?

반대로 생각해봐도 딱 보이는 결과네요 ..

hogil123의 이미지

말씀하신듯이 프로그래밍을 처음 접하는 입문자들이 보는 입문서에도 나오는 개념입니다.
그것조차 이해하지 못하고 있다는건 창피한줄 알아야 한다는 겁니다..

세션 경계에 따른 차이를 찾아보라 말씀드렸죠. 세션1 유저가 정말 "일반적인 방법"으로 세션0 의 프로세스에 쓰레드를 만들지 못할까요 ?
만약, 세션0 에 프로세스를 띄울 수 있다면 세션0 의 다른 프로세스에 쓰레드를 만들지 못할까요 ?
기법에서조차 벌써 깊이가 보여요... 다시 말씀드리지만 기법에만 매달리지 말고 기초를 다지세요.
기법은 나중에 자연스레 따라옵니다.

누구나 다 할줄 아는것 가지고 나 할줄안다 라고 자랑하는건 당연히 쪽팔린거지만,
누구나 다 할줄 아는걸 못한다는것도 쪽팔린겁니다...

기법에만 충실해봐야 나오는말은 "겉멋만 들었다" 라고도 표현합니다..

실제로도 현업에 계신 분들 중 기본적인 설계능력조차 없는 이해못할 정도의 '물경력' 의외로 많습니다.
(컴공 졸업생 신입이 for 문 조차 제대로 못쓰는 경우도 있다네요 ..)

뛰어난 개발자는 모두에게 인정받는 사람입니다.
구글링하면 나온다고 남들 다 할줄아는것도 모르는사람을 남들이 인정해줄까요?

욕심과 열정 많은건 좋지만 방향이 좀 틀어진 것 같다고 생각되네요.

뛰어난 사람이 되도록 노력하죠.

kanosi의 이미지

중간부터는 열심히 덧글 달아주시는 분들이 더 대단해 보이네요.

zzaratra의 이미지

와.. 간만에 왔다가 재밌는 글 읽게 되니 옛날 생각 나네요..

옛날에 제가 가장 자신감 있고 모르는 것 없다고 생각 할 때가 막 컴퓨터 배울 때였는데요.. 그때는 애들 컴도 고쳐주고 해킹이랍시고 학교 홈페이지 살짝 바꾸어 놓고 하면서 뿌듯해 했죠..

한 10년 넘게 회사일 하면서 알다 보니 자신감은 사라지고...

요즘 생각은 자신이 모른다는 것을 모르는 것이 앞으로 나아갈 수 있는 힘이라고 생각 합니다. 그치만 앞으로 계속 나아가다 보면 자신이 모른다는 것을 알게 되고

ㅋㅋ 여튼 그런 걸 다 떠나서 화이팅 하시길 바랍니다.

andysheep의 이미지


가끔 재미로 Python 했었는데 갑자기 무슨 바람이 불었는지 믿고 안정적으로 쓸만한 프로그램 짜야할 필요를 느껴서 알고리듬 책 세권, 학부 과정 공개 비디오 강의 받아 보고 있습니다.

컴퓨터 과학에서 알고리듬은 그동안 우수성이 검증된 자료구조들과 프로그램 분석, 개발 방법론의 집합으로 봅니다. 단순히 경시대회 문제 푸는 건 알고리듬으로 보질 않아요. 이런 거 많이 풀면 사고 능력은 당연히 올라가지만 학문으로서 가치는 아주 적습니다.

소프트웨어 분야에서 실력 있는 개발자나 전문가가 되려면 우선 기본 지식과 기술을 알아야 합니다. 유명한 알고리듬 책 한두권 내용 완전히 이해만 해도 충분합니다. 이런 책에 있는 연습 문제들 쉬운 건 한 시간 이내, 어려운 건 난이도에 따라 몇시간에서 몇일 걸립니다. 연습 문제 전부 푼다는 것 자체가 현실적으로는 불가능합니다. 수십명이 프로젝트 형태로 문제 해설집을 만들면 가능하겠네요.

라이브러리 함수 몇개, 몇 백개 사용할 줄 아는 건 알고리듬과는 거리가 멀어요. 보통 Java나 C++, Python 기본 라이브러리가 지원하는 정렬법이 quicksort 인데요. 처리 시간은 아래 예에든 merge 정렬과 같습니다. 데이타 갯수가 N일때 N*log2(N)입니다. insertion 정렬이 가장 느린 N*N 처리 시간인데, 이건 데이타 갯수가 10만건 이상 넘어가는 경우엔 쓸모없는 알고리듬이지요.

라이브러리가 지원하는 quicksort는 일반적인 경우를 가정해 만들어 놓은 것이니 특수한 경우에는 quicksort 대신 다른 정렬법을 써야 합니다. 다른 정렬법들이랑 처리 시간 계산법 아는 개발자는 어떻게 든 방법을 찾아 구현을 할 수 있겠지만, 라이브러리 사용법만 아는 개발자는 벽에 부딪힙니다.

조금 더 복잡한 코드를 쓴 merge 정렬이 insertion보다 데이타 수가 늘어날 수록 몇 만배까지 빨라집니다.

어떤 알고리듬의 처리 시간이 로그 함수를 따르면 데이타 갯수에 큰 변화가 없기 때문에 실제 응용프로그램에 쓸 수 있습니다. 왜 그런가를 알고리듬 책들이 2-3장에 걸쳐 설명합니다.

$ java-algs4 SortCompare Merge Insertion 100000 1
Merge sort: 0.122 seconds
Insertion sort: 29.828 seconds
Merge takes 0.1 seconds.
Insertion takes 29.8 seconds.
For 100000 random Doubles
 Merge is 244.5 times faster than Insertion
 
$ java-algs4 SortCompare Merge Insertion 1000000 1
Merge sort: 0.696 seconds
Insertion sort: 10951.789 seconds
Merge takes 0.7 seconds.
Insertion takes 10951.8 seconds.
For 1000000 random Doubles
 Merge is 15735.3 times faster than Insertion

붙임(merge) 정렬

import java.lang.reflect.Array;
import edu.princeton.cs.algs4.StdOut;
 
public class MergeSort<T extends Comparable<T>>
{
    private T[] a;
    private T[] aux;
 
    // MergeSort<Double> st = new MergeSort<Double>(Double.class, dd);
    public MergeSort(Class<T> cls, T[] a1)
    {
        this.a = a1;
        final T[] temp = (T[])Array.newInstance(cls, a1.length);
        this.aux = temp;
        sort(0, a.length-1);
    }
 
    public void merge(int lo, int mid, int hi)
    {
        int i = lo, j = mid+1;
 
        for (int k = lo; k <= hi; k++)  // Copy a[lo ... hi] to aux[lo ... hi].
            aux[k] = a[k];
 
        for (int k = lo; k <= hi; k++)
        {
            if (i > mid)
                a[k] = aux[j++];
            else if (j > hi)
                a[k] = aux[i++];
            else if (less(aux[j], aux[i]))
                a[k] = aux[j++];
            else
                a[k] = aux[i++];
        }
 
    }
 
   // Top-down 
    private void sort(int lo, int hi)
    {
        // Sort a[lo ... hi]
        if (hi <= lo) return;
        int mid = lo + (hi - lo)/2;
        sort(lo, mid);      // Sort left half.
        sort(mid+1, hi);    // Sort right half.
        merge(lo, mid, hi);
    }
 
    private boolean less(T v, T w)
    {
        return v.compareTo(w) < 0;
    }
 
    private void exch(int i, int j)
    {
        T t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}

import edu.princeton.cs.algs4.StdOut;
 
public class InsertionSort<T extends Comparable<T>>
{
    private T[] a;
 
    public InsertionSort(T[] a1)
    {
        this.a = a1;
        sort();
    }
 
    public void sort()
    {
        int N = a.length;
 
        for (int i = 1; i < N; i++)
        {
            // Insert a[i] among a[i-1], a[i-2], a[i-3], ...
            for (int j = i; j > 0 && less(a[j], a[j-1]); j--)
                exch(j, j-1);
        }
    }
 
    private boolean less(T v, T w)
    {
        return v.compareTo(w) < 0;
    }
 
    private void exch(int i, int j)
    {
        T t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}

Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne
http://algs4.cs.princeton.edu/code/

Devuan 1.0 (Debian without systemd)
amd64 station: AMD FX(tm)-6100 Six-Core Processor, 8 GB memory, 1 TB HDD
amd64 laptop: HP Touchsmart

글쇠판: 세벌 최종식, 콜맥 (Colemak)

세벌의 이미지

BrownBear님 이제 그만 하시죠?

계속하고 싶다면 님께서 시작한 글타래를 다른 분의 답변까지 처음부터 끝까지 잘 읽어보시고 다른 분의 글에 대응하셔요.

잘못하면 님의 이미지는 점점 나빠집니다.

BrownBear의 이미지

이미지 메이킹하신다고 고생하십니다.

jick의 이미지

(냉무)

woounnan의 이미지

회사에게는 공기업 대기업 수준을 요구하면서

정작 본인은 불리한 점에 있어서는
"제가 처음 서울 올라온 학생이라.."

그냥 내로남불 답정너 노답글인데
왜 이렇게 설명하려 애들 쓰신건가요 ㅋㅋ.

저 사람은 그냥
"너는 짱이고 저 회사가 못난거다"
이 한마디를 듣고싶은 겁니다.
어떤 설명도 필요없을 거에요ㅋ

우쭈쭈 해주세요.

wputer의 이미지

그분.. 잘 계시겠죠?...

tky7068의 이미지

참고되었습니다. 감사합니다. ^^