###### tags: `2020 Boostcamp` # Day01 - 학습정리 ## 스스로 확인할 사항 - **코딩 테스트와 다르게 개선된 부분이 있는가 설명해본다.** 1. keyboard 배열에서 해당 문자 찾을 때 완전 탐색 -> Dictionary로 초기화 후 사전 탐색 * keyboard가 얼마나 크게 들어올 지는 모르지만 탐색시간을 O(n^2)에서 O(logN) 으로 줄임 2. 함수 분할 * 더 작은 단위로 함수를 쪼개어 가독성을 높힘 3. 변수명에 주의 * 한번에 알아들을 수 있는 변수명을 고심하고 사용함 4. 주석 추가 * 세세한 주석을 추가하여 다른 사람이 내 코드를 봤을 때 충분히 이해가 가도록 작성함 - **함수를 여러 개로 분리해서 만들면서 어떤 기준으로 함수를 분리했는가 설명한다.** - 같은 논리 흐름을 가지는 최소 단위로 분리함 - 같은 로직이지만 방향성이 다르다면 분리함 - **git의 branch에 대해서 이해를 하고 있는가 본인이 이해한 데로 설명해본다.** - 어떤 일을 독립적으로 작업하기 위한 개념으로 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에 여러 작업을 여러사람이 같이 할 수 있다는 것이 핵심이다. *Divide and Conquer* 의 진가를 보여주는 기능이 아닌가 싶은데, 작은 단위로 부터 그 크기를 키워나가며 큰 작업을 할 수 있고, 문제가 발생했을 때 원인을 찾기 쉽다는 장점이 있다. ## 다같이 확인할 사항 - **원본 저장소를 fork해서, PR을 보낼 때까지 흐름에 대해서 각자 이해한 내용과 차이점이 있는지 비교한다.** 1. 원본 저장소에서 내 저장소로 fork * 다른 사람의 저장소에서 내가 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때 * 원본의 내용이 변하면 fetch나 rebase의 과정을 거쳐 내 저장소에 반영이 가능하다 2. 작업 후 PR * pull request를 보내기 전까지는 내 저장소에만 변경 사항이 반영되어 있다 * pr을 보내면 원본 저장소의 관리자가 적절성을 따져 승인 여부를 결정하게 된다 * 승인이 되면 나의 작업물이 원본 저장소에 commit, merge 되어 반영된다 - **git add와 commit을 할때 git 내부에서는 어떤 동작이 일어나는 것인지 자료를 찾아서 학습하고 이를 비교해서 정리한다.** * Object Git을 구성하는 데이터파일. Working directory의 파일 정보를 object형식으로 변환하여 Object database에 저장 각각의 Object 파일은 Zlib을 이용하여 압축되며, 파일의 내용과 헤더를 40자의 SHA-1 헤시값으로 저장한다 * Index object 파일 링크의 list를 가지고 있다 * git add object 파일이 생성되고, blob, object 링크, 파일이름 을 담고 있는 index 파일이 변경된다 * git commit git에 변경된 파일이 있음을 명시하는 동작이다. 따라서 commit을 하면, 그 전까지 add한 파일들이 해당 commit에 기록된다 먼저 index 파일을 변경하고, 변경된 파일 정보들을 가지고 있는 object를 생성한다. 그 후 commit의 전체 정보가 담긴 파일을 생성하고 마지막으로 commit을 가르키는 HEAD등 그와 관련된 파일들이 변경된다 - **여러 명이 협업을 하며 프로젝트를 개발할때는 다양한 branch전략을 세워서 한다.** **실무에서 사용하는 워크플로우 (예 - gitflow, git workflow, gitlab workflow 등)에 대해서 찾아보고, 왜 그런 전략이 필요한지 고민한 후 비교한다.** - gitflow - master와 develop 브랜치를 항상 유지하고 보조 브랜치를 일정기간 유지한다. - master : 제품으로 출시될 수 있는 브랜치 - develop : 다음 출시 버전을 개발하는 브랜치 - feature : 기능을 개발하는 브랜치 - release : 이번 출시 버전을 준비하는 브랜치 - hotfix : 출시 버전에서 발생한 버그를 수정 하는 브랜치 - github flow - master 브랜치에 대한 role만 정확하다면 나머지 브랜치들에는 관여하지 않는다. PR 권장 - 릴리즈 라는 개념이 없다 - 브랜치 전략 단순 - CI가 필수적이며, 배포는 자동으로 진행할 수 있다 - gitlab flow - github flow의 진화버전, production 브랜치가 존재하여 커밋한 내용들을 일방적으로 디플로이 하는 형태 - master와 production 사이에 pre-production을 두어 개발 내용을 시간을 두고 반영한다. - PR하여 merge 한다 코드 품질 향상, 코드 가독성 향상이 주 목적이라 생각된다. 또한 버그가 발생하였을 때 해당 버전의 코드로 디버깅해서 원인을 찾고 상황 재현, 수정, 검증, 재배포의 단계를 체계적이고 안정적으로 처리할 수 있어야 한다. 그러기 위해 branch 전략을 세우는 것은 필수적이다.