18년간 리눅스 콘솔을 사용했고, 후회하지 않음

1 day ago 3

Linux를 처음 만나다

  • 첫 컴퓨터를 받은 후 프로그래머인 친구로부터 Linux라는 운영체제에 대해 들음
  • 인터넷 접근이 제한적이었던 2000년대 초, 학교에서 56kbps 모뎀으로 1~2주에 몇 시간씩 인터넷을 사용함
  • Windows XP를 사용하며 게임을 즐기고 Pascal 프로그래밍을 배움
  • Linux 배포판을 다운로드할 방법이 없어 책과 CD를 통해 처음 접함
    • 서점에서 "Slackware/MOPSLinux for the user (with disk)" 책을 구매하며 Linux에 본격적으로 입문
    • Windows XP와 듀얼 부팅 설정, /etc/X11/xorg.conf 파일 설정, vim 사용법 학습 등 다양한 실험 진행
    • fdisk로 하드 드라이브를 파티셔닝하며 시스템 내부를 깊이 이해하기 시작
    • 콘솔 명령어 학습과 수동으로 X 서버를 구성하며 Linux 시스템의 작동 방식을 탐구
  • Xakep 잡지에서 받은 소스 코드를 컴파일하며 프로그래밍 기술을 발전시킴
  • 인터넷 없이도 책과 man 페이지, 소스 코드만으로 문제를 해결하며 독립적인 학습 능력을 기름
  • 대부분의 소프트웨어는 여전히 Windows용이었고, 게임과 문서 호환성 문제로 Windows XP를 병행
  • 인터넷 없이 Linux에서 DNS와 HTTP 서버 같은 기능을 배우지만 실질적 사용 사례는 부족
  • Linux 콘솔에서의 경험은 현재까지도 유용한 기본기를 제공
    • 예: ldd로 라이브러리 확인, strace로 프로그램 오류 디버깅
  • 과거의 경험 덕분에 구형 소프트웨어를 다룰 때 시간을 크게 절약할수 있었음

붉은 눈의 시기

  • 2007년 ITMO 대학교에 입학하며 상트페테르부르크로 이주
  • 당시 네프스키 거리의 대형 서점(책의 집)과 DVK를 방문하며 Linux와 프로그래밍 관련 책 구매:
  • 인터넷은 여전히 다이얼업을 통해 제한적으로 사용
    • 학생 포털 확인이나 무료 전자책 다운로드에만 활용
    • 시간이 초과되면 다시 우체국에서 인터넷 카드 구매 필요
  • 책을 통해 시스템 호출을 공부하고 간단한 프로그램을 작성하며 프로그래밍 학습 지속
  • 2009~2010년경 무제한 인터넷이 제공되며 학습 환경이 확장
  • 다양한 Linux 배포판 설치하며 실험
    • 배포판 선택 기준: "데스크톱 환경이 아름답다!"라는 이유
  • 당시 사용했던 FluxBox 창 관리자와 GVim으로 C 코드 작업
    • 플러그인으로 구성된 GVim에서 코드를 작성하고 디버깅
    • GNU Assembler 코드 작성 스크린샷도 남아 있음
  • Open Office에서 생성한 파일 출력 문제를 해결하기 위해 LaTeX 학습
    • vim에서 보고서를 작성하고 PDF로 출력, 어디서나 동일하게 출력 가능
  • 시스템 프로그래밍 프로젝트
    • Jabber 원격 셸 프로그램: jabsh (SourceForge 링크)
      • Jabber 클라이언트(Bombus)를 사용해 Jabber 서버를 통해 명령을 원격으로 실행
      • 정적 IP 주소가 없던 시절 컴퓨터를 원격으로 관리하기 위해 개발
      • 실제로 동작했으며, 사용자 중 한 명은 인도에서 이메일로 문제를 문의하기도 함
    • 여름 프로젝트로 작성된 termprogs (코드 링크)
      • 중앙 서버를 통해 여러 "터미널"을 관리하는 시스템
      • UNIX 네트워크 애플리케이션 개발에 대한 Stevens의 책을 읽으며 실무에 시스템 프로그래밍 지식을 적용
  • 시스템 설계 스키마를 기반으로, 분산된 워크스테이션 관리와 네트워크 애플리케이션 개발 경험 축적

ITMO 대학교에서의 정규표현식 101

  • 대학 2~3학년 즈음, 시스템 프로그래밍 수업을 듣기 시작
    • Sun Microsystems의 얇은 클라이언트와 CRT 모니터로 구성된 환경에서 터미널과 vim 사용법을 학습
    • 학교에서 이미 터미널과 vim을 익혔기 때문에 초기 수업은 복습 수준에 불과
  • 학기의 중반부터 본격적으로 정규표현식과 grep, sed, awk 사용법 학습
    • 정규표현식에 대한 깊이 있는 학습으로 이어짐
    • "문자열을 검색"하는 단순 사용법에서 벗어나, 복잡한 정규표현식 문제를 해결하며 기술 습득
  • 학기 말이 되자 정규표현식을 활용하는 능력이 자연스럽게 체득됨
  • 정규표현식 지식은 이후 업무와 개인 프로젝트에서 시간을 크게 절약해주는 중요한 도구로 자리 잡음
    • "정규표현식을 사용하면 문제가 두 배가 된다"는 편견에 동의하지 않음
    • 실제로 sed, Java의 Pattern, Matcher 등을 활용해 문자열을 분석한 후 테스트와 배포를 통해 문제 없이 오랜 기간 작동
  • 정규표현식을 배우는 동시에 커뮤니티 활동 시작
    • welinux.ru에 글 작성
    • linuxforum.ru에서 다른 사용자와 토론
    • SPbLUG(Saint Petersburg Linux Users Group) 모임 참석
  • WordPress 블로그 운영 경험
    • 무료 VPS를 활용해 WordPress 설치 및 설정
    • CPU 및 메모리 제한 내에서 VPS를 효율적으로 사용하며 블로그 글 작성에 중독됨
    • 흥미로운 이야기를 담은 텍스트 작성에 관심을 가지며 글쓰기 기술 향상

Linux와 임베디드 프로그래밍

  • 2011년, 임베디드 프로그래밍에 도전
    • 하드웨어에서 직접 작동하는 코드를 작성하며 디버깅
    • 깜박이는 LED, UART 디버그 출력, 오실로스코프 등 다양한 도구 사용
    • EEPROM, SRAM과 같은 하드웨어 내부 구조에 대한 지식이 항상 요구됨
  • 대학에서는 주로 Windows 기반 환경에서 개발
    • VirtualBox에 Windows를 설치하거나 Linux에서 네이티브 툴을 활용해 문제 해결
    • sdcc로 컴파일하고, 수정된 m3p 유틸리티를 Linux에서 펌웨어 작성에 사용
  • 현대 배포판의 복잡성(NetworkManager, PulseAudio 등)에 피로를 느껴 Arch Linux로 전환
    • 최소한의 시스템 설치 후 필요한 소프트웨어만 추가
    • 주로 콘솔 기반 소프트웨어 사용:
      • vim/emacs: 텍스트 및 코드 편집
      • latex: 보고서와 발표 자료 작성
      • 타일링 윈도우 매니저(xmonad, i3wm 등): 간소화된 환경에서 효율적 작업
      • 기타 유틸리티: grep, sed, git, make, cron 등
    • dotfiles 저장소를 유지하며 설정 파일 관리
  • KDE/GNOME과 같은 무거운 데스크톱 환경의 "와우 효과"는 일시적임을 깨닫고, 간소화된 타일링 환경 선호
  • GUI 소프트웨어나 Web 앱의 제한된 커스터마이징과 성능 부족에 실망
  • Gmail의 리디자인이 성능 저하와 RAM 사용 증가를 초래, mutt로 이메일 클라이언트를 전환
    • 47,000개의 이메일을 maildir에 저장하며 성능 유지
  • Linux Mint에서 시스템 초기화 방식(systemd) 변경으로 불편을 겪음
    • System-V init이나 BSD 스타일의 init 시스템 선호
    • systemd의 강제 도입과 기존 유틸리티 대체에 반발
  • 임베디드 프로그래밍을 떠나 Java 엔터프라이즈로 전환하며 더 높은 연봉과 선호하는 기술(stack)을 추구
  • systemd를 사용하지 않는 배포판을 찾다 Gentoo 선택
    • OpenRC 초기화 시스템 사용
    • /etc/portage/make.conf 설정: USE="-systemd unicode -pulseaudio X alsa"
    • 간단하고 안정적인 시스템으로 5년 이상 문제없이 유지
  • GenToo 업데이트 후 발생한 두 가지 주요 문제:
    1. Midnight Commander 설정 파일이 mc.ext에서 mc.ext.ini로 변경되어 수동으로 수정
    2. Firefox 바이너리 패키지가 ALSA 라이브러리와 제대로 링크되지 않아 브라우저에서 소리가 나지 않음
    • 이전 버전으로 롤백 후 Gentoo 버그 트래커에서 문제 보고, 며칠 후 수정됨
  • 간단하고 명확하게 설계된 소프트웨어 사용이 시스템 안정성 유지의 핵심

기대했던 것과 얻은 것

  • 현재의 Linux 시스템
    • "커널에 패치를 커밋하는 해커" 수준에는 도달하지 못했지만, 다년간의 콘솔 유틸리티 실험 덕분에 안정적이고 간단한 시스템을 구축
      • 인터페이스가 "최신 트렌드"에 따라 갑자기 바뀌지 않는 환경
      • 설정은 모두 Git으로 관리, 변경 사항은 사용자가 명시적으로 결정
  • 개인화된 Linux 환경에서 해결한 문제들
    • 예산 관리:
    • 트랙볼 커스터마이징:
      • Logitech Trackman Marble에 중간 클릭 버튼과 스크롤 기능 추가
      • /etc/X11/xorg.conf.d/50trackball.conf 파일 생성 후 설정
      • "Back" 버튼은 중간 클릭으로, "Forward" 버튼은 스크롤 버튼으로 변환
    • 키보드 Fn 버튼 재설정:
      • 오디오 제어 버튼이 없는 키보드의 Fn 버튼을 xmodmap으로 재매핑
  • Linux에서의 철학과 선택
    • 내가 익숙한 프로그램 실행을 우선시하는 환경:
      • Gentoo와 Devuan을 통해 불필요한 변화를 피함
      • systemd와 같은 새로운 초기화 시스템, X 서버 대체 기술 등에는 참여하지 않음
      • i3wm, Emacs, Firefox, RawTherapee와 같은 기존 도구 유지
  • 향후 대안:
    • 만약 현재의 "보루"가 무너진다면 FreeBSD로 전환 가능
    • FreeBSD에서의 설정:
      • Makefile에서 gmake 사용
      • 스크립트에서 #!/bin/bash 대신 #!/usr/bin/env bash 사용
    • Docker와 LUKS 암호화 컨테이너는 포기해야 하지만 익숙한 환경 유지가 더 중요
  • Vim이나 Emacs를 무조건적으로 추천하지 않음
    • 도구를 배우고 설정하는 과정은 많은 시간과 노력이 필요
    • 프로그래밍 생산성은 타이핑 속도가 아닌 문제 해결 능력과 설계 숙고에 의해 결정
      • 60-70%: 설계와 문제 해결
      • 10-15%: 동료와의 커뮤니케이션
      • 20-25%: 실제 코딩
  • IDE의 장점:
    • Emacs나 Vim의 LSP 서버도 유용하지만, Java 같은 언어에서는 IDEA 같은 복잡한 IDE가 여전히 더 나은 선택
    • Emacs의 LSP는 Lombok과 같은 툴을 제대로 지원하지 않거나, 파일 변경 사항 업데이트가 느림
  • 사진 편집(RawTherapee), 이미지 작업(GIMP), 웹 브라우징(Firefox)은 GUI에서 더 적합
  • 파일 복사, 간단한 작업 등은 콘솔이 더 빠를 수 있음
  • Linux는 GUI와 텍스트 기반 인터페이스를 모두 선택할 수 있는 유연성을 제공함

Read Entire Article