여러분은 어떻게 신중한 코드를 작성하시나요?

jiee의 이미지

프로그래밍을 하다보면 중요하고 신중한 코드가 필요한 경우가 있습니다.
Programming Pearls에 나온 이진 검색과 같은 코드들은 신중한 코드가 필요하다고 생각합니다.

여기서,다른 분들은 어떠한 형태로 신중한 코드들을 작성하는지 궁금합니다. 제 경우엔 일단 종이에서 생각을 정리한 다음에 코드로 옮기는 방식을 사용하는데, 고수분들은 어떤 형태로 뿜어내시는지 궁금합니다.

그럼, 올해 마지막 평일을 즐겁게 보내시길~ : )

chadr의 이미지

저도 우선 종이에 생각을 적고 알고리즘을 하나하나씩 다시 분석을 해봅니다.
그리고 어느정도 정리가 되면 화장실을 갑니다.
가서 앉아서 힘을 주고 생각을 하면 헛점이 생각이 납니다 ㄱ-

그럼 그걸 다시 종이에 적고 확인을 하고 코딩후 단위테스트를 해서 검증을 합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

Darkcircle의 이미지

간혹 어떤 사람들은 종이에 코딩하는게 제일 무식한 방법이며 쓸데 없는 방법이라고 하는데 절대 그렇지 않습니다.
제 주변 사람들중에 그거 불쌍해보인다고 못하게 막아버리라고 한 분이 있는데 전 그런거 싫어합니다 ...
예기치 못한 에러를 발생시킴으로 인해 영향 받는 다른 어플리케이션이 생긴다면 그건 그러한 경우까지 생각하지않은
프로그래머에게 100% 잘못이 있다고 봅니다. 물론 인간이 만드는 것이니 어디까지나 완벽한 것은 없습니다..

그러나 완벽에 가깝게 만든다는 것은 그만큼 생각을 신중히 하여
경우의 수를 충분히 확보하고 해당 경우에 대한 대처 방법을 코드화 시키는 것에 있다고 봅니다.

따라서 오히려 막바로 코드 집어넣고 나중에 시스템 병신 맹그는거보다 더욱 안전할 수 있습니다.
특히 이런게 꼭 필요해지는건 드라이버 코딩이나 하드웨어 기반 프로그래밍 할때가 더더욱 그렇습니다.

군대에서 뭔 알고리즘 짠다고 이걸 가지고 며칠밤 헤매고 그랬는데
(그냥 막짜고 그랬더니 시스템이 빈번하게 멈추더군요... 결국 리셋 꾹!)
결국에는 종이에 써서 시뮬레이션 하는 방법으로 해결했습니다.
확실하게 느낀건... 그런식으로 막짜다가는 진짜 며칠이 걸려도 끝내지 못할것이라는 것....
막짠다는 얘기는 결국 별다른 생각없이 느낌대로 적어버린다는 겁니다.
느낌과 실제는 다른 법입니다. 경험이 축적되고 실력이 뛰어난다 한들
예기치 못한 에러 앞에서는 아무리 실력이 뛰어난 프로그래머라 할지라도
일단은 주춤하고 그 에러 앞에서 머리를 싸맬 것입니다... 아주 잠깐만이라도...

일단 메모장에 써놓고 뽑든지 해서 돌려보기 전에 미리 머릿속으로 이 과정은 대강 어떻게 진행될 것인지
머릿속으로 풀어내어 결과를 주석으로 써냅니다... 그 다음에 돌려보고 그 부분에서 어떻게 동작하는지
주석과 동일하게 동작하면 내비두고 다르게 동작한다면 빨간 사선을 긋고 어떤 문제가 발생한다고 적습니다...
물론 파일 같은 곳에 철해두면 나중에 이런 비슷한 실수를 빈번하게 저지를 수도 있는걸 막아낼 수 있습니다.

But... 신중한 자세는 좋지만... 사소한 것에까지 신중하면 골치아픕니다. -_-; 어쨌든 적당히...

==============================================
니네 군대에서 멀쩡한 몸으로 18시간 자봤어? ㅋㅋㅋ

---------------------------------------------------------------
폐인이 되자 (/ㅂ/)

puaxx의 이미지

신중하게 코딩해도 신중한 코드는 절대 안나오던데요... 누가 좋은 코드를 한방에 써버리는 필살기가 있다면 전수 부탁 드리겠습니다.

Darkcircle의 이미지

대단하시군요... 전 의역해서 썼는데...
"신중한 코드" => 신중하게 짠 코드...

===================================================
니네 군대에서 멀쩡한 몸으로 18시간 자봤어? ㅋㅋㅋ

---------------------------------------------------------------
폐인이 되자 (/ㅂ/)

Necromancer의 이미지

종이코딩보다는 문서로 남기고 코드에 주석 도배합니다.

솔직히 이거 안하면 나중에 이코드가 뭐지(?)하는 생각이 잔뜩 들어오죠.
그럼 민감한 코드는 그걸로 끝장이고요.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

knight2000의 이미지

프로그래머가 아니라 코딩할 일은 거의 없지만...
어쩌다 문법 물어 보는 후배들에게는 무조건 종이에 써서 가르쳐 줍니다.
그것보다 더 확실한 방법은 없더군요.
그 알고리듬 하나 찾겠다고 그때마다 컴퓨터를 켤 수도 없는 노릇이라서.

p.s.
난감한 일은... 그 알고리듬을 외우고 있어야 한다는... T,T

===== ===== ===== ===== =====
knight2000 of SALM.
SALM stood for SALM Ain't a Life Model.
SALM is not the life model, but SALM is just the life.

===== ===== ===== ===== =====
knight2000 of SALM.
SALM stood for SALM Ain't a Life Model.
SALM is not the life model, but SALM is just the life.

익명사용자의 이미지

저같은 경우에는 조금짜고 테스트 조금짜고 테스트 하는 방법을 사용합니다.
TDD(테스트 주도 개발) 이라는 책을 본후에는 자바로 할때는 junit을
C나 C++을 이용할때는 cppunit을 이용하여
테스트코트를 작성해 가며 프로그램을 작성합니다.

한 덩어리의 문제라도 잘 살펴보면 조금조금씩 나누어 짤수 있는 여지가 있어요..

한예를 들어 본다면 피보나치 수열을 구하는 문제를 푼다면

assertEquals(1,fibo(0)) // 입력이 0일때 1을 리턴

이러한 테스트 코드를 작성한 후에

int fibo(int n){
return 1;
}

이 테스트를 통과시키기 위해 간단히 이러한 코드를 작성하고 테스트를 추가해서

assertEquals(1,fibo(1)) // 입력이 1일때 1을 리턴
assertEquals(2,fibo(2)) // 입력이 2일때 2을 리턴

아까로는 통과하지 않을 테스트를 추가한후 통과 하도록 수정하고

int fibo(int n){
if(n < 2)
return 1;
else
return 2;
}
위의 코드를 의미론적 중복을 드러나도록 표현하면
int fibo(int n){
if(n < 2)
return 1;
else
return fibo(0) + fibo(1);
}

또 테스트를 추가하여
assertEquals(3,fibo(3)) // 입력이 2일때 2을 리턴
이 테스트가 성공적으로 통과 하도록 수정해서
int fibo(int n){
if(n < 2)
return 1;
else if(n == 2)
return fibo(0) + fibo(1);
else
return fibo(1) + fibo(2);
}

이제 마지막으로
return fibo(0) + fibo(1);
return fibo(1) + fibo(2);
이 코드들이 중복되므로 중복되는 코드를 없애면

int fibo(int n){
if(n < 2)
return 1;
else
return fibo(n-1) + fibo(n-2);
}

이런식으로 테스트작성 -> 테스트 통과 -> 중복된 코드 없애기 방식으로 합니다.

익명사용자의 이미지

헉 글 중간이 날라갔네요.. 중간부터 다시 쓰자면

int fibo(int n){
if(n<2)
return 1;
else
return 2;
}

의미론적인 중복이 드러나도록 코드를 조금 고쳐보면

int fibo(int n){
if(n<2)
return 1;
else
return fibo(0) + fibo(1);
}

또 테스트를 추가하여

assertEquals(3,fibo(3));

테스트를 통과하도록 또 코드 수정하면
int fibo(int n){
if(n<2)
return 1;
else if(n==2)
return fibo(0) + fibo(1);
else
return fibo(1) + fibo(2);
}

이제 마지막으로 중복된 코드를 하나로 합치면

int fibo(int n){
if(n<2)
return 1;
else
return fibo(n-2) + fibo(n-1);
}

이런식으로 테스트 코드 작성 -> 테스트 통과 시키기 -> 코드 다듬기 순으로 작성하려고 노력중입니다.

익명사용자의 이미지

헉;; 왜자꾸 특정부분이 날라가 버리는지 모르겠네요;;
작성 포기 근데 위의 글 어떻게 지우지요?

M.W.Park의 이미지

위에서 어느 분이 말씀하신 것과 크게 다르진 않습니다만,
TDD의 관점에서 코드 작성을 할때는 다음 수순(?)을 밟는 것이 일반적입니다.

먼저 테스트 코드를 작성합니다.
테스트 코드는 주로 경계조건 및 생각할 수 있는 가장 복잡한 경우를 포함합니다.
모든 테스트가 실패없이 통과하면 모듈의 개발 완료로 생각합니다.
후속되는 개발, 테스트 또는 운영중에 오류가 발생하면, 오류 케이스를 테스트에 포함시키고 테스트가 통과할 때 까지 모듈을 개선합니다. 모듈 변경 후에는 필히 회귀(regression) 테스트로 전체 테스트를 통과하는지 확인합니다.

또한 짬짬히 설계 및 성능 향상을 위해 기존 모듈들을 리팩터링합니다.
리팩터링 후에도 꼭 전체 테스트를 통과하는지 확인합니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

yarmini의 이미지

일단 특정 알고리즘을 모듈로 구성하여 최대한 독립적으로 구동시킬 수 있게 합니다.

그다음 작은 프로젝트를 하나 생성하여 그 모듈만 실행하는 테스트를 진행합니다.

여기서 갖가지 검증과 최적화까지 작업한 후 실제 프로젝트에 적용하여

간단한 검사만 합니다.

언 제 나 멋 진

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.