"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬받아 작성된 서평입니다."

미니멀리즘 프로그래머
"이 책에 정답은 없습니다. 사람마다 상황이 다르니까요. 대신 저는 단순함이 간절히 필요했던 여러 상황을 설명하고, 그 상황을 단순하게 만들기 위해 제가 어떤 조치를 취했는지 이야기하겠습니다."
매번 느끼지만, 누군가의 이런 실무적인 경험을 듣는 것은 어렵습니다.
작가는 복잡성에도 과학적 방법론을 적용하고자 합니다.

현황파악, 실행, 학습
작가는 모든 섹션을 Practice(실천법)이라고 합니다. 몸에 배도록 반드시 연습해야하기 때문입니다.
이 실천방법에는 현황파악(복합적 복잡성 인지하기), 실행(시도하기), 학습(행동 조정하기)을 자주 반복하여 자연스럽게 할 수 있데 되도록 하고자 합니다.
PRACTICE 1. 코드 다이어트하기
세상이 너무 발전해서 메모리가 커지고, 클럭도 커졌습니다. 마찬가지로 코드도 점점 비대해지고 있습니다.
그 결과 코드를 이해하기도, 유지보수하기도, 배포도 어려워집니다.
이번에 해커톤에 참여하면서 AI 를 활용했었는데,
코드가 너무 빨리 작성되다보니 이제 코드를 읽고 이해하는 것 자체가 어려워졌습니다.
그러니 이제는 코드를 줄여가야합니다.
아래는 작가가 표현한 의존성 그래프입니다.

npx create-react-app my-app 명령어로 기본 리액트 앱을 만들면 874개의 모듈이 다운로드합니다.
(단순히 기본 설정만 이정도 인데, 코드를 작성하면 더 많은 의존성이 생깁니다.)
의존성이라는 것은 미래의 통제권을 남에게 넘겨주는 것이라고 볼 수도 있습니다..
그래서 수 많은 의존성에서 한명이라도 나쁜 맘을 가지면 나의 앱이 무너질 수 있습니다. + 보안상의 문제도 있습니다.


의존성 결정 체인
PRACTICE. 프레임워크: 성분표 꼼꼼히 확인하기
요즘에는 대부분의 프로젝트가 프레임워크 위에서 돌아갑니다.
프레임워크를 사용하면 편리합니다.
대신에 안전성이 입증된 프레임워크를 선택하고, 필요한 기능을 갖추되 가장 가벼운 것이 좋습니다.
이해할만큼 작다면 유지보수하기도, 새로운 개발자가 투입되기도, 다루기 쉬워집니다.
저는 예전에 딥러닝을 배울 때, Tensorflow 를 썻었는데 버전업이 되면서 많은 코드를 수정해야했습니다.
플러터가 활발히 개발중일 때도 진입했었는데, 이후에 많은 부분이 바뀌었습니다.
그 이후부터는 새로 급부상하는 프레임워크는 안정화되기를 기다리게 되었습니다.
최근에는 AI 관련된 라이브러리들도 많이 나오는데,
다음날 되면 또 새로운 라이브러리의 인기가 급부상합니다.
트렌드를 타는 라이브러리나 프레임워크는 자제하는게 좋습니다.
PRACTICE3. 기능은 적을수록 좋다.
회사에서도 기능을 있으면 좋을거 같다고 많이 추가합니다. 이런걸 골드 플레이팅이라고 하죠.
하지만 단순히 좋다고 생각해서 소프트웨어에 기능을 추가하면 미래의 부채로 돌아옵니다.
책에서는 소프트웨어 개발을 할 때 필요할지도 모르는 기능을 모두 요구사항에 집어넣고 계획서를 작성하는 방식을 활용하는 것을 많이 본다고 합니다. 나중에 필요 기능을 추가할 예산을 못받을수도 있으니까요.
하지만 작가는 더 애자일하게 접근하는 방식을 제안합니다.
"무엇이 필요한지 묻는 대신 "이 프로젝트에서 어떤 가치를 기대하세요? 그리고 그 가치들의 우선순위는 어떻게 되나요?"

필요 주도 개발
그 우선순위를 통해 단계적 소프트웨어 개발을 제안합니다.
예전에 사수분한테도 비슷하게 들었는데,
고객에게 이렇게 선택지를 제안하면, 이를 받아들이는 고객도 이 상황을 인지하고 결정할 수 있어서 나중의 충돌을 피할 수 있다고 했었습니다.
PRACTICE 4 팀의 결합도 낮추기
코드를 단순화하는 방법을 프로젝트에, 팀에 적용하면 좋은 효과를 얻을 수 있지 않을까? 라는 생각에서 시작됩니다.
시간적 결합(커플링)을 줄여야합니다.
예를 들어, 다른 사람이 검토를 해야지만 다음 단계로 넘어간다던가.
어떤 것을 고쳐야하는데 관련 코드의 담당자가 휴가중이라던가.
담당자가 회의에 참석하여 대화를 할 수 없다던가.
그리고 이벤트 주도 시스템 같은 방식을 줄여야합니다.
먼가 문제가 터지면 일을 중단하고 문제를 처리합니다.
그리고 다른 사람들을 끌어들이게 되고, 집중이 꺠지는 균열이 퍼져나가게 됩니다.
이런 것을 해결하기 위해서 특별한 방법이 있는게 아니다.
왜냐하면 코드 리뷰의 피드백이 어떤 형태인지 등 상황에 따라 다르게 적용해야하는 부분들이 있기 떄문이다.
그러니 아래의 사진에 나온것처럼 자신의 상황을 검토하고 방법을 찾아보는 것을 추천한다.

결합도 낮춰보기
PRACTICE 6. 굳이 회의를 해야 한다면 생산적으로 하자

생산적으로 회의하기
가장 기본적인 부분들을 제안한다.
하지만 기본을 제일 지키기 어렵다. 기본적인 사항들만 잘 지켜도 단순함이 올라간다.
- 명확한 목표 설정 : "이 회의를 왜 하는가?"
- 회의가 필요한지 확인하기 : 일보다 회의가 쉽기 떄문에 자주 열린다.
- 준비 : 참석자에게 자료를 전달하고, 설명이 아닌 논의를 할 수 있도록 만듭니다.
- 참석자 선택 : 결과를 도출하는데 실질적으로 필요한 사람을 선정합니다.
- 회의 일정 : 회의에 적절한 시간대는 없다. 일을 중단시키지 않는 구간에 일정을 잡는다. 아예 회의를 안하는게 제일 좋다.
- 진행 방식 : 회의의 측정가능한 결과를 이해해야합니다. 모든 살마이 의견을 낼 수 있어야합니다. 속도를 조절하여 시간안에 끝내야합니다. 종료 이후의 여유시간을 확보해놓아야합니다.
- 정리 및 후속 조치: 합의 내용을 정리하여 모두에게 보내야합니다.
PRACTICE 7. 보유한 기술 널리 퍼뜨리기
가르치다보면 새로운 인사이트를 많이 얻습니다.
지식의 저주라고 아시나요?
내가 아는 것을 남도 당연히 알 것이라고 착가하는 상태입니다.
이는 나 스스로도 왜 그런지(원리)를 잊어버리는 상태에 빠지게 만듭니다.
그래서 다양한 사람과 의견을 나누는 것이 중요합니다.
책에서는 다양한 분야의 역량을 가진 사람으로 팀을 구성하라고 하지만,
동일한 분야이더라도 충분히 얻는것이 많은 것 같습니다.

PRACTICE 8. 정보를 자유롭게 흐르게 하기
구성원은 정보에 자유롭게 접근할 수 있어야하고, 질문하기 쉬워야합니다.
정보가 너무 자연스럽게 존재해서 인지하지도 못하고 흡수하는 환경을 조성해야합니다.
무엇을 하든 정보의 흐름을 보장하려면 의사소통을 적극적으로 관리해야합니다.
사적으로 축적한 지식은 썩습니다. 예를 들면, 팀 내부에서만 쓰는 용어 같은게 있습니다.
공유된 지식은 누군가의 아이디어를 확장시킵니다.
지식 공유를 중요하게 여기는 팀은 모든 구성원이 누구나 남을 가르칠 수 있고 배울 것도 있다는 사실을 분명히 합니다.
질문을 제기하고 이슈를 논의하도록 권장합니다.
이러한 문화를 위한 방식으로 추천하는 방식입니다.


정보를 공유하도록 개선하는 방법
하지만 이런 방식들은 경영진의 확실한 동의와 지원이 필요합니다.
이런 활동들은 단기 성과를 내야하는 관리자의 인센티브에 역행하기 때문입니다.
이 외에도 다양한 PRACTICE 들이 많이 나옵니다.
코드 작성시에도 적용하면 좋을 만한 내용들이 많이 나옵니다.
(저는 이미 거의 아는 부분이라 패스했지만요.)
마지막에 가장 중요한 질문이 나옵니다..
"어떤 방식이 다른 방식보다 더 단순하다는 걸 어떻게 판단할 수있을까?"

단순하다고 말할 수 있을려면
위 이미지를 첨부하며 이 책의 리뷰를 마치겠습니다.
책이 두껍지도 않고 약간의 시간을 내면 금방 읽을 수 있습니다.
짧은 책이지만 좋은 내용들이 많이 포함되어 있습니다. 읽어보시길 추천드립니다.