# Enlightenmentware - 나를 일깨워주는 소프트웨어들

> Clean Markdown view of GeekNews topic #14926. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14926](https://news.hada.io/topic?id=14926)
- GeekNews Markdown: [https://news.hada.io/topic/14926.md](https://news.hada.io/topic/14926.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-05-21T15:33:32+09:00
- Updated: 2024-05-21T15:33:32+09:00
- Original source: [mmapped.blog](https://mmapped.blog/posts/28-enlightenmentware.html)
- Points: 16
- Comments: 5

## Topic Body

- UNIX, Git, Emacs, Boost.Graph, Bazel   
- 프로그래머로서 매일 소프트웨어 도구와 상호작용하는데, 대부분의 도구는 그저 작업을 겨우 수행하는데만 쓰임  
- 때로는 단순한 유용성을 넘어서 상상력을 자극하고 새로운 가능성을 열어주며 시스템 설계 방식에 영향을 미치는 소프트웨어를 발견함  
- 이런 소프트웨어를 ‘깨달음 소프트웨어’(Enlightenmentware)라고 부름   
- 프로그래머에게 가장 흔한 깨달음의 원천은 사용하는 프로그래밍 언어임. 취미로 배우는 언어 포함   
- MASM, C, Prolog, Idris와 같은 프로그래밍 언어를 다루면서 많은 깨달음을 경험했음  
- 언어 학습이 사고력 확장에 미치는 영향은 이미 오래전부터 알려진 사실이기 때문에 이글에서는 언어에 초점을 맞추기 보다는 깨달음을 주는 소프트웨어에만 집중하기로 함   
  
### UNIX  
  
> unix는 사용자 친화적임—단지 친구를 가리는 것뿐임.  
>> 익명, "Art of unix Programming" by Eric S. Raymond  
  
- 2008년, 대학에서 공부하면서 첫 프로그래밍 직업을 찾기 시작함.  
- 대부분의 구인 공고에서 UNIX와 _socket_에 대한 지식을 요구했음.  
- 대학 커리큘럼에 unix나 운영체제에 대한 강의가 없어서 독학으로 공부하기로 결심함.  
- Andrey Robachevsky 등의 "The unix Operating System" 책을 통해 unix의 세계에 입문함.  
- Mandriva Linux를 설치하면서 unix 환경을 탐험하게 됨.  
- 이후로 unix는 모든 삶의 단계에서 함께 했음.  
- 대부분의 소프트웨어가 unix 환경에서 작동하며, 여전히 "Advanced Programming in the unix Environment" 책을 참고함.  
  
### Git  
  
> git으로 발을 쏘는 것은 쉽지만, 이전 발로 되돌아가 현재 다리와 봉합(merge)하는 것도 쉬움.  
>> Jack William Bell  
  
- 2009년 초, Rational ClearCase를 사용하여 버전 관리 시스템을 처음 접함.  
- ClearCase는 매우 혼란스러웠고, 최소한의 요구 사항만 처리함.  
- 이후 Subversion을 사용하게 되었고, "Version Control with Subversion" 책을 통해 학습함.  
- Subversion은 이해하기 쉽고 사용하기 쉬웠지만, 개인 프로젝트에는 불편했음.  
- 그 후 Git을 발견함.  
- Git은 학습 곡선이 가파르고 혼란스러웠지만, ClearCase와는 다른 종류의 혼란이었음.  
- Git은 버전 관리를 사용하는 마찰을 제거하여 모든 가치 있는 것을 버전 관리할 수 있게 함.  
- Git의 설계는 분산 시스템, 비순환 그래프, 콘텐츠 주소 지정 저장소의 우아한 혼합으로 매력적이었음.  
- Git의 내부를 학습하는 것이 재미있어서 다른 버전 관리 시스템에도 관심을 가지게 됨.  
- Git의 주요 단점은 스냅샷 지향 접근 방식으로 인해 병합을 이해하기 어렵게 만드는 것임.  
  
### Emacs  
  
> 어떤 텍스트 편집기도 파일을 저장할 수 있지만, Emacs만이 영혼을 구할 수 있음.  
>> Per Abrahamsen  
  
- Turbo Pascal 7.0의 친근한 파란색 창에서 첫 프로그램을 편집함.  
- 대학에서는 Pascal을 사용하여 프로그래밍을 배웠고, 이후 C++와 Java를 사용함.  
- 첫 프로그래밍 직장에서 NEdit를 사용했지만, Vim과 Emacs에 관심을 가지게 됨.  
- Vim은 음악 악기를 연주하는 것처럼 도전적이지만 재미있었음.  
- Emacs는 Lisp 기계로서 텍스트 편집과 창 관리 기능을 제공함.  
- Emacs의 내부 구조는 깨끗하고 잘 조직되어 있으며, 문서화도 잘 되어 있음.  
- Emacs Lisp을 사용하여 확장하는 것이 다른 편집기보다 훨씬 쉬움.  
  
### Boost.Graph  
  
> 나는 재사용 가능한 코드에 대한 유행에 강한 편견을 가지고 있음. "재편집 가능한 코드"가 블랙박스나 툴킷보다 훨씬 낫다고 생각함.  
>> Donald Knuth, Andrew Binstock과의 인터뷰  
  
- 2013년 새해 전야에 Boost Graph Library를 읽음.  
- 대부분의 알고리즘 라이브러리는 특정 데이터 표현에 의존하여 기존 프로젝트에 통합하기 어렵게 만듦.  
- Boost.Graph 라이브러리는 제네릭 프로그래밍을 사용하여 이 문제를 해결함.  
- 라이브러리를 실제로 사용한 적은 없지만, 설계는 STL 디자인과 제네릭 프로그래밍에 대한 이해를 깊게 해줌.  
  
### Bazel  
  
> make가 기대한 대로 작동하지 않는다면, makefile이 잘못되었을 가능성이 큼.  
>> Adam de Boor, "PMake—A Tutorial"  
  
- 2009년, 연구 프로젝트를 위해 첫 `Makefile`을 작성함.  
- `make`의 복잡성 때문에 더 나은 도구를 갈망하게 됨.  
- 다양한 빌드 시스템을 시도했지만, 모두 불만족스러웠음.  
- 2016년, Google에 입사하여 `blaze`를 사용하게 됨.  
- Bazel은 빌드 시스템의 마지막 퍼즐 조각이었음.  
- Bazel은 빠르고, 정확하며, 사용하기 쉽고, 언어에 구애받지 않음.  
  
### 결론  
  
- 좋은 enlightenmentware의 공통점:  
  - 깊은 문제를 해결하며, 일상적으로 직면하는 문제를 다룸.  
  - 작은 표면적에 많은 볼륨을 담고 있음.  
  - 내부를 탐험하도록 초대하고 격려함.  
  
### GN⁺의 의견  
  
- **UNIX의 중요성**: UNIX는 많은 프로그래밍 환경에서 기본적인 운영체제로 사용되며, 시스템 프로그래밍의 기초를 이해하는 데 필수적임.  
- **Git의 학습 곡선**: Git은 처음에는 어렵지만, 버전 관리의 강력한 도구로서 필수적임. 특히 분산 시스템과 협업 환경에서 유용함.  
- **Emacs의 유연성**: Emacs는 텍스트 편집기 이상의 기능을 제공하며, 특히 Lisp 프로그래밍에 관심이 있는 사람들에게 추천할 만함.  
- **Boost.Graph의 제네릭 프로그래밍**: Boost.Graph는 제네릭 프로그래밍의 강력한 예시로, 복잡한 알고리즘을 효율적으로 구현하는 방법을 배울 수 있음.  
- **Bazel의 효율성**: Bazel은 대규모 프로젝트에서 빌드 시스템의 효율성을 극대화할 수 있는 도구로, 특히 Google과 같은 대기업에서 유용함.

## Comments



### Comment 25498

- Author: zihado
- Created: 2024-05-23T13:36:07+09:00
- Points: 1

윈도우에서는 everything이 아닐지 ㅎㅎ

### Comment 25481

- Author: bus710
- Created: 2024-05-23T07:45:24+09:00
- Points: 1

Magit이 얼마나 좋길래 이렇게 명작 소프트웨어 대열에 이름을 올리는걸까요? 이맥스를 안 쓰니 알 수가 없네요.   
Nvim에서는 Neogit가 Magit으로부터 영향을 받았다고 하는데, 그거라도 써봐야할지...

### Comment 25482

- Author: bbulbum
- Created: 2024-05-23T08:07:09+09:00
- Points: 2
- Parent comment: 25481
- Depth: 1

lazygit 도 추천드립니다 ㅎㅎ

### Comment 25495

- Author: bus710
- Created: 2024-05-23T12:59:38+09:00
- Points: 1
- Parent comment: 25482
- Depth: 2

감사합니다.   
주말에 superfile과 lazygit을 설치해서 구경 좀 해봐야겠어요.

### Comment 25434

- Author: neo
- Created: 2024-05-21T15:33:32+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40419856) 
##### 해커뉴스 댓글 모음 요약

* **Compiler Explorer**:
  - Compiler Explorer는 컴파일러와 성능 최적화에 대한 논의를 크게 변화시켰음.
  - 포럼에서의 논의 품질에 긍정적인 영향을 미침.
  - Bold한 주장들을 링크를 통해 빠르게 검증할 수 있음.
  - llvm-mca와 uiCA 같은 도구도 유용함.

* **Windows 사용에 대한 의견**:
  - Windows에 대해 균형 잡힌 시각을 제시함.
  - NT 계열의 Windows는 훌륭한 운영 체제임.
  - 게임을 위해 Windows를 설치해둠.

* **Docker**:
  - Docker는 컨설팅 경력 동안 많은 시간을 절약해줌.
  - 오래된 프로젝트를 빠르게 실행할 수 있게 해줌.
  - 여러 데이터베이스 서버를 설치할 필요가 없어짐.
  - Python 환경을 재현 가능하고 병렬로 실행할 수 있게 해줌.

* **Spring Framework**:
  - Spring Framework는 의존성 주입 개념을 이해하는 데 방해가 됨.
  - 많은 Java 개발자들이 복잡한 프레임워크가 필요하다고 생각하게 만듦.
  - Spring 자체는 유용하지만, 소프트웨어를 더 복잡하고 덜 이식 가능하게 만들 수 있음.

* **Nix**:
  - Nix와 Nixpkgs로 많은 복잡한 작업을 수행할 수 있음.
  - Rust 바이너리의 정적 빌드 등을 쉽게 할 수 있음.
  - 다양한 빌드 옵션과 캐싱 기능을 제공함.
  - Nix는 매우 유용하지만, NixOS는 신중하게 접근해야 함.

* **Emacs**:
  - Emacs는 버그 수정 작업을 기술 연습으로 바꿔줌.
  - 지루한 작업을 재미있게 만들어줌.

* **'Round' 개념**:
  - 'Round' 개념은 최소한의 핵심 볼륨으로 최대한의 인터페이스 영역을 제공함.
  - Emacs와 Git의 핵심은 작고 단순하지만 강력함.

* **Magit**:
  - Magit은 단순함, 효과성, 발견 가능성의 교과서적인 예임.
  - Git의 기능을 더 잘 노출시켜줌.
  - 자체 용어와 워크플로우를 도입하지 않음.

* **SVN과 Git 비교**:
  - SVN 사용 경험은 매우 부정적이었음.
  - Git은 훨씬 더 직관적이고 이해하기 쉬웠음.
  - Git을 사용하면서 작업 흐름이 더 나아짐.

* **Linux, Emacs, Bazel, Magit 사용 경험**:
  - Linux에서 Emacs와 Bazel을 사용하여 작업을 수행함.
  - 블로그를 찾아보고, Emacs에서 작업을 저장하고, Magit을 사용하여 커밋 메시지를 작성함.
  - Git 저장소에 푸시함.
