카테고리 없음

알고리즘 공부의 장점과 단점

openingsound 2020. 6. 29. 04:06

https://www.youtube.com/watch?v=E-rsNylGLFI&feature=youtu.be

  • 반복적인 실패의 경험
    • 문제를 풀면서 틀리는건 일상적
    • 맞왜틀 -> 내가 잘못 했구나
    • 디버깅 : 오류가 발생했을 때 추적하는 연습
  • 알고리즘 문제 해결은 복합적인 과정
    • 자연어로 된 문제들
    • 수학적으로 (추상적으로 ) 모델링해서
    • 해벅을 디자인하고
    • 해벅의 성능과 타당성을 검증하고 
    • 프로그래밍 언어로 구현하고
    • ???
    • 틀림
    • 이유를 찾고 돌아가 반복한다.
  • 알고리즘 문제해결은 복합적인과정
    • 글을 빠른 시간 안에 읽고 의도하는 바를 이해 ( 한글, 영어)
    • 모델링을 잘못 하면 문제를 못 풀 때도 있음을 이해
    • 해법을 실행에 옮기기에 앞서 검토가 필요함을 이해
    • C++은 위험한 언어임을 이해
      • 실패하더라도 엄한데서 고장 날 수 있음
    • 아무리 수련해도 같은 실수를 반복 한다는 사실 을 이해
  • 멘탈 수련
    • 죽지만 않으면 된다! - 니체
    • 맨붕 시나리오
      • 다른 팀들은 다 푸는 문제를 우리만 못품
      • 틀린 이유가 없어
      •  WA , RTE 번갈아 나옴
      • 남은시간 없음
      • 채점 큐 밀림
      • 팀원들이 키보드 뺏어가서 프린트 코드 봐야함
    • 수많은 시나리오가 있음
    • 프로그래밍은 멘탈 컨디션에 영향을 많이 받는 정신적 영향을 많이 받는 일이다
    • 압박 상황에서도 집중해야 할 때 할 수 있어야 함
    • 나보다 똑똑한 사람이 널렸지만 굴하지 않고 내가 할 일을 내가 한다는 마음 가짐을 가져야 함
    • 노 - 답이여도 포기하지 않고 끈질기게 물고 늘어질줄 알아 끈기가 늠
  • 기타 훌륭한 마음가짐
    • 문제 해결은 즐거운 일( 좋은 마음가짐)
    • 오래도록 끙끙 앓던 문제를 푸는건 더 가치 있는 일이구나!
      • 고기도 먹어본 놈이 먹는다고 한번 고생해 봐야 앎
    • 새로운 걸 배워 익히는 건 즐거운 일이구나!
      • 이 직업은 배우는걸 멈출수가 없음
    • 여러 직관들
      • 문제는 작게 쪼개면 풀기 쉽다.
      • 경계 조건은 정말 중요하다.
  • 지식은 거들 뿐
    • 자료구조에 대한 깊은 이해
    • 데이터의 양과 성능 사이의 관계에 대한 감( 시간 복잡도)
    • 영어
    • 마음가짐을 다듬는데는 도움이 된다.
  • 그동안 배운 건 지나치게 자기 중심적
    • 첫 코드 리뷰 
      • 쓰레기
    • 현실에선 혼자 일할 순 없지만 협업 경험이 없음
    • 남에게 ( 프로그래머가 아닌 사람에게) 지금 문제를 처음부터 설명해 본 적이 없음
    • 복잡한 코드나 설계를 경험해 본적도 없음
    • 남의 좋은코드를 읽어본 적도 없음
    • 남의 코드를 활용해 본 적이 없음
    • 남이 읽을 것을 전제로 코딩을 해본 적이 없음 ( 빠른 구현)
    • 설계의 큰 그림을 그려볼 기회가 적음
    • 스펙이 변경되는 경우를 생각하지 않음
    • 유지보수를 생각하지 않음
  • 파인만 알고리즘
    • 문제를 적는다.( 1) 
    • 생각한다.
    • 답을 적는다.
  • 실제 문제는 알고리즘 문제와 많이많이 다름
    • 기획서 != 문제 디스크립션
      • 무엇이 가능하고 불가능 한지 모르니까
    • 문제 자체가 아예 잘 정의되지 않은 문제가 훨 씬 많음 
    • (1)자체가 안이뤄져 있음
    • 답이 하나인 경우가 드물다.
      • 알고리즘 문제의 솔루션은 보통하나지만 엔지니어링 문제는 하나가 아님
      • 답이 하나뿐인 문제? 는 풀지말라
        • 문제가 잘못 됬을 가능성이 있다. (답을 만들고 문제를 끼워 맞춘거)
        • 안될경우 2안 3안이 없음
    • 억지로 알고리즘문제로 바꾸다모면 오버엔지니어링
    • ( 1 )을 먼저 같이 해야함
  • 쌓은 지식 대다수는 쓸모 없음
    • 최대 유량,dp, kmp , dfs, 기하 ? 이런거 다 쓸모 없음 
    • 어차피 결국 느리지만 문제는 모두 다 푼다
    • 실무랑은 많이 다르다
  • 그래서 어쩌지?
    • 공부하는 거 자체가 훌륭함
    • 재미없는걸 공부하는건 고통스럽다.
      • 재미없으면 다른공부하는게 좋다
    • 재미있다면 계속하자
    • 사실 현업에서 마주할 어려움은 미리 준비하기 어려움
    • 그래도 좀 더 잘하고 싶다면 다른 분야의 공부도 하면 됨
    • 스킬을 배우는게 아니라 스텟 자체를 올린다고 생각
  • 인접한 가지로 뻗어나가기
    • Modern C++
      • 새로운 언어 컨셉들 => 다른언어 공부
    • 마라톤 매치( 최적화 경쟁 대회)
      • 성능 최적화 -> 하드웨어, 아키텍처, 컴파일러
    • 수학
      • 이산수학
      • 선형대수학
      • 확률과 통계
        • 기계 학습
  • 회고하기
    • 남의 코드를 보고 공부하기(깔끔하고 명료한 코드)
    • 내 코드를 다시 써 볼 것
      • 재사용성
      • 가독성
    • 글로 문제와 풀이를 정리해 볼것
  • 딴짓하기
    • 동아리에서 같이 연습할 환경을 만들고 싶다 -> 슬랙 봇/ 웹 앱 개발
    • 공부한 히스토리르 관리 ->  git
    • 에디터 하나는 알아야 하지 않나 -> vim
    • 기하 문제 시각화해보기 -> 수많은 도구들
    • 채점 시스템을 만들어보고 싶다 -> 시스템 프로그래밍
  •