잘 만들어진 코드란?

geekforum의 이미지

IT업계에서 sw개발자로 근무하고 있는 사람입니다. s/w쪽 일을 하는 사람이라면 누구한테 보여도 부끄럽지 않은 멋진 프로그램을 하고 싶어하지 않을까 생각합니다.

외국에서 작성된 프로그램을 많이 접한 사람들은 참 잘 되어있다, 훌륭하다고 합니다. 어떤점이 우리와 많은 차이를 보이길래 그런평이 나오는지 훌륭한 프로그램을 위한 고견을 듣고 싶습니다.

"누가 보아도 잘짠 프로그램이란?"

아직은 프로그램쪽에 부족한 점이 많다고 생각하는 저와 같은 프로그래머에게 재야의 고수님들의 좋은 말씀 부탁드립니다. 한국의 모든 프로그래머의 한단계 업그레이드를 위하여... 감사합니다.

댓글

익명 사용자의 이미지

1. 주석이 잘 되어 있어야 한다.
2. 변수를 잘 써야 한다. (의미를 정확히 알 수 있는 변수명, 정확한 주석, 쓸모없는 변수 자제)
3. 주석이 없어도 누구나 쉽게 알아 볼 수 있는 쉬운 코딩 (멋지게 보일려고 문장을 줄인다던가, 암호 문구처럼(-.-;) 작성하지 않는다,)
4. struct, class, function등 구조화된, 재활용 가능성을 높일 수 있어야 한다.
5. 단순하고 간단한 명확한 알고리즘 전개로 퍼포먼스를 높인다.

기타등등.... 이정도 아닐까요.

혼자서 지지고 볶는 프로그램이라면 마음대로 만들어도 관계없겠지만, 여러명이 동시에 참여하는 프로젝트거나 또는 차후에 업그래이드를 고려해야 한다거나...등등... 대부분의 상업적인 프로그램 코딩에서는 무엇보다 알아보기 쉽고, 업데이트하기 용이한 코딩이 좋지 않을까 합니다.

또한 변수의 사용남발, 또는 변수를 억지로 줄여서 더욱 알아보기 힘든... 프로그램을 하지 않는 것도 중요하고요.

한마디로 표현하면... 프로그래밍 코드를 읽을때 마치 쉬운 연애소설 책을 읽는 기분을 느낄 수 있는... -.-;;;

스카리의 이미지

언제나 Hello, World!

이것만큼 잘 만들어진 프로그램이 어디 있을까요?

라인수가 아무리 늘어나도..

프로그램이 아무리 복잡해져도

우리는 Hello, World! 의 교훈을 새겨야합니다.

ㅡ.ㅡV

익명 사용자의 이미지

잘 이란 기준을 어따가 두느냐 하는 문제지만,....

돈을 받고 일하는 회사에서 일 하다 보면 속도, 최적 이런건

중요하지 않더라구요. 경영자나 기획자의 변덕에 잘 변경할

수 있는 유지 보수가 쉬운 코드.. :)

익명 사용자의 이미지

가끔은 필요하죠
장비 제어를 할려다 보니... ^-^;
( 노여워 마시길 )

익명 사용자의 이미지

잘 만들어진 코드는 적재적소에 어울리는 코드

1. 무조건 간결한것이 장땡은 아니다.
옛날에는 25줄 이상 문장이 길어지면 다시 작성했는데 지금은 4000줄의 함수도 잘 맹글어 쓴다.
한때는 포인트가 내 주무기여서나 지금은 아주 필요하다고 판단되지 않으면 여간해서는 사용하지 않는다.
만일 사용하더라도 주절주절 설명문을 붙여놓지요.
길게 늘어 사용하는 이유는 위에서 밑으로 읽어내려가며 그게 뭘하는지 표현하기 위한거죠.
어찌보면 완전한 소설책처럼...., 한번해보셔요 정말 죽입네다.

2. 공통 Library 는 간결하고 빠른 속도를 낼수 있도록 작성한다.
Library 가 복잡하면 그속에 버그가 존재할지도 모르고, 또한 시간성도 계산해야 하니 머리 무지 아프겠죠?

3. C 의 매크로는 보약이며 쥐약이다.
매크로는 C 의 유연성이 주는 취약점을 잘 보완해주며
간결한 코드를 만들어주고 또한 가독성을 높이지만 매크로를 잘 못 쓰면 완존히 쥐약이죠. 포인트와 비슷하죠? ^-^
근데 난 무지 매크로를 좋아하죠
베이직 같은 C, 코볼 같은 C 프로그램 ㅋㅋㅋ.

4. 모든것은 찍어서 눈으로 확인하라.
머리를 믿구 플밍하시는 분은 없겠죠?
Debugging Application 이란 책에서인가 본 말...
"자신의 코드를 믿지만 확인하라~~!"
젤루 중요한거 같아여

* 이거이 완존히 미쳤다구 생각할지 모르지만 나두 아래에 씌여진 님들의 글을 인정했던적이 있지만...., 지금은 나두 늙었는지...., 살기 위한 몸부림이었는지 모르지만 나두 모르게 이런 스타일의 플밍만 하게 되네여...

익명 사용자의 이미지

에릭 레이몬드가 "완벽함이란 더 이상 추가할 것이 없을 때 이루어지는 것이 아니라 더 이상 버릴 것이 없을 때 이루어진다"는 생떽쥐뻬리의 말을 인용한 것이 생각나는군요.

뭐니뭐니해도 간결함이죠. 그래야 읽기도 쉬울테니...

익명 사용자의 이미지

저의 생각은 이렇습니다.
1. Debug작업을 하기 쉬워야 하겠죠.
2. Function이 너무 길지 않아야 한다.(60 Line이내)
3. 버그가 없어야 한다.
4. 통일된 명명 규칙이 있어야 한다.
5. 매크로는 간결하게, 되도록 적게 사용해야 한다.

이정도로 생각 합니다.
참고가 되시기를....

익명 사용자의 이미지

음냐... 시험/레포트 제출용 함수와 메인 함수를 제외하고는...
아직까지는 50줄이 넘는 함수를 짜본 적이 거의 없네요.

너무 인라인을 좋아하다 보니까.... ㅡ.ㅡ;

익명 사용자의 이미지

1항의 구체적인 예를 보면 여러 방법이 존재 할 수 있게죠.
그 중에서 제가 즐겨쓰는 두가지 방법을 제시 하겠습니다.

1. Running되는 App의 Debug 예 입니다.
socket/fifo등의 자원을 이용한 서버를 만듭니다.
프로잭트에 따라서 LogServer의 구성이 달라 지겠죠.
일단은 pc level에서 보면, upd를 사용하여 여기로 들어오는 자료를
콘솔로 print하는 프로그램을 먼저 만듭니다.
그리고 App에서는 sendmsg로 LogServer에 메세지를 보내면 됩니다.
이렇게 하면 여러가지 이점이 있을 수 있습니다.
원격에서 구동중인 APP의 상태를 Monitor할 수가 있기 때문에 상당히 효과적이죠.
2. 프로그램의 모든 Function들의 수행 상태를 통계내어 관리합니다.
이것은 Function 시작시간과 Return시 시간을 구하여 그차를 보관하는 방법으로
이것을 1번과 연계하여 사용하면 상당한 효과를 볼수 있습니다.
그리고 이런 자료를 공유되는 Stack형식의 자료로 관리하면 외부에서도
그 프로그램의 수행중인 상황을 할수가 있겠죠..

Macro EX)
#ifdef _DEBUG
# define STARTFUNC(a) { SaveFunction(#a); }
# define RETVAL(x) { PopFunction(); return(x);}
# define RETVOID { PopFunction(); return; }
#else
# define STARTFUNC(a) ;
# define RETVAL(x) return(x);
# define RETVOID return;
#endif

SaveFunction, PopFunction에서 필요사항을 구하면 되겠죠.

BOOL NormalFunction(xx ..)
{
STARTFUNC(NormalFunction);
or
STARTFUNC(__FUNC__);

....

RETVAL(ROK);
}

이렇게 하면 Daemon의 TRACE가 한결 쉬워질겁니다.
참고가 되시길..

익명 사용자의 이미지

보면 니캉 내캉 다 이해할수 있는 코드 짱`

익명 사용자의 이미지

이런거 고민 하시는 분들이 많으시네요... 물론 저를 포함해서...

가장 잘 만들어진 코드는 잘 만들어졌다 라고 스스로가 절대적으로 만족하는 코드 아닐까요 ? 그게 남들이 보기에는 허접쓰레기 처럼 보인다고 해도 말이죠...

그래서 항상 만족할 줄 모르는 인간의 특성상, 잘 만들어진 코드라는건 어쩌면 이상향일지도 모릅니다.

영원히 구경하지 못할지도 모릅니다.

현실적으로 내려와서, 제 입장에서 보면 비교적 잘된것처럼 보이는 코드는 하고자 하는 기능을 하면서 가능한한 심플하게 짜여진 코드가 잘됐다....라는 기분이 들더군요.

익명 사용자의 이미지

내가 이해할 수 있는 코드. -_-v

익명 사용자의 이미지

이 세상에 작동하는 프로그램에는 항상 버그가 있다는 말이 있는데 제가 생각하는 잘 짜여진 소스는 버그의 가능성을 최소화시키는 코드라구 생각합니다. 가독성을 높게 하고 이해하기 쉽고 최적의 알고리즘을 사용하는 것들 모두 버그를 최소화하기 위함이 아닐까 생각합니다.

오늘도 버그 잡느라 여념이 없는 무명 개발자 -_-

익명 사용자의 이미지

호호~ 제 프로그램에는 버그가 없는데~

int main()
{
// Dol A Ra My Program
return 0;
}

너무 완벽하지 않나요? :)
버릴게 하나두 없는것만 같아요~
친절한 주석까지!!
아이좋아 :)

익명 사용자의 이미지

예전에 웨인레프리트(dBASE개발자)였나?
정확하진 않은데...
여하튼...

자신이 짠 코드를 한 달 뒤에 봐서 고칠 게 없다면...
그건 정말 잘 짠 코드라고~
이젠 하산 해도 된다고 그랬지욤~

난 언제 하산 할 수 있을까
-_-;;

lovehis의 이미지

잘 만들어진 코드란?

이질문을 보니까... 오래된 책이 생각 나네요...

Niklaus Wirth의
"Algorithms + Data Structures = Programs" 라는 책이...

정말 맞는말 같아요... 아무리 Object와 Class의 세상이 되었다고 하지만...

그리고 또다른 책....
Programming 을 ART로 생각한 Programming의 예술가
Donald E. Knuth 의
"The art of computing programming" 쓰리즈....
비록 쪼금 보다 go sleep(이책 보신분 무슨 말인줄 알죠?) 하지만...

그리고 생각나는 김에... 다른 책 한권... (책장사 아니에요...)

Knuth의 라이벌... 스파케티를 잘먹는 철학자를 만든...
Program 못짜는 Programmer
Dijkstram E.W. 의
"The Humble programmer"
이 책은 아직 못읽었지만... 그의 다른 책과 Knuth의 책 재목을 생각해 보면..... 내용이 보일듯...

뭐... 잘 만들어진 코드란.... 정말 유명한 3사람도 각기 틀린것 같네요...
정말 정말 많이... 누가 감히... 말할수 있을까요...

익명 사용자의 이미지

컴팩트하고 타이트한 코드속에 깔끔하게 알고리즘을 때려 넣은 코드들..
즉 한눈에 구현된 알고리즘이 눈에 들어옴...
코드간의 루틴들은 옵티마이징이 잘 되어 있어서...
쓸데없이 cpu 를 잡아 먹지 않음...
c 로 짰음에도 불구하고 제네릭 코드들을 사용해서...
쉽게 라이브러리로 재사용 가능하고...
또한 라이브러리를 추가시킬 수 있는 코드들...

난 언제쯤 저런 코드를 만들어 낼 수 있으려나..... --;;;

익명 사용자의 이미지

바이너리 코드는 컴퓨터가 읽는다.
그러므로 컴퓨터 성능 향상을 위해 바이너리 코드는
최적화 되면 좋겠다.

소스 코드는 사람이 읽는다.
사람이 바이너리 코드 기차게 잘읽으면
바이너리로 그냥 쓰면 되지 왜 프로그래밍 언어를 쓰겠는가...
그러므로 사람이 읽기에 좋으면 되겠다.

당근을 씹고 있군 쩝 --;

white23의 이미지

당근입니다...^^

소스 코드는 뭐니뭐니 해도...
일단은 읽기 편하고...
이해하기가 쉬워야합니다...
그다음에 요구할 수가 있는것이...
재사용성이나 포퍼먼스이겠죠...

그러나 속도를 가장 중요시 한다면 역시... ASSEMBLY가...
껄껄껄~~~

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

어떠한 역경에도 굴하지 않는 '하양 지훈' - It's Now or Never!!!

익명 사용자의 이미지

플랫폼이 고급화 되면서 추상화의 장점도 강조되지만..

퍼포먼스를 중시하는 환경에서는 최적화된 코드 역시

나름대로 중요성을 갖고 있는 듯 합니다.

결국 좋은 코드란 목적에 따라 추상화와 최적화

의 적절한 접점을 잘 찾아내어 그 상황에서 최대의

가독성(readablity)를 끌어낸 코드겠죠..

(말은 참 좋네~ ^_^)

익명 사용자의 이미지

훌륭한 코드를 보면 대부분 간단하고 깔끔합니다.

훌륭한 코드가 나오기 위해서는 역시 초기에

요구사항 분석하고 위험요소를 찾아내서 간결하게 모델링을

함으로서 가능해 진다고 생각합니다.

Usecase를 얼마나 간결하고 의미있게 찾아내느냐도 바로 초기 도입단계에서

해야할 일이겠지요. 제가 보기에는 역시 잘 나누어진 코드, 잘 짜여진 코드

그리고 비즈니스 모델링을 얼마나 완성도 있게 했는가에서 결정된다고 봅니다.

여기에는 요구사항 분석 및 위험도 분석을 최대한 찾아내야 겠습니다.

멋진코드는 역시 기초에 충실한 모델링으로 만들어 지지..않나.. 하는

생각이 듭니다.

bxhs의 이미지

잘짜진 코드는 잘 나눠진 코드이다.

익명 사용자의 이미지

추상화와 간단함 아닐까요?

추상화가 간단하게 하기 위한 좋은 방편이기 때문이기도 하지만.

심플함의 미학이 코드의 정합성을 따지는 데 일차적인 것이 아닐런지.

-맹수.

익명 사용자의 이미지

잘 짜여진 프로그램은 보기에도 아름답습니다.
약간의 개인적인 경험으로 보면
이름붙이기(Naming)과
디버깅이 끝난 후에는 반드시 보기좋게 코드를 다시 정렬합니다.
이런 습관이 처음 부터 들이면 나중에는 다듬지 않으면
찝찝한 느낌이 들죠.....
다들 아는 이야기를 올린것 같군요

익명 사용자의 이미지

"기본기에 충실한?" 코드가 아닐까 하네요..
루틴(메소드)별 역할이 분명하고, 최적의 알고리즘을 사용하고..
알고리즘 부분은 경험만으로 해결되지 않는 부분이 많아 정규교육이 필요한 부분이기도 합니다...

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.