twittler 구현 완료!
구현은 다 했는데 뭔가 찜찜했다. 그 까닭은 급하게 기능을 구현한다고 코드를 허겁지겁 짰기 때문이다. 전체적인 그림을 그리고 어떤 데이터가 주고 받는지 도식화, 그림으로 그려보는 과정이 생략되었다. 어떤 예외처리가 필요한지 논의도 없었다. 다음주에 있을 solo week 기간 동안 혼자서 다시 만들어보면서 해봐야지!
함수형 프로그래밍을 잘 보여주는 배열메소드 직접 구현해보기
끄아... 오늘 하루 종일 머리가 지끈지끈하다.그래도 오늘 하는 내용은 함수형 프로그래밍을 이해하는 데 크게 도움이 되었다. 딱 한 가지 기능을 하는 함수. 한 번 만들면 다음 함수를 만들 때 갖다 써서 계속해서 재사용하는 패턴으로 진행했다. 어떻게 하면 간결하게 작성할 수 있을지도 고민했다. for문을 너무 많이 돌리는 것 같아 마음에 안 든다. --;; 페어분 덕분에 비슷한 패턴을 묶어서 처리하는 방법도 알게 되었다. 나중에 실제로 구현된 코드를 보면서 아이디어를 정리해봐야겠다.
rest parameter 과 spread 연산자
악!! rest parameter랑 spread 연산자랑 같은 기능을 한다고 오해했다 ㅋㅋrest parameter는 배열로 묶는 거고 spread연산자는 제일 바깥에 있는 차원의 배열을 벗겨내는 거였다 ㅜㅜ 어쩐지 파라미터로 rest parameter를 썼는데 인자로 spread연산자를 써서 말짱 도루묵이 되더라니...
office hour
오늘 office hour 시간에 또 다시 전체 수강생 앞에서 마이크를 켰다. 그래도 처음보다는 덜 떨렸다. 분명 머릿속에서 알고리즘을 짠 후 코드를 작성했음에도 불구하고 내가 어떤 식으로 코드를 작성하게 되었는지 말하려니 머릿속이 하얘졌다... 겨우 멘탈을 붙잡고 설명을 했다. 호호... 그런데 기존에 있던 메서드를 사용하는 사람들이 속출했으닠ㅋㅋㅋㅋ 코치님이 다음 기수부터는 더 엄격하게 테스트 케이스 짜신다고 ㅋㅋㅋㅋ 그래도 한줄 코딩 참 신기하다! 다른 사람들의 코드를 엿볼 수 있어서 좋다. 이런 시간이 많았으면! 아마 이머시브 가면 더 많이 보겠지??
같은 기수의 수강생분께 DM을 받다
twittler 필터링 구현 중 막힌 부분이 있어 도움을 요청했다. 흔쾌히 Ok했다. 정규시간이 끝나고 늦은 밤시간에 줌을 사용해서 코드를 봐드렸다. 그 과정에서 내가 교육컨텐츠, 코딩교육에 관심이 많다는 걸 상기시키게 되었다. 앞으로 취업관련 정보를 찾을 때 교육계열로 찾을 것이다. DM주신 분도 내가 그런 쪽으로 잘 맞는 것 같다고 말씀해주셨다.
재귀함수를 활용하는 과제
ㅠㅠ 페어분과 연락이 닿지 않는다.. 어쩔 수 없이 혼자서 진행했다. 점심 먹고 나서인지 집중이 안 된다. 페어분이 있었으면 억지로라도 할텐데 빈둥거리게 된다. 혹시나 나처럼 혼자서 진행중인 분이 계실까 해서 슬랙에 올렸지만 아무도 연락이 없다. ㅋㅋ;; 우쨌든 해야지 뭐.
처음부터 모든 예외사항을 고려해 수도코드를 작성하려니 도저히 머리가 안 돌아간다. 흠.. 테스트주도개발 강좌편에서 봤던 것처럼 도전! 일단 처음엔 단순하게 시작한다. 배열,객체 다 무시하고 undefined, function부터 예외처리한다. 그 다음, 원시값들(string, number, null, true,false)이 들어올 경우를 조건문으로 처리한다. 그리고 디버깅한 결과값과 실제 JSON.stringfy의 결과값이 일치하는지 대조한다. 잘 되면 1차원 배열로 넘어간다. 단순하게 숫자만 있는 경우, 문자열이 있는 경우, 여러 조합으로 있는 경우, 다차원 배열일 경우 등으로 한 단계 심화시켜서 디버깅 , 비교대조를 진행했다. 이렇게 하니 거대했던 문제가 하나씩 해결되면서 점차 구현이 되고 있다. 복잡한 문제는 단순하게 시작하라는 말이 이거구나!
시간 복잡도를 보고 나서...
뒤죽박죽한 데이터를 O(n) 정도로 걸리게 만들기 어렵다. 그래서 애초에 O(1) 혹은 O(n)의 시간이 걸리게 끔 데이터를 잘 짜는 게 중요한 것 같다. 전달받은 데이터가 정렬되어있다면 당연히 코드를 짤 때도 수월하고 빠르게 처리, 연산을 할 수 있겠지. 데이터 구조를 짜는 거에 관심이 많기 때문에 이 강좌에 눈길이 더 간다.
twittler에 적용해보자면 유저 자신이 올린 메세지만 확인하고 싶을 때 애초에 유저가 쓴 메세지들을 묶어서 보관해둔다면(배열) 다른 유저들의 메세지들에 뒤섞인 해당 유저의 메세지를 찾는 과정이 생략되니 더 효율적이다. 추가로 메세지 id를 만든 순서를 의미하는 index값을 포함시켜 생성한다면 O(1)로 메세지를 찾을 수 있겠지?
재귀함수과제에 적용해 본다. 맨처음에 파라미터가 function과 undefined이면 함수를 종료시키는 조건문(반환값은 결국 undefined)를 사용하지 않고 모든 요소를 검사해서 undefined, null값이 있는지 확인하고 문자열 null로 바꿔줬다. 그렇다보니 시간복잡도는 증가하고 재귀함수의 본 목적을 상실한 것 같아서 고민했다. 차라리 다 끝난 결과를 한 바퀴 돌면서 검사하는 게 아니라 그때 그때 문자열 null로 변경하는 건 어떨까? 해서 생각한 결과 || 연산자를 활용한 것이다. 재귀함수의 결과가 function,undefined 조건문에 해당하면 반환값이 falsey하니 || 연산자 뒤에 있는 값이 자동으로 할당된다! 이렇게 하니 오직 재귀함수를 호출하면서 문제가 해결되었다.
테스트빌더의 다른 용례를 찾았다.
위에 언급했듯이 거대한 문제를 쪼개서 탑을 쌓듯이 기능을 추가하여 최종 완성본을 만들기가 있고, 더불어 특정 기능을 동료에게 구현해달라고 부탁할 때 그 기능이 작동하기 위한 조건들을 담긴 테스트 빌더를 준다면 원하는 기능이 무엇인지 분명하게 전달할 수 있다.
재귀함수과제 완료!
오늘은 페어분과 같이 진행했다. 전날 심한 몸살감기 때문에 연락이 닿지 않은 거였다. 나도 요즘 체력이 많이 안 좋아지고 있다. 매일 밖에서 산책 꾸준히 해야지. 쉬는 시간 틈틈히 스트레칭과 근력운동도 하고.
여느때처럼 수도코드를 작성하면서 진행했다. 페어분이 워낙 꼼꼼한 분이라 수도코드가 엄청 상세하게 작성되었다. 나는 살짝 귀찮아서 대충 쓸 때가 있는데 페어분이 덕분에 좋은 코딩방법을 알게 되었다고 말씀하셔서 뜨끔했다;; 수도코드는 작성하고 난 후 절대 손 대면 안 되는 것이 아니라 코드를 작성하면서 빈틈이 보일 때 다시 수정하는 게 좋은 것 같다. 또 귀차니즘(ㅋㅋ)에 수도코드의 변경사항을 발견해도 내버려뒀는데 페어분과 같이 하니 모범(?)을 보여야 할 것 같아 계속 수정을 했다. 나중에 혼자서 남은 기능을 구현할 때 꼼꼼한 수도코드 작성이 도움되었다!
재귀함수는 첫 시작을 아주 작은 기능, 하나의 데이터만 처리하는 것부터 생각하고 작성하면 문제가 수월해진다. 재귀함수가 안 익숙할 땐 함수 안에 재귀할 함수를 선언하고 호출했다. 그 까닭은 계속 유지해야할 변수를 재귀함수 밖에 둬야 한다고 생각했기 때문이다. 처음 재귀함수를 호출할 때 넘겨준 인자를 활용하니 그 문제가 해결되었다. 파라미터의 디폴트값을 지정할 수 있다는 점도 활용하면 좋다.