아래의 7가지 기능 요구 사항을 모두 해결해야 한다.
node.js v14.20.1
, Visual Studio Code
로 세팅하였습니다.커밋 메시지 컨벤션
은 유다시티 커밋 메시지 스타일 가이드를 참고하였습니다.예전부터 github 계정은 있었지만 잘 사용하지 않아 git
사용법에 익숙하지 않았습니다.
사실 지금도 git
의 복잡한 기능들은 잘 모르겠지만 이번에 프리코스를 하면서 git status
로 상태를 확인하고 git add
로 업로드할 코드를 스테이지에 올리고(지옥에서 온 git이라는 유튜브 강의를 들었습니다! add
를 하면 commit
하기 전 대기공간인 스테이지에 올라간다는 것을 알게 되었습니다.) 그리고 commit
을 하면서 커밋 메시지를 작성하는 기본 루틴에는 익숙해질 수 있었습니다. 여기서 또 커밋메시지에 관해서 다시 찾아보았는데요. 미래의 자신과 제 코드를 볼 수도 있는 다른 사람들을 위해 가독성이 좋고 정형화된 커밋메시지를 작성하고 싶었습니다. 제가 작성한 코드를 보고도 이해를 못했던 경험 때문에요.. 그래서 가독성 좋은 다양한 커밋메시지 컨벤션을 찾아보다가 기존에 코치님이 작성하셨던 커밋메시지 스타일에 맞추는 것이 좋을 것 같단 생각에 유다시티 커밋 메시지 스타일 가이드를 참고하여 커밋메시지를 작성해보았습니다. 문제를 다 풀고 커밋히스토리를 보니 깔끔하게 맞춰진 커밋메시지 스타일에 기분이 좋았습니다.
기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋하는 방식으로 진행한다
위와 같은 요구사항에 맞춰 기능을 구현하기 전에 구현할 기능 목록을 먼저 만들어서 정리 했습니다. 객체지향 개발 원칙 중 단일책임의 원칙을 글로 배웠고 알고리즘 문제를 풀 때에도 적용하려고 노력해왔었지만 이렇게 직접 기능 목록을 먼저 작성한 후에 구현을 해보니 이런 방식이 단일책임원칙을 적용하는 데에 더 도움을 주는 방식이라는 것을 느꼈습니다. 구현하기 전에 작성한 기능 목록을 먼저 확인하고 그 기능만을 생각하면서 구현해서 그랬던 것 같습니다. 또 이렇게 구현한 후 기능 단위로 커밋하는 것은 조금 번거로운 면도 있었지만 나중에 수정사항이 생겼을 때 확인하기 편할 것 같다는 생각을 했습니다. Git
을 사용해보면서 좀더 git
에 대해 공부해보고 싶어서 "팀 개발을 위한 Git, GitHub 시작하기"라는 책을 샀는데 프리코스를 진행하면서 배운 내용을 적용해 볼 수 있었으면 좋겠습니다.
자바스크립트를 공부하기 위해 모던 자바스크립트
책을 샀었는데 프리코스 이전에는 두꺼운 책의 두께에 놀라 어디서부터 시작해야할지 조금 막막함을 느꼈습니다. 프리코스를 진행하면서 문제 해결에 필요한 부분을 찾아서 공부했기 때문에 제가 필요한 부분에 대해서는 다른 부분 보다 더 집중하면서 공부할 수 있어 좋았습니다.
7번 문제를 풀면서 어떤 자료구조를 사용해야 간단하게 구현하면서 시간복잡도를 줄일 수 있을지 고민하는 과정에서 시간을 많이 썼던 것 같습니다. 처음엔 친구관계를 인접행렬로 나타내서 사용자가 함께 아는 친구 수로 점수를 계산할 때 좀더 빠르게 처리할 수 있도록 해주려고 했으나 모든 사용자 목록이 주어진 것이 아니어서 처리가 지저분해질 것 같았습니다. 그래서 자바스크립트의 Set
객체를 찾아보았고 set.has()의 시간복잡도가 O(1)이라는 것을 알아내서 친구관계를 Map객체로 저장(key: 아이디, value: Set([친구1, 친구2, ...]))한 후 각 사용자별 친구들을 set객체로 저장하여 현재 사용자와 함께 아는 친구가 있는지 비교해주었습니다. 이렇게 구현을 하면서 제가 주로 사용하던 언어인 파이썬과 비교가 되는 부분이 있었는데 파이썬에서 dict[key]형식으로 접근하거나 dict[key] = change_value로 값을 바꾸는 것을 자바스크립트의 Map이나 Set객체에서는 할 수가 없어서 불편함을 느꼈습니다. 그래서 또 알아보니 자바스크립트의 객체는 위와 같은 방식으로 사용할 수 있으며 hasOwnProperty() 연산도 시간복잡도가 O(1)이라는 것을 알게 되었습니다. 그래서 다음에 비슷한 경우가 있을 때 자바스크립트 Object
를 사용해봐야겠다고 생각했습니다. 또한 아직 자바스크립트에 익숙하지 않아서 프론트엔드 동료분들이 공유해주신 자바스크립트 내장객체에 관한 포스팅을 읽어볼 생각입니다.
그리고 문제를 푸는 과정에서 테스트케이스에 포함되지 않은 예외사항들을 생각하는 과정에서도 어려움을 겪었는데요.. 7번 문제의 경우 user의 친구가 없는 경우, 유저의 친구들을 저장한 set이 생기지 않아 undefined인지 확인하는 코드를 추가해야했습니다. 위와 같은 예외사항은 슬랙에 테스트케이스를 공유해주었던 예비크루들 덕분에 발견할 수 있었습니다.(하지만 이렇게 테스트케이스 공유를 하는 것은 지양해야한다고 하니 이제 직접 많이 많이 고민해봐야겠습니다.) 이것 외에도 문제에 나와있지 않았던 문자열 비교 기준에 대해 슬랙에 질문을 올렸었는데 다른 크루들이 참고할 만한 사이트를 알려주는 등 도움을 많이 주었습니다. 이렇게 예비크루들에게 도움을 받고 다른 예비 크루들이 슬랙에서 서로 도움을 주고 받는 모습을 보면서 무언가 든든함(?)을 느꼈습니다. 그리고 프리코스에서 매주 과제가 진행되다보니 매주 뚜렷한 목표가 있어서 주어진 과제를 풀고 공부하는 과정에서 정말 큰 즐거움을 느꼈습니다. 그리고 1주차 과제를 수행해보니 더욱 배움에 대한 욕심이 생긴 것 같습니다. 2주차도 행복하게! 파이팅!
Be the best version of you!