728x90

* 버그를 없애기 위해

 - 찾아내기

 - 문제점 진단

 - 원치 않는 동작의 흔적 지우기

 - 다른 곳에 영향을 끼치지 않았는지 확인

 

* bug를 찾아서 patch code를 만들 때는 work-around를 절대 조심해야 한다.

work-around는 돌아가만 가도록 하는 코드로, 보통 통신에서 명백하게 상대방의 잘못인데 상대방을 고치지 못하는 상황에서 어쩔 수 없이 사용하는 경우에만 허용해야 한다. 잘 기억했다가 근본 문제가 해결되면 지우는 것이 최종 목표이다.

 

* 결함을 찾을 때는 모든 것을 의심해야 한다. 경험이 많아질수록 의심할 수 있는 범위가 넓어진다.

 

* Timing : 의외로 문제를 많이 일으키는 녀석이다.

프로그램은 논리적인 절차대로만 움직일 것 같지만 사실은 시간이 중요한 역할을 한다. 특히 통신에 있어써는 더욱 그렇다.

대학생 때 카메라로 사진을 저장하여 얼굴을 인식하고 특징점을 잡는 프로젝트를 했는데 일련의 과정을 수동으로 버튼을 눌러가면서 진행하면 잘 돌아가는데 한번에 자동으로 돌아가게 하면 crash가 발생했다. 원인은 이미지가 저장되는데 시간이 걸리는 것 때문에 read를 했을 때 일부만 읽어 처리하여 저장해야 할 공간보다 원본의 필셀이 부족한 것이었다.

10년이 넘는 시간이 지나 실무에서도 비슷한 일을 겪었다. 통신 중에 이미지를 요청하고, 저장하고, 화면에 뿌리는 일련의 과정에서 각 과정이 끝난 것을 확인하고 다음 단계로 넘어갔는데도 이미지가 잘리는 현상이 발생했다.

이미지는 고유한 handle이 있어 이를 이용해 요청하고, 이를 이용해 저장하므로 중복이 되지도 않는다. 라고 생각했지만 그것이 문제를 일으켰다. store에서 설치한 app들이 handle을 가지고 이미지를 요청하게 되는데 같은 handle에 대해 두 번씩 요청하는 app이 있었고, 그것이 문제를 만들었다. 이미지 저장이 끝나고 read를 하는 도중에 다시 write를 하고 있었던 것이다.

 

* 디버깅에는 정답이 없다. 애초에 있지 말아야 할 오류를 잡아내는 일이기 때문이다. 그래서 많은 사람들이 이에 조금이라도 도움을 주기위해 오류가 발생하지 않도록 하는 방법론을 만들고 Tool도 만들었다. 그런데 이미 발생한 오류를 잡는 방법은 없을까? 과학자들이 과학적인 현상에 접근하는 방식은 4단계가 있다고 한다.

1. 현상을 관찰

2. 가설 성립

3. 가설을 이용한 결과 예측

4. 예상이 맞는지 실험

 

* Bug의 발견

여기서 말하는 Bug란 잘못된 동작 즉, 고장이란 말이다. 물리적인 고장이 아니라 원하는대로 동작하지 않는 증상을 말한다. 고장을 식별하는 것은 개발자가 먼저 거르고, 품질 관리팀에서 다시 검증하고 나서도 마지막으로 최종 사용자에 의해 발견되기도 한다. 일반적으로는 품질 관리팀에서 발견하는 이슈를 많이 처리한다.

 

* 식별

가장 먼저 해야할 일은 이 증상이 정말 Bug인지 확인하는 과정이다.설계된 대로 동작하는데 내 마음에 들지 않는다고 Bug라고 할 수는 없으니 말이다. 이를 위해 예상 동작과 bug로 인식한 동작을 함께 기록하여 보고한다.

예상 동작 : A->B->C

실제(발견) 동작 : A->B->A

 

*Logging

문제가 발견되면 분석과 해결을 위해 log를 엔지니어에게 넘기게 되는데 이 부분이 관건이다. 단순 프로그램은 printf를 파일로 저장한 정도면 충분한데 Embedded 통신에서는 log의 종류가 너무 다양하다.

Bluetooth를 예로 들어보자.

Over The Air log : RF 통신을 하기 때문에 무선을 logging하는 장비들이 있다. 이 기록이 통신상의 문제, 특히 상대 장비(peer device)의 문제를 파악하는데 필요하다.

HCI sniff log : Host AP와 BT chip(controller)사이에는 보통 UART로 통신하는데 이 부분에 대한 log도 필요하다. UART flow control pin을 포함하여 잡는데 packet을 분석하면서 잡는 툴 들이 있다. 보통 Air log를 잡는 sniffer가 이를 함께 지원하는 경우가 많다.

Snoop log : HCI sniff log와 마찬가지로 HCI로 주고 받는 packet을 파일로 저장한 log다. 실제 통신은 아니고 AP에서 주고 받는 것을 저장하기 때문에 참고용이다. Hardware를 수정할 필요가 없이 파일로 저장만 하면 되기 때문에 HCI sniff log대신 쉽게 사용한다. 다만 Host와 Controller간 UART 문제가 의심되면 HCI log와 snoop을 비교해봐야 한다.

Software log : software도 stack부분과 application이 구분되어 보고자하는 위치에 따라 다르게 저장해야 한다. 심지어 logging level에 따라 저장되는 정도가 달라 이슈에 따라 level을 변경하면서 저장해야 한다.

기타 : 상황에 따라 system(kernel) log, PCM log등이 요구되기도 하고, Controller 내부에 발생한 이슈를 분석하기 위해 별도의 GPIO를 추가하여 분석하기도 한다.

 

*재현

문제를 다시 일으키는 것은 상당히 중요하다. 애초에 test engineer가 확인할 때 이렇게하면 오류가 발생한다는 메뉴얼이 있는 상태가 아니기 때문에 bug가 발견되는 것은 사고처럼 갑자기 찾아온다. 그래서 오류를 찾기 전부터 이미 logging을 시작한다. log의 종류가 너무 많아 다 잡을 수는 없다. 그래서 초기 분석 후 추가로 필요한 log를 계속 취득해야 하는데 재현이 잘 되는 경로를 찾는 것이 빠른 해결의 핵심이다.

Test engineer의 실력은 중요한 문제를 찾아내는 것보다 재현이 잘 되는 경로를 찾는 것이 말해준다. 실력 있는 Test engineer는 어떻게 하면 재현이 되는지를 찾아낼 수 있다. 하지만 재현 경로를 제대로 찾는 것은 문제를 거의 해결하는 것과 비슷한 수준으로 어렵다. 때로는 재현 자체가 어려운 문제도 있다. 상당한 고산지대에 올라가면 발열이 심해지는 TV라던가, 일주일 이상 충전하면서 연결상태를 유지하면 연결이 끊어지는 리모컨이라던가, 특정지역에서 광역버스가 지나갈 때만 음질에 문제가 생기는 헤드셋이라던가 하는 것들은 사무실에서 쉽게 재현하기가 어렵다.

통신은 상호간에 주고 받는 동작이기 때문에 상대방의 동작이 문제를 일으켰다고 생각이 되면 이상한 동작을 하는 제품을 확인하고 그와 유사한 동작을 하는 프로그램을 만들어 재현을 해야 할 때도 있다.

그래서 가능하면 이슈가 발견될 때 재현 경로와 재현 빈도를 물어본다. 이 때, 문제에 대한 이해가 부족한 많은 Test Engineer는 그냥 일반적인 동작을 하다가 한번 발견되었다고 대답을 한다.

 

*patch

bug의 위치를 찾아냈다면 수정하는 것은 쉬운 경우가 많다. 그러나 주의할 것들이 당현이 있다.

 - 전역변수 : 아무데나 선언하고 아무데서나 사용하는 전역 변수는 multi thread/task 환경에서 많은 문제를 일으킨다. 사용하지 못하도록 구분해놓은 코드 파일에 굳이 extern까지 써가며 전역변수로 patch를 하는 사람을 실제로 목격하기도 한다. 물론 이런 사람들에게 mutex같은 critical section의 개념은 찾아보기 어렵다. 통신에서는 자주 timing이 문제를 일으키는데 전역 변수로 오류를 쉽게 수정하는 것은 내일의 일은 절대 생각하지 않겠다는 의미다.

 - Work-around : 이론적으로 맞지 않지만 우선 해결하기위해 넣는 코드다. 통신에서 상대방이 잘못된 행동을 하는데 그 상대방이 내 이야기를 들어주지 않을 만큼 크고 사용자가 많은 회사라면 우리가 알아서 기어야 한다. 이러한 코드는 어쩔 수 없이 들어가지만 다른 의미로 work-around를 사용하는 사람이 있다. 원인을 모르겠으니, 아니면 제대로 해결이 어려우니 당장 땜질만 해서 넘어가자는 식으로 제대로 된 patch가 아니라 work-around를 집어넣는 사람이 있다. 한명의 엔지니어가 모든 일을 하는 기업이 아닌 이상 같은 코드를 바라보게 되는데 모두가 공유하는 우물에 쓰레기를 버리는 짓이다. 이러한 코드는 나중에 side-effect를 유발할 가능성이 크다.

 - 손이 눈보다 빠르다 : 제대로 된 분석 없이 문제가 되는 부근의 코드를 이리저리 마구잡이로 고치며 어떤 변화가 있는지 때려 맞추는 식으로 debug를 시작하는 사람이 있다. 이런 식의 방식은 실력을 키우는데 크게 도움이 되지 않고, 어쩌다가 문제가 나오지 않게 되면 더이상 진행하지 않고 그자리에 멈추게 될 가능성이 크다. 제대로 된 원인을 분석하지 않고 그 부분만 막는다면 나중에 다른 곳에서 터질 가능성이 있다.

 

요즘은 static/dynamic tool들이 많은 오류를 사전에 찾아주어 프로그램을 만들 당시부터 오류를 상당히 많이 막아준다. 하지만 Android처럼 이미 상당히 많은 양의 코드가 존재하는 코드를 tool을 이용해서 발견된 코드를 모조리 수정하려고 들면 정말이지 개발을 할 시간이 아예 없게 된다. tool은 존재하지만 적당히 모든 것을 보는 것은 아니고 중요한 일부만 확인하는 적당한 타협이 필요할 때도 있다. 나중에는 논리적으로 문제가 없는 선에서 자동으로 수정까지 해주겠지?

728x90

'Programming > 좋은습관들이기' 카테고리의 다른 글

Debugging : 무언가 잘못 돌아갈 때 해야 할 일  (0) 2024.06.23
[코드멍키] 생각해 봅시다  (0) 2022.01.08
프로그래머의 종류  (0) 2022.01.03
설계하기  (0) 2022.01.02
최적화  (0) 2022.01.01
Build 관점에서의 language 구분  (0) 2021.12.31
Comment 작성 요령  (0) 2021.12.30
.vimrc option  (0) 2011.07.22
Artistic Style : SourceInsight  (0) 2011.04.28
툴을 사용하자  (0) 2008.07.08
728x90

 

[나는 실패한 것이 아니다. 작동하지 않는 10,000가지 방법을 발견했을 뿐이다] 에디슨

 

Debug는 bug를 잡는 일이다. bug는 의도하지 않은 동작을 의미한다.

 

<최초의 Bug>
<진공관 컴퓨터>

 

최초의 버그는 벌레는 의미했다. 컴퓨터가 진공관으로 이루어져 10진수로 연산을 하는 극악의 효율을 자랑하신 시절(에니악) 의도와 다르게 동작하는 컴퓨터의 문제를 해결하기 위해 진공관을 모두 검사했고, 그 결과 벌레를 찾아내어 해결한 사건이 debug의 시작이었다고 한다. 이 사건은 1945년 하버드 대학의 마크2 에어컨 릴레이 계산기에 대한 이야기다. 이는 기록이 남아있는 최초의 컴퓨터 버그이고, 1870년대 에디슨도 전기 회로에 있는 Bug에 대한 이야기를 했었다고 한다.

 

큰 관점에서 보면 compile error와 syntax error도 포함되지만 그런 것들을 컴파일러가 다 걸러주니, 진정한 버그는 기능 개발이 완료될 때까지도 발견되지 못한 오류라고 봐야 할 것이다.

 

Runtime Crash

보통 tombstone을 생성하고 죽는데 tombstone이 생겼다는 것 자체가 잘못된 동작의 증거이다.  보통은 segmentation fault가 많이 발생한다. 자주 만나는 crash는 다음과 같다.

Segmentation fault : 잘못된 메모리 접근, addr2line과 같은 툴의 도움을 받기도 한다.

Memory overrun : 보통 배열을 벗어나면 생기는데 Segmentation fault 귀결되는 경우가 많다.

runnging out of memory : 메모리 부족

memory leak : 메모리 누수, Embedded에서는 leak으로 인해 out of memory를 발생시키는 경우가 대부분이다. 이건 재현을 시기지 않고 잡기가 상당히 어렵다.

tombstone은 어디서 문제가 발생했는지 문제가 발생한 function call list를 보여주어 비교적 잡기 쉬운 편이다.

 

정말 잡기 어려운 일반적인 bug들에 대해서는 다음에 다시 이야기 하기로 하자.

728x90

'Programming > 좋은습관들이기' 카테고리의 다른 글

Debugging : 버그를 없애기 위해  (0) 2024.06.27
[코드멍키] 생각해 봅시다  (0) 2022.01.08
프로그래머의 종류  (0) 2022.01.03
설계하기  (0) 2022.01.02
최적화  (0) 2022.01.01
Build 관점에서의 language 구분  (0) 2021.12.31
Comment 작성 요령  (0) 2021.12.30
.vimrc option  (0) 2011.07.22
Artistic Style : SourceInsight  (0) 2011.04.28
툴을 사용하자  (0) 2008.07.08
728x90

1. 전구를 갈아끼우기 위해서는 얼마나 많은 프로그래머들이 필요할까?

 - 0명:  고장나지 않았고 절전모드 다.

 - 1명 : 하지만 밤새 걸리고 엄청난 양의 피자와 커피가 필요

 - 20명 : 고치는데 1명, 그 결과 생긴 side-effect를 debug하는데 19명

 : 책에서는 software가 아니라 hardware로 접근해야 해서 문제가 잘못되었다는데 왠지 20명이 끌린다.

 

2. 열성적이지만 스킬이 부족한 것과 재능이 뛰어나지만 의욕이 없는것 중 어느 것이 더 나을까?

 - 누가 더 나은 코드를 작성하는가?

 - 누가 더 나은 프로그래머인가?

 - 단기간 필요한가? 아니면 장기간 필요한가?

 

3. 아래 프로그램 유형의 코드 작성 방법은 서로 어떻게 다를까요?

 A. 장난삼아 작성하는 프로그램

    - 기능을 앞에 닥친 문제를 풀 정도로만 작성하고 버림

    - 개발의 속도와 용이성이 설계의 세련미보다 중요

 B. 완전히 새로운 프로그램

    - 신중한 설계와 조심스러운 계획이 필요

    - 미래의 사용과 확장을 반드시 계산에 넣어야 함

    - 충분한 문서화가 보장되어야 함

 C. 기존 시스템의 확장

    - 기존 코드에 대한 철저한 이해가 필요

    - 기존 작업과 조화를 이루는 변경이 필요

 D. 예전 코드 베이스의 유지보수 작업

    - 남아있는 결함의 정정

    - 주변 환경이 바뀐 다음에 소프트웨어가 제대로 돌아가도록 개선

 

728x90

'Programming > 좋은습관들이기' 카테고리의 다른 글

Debugging : 버그를 없애기 위해  (0) 2024.06.27
Debugging : 무언가 잘못 돌아갈 때 해야 할 일  (0) 2024.06.23
프로그래머의 종류  (0) 2022.01.03
설계하기  (0) 2022.01.02
최적화  (0) 2022.01.01
Build 관점에서의 language 구분  (0) 2021.12.31
Comment 작성 요령  (0) 2021.12.30
.vimrc option  (0) 2011.07.22
Artistic Style : SourceInsight  (0) 2011.04.28
툴을 사용하자  (0) 2008.07.08
728x90

열성적인 코더

who?

더보기

추진력 있고, 빠르다. 뒤로 물러서서 생각하지 않고 바로 코드를 만들어낸다.

뛰어난 스킬에 비해 진정한 잠재력을 보여주지 않는다.

강점

더보기

코드를 많이 작성한다.(양적인 면에서 생산적)

새로운 것을 배우기를 좋아하고 열성적

약점

더보기

성급하고, 결함이 있는 코드를 만들기 쉽다.

디버깅을 잘 못한다.(코딩에 뛰어드는 것처럼 디버깅으로 곧장 다이빙)

열성적이지만 시간 추정을 잘 못한다.(예상보다 일이 오래 걸림)

해야할일

더보기

열정을 잃지 마라. 단위 test를 위한 코드를 많이 준비하라. 서두르지 마라.

이들과 일하려면?

더보기

매일같이 이들에게 무엇을 할 것인지. 그리고 앞으로의 계획은 무엇인지 물어보라.

 

코드 멍키(code monkey)

who?

더보기

기초는 튼튼하지만 독창성이 없는 코드를 만든다. 머슴처럼 일함. 유지보수에 적합

강점

더보기

일을 주면 한다.(꽤 잘하고 시간도 잘 지키고 지치지 않는다)

시간 추정을 잘하고, 체계적이고 철저함

약점

더보기

특 안에서만 생각.

잠재적인 문제점을 다루지 않고, 의문조차 갖지 않음

솔선해서 문제를 조사하거나 고치는 일이 거의 없음

해야할일

더보기

개인 프로젝트로 훈련하여 스킬을 강화하라.

적극적으로 새로운 작업에 동참시켜 달라고 요청하라.

이들과 일하려면?

더보기

칭찬해주고, 테크닉을 가르쳐서 일을 더 잘할게 해줘라.

 

권위자

who?

더보기

현실에서는 보기 어려운 전설 속의 인물

혼자서 근본이 되는 중요한 일을 처리.(프레임워크, 아키텍처,커널..)

탁월한 코드를 작성하지만 평범한 사람들과는 의사소통이 잘 되지 않음

동료들로부터 마땅히 받아야 할 존경과 경외를 받음

강점

더보기

경험이 풍부하고, 유지보수가 쉬운 코드를 작성

훌륭한 멘토로 배울 것이 많음

약점

더보기

의사소통이 약함(팀웍이나 멘토로서의 역할이 약함)

해야할일

더보기

자신의 일을 설명하기 위한 스킬

이들과 일하려면?

더보기

옆에서 배워야 함(기술 뿐 아니라 접근하는 태도)

 

되다만 권위자

who?

더보기

스스로 권위자라 생각하지만 사실은 아님.

아는 게 많은 것처럼 말하지만 쓰잘데기 없는 것만 한가득.

자만심이 강하고 자신을 권위 있는 자리에 스스로 올려 놓음

강점

더보기

없음

약점

더보기

자신에 대한 믿음이 지나침(자신을 과대평가하여 프로젝트의 성공을 위태롭게 함)

해야할일

더보기

자신의 스킬을 정직하게 평가

이들과 일하려면?

더보기

도망가

 

거만한 천재

who?

더보기

빠르고 효율적이고 고품질의 코드를 작성.

건방지고, 생색을 내며 품위가 없음

논쟁을 아주 좋아함(보통 자기가 옳기 때문) - 자기가 옳지 않을 경우 자기가 옳은 것으로 주제가 옮겨갈 때까지 계속 말을 함

강점

더보기

높음 기술적 스킬.

기술적으로 강력한 선도 역할. 촉매 역할

약점

더보기

자신의 잘못이 증명되는 것을 싫어하고, 항상 자신이 옳아야 한다고 생각

모른다는 말을 할 줄 모름

해야할일

더보기

다른 사람들의 의견을 듣고 존중

모르는 것에 대해 정직해지고 배워라

이들과 일하려면?

더보기

이들에게 존경심을 표하고, 다른 이들에게도 존경심을 표하라.

쓸데없는 논쟁은 피하되 당당히 맞서서 논쟁을 즐겨라.

 

카우보이

who?

더보기

힘든 일을 적극적으로 피해 다니는 악질

자신의 일을 빨리 끝내고 다음으로 넘어가기 위해 모든 꼼수를 사용

강점

더보기

새로운 것을 배우는 것을 좋아함(배우려고 시작하지는 않음)

약점

더보기

이 사람이 저질러 놓은 똥을 치우는 데 상당한 노력이 들어감

해야할일

더보기

일에 긍지를 갖고 시간을 투자

이들과 일하려면?

더보기

피할 수 있다면 최대한 피해라.

반드시 코드를 리뷰하고, 다른 사람과 짝을 이루어 프로그래밍 하게 하라.

(추천: 열성적인 코더, 비추천: 계획가)

 

계획가

who?

더보기

할 일에 대해 너무 많은 생각을 해서 코딩을 시작할 때 쯤 프로젝트가 끝남

많이 연구하고 많이 읽음

적절한 프로세스는 알지만 데드라인은 맞추기 어려움

강점

더보기

설계와 생각을 제대로 하고 나서 코딩

약점

더보기

지나친 설계를 할 수 있음

복잡한 시스템을 만들어 분석이 마비되도록 만들 수 있음

개발 자체보다 방법론과 모델링 쪽으로 치우침

생각을 오래하다 보니 실제로 일 할 시간이 부족

해야할일

더보기

점증적인 개발 방법과 프로토타이핑을 설계의 검증 수단으로 사용

계획과 행동 사이 균형을 맞춰야 함

이들과 일하려면?

더보기

이들과의 회의를 줄여라

작업 이정표에 설계 완료를 추가하라

 

노인

who?

더보기

보수적인 생각을 가진 고참 프로그래머

새로운 것을 배우려 하지 않고 쉽게 짜증

강점

더보기

경험과 지혜

약점

더보기

새로운 것을 배우려 하지 않음

참을성 부족

해야할일

더보기

후배를 존중

이들과 일하려면?

더보기

뒤끝이 있는 경우가 많으니 조심히 다룰 것

 

광신도

who?

더보기

BigCo를 맹신

BigCo : MS, IBM, Sun등 성공한 소프트웨어 회사

강점

더보기

제품을 잘 알고 이를 기반으로 훌륭한 설계를 함

약점

더보기

객관성이 없고, 실용주의적이지 않음. BigCo가 아닌 다른 더 나은 설계를 놓칠 수 있음

해야할일

더보기

BigCo를 버리는 것은 바라지 않지만 최소한 다른 접근 방법과 사고방식도 받아들일 줄 알아야 함

이들과 일하려면?

더보기

논쟁하려고 들지마라

중대한 설계가 아니면 그들이 맞는 경우가 많다

 

일편단심 프로그래머

who?

더보기

전형적인 Geek

프로그래밍만을 생각

강점

더보기

일을 진심으로 좋아하고, 많은 양의 업무 추가도 수용

데드라인이 다가올 때 도움이 많이 됨

약점

더보기

다른 사람들도 자신처럼 목표가 뚜렷하기를 기대하고, 그렇지 않으면 실망

업무 외의 세상에 무관심

해야할일

더보기

취미를 가져라

이들과 일하려면?

더보기

이들이 당신의 일까지 가져가게 하지 마라.(나중에 낯선 코드를 유지보수 하게 됨)

 

게으름뱅이

who?

더보기

아주 많은 일을 하는 것처럼 꾸미고 실제로는 일을 하지 않음

사교모임에 많이 나간 다음 책상 밑에서 자는 모습으로 발견 됨

강점

더보기

최소한 즐길 줄은 안다

약점

더보기

감지하기 어렵고, 정말로 게으름을 피우는지 업무가 너무 어려워서 오래 걸리는지 증명하기 어려움

해야할일

더보기

양심 좀

이들과 일하려면?

더보기

이들을 잘라낼 수 없다면 그냥 받아들여야 함

불평을 해도 개선이 어려우니 그냥 둬라

 

마지못해 하는 팀장

who?

더보기

팀장을 원하진 않지만 더이상의 진급할 자리가 없어서 팀장이 된 경우

보통 부드러운 태도를 가졌고 우유부단함

강점

더보기

프로그래머의 어려운 처지에 진정으로 공감해줌

자신이 지연이나 비난에 대한 책임 짐

약점

더보기

리더로서의 역량이 없음

임무를 위임하지 못해 배분도 못함

팀장의 역할과 프로그래밍을 같이 하려는 경우 일을 할 시간은 부족하고 자리에 오래 있으며 다 제대로 못하게 됨

해야할일

더보기

팀장 역할에 대한 훈련을 받던가, 아니면 다른 분야로 이동

이들과 일하려면?

더보기

팀장을 불쌍히 여겨, 그사람에게 도움이 될 수 있는 일을 해줘야 함

728x90

'Programming > 좋은습관들이기' 카테고리의 다른 글

Debugging : 버그를 없애기 위해  (0) 2024.06.27
Debugging : 무언가 잘못 돌아갈 때 해야 할 일  (0) 2024.06.23
[코드멍키] 생각해 봅시다  (0) 2022.01.08
설계하기  (0) 2022.01.02
최적화  (0) 2022.01.01
Build 관점에서의 language 구분  (0) 2021.12.31
Comment 작성 요령  (0) 2021.12.30
.vimrc option  (0) 2011.07.22
Artistic Style : SourceInsight  (0) 2011.04.28
툴을 사용하자  (0) 2008.07.08

+ Recent posts