qldkssp
63
2020-05-20 23:11:54
7
1454

근본적인 프로그래밍 공부법에대해 의견을 듣고 싶습니다.


(아 열심히 길게 써놨는데 로그인 만료되서 다 지워졌네요..하)


안녕하세요. 저는 컴공 재학중인 2학년 대학생입니다.

프로그래밍,컴퓨터공학을 대하고 공부하는 근본적인 방법에 대해 의견을 나눠보고자 글을 쓰게 되었습니다.


우선 저는 어려서부터 뭔가를 배울 때, 그것의 전체 시스템을 이해하려고 노력했습니다.

물론 당연히, 수학을 배울 때 수학 전체를 이해한다는게 아니라, 배우고있는것들 안에서 그것이 작동하는데 필요한 최소한의 원리나 시스템입니다.

그래서, 수학이나 과학을 좋아했고, 전체 작동 방식을 이해하려고 노력했기때문에 문제를 많이 안 풀어봐도, 친구들 질문도 받아주고, 학교공부도 수월하게 했습니다.


그러다가 대학에와서 공학과 컴퓨터, 프로그래밍에 관심을 갖고 공부를 시작했습니다만,,,

프로그래밍을 열심히 공부한건 아직 채 1년이 안됐습니다. 아직 뭘 제대로 개발해본 경험도 없고 그냥 학교공부와 독학으로 자료구조 알고리즘 그리고 python 여러가지 모듈을 공부한것이 대부분입니다.


주로 python을 사용하는데, 공부하면서 느낀건, python 코드는 정말 간결하다는 것입니다. 그래서인지 제가 생각하던(혹은 상상하던) 프로그래밍과는 상당히 괴리감이 느껴졌습니다.

예를들어 마우스를 조종하고싶다면, 저는 공부하기전에는 마우스에 접근해서 뭘 어쩌구저쩌구 하는 코드를 쓸거라고 상상했는데 파이썬에서 pyautogui 모듈을 사용해서 pyautogui.position() 한줄이면 마우스의 좌표를 알아낼수가 있었습니다. 저는...이게 올바른(?) 프로그래밍인가? 싶습니다.

말씀드렸다시피, 저는 근본적인 작동원리나 시스템을 이해해야하는 사람인데, 그런거 다 제끼고 딸랑

한줄이면 마우스를 조종할수 있는데, 물론 뒤에서 일어나는 모든일을 이해하고 코드를 쓰는거면 상관없는데 저는 그런거 하나도 모르는데, 저걸로 코드를쓴다는게 신기하기도하지만 동시에 짜증이 나기도 합니다.

제가 이상한건지 모르겠지만, 저는 더 low하게 알고싶은데 구글에 검색해봐도 죄다 모듈을 이용하는 방법뿐이더라구요. 제가 공부를한지 1년도 안되서 잘 모르는건지도 모르겠지만, 사람들은 그저 이런 마법의문장을가지고서 공부하고 프로그래밍하는게 요즘 말하는 프로그래밍인건가요? 그리고 그렇게 가르치고 있는것같고... 그냥 제가 상상하던 거와는 달라서 궁금하네요.


이런거뿐아니라 요샌 머신러닝/딥러닝도 전문지식없어도 인강으로 배우고 텐서플로우쓰면 되게 간단하게 프로그래밍할 수 있는데, 과연 이게 물론 편하기야 하지만, 실력면에서 정말 도움이 되는건가 싶기도하고... 그렇네요.


또한 프로그래밍을하면 컴파일과정을 거치고 여튼 되게 많은 일이 일어나잖아요? 지금 글을쓰는것도 인터넷을 이용하는거고, 매일쓰는 핸드폰도 와이파이 혹은 데이터 네트워크를 사용하고 뭐 되게 많은데

이런것들에대한 지식이 크지 않다보니까 제 머리속에 minimal한 시스템도 없는게 되게 답답합니다.

말씀드렸다싶이, 저는 시스템을 이해해야하는데, 컴퓨터공학 자체가 역사와 반대로 배우는 학문이다보니 되게 low한 것들은 전공에서야 배우고 저는 아직2학년이라, 물론 조금씩 독학을 하고는 있지만, 운영체제 아키텍쳐 네트워크 컴파일러 등 많은 부분들을 정확히 어떤 일이 일어나고있는지 모르다보니

제가 뭘 할때 답답하기도한데... 이게 뭐 정상인건가요?


그냥,,, 초보자의 입장에서 공부하면서 드는 생각들을 적어봤고 여러분들 생각은 어떤지 궁금해서 글을 썼습니다. 아직 제가 잘 모르는 부분이 많기 때문에, 제 글에서 이상한 부분이 있으면 잘 알려주셨으면 좋겠습니다.

감사합니다.


1
  • 댓글 7

  • aladdin56
    394
    2020-05-20 23:56:35

    >운영영체제 아키텍쳐 네트워크 컴파일러 등 많은 부분들을 정확히 어떤 일이 일어나고있는지 모르다보니

    혼자 따로 책을 사서 배워보시는 것을 어떨까요?

    가령 Embedded Linux 이런 것 관련 책.  여기에 좋은 예제있습니다.  https://lwn.net/Kernel/LDD3/

    책을 보고난 후에는 "라즈베리 파이" 보드 하나 사서 실습해보세요.





  • 엡실론
    2k
    2020-05-21 01:37:50

    전공과목에서 low한 것들을 배울테니, 그러고 나면 좀 더 시스템을 이해할 수 있을 겁니다.

    지금 단계에서는 코딩에 익숙해지고, 여러가지를 만들어 보세요.

    low한 것도 중요하지만, high level도 중요합니다. pyautogui의 예를 보면, 마우스 좌표를 간단하게 알아낼 수 있습니다. 그러면 남은 시간은 알아낸 마우스 좌표로 할 수 있는 복잡한 로직을 만드는데 쓸 수 있겠죠. 어디에 집중할지의 문제일 뿐, low/high level에 따라서 더 실력이 좋고 나쁠건 없습니다.

  • deev
    2020-05-21 01:53:14

    모든 것들의 low한 부분을 모두 이해하기에는 절대적으로 너무 많은 시간이 소모됩니다.

    따라서 필요에 의해서 어떤 것들은 low레벨까지 깊게 이해하고 어떤 것들은 추상화된 레벨에서 이해하는 것이 중요합니다.

    마우스 예시에서도 수많은 하드웨어와 수많은 OS들을 모두 알아야 모든 마우스의 좌표를 알아낼 수 있다면 마우스 관련된 프로그램 짜는 것은 몇년 이상 투자하지 않은 이상 쉽지 않은 일이 될테지만 하드웨어, OS 등등 수많은 레이어들을 추상화함으로서 어떤 마우스가 들어오더라도 또한 지금 존재하지 않는 마우스가 추후에 들어오더라도 똑같은 동작을 기대할 수 있게 만드는 거죠.

    따라서 텐서플로우도 마찬가지고 어떤 언어도 마찬가지인 것 처럼 앞으로 점점 더 어려운 기술이 나올수록  추상화되는 레이어는 늘어나지만 결국 최상위 레벨에서는 누구나 쉽게 접근 가능한 방향으로 가며 동시에 어느정도의 기반 지식을 요구할 것이라 생각합니다.

    늘 그렇듯이 전반적인 low레벨에서의 이해도 매우 중요하니 천천히 꾸준히 학습하시는걸 추천드립니다.

  • rebwon
    433
    2020-05-21 09:31:29

    바퀴의 재발명은 학습을 위해서는 필요하지만, 모든 영역에서 바퀴를 재발명하는 건 너무나 불필요한 학습입니다.

    자신이 부족한 부분 필요한 부분에서 조금씩 조금씩 더 코드를 뜯어보고 기반이 되는 개념을 찾아보시면 됩니다.

    그리고 너무 다 알려고 하지 않는 게 좋습니다. 인생이 피곤해집니다ㅋㅋ

  • instance
    1k
    2020-05-21 10:00:20

    모리스 마노 컴퓨터 구조 책을 사서 공부해보시면 좋을 것 같습니다^^

  • davedev
    2
    2020-05-22 02:04:57

    제가 글쓴 분이 아니다보니 오해했을 수도 있지만 아마 글쓴이 분은 제가 학부 때 가졌던 의문들과 비슷한 의문을 가지신 거 같아보입니다. 저도 글쓴이 분과 같은 고민으로 학교 다니면서 하는 코딩과 프로젝트들이 사실 상 정신 고문같았는데, 전부 다 공부할 수 없는데 어떻게 돌아가는지 모르면 또 코딩이 안되었던 터라 고민이 많았지요. 일단 제가 얻은 답은 다 만들 필요는 없지만 결과적으로는 작동 방식을 알아야 한다는 것이고 그러기 위해서 각 기술의 스펙을 읽고 이해하기 위한 컴퓨터 공학 개괄에 대한 그림과 세부 지식이 필요하다는 거에요. 각 기술의 스펙들도 각각의 철학과 역사가 있고 그런 철학과 역사를 이해하기 위해서는 컴퓨터 공학 지식들이 필요합니다. 그런 철학과 역사를 기술하는 사고 방식들, 언어들이 다 컴퓨터 공학에서 제공되기 때문입니다. 그래서 학부 때의 공부가 굉장히 소중한 거 같습니다. 


    일단 작동 방식을 알아야 하는 가장 큰 이유는 어느 기술(라이브러리)든지 업데이트가 되기 때문이라고 생각합니다. 웹 프론트에서 현재 가장 유명한 리액트도 최근에 내부 렌더링 방식이 변경 되었는데요. 그냥 마법같이 라이브러리와 프레임워크가 내가 원하는 일을 해줄 거라고 생각하게 되면 주도적으로 라이브러리를 선택할 수 없고 심지어 그 라이브러리의 특정 버전에 머무를 수 밖에 없습니다. 결국 변화하는 소프트웨어 세계에서 개발자가 주도적으로 특정 기술을 사용하고 응용하기 위해서는 사용하는 기술의 내부 동작에 대한 이해가 필요하게 되죠(물론 라이브러리 위에 라이브러리 위에 라이브러리가 있는 상황에서 어느 깊이까지 동작을 공부해야 할지 절충선은 필요한 거 같습니다.) 세부 지식은 학부 전공에서 배우게 되겠지만 전체적인 개괄과 그림을 얻는 것은 참 어려운 일입니다. 그 개괄을 얻는 데 좋은 자료가 있습니다.


    유투브에 코드스피츠를 검색하셔서 코드스피츠에서 진행했던 자바스크립트 스터디 영상을 쭉 한번 보세요. 단순히 자바스크립트 지식이 아니라 컴공에서 컴퓨터 구조, 컴파일러 이론, 프로그래밍 언어론에 대한 개괄을 알 수 있을겁니다. 이 영상을 다 보고 나서 학교 다닐 때 전공들을 큰 그림 안에서 좀 더 면밀하게 공부해봐야 했는데라는 아쉬움이 컸는데 글쓴이 분은 아직 재학 중이시니 영상에서 얻은 개괄을 가지고 전공 지식들을 채워 넣으면 좋을 것 같아요. 검색하기 따로 링크를 올리지는 않을게요. 아마 지금 고민하고 있는 내용 중에 큰 부분이 해소될 수 있지 않을까 싶습니다.


    추가로 머신러닝/딥러닝도 잘 사용하기 위해서는 random variable, 다변수 미적분, 선형 대수학 등 수학을 알아야 합니다. 왜냐면 이 분야도 단순히 라이브러리를 쌓아서 만드는 게 중요하다기 보다는 주어진 데이터 자체에 대한 도메인 분석이 중요한 거라서요. 모델 학습이 잘 되지 않을 때 모델을 튜닝 해야 하고 튜닝 때 사용하는 방법들도 다 수학입니다. 그리고 튜닝에 사용하는 방법들도 여러가지 이지요. 따라서 데이터 도메인에 대해 분석하고 그 분석을 바탕으로 어떤 학습 방식과 어떤 튜닝을 사용할지를 결정하기 위해서는 충분한 수학적 지식과 사고와 내부 동작 방식을 이해해야 하지요 그래서 일단 학부 때는 자료구조 알고리즘 컴퓨터 구조 등등 기초 전산 공부에 충분히 집중하고 추가적인 노력으로 딥러닝을 공부하는 게 좋을 것 같습니다. 학부 전공들을 충분히 공부하는 것도 시간이 많이 걸리는 일이라고 생각을 해서요. 물론 다른 분들을 다른 의견을 가지실 수도 있고 저의 개인적인 의견입니다.

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