카테고리 없음
알고리즘 공부의 장점과 단점
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++
- 새로운 언어 컨셉들 => 다른언어 공부
- 마라톤 매치( 최적화 경쟁 대회)
- 성능 최적화 -> 하드웨어, 아키텍처, 컴파일러
- 수학
- 이산수학
- 선형대수학
- 확률과 통계
- 기계 학습
- Modern C++
- 회고하기
- 남의 코드를 보고 공부하기(깔끔하고 명료한 코드)
- 내 코드를 다시 써 볼 것
- 재사용성
- 가독성
- 글로 문제와 풀이를 정리해 볼것
- 딴짓하기
- 동아리에서 같이 연습할 환경을 만들고 싶다 -> 슬랙 봇/ 웹 앱 개발
- 공부한 히스토리르 관리 -> git
- 에디터 하나는 알아야 하지 않나 -> vim
- 기하 문제 시각화해보기 -> 수많은 도구들
- 채점 시스템을 만들어보고 싶다 -> 시스템 프로그래밍