서점은 공공 공간이다. 공공 자산이다. 나라와 사회를 더 도덕적이고 더 정의롭게 일으켜 세우는 인프라다! 민주주의의 기초 조건이다. 도서관과 같은 차원에서 논의되고 육성하는 정책이 수립되고 실현되어야 한다. 서점을 위한 '문화운동, 사회운동'이 전개되기를 기대해 본다.
- 김언호의《세계서점기행》중에서 -
* 서점은 특별한 공간입니다. 책을 만나고 사람을 만나고 지식과 지혜, 문화와 문명을 만납니다. 더러는 서점에서 친구도 만나고 연애도 합니다. 공공 공간, 공공 자산도 되지만 특별한 개인 공간, 개인 자산이 되기도 합니다. 서점을 살리는 사회운동, 문화운동이 필요합니다.
20년간 수천 개의 소프트웨어 블로그 글을 읽었지만,소수의 에세이만이 사고방식을 근본적으로 변화시켰으며, Joel Spolsky의 "Joel Test"부터 Julia Evans의 순수 JavaScript 옹호까지 10개의 핵심 에세이 소개
Joel Spolsky의 "Joel Test"는 고용주가 개발자를 존중하는지 평가하는 12개 질문을 제시하며,소스 관리, 일일 빌드, 버그 우선 수정등을 통해 개발자의 시간과 집중을 우선시하는지 확인
Alexis King의 "Parse, don't validate"는 데이터 검증 시 새로운 타입으로 변환하는 기법을 소개하여,타입 시스템이 애플리케이션 보안과 신뢰성 향상에 기여할 수 있음을 보여줌
Fred Brooks의 "No Silver Bullet"은 소프트웨어 작업을 본질적 복잡성과 우발적 복잡성으로 구분하며,도구와 하드웨어 발전으로는 10배 생산성 향상 불가능하다고 주장했으나 AI는 이 이론에 변수를 던짐
Julia Evans의 순수 JavaScript 에세이는 프레임워크 없이도ES2018 JavaScript만으로 충분하다는 깨달음을 주었고, 이후 2020년부터 어떤 프로젝트에도 JavaScript 프레임워크나 빌드 스텝을 통합하지 않음
Joel Spolsky의 "Joel Test" (2000)
Joel Spolsky는역대 최고의 소프트웨어 블로거이며, 그의 에세이들이 필자의 소프트웨어 접근 방식에 많은 영향을 미침
"Joel Test"는 고용주가 소프트웨어 팀에 얼마나 잘 투자하는지 평가하는 12개 질문 세트
12개 질문 목록
소스 관리 사용 여부
한 단계로 빌드 가능 여부
일일 빌드 수행 여부
버그 데이터베이스 보유 여부
새 코드 작성 전 버그 수정 여부
최신 일정 보유 여부
스펙 보유 여부
프로그래머가 조용한 작업 환경을 가지는지
돈으로 살 수 있는최고의 도구 사용여부
테스터 보유 여부
신규 후보자가 인터뷰 중 코드 작성 여부
복도 사용성 테스트 수행 여부
핵심 메시지
일부 질문은 시대에 뒤떨어졌지만, 질문 자체가 아니라질문의 메타 포인트가 중요
Joel이 실제로 묻는 것:개발자를 존중하는가?
모든 질문은 고용주가 저렴한 사무 공간과 단기 마감일보다 개발자의 시간과 집중을 우선시하는지 평가
닷컴 붐 정점에 게시되었으며, 숙련된 개발자가 귀중한 자원이었지만 모두가 이를 깨닫지는 못한 시기
Joel의 블로그는 항상 프로그래머를희귀하고 섬세한 천재로 제시하여 고용주가 추구하고 아껴야 할 대상으로 묘사
필자는 경력 내내 Joel Test에서 높은 점수를 받는 고용주를 찾았으며, 그 지도를 제공한 Joel에게 감사
Alexis King의 "Parse, don't validate" (2019)
Haskell의 타입 시스템 활용에 관한 에세이이지만,타입 시스템이나 Haskell에 관심이 없어도소프트웨어 사고방식을 근본적으로 변화시킴
Go, C++, Rust 등 정적 타입을 지원하는 모든 언어에서 Alexis의 기법 사용 가능
핵심 개념
데이터를 검증할 때마다새로운 타입으로 변환해야 함
예시: 사용자 이름을 최대 20자 영숫자로 제한하는 규칙이 있을 때, 순진한 솔루션은validateUsername(username string) error함수
문제점
코드가기본적으로 안전하지 않음
수신한 모든 사용자 이름을 검증해야 하므로, 실수로 검증 없이 사용자 이름을 처리하는 코드 경로 생성 쉬움
악의적 사용자가 실수를 발견하면 사용자 이름 필드에 악성 코드 삽입하거나 수십억 문자로 채워 서버 리소스 고갈 가능
Alexis의 솔루션
parseUsername(raw string) (Username, error)함수 사용
코드베이스의 나머지 부분에서 "username"이라는string대신 커스텀 타입Username사용
Username을 생성할 수 있는 유일한 함수는parseUsername이며, 이는Username인스턴스를 반환하기 전에 검증 규칙 적용
Username인스턴스가 있으면유효한 사용자 이름을 포함해야 함
신뢰할 수 없는 입력은 항상string이므로,Username을 예상하는 함수에string전달 불가능
영향
이 에세이 이전에는 타입 시스템이 언어 너드를 산만하게 하는 재미있는 방법이라고 생각
"Parse, don't validate"는컴파일러 기능이 애플리케이션의 보안과 신뢰성 향상에 얼마나 가치 있는지 눈을 뜨게 함
Fred Brooks의 "No Silver Bullet" (1986)
대학에서 Fred Brooks의The Mythical Man-Month읽음
IBM의 OS/360 프로젝트 지휘 경험을 바탕으로 한 소프트웨어 엔지니어링 에세이 모음집
본질적 복잡성과 우발적 복잡성
본질적 복잡성: 도구와 하드웨어에 관계없이 반드시 수행해야 하는 작업
예: 영업 사원 보너스 계산 소프트웨어에서 보너스 공식 정의 및 모든 엣지 케이스 커버
$5B 슈퍼컴퓨터든 $1 마이크로컨트롤러든 동일한 작업
우발적 복잡성: 그 외 모든 것
메모리 누수 처리, 코드 컴파일 대기, 제3자 라이브러리 사용 방법 파악
도구와 하드웨어 리소스가 좋을수록 우발적 복잡성에 소비하는 시간 감소
Brooks의 결론
도구나 하드웨어의 발전이개발자 생산성에 10배 향상을 만들어내는 것은 불가능
모든 우발적 활동을 제로 시간으로 줄여도 전체 노력의 9/10 이상이 아니면 규모 향상 불가능
적용 사례
경력 내내 사람들이 소프트웨어에서 프로그래머를 제거하려고 시도
노코드 플랫폼이 비프로그래머에게 숙련된 웹 개발자의 모든 권한을 약속하며 화제 생성
Brooks의 에세이는 최신 버즈워드 플랫폼이개발자를 대체할 수 없다고 항상 안심시킴
플랫폼은 우발적 복잡성에 집중하며, 본질적 복잡성에는 집중하지 않음
플랫폼이 기능 사양에서 마법처럼 작동하는 코드를 만들 수 있어도, 여전히사양을 작성할 누군가가 필요
AI의 영향
현대 AI는 Brooks의 이론에 렌치를 던짐
AI는 실제로본질적 복잡성을 줄임
불완전하거나 모순된 사양을 AI에 전달하면, AI가 유사한 사양에서 차용하여 공백 채움
AI가 알려진 프로그래밍을 제거하더라도, Brooks의 에세이는 결국 어떤 추상화 수준에서든본질적 복잡성을 관리할 사람이 여전히 필요하다는 희망 제공
Joel Spolsky의 "Choices" (2000)
좋아하는 Joel Spolsky 에세이를 하나만 선택하기 어려워 두 개 선택
"Choices"는 사용자 인터페이스 생성과 사용자에게 권한을 부여하는 미묘한 비용에 관한 것
핵심 메시지
옵션을 제공할 때마다 사용자에게 결정을 요청하는 것
사용자가 무언가에 대해 생각하고 결정해야 함을 의미
반드시 나쁜 것은 아니지만, 일반적으로 사람들이 내려야 하는 결정의 수를 최소화하려고 노력해야 함
Windows 98 예시
Joel은 Windows 98에서 도움말 문서 검색 시 나타나는 황당한 대화상자 공유
대화상자가 Joel을 분노하게 만든 이유:
사용자가 도움을 받으려고 할 때 중단
데이터베이스 최적화에 대한정보 없는 결정을 내리도록 요청
Windows가 결정을 회피하고 사용자에게 떠넘김
적용 범위
Joel의 에세이는 그래픽 사용자 인터페이스에 초점을 맞추지만, 필자는 명령줄이나 작성한 함수를 호출하는 다른 개발자를 포함하여코드를 접할 수 있는 모든 곳에서 이를 고려
사용자를 대신하여 유용한 결정을 내릴 수 있는지, 동시에 그들이 관심 있는 것에 대한 권한을 제공할 수 있는지
Joel의 에세이는내가 직접 내릴 수 있는 결정을 사용자에게 떠넘기는 것을 무수히 막아줌
Raymond Chen의 "“Application compatibility layers are there for the customer, not for the program” (2010)
Raymond Chen은 Microsoft Windows 팀에서 가장 오래 근무한 개발자 중 한 명
블로그에는 Windows 프로그래밍 역사에 대한 수천 개의 유익하고 재미있는 이야기가 있음
고객 요청 사례
Windows Vista 호환성 모드에 관한 고객 요청:
Windows XP 및 Windows Server 2003용으로 설계된 프로그램이 Windows Vista에서 어려움 겪음
Windows XP 호환성 모드로 설정하면 Vista에서 잘 작동
Vista에서 실행 시 자동으로 XP 호환성 모드로 실행되도록 설치 프로그램에 어떤 변경 필요한지 질문
Raymond의 비유
"나는 일반적으로 애완동물 가게 앞 보도에 쓰레기를 버리고, 매일 아침 가게가 열리면 누군가 쓰레기를 쓸어 쓰레기통에 버립니다. 하지만 애완동물 가게는 일요일에 열지 않아서, 일요일에는 쓰레기가 그냥 거기 있습니다. 일요일에도 애완동물 가게를 열게 하려면 어떻게 해야 하나요?"
교훈
비유가 너무 재미있어서 Raymond가 틀렸다는 것을 이제야 알아챔
단일 릴리스 후 Windows가 앱을 깨뜨리지 않을 것으로 기대한 개발자의 죄를 조롱
세부 사항에는 동의하지 않지만, Raymond의 글은 매우 재미있고 날카로워 결함을 넘어설 수 있음
훌륭한사용자 행동 영향 교훈:
사용자가 당신을 돕는 무언가를 하도록 유도하려면, 사용자 관점에서저항이 가장 적은 경로를 신중히 생각해야 함
C언어를 처음 접한 것이 1990년입니다. 이후, C++/C#, Java, VBA, Python 등의 언어를 사용했고, 요즘 관심있는 언어가 Rust입니다.
관심 가지는 이유는 C언어의 성능과 Java나 Python 같은 안정성과 편리성을 가지고 있기 때문입니다. 특히, NSA(미국 국가안보국)에서 메모리 안전 문제로 C나 C++ 대신에 Rust와 같은 안전한 언어를 사용하도록 권고 했기에, 미국을 중심으로 기존의 C/C++로 된 코드를 Rust로 바꾸는 작업이 이루어지고 있고, 안전성이 요구되는 프로그램은 Rust로 개발되는 추세여서, 앞으로 Rust 언어의 활용이 많아질 것으로 보이기 때문입니다.
NSA가 권고하는 메모리 안전한 언어Python, Java, C#, Go, Delphi/Object Pascal, Swift, Ruby, Rust, Ada
성능까지 고려하면 Rust가 거의 유일한 C/C++ 대체 언어
필자가 생각하는 향후 Rust가 각광 받을 분야는,
웹서버: 안전성과 성능이 좋아서, 현재 Java로 되어 있는 웹서버쪽은 Rust로 많이 전환될 것으로 예상
암호 라이브러리: C/C++로 되어 있는 암호 라이브러리는 항상 Buffer overflow의 위험을 내재하고 있습니다. 이 부분도 Rust로의 전환이 예상됩니다.
소형 기기 펌웨어: 구글은 이미 Android Virtualization Framework를 Rust로 포팅함. 대부분 C/C++로 작성되어 있어 메모리 안전성이 문제되는 펌웨어 단 모듈들은 Rust로 바꿔질 것임
성능도 좋고 안전하기도 한, 두 마리 토끼를 다 잡은 대신에, Rust 언어를 배우기는 쉽지 않습니다. 안전한 메모리 처리를 위해서 Rust에서 컴파일 전에 체크하는 '소유권', '에러처리', '타입 체크' 등을 개발자가 알아서 코드에 반영해야하기 때문입니다. 그렇지 않으면 아예 컴파일이 되지 않습니다. Java나 파이썬을 배우는 것 대비 2~3배 정도는 시간을 더 들여야 Rust에 익숙해질 것입니다.
이 책은 한국에 있는 개발자를 대상으로 Rust 언어를 보다 쉽게 익숙하게 익힐 수 있도록 제작되었습니다.
효율적으로 공부할 수 있도록, 실제 꼭 알아야하는 부분만을 추릴려고 노력했습니다. 따라서, 이 책에서는 Rust에서 제공하는 모든 내용을 담지는 않습니다. 메뉴얼이 아닙니다. 그러나, 꼭 필요한 부분은 가능한 자세하고 깊게 설명합니다.
챕터 내용을 익히는데 좀 더 도움이 되도록 챕터 내용을 그대로 따라 해볼 수 있는 유튜브 영상 링크입니다.
무소유란 아무것도 갖지 않는다는 것이 아니다. 궁색한 빈털털이가 되는 것이 아니다 무소유란 아무것도 갖지 않는 것이 아니라 불 필요(과욕 ,욕심)한것을 갖지 않는다는 뜻이다 무소유의 진정한 의미를 이해할 때 우리는 보다 홀가분한 삶을 이룰 수 있다.
우리가 선택한 맑은 가난은 넘치는 부보다 훨씬 값지고 고귀한 것이다. 이것은 소극적인 생활태도가 아니다. 지혜로운 삶의 선택이다.
우리가 만족함을 모르고 마음이 불안하다면 그것은 우리가 살고있는 세상과 조화를 이루지 못하기 때문이다. 내마음이 불안하고 늘 갈등상태에서 만족할줄 모른다면그것은 내가 살고있는 이세상과 조화를 이루지 못하기 때문이다.
우리는 우리주위에 있는 모든 것의 한부분이다. 저마다 독립된 개체가 아니라 전체의 한 부분이다. 우리 한사람 한사람이 세상의 한 부분이다. 세상이란 말과 사회란 말은 추상적인 용어이다. 구체적으로 살고있는 개개인의 구체적인 사회이고 현실이다.
우리는 보이든 보이지않든 혈연이든 혈연이 아니든 관계 속에서 서로 얽히고 설켜서 이루러진 것이다. 그것이 우리의 존재이다.
이 세상에서 영원한 것은 아무것도 없다. 어떤 어려운일도 어떤 즐거운일도 영원하지 않다 모두 한 때이다.
한 생애를 통해서 어려움만 지속된다면 누가 감내하겠는가 다 도중하차 하고 말 것이다. 모든 것이 한 때이다 좋은일도 그렇다 좋은일도 늘 지속되지는 않는다. 그러면 사람이 오만해진다.
어려운 때일 수록 낙천적인 인생관을 가져야 한다. 덜 가지고도 더많이 존재할 수 있어야 한다. 이전에는 무심히 관심갖지않던 인간관계도 더욱 살뜰이 챙겨야 한다.
더 검소하고 작은 것으로써 기쁨을 느껴야 한다. 우리 인생에서 참으로 소중한 것은 떤 사회적이 신분이나 지위, 소유물이 아니다. 우리들 자신이 누구인지를 아는 일이다.
나는 누구인가? 스스로 물어야 한다. 이런 어려운 시기를 당했을 때 도대체 나는 누구지? 나는 누구인가 스스로 물어야 한다.
우리가 지니고있는 직위나 돈이나 재능이 중요한 것이 아니라 그것으로써 우리가 어떤일을 하며 어떻게 살고있는가에 따라서 삶의가치가 결정된다.
잡다한 정보와 지식의 소음에서 해방되려면 선 침묵의 의미를 알아야 한다. 침묵의 의미를 알지못하고는 런 복잡한 얽힘에서 벗어날 길이 없다. 나 자신이 침묵의 세계에 들어가 봐야한다. 우리는 얼마나 일상적으로 불필요한 말을 많이 하는가 미없는 말을 하루동안 수없이 남발하고있다.
친구를 만나서 예기할 때 유익한 말보다는 하지않아도 말들을 얼마나 많이 하는가 말은 가능한한 적게 하여야 한다. 한마디로 충분할 때는 두마디를 피해야한다.
인류 역사상 사람답게 살아간 사람들은 모두 결같이 침묵과 고독을 사랑한 사람들이다 그렇지 않아도 시끄러운 세상을 우리들 자신마져 소음이 되어 시끄럽게 할 필요는 없는 것이다.
많은 사람들이 무엇인가 열심히 찾고 있으나 묵속에 머무는 사람들만이 그것을 발견한다. 말이 많은사람은 누구를 막론하고 그가 어떤일을 는 사람이든간에 그 내부는 비어있다.