1. 체스
OOP를 막 수강한 학생이라면 체스 게임을 만들어보는 것이 좋음. 다른건 설계와 구현을 하는데 크게 문제가 없는데, 특수 행마법(캐슬링, 앙파상, 승진), 동형반복 무승부등을 구현하면서 나름 괜찮다고 생각한 설계가 박살하는 경험이 가능함. 전부 다 구현했다면 아래 3개를 더 구현해보는 것이 좋음
1) 새로운 종류의 기물이 있는 체스
2) 새로운 규칙 (특정 칸에 킹이 도착하면 이긴다거나, 새로운 기물을 소환할 수 있다거나 ...)
3) 8 * 8이 아닌 다른 사이즈의 체스 보드
2. 에디터
vi, nano처럼 GUI 환경이 아닌 환경에서 작동하는 에디터를 만들어보는 것도 좋음.
1) 유저의 키보드, 마우스 입력을 어떻게 처리하면 좋은가?
2) 상기 입력(이벤트)마다 화면을 업데이트하려면 어떤 방법이 좋은가?
3) 커서의 이동, 스크롤링, 히스토리(redo, undo), 검색은 어떻게 해야하는가?
4) 고용량의 파일을 처리하려면 어떻게 해야하는가?
아마 4번을 수행하면서 3번에 많은 문제가 생길거임.
3. 간단한 컴파일러, 혹은 인터프리터
컴파일러 혹은 오토마타 과목을 수강했다면 생각보다 쉽게 만들 수 있음.
1) 만드려고 하는 언어의 기본적인 구조를 구상한다.
2) 문법을 구성한다.
3) 렉서와 파서를 구현한다.
4) AST를 토대로 분석(타입 체크, 심볼 테이블 작성, ...)을 시작한다.
5) AST를 어셈블리어나 가상 머신 코드, 아니면 중간 표현으로 변환한다.
6) 실제 머신이나 가상 머신에서 실행한다.
컴파일러, 인터프리터의 많은 부분이 생략되었지만, 충분히 흥미를 느낄 수 있음.
3번은 보통 파서 생성기를 이용하면 쉽게 가능함. 사용하지 않는다고 하면 렉서는 보통 DFA를 이용하고, 파서는 재귀 하강 파서를 만드는데, 아마 문법을 수정해야 할 가능성이 높음.
아마 5번이나 6번은 배우지 않는 경우가 많아서 어려울텐데, 컴파일러 제작 관련 도서들이 많이 있으니 그거 참고하면 됨.
5번 6번 과정을 하지 않더라도 거대한 시스템에서 사용자의 입력을 해석해서 디버깅 용도로 사용된다거나 하는 식으로 그 이전 과정들이 생각보다 자주 사용됨.
4. custom protocol 구현하기
새로운 통신 규약을 정해서 두 피어가 적절하게 통신할 수 있도록 만드는 프로젝트도 재미있음. 추천은 HTTP, 쉽기도 하고 인터넷에 예제도 많고, 다 만들면 html 하나 올려서 인터넷 브라우저로 결과도 볼 수 있음.
만약 데이터 통신 시간에 배운거 싹 다 한 번씩 복습하고 싶다고 하면 TCP 구현해보는 것도 좋은데, 양도 많고 어려울거임
5. 시간 기반 일회용 비밀번호(tOTP)
간단하고 쉽지만 어떤 일이 문서 형태로 주어졌을 때 문제를 해결하는 방법을 학습하기 좋음. RFC 6238 참조.