자연수
132
2017-06-15 20:22:58.0 작성 2017-06-15 21:24:09.0 수정됨
15
4012

요즘 논란이 되고 있는 알고리즘 및 자료구조의 학습에 대한 생각


안녕하세요. 요즘 알고리즘 및 자료구조 학습에 대한 화두가 떠오르고 있기에, 제 생각을 한 번 남겨 보고 싶단 생각이 들어서 이렇게 글을 쓰게 되었습니다.


현재의 화두는 "개발자라면, 알고리즘 및 자료구조 등의 일반적으로 컴퓨터공학과에서 배우는 과목들을 필수적으로 알고, 익혀야 하느냐?" 인 것으로 보입니다.


또한 현재 이 주제에 대하여 생산적인 토의가 진행되지 못하고, 논란만 되는 원인 중의 하나가 몇몇 분들이, 개발자가 하는 일의 영역을 국소적인 관점에서 바라봄으로 인해서 의견 충돌이 발생하게 된 것이 아닌가 싶습니다.

어느 분께서 "개발자들이 하는 일의 영역은 여러 계층으로 분리가 되어 있고, 각 계층마다 우선적으로 요구하는 기술의 영역이 다를 뿐이다"라고 몇번이나 명확하게 의견을 제시하였음에도 불구하고, 마치 "알고리즘 및 자료구조와 같은 로우 레벨 과목들은 중요하지 않다" 라고 왜곡 해석을 해서 받아 들이시는 몇 분들에 의해서 주제가 흐려지고, 감정소모적인 싸움으로까지 번진 것이 아닌가 싶습니다.


개발에는 다음과 같이 크게 여러 영역들이 존재합니다. (물론, 세부적으로 고려하면, 더 많은 영역들이 존재합니다.)


- 응용 프로그램 영역 (웹, 앱, 게임 콘텐츠 프로그래머 등)

- 엔진 영역 (네트워크, 물리, 그래픽, 사운드, 데이터베이스, 라이브러리 등)

- OS 및 커널 영역 (윈도우 API 설계, 윈도우 자원 관리 등)

- 임베디드 영역 (CPU, GPU, 등)


여기서 응용 프로그램을 제외한 영역들인 임베디드, OS, 엔진과 같은 영역들에서 작업을 하시는 분들은 아마도 컴퓨터공학과에서 일반적으로 배우는 지식들(자료구조, 알고리즘, 운영체제, 네트워크, 선형대수학, 등)을 자세히 알고 있으면 도움이 많이 될 것이라고 생각을 합니다. 왜냐하면, 이러한 영역들은 안정성을 요구함과 동시에 코드 한 줄 단위까지의 매우 극대화된 최적화를 요구하는 경우가 많기 때문입니다.

아마도 이 부분에 대해서는 이견이 많지 않을 것으로 예상됩니다.


하지만 응용 프로그램 영역의 경우에도, "학부 과정에서 배우는 자료구조 및 알고리즘 등의 로우 레벨 지식들을 자세하게 알아야 하느냐?" 에 대하여 의견이 분분한 것 같습니다.


제 생각은 다음과 같습니다.


분명 이 영역에서도, 학부에서 배우는 알고리즘 및 자료구조가 중요합니다. 하지만, 응용 프로그램 영역에서 일을 하시는 대부분의 개발자분들의 경우에는 자료구조 및 알고리즘의 세부적인 구현 사항을 숙지하기보다는 어떠한 것들이 있는지 머릿속에 전체적인 윤곽을 잡고, 어떤 상황에서 어떤 자료구조 및 알고리즘을 사용하면 좋을 지 판단할 수 있는 능력만 되어도 일단은 충분하다고 생각합니다. 


그리고, 세부적인 자료구조 및 알고리즘 또는 네트워크의 라우팅 원리를 먼저 습득하는 것보다는, 다음과 같은 기술을 먼저 깊이있게 공부하는 것이 프로젝트를 성공적으로 이끌어 가는 데 더 효율적이고, 견고한 응용 프로그램을 만들 수 있을 것이라고 생각합니다.


- 객체지향 패러다임 (OOP)

- 함수형 패러다임 (Functional Paradigm)

- 메시지 주도 개발 (Message Driven Development)

- 도메인 주도 설계 (Domain Driven Design)

- 디자인 패턴 (Design Patterns)

- 관점지향 프로그래밍 (AOP)

- CQRS

- 이벤트 소싱 (Event Sourcing)

- 마이크로서비스 (Microservices)

- 유닛 테스트 (Unit Testing)

- AWS 또는 Azure 클라우드 서비스

- 지속적 배포 (CI, CD)


이러한 것들을 취급하는 것을 마치 소위 '약팔이'로 칭하는 경우에 더하여, 많은 사람들이 좋은 프로그램을 만들기 위해서는 알고리즘 및 자료구조를 심도있게 학습을 해야만 발전을 한다는 잘못된 믿음의 확산에 의해서, 정작 응용 프로그램을 견고하게 만들기 위한 저러한 기술들에 대하여 깊이있게 접할 기회가 적어진 것은 아닌가 생각이 듭니다.


저도 나열된 기술들에 대하여 높은 관심도를 가지고는 있지만, 나열된 기술들만이라도 모두 제대로 이해하기에는 매우 많은 시간이 걸릴 것으로 예상됩니다. 한정된 시간을 가진 상황 속에서, 응용 프로그래머가 과연 저러한 기술들을 터부시하고, 자료구조 및 알고리즘만 깊게 파고 있으면, 들어가는 노력에 비해 얻어낼 수 있는 효율성이 얼마나 될 지 의심스럽습니다.


또한, "자료구조 및 알고리즘에 깊이가 없는 사람은, 규모가 큰 대형 시스템을 개발을 하게 되었을 때, 결국 한계에 부딪히게 될 것이다"라고 반박을 하실 수도 있겠습니다.

하지만 이에 대하여 예를 들어, 아마존 및 넷플릭스는 매우 거대한 시스템이라는 것은 모두가 인정을 하실 것입니다. 이러한 회사들은 마이크로서비스 및 위에 나열된 기술들을 중점적으로 잘 활용을 하여, 전체 시스템을 매우 안정적이고, 원활하게 운영을 하고 있습니다. 저러한 회사들이 단순 모놀리딕 시스템에 자료구조 및 알고리즘만을 잘 활용을 한다고 해서 서비스를 원활하게 운영을 할 수 있을까요? 저로서는 미지수입니다.


끝으로, 알고리즘 및 자료구조와 같은 컴퓨터 공학과에서 배우는 기본 과목들이 중요하지 않다는 주장이 아닙니다. 다만, 개발자들이 하는 일에는 여러 영역이 있으며, 그 영역에 따라서 먼저 우선순위로 되는 기술들이 존재한다는 사실입니다.

28
13
  • 댓글 15

  • fender
    9k
    2017-06-15 20:34:30.0

    응용프로그램 분야에서 배우면 유용한 내용들도 하나 같이 매우 적절한 주제들만 정리해주신 것 같습니다.

    좋은 글 추천 드립니다.


    1
  • 파머시티
    2017-06-15 20:46:06.0

    사실 그렇게 따지면 다 잘해야하는 것이 맞겠죠

    하지만 그것이 불가능하니

    알고리즘을 잘하는 사람도 필요하고

    응용프로그램쪽 지식이 해박한 사람도 필요한 거죠

    1
  • 망한개발자
    1k
    2017-06-15 21:16:41.0

    대형 프로젝트, 즉 복잡성이 굉장히 높은 문제를 해결하는데는 오히려 알고리즘 보다는 객체지향, 디자인 패턴, 도메인 주도 설계 같은 것들이 더 중요하다고 생각합니다.

    비유하자면 물론 정확하지는 않지만 터프하게..

    알고리즘은 고도의 검술이나 창술을 상징한다면

    객체지향, 디자인패턴, 도메인주도설계는 손자병법이나 오자병법 같은 느낌...

    2
  • kenu
    37k
    2017-06-15 21:23:42.0

    자연수 //

    너무 좋은 글이라 띄어쓰기 편집을 사이트 만들고, 처음 시도했습니다.

    죄송합니다.

    2
  • byeworld
    2k
    2017-06-15 21:28:25.0 작성 2017-06-15 21:28:58.0 수정됨

    아주 잘 써진 글이라 생각듭니다.

    제 개인적 생각과도 상당부분 일치합니다.


    ... 알고리즘 및 자료구조와 같은 컴퓨터 공학과에서 배우는 기본 과목들이 중요하지 않다는 주장이 아닙니다. 다만, 개발자들이 하는 일에는 여러 영역이 있으며, 그 영역에 따라서 먼저 우선순위로 되는 기술들이 존재한다는 사실입니다.


    좋은 글 잘 읽었습니다.

    2
  • 자연수
    132
    2017-06-15 22:13:24.0

    fender //

    감사합니다. :)


    파머시티 //

    맞습니다. 시간이라는 자원은 한정되어 있으므로, 무엇을 먼저 우선순위로 두고 학습을 할 것인지는 중요한 사항이라고 생각합니다.


    망한개발자 //

    멋진 비유이십니다. : )


    kenu //

    괜찮습니다. 오히려 신경써주셔서 제가 감사합니다. :)


    byeworld //

    감사합니다. :)

    0
  • 자연수
    132
    2017-06-15 22:19:46.0

    kenu //

    네. 맞습니다~ 신경을 써주셔서 정말로 감사드립니다. :D

    0
  • 땅콩버터
    137
    2017-06-16 08:27:39.0

    국비 과정을 듣고 있는데 공부의 방향성이 잡히는 글이네요. 좋은 글 감사합니다!

    1
  • kkey21a
    2k
    2017-06-16 09:22:54.0 작성 2017-06-16 09:24:05.0 수정됨

    우선 글을 참 잘 쓰시네요~ 


    학부에서 배우는 알고리즘 및 자료구조가 중요합니다. 하지만, 응용 프로그램 영역에서 일을 하시는 대부분의 개발자분들의 경우에는 자료구조 및 알고리즘의 세부적인 구현 사항을 숙지하기보다는 어떠한 것들이 있는지 머릿속에 전체적인 윤곽을 잡고, 어떤 상황에서 어떤 자료구조 및 알고리즘을 사용하면 좋을 지 판단할 수 있는 능력만 되어도 일단은 충분하다고 생각합니다. 

    제 개인적으로도 이 부분에서 동의는 하지만, 한편으로는 어떤 알고리즘 자체에 대한 윤곽만 잡고 있는 사람과 실제 그 알고리즘 내용을 조금 더 자세히 이해하고 섭렵한 사람과는 엄연히 차이가 날수밖에 없다고 생각하기도 합니다.

    단지, fender님 글에는 전제가 한정된 시간에 객체지향을 하는 주니어 개발자로 한정해 이야기했기 때문에 굳이 순수 알고리즘보다는 객체지향 프로그래밍에 대한 이해가 먼저 아닐까 하는 입장이었지만, 그 폭을 조금 확대한 일반적인 응용 프로그래머 입장이라면 역시 본인의 위치 혹은 역할에 따라 위 본문에 열거해 주신 몇몇 주제를 알고리즘보다 반드시 먼저 공부해야 한다는 의견과는 조금 다르긴 합니다.

    물론, 일반적인 개발자들이 본인 발전을 위해 위 언급해주신 다양한 주제들을 공부해야 한다는 의견에는 충분히 공감하지만, 이러한 주제들보다 실제로는 Database, File 작업을 더 많이 접하는 것도 사실이고, 또한 위 주제들은 선임 개발자분들의 통제하에도 할 수 있는 내용도 많다고 생각해서입니다.


    아무튼 태클로 봐주시지 마시고, 소수 의견 정도로 봐주시면 감사하겠습니다.

    1
  • 신입
    7k
    2017-06-16 10:37:33.0

    알고리즘은 안해도 된다고 봅니다.

    알고리즘으로 일을 하는 것이 아니라

    주어진 플랫폼안에서 하는 것인데


    또한 알고리즘은 회사에서 중요하게 보는 사항이 아닌 경우가 많습니다.


    제 직장도 그렇고

    이미 정형화된 무언가를 따라가는 경우가 많죠


    알고리즘을 분석하고 무엇이 빠르냐 속도나 안난다

    알고리즘 튜닝하자 이러는 곳이 아니라면


    그렇게 자세하게 몰라도 됩니다.


    알고리즘이 밥먹여주면 하면 되지요


    개발자 일을 하면서 개발공부를 하는 경우가

    발등에 불떨어진 경우가 많은 것같습니다.

    학부일때보다 실무적인 경험이 더 중요하게 되니

    학부에서 우선시 하는 것보다 실무에 집중하게 됩니다.


    무언가가 중요한 것은 회사에 따른 것입니다.

    1
  • 자연수
    132
    2017-06-16 14:05:39.0 작성 2017-06-16 14:06:02.0 수정됨

    kkey21a //

    네. 맞습니다. 응용프로그램 영역에 한정한다 하여도, 알고리즘 및 자료구조에 대하여 기반지식이 풍부하면 도움이 많이 되는 분야도 많이 있을 것입니다.

    가령, 대용량 실시간 모니터링툴을 개발한다든지, 매트랩과 같은 수학적 데이터 분석 프로그램을 개발한다든지 등의 경우에는 내부적으로 데이터를 최대한 효율적으로 관리 및 운용을 해야하기 때문에 알고리즘 및 자료구조에 대한 윤곽적인 이해뿐만 아니라, 깊이있는 이해를 요구할 것입니다.

    즉, 이러한 경우에는 알고리즘 및 자료구조에 대하여 해박한 사람과 그렇지 못한 사람과의 차이는 프로그램 설계상에 까지도 극명하게 차이가 나타날 것으로 생각합니다.


    네. 그리고, 시간적으로 우선순위를 두어서 꼭 특정한 것들을 먼저 습득을 하지는 않아도된다라는 의견에 대해서도 동의합니다. 당장 실무 환경에 처해있지 않는, 예를들어 시간적 여유가 많은 학생분들 같은 경우에는 꼭 무엇을 먼저 습득을 해야된다라기보다는 다방면으로 깊이에 상관없이 학습을 하는 것 또한 좋은 태도라고 생각합니다.

    그러다가, 스스로가 앞으로의 개발자로서 주력으로 가고싶은 영역이 무엇인지 판단되는 시점에서 부터는, 그 영역에 대하여 중요한 우선순위로 판단되는 기술들을 중점적으로 습득을 하는 것이 더 효율적일 것이라고 생각합니다.


    좋은 의견 감사합니다.  : )

    1
  • ee32321
    1k
    2017-06-16 15:50:12.0 작성 2017-06-16 15:56:48.0 수정됨

     

    일부분씩 알고 있던 내용이였지만, 여러 분야의 연결고리.. 흐름을 알 수 있어서,

    이 글을 통해 다시 한번 생각의 정리가 되네요.


    신입님께.

    신입님이 말하신 부분은 회사의 프로세스부분 같게도 생각됩니다.

    그 프로세스에 따라야한다. 그렇겠지만,

    한편으로, 신입님의 글을 읽으면서 기업 내, 이익집단 내의 프로세스로 인해,

    불필요한 소모적인 갈등이 발생하는 것도 생각이 나네요.

    제약은 필요하지만, 일이라면 인간적인 모습, 근로환경을 같이 생각해야할 것 같습니다.

    이 부분은 회사가 항상 조율하고, 생각해야하는 부분이라고 생각해봅니다.

    같이 일을 하기 위해서, 협력을 잘하기 위해서겠죠. 이런 생각이 나서, 글을 적어봅니다.


    댓글 적어봅니다.

    글을 봐주셔서 감사합니다.

    0
  • 신입
    7k
    2017-06-16 16:10:50.0

    ee32321

    어차피 회사에서 적응하면서

    오래있기 위해 무언가를 배우는 것이 크지않을까요?

    알고리즘이 그중에 포함되지않는다면 안해도 되는 것이고


    또한 그전에 회사의 프로세스가 잘 되야겠죠ㅎㅎ

    0
  • 박종복
    339
    2017-06-16 17:53:53.0

    개인적으로는 SI 개발에서는 요구분석을 잘하는 능력과 고객을 이해시키고 설득시키는 능력이 가장 중요하더군요.(개발자와 상관없는 얘기다 라고 하시면 할말이 없습니다만;;)

    요즘은 소프트웨어를 사용하는 분야가 너무 많다보니 경우에 따라서 필요한 능력의 비중이 틀려지는 것 같습니다.

    알골리즘에 대한 논쟁은 다른 능력에 비해서 알골리즘이 개발자 능력을 검증하기 쉬운 도구이기 때문이지 않을까 하는 생각을 해봅니다.

    잘해서 나쁠게 없지만 알고리즘 말고도 잘해야 하는게 너무 많은것 같습니다.

    0
  • 탁탁
    237
    2017-06-22 15:30:40.0

    좋은 글은 추천입니다. 매우 공감되네요.

    예를 들어 GIS 분야에서 최단경로를 구하여 지도에 표출해주는,

    수많은 노드에서 이동거리가 가장 짧은 노드링크를 구해야 하는데

    그런 알고리즘을 개발자가 직접 이해하고 개발하면 더할 나위 없이 좋겠지요..

    하지만 이미 다익스트라 알고리즘은 오픈소스로 많이 존재하고,

    공간정보 DBMS 에는 함수로 포함되어 있습니다.

    따라서 개발자는 알고리즘의 전반적인 내용과 사용법을 잘 숙지하고, 메뉴얼대로 구현하면 됩니다.

    "이런 기능 구현해야 한다면, 이런 최적의 알고리즘이 있다."

    정도의 알고리즘 지식을 보유하고 적용해도 나쁘지 않다고 생각합니다.

    그리고 더 나은 서비스를 위해 다른 고민을 해보는 것이 좋다고 생각하구요...


    낚시를 할때 어떻게 해야 물고기를 잘잡을 수 있을까를 고민하지만...

    릴의 내부 구조와 그 부품들의 역할을 이해하고 낚시를 하지 않는 것 처럼 말이죠.


    미리 알면 좋고, 빠르면 빠를수록 좋고, 정확하게 알면 좋은건 누구나 알지만..

    알고리즘은 필요하다고 느낄 때, 그때 습득해도 나쁘지 않은 것 같습니다.

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.