링크드인에 있던 글을 지우고, 개인 블로그에 옮겨 적습니다.
소프트웨어 개발에 대한 생각
최근 머릿속에 떠다니던 소프트웨어 개발에 대한 몇 가지 생각을 정리했습니다.
논리적인 비약이 있을 수도 있습니다.
1. 소프트웨어의 복잡도는 지속적으로 증가한다.
이는 마치 “엔트로피는 항상 증가한다”는 열역학 제2법칙과도 같다.
통계역학적으로 엔트로피는 주어진 거시적 상태에 대응하는 미시적 상태 수의 로그(S=klnW)로 생각할 수 있다.
6장의 카드를 두 개의 방에 3장씩 흩뿌려놓는 것과 한 개의 방에 전부 흩뿌려놓는 것을 생각했을 때,
전자의 엔트로피 합은 3.58(ln(3!) + ln(3!))인 반면 후자는 6.58(ln(6!))이 된다.
따라서 인위적인 에너지로 시스템 전체의 엔트로피를 감소시켜야 하는 개발자의 입장에서 고립계 별로 operation을 분리할수록 유리하다.
쉽게 말하면, 특정 클래스나 함수가 단순한 기능을 할수록 시스템의 전체 복잡도를 낮출 수 있다.
2. 기술 부채는 계산이 가능하다.
기술 부채 = 개선에 필요한 시간 * 인건비
재무상태표에 적히지 않지만 기술 부채는 기업의 건전한 재무관리를 위해 명확히 인식되고 관리되어야 한다.
기술 부채가 결코 나쁜 것은 아니다. 오히려 빠른 성장을 위해 반드시 필요하다.
부채의 비용보다 부채를 통해 얻은 이윤이 더 크다면 성공이다. 이를 흔히 레버리지(leverage)라고 부른다.
다만 기술 부채를 부채로 인식하지 못하고 마구잡이로 사용하면 결국에는 복리의 마법을 경험하게 된다.
3. 클린코드는 린하다.
린 방법론의 핵심은 불필요한 비용을 줄이는 것이다.
필요하지 않을 지도 모를 무언가를 위해 자원을 낭비하기 보다 빠르게 프로토타이핑하여 빠르게 시장의 평가를 받는 것이다.
클린코드를 위해서는 많은 고민이 필요하다.
때로 오버 엔지니어링이라고 생각할 수도 있다.
하지만 불필요한 비용을 줄이기 위해 더욱 클린코드가 필요하다.
개발자는 대부분의 시간을 코드를 읽는데 사용한다.
따라서 깨끗하지 않은 코드는 이해하는데 불필요한 시간이 낭비된다.
서비스가 빠르게 변화하는 만큼 소프트웨어도 기민하게 대응할 수 있어야한다.
깨끗한 코드는 언제든지 쉽게 수정할 수 있다.
리팩터링 할 수 없는 코드는 잘못 짜여진 코드다.
왜 나는 소프트웨어 개발을 좋아하는가?
인간은 사회적 동물이고, 다른 사람들과 끊임없이 상호작용 한다.
사회적 활동의 진정한 아름다움은 다른 사람의 삶에 영향을 줄 수 있다는 것이다.
인간이 만들어낸 문명과 기술은 이런 영향력을 더욱 증폭시킨다.
사소한 말과 행동이 물리적인 한계를 뛰어넘어 지구 반대편 사람의 삶을 바꿀 수도 있다.
그런 측면에서 소프트웨어 개발은 매우 효율적이다.
상대적으로 적은 노력으로 아주 큰 파급력을 일으킬 수 있다.
한 줄의 코드일지라도 세상에 더 긍정적인 영향을 주고 싶다.
개발자와 글쓰기
개발자에게 글 쓰는 능력은 중요하다.
글쓰기 능력이 뛰어나면 개발 문서부터 복잡한 테크니컬 라이팅까지 직접적인 업무에 도움된다.
하지만 글쓰기에는 그 이상의 중요한 역량이 숨어 있다.
글은 어떤 생각을 일정한 형식에 따라 글자로 묶어낸 것이다.
글쓰기는 코딩과 상당히 유사하다.
글쓰기는 글자를 통해 독자에게 전달하고자 하는 주제를 일정한 형식으로 전달하는 것이다.
코딩은 코드를 통해 컴퓨터에게 전달할 명령을 일정한 형식으로 전달하는 것이다.
잘 쓰여진 글은 구조화 되어 읽기 편하고 전달하는 내용이 명확하다.
잘 짜여진 코드 역시 읽기 편하고 동작이 명확하게 예측된다.
글에는 글쓴이의 사고가 녹아있다.
코드 역시 개발자의 사고가 반영된다.
글을 통해 읽는 사람에게 자신의 생각을 전달할 수 있다.
그렇기 때문에 읽는 사람을 고려하여 내용을 다듬고 주제를 강조해야한다.
코드 역시 그렇다.
개발자의 코딩 역량은 그 사람의 글쓰기 능력과 상관관계가 높다고 생각한다.
특히 개발자의 글은 정확하고 간결해야하며 읽기 편해야한다.
좋은 코드의 10가지 원칙: Less, but better
디터 람스의 다큐멘터리를 보았다.
디터 람스는 독일 출신의 전설적인 산업 디자이너다.
애플의 수석 디자이너였던 조너선 아이브의 롤 모델로도 유명하다.
그가 말한 좋은 디자인의 10가지 원칙을 보고 놀랐다.
각각의 원칙들이 모두 프로그래밍에도 동일하게 적용되는 이야기이기 때문이다.
폴 그레이엄의 <해커와 화가>가 떠올랐다.
해커(개발자)와 화가는 사용하는 도구가 다를 뿐 새롭고 혁신적인 것을 만든다는 점이 같다.
해커는 코드를 통해, 화가는 그림을 통해 아이디어를 분출한다.
좋은 디자인의 10가지 원칙은 모든 maker에게 통용되는 이야기가 아닐까 생각한다.
먼저 디터 람스가 이야기한 좋은 디자인의 10가지 원칙은 다음과 같다:
1. 좋은 디자인은 혁신적이다.
•
디자인은 항상 혁식적인 기술과 병행된다.
•
기술이 동일한 수준에 있지 않으면 어떻게 디자인이 좋을 수 있겠는가?
2. 좋은 디자인은 제품을 유용하게 한다.
•
좋은 디자인은 목적에 부합하지 않거나 반대하는 모든 요소들을 무시하고 유용성을 극대화 시킨다.
3. 좋은 디자인은 미적인 것이다.
•
매일 사용하는 물건은 개인 환경과 생활에 중요한 영향을 준다.
•
잘 만들어진 것만이 아름다울 수 있다.
4. 좋은 디자인은 제품을 이해할 수 있게 한다.
•
제품의 구조를 쉽게 이해하도록 한다. 더불어 이것은 제품을 말하게 할 수 있다.
•
디자인 그 자체로 설명되도록 한다.
5. 좋은 디자인은 과시하며 드러내지 않는다.
•
목적이 명확한 제품에는 도구의 특성이 드러난다.
•
제품의 디자인은 중립적이어야 하며 사용자가 알아서 쓸 수 있도록 해야 한다.
6. 좋은 디자인은 정직하다.
•
정직이란, 제품을 실제보다 더 혁신적이고 강력하며 더 가치 있게 보이도록 하지 않는 것을 의미한다.
7. 좋은 디자인은 오래 지속된다.
•
유행에 민감한 디자인과 달리 버려지는 것이 흔한 현대사회에서도 오래 지속된다.
8. 좋은 디자인은 마지막 디테일까지 철저하다.
•
임의적이거나 우연이 아니어야 한다.
•
철저함과 신중함은 곧 사용자를 존중하는 것이다.
9. 좋은 디자인은 환경 친화적이다.
•
디자인은 환경보호에 중요한 기여를 한다.
•
자원을 보존하고, 물리적이고 시각적인 오염을 최소화 한다.
10. 좋은 디자인은 최소한의 디자인이다.
•
단순함으로, 순수함으로 돌아가라.
디터 람스는 위의 원칙이 절대 영원하지 않고, 앞으로도 계속 수정되어야 한다고 말한다.
위의 10가지 원칙을 기반으로 좋은 코드의 10가지 원칙을 적어본다.
1. 좋은 코드는 혁신적이다.
•
코드는 항상 혁식적인 기술과 병행된다.
•
기술이 동일한 수준에 있지 않으면 어떻게 코드가 좋을 수 있겠는가?
2. 좋은 코드는 제품을 유용하게 한다.
•
좋은 코드는 목적에 부합하지 않거나 반대하는 모든 요소들을 무시하고 유용성을 극대화 시킨다.
3. 좋은 코드는 미적인 것이다.
•
매일 동작되는 코드는 사용자 경험에 큰 영향을 준다.
•
잘 만들어진 것만이 아름다울 수 있다.
4. 좋은 코드는 제품을 이해할 수 있게 한다.
•
시스템의 구조를 쉽게 이해하도록 한다. 더불어 이것은 제품을 말하게 할 수 있다.
•
코드는 문서와 주석 없이도 그 자체로 설명되도록 한다.
5. 좋은 코드는 과시하며 드러내지 않는다.
•
목적이 명확한 코드는 기능이 잘 드러난다.
•
코드는 중립적이어야 하며 다른 개발자가 쉽게 읽고 쓰고 고칠 수 있도록 해야 한다.
6. 좋은 코드는 정직하다.
•
정직이란, 실제보다 더 혁신적이고 강력하며 더 가치 있게 보이도록 하지 않는 것을 의미한다.
7. 좋은 코드는 오래 지속된다.
•
유행하는 기술을 따르지 않아도 오래 지속된다.
8. 좋은 코드는 마지막 디테일까지 철저하다.
•
모호하지 않고 명료해야 한다.
•
철저함과 신중함은 곧 동료를 존중하는 것이다.
9. 좋은 코드는 자원을 낭비하지 않는다.
•
컴퓨팅 자원을 아끼도록 노력한다.
•
자원을 보존하고, 물리적이고 시간적인 오염을 최소화 한다.
10. 좋은 코드는 최소한의 코드다.
•
단순함으로, 순수함으로 돌아가라.
•
가장 좋은 것은 코드를 적지 않고 문제를 해결하는 것이다.
Less, but better!
직관이란 무엇일까?
1. 한문 그대로 해석하면 바로 눈에 보임.
사전적 정의에 의하면 연상, 판단, 추리 등의 사유 작용을 거치지 않고 대상을 직접적으로 파악하는 것.
뇌를 거치지 않고 바로 판단한다는 맥락에서 간혹 직관은 예술가들의 전유물처럼 여겨지기도 한다.
하지만 이런 생각과 달리 위대한 과학자 중 한 명인 아인슈타인은 직관을 매우 중요시했다.
그는 직관적이지 않다는 이유로 영자역학을 싫어했다.
2. 오늘날 모바일 혁명을 이끈 스티브 잡스 역시 직관의 대명사로 통한다.
아이폰의 둥근 모서리나 애플의 폐쇄형 시스템은 전부 그의 직관에 의해서 선택되었다.
애플의 위대한 업적은 뛰어난 동료들과 함께 이루어낸 것이 분명하다.
하지만 스티브 잡스를 해고했던 애플은 결국 그를 다시 고용했다.
그의 직관이 애플의 성장에 매우 강력한 원동력이라는 사실은 부정할 수 없다.
3. 리눅스와 깃을 만든 리누스 토발즈 역시 매우 직관적인 사람으로 알려져있다.
그는 자신의 이런 직관을 taste라고 표현한다.
그가 말하는 taste란 좋지 않은 것을 본능적으로 느끼는 능력이다.
흔히 말하는 code smell을 감지하는 능력이다.
4. 인간의 뇌가 매우 복잡하듯이 뇌 속에서 일어나는 직관적인 선택과 생각들 역시 매우 복잡할 것이다.
따라서 직관이 어떻게 발현되는지 하나의 원인을 찾기는 힘들 것 같다.
직관은 매우 복잡하고 다양한 요소에 의해서 길러질 것이다.
5. 개인적으로 직관은 자연스러운 사고의 흐름에서 어색한 부분을 느끼는 감각이라고 생각한다.
어떤 문제를 해결하려고 할 때 자연스럽게 자신이나 타인의 사고 과정을 반추하게 된다.
이 때 불필요하거나 논리적이지 못한 부분이 인지되면 본능적으로 불편함이 느껴진다.
우리는 직관에 의해 그렇게 판단했다고 얘기하겠지만 실제로는 뇌 안에서 매우 빠른 판단이 이루어졌을 뿐이다.
그렇기 때문에 논리적이지 않은 사람은 직관적일 수 없다고 생각한다.
논리적인 사고가 체화된 사람만이 찰나의 순간에 매우 빠른 선택을 할 수 있기 때문이다.
개발자가 자신의 집을 깨끗하게 유지하는 법
1. 집을 깨끗하게 유지하는 가장 쉬운 방법이 뭘까?
요즘 핫한(어쩌면 이미 익숙한) ChatGPT에게 물어보면 여러가지 방법을 제안한다.
하나로 요약하면 ‘수시로 치운다’이다.
옷은 벗는 즉시 걸어두고, 식사 후에 바로 설거지하고, 지저분해질 때마다 정리하면 집은 항상 깨끗하게 유지된다.
보이스카우트 원칙(The Boy Scout Rule)과 비슷한 부분이 있다.
앞서 얘기한 방법들을 따르지 않는 사람의 집은 금세 지저분해질 것이다.
그래서 집은 어지러운 게 일반적인 상황이라고 얘기할 수도 있다.
2. 우리는 왜 리오넬 메시의 플레이에 열광할까? 그리고 그의 연봉은 왜 그렇게 높을까?
그건 메시가 일반인의 범주를 넘어서는 움직임을 보여주기 때문이다.
3. 우리는 돈을 받고 일하는 사람들이다.
모두가 메시가 될 수는 없지만 적어도 본인이 받는 보수에 합당한 일을 해야 하는 의무와 책임이 있다.
돌아가는 코드를 한 줄 짜는 건 일반인의 영역이다.
당장 구글링만 조금 해도 파이썬 자동화 코드가 쏟아져 나온다.
프로의 세계에서는 일반인은 하기 힘든 고민과 노력을 해야한다.
집을 깨끗하게 유지하는 방법은 대부분 이미 알고 있다.
귀찮고 번거롭더라도 그걸 실제로 수행하는 사람이 프로다.