Programmer
-
초반에는 문제의 원인을 충분히 넓게 잡아라.Programmer/Programming 2014. 7. 15. 18:09
파일 읽기 플러그인에 다수의 기능을 추가했다. 추가된 기능은 원격 파일 읽기, 버퍼 읽기, 캐시 등이 있다. 원격 파일을 읽는 기능이 이전 버젼에 비해서 과도하게 CPU를 점유하고 있었다. 분석의 과정이 없이 추론에 근거하여 새로 추가된 원격 기능과 캐싱 알고리즘만을 의심했다. 그리고 내 시스템과 연동하는 HTTP 프록시 서버의 문제일 수 있다는 생각도 했다. 이전에 이런 접근 방법을 경고하는 글을 적었음에도 나란 인간은 같은 실수를 되풀이했다. 경험과 직감에만 의존한 추측과 코드 수정, 그리고 결과 보기를 반복했다. 이후 동료의 조언으로 프로파일링의 접근을 시도하였다. 이번 문제의 원인을 찾기 위한 제대로된 분석의 첫번째 시도였다. 아뿔싸! 나란 인간은 또다른 문제를 가지고 있었다. 여러번의 프로파일링..
-
리스프 개발 팁: 명령창 결과 저장하기Programmer/Programming 2014. 6. 27. 10:38
리스프에서 개발하기 가장 좋은 도구는 REPL 명령창이다. 따라서 저장할 내용을 표준 출력으로 보내면 개발이 수월할 것이다. 예를 들어, 당신은 `MY-SAVE' 함수를 개발하고 있다. 이 함수는 인자 `FNAME'으로 받은 파일명에 당신의 데이타를 저장한다. 개발 과정에서 수시로 파일을 열어서 내용을 확인해야 한다. 불편하다. REPL 명령창에 저장할 내용을 바로 확인하면 개발이 훨씬 편하겠다. 데이타를 저장할 형태로 가공하여 REPL 표준 출력하는 함수 `MY-WRITE'를 작성하자. 이 함수의 구현과 검증은 REPL을 벗어날 필요가 없다. 이제 함수 `MY-SAVE'는 단지 표준 출력을 저장할 파일에 연결한 후에 `MY-WRITE'를 호출하면 된다. (defun my-save (fname) (wit..
-
리습의 개발 방법을 배우자: 함수의 구현Programmer/Programming 2014. 6. 26. 10:37
구현이 어느정도 명확해졌으면 주로 바텀-업 방식을 사용한다. 바텀-업은 구현 결과를 눈으로 확인하며 구현하는 장점이 있다. 다소 복잡한 구현부가 있으면 스텁 함수(stub functions)로 대체한다. 스텁 함수를 사용하는 것은 이전 포스트에서 설명하였다. 스텁 함수를 예상하는 결과로 동작하도록 하드코딩 하는 것도 좋은 트릭이다. 2014/06/20 - [Programming/Functional] - 리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계 2014/06/24 - [Programming/Functional] - 리습의 개발 방법을 배우자: 함수와 하위 함수의 설계 이번 포스트에서는 엣지 리스트를 연관 리스트(association lists, 줄여서 alist)로 변환하는 함수를 개발한다. ..
-
리습의 개발 방법을 배우자: 함수와 하위 함수의 개발Programmer/Programming 2014. 6. 24. 11:36
상위 함수에서 하위 함수를 구현해 나가는 것을 탑-다운 방식으로 설명하보겠다. 보통 큰 틀을 설계할 때는 탑-다운 방식이 적합하다. 2014/06/20 - [Programming/Functional] - 리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계 2014/06/26 - [Programming/Functional] - 리습의 개발 방법을 배우자: 함수의 구현 이 게임의 배경이 되는 도시를 만든다. 주인공이 처음 방문한 도시이기 때문에 매 게임마다 새로운 도시를 만들어야 한다. [규칙 3.2] 새로운 도시를 만드는 것은 새 지도를 만드는 것이고, 지도라 함은 경로의 집합니다. 우리는 경로를 그래프로 표현한다. 경로의 끝이나 교차점을 노드라고 표현한다. 엣지는 경로의 최소 표현 단위로써, 두개의 노..
-
리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계Programmer/Programming 2014. 6. 20. 16:06
1. 캐릭터 1.1. 리스프 에일리언 (주인공) 1.1.1. 총알 하나가 장전된 권총 1.2. 웜퍼스 (당신이 쫓고 있는 배신자) 1.2.1. 총상을 입었음 1.2.2. 성능 좋은 AK-47 소총을 가지고 다님 1.3. 반딧불이 (도시의 갱단) 1.3.1. 마주치면 행인을 눈을 가린채 다른 장소로 내던짐 1.3.2. 빛을 냄 1.4. 경찰 1.4.1. 주인공과 웜퍼스를 찾고 있음 1.4.2. 도로 중간에 장애물을 설치함 1.4.3. 싸이렌을 울림 2. 배경 장소 2.1. 도시 2.1.1. 처음 방문한 도시 3. 규칙 설계 3.1. 주인공의 공격이 실패하면 게임이 끝남 (1.1.1) 3.2. 매 게임마다 도시의 구성(장소, 도로, 다른 캐릭터의 위치 등)을 새롭게 만듬. (2.1.1) 3.3. 주인공은 임..
-
테스트 주도 방식으로 리스프 매크로 작성하기Programmer/Programming 2014. 6. 5. 11:34
Lisp에서 매크로를 작성하는 방법을 "Peter Seibel"의 "Practical Common Lisp"에 따르면 다름과 같은 순서로 진행한다. (비록 쓸모는 없지만 쉽게 이해할 수 있는 두 숫자를 더하는 매크로를 작성하겠다.) 우선 호출할 예제 폼을 작성한다. (add 3 5) 위 예제 폼으로 확장될 코드를 작성한다. (+ 3 5) 매크로를 구현하다. (defmacro add (x y) `(+ ,x ,y)) 테스트 주도 방식을 적용하면 대략 다음과 같다. 2013/05/07 - [Programming/Project Management] - 테스트 주도 개발 - 둘째날 우선 호출할 예제 폼을 작성한다. 위 예제 폼으로 확장될 코드를 작성한다. 테스트 케이스를 작성한다. (테스트 프레임워크는 생략한다...
-
MAPCAR와 그 친구들(MAPC, MAPCAN)Programmer/Programming 2014. 5. 30. 16:05
MAPCAR는 리스트의 값에 동일한 작업을 처리하는데 유용하다. MAPCAR의 인자는 적용할 함수와 한 개 이상의 리스트를 인자로 가진다. 인자 함수는 리스트의 개수만큼 인자를 받을 수 있어야 한다. MAPCAR는 인자 함수의 결과를 리스트로 묶어서 반환한다. 리스트의 모든 값에 10을 더해보다. (인자 함수가 한개의 인자를 가지는 것을 주목한다.) (mapcar #'(lambda (x) (+ x 10)) (list 1 2 3)) ; => (11 12 13) 두개의 리스트의 값을 더해보다. (인자 함수가 두개의 인자를 가지는 것을 주목한다.) (mapcar #'(lambda (x y) (+ x y)) (list 1 2 3) (list 4 5 6)) ; => (5 7 9) MAPC, MAPCAN는 반환값(..
-
프로젝트 초반에 완벽한 설계에 공들이 필요가 없는 이유Programmer/Etc 2014. 3. 19. 10:38
프로젝트 초반에 설계에 많은 시간과 공을 들이는 것에 대해서 부정적으로 생각한다. 혹시나 오해하는 분이 계실까봐서 미리 말하자면, 설계가 필요없다는 것은 아니다. 프로젝트의 과정을 간단히 말하면 "설계-구현-테스트"의 반복이며 각각의 비중은 같다. 즉, 설계와 테스트의 단계 역시 구현과 동일하게 중요하다. 하지만, 아래 설명할 몇가지 이유로 프로젝트 초반에 설계를 결정지으려고 하기보다는, 프로젝트 초반에는 대략적인 스케치로 시작해서 프로젝트 전반에 걸쳐 반복 작업을 통해서 구체화하여야한다. 프로젝트 전반에 걸쳐서 설계는 수시로 변할 수 밖에 없다. 그 이유를 몇가지 나열하자면, 프로젝트를 수행하면서 프로젝트에 대한 이해가 넓고 깊어진다. 프로젝트의 배경 지식과 더불어 개발의 지식과 경험도 늘어간다. 프로..