티스토리 뷰
오늘 TIL 3줄 요약
- 의도적으로 프로그래밍하자
- 가장 빠른 알고리즘이 언제나 가장 좋은 알고리즘은 아니다.
- 코드를 리팩토링할 이유는 없다.
TIL (Today I Learned)
2022.04. 02
오늘 읽은 범위
7장. 코딩하는 동안 p273-p348
책에서 기억하고 싶은 내용을 써보세요.
우연에 맞기는 프로그래밍
- 우리는 우연에 맡기는 프로그래밍, 곧
행운과 우연한 성공에 의존하는 프로그래밍
을 하지 않아야 한다. 의도적으로 프로그래밍
해야 한다.- 우연에 기대다 보면 결국 문서화되지 않은 에러나 예외적인 경우의 동작에
의존
하게 되고 만다.
=> 우연에 맞기는 프로그래밍, 나도 종종 해왔던 프로그래밍 방식이다. 기능을 구현해서 테스트코드를 작성하고 테스트는 초록불이 들어왔다.(어떻게 성공했던 걸까..) "음.. 좋아! 잘되네" 거침없이 PR을 보낸다. 우연으로 테스트에 성공한 내 코드는 프로덕션 환경에 배포된다. 조금 지나자 에러 로그가 기록되면서 cs가 들어왔다. 잘 되던 기능이 갑자기 안 된다는 것이다. 그렇다. 나는 내가 작성한 코드가 어떻게 돌아가는지 원리를 잘 파악하지 못한채, 우연히 성공한 테스트에 의존한 것이다. 다시 한 번 더 우연한 성공에 의존하지 않아야 겠다고 다짐하게 되는 구절이었다.
의도적으로 프로그래밍하기
- 언제나 여러분이
지금 무엇을 하고 있는지 알아야
한다. - 더 경험이 적은 프로그래머에게 코드를 상세히 설명할 수 있는가? 그렇지 않다면 아마
우연에 기대고 있는 것
일 터이다. - 자신도
잘 모르는 코드를 만들지 말라
. 완전히 파악하지 못한 애플리케이션을 빌드하거나, 이해하지 못한 기술을 사용하면 우연의 함정에 빠질 가능성이 높다. 이것이왜 동작하는지 잘 모른다면 왜 실패하는지도 알 리가 없다
. 신뢰할 수 있는 것에만
기대라. 가정에 의존하지 말라. 무언가를 신뢰할 수 있을지 판단하기 어렵다면 일단최악의 상황을 가정
하라.- 코드뿐 아니라 여러분이 세운
가정도 테스트
해 보아야 한다. 어떤 일이든추측만 하지 말고 실제로 시험
해 보라. - 앞으로 어떤 것이 잘 돌아가는 듯이 보이기는 하지만 여러분이 그 이유를 모를 경우, 그것이 우연은 아닌지 반드시 확인하라.
=> 기능을 구현하고 코드 리뷰를 할 때, 코드를 왜 이런식으로 작성했는지 상세히 설명하지 못한 경우가 있다. 동작 원리는 잘 모르겠지만 일단 성공했고, 원하는 대로 잘 돌아가는듯 해서 구현이 완료됐다고 했던 것이다. 팀장님에게 자주 들었던 말이 있다. "기술을 사용 할 때는 기술이 어떻게 돌아가는지 파악하고 사용해라, 그렇지 않으면 문제가 발생했을 때 어떻게 대체해야 할지 모르고 최악의 경우엔 작성된 코드를 전부 갈아 엎어야 할 수도 있다." 지금도 이 말을 항상 떠올리며, 의도적으로 프로그래밍하기 위해 노력한다. 확실히 우연에 맡기지 않는 프로그래밍을 하다보니 문제가 발생해도 원인을 이상한데서 찾지 않고, 정확하게 문제점을 찾을 수 있게 된 것 같다.
실전에서의 알고리즘 속도
- 사용하는
알고리즘의 차수를 측정
하라. - O(n2) 알고리즘(선택정렬, 삽입 정렬)이 있다면 분할 정복(퀵 정렬, 힙 정렬)을 사용하여 O(n log n)으로
줄일 수 없는지 시도
해 보라. - 어떤 일을 하는 코드인지
코드 자체에 대해서도 생각
해 보라. - 입력 값 n이 작을 경우, 단순한 O(n2) 코드가 복잡한 O(n log n) 코드보다 더 좋은 성능을 내기도 한다.
- 가장 빠른 알고리즘이
언제나
가장 좋은 알고리즘은 아니다.
=> 알고리즘은 상당히 어려운 학문이다. 아마 개발자로 일한다면 평생 공부하면서 함께 가야 하는 동반자가 아닐까 생각한다. 나는 보통 기능을 완성하고 잘 동작한다면 조금 더 나은 방향의 최적화는 없을지 고민한다. Clean한 코드 작성 방법은 없을지, 3초 걸리는 작업을 1초로 줄일 수는 없는지 말이다. 최적화를 위해 우선 속도가 빠른 알고리즘을 선택해서 코드에 적용해보고 테스트 해보자. 적용 후 속도가 적용 전보다 늦을 수도 있다. 그래도 괜찮다. 우리가 해야 할 것은 항상 실무에 더 적합한 방법은 무엇이 있을지 더 고민하고 시도하는 것이다.
리팩터링은 언제 하는가?
- 여러분이 작년이나 어제, 심지어 10분 전과 비교해서
더 많이 알게 되었다면
, 리팩터링을 한다. - 언제나 바로
지금이 최적기
다. 코드를 리팩터링할 이유는 아주 많다.
=> 코드를 작성하다가 지금 당장은 더러워도 기능이 잘 돌아가니까 다음에 리팩토링해야지 한 적이 있을 것이다. 나도 그랬다. 하지만 그 다음은 절대 오지 않았다. 리팩터링을 다음으로 미루지 말고, 발견한 즉시 실행에 옮기자. 다음은 절대 오지 않는다.
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
스스로 많은 반성을 하게 만드는 내용이었다. 그동안 잘 모르는 내용에 대해서 우연에 맞기고, 리팩토링은 나중에 해야겠다면서 미뤄왔다. 이번 장은 나에게 해주고 싶은 말을 압축적으로 풀어 쓴 내용이란 생각이 들었다. 오늘부로 프로그래밍을 할 때는 우연에 맞기지 않고 의도적으로, 같은 코드라도 더 나은 방법은 없을지, 리팩토링의 진행은 언제나 바로 지금이라는 마음으로 임해야 겠다.
궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
알고리즘은 역시나 어려운 내용이였다. 철저하게 복습해서 내 것으로 만들자!
'Book > 실용주의 프로그래머' 카테고리의 다른 글
Mission: 진짜 요구사항 (0) | 2022.04.04 |
---|---|
[TIL 8] 실용주의 프로그래머 #8. 프로젝트 전에 (0) | 2022.04.03 |
[TIL 6] 실용주의 프로그래머 #6. 동시성 (0) | 2022.03.29 |
Mission: 연습문제 풀이! (0) | 2022.03.27 |
[TIL 5] 실용주의 프로그래머 #5. 구부러지거나 부러지거나 (0) | 2022.03.26 |
- Total
- Today
- Yesterday
- 파이썬
- 데이터베이스
- 김영한
- 알고리즘
- 리팩토링
- 릿코드
- webflux
- kotlin
- Real MySQL
- 노마드
- Refactoring
- 문자열
- spring boot
- 코테
- 스프링
- 북클럽
- 인프런
- 자료구조
- 코틀린
- Spring
- 백준
- MySQL
- mysql 8.0
- 노마드코더
- 정렬
- 그리디
- 구현
- 스프링 부트
- leetcode
- Algorithm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |