Galty
30
2019-12-11 04:15:23
17
6619

수학, 알고리즘, CS 지식이 프로그래머, 개발자에게 꼭 필요한가요?



아주 진부한 질문이라는 것은 알고 있습니다.

그런데.. 워낙 의견이 팽팽하게 대립하는 것 같아 해당 주제에 대해 말하는 여러 게시글을 봐도

더 갈피를 못잡겠다는 생각이 듭니다..


알고리즘이 문제의 해결법을 총칭하는 단어라는 것은 알고있습니다.

개발이나 프로그래밍에 있어 문제 해결력이 얼마나 중요한지 알고 있기 때문에

알고리즘 자체의 필요성을 의심하는 것은 아닙니다.


CS Fundamental, 심화적인 알고리즘과 자료구조의 필요성에 대한 의문입니다.

제가 배우는 단계인 학생이기 때문에 식견이 좁아 이런 필요성을 이해하지 못하는 것일수도 있겠지만


최근 이런 영상을 하나 봤습니다.


https://youtu.be/EkQS3RknGig

절대 팀 노바를 깎아내리려거나 비하하려는 목적으로 해당 링크를 태그한 것은 아닙니다.


내용을 요약하자면.. 섬네일 그대로 '알고리즘의 중요성은 과장되어 있다' 입니다.

기존에도 계속 의문이였으나 해당 영상을 보면서 더 답답해 진 것 같아 글을 작성하는 것입니다..



저는 학교를 다니면서 몇몇 프로젝트를 진행하면서

Python 비동기 TCP/IP 멀티플레이 게임 서버, REST API, Spring, 웹 앱 같은것을 프로젝트로 해봤습니다.

최근에는 React 와 Node JS 백엔드로 프로젝트를 해보려고 합니다.


하지만 구글을 활용하여 여러 정보를 찾고, 공부하고, 기능을 구현해도

CS 지식? 알고리즘과 자료구조 지식? 을 사용한 적이 없습니다.

있다 해도 작업의 1 프로도 안될정도로 적은 것 같습니다.

그냥 API, 라이브러리, 모듈 다 가져다 써서 구현하고자 하는 모든 기능을 구현해 낼 수 있었습니다.


학생 수준 프로젝트라 역량이 모자라서 해당 지식들을 사용해야 하는 부분과 필요성을

이해하지 못한걸까요?



지금도 CS 지식과 알고리즘 자료구조에 대한 지식이 부족한 개발자를 어떻게 생각하냐는 글을 보면

코딩 노예, 땔깜, 도태될 쓰레기 이런 소리들이 들려오더라구요. 오키는 이정도는 아니지만...


저는 지금까지 이런저런 코딩을 하면서 해당 지식들을 응용해서 프로젝트를 구현해본적이 없습니다.

그게 불안하기도 하더라구요.. 내가 코딩을 잘못하고 있나 라는 생각도 듭니다.



제가 C++ 같은 로우 레벨 언어로 프로젝트를 하지 않았기 때문에 중요성을 이해하지 못하는 걸까요?

C++, C 같은 메모리에 직접 접근이 가능한 언어로 개발을 해야만 해당 개념들이 필요한것인가요?


아니면 DBA 같은 분야나 로우 레벨 언어로 개발하는 서버처럼 퍼포먼스가 중요한 필드,

오픈 소스 기여나 API, 라이브러리를 직접 뜯어 고치는 필드에서만

해당 지식들이 중요하게 작용하는 것이고, 하이 레벨 개발 환경에서는 중요하지 않은건가요?


잘 모르겠습니다.

2
  • 댓글 17

  • quns01
    2019-12-11 05:04:27 작성 2019-12-11 05:08:48 수정됨

    전문가 급으로 알아야 하는 건 아닌데요, 적어도 기본적인 건 알고 있으셔야 높이 올라가는 데 무리가 없습니다.

    현재 하고 계신 것들이야 요즘 라이브러리 들도 잘 나오고 있고, 장기간으로 운영 하는 것이 아닌데다 많은 사용자들이 이용하는 게 아니니 그런 이슈들이야 없었겟죠. (그리고 알게 모르게 기초지식 정도는 이미 알고 개발하고 계신게 아닌가 싶어요.)


    동시에 100만 이용자  서버를 개발하는 것과 100명 서용자 서버를 개발하는 건 차이가 큽니다. 후자야 그냥 라이브러리 쓰고 대충대충 하면 되요.

    전자가 문제죠. 100만 이용자 서버를 개발하는 데 기초가 안되 있으면 어째어째 개발은 하더라도 문제가 발생하면 해결이 안되요. (어째어째 개발도 안되요)

    그리고 이건 그냥 많은 예 중에 하나 뿐이고, 개발 하면서 다양한 버그와 요구사항을 만나는데, 라이브러리를 쓰는 수준이 아니라 입맛에 맞게 커스터마이징 하거나 제대로 응용하는 수준까지도 갈 수도 있고, 그거에 파생되는 새 라이브러리를 만들어야 할 수도 있구요.

  • fender
    23k
    2019-12-11 07:01:48 작성 2019-12-11 07:10:57 수정됨

    관련된 주제로 썼던 글을 연결합니다:


    단 'CS적인 지식'은 다소 모호한 표현이라 어떻게 정의하느냐에 따라 다른 답을 낼 수 있을 것 같습니다. 그리고 100만 명이 사용하는 서비스를 만드는 문제라면 일반적으로는 알고리즘보단 아키텍쳐나 최적화/프로파일링에 대한 지식이 좀 더 중요하지 않을까 싶습니다.

  • 김백수
    1k
    2019-12-11 09:02:06

    구현이야 다 되죠

    for문을 100번 중첩해도 기능은 다 됩니다

    언제 어떤 문제가 터지냐가 차이가 크고 유지보수 지점이 달라지고 등등이 있을뿐이에요

  • kenu
    56k
    2019-12-11 09:03:53

    제가 이해하는 알고리즘입니다.

    let sum = 0;
    for (let i = 1; i <= 100; i++) {
      sum += i;
    }
    vs.
    let sum = (1 + 100) * 100 / 2;

    알고리즘에 따라서 같은 결과라도 차이가 많이 나죠.


      

  • lnomadism
    1k
    2019-12-11 09:22:58

    알고리즘에 대한 지식은 언젠가 필요할 때가 오리라고 봅니다.

    개발환경이 패턴화가 되다보니 내부적으로 어떻게 돌아가는지는 몰라도 패턴에 맞춰서 구현하기만 하면 돌아가는 상황이라 다른 지식 없이 깊이 생각하지 않아도 개발이 가능한 수준까지 온거죠.

    지금당장 코딩 자체는 빠르고 편하게할수 있을진 몰라도, 설계부분까지 들어가게되면 어느순간 이것을 어떤 방식을 써서 어떻게 처리해야될지에 대한 고민을 할수밖에 없을거라 봅니다. 

  •  안녕하세요^^ 저도 비슷한 환경이며 비슷한 고민을 했었어요!

     저 역시 컴퓨터공학부 4학년에 재학중이며, 현재 실습나온 학생입니다. 

    현재 실습 6개월차로 채용연계형이기에 현업에 어느정도 투입되고 있는데요,

    아직까지 알고리즘 지식(그리디 등등)이 필요한 적은 없습니다.


     하지만, 코딩할 때, 코드의 흐름을 고려하여 속도개선 등의 작업을 수행하기 위해 컴퓨터적 사고를 해야하며,

    한번은 사수분께 사내 조직도 트리를 구현하여 적용하는 과제를 부여받은 적이 있습니다.

    그 때 처음으로 작성자분께서 말씀하시는 CS지식들이 필요하다는 것을 느낄 수 있었어요.

     학부 중 개인, 팀 프로젝트를 꽤 많이 진행할 때엔, 트리의 기본적 자료구조 형태를 아는 것과 별개로 

    다양한 라이브러리로 구현할 수 있었습니다.

     하지만, 현업에서 다양한 환경에 맡게 구현하기 위해서는 자료구조의 지식이 필요했습니다.

    저희 회사는 DB로 트리를 구현해야 했기때문에, 트리구조의 형태에 맡게 깊이, 부모노드의 upserno, 자식노드의 serno를 활용하여 트리를 구현해야 했습니다.

     이런 일들 외에도 간혹 다양한 컴퓨터공학적 지식이 도움이 될 때가 많은 거 같아요! 또한, 팀 내에서 개발자분들은 사고 자체를 이런 지식을 전제하에 진행하십니다^^ 

     그렇기에 예비개발자인 저희도 당연히 그들과 같은 문화에 들어가기 위해 힘냅시다!

    의심이 갈 때엔 일단 손해 없이 다 하는 것이 좋다고 생각해요! 고생하세요~

  • __jj__
    648
    2019-12-11 10:06:32

    개발은 집을 짓는것과 같습니다. 집을 짓는데 구조역학이 꼭 필요한가요? 건축법을 알아야 할까요? 라고 묻는것과 같다고 생각합니다.

    초보자에게는 필요없죠. 누군가가 설계하고 바닥공사를 다 해주고, 벽도 쌓고.. 그다음 초보자들에게 오는 업무는 여기부터 여기까지 시멘트 발라라, 벽지 붙여라 하는 정도이니까요.

    그렇게 일을 하다가 익히면 벽돌 쌓는 일을 하게 되고 그다음 기초공사를 하게 되고 언젠가는 설계자가 되는거죠.

    그런데 설계자가 되었을때 구조역학을 모른다면 작은 지진에도 무너질 집을 짓게 되겠죠? 건축법을 모른다면 허물어야 할 수도 있구요.

    그렇다고 초보자일때는 필요 없는가?

     알고 집을 짓는 곳에 들어가면 보이는게 다를겁니다. 이집은 이래이래 하게 해서 설계가 잘 된 집이구나, 이집은 이러면 위험한데? 하면서 설계자에게 딴지도 걸 수 있겠죠?(그걸 받아들일지 고깝게 생각할 지는 설계자의 역량이고)..

    그리고 익히는 속도도 빠를겁니다.

  • 이뉴
    638
    2019-12-11 10:17:54 작성 2019-12-11 10:18:18 수정됨

    꼭 필수요소는 아닙니다.

    다만, 수학이나 알고리즘 해결 능력을 암기로 헤쳐나간다면 그것또한 방법이겠지만 발전속도는 더딜 것이고

    응용력과 순발력으로 논리적 해결을 한다면 발전속도가 더 빠를 겁니다.


    예전에 영재발굴단인가? 거기서 꼬마애가 고등학교 대학교 어려운 수학 문제를 푸는걸 보았는데

    공식 외워서 문제 패턴따라 대입해서 푸는게 아니라 아예 자기 자신만의 논리적인 방법으로 빠르게 해석해서

    풀더라고요.

    그런걸 보면 수학영재들 수준은 아니겠지만 수학적 사고방식으로 깨우친 사람들(개발자)이 얼마나 문제를 잘 해결할지는 어느정도 가늠할 수는 있겠죠

  • 초초보보
    671
    2019-12-11 10:25:45

    알고리즘은 중요합니다.

    다만 알고리즘을 외우는게 아닌 이해하는 것이 중요하죠.

    요즘 모든 기업들이 알고리즘 테스트를 보다보니 그냥 기출 문제처럼 알고리즘 문제를 외우듯이 풀잖아요.

    그니까 개발하기위해서 적당한 기본 알고리즘이 필요하고 기본을 응용시키면서 실전에 적용해야하는데

    알고리즘 테스트 합격하기 위해 죄다 only 알고리즘 문제만 푸니까 그게  좀 그렇다는거죠.

    결론. 알고리즘은 중요하다. 하지만 테스트 통과하려고 알고리즘 공부에만 올인하는 것은 좋지 않다. 이런 느낌이죠.

  • fender
    23k
    2019-12-11 10:54:16

    개발을 건축에 비유할 때 알고리즘이 구조역학이나 건축법에 해당한다고 생각하진 않습니다.

    실제로는 어떤 종류의 개발자는 건축 자재를 연구하고, 어떤 개발자는 설계를 하고, 어떤 개발자는 인테리어를 시공합니다. 각각 자신의 분야에 필요한 공부가 있을테고, 어떤 분야에선 필수 지식이 다른 분야에선 알면 도움이 되는 정도로 중요도가 달라질 따름입니다.

    나름 반복되는 주제이지만 쉽게 공감대를 형성하기 힘든 이유는 아마도 소프트웨어 개발이란 분야가 아미 한 사람이 전체 그림을 보기에는 너무도 방대해졌기 때문일 것 같습니다.


  • Galty
    30
    2019-12-11 11:09:04 작성 2019-12-11 11:19:00 수정됨

    성의있는 답변들 감사합니다!


    역시 오키가 제일 도움이 되는 것 같네요. 몇몇 개발자 커뮤에서 이런 글 작성하면 땔감이라고 비꼬는 사람들이 있었거든요..


    추가로 한가지 의문이 있는데... 실무 개발 또는 서버처럼 퍼포먼스를 고려해야하는 상황일 때, 최대한 모든 함수 연산들의 시간복잡도를 고려해서 코딩하는것이 바람직한 것인가요? 프로젝트에선 크게 고려하지 않고 기능 구현에 집중했었습니다.

  • 이카로스
    255
    2019-12-11 11:20:15

    cs지식은 나중에 규모가 커질때는 cs지식이 필요합니다. 설계자가 아는 만큼 체력이 좋은 시스템을 개발할 수 있어요. 알고리즘은 많이 쓰일일이 거의 없다고 생각할수도 있지만 예를들어서 카산드라같은데서 어쩔수없이 페이징을 구현해야한다면 그런 능력이 있으면 좋겠죠


  • fender
    23k
    2019-12-11 11:41:51 작성 2019-12-11 11:44:13 수정됨

    Galty // 공간과 시간 복잡도의 트레이드 오프 관계를 이해하고 필요에 따라 최적화에 활용하는 건 필요한 내용입니다. 단지 이를 포멀(formal) 하게 정의하고 표현하는 건 분야에 따라 그 보다는 다소 중요도가 떨어질 수 있는 주제이고, 항상 효율적인 코딩을 추구하는 건 좋은 습관이지만 "성급한 최적화는 만악의 근원이다 (Premature optimization is the root of all evil)"라는 격언에도 주의할 필요가 있습니다.

    한편, 고수준으로 올라올수록 최적화는 코드에 어떤 알고리즘을 적용할 것인가 보다는 훨씬 넓은 주제로, 아키텍쳐적 고려나 프로파일 기법, 데이터베이스나 가상 머신 튜닝 등 다양한 내용을 포괄하는 경우가 많습니다.

    -1
  • 냐우룽
    163
    2019-12-11 12:42:38 작성 2019-12-11 12:55:35 수정됨

    아직 반년된 늅늅이인데 전 알고리즘지식이 도움이 되고 있습니다.

    왠지 개발환경이 제대로 잡힌 회사일수록 오히려 쓸일이 없지 않나 싶긴하네요.

    전 중소기업이라..

    예를들어 최근에 알고리즘적 지식을 사용한 부분은 예시를 들어 아래와 같습니다.

    List<HashMap> 구조의 데이터가 있습니다.

    이 때 HashMap부분은 key, A,B,C,D,... 이런식으로 키값이 들어있고요.

    이걸 List 통채로 RPC를 통해 다른시스템에 통신으로 보내면,

    key만 사용하여 key, a,b,c,d,... 이런 HashMap 리스트 데이터를 보내줍니다.

    그럼 최종적으로 key를 기준으로,

    key,A,B,C,D,a,b,c,d, ... 형태의 HashMap 리스트를 만들어 사용해야 하는 경우가 있었습니다.


    이 경우, 그냥 되기만 하게 짠다면

    1. 통채로 RPC로 보냄.

    2. 결과로 해쉬맵 리스트를 받음

    3. 결과로 받은 해쉬맵 리스트를 순회하며 key값에 맞는 원본데이터를 찾아 해당 내용에 붙여넣음.

    이렇게 될 경우,

    A. 다른시스템으로의 RPC이고, 해당 콜에서 사용되는건 key뿐인데 전부 통채로 보냄으로 통신에 시간이 더 오래걸리게됨

    B. '3'의 시간복잡도는 처음 데이터를 기준으로 O(N^2)만큼 걸리게 됨. -> 데이터가 10만개였다쳐도 이미 해당 시스템은 사용 불가할정도로 시간이 오래걸리게됩니다. (대략 몇십초 걸림)


    그래서 전

    1. RPC보내기 전 전처리로 HashMap<key, HashMap<>> 구조를 만들어 key값을 기준으로

    원본 HashMap에 대한 링크를 가지도록 만들면서, RPC에 보낼 새로운 리스트를 만들어 key만 넣었습니다. (다해서 O(N) 걸림)

    2. 그렇게 확실히 컴팩트해진 리스트를 RPC에 보냅니다. (10만개에 각 HashMap에 원래 100개씩의 Integer가 있었다고 쳐도 79메가이상(해싀이므로 실제론 더 필요함)

     가량 통신에 보내는걸 줄인것이니 분명 시간이 적게걸릴수밖에 없음)

    3. 결과로 받은 리스트를 그냥 순회하며 (O(N)) '1'에서 만든 Hash에서 타겟 Hash를 찾습니다. (O(1))

    최종적으로 그냥 동작만 되게 짜면 몇십초 걸릴것을 0.1초도 안되는 시간에 동작가능합니다.


    이에 따른 트레이드오프는 10만개 기준으로, 추가 HashMap으로 2~3mb정도. 해쉬이므로 약 10메가 이내정도의 메모리 입니다.


    .. 는 사실 DB에 이미ㅜ이런거 다 적용 되있을테니 DB를 더 잘 활용하면 될지도 모르겠지만요 ㅎㅎ

    일단 중간에 통신을 통한 RPC가 들어가고 DB에 접근할 부분이 없어 이런식으로 했었습니다.


    적다보니 너무 길어졌네요.

    뭐 일단 전 알고리즘은 도움된다고 생각합니다.

    다만 플랫폼을 사용한 개발로 갈수록, 더욱 정형화된 프로젝트일수록 쓸일이 줄어드는게 사실이겠죠.

    하지만 그래도 현재 짜고있는 시스템의 구조를 위처럼 알고 작업하는것과, 그냥 되겠지뭐 하며 작업하는 차이는 매우 크다고 봅니다. (일단 전 현재까진 짜면서 시간복잡도는 최대한 모두 생각하며 짜고있습니다. 늅늅이라 앞으로를 위한 연습으로 생각하면서여.)


    일단, 무엇보다도 코딩잘하는데 알고리즘은 못할 수 있죠. 하지만 알고리즘 잘하는데 코딩못하는사람은 들어본적이 없습니다.

  • quns01
    2019-12-11 13:58:02

    fetch // 네, 알고리즘이 아니라 CS 기초를 말씀 드린 겁니다. 네트워크나 운영체제 지식 같은 거요.

    그리고 아키텍쳐나 최적화/프로파일링 기술을 하려면 기초지식 없이는 많이 힘들죠

  • __jj__
    648
    2019-12-12 14:00:18

    최대한 모든 함수 연산들의 시간복잡도를 고려해서 코딩하는것이 바람직한 것인가요? 

    ㅡ> 이것에 대한 답변을 드리자면..

    최대한 효율적인 프로그램을 짜는 것이 숨쉬는 것처럼 자연스럽게 익혀져야 한다고 봅니다. 이건 버릇과 같거든요. 처음부터 모든걸 다 알고 시작할 수는 없습니다. 이건 문제 없을 줄 알고 구현했다가 생각지도 못한 문제에 봉착하기도 하죠. 그렇게 실패한 경험은 다음에 다시는 하지 않도록 내재화 해 놔야 하죠.

    예를 들자면 쉽게 전역변수를 선언하고 쓰다보면 그게 쉬워서 남용하게 되는데 multi thread에서 엉키고 꼬이는 경험을 하게 되면? 그걸 찾고, 고치는데 엄청 고생하게 되죠. 

    전역변수는 꼭 필요할 때만, 그리고 쓰더라도 multi thread에 safe 하도록 locking 을 사용하는것... 이런것은 버릇처럼 되어야 할 필요가 있습니다. 

    그리고 몇 함수의 경우 multi thread에 unsafe한 함수들이 있기 때문에 요런건 꼭 알고 사용할 필요가 있습니다. 이런 것들은 대부분 문제의 원인을 찾아내기가 굉장히 어렵습니다.

  • iopopoi
    9
    2019-12-16 14:09:05

    현재 알고리즘 공부를 하고 있는 학생입니다.

    어렵고 이게 필요한 건가 싶은 고민을 하고 있었는데

    댓글들을 보니 열심히 해야겠다는 마음이 듭니다.

    감사합니다!!!

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