지금까지 이 블로그는 꽁꽁 숨겨왔다. 하지만 한두 명에게 들키기 시작하더니, 어느새 열 명이 넘는 사람이 알게 됐다. 😂
여기에는 나의 단점도, 장점도, 생각들도 가감 없이 적혀 있다. 그래서 독자를 두지 않았었다. 누가 읽는다고 생각하면 괜히 걱정이 앞서니까. 혹시라도 아무렇지 않게 쓴 글에 나에 대한 오해가 생기면 어쩌나, 그런 생각이 드니까.
그래도 솔직하게 써야겠지. 그러려고 쓰는 글이니까!
1) 상대방이 의견을 이야기하면, 내가 제대로 이해했는지 먼저 확인하려고 했다. ‘아, 그러면 ~인 거구나?’ 하고 다시 정리해서 물어보고, ‘이건 ~점에서는 좋겠다’처럼 먼저 긍정적인 피드백을 전했다. 그다음에 궁금하거나 고민되는 부분이 있으면 ‘근데 이런 점에서는 문제가 있지 않을까?’ 하고 자연스럽게 이어갔다. 사소하지만, 먼저 긍정적으로 반응하는 게 상대의 의견을 존중한다는 느낌을 줄 수 있어 좋았다.
2) 개념적인 설명을 할 때는 예시를 들어서 설명하려고 노력했다. 최근 우디네 회고 스터디에서도 ‘나는 요즘 의식적으로 어떤 문제를 해결하려는지 명시하고 대화를 하려고 한다’는 얘기를 할 때, 문제에 대한 예시로 이벤트 내에서 setState가 일괄처리된다는 것을 들어 설명했다. 다만 아쉬웠던 점은, 말로만 예시를 들다 보면 설명이 한계에 부딪힐 때가 있다는 것. 조금만 복잡해져도 말로만 전달하기가 어렵다. 앞으로는 노트든 뭐든 들고 다니면서 생각을 그리거나 시각화해서 설명해보면 더 잘 전달할 수 있을 것 같다.
3) 상대의 장점을 보는 연습은 머핀에게 많이 배웠다. 내가 아는 사람 중에 가장 긍정적이고, 타인의 좋은 점을 잘 발견하는 사람이다. 머핀과 함께 있으면 나도 모르게 그 사람의 장점을 보게 된다. 저번에 어떤 사람이 혼자서 10분 넘게 계속 이야기하던 상황이 있었다. 나는 ‘이제 마이크를 넘겨야 하지 않을까’ 하는 생각만 하고 있었는데, 머핀은 그 사람의 ‘용기 내어 마이크를 잡은 모습이 멋지다’고 말했다. 나는 그 사람의 긴 발언만 신경 쓰느라 그 안에 있던 긍정적인 면은 전혀 보지 못했던 것 같다. 부정적인 마음만 쌓이면 상대가 부정적으로만 보일 수도 있는데, 머핀 덕분에 좋은 점도 함께 떠올릴 수 있었다. 앞으로도 누군가에게 그런 마음이 들면 그건 그럴 수 있는 일이고, 잘 처리하되 그 뒤에는 꼭 그 사람의 좋은 점도 다시 바라보려고 한다.
클린코드는 무조건 좋을까?
클린코드란 뭘까? 유지보수하기 좋은 코드일까? 그럼 무조건 좋을까? 언제나 좋을까?
이를 레벨 2 페이먼츠 미션에서
아래 요구사항을 만족시키기 위한 과정에서 생각하게 되었다.
카드사 식별 번호 구분 규칙
Visa 카드와 Master 카드의 앞 번호의 규칙은 아래로 통일해서 진행한다.💡 카드 브랜드 구분 로직 (Visa / MasterCard)
Visa: 4로 시작하는 16자리 숫자
MasterCard: 51~55로 시작하는 16자리 숫자
당시에 미션 제출까지 남은 시간이 얼마 없어서 이 구현에 많은 시간을 쓸 수 없었다.
그래서 prefixes
를 하드 코딩했고 시간 내에 구현을 마무리 할 수 있었다.
하지만 아래 방식은 확장 가능한 코드는 아니다.
const CARD_NETWORKS = [
{
name: "visa",
prefixes: ["40", "41", "42", "43", "44", "45", "46", "47", "48", "49"]
},
{
name: "master",
prefixes: ["51", "52", "53", "54", "55"]
},
];
const getCardNetwork = (number: string) => {
return CARD_NETWORKS.find((network) => network.prefixes.includes(number));
};
예를 들어, 요구사항이 조금이라도 바뀌어서 다음과 같이 된다면?
visa
가 4로 시작하는 16자리 숫자가 된다면,visa
가 451~455로 시작하는 16자리 숫자가 된다면, master
의 51~55로 시작하는 16자리 숫자와 포함하는 수지금 짠 로직은 prefixes
의 범위를 수정해도 master
를 찾지 못한다.
(visa
가 master
의 문자열을 포함하는 상태이기 때문이다. 예, 51 ⊂ 451)
CARD_NETWORKS.find((network) => network.prefixes.includes(number)); // master 못 찾음!
다시 코드를 Refactiong 했을 땐 다음과 같이 작성했다.
시간복잡도는 O(n)에서 O(1)으로 줄었고,
visa
가 451~455로 요구사항이 변경돼도 조건문에 조건만 조금 수정하면 되기에 메인 로직 자체는 문제가 없다.
type CardNetwork = 'visa' | 'master' | 'unknown';
export const getCardNetwork = (number: string): CardNetwork => {
const prefix = parseInt(number.slice(0, 2), 10);
if (prefix >= 40 && prefix <= 49) { // 문제없이 visa를 찾음!
return 'visa';
}
if (prefix >= 51 && prefix <= 55) { // 문제없이 master를 찾음!
return 'master';
}
return 'unknown';
};
사실 나는 Before, After 둘 다 괜찮다고 생각했다.
Before는 확장 가능성이 높지는 않았지만, 미션 제출까지 남은 시간을 고려해 선택한 방법이었다. 요구사항에 맞게 동작한다는 점에서 충분히 의미가 있었다. 코드의 목적은 결국 동작 가능에 있기에, 동작 가능한 코드보다 클린 코드가 우선일 수는 없다고 생각했다. 클린 코드인데 동작하지 않도록 제출하면 그게 무슨 의미가 있을까.
그러면서 추가적으로 든 생각은,
클린 코드만을 지향하다 보면 성급한 기술 도입이나 과도한 추상화로 이어지기 쉬운 것 같다. 예를 들어, 무조건 재사용성을 목적으로 두고 과도하게 컴포넌트를 나누고 추상화 시킨다던가. 클린 코드라는 목적에 빠져 "왜 이렇게 해야하는가"에 대한 이유를 잊게 되는 것 같다.
그래서 항상 "시간 대비 이게 정말 필요할까?", "이 기술이 어떤 가치를 줄 수 있을까?"라는 질문을 먼저 던지는 게 좋을 것 같다.
나의 강점이나 장점을 아는 것도 중요하다고 생각해서
누가 칭찬해주면 일단 적으려고 한다!
같은 칭찬이 여러 번 쌓이면 정말 내 것이고 강점이 아닐까?
이번 주는 정신이 없어서 마음이 복잡했다.
레벨 2가 되면서 새로운 데일리조 사람들과 첫 회식도 하고, 리액트 스터디를 시작했고, 영어 레벨 테스트도 봤다. 첫 미션도 진행 중이다. 신경 쓸 것이 이만저만이 아니다.
새로운 일들이 쉴 틈 없이 이어진 한 주였다. 다음 주에는 영어 스터디까지 시작된다.
하하하... 처음은 언제나 쉽지 않다.
안녕하세용~
투두 메이트로 하나씩 투두 리스트를 지우는 것부터 블로그 글까지.... 👍
본인의 성장에 진심이신 분이구나 느꼈어요.
회고 내용에서 공감되는 부분도 많았고, 반대로 개념적인 설명을 하실 때 저는 "와~ 이해가 잘 되도록 설명 잘 하신다." 라고 생각했어요 ㅋㅋㅋㅋㅋ