텍스트 편집기, 컴파일러, 운영 체제, 레이트레이서와 같은 프로젝트를 진행하는 것이 프로그래밍 실력을 향상시킬 수 있지만, 소프트웨어 엔지니어링 능력을 향상시키는 것은 아님. 실제로 이러한 프로젝트는 "여기서 발명되지 않음(Not Invented Here)"이라는 재앙적인 원칙을 내포하고 있어 소프트웨어 엔지니어링에 있어서는 역효과를 낼 수 있음.
라이브러리에서 가져올 것인지, 직접 작성할 것인지 결정하는 능력
프로젝트 요구 사항에 맞는 고품질 라이브러리 및 프레임워크 식별 능력
최적화가 가치 있는 곳과 그렇지 않은 곳을 결정하는 능력
몇 년 후에도 여전히 읽을 수 있는 코드 작성 능력
프로젝트를 대규모 복잡한 시스템으로 생각하며 소프트웨어 및 비소프트웨어 의존성 고려 능력
대안적인 도전으로 웹 검색 엔진 만들기를 제안. 문자열 매칭 알고리즘 등은 이미 다른 사람들이 해결했으므로, 실제로 작동하는 검색 엔진(및 크롤러)을 만드는 것이 목표임.
UI/웹 기반 프로젝트로는 다음과 같은 것들을 추천함:
Unity나 Unreal을 사용한 간단한 비디오 게임 (게임에서 30-60fps가 중요하기 때문에 다른 곳에서도 성능이 좋은 인터페이스를 만드는 데 도움이 됨)
React와 유사한 간단한 자바스크립트 프레임워크 (데이터 흐름 및 이벤트 처리 이해에 도움이 됨)
XMLHTTPRequest 주위에 http 라이브러리 래퍼 (fetch가 존재하지만, HTTP 요청을 처음부터 어떻게 보내고 읽는지 이해하는 것은 CORS 문제, OPTIONS 요청 등을 디버깅할 때 도움이 됨)
미니 운영 체제에 대한 긍정적인 의견. 애플리케이션 개발자로서 운영 체제의 기능(메모리 관리, 파일 시스템 등)에 의존하고 있으며, 어떻게 이런 것들이 뒤에서 작동하는지 궁금해질 것임. xv6를 사용하여 여가 시간에 다양한 프로세스 스케줄링 알고리즘을 학습하고 구현하는 것은 매우 유익하고 재미있는 경험임.
물리적인 것에 손을 대보고 싶은 욕구, 예를 들어 로봇이나 자동 조종 장치가 있는 드론, 프로그래밍 가능한 GNC 매개변수를 가진 우주 비행기의 비행 역학에 대한 정확한 시뮬레이션 등. "Fundamentals of Astrodynamics"라는 책을 가지고 있으며 이번 휴가 시즌에 이를 활용하고 싶음. GNC(유도, 항법 및 제어)에 대한 좋은 정보를 얻고 싶음.
개인적인 취향과 상황에 따라 다르지만, 아이디어를 찾고 있다면 좋은 시작점이 될 수 있는 목록. Sinclair ZX Spectrum을 사용하여 음악 스태프 편집기와 트래커, 2D 게임(스페이스 인베이더) 등을 만들었음. 첫 번째 컴퓨터(386)로는 허프만 압축기, B-Tree 인덱스, OOP 폼 생성기, 다이얼업용 이메일 체커, 수동 파서 등을 만들었음.
텍스트 편집기에 대한 논의: 텍스트 문서를 메모리에 어떻게 저장할지가 가장 큰 도전임. 배열을 사용하는 것이 첫 번째 생각이었지만, 문서의 끝이 아닌 곳에 텍스트를 삽입할 때 성능이 매우 나쁨. 하지만 자바스크립트 문자열을 사용하고 2년 이상 편집기를 사용하는 동안 성능 문제가 없었음. 물론 다른 많은 문제들이 있었음, 예를 들어 긴 수평선을 렌더링하는 것은 최적화 접근 방식이 단일 라인 렌더링이 저렴할 것이라고 가정했기 때문에 문제가 됨.
간단한 장난감 레이트레이서를 시도해보는 것도 좋은 생각임. 비트맵 그래픽의 구와 확산 및 반사 반사를 수행하는 레이트레이서를 만드는 것은 프로젝트를 너무 복잡하게 하지 않는 한 상대적으로 제한된 프로젝트가 될 수 있음.
스페이스 인베이더를 작성하기 위해 "팩토리 패턴"이 필요하다고 생각한다면, 문제가 있는 것임. 원래 게임에서 그런 디자인 개념이 사용되었다고 확신할 수 없음.
배열을 데이터 구조로 사용하는 텍스트 편집기에 대한 의견. 타이핑하는 동안 빠른 속도가 필요하며, 한 줄만 변경하면 됨. 새로운 줄을 입력할 때, 엔터를 누른 후 배열을 재구성하는 데 필요한 추가 지연은 수백만 줄에 대해서는 눈에 띄지 않음. 텍스트 편집기의 더 도전적인 부분은 사용자가 보는 것만 렌더링하는 것을 확실히 하는 것임.
Hacker News 의견
텍스트 편집기, 컴파일러, 운영 체제, 레이트레이서와 같은 프로젝트를 진행하는 것이 프로그래밍 실력을 향상시킬 수 있지만, 소프트웨어 엔지니어링 능력을 향상시키는 것은 아님. 실제로 이러한 프로젝트는 "여기서 발명되지 않음(Not Invented Here)"이라는 재앙적인 원칙을 내포하고 있어 소프트웨어 엔지니어링에 있어서는 역효과를 낼 수 있음.
UI/웹 기반 프로젝트로는 다음과 같은 것들을 추천함:
미니 운영 체제에 대한 긍정적인 의견. 애플리케이션 개발자로서 운영 체제의 기능(메모리 관리, 파일 시스템 등)에 의존하고 있으며, 어떻게 이런 것들이 뒤에서 작동하는지 궁금해질 것임. xv6를 사용하여 여가 시간에 다양한 프로세스 스케줄링 알고리즘을 학습하고 구현하는 것은 매우 유익하고 재미있는 경험임.
물리적인 것에 손을 대보고 싶은 욕구, 예를 들어 로봇이나 자동 조종 장치가 있는 드론, 프로그래밍 가능한 GNC 매개변수를 가진 우주 비행기의 비행 역학에 대한 정확한 시뮬레이션 등. "Fundamentals of Astrodynamics"라는 책을 가지고 있으며 이번 휴가 시즌에 이를 활용하고 싶음. GNC(유도, 항법 및 제어)에 대한 좋은 정보를 얻고 싶음.
개인적인 취향과 상황에 따라 다르지만, 아이디어를 찾고 있다면 좋은 시작점이 될 수 있는 목록. Sinclair ZX Spectrum을 사용하여 음악 스태프 편집기와 트래커, 2D 게임(스페이스 인베이더) 등을 만들었음. 첫 번째 컴퓨터(386)로는 허프만 압축기, B-Tree 인덱스, OOP 폼 생성기, 다이얼업용 이메일 체커, 수동 파서 등을 만들었음.
텍스트 편집기에 대한 논의: 텍스트 문서를 메모리에 어떻게 저장할지가 가장 큰 도전임. 배열을 사용하는 것이 첫 번째 생각이었지만, 문서의 끝이 아닌 곳에 텍스트를 삽입할 때 성능이 매우 나쁨. 하지만 자바스크립트 문자열을 사용하고 2년 이상 편집기를 사용하는 동안 성능 문제가 없었음. 물론 다른 많은 문제들이 있었음, 예를 들어 긴 수평선을 렌더링하는 것은 최적화 접근 방식이 단일 라인 렌더링이 저렴할 것이라고 가정했기 때문에 문제가 됨.
간단한 장난감 레이트레이서를 시도해보는 것도 좋은 생각임. 비트맵 그래픽의 구와 확산 및 반사 반사를 수행하는 레이트레이서를 만드는 것은 프로젝트를 너무 복잡하게 하지 않는 한 상대적으로 제한된 프로젝트가 될 수 있음.
스페이스 인베이더를 작성하기 위해 "팩토리 패턴"이 필요하다고 생각한다면, 문제가 있는 것임. 원래 게임에서 그런 디자인 개념이 사용되었다고 확신할 수 없음.
배열을 데이터 구조로 사용하는 텍스트 편집기에 대한 의견. 타이핑하는 동안 빠른 속도가 필요하며, 한 줄만 변경하면 됨. 새로운 줄을 입력할 때, 엔터를 누른 후 배열을 재구성하는 데 필요한 추가 지연은 수백만 줄에 대해서는 눈에 띄지 않음. 텍스트 편집기의 더 도전적인 부분은 사용자가 보는 것만 렌더링하는 것을 확실히 하는 것임.