Search
Duplicate

2021년 11월 3주차 회고록 - 준비

쇼미더머니는 보질 않지만 이 노래는 좋더라구요. ㅎㅎ 지올팍 노래 듣다가 생각나면 한 번씩 듣는거 같습니다.

1. 컨디션 난조

30대가 되고 가장 크게 느끼는 단점이 바로 컨디션관리가 조그만 소홀해지면 일상생활에 바로 지장이 생긴다는 것이다. 한 주간 컨디션을 제대로 관리못하니 기운없음, 몸살기운, 편두통등으로 집앞 카페를 갔다오기만해도 땀을 줄줄 흘리고 만다. 그러다보니 개인공부는 겨우겨우 진도를 나가고 그나마도 집중하기가 힘들었던 것 같다.
퇴사를 하고난 뒤에 가장 주의해야 할 부분도 규칙적인 생활 사이클을 유지해서 컨디션을 관리하는게 어떻게보면 제일 중요할 것 같다는 생각이 든다. 내가 몸으로 겪으면서 지켜야겠다고 생각하는 규칙이 있다.
1.
너무 적지도 많지도 않은 숙면시간
: 너무 적게자면 당연히 피곤하기에 힘들고, 반대로 8시간 이상 너무 많은 잠을 자게 되면 허리도 아프고 오히려 편두통이 하루 종일 지속되는 것 같다. 눈도 둔중히 통증이 있는데 구글링을 해보면 척추측의 문제로 두통과 눈의 통증이 올 수도 있다고 한다...
2.
커피는 정말 피곤하거나 컨디션을 잘 체크해서 마시자.
: 휴식을 잘 취했다는 가정하에 카페인 음료 혹은 커피를 먹으면, 각성상태가 되는데 문제는 차분한 집중이 힘들다. 운동 혹은 단순 아는 지식을 활용한 코딩을 할 때는 문제가 되지 않지만, 차분하게 책을 읽거나 강의를 볼 때는 조급함이 커지고 산만해지는 것 같다. 또한 오전부터 커피를 먹다보면 오후에 진이 빠져버리는 것도 있는 것 같다.
3.
과식은 금지
: 배갑 부를정도로 음식을 먹으면 소화하는데 에너지를 사용해야 하기 때문에 집중력을 떨어트리고 혈류량이 위장 근육으로 쏠리면서 뇌로 올라가는 혈액량이 감소해서 뇌는 활동량을 줄이려 하고 그 결과 졸음과 잠이 온다고 한다. 즉, 에너지를 소화에 몰아주면서 에너지가 부족한 부분이 절전모드가 된다는 것이다.
그렇기에 식사는 항상 약간 부족한 정도로 해줘야 할 것 같다.
4.
집중이 안되면 일단 나가자
: 집중이 안된다고 웹서핑하거나 소파에서 빈둥거리다보면 금새 서너시간씩 흐르는 것 같다. 그러다보면 3시간 공부하고 소파에서 7시간 멍때리고 있는 경우도 생긴다. 그래서 어떻게 해야할까 고민을 해봤는데, 공부가 적당히 안될때는 메신저나 기타 방해될만한 요소를 치우고 다시 도전해보는 것이고, 그래도 안된다면 바로 밖으로 나가 산책 혹은 카페에가서 공부를 하면서 텐션을 올리는것도 괜찮은 것 같다.
적어도 카페에가서 공부가 안된 적은 거의 없으니.. 귀찮다고 씻기 힘들다고 안나가는 경우가 많았는데, 고쳐야 할 것 같다.
지금은 적어도 이 4가지만 지켜도 헛짓한다고 날리는 시간은 많이 줄 것 같은데 이 결과는 4주차의 후기로 남겨보고자 한다.

2. 내 생각에 매몰되지 말고, 안되면 뒤엎어버리자.

요즘, 리뷰어로 내가 쌓아놓은 코드의 늪에 매몰되어 아무리 수정을하고 리팩토링을 해도 오히려 더 아리송해지는 코드를 만드는 경우를 접하곤 한다. 그래서 생각해보니 내가 미션을 수강 할 적에도 꽤나 자주 그랬던 것 같다.
그런 경우에는 그럼 어떻게 해야 할까? 나는 개인적으로 가능하다면 모두 뒤엎는걸 추천한다.
실제로 나도 미션을 수행할 당시에 피드백이 오면 최대한 빠르게 리팩토링하고 피드백 내용을 정리해서 포스팅하고, 내 지식으로 만드려고 노력을 하고는 했다.
하지만, 몇몇 미션에서는 여러 이유로(미션을 이해못해서, 피드백을 이해 못해서, 내가 잘못된 설계를 해서 등등) 피드백을 다 적용해도 전체적으로 보면 뭔가 엉성하거나 하나의 로직을 위해 수정되야 하는 코드들이 너무 많아지고 테스트 케이스를 작성하려고 하니, 값의 의존성문제로 테스트도 쉽지가 않는 경우가 생기고는 했다.
그럼 해당 과정을 해결하기 위해 억지스러운 코드들이 추가되고 그게 반복되다 보면, 어디서부터 건드려야 할 지 막막한 코드가 되고는 했다.
그런 경우, 내가 감당 가능한 범위에서 모든 소스파일 혹은 패키지까지 날려버리고 처음부터 다시 작성을 하고는 했다. 참고로 마지막 미션을 진행할때는 대략 5번 이상의 프로젝트 롤백을 했던 것 같다.
(3~4번째쯤에 하다가 너무열받고 답답해서 리뷰어님에게 DM으로 저 이제 진짜 못하겠어요. 라는 말을 썼다 지웠다 했었다...)
근데 확실한건 한 번 뒤엎을때마다 적어도 한 군데 이상은 만족스럽게 작성되었던 것 같다.

3. 이펙티브 자바

출퇴근 시점에 이펙티브 자바를 e-book으로 종종 보면서 오고가고는 하는데, 포스팅을 하지는 못한지 좀 된 것 같다. 스트림 API에 대한 내용들은 크게 와닿질 않아서 그런것도 있는 것 같다. 이번주를 끝으로 스트림 챕터를 모두 읽었는데, 마지막으로 본 아이템 48은 스트림 병렬화를 주의해서 적용하라는 내용이였다.
결론부터 얘기하면 Stream에서 iterate이거나 중간 연산으로 limit을 쓰는 경우 파이프라인 병렬화로는 성능 개선을 기대할 수 없다는 것인데, 그 이유로는 스트림 라이브러리에서 해당 파이프라인을 병렬화 하는 방법을 찾지 못하기 때문이다.
public static void main(String[) args) { primes().parallel() .map(p -> TWO.pow(p.intValueExact()) .subtract(ONE)) .filter(mersenne -> mersenne.isProbablePrime(S0)) .limit(20) .forEach(System.out::println); } static Stream<Biglnteger> primes() { return Stream.iterate(TWO, Biglnteger: :nextProbablePrimc); }
Java
복사
스트림을 사용해 20개의 메르센 소수를 생성하는 프로그램
동시성 프로그래밍(Concurrent Programming)을 하기위해서는 항상 안전성과 응답 가능 상태를 유지하기 위해 노력해야 하는데, 위와 같은 경우에는 이 모두를 지키지 못한다. 메르센 소수를 찾는 위 코드는 새로운 메르센 소수를 찾을 때마다 이전 소수를 찾는 시간의 약 두 배를 더 소비하는데 위 코드에서는 그럼 마지막 20번째 메르센 소수를 찾는 동안 작업을 마친 나머지 코어에서 21, 22, 23...번째 메르센 소수를 찾게 될 것이고 이 때 걸리는 시간이 1~20번째 값을 찾는 시간보다 2배, 4배, 8배 더 많기에 정작 20번째까지 계산이 끝나도 로직은 끝나지 않을 것이다.
결국, 스트림 파이프라인을 무작정 썼다가는 안쓰니만 못한 결과라 생길 수 있다는 의미이다.
그럼 언제 스트림 병렬화를 써야할까?
스트림의 소스가 ArrayList, HashMap, HashSet, ConcurrentHashMap과 같은 자료구조처럼 참조 지역성(locallity of reference)이 뛰어난 경우
⇒ 참조 지역성이 낮은 경우 스레드는 데이터가 주 메모리에서 캐시 메모리로 전송되는 동안 하릴없이 대기하고 있게 된다.
스트림의 종단 연산의 동작 방식이 순서에 무관한 경우
또 한가지, Stream의 연산에 사용되는 accumulator(누적기)와 combiner(결합기)는 다음과 같은 법칙을 만족해야 한다.
결합 법칙을 만족해야 한다(associative)
간섭받지 않아야 한다(non-interfering)
무상태를 유지해야 한다(stateless)
이건 로직이 순수성을 가져야 한다는 내용과 유사하다.
그리고 잊어선 안되는 가장 중요한 내용은, 이 병렬화 기능은 결국 로직의 성능을 향상하기위한 최적화 수단이다.
즉, 사용할 수 있다고 사용하는게 아니라 실제 성능을 비교해서 사용할 가치가 충분한지 비교한 뒤 사용 여부를 결정해야 한다.
이렇게 스트림 병렬화에 대한 내용들을 보고나면 드디어 다음 8장 메서드 챕터로 넘어오는데, 이펙티브자바에 지쳤던 내게 다시 흥미를 주게하는 주제들이 많은 것 같아서 다시 포스팅을 시작해야 할 것 같다는 생각을 한다.
해당 챕터에서 개발자들에게 주고싶은 메세지는 메서드를 설계할 때
매개변수와 반환값을 어떻게 처리할 지
메서드 시그니처는 어떻게 설계할 지
문서화는 어떻게 할 지
이런 상황에 대해 다루는데 역시나 이전과 마찮가지로 높은 사용성, 견고성, 유연성에 집중한다고 한다.
그러면서 나오는 아이템 49번과 50번은 매개변수의 유효성검증에 대한 내용과 방어적 복사본 생성에 대한 내용이다. 현재 진행중인 TDD 리뷰에도 관련된 내용이기에, 흥미가 높고 다음 한 주간에는 해당 내용에 대해 포스팅을 진행해야 할 것 같다.

4. 새로운 스터디에 대한 준비

21년 10, 11월은 코드숨, 우테캠프로 프리코스 준비, 알고리즘 스터디, 회사업무 등으로 정말 바쁜 시기였는데, 이제 12월이 얼마 안남은시점에서 남은 스터디가 블랙커피 블로그 스터디를 제외하고는 따로 없는 상황이다.
그래서 우선은 이직을 위해 모의면접 스터디를 하나 가입했지만, 주 2회이기도 하고 추가적으로 부족한 부분에 대한 스터디를 진행을 해야하나 고민이 된다.
개인적으로 하고싶은 스터디가 있다면 알고리즘, 이펙티브 자바, 이직에 도움이 될만한 스터디 하나 정도인데,
고민이 많다. 여러번 스터디를 해 본결과 온라인으로만 진행할 경우 불참에 대한 부담감이 적기 때문에, 스터디가 유지되기 쉽지가 않다. 그럼 오프라인을 병행해야하는데 이럼 거리가 문제가 되고, 리딩을 하는 사람이 누구냐에 따라 스터디가 어찌 될지 모른다는 랜덤 가챠확률이 생기기도 하고, 수준이나 내가 원하는 키워드의 스터디가 내가 갈 수 있는 적절한 위치에 있는지도 고려해야하다보니 요즘 고민이 많다.
그래서 내가 만들자고 생각해도 뭘 할지 귀찮기도 하고.... 아주 급한건 아니니 다음 한 주간은 새로운 스터디에 대해서 고민을 해 볼 필요가 있을 것 같다.