프로그램과 프로그래밍에 대해

😢 이 페이지는 다음 주소로 변경될 예정입니다.

Bjarne Stroustrup 책을 읽고 있는데 단순하면서도 마음에 남는 말이 참 많다.

Our code must be maintainable … A successful program “lives” for a long time (often for decades) and will be changed again and again. … Only a failed program will never be modified.

코드는 꼭 유지보수가 가능해야 합니다. … 성공적인 프로그램은 오랜 시간을, 종종 수십 년을 “살며” 계속 변경됩니다. … 실패한 프로그램은 절대 수정되는 일이 없습니다.

To be maintainable, a program must be simple relative to its requirements, and the code must directly represent the ideas expressed.

유지보수가 가능하려면 프로그램은 프로그램의 요구사항에 비해 단순해야 하며 코드는 아이디어의 표현을 직접 드러내야 합니다.

A program is a precise representation of our understanding of a topic.

프로그램은 우리가 주제를 어떻게 이해하는지를 알려주는 정확한 표현(representation)입니다.

Think about the problem itself, rather than your incomplete solution.

자신의 불완전한 해결책보다 문제 자체에 대해 생각하세요.

Programming is part practical, part theoretical. If you are just practical, you will produce non-scalable, unmaintainable hacks. If you are just theoretical, you will produce unusable (or unaffordable) toys.

프로그래밍은 실용적인 부분과 이론적인 부분이 있습니다. 만약 당신이 실용적이기만 한다면 당신은 확장하기 어렵고 유지보수 하기 어려운 코드 덩어리를 만들 겁니다. 반대로 이론적이기만 하면 사용 불가능한 (또는 감당하기에 너무 비싼) 장난감을 만들게 됩니다.


이 챕터 끝에 길을 잃은 기분이 들 때 이 책을 꺼내서 이 챕터를 다시 읽으라는 말에 울컥했다. 요즘 앞으로 어떤 개발을 해야 할지, 어떤 시장에서, 환경에서, 어떤 언어로 할지 고민이 많다. 다시 처음부터 시작하는 기분에 더 갈피가 잡히지 않는 것 같다.

웹 외의 환경은 해본 적이 없기도 하고 학교 가면 하게 될 것 같아서 cpp를 한동안 볼 것 같다. 영어도, 수학도 준비해야 하고. 적어보니 바빠야 하는데 막상 하나 제대로 하지 못하는 것 같고. 이렇게 고민에 고민을 더한다.

내 기분 속여서 하려고 노력하기보다 어떻게든 꾸역꾸역 해야 할 때가 온 것 같다. 빨리 방향도 생각도 다듬어졌으면 좋겠다!

히트 리프레시

😢 이 페이지는 다음 주소로 변경될 예정입니다.

지금의 마이크로소프트는 이전의 MS가 보여줬던 모습과는 확연히 다르다. 오픈소스로 공개하는 많은 결과물과 다양하면서도 견고한 서비스를 제공하는 클라우드, 유기적으로 통합된 프로덕트는 커다랗고 정적인 회사라는 내 생각의 틀을 바꿨다. MS의 CEO로 사티아 나델라가 선임된 날을 기억한다. 그 날 이후 달라진 MS를 보면서 단순히 CEO의 차이로 이렇게 체질을 바꿀 수 있는 것일까 하고 그동안 생각했었다. 사티아 나델라의 책 <히트 리프레시>를 읽으면서 지금의 MS이 되기까지의 과정을 엿볼 수 있었다.

조직이 어떻게 생각하고 행동할지를 문화가 결정한다고 하지만 문화의 틀을 빚는 주체는 개인이다.

책은 사티아 나델라의 이야기로 시작해 CEO가 되기까지 어떤 삶을 살았고 어떤 역할을 맡았는지 설명한다. 그리고 미래에는 어떤 기술이 주목받고 그 변화의 중심이 되려면 어떤 비전을 갖고 준비해야 하는지 풀어간다. 사티아의 독특한 이력도 흥미로웠고, CEO가 되기 전에는 클라우드 부문에서 Azure를 만드는 과정, CEO가 된 이후에 체질을 바꾸기 위한 과정도 인상적이었다. 책 전체에서 강조된 “공감”이라는 키워드를 조직에 녹이기 위해 어떤 일을 했는지 잘 설명하고 있다.

어떻게 해야 우리 기술로 우리 정체성에 말을 걸고 우리 사용자에게 유일무이한 가치를 부여할 수 있을까?

지금까지 내가 해왔던 일을 생각해보면 기술의 끝단에 서서 기술을 비지니스에 녹이고 사용자에게 제공하는 역할을 해왔다. 이 책에서 언급한 변화 앞에서는 어떤 역할을 하는 사람이 되어야 하나 고민된다. 일반 사용자를 대상으로 하는 도구를 만드는 일도 즐거운 일이지만 기술적 깊이가 있는 일은 아직 안해봐서 그런지 해보고 싶은 마음이 크다. 나는 어떤 역할로 어떤 위치에서 무슨 일을 해야 하는가 끊임없이 되물어보게 한다.

사람이든 조직이든 사회든 스스로 새로고침을 해야 하는 순간이 찾아온다. 그 순간이 오면 다시 열정을 불러일으키고 새로운 마음으로 목표를 재설정하고 치열하게 고민해야 한다.

무슨 일을 해야하나 생각을 오래 해온 탓에 그저 관성적인 고민이 아닌가 싶기도 했다. 치열하게 고민한다는 말이 울렸다. 새로고침을 해야 하는 순간이 왔다.

사람들이 변화에 저항하는 근본적인 이유는 미지에 대한 두려움 때문이다. 정말 중요하지만 확실한 답이 없는 질문은 사람들을 두렵게 한다.

앞으로 무슨 일을 해야 하는가, 이 질문은 늘 두렵다. 본문에서는 이 질문을 마이크로소프트에 던졌다. 서버 중심의 환경에서 클라우드로 나아가기 위해 두려운 질문을 마다하지 않았다. 또한 책에서는 미래를 대비하기 위한 기술로 인공지능, 증강현실 그리고 양자 컴퓨팅을 꼽았다. 이런 기술을 사용한 서비스가 하루가 다르게 나오고 있고 삶을 변화하고 있다. 나는 이런 질문에 어떻게 답할 것인가.

책을 읽은 후에도 여러 번 뒤적이게 된다. 고민이 많은, 지금의 나에게 답을 바로 주는 것은 아니지만 고민을 어떤 방향성과 동력을 갖고 해야하는지 알려주고 있다. 남은 한 해도 여러가지 변화가 있을 예정인데 고민 속에서도 하나씩 잘 해결해가고 싶다.

C# 으로 배우는 적응형 코드

😢 이 페이지는 다음 주소로 변경될 예정입니다.

요즘 사무실에서 비는 시간이 좀 많이 있어서 책을 가져다두고 읽었다. 가볍게 읽으려고 읽었던 책을 가져가야지 했는데 지금 회사에서는 C#을 전혀 쓰지 않고 있으니 리마인드도 할 겸 읽게 되었다. 베타리딩을 포함해서 3번째 읽는데 그래도 또 배우는 게 많은 건 전에 열심히 안 읽어서 그런 걸까. 이번에는 읽고 기억하고 싶은 키워드라도 적어놔야지 싶어 표시해둔 부분을 여기에 옮겼다.

이 책은 어떤 방식으로 구조를 짜야 좋은 적응력을 가진 코드를 작성할 수 있는지 설명한다. 크게 세 부분으로 볼 수 있는데 가장 먼저 애자일 방법론과 적응형 코드를 작성하기 위한 배경적인 지식을 쌓는다. 그리고 SOLID 패턴에 대해 여러 예시를 들어 설명한 후, 마지막으로 실무에서 적용하는 예시로 마무리한다.

1부에서는 어떤 방식으로 작성하면 코드 의존성이 강해지는지, 어떤 계층적인 접근을 해야 유연한 구조를 구성할 수 있는지 풀어간다. 이런 흐름에서 왜 인터페이스를 도입해야 하고 디자인패턴이 어떻게 코드에 유연함을 더하는지 확인한다. 이런 구조의 코드를 어떻게 테스트하고 리팩토링하는 과정을 통해 개선하는 부분까지 다뤘다.

C#을 기준으로 설명하고 있어서 어셈블리를 어떻게 구성해야 한다거나 nuget을 구성하는 방법이라든가 하는 부분은 좀 거리감 있게 느낄 수도 있는데 요즘은 대다수 언어가 어떤 방식으로든 이런 부분을 지원하고 있으니 그렇게 맥락이 멀게 느껴지지 않았다.

의존성 관리(p. 66)에서 어떤 게 코드 스멜인지 알려주고 그 대안을 잘 설명하고 있다. C#에 매우 한정된 부분이긴 하지만 CLR의 어셈블리 해석 과정도 흥미로웠다.

여기서는 계층화를 점진적으로 진행하는 과정(p. 96)이 특히 좋았다. 인류 발달 과정 설명하듯 하나씩 짚어가며 어떤 이유에서 분리했는지 설명하고 있어서 최종 단계만 보면 막막할 수 있는 계층을 이해하는데 도움이 되었다.

2부에서는 SOLID 패턴을 하나씩 실질적인 예시와 함께 설명했다. 리스코프 치환 원칙을 설명하는 부분(p. 253~)이 재미있었다. 계약 규칙에서는 사전 조건과 사후 조건을 작성하는 방법과 불변성을 어떻게 유지해야 하는지 설명했다. System.Diagnostics.Contracts를 사용해서 각 조건을 기술하는 방식도 참 깔끔하다. 그리고 가변성 규칙에서 공변성과 반공변성을 짚고 넘어갔는데 제네릭이 어떤 식으로 동작하는지 이해하는데 많이 도움 됐다.

인터페이스 분리도 유익했는데 질의/명령을 인터페이스로 분리하는 부분도 좋았다. 의존성 주입은 이미 부지런히 쓰고 있었지만, 생명주기(p. 346)를 설명하는 부분은 다소 모호하게 생각했던 IDispose를 다시 살펴볼 수 있었고 이 인터페이스를 어떤 방식으로 생명주기 관리에 적용하는지 배울 수 있었다. 이 부분은 실무에서 좀 더 많은 사례를 접해보고 싶다.

예전에도 좋아서 추천 많이 했는데 또 읽어도 좋아서 추천하고 싶다. C#도 부지런히 해서 실무에서 다시 쓸 기회가 왔으면 좋겠다.