2010/03/31
[Study Note] Options 메뉴 다루기
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
// 추가하기 위한 메뉴를 위한 상수
static final int MENU_NEW = 1;
static final int MENU_EDIT = 2;
static final int MENU_SEL = 3;
static final int MENU_CHECK = 4;
// 추가하기 위한 서브 메뉴를 위한 상수
static final int MENU_SEL_1 = 5;
static final int MENU_SEL_2 = 6;
static final int MENU_SEL_3 = 7;
public boolean onCreateOptionsMenu( Menu menu )
{
super.onCreateOptionsMenu( menu );
menu.add( 0, MENU_NEW, 0, "NEW" ) // New 메뉴 추가
.setAlphabeticShortcut( 'n' ); // 단축키 지정
menu.add( 0, MENU_CHECK, 0, "CHECK" ) // Check 메뉴 추가
.setCheckable( true ); // 체크 옵션 추가
menu.add( 0, MENU_EMPTY, 0, "Empty" ) // Empty 메뉴 추가
.setCheckable( true ); // 체크 옵션 추가
SubMenu sub = menu.addSubMenu( "Select" ); // Select 서브 메뉴 추가
sub.add( 0, MENU_SEL_1, 0, "Selection 1" ); // 메뉴 추가
sub.add( 0, MENU_SEL_2, 0, "Selection 2" ); // 메뉴 추가
sub.add( 0, MENU_SEL_3, 0, "Selection 3" ); // 메뉴 추가
return true;
}
public boolean onOptionsItemSelected( MenuItem item )
{
switch ( item.getItemId() )
{
case MENU_NEW:
{
// Alert 대화상자 생성
AlertDialog alert = new AlertDialog.Builder( this )
.setTitle( "타이틀" )
.setMessage( "메세지" )
.setPositiveButton( "OK",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
}
}
)
.setNeutralButton( "?",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
}
}
)
.setNegativeButton( "Cancel",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
}
)
.create();
alert.show();
}
return true;
}
return false;
}
Original Post : http://neodreamer-dev.tistory.com/395
Labels:
Android
,
Options Menu
,
TistoryOldPost
,
메뉴
,
안드로이드
2010/03/28
[Study Note] 디버그 로그 뿌리고 확인하기
Eclipse를 이용한 안드로이드의 개발에도 Visual C++ 에서의 TRACE 기능이 있다. android.util.Log 가 그 기능을 한다.
아래는 Log 클래스를 이용한 디버그 메세지 출력 예이다.
위와 같이 로그 메세지를 뿌리면 아래와 같이 LogCat 창에서 확인을 수 있다. 로그의 종류별로 색상을 다르게 출력을 해 주어 한 눈에 확인할 수 있다.
LogCat 창은 Window 메뉴의 Open Perspective 의 Debug 를 선택하면 볼 수 있다.
또는 현재 작업 화면에서 LogCat을 추가할 수 있는데 Window 메뉴의 Show View 의 Other... 를 선택하고,
Android 항목 아래에 있는 LogCat 을 선택하면 LogCat를 현재의 작업 환경에 추가할 수 있다.
Android 개발 문서의 Log에 대한 설명<
Original Post : http://neodreamer-dev.tistory.com/394
아래는 Log 클래스를 이용한 디버그 메세지 출력 예이다.
import android.util.Log;
public void onClick( View v )
{
Log.d("DEBUG", "testmsg - Onclick");
Log.e("ERROR", "testmsg - Onclick");
Log.i("INFO", "testmsg - Onclick");
Log.v("VERBOSE", "testmsg - Onclick");
Log.w("WARN", "testmsg - Onclick");
}
위와 같이 로그 메세지를 뿌리면 아래와 같이 LogCat 창에서 확인을 수 있다. 로그의 종류별로 색상을 다르게 출력을 해 주어 한 눈에 확인할 수 있다.
LogCat 창은 Window 메뉴의 Open Perspective 의 Debug 를 선택하면 볼 수 있다.
또는 현재 작업 화면에서 LogCat을 추가할 수 있는데 Window 메뉴의 Show View 의 Other... 를 선택하고,
Android 항목 아래에 있는 LogCat 을 선택하면 LogCat를 현재의 작업 환경에 추가할 수 있다.
Android 개발 문서의 Log에 대한 설명<
Original Post : http://neodreamer-dev.tistory.com/394
2010/03/26
리스트 컬럼크기를 자동으로 설정하기
<
CHeaderCtrl* pHeader = m_ListCtrl.GetHeaderCtrl();
int numcol = pHeader->GetItemCount();
for (int col = 0; col < numcol; col++)
{
m_ListCtrl.SetColumnWidth(col,LVSCW_AUTOSIZE);
}
Original Post : http://neodreamer-dev.tistory.com/393
Labels:
AutoSize
,
CHeaderCtrl
,
CListCtrl
,
LVSCW_AUTOSIZE
,
TistoryOldPost
,
리스트
CEdit 의 내용을 클립보드로 복사하기
<
GetDlgItem(IDC_EDT_RESULT)->SendMessage(EM_SETSEL, 0, -1);
GetDlgItem(IDC_EDT_RESULT)->SendMessage(WM_COPY, 0, 0);
Original Post : http://neodreamer-dev.tistory.com/392
Labels:
C++
,
CEdit
,
clipboard
,
Edit Control
,
MFC
,
TistoryOldPost
,
클립보드
2010/03/24
QueryPerformanceCounter 이용한 StopWatch 클래스
#pragma once
<
class CAStopWatch
{
private:
int m_Initialized;
BOOL m_BeginFlag;
__int64 m_Frequency;
__int64 m_BeginTime;
__int64 m_EndTime;
__int64 m_i64Elapsed;
double m_dblElapsed;
public:
CAStopWatch(void)
{
// Get CPU Frequency
m_Initialized = QueryPerformanceFrequency((LARGE_INTEGER *)&m_Frequency);
m_BeginFlag = FALSE;
}
virtual ~CAStopWatch(void)
{
}
BOOL Begin()
{
if( !m_Initialized )
{
return 0;
}
// Get Begin Counter
m_BeginFlag = QueryPerformanceCounter( (LARGE_INTEGER *)&m_BeginTime );
return m_BeginFlag;
}
double End()
{
if( !m_Initialized || !m_BeginFlag )
{
return 0.0;
}
// Get End Counter
QueryPerformanceCounter( (LARGE_INTEGER *)&m_EndTime );
// calculate elapse count
m_i64Elapsed = m_EndTime - m_BeginTime;
// Convert count to second
m_dblElapsed = (double)m_i64Elapsed / (double)m_Frequency;
return m_dblElapsed;
}
BOOL Available()
{
return m_Initialized;
}
__int64 GetFreq()
{
return m_Frequency;
}
double GetElapsedTime()
{
return m_dblElapsed;
}
double GetElapsedSecond()
{
return m_dblElapsed;
}
double GetElapsedMillisecond()
{
return m_dblElapsed * 1000;
}
double GetElapsedMicroSecond()
{
return m_dblElapsed * 1000000;
}
};
// 사용 예
CAStopWatch watch;
watch.Begin();
:
:
watch.End();
double sec = watch.GetElapsedSecond();
Original Post : http://neodreamer-dev.tistory.com/391
Labels:
QueryPerformanceCounter
,
QueryPerformanceFrequency
,
StopWatch
,
TistoryOldPost
,
고정밀 시간 측정
,
시간측정
[MFC] 메인창 크기 고정
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
<
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
cs.x = ::GetSystemMetrics(SM_CXSCREEN) / 2 ; // WIndow 위치
cs.y = ::GetSystemMetrics(SM_CYSCREEN) * 1 / 5; // Window 위치
cs.cx = 500; // Window 크기
cs.cy = 400; // Window 크기
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX; // Window 속성 - 최대화 Button Disable
return TRUE;
}
Original Post : http://neodreamer-dev.tistory.com/390
Labels:
C++
,
MFC
,
TistoryOldPost
,
Visual C++
,
창 크기 고정
[MFC] 제목 표시줄 고정
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
...
// Set Window Style
cs.style &= ~FWS_ADDTOTITLE;
cs.lpszName = "제목";
...
return TRUE;
}
Original Post : http://neodreamer-dev.tistory.com/389
Labels:
C++
,
MFC
,
TistoryOldPost
,
title
,
Visual C++
,
제목
2010/03/23
툴바 또는 상태바를 숨기거나 보이게하기
// 툴바 감추기
if( ((CMainFrame*)GetParent())->m_wndToolBar.IsWindowVisible()) {
GetParent()->SendMessage(WM_COMMAND, ID_VIEW_TOOLBAR, 0L);
}
// 상태바 감추기
if( ((CMainFrame*)GetParent())->m_wndStatusBar.IsWindowVisible()) {
GetParent()->SendMessage(WM_COMMAND, ID_VIEW_STATUS_BAR, 0L);
}
//보이게 하려면 wParam값을 0이 아닌 값을 넣어줌
Original Post : http://neodreamer-dev.tistory.com/388
Labels:
C++
,
MFC
,
TistoryOldPost
,
Visual C++
,
상태바
,
툴바
실행 파일의 경로 가져오기 _splitpath
TCHAR filename[MAX_PATH];
GetModuleFileName(NULL, filename, sizeof(filename));
TCHAR Drive[_MAX_DRIVE];
TCHAR Path[_MAX_DIR];
TCHAR Filename[_MAX_FNAME];
TCHAR Ext[_MAX_EXT];
_tsplitpath_s(filename, Drive, _MAX_DRIVE, Path, _MAX_DIR, Filename, _MAX_FNAME, Ext, _MAX_EXT);
MSDN 의 _splitpath 설명보기
void _splitpath(
const char *path,
char *drive,
char *dir,
char *fname,
char *ext
);
Parameters
path
Full path
drive
Optional drive letter, followed by a colon (:)
dir
Optional directory path, including trailing slash. Forward slashes ( / ),
backslashes ( \ ), or both may be used.
fname
Base filename (no extension)
ext
Optional filename extension, including leading period (.)
Remarks
The _splitpath function breaks a path into its four components. _splitpath automatically handles multibyte-character string arguments as appropriate, recognizing multibyte-character sequences according to the multibyte code page currently in use. _wsplitpath is a wide-character version of _splitpath; the arguments to _wsplitpath are wide-character strings. These functions behave identically otherwise
출처 : MSDN
Original Post : http://neodreamer-dev.tistory.com/387
Labels:
_splitpath
,
GetModuleFileName
,
TistoryOldPost
,
실행파일 경로
,
자신의 경로
2010/03/22
파일 존재 유무 파악 _access
#include
// Check for existence.
if( (_access( "crt_ACCESS.C", 0 )) != -1 )
{
printf_s( "File crt_ACCESS.C exists.\n" );
// Check for write permission.
// Assume file is read-only.
if( (_access( "crt_ACCESS.C", 2 )) == -1 )
printf_s( "File crt_ACCESS.C does not have write permission.\n" );
}
_access 설명 보기
int _access(
const char *path,
int mode
);
Parameters
path
File or directory path.
mode
Read/write attribute.
Return Value
Each function returns 0 if the file has the given mode. The function returns ?1 if the named file does not exist or does not have the given mode; in this case, errno is set as shown in the following table.
EACCES
Access denied: the file's permission setting does not allow specified access.
ENOENT
File name or path not found.
EINVAL
Invalid parameter.
Remark
mode value Checks file for
00 Existence only
02 Write-only
04 Read-only
06 Read and write
Labels:
_access
,
File Exits Check
,
TistoryOldPost
,
파일 존재 확인
2010/03/18
IDE Fix Pack 3.01 for RAD Studio 2010
몇일 전에 3.0 버전을 공개 했는데 패키징 과정에서 2010버전에 실험적 코드가 있어서 이를 수정하여 재 공개 하였음.
Labels:
IDE Fix Pack
,
RAD Studio 2009 IDE Patch
,
RAD Studio 2010
,
TistoryOldPost
2010/03/17
윈도우폰 7 개발환경 공개
MS 의 스마트 폰 운영체제인 Windows Phone 7 의 개발 환경이 공개 되었다.
Windows Phone 7 의 개발환경은 C# 기반의 Silverlight 만을 지원한다고 한다. C++ 에 대한 지원이 없어 좀 아쉽다.
개발 환경 설치할 경우 설치되는 툴들:
- Visual Studio 2010 Express for Windows Phone CTP
- Windows Phone Emulator CTP
- Silverlight for Windows Phone CTP
- XNA 4.0 Game Studio CTP
시스템 요구 사항
- Supported Operating Systems: Windows 7; Windows Vista
- Windows® Vista® (x86 and x64) ENU with Service Pack 2 – all editions except Starter Edition
- Windows 7 (x86 and x64) ENU – all editions except Starter Edition
- Installation requires 3 GB of free disk space on the system drive.
- 2 GB RAM
- DirectX 10 capable graphics card with a WDDM 1.1 driver
IDE Fix Pack 2009/2010 3.0 Released
RadStudio IDE 의 버그를 수정한 IDE Fix Pack 이 3.0 버전을 공개하였다.
RAD Studio 2010 fixes:
<
Original Post : http://neodreamer-dev.tistory.com/383
RAD Studio 2010 fixes:
- Undo destroys editor buffer
- F1 key doesn’t work if invoked from the ObjectInspector
- Vista compatible icons (256×256) aren’t supported
- Stepping through the code can be slow
- QC #80822: ObjectInspecor: Properties are duplicated after scrolling
- QC #80776: ObjectInspector shows “EditControl” instead of the real content
- QC #79776: Clicking on object Inspector rejects focus
- QC #29732: Class Completion adds published section
- Step-Out doesn’t recognize the return address at ESP
- QC #75738: Debugging extremly slow
- QC #68493: Switching away and back to Delphi orphans focus on Code Editor
RAD Studio 2009 fixes:
- Stepping through the code can be slow
- Vista compatible icons (256×256) aren’t supported
- Undo destroys editor buffer
- 64 bit Debugger assertion (see hotfix from Embarcadero for 2009)
- QC #75738: Debugging extremly slow
- QC #71575: Delphi 2009 literal string assigment
- QC #47807: Error insight fails to find TObject class
- Possible deadlock when Error Insight calls ProcessMessages
- QC #68493: Switching away and back to Delphi orphans focus on Code Editor
- QC #37462: IDE may select the wrong file when performing a ctrl + left-click on a filename in the editor
- QC #22880: Cannot resolve unit name
- QC #58045: Component captions and component icons disappear from form designer
- QC #69456: IDE dead lock when updating the editors
- QC #55910: TDBText.Color always reverts to Parent.Color
- QC #59963: Closing non-modal forms after a task switch can deactivate the application
- QC #56252: TPageControl flickers a lot with active theming
- QC #68730: TLabel is not painted on a themed, double-buffered TTabSheet in Vista
- ToolsAPI IOTAProjectOptions.GetOptionNames destroys options.
- QC #74646: Buffer overflow in TCustomClientDataSet.DataConvert with ftWideString
- QC #80822: ObjectInspecor: Properties are duplicated after scrolling
- QC #80776: ObjectInspector shows “EditControl” instead of the real content
- QC #79776: Clicking on object Inspector rejects focus
- QC #29732: Class Completion adds published section
<
Original Post : http://neodreamer-dev.tistory.com/383
Labels:
Andy
,
Delphi
,
IDE Fix Pack
,
RAD Studio IDE
,
TistoryOldPost
2010/03/16
주어진 각도로 회전 된 포인트 구하기
// Positive - Counter clock wise
// Negative - Clock wise
void CalcRotatedPoint(double x, double y, double fAngle, double& x2, double& y2)
{
double pi = 3.1415926535;
x2 = cos(fAngle * pi / 180.0f) * x - sin(fAngle * pi / 180.0f) * y;
y2 = sin(fAngle * pi / 180.0f) * x + cos(fAngle * pi / 180.0f) * y;
}
2010/03/15
주어진 점이 다각형에 포함되는지 확인하기
function PtInPoly
(const Points: Array of TPoint; X,Y: Integer):
Boolean;
var Count, K, J : Integer;
begin
Result := False;
Count := Length(Points) ;
J := Count-1;
for K := 0 to Count-1 do begin
if ((Points[K].Y <=Y) and (Y < Points[J].Y)) or
((Points[J].Y <=Y) and (Y < Points[K].Y)) then
begin
if (x < (Points[j].X - Points[K].X) *
(y - Points[K].Y) /
(Points[j].Y - Points[K].Y) + Points[K].X) then
Result := not Result;
end;
J := K;
end;
end;
출처 : http://delphi.about.com/cs/adptips2001/a/bltip0601_5.htm<
Original Post : http://neodreamer-dev.tistory.com/381
Radian <-> Dgree 매크로
<
#define RAD2DEG(x) (x * 180.0 / 3.14159265358979323846)
#define DEG2RAD(x) (x * 3.14159265358979323846 / 180.0)
Original Post : http://neodreamer-dev.tistory.com/380
2010/03/11
프로그래밍의 도(道) - The Tao Of Programming
아주 오래된 글이다. 원본 글로 볼 때 20년이 넘은 글인데도 현대의 프로그래밍의 큰 틀에서 벗어나지 않는다. 오래전에 스쳐지나며 본 듯한 글이 였는데 오늘 다시 보게 되었다. 띄엄띄엄 몇 구절 읽어보았는데 심심풀이로 한 번 읽어 봄 직한 글인 것 같아 블로그에 발췌를 해 두었다.
It's a joke
프로그래밍의 도 원문 보기
The Tao Of Programming
Translated by Geoffrey James
Transcribed by Duke Hillard
Transmitted by Anupam Trivedi, Sajitha Tampi, and Meghshyam Jagannath
Re-html-ized and edited by Kragen Sittler
Last modified 1996-04-10 or earlier
Table of Contents
1. The Silent Void
2. The Ancient Masters
3. Design
4. Coding
5. Maintenance
6. Management
7. Corporate Wisdom
8. Hardware and Software
9. Epilogue
Book 1 - The Silent Void
Thus spake the master programmer:
``When you have learned to snatch the error code from the trap frame, it will be time for you to leave.''
1.1
Something mysterious is formed, born in the silent void. Waiting alone and unmoving, it is at once still and yet in constant motion. It is the source of all programs. I do not know its name, so I will call it the Tao of Programming.
If the Tao is great, then the operating system is great. If the operating system is great, then the compiler is great. If the compiler is great, then the application is great. The user is pleased and there exists harmony in the world.
The Tao of Programming flows far away and returns on the wind of morning.
1.2
The Tao gave birth to machine language. Machine language gave birth to the assembler.
The assembler gave birth to the compiler. Now there are ten thousand languages.
Each language has its purpose, however humble. Each language expresses the Yin and Yang of software. Each language has its place within the Tao.
But do not program in COBOL if you can avoid it.
1.3
In the beginning was the Tao. The Tao gave birth to Space and Time. Therefore Space and Time are Yin and Yang of programming.
Programmers that do not comprehend the Tao are always running out of time and space for their programs. Programmers that comprehend the Tao always have enough time and space to accomplish their goals.
How could it be otherwise?
1.4
The wise programmer is told about Tao and follows it. The average programmer is told about Tao and searches for it. The foolish programmer is told about Tao and laughs at it.
If it were not for laughter, there would be no Tao.
The highest sounds are hardest to hear.
Going forward is a way to retreat.
Great talent shows itself late in life.
Even a perfect program still has bugs.
Book 2 - The Ancient Masters
Thus spake the master programmer:
``After three days without programming, life becomes meaningless.''
2.1
The programmers of old were mysterious and profound. We cannot fathom their thoughts, so all we do is describe their appearance.
Aware, like a fox crossing the water. Alert, like a general on the battlefield. Kind, like a hostess greeting her guests. Simple, like uncarved blocks of wood. Opaque, like black pools in darkened caves.
Who can tell the secrets of their hearts and minds?
The answer exists only in Tao.
2.2
Grand Master Turing once dreamed that he was a machine. When he awoke he exclaimed:
``I don't know whether I am Turing dreaming that I am a machine, or a machine dreaming that I am Turing!''
2.3
A programmer from a very large computer company went to a software conference and then returned to report to his manager, saying: ``What sort of programmers work for other companies? They behaved badly and were unconcerned with appearances. Their hair was long and unkempt and their clothes were wrinkled and old. They crashed our hospitality suite and they made rude noises during my presentation.''
The manager said: ``I should have never sent you to the conference. Those programmers live beyond the physical world. They consider life absurd, an accidental coincidence. They come and go without knowing limitations. Without a care, they live only for their programs. Why should they bother with social conventions?
``They are alive within the Tao.''
2.4
A novice asked the Master: ``Here is a programmer that never designs, documents or tests his programs. Yet all who know him consider him one of the best programmers in the world. Why is this?''
The Master replies: ``That programmer has mastered the Tao. He has gone beyond the need for design; he does not become angry when the system crashes, but accepts the universe without concern. He has gone beyond the need for documentation; he no longer cares if anyone else sees his code. He has gone beyond the need for testing; each of his programs are perfect within themselves, serene and elegant, their purpose self-evident. Truly, he has entered the mystery of Tao.''
Book 3 - Design
Thus spake the master programmer:
``When the program is being tested, it is too late to make design changes.''
3.1
There once was a man who went to a computer trade show. Each day as he entered, the man told the guard at the door:
``I am a great thief, renowned for my feats of shoplifting. Be forewarned, for this trade show shall not escape unplundered.''
This speech disturbed the guard greatly, because there were millions of dollars of computer equipment inside, so he watched the man carefully. But the man merely wandered from booth to booth, humming quietly to himself.
When the man left, the guard took him aside and searched his clothes, but nothing was to be found.
On the next day of the trade show, the man returned and chided the guard saying: ``I escaped with a vast booty yesterday, but today will be even better.'' So the guard watched him ever more closely, but to no avail.
On the final day of the trade show, the guard could restrain his curiosity no longer. ``Sir Thief,'' he said, ``I am so perplexed, I cannot live in peace. Please enlighten me. What is it that you are stealing?''
The man smiled. ``I am stealing ideas,'' he said.
3.2
There once was a master programmer who wrote unstructured programs. A novice programmer, seeking to imitate him, also began to write unstructured programs. When the novice asked the master to evaluate his progress, the master criticized him for writing unstructured programs, saying, ``What is appropriate for the master is not appropriate for the novice. You must understand the Tao before transcending structure.''
3.3
There was once a programmer who was attached to the court of the warlord of Wu. The warlord asked the programmer: ``Which is easier to design: an accounting package or an operating system?''
``An operating system,'' replied the programmer.
The warlord uttered an exclamation of disbelief. ``Surely an accounting package is trivial next to the complexity of an operating system,'' he said.
``Not so,'' said the programmer, ``when designing an accounting package, the programmer operates as a mediator between people having different ideas: how it must operate, how its reports must appear, and how it must conform to the tax laws. By contrast, an operating system is not limited by outside appearances. When designing an operating system, the programmer seeks the simplest harmony between machine and ideas. This is why an operating system is easier to design.''
The warlord of Wu nodded and smiled. ``That is all good and well, but which is easier to debug?''
The programmer made no reply.
3.4
A manager went to the master programmer and showed him the requirements document for a new application. The manager asked the master: ``How long will it take to design this system if I assign five programmers to it?''
``It will take one year,'' said the master promptly.
``But we need this system immediately or even sooner! How long will it take if I assign ten programmers to it?''
The master programmer frowned. ``In that case, it will take two years.''
``And what if I assign a hundred programmers to it?''
The master programmer shrugged. ``Then the design will never be completed,'' he said.
Book 4 - Coding
Thus spake the master programmer:
``A well-written program is its own heaven; a poorly-written program is its own hell.''
4.1
A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity.
A program should follow the `Law of Least Astonishment'. What is this law? It is simply that the program should always respond to the user in the way that astonishes him least.
A program, no matter how complex, should act as a single unit. The program should be directed by the logic within rather than by outward appearances.
If the program fails in these requirements, it will be in a state of disorder and confusion. The only way to correct this is to rewrite the program.
4.2
A novice asked the master: ``I have a program that sometime runs and sometimes aborts. I have followed the rules of programming, yet I am totally baffled. What is the reason for this?''
The master replied: ``You are confused because you do not understand Tao. Only a fool expects rational behavior from his fellow humans. Why do you expect it from a machine that humans have constructed? Computers simulate determinism; only Tao is perfect.
``The rules of programming are transitory; only Tao is eternal. Therefore you must contemplate Tao before you receive enlightenment.''
``But how will I know when I have received enlightenment?'' asked the novice.
``Your program will then run correctly,'' replied the master.
4.3
A master was explaining the nature of Tao of to one of his novices. ``The Tao is embodied in all software - regardless of how insignificant,'' said the master.
``Is the Tao in a hand-held calculator?'' asked the novice.
``It is,'' came the reply.
``Is the Tao in a video game?'' continued the novice.
``It is even in a video game,'' said the master.
``And is the Tao in the DOS for a personal computer?''
The master coughed and shifted his position slightly. ``The lesson is over for today,'' he said.
4.4
Prince Wang's programmer was coding software. His fingers danced upon the keyboard. The program compiled without an error message, and the program ran like a gentle wind.
``Excellent!'' the Prince exclaimed, ``Your technique is faultless!''
``Technique?'' said the programmer turning from his terminal, ``What I follow is Tao - beyond all techniques! When I first began to program I would see before me the whole problem in one mass. After three years I no longer saw this mass. Instead, I used subroutines. But now I see nothing. My whole being exists in a formless void. My senses are idle. My spirit, free to work without plan, follows its own instinct. In short, my program writes itself. True, sometimes there are difficult problems. I see them coming, I slow down, I watch silently. Then I change a single line of code and the difficulties vanish like puffs of idle smoke. I then compile the program. I sit still and let the joy of the work fill my being. I close my eyes for a moment and then log off.''
Prince Wang said, ``Would that all of my programmers were as wise!''
Book 5 - Maintenance
Thus spake the master programmer:
``Though a program be but three lines long, someday it will have to be maintained.''
5.1
A well-used door needs no oil on its hinges.
A swift-flowing stream does not grow stagnant.
Neither sound nor thoughts can travel through a vacuum.
Software rots if not used.
These are great mysteries.
5.2
A manager asked a programmer how long it would take him to finish the program on which he was working. ``It will be finished tomorrow,'' the programmer promptly replied.
``I think you are being unrealistic,'' said the manager, ``Truthfully, how long will it take?''
The programmer thought for a moment. ``I have some features that I wish to add. This will take at least two weeks,'' he finally said.
``Even that is too much to expect,'' insisted the manager, ``I will be satisfied if you simply tell me when the program is complete.''
The programmer agreed to this.
Several years later, the manager retired. On the way to his retirement luncheon, he discovered the programmer asleep at his terminal. He had been programming all night.
5.3
A novice programmer was once assigned to code a simple financial package.
The novice worked furiously for many days, but when his master reviewed his program, he discovered that it contained a screen editor, a set of generalized graphics routines, an artificial intelligence interface, but not the slightest mention of anything financial.
When the master asked about this, the novice became indignant. ``Don't be so impatient,'' he said, ``I'll put in the financial stuff eventually.''
5.4
Does a good farmer neglect a crop he has planted?
Does a good teacher overlook even the most humble student?
Does a good father allow a single child to starve?
Does a good programmer refuse to maintain his code?
Book 6 - Management
Thus spake the master programmer:
``Let the programmers be many and the managers few - then all will be productive.''
6.1
When managers hold endless meetings, the programmers write games. When accountants talk of quarterly profits, the development budget is about to be cut. When senior scientists talk blue sky, the clouds are about to roll in.
Truly, this is not the Tao of Programming.
When managers make commitments, game programs are ignored. When accountants make long-range plans, harmony and order are about to be restored. When senior scientists address the problems at hand, the problems will soon be solved.
Truly, this is the Tao of Programming.
6.2
Why are programmers non-productive?
Because their time is wasted in meetings.
Why are programmers rebellious?
Because the management interferes too much.
Why are the programmers resigning one by one?
Because they are burnt out.
Having worked for poor management, they no longer value their jobs.
6.3
A manager was about to be fired, but a programmer who worked for him invented a new program that became popular and sold well. As a result, the manager retained his job.
The manager tried to give the programmer a bonus, but the programmer refused it, saying, ``I wrote the program because I thought it was an interesting concept, and thus I expect no reward.''
The manager upon hearing this remarked, ``This programmer, though he holds a position of small esteem, understands well the proper duty of an employee. Let us promote him to the exalted position of management consultant!''
But when told this, the programmer once more refused, saying, ``I exist so that I can program. If I were promoted, I would do nothing but waste everyone's time. Can I go now? I have a program that I'm working on."
6.4
A manager went to his programmers and told them: ``As regards to your work hours: you are going to have to come in at nine in the morning and leave at five in the afternoon.'' At this, all of them became angry and several resigned on the spot.
So the manager said: ``All right, in that case you may set your own working hours, as long as you finish your projects on schedule.'' The programmers, now satisfied, began to come in at noon and work to the wee hours of the morning.
Book 7 - Corporate Wisdom
Thus spake the master programmer:
``You can demonstrate a program for a corporate executive, but you can't make him computer literate.''
7.1
A novice asked the master: ``In the east there is a great tree-structure that men call `Corporate Headquarters'. It is bloated out of shape with vice presidents and accountants. It issues a multitude of memos, each saying `Go, Hence!' or `Go, Hither!' and nobody knows what is meant. Every year new names are put onto the branches, but all to no avail. How can such an unnatural entity be?"
The master replied: ``You perceive this immense structure and are disturbed that it has no rational purpose. Can you not take amusement from its endless gyrations? Do you not enjoy the untroubled ease of programming beneath its sheltering branches? Why are you bothered by its uselessness?''
7.2
In the east there is a shark which is larger than all other fish. It changes into a bird whose wings are like clouds filling the sky. When this bird moves across the land, it brings a message from Corporate Headquarters. This message it drops into the midst of the programmers, like a seagull making its mark upon the beach. Then the bird mounts on the wind and, with the blue sky at its back, returns home.
The novice programmer stares in wonder at the bird, for he understands it not. The average programmer dreads the coming of the bird, for he fears its message. The master programmer continues to work at his terminal, for he does not know that the bird has come and gone.
7.3
The Magician of the Ivory Tower brought his latest invention for the master programmer to examine. The magician wheeled a large black box into the master's office while the master waited in silence.
``This is an integrated, distributed, general-purpose workstation,'' began the magician, ``ergonomically designed with a proprietary operating system, sixth generation languages, and multiple state of the art user interfaces. It took my assistants several hundred man years to construct. Is it not amazing?''
The master raised his eyebrows slightly. ``It is indeed amazing,'' he said.
``Corporate Headquarters has commanded,'' continued the magician, ``that everyone use this workstation as a platform for new programs. Do you agree to this?''
``Certainly,'' replied the master, ``I will have it transported to the data center immediately!'' And the magician returned to his tower, well pleased.
Several days later, a novice wandered into the office of the master programmer and said, ``I cannot find the listing for my new program. Do you know where it might be?''
``Yes,'' replied the master, ``the listings are stacked on the platform in the data center.''
7.4
The master programmer moves from program to program without fear. No change in management can harm him. He will not be fired, even if the project is cancelled. Why is this? He is filled with Tao.
Book 8 - Hardware and Software
Thus spake the master programmer:
``Without the wind, the grass does not move. Without software, hardware is useless.''
8.1
A novice asked the master: ``I perceive that one computer company is much larger than all others. It towers above its competition like a giant among dwarfs. Any one of its divisions could comprise an entire business. Why is this so?''
The master replied, ``Why do you ask such foolish questions? That company is large because it is large. If it only made hardware, nobody would buy it. If it only made software, nobody would use it. If it only maintained systems, people would treat it like a servant. But because it combines all of these things, people think it one of the gods! By not seeking to strive, it conquers without effort.''
8.2
A master programmer passed a novice programmer one day. The master noted the novice's preoccupation with a hand-held computer game. ``Excuse me,'' he said, ``may I examine it?''
The novice bolted to attention and handed the device to the master. ``I see that the device claims to have three levels of play: Easy, Medium, and Hard,'' said the master. ``Yet every such device has another level of play, where the device seeks not to conquer the human, nor to be conquered by the human.''
``Pray, great master,'' implored the novice, ``how does one find this mysterious setting?''
The master dropped the device to the ground and crushed it underfoot. And suddenly the novice was enlightened.
8.3
There was once a programmer who worked upon microprocessors. ``Look at how well off I am here,'' he said to a mainframe programmer who came to visit, ``I have my own operating system and file storage device. I do not have to share my resources with anyone. The software is self- consistent and easy-to-use. Why do you not quit your present job and join me here?''
The mainframe programmer then began to describe his system to his friend, saying ``The mainframe sits like an ancient sage meditating in the midst of the data center. Its disk drives lie end-to-end like a great ocean of machinery. The software is as multifaceted as a diamond, and as convoluted as a primeval jungle. The programs, each unique, move through the system like a swift-flowing river. That is why I am happy where I am.''
The microcomputer programmer, upon hearing this, fell silent. But the two programmers remained friends until the end of their days.
8.4
Hardware met Software on the road to Changtse. Software said: ``You are Yin and I am Yang. If we travel together we will become famous and earn vast sums of money.'' And so the set forth together, thinking to conquer the world.
Presently they met Firmware, who was dressed in tattered rags and hobbled along propped on a thorny stick. Firmware said to them: ``The Tao lies beyond Yin and Yang. It is silent and still as a pool of water. It does not seek fame, therefore nobody knows its presence. It does not seek fortune, for it is complete within itself. It exists beyond space and time.''
Software and Hardware, ashamed, returned to their homes.
Book 9 - Epilogue
Thus spake the master programmer:
``It is time for you to leave.''
프로그래밍의 도 번역 보기
프로그래밍의 도(道) - The Tao of Programming
영역: 죠프리 제임스(Geoffrey James)
필사: 세쓰 로버트슨(Seth Robertson)
한역: 윤태원
목차
제 1 권 : 무(無)
제 2 권 : 고대(古代)의 도사(道士)들
제 3 권 : 설계(Design)
제 4 권 : 코딩(Coding)
제 5 권 : 유지(Maintenance)
제 6 권 : 관리(Management)
제 7 권 : 운용의 묘
제 8 권 : 하드웨어와 소프트웨어
제 9 권 : 에필로그
제 1 권 무(無)
도사 프로그래머 가라사대 : "숨겨진 에러 코드를 찾아내는 방법을 익혔다면 하산할 때가 온 것이니라."
1.1
무(無)에서 이상스러운 기운이 생겨났도다. 그 기운은 홀로 외로이 움직이지 않았다. 그 기운은 움직이지 않았으나 동시에 끊임없이 움직이고 있었다. 그것이 바로 모든 프로그램의 소스이다. 나는 그 이름을 알지 못하느니, 그것을 '프로그램의 도(道)'라고 부르게 되었다.
도가 위대하다면 운영체제(OS)도 위대하다. 운영체제가 위대하다면 컴파일러도 위대하다. 컴파일러가 아주 위대한 것이라면 애플리케이션은 위대하다.
사용자는 만족하고 그리하여 세상은 조화로 충만하도다.
프로그래밍의 도는 멀리까지 미치며 아침 바람과 함께 돌아온다.
1.2
도는 기계어를 낳았다. 기계어는 어셈블러를 낳았다. 어셈블러는 컴파일러를 낳았다. 그리하여 세상은 만가지도 넘는 언어로 가득하게 되었다.
모든 언어는 아무리 비천한 것일지라도 그 뜻한 바가 있다. 모든 언어는 소프트웨어의 음과 양(陰陽)을 나타낸다. 모든 언어는 '도'안에 그 자리가 있는 법이다.
하지만 할 수만 있다면 코볼(COBOL)로는 프로그래밍을 하지 말지어다.
1.3
처음에 도가 있었다. 도는 시간과 공간을 낳았다. 그리하여 시간과 공간은 프로그래밍의 음과 양을 이루게 되었다.
도를 깨닫지 못한 프로그래머는 언제나 프로그램을 짤 시간과 공간이 모자라는 법이다. 도를 깨달은 프로그래머는 언제나 목적을 달성할 수 있는 충분한 시간과 공간이 있다.
세상의 모든 이치가 그러한 법이니......
1.4
현명한 프로그래머는 도를 듣고 따른다. 보통 프로그래머는 도를 듣고 찾아본다. 멍청한 프로그래머는 도를 듣고 웃어 넘긴다.
그 웃음이 없었더라면 도는 존재하지 않았을 것이다. 가장 높은 음이 가장 알아듣기 힘든 법. 앞으로 나아감은 바로 후퇴하는 법.
위대한 재능은 인생의 후반에야 나타나는 법. 가장 완벽한 프로그램에도 버그는 존재하는 법.
제 2 권 고대(古代)의 도사(道士)들
도사 프로그래머 가라사대 ; "사흘간 프로그래밍을 하지 않으면, 삶에 아무런 의미도 없어지느니라."
2.1
고대의 프로그래머들은 신비롭고 심오하도다. 우리는 그들의 사상을 감히 측정할 수 없도다. 그리하여 우리는 그들의 외양을 묘사할 수밖에 없도다. 그들은 물을 건너는 여우처럼 빈틈이 없다. 전장에 나선 장군처럼 방심하지 않는다. 손님을 맞는 여주인처럼 친절하다. 조각하지 않은 나무토막처럼 단순하다. 어두운 동굴 속의 검은 연못처럼 불투명하다.
누가 감히 그들의 마음과 생각에 담긴 비밀을 알아낼 수 있으리요? 답은 오직 도 속에 있을 뿐이다.
2.2
위대한 도사 튜링은 어느날 그가 기계가 된 꿈을 꾸었다. 잠에서 깨어난 튜링이 탄식하며 가라사대 : "나는 기계가 된 꿈을 꾸는 튜링인지, 튜링이 된 꿈을 꾸는 기계인지 알 지 못하노라!"
2.3
아주 큰 컴퓨터 회사에서 온 프로그래머가 소프트웨어 전시회에 다녀와 상사에게 이렇게 말하였다. "다른 회사에는 어떤 프로그래머들이 일하고 있습니까? 그들은 멋대로 행동하고 외관에는 신경쓰지 않습니다. 그들의 머리는 길고 텁수룩하며, 그들의 옷은 낡고 구겨졌습니다. 그들은 숙소에서 만취해서 돌아다니며 제가 발표할 동안에 야유를 해 댔습니다."
상사가 가로되 : "너를 전시회에 보내지 말았어야 했다. 그 프로그래머들은 세상사를 초월한 사람들이니라. 그들은 삶을 어리석은 것으로 여기며, 우연의 일치로 생각한다. 그들은 아무런 거리낌없이 다닌다. 그들은 아무 것에도 신경쓰지 않으니, 그 것은 그들이 프로그램만을 위해 살기 때문이다. 왜 그들이 사회적인 관습 따위에 신경을 쓰겠느냐?"
"그들은 도 속에 살고 있느니라."
2.4
제자가 스승에게 묻기를: "저 프로그래머는 설계도 않고, 문서 작성도 않으며 자기 프로그램을 테스트해 보지도 않습니다. 하지만 모두 그를 세계에서 가장 뛰어난 프로그래머라고 칭송합니다. 그 이유가 무엇입니까?"
스승이 답하기를: "그 프로그래머는 도를 깨달았느니라. 그는 더 이상 설계할 필요성을 느끼지 않는다. 그는 시스템이 다운 되도 화내지 않으며 그저 우주의 질서를 거리낌없이 받아들이기 때문이다. 그는 더 이상 문서를 작성할 필요가 없다. 그는 다른 사람이 자기가 짠 코드를 이해하건 말건 신경쓰지 않기 때문이다. 그는 테스팅할 필요가 없다. 그가 작성한 프로그램은 모두 그 자체로 완벽하며, 고요하고 또 우아하다. 그의 프로그램은 모두 그 목적이 스스로 뚜렷하기 때문이다. 아, 그는 진정으로 도를 깨달은 사람이니라."
제 3 권 설계(Design)
도사 프로그래머 가라사대: "프로그램을 테스트하고 있을 때는 설계를 변경하기엔 이미 늦은 다음이니라."
3.1
옛날에 컴퓨터 전시회에 참석한 사람이 있었다. 그는 매일 전시장에 들어가면서 문 앞에 선 경비원에게 이렇게 말했다.
"나는 상점을 터는 기술로 유명한 도둑이오. 미리 경고하지만 이 전시회도 내 손길을 벗어나진 못할 것이외다."
그의 말에 경비원은 무척 신경이 쓰였다. 전시회에 출품된 컴퓨터 장비의 가치들이 가히 수십억원에 이르렀기 때문이다. 경비원은 자칭 도둑의 일거수일투족을 감시하였다. 하지만 그는 휘파람을 불면서 전시장에서 전시장으로 돌아다닐 뿐이었다.
자칭 도둑이 전시회장을 나갈 때 경비원은 그를 옆으로 데려가 몸수색을 실시하였다. 하지만 몸에는 아무 것도 없었다.
다음날, 그는 다시 돌아와 경비원의 약을 올렸다. "나는 어제 엄청난 수확을 올렸소. 오늘은 더 많은 것을 훔치고 말테요." 경비원은 그를 더욱 철저히 감시하였다. 하지만 아무런 소득도 없었다.
전시회가 끝나는 날, 경비원은 호기심을 도저히 억누를 수가 없었다. "도선생, 나는 도저히 이해할 수 없소. 궁금증으로 인해 나는 밤잠을 이룰 수 없을 것 같군요. 제발 나를 깨우쳐 주시오. 당신이 훔친 것은 대체 무엇이요?"
도둑은 가볍게 미소를 지었다. "나는 아이디어를 훔치고 있소."
3.2
옛날에 한 스승 프로그래머는 늘 구조화되지 않은 프로그램을 짰다. 한 제자가 그를 흉내내기 위하여 구조화되지 않은 프로그램을 짰다. 제자가 스승에게 자신의 성장을 평가해달라고 하자 스승은 프로그램이 구조화되지 않았다며 꾸짖었다. "뱁새가 황새를 따라가면 가랑이가 찢어지는 법이다. 구조를 초월하기 전에 먼저 도를 깨달아야 하느니라."
3.3
위(魏)나라의 조정에 한 프로그래머가 있었다. 위후(魏候)가 프로그래머에게 묻기를: "회계 프로그램과 운영체제 중에 설계하기 쉬운 것은 어느 쪽이요?"
"운영체제이옵니다." 하고 프로그래머가 답했다.
위후는 믿을 수 없다는 표정으로 반문하였다. "어찌 회계 프로그램처럼 하찮은 것이 운영체제의 복잡함을 능가한다는 말이요?"
"그렇지 않사옵니다. 회계 프로그램을 설계할 때는 프로그래머가 서로 다른 생각을 지닌 사람들을 조율해야만 하옵니다. 회계 프로그램이 어떻게 작동해야 하며, 보고서는 어떤 양식으로 출력되어야 하며, 세법에는 어느 정도로 충실해야 하는지 각양각색으로 떠들기 마련이옵니다. 반면에 운영체제의 외양에는 아무도 신경쓰지 않사옵니다. 운영체제를 설계할 때는 프로그래머는 기계와 아이디어의 가장 단순한 조화만 추구하면 되옵나이다. 이것이 운영체제가 설계하기 쉬운 까닭이옵니다. 옛말에는 이를 일컬어 사공이 많으면 배가 산으로 간다고 하옵니다."
크게 감탄한 위후가 미소를 지으며 다른 질문을 던졌다. "그렇구려, 그런데 어느 쪽이 더 디버깅하기 쉽소?"
프로그래머는 아무런 답도 하지 못했다.
3.4
관리자가 도사 프로그래머를 만나 새 애플리케이션의 요구사항을 담은 문서를 건네주었다. 관리자가 묻기를: "다섯명의 프로그래머를 투입한다면 시스템을 설계하는데 얼마나 걸리겠소?"
"일년이 걸릴 것입니다." 도사가 간단하게 대답하였다.
"하지만 우리는 이 시스템이 지금 당장 필요하단 말이요! 프로그래머를 열명 투입하면 어떻겠소?"
도사는 인상을 찌푸렸다. "그렇다면 이년이 걸릴 것입니다."
"프로그래머를 백명 투입한다면 어떻겠소?"
도사는 가볍게 한숨을 쉬며 답하였다. "그 경우에는 시스템이 결코 완성되지 않을 것입니다."
제 4 권 코딩
도사 프로그래머 가라사대: "잘 짠 프로그램은 그 자체로 천국이며, 못 짠 프로그램은 그 자체로 지옥이니라."
4.1
프로그램은 작고 민첩해야하며, 그 서브루틴은 마치 진주 목걸이처럼 연결되어 있어야 한다. 프로그램의 내용과 정신은 일관적이어야 한다. 프로그램은 너무 작아도 너무 많아도 아니 되며, 필요 없는 루프나 필요 없는 변수가 있어서는 아니 되며, 구조가 없어도 아니 되며 지나치게 경직되어도 아니 된다.
프로그램은 '최소 경악의 법칙'을 따라야 한다. 이 법칙이 무엇이냐고? 프로그램은 사용자를 최소로 놀라게 하는 방향으로 반응해야 한다는 뜻이다.
프로그램은 아무리 복잡하더라도 하나의 객체처럼 동작해야 한다. 프로그램은 외관보다는 내부의 논리에 따라 작성되어야 한다.
프로그램이 이러한 요구를 따르지 못하면 무질서와 혼란이 발생한다. 이를 고치는 유일한 방법은 프로그램을 다시 작성하는 것뿐이다.
4.2
제자가 스승에게 묻기를: "프로그램을 짰는데 때로는 작동하고 때로는 작동하지 않습니다. 프로그래밍 법칙을 모두 따랐는데 왜 이런 일이 생기는지 도무지 알 수가 없습니다. 이유가 무엇입니까?"
스승이 답하기를: "너는 도를 깨닫지 못했기에 당황하는 것이니라. 사람들이 이성적으로 행동하리라 믿는 것은 오직 바보뿐이다. 너는 어찌하여 사람이 만든 기계로부터 이성적인 행동을 바라느뇨? 컴퓨터는 결정론을 흉내내는 것뿐이다. 오직 도만이 완전하다. 프로그래밍의 법칙은 일시적이며, 오직 도만이 영원하다. 따라서 너는 깨달음을 얻기 위해 도를 명상해야 할 것이니라."
"하지만 제가 깨달음을 얻었는지 어떻게 알 수 있습니까?" 제자가 물었다.
"그 때가 되면 프로그램이 제대로 돌아갈 것이다." 스승이 말했다.
4.3
스승이 도의 본질을 제자에게 설명하고 있었다. "도는 아무리 사소한 것일지라도 모든 소프트웨어 내에 존재한다." 스승이 말했다.
"휴대용 계산기에도 도는 존재합니까?" 제자가 물었다.
"그러느니라." 스승의 대답이었다.
"비디오게임에도 도는 존재합니까?" 제자가 물었다.
"비디오게임에도 도는 존재하느니라." 스승이 말했다.
"퍼스널 컴퓨터의 도스에도 도는 존재합니까?"
스승은 불편한 듯 헛기침을 하더니 자세를 조금 바꾸었다.
"오늘의 수업은 여기까지다." 스승이 말했다.
4.4
프라이스 왕의 프로그래머가 소프트웨어를 짜고 있었다. 그의 손가락이 키보드 위에서 춤을 추었다. 프로그램은 에러 메시지 하나 없이 컴파일 되었고 마치 봄바람처럼 가볍게 실행되었다.
"기가 막히군! 당신의 기술은 완전무결하구려!" 프라이스가 감탄하며 말했다.
"기술이라고요?" 프로그래머가 터미널에서 몸을 돌리며 말하기 시작했다.
"내가 따르는 것은 모든 기술을 넘어선 도입니다. 내가 처음 프로그램을 작성하기 시작했을 때는 프로그램 전체가 한 덩어리로 보였습니다. 삼년이 지나자 나는 더 이상 덩어리가 보이지 않았습니다. 그 때부터 나는 서브루틴을 사용하기 시작했지요. 하지만 이제는 내게는 아무 것도 보이지 않습니다.
내 존재는 형태 없는 '무'속에 존재합니다. 나는 아무런 감각도 느낄 수 없습니다. 내 정신은 아무런 계획도 세우지 않고 자유롭습니다. 그저 본능의 지시에만 따를 뿐. 간단히 말해 내 프로그램은 스스로 작성되는 것입니다. 가끔 어려운 문제가 발생하는 것은 사실입니다. 어려움이 다가오는 것을 다가오면 속도를 늦춥니다. 그리고 조용히 관찰합니다. 그리곤 코드에서 한줄만 바꾸면 어려움은 마치 연기처럼 사라지고 말지요. 그리고 나선 프로그램을 컴파일 합니다. 나는 조용히 앉아 일의 즐거움이 내 존재를 가득 채우는 것을 느끼며 즐깁니다. 나는 잠깐 눈을 감고 명상한 다음 터미널을 끕니다."
프라이스 왕이 가로되, "내가 고용한 모든 프로그래머들이 그대처럼 현명하기를!"
제 5 권 유지
도사 프로그래머 가라사대: "프로그램의 길이가 세줄밖에 안되더라도, 언젠가는 손 볼 필요가 생기느니라."
5.1
조심스레 사용한 문의 경첩에는 기름을 칠 필요가 없다. 흐르는 물에는 이끼가 끼지 않는다. 소리도 생각도 진공을 지나갈 수는 없다. 사용하지 않은 소프트웨어는 똥된다.
이들은 모두 위대한 미스터리들이다.
5.2
관리자가 어느날 프로그래머를 불러 물었다. "지금 짜고 있는 프로그램이 언제 끝나겠소?" 프로그래머가 즉시 답하기를. "내일까지 끝내지요."
"좀 비현실적인 얘기 같군요. 정말로 언제까지 끝낼 수 있습니까?" 관리자가 다시 물었다.
프로그래머는 잠깐 생각을 하더니 말했다. "사실은 약간 추가하고 싶은 기능이 있습니다. 그걸 다 하려면 이주는 걸리겠는데요."
"그것도 사실 기대하기 힘든 것 같군요. 그냥 프로그램이 완성되면 알려주시오." 관리자가 툴툴대며 말했다.
프로그래머는 그러마고 답했다.
많은 해가 지나 관리자는 은퇴하게 되었다. 은퇴식장에 가던 도중 그는 프로그래머가 터미널 앞에서 잠들어 있는 것을 보게 되었다. 그는 어제 밤을 새가며 프로그래밍을 했던 것이다.
5.3
어느날 제자 프로그래머가 간단한 회계 프로그램을 짜라는 지시를 받았다. 제자는 많은 날을 열심히 일했다. 스승이 그의 프로그램을 실행해보니 스크린 에디터와 그래픽 처리루틴 몇가지와 인공지능을 응용한 인터페이스가 구현되어 있었다. 하지만 어디에도 회계와 관련된 기능은 없었다.
스승이 이에 대해 묻자, 제자가 시큰둥하게 대답했다. "그렇게 급하게 재촉하지 마세요. 언젠가는 회계에 관련된 기능을 넣을 테니까요."
5.4
훌륭한 농부가 자신이 심은 쌀 한톨을 소홀히 하는 것을 보았는가? 훌륭한 선생이 반에서 가장 어리석은 학생이라고 무시하는 것을 보았는가? 훌륭한 아버지가 아이를 굶주리게 하는 것을 보았는가? 훌륭한 프로그래머가 코드를 고치는 것을 거부하는 것을 보았는가?
제 6 권 관리
도사 프로그래머 가라사대: "프로그래머는 많이 고용하고 관리자의 수는 줄여라. 생산성이 절로 향상될 것이다."
6.1
관리자가 끊임없이 회의를 하면 프로그래머는 게임을 짠다. 회계사가 사분기 이익에 대해 불평하면 개발 예산은 삭감될 위기에 처한다. 수석 과학자가 푸른 하늘을 논하면 바람 구름이 몰려든다.
아, 이것은 진정한 프로그래밍의 도가 아니다.
관리자가 결론을 내면, 게임 프로그램은 잊혀진다. 회계사가 장기 계획을 세우면 조화와 질서가 회복된다. 수석 과학자가 신경 쓰기 시작하면 문제는 곧 해결된다.
아, 이것이 진정한 프로그래밍의 도이다.
6.2
프로그래머는 왜 생산성이 낮은가? 그들의 시간이 회의로 낭비되기 때문이다.
프로그래머가 왜 툴툴거리는가? 관리자가 지나치게 참견하기 때문이다.
프로그래머가 왜 하나씩 회사를 떠나는가? 지쳤기 때문이다.
무능력한 관리자 밑에서 일하는 프로그래머는 자신의 직업을 소중히 여기지 않는다.
6.3
관리자가 해고될 위기에 쳐했다. 하지만 그 밑에서 일하던 프로그래머가 새로운 소프트웨어를 개발하여 큰 성공을 거두었다. 결과적으로 관리자는 자리를 지킬 수 있었다.
관리자는 보너스를 주려고 하였지만, 프로그래머는 거절하였다. 프로그래머 가로되. "나는 이 프로그램이 재미있다고 생각했기 때문에 작성했을 뿐입니다. 그러므로 나는 아무런 보상도 바라지 않습니다."
이 말을 들은 관리자가 말하기를, "이 프로그래머는, 비록 비천한 자리에 있으나, 종업원의 맡은 바 책무가 무엇인지 잘 알고 있다. 그를 보조 관리자로 승진시키도록 하라."
그러나 이 말을 들은 프로그래머는 다시 한 번 거절하였다. "나는 프로그램을 짤 수 있기 때문에 존재합니다. 만일 승진한다면 다른 사람의 시간을 갉아먹게 될 뿐입니다. 이제 가도 됩니까? 지금 짜고 있는 프로그램이 하나 있거든요."
6.4
관리자가 프로그래머를 찾아가서 말하기를: "당신의 출근 시간을 조정하기로 했소. 이제부터 아침 9시에 나오고 5시에 퇴근하도록 하시오." 이 말을 들은 프로그래머들은 모두 분노하였고, 몇몇은 즉석에서 회사를 그만두었다.
그래서 관리자가 말하기를: "좋아요. 그렇다면 작업 시간을 자유롭게 정하도록 하시오. 맡은 프로젝트를 스케줄에 맞게 끝내기만 하면 상관하지 않겠소." 만족한 프로그래머들은 이제 정오에 출근하여 이른 새벽까지 일했다.
제 7 권 운용의 묘
마스터 프로그래머 가라사대: "사장에게 컴퓨터 프로그램을 보여줄 수는 있다. 그러나 그가 컴퓨터 문맹에서 벗어나게 할 수는 없다."
7.1
제자가 스승에게 묻기를: "동방에는 본사라는 이름의 거대한 트리구조가 있습니다. 그 트리구조는 부사장과 관리자들로 지나치게 비대해졌습니다. 트리구조는 '이리 가라' 또는 '저리 가라'는 메모를 무수히 내려보냅니다. 하지만 아무도 그 메모의 진정한 뜻이 무엇인지는 이해하지 못합니다. 그 가지에는 매년 새로운 이름들이 나붙지만 결국엔 아무런 소용도 없지요. 어떻게 이렇게 부자연스러운 존재가 있을 수 있습니까?"
스승이 답하여 가로되; "너는 이 방대한 구조의 존재를 깨닫고, 거기에 아무런 이성적인 목적도 없다는 사실에 당황하고 있는 것이다. 본사의 그 끊임없는 방향 전환에서 아무런 즐거움도 느끼지 못하겠느냐? 우리를 보호하는 가지 아래서 아무런 방해도 받지 않고 프로그래밍을 할 수 있는 즐거움을 깨닫지 못했느냐? 왜 본사의 존재가 무가치하다는데 신경을 쓰는 것이냐?"
7.2
동방에는 어떤 물고기보다도 더 큰 상어가 있다. 이 상어는 대붕이라는 이름의 새로 변한다. 이 새가 일으키는 바람은 하늘을 가득 채우는 구름과도 같다. 대붕이 땅을 가로지르면 본사에서 보내는 메시지를 가져온다. 이 메시지는 갈매기가 해변에 떨어뜨리는 똥처럼 프로그래머의 수중에 떨어진다. 그 후 대붕은 바람을 타고 푸른 하늘을 등에 업은 채 집으로 돌아간다.
초보 프로그래머는 놀란 눈으로 대붕을 바라본다. 이해할 수 없기 때문이다.
보통 프로그래머는 대붕을 두려워한다. 대붕이 가져오는 메시지가 무섭기 때문이다.
도사 프로그래머는 터미널 앞에 앉아 일을 계속한다. 대붕이 다녀간 것을 알아차리지 못하기 때문이다.
7.3
상아탑에 사는 위대한 마법사가 새로운 발명품을 스승 프로그래머에게 가져왔다. 마법사는 거대한 검은 상자를 밀며 스승의 사무실로 들어왔다. 스승은 조용히 그를 지켜볼 뿐이었다.
"이 것은 통합적으로 분산된 다목적 워크스테이션이요." 마법사가 자랑스레 말하기 시작했다.
"인간 환경공학적으로 설계된 독점 운영체제와 제6세대 언어, 그리고 복수의 최신 유저 인터페이스를 탑재하고 있지요. 이 워크스테이션을 제작하기 위해 수백명의 조수들이 몇 년이나 일해야 했소이다. 멋지지 않습니까?"
스승은 눈썹을 약간 치켜 뜨며 대답했다. "정말 멋지군요."
"본사에서는 모든 사람들이 이 워크스테이션을 이용해서 새로운 프로그램을 개발해야 한다고 지시했소이다. 그러시겠습니까?"
"물론이지요. 워크스테이션을 즉시 컴퓨터실로 옮겨두겠습니다." 스승이 말했다.
마법사는 만족하여 자신의 탑으로 돌아갔다.
며칠 후 제자가 스승 프로그래머의 사무실로 들어와서 물었다. "새로 짠 프로그램의 리스트가 어디 있는지 모르겠어요. 혹시 어디 있는지 아세요?"
"물론이지. 컴퓨터실에 있는 검정색 상자 위에 있다." 스승이 말했다.
7.4
도사 프로그래머는 프로그램에서 프로그램으로 아무런 두려움 없이 옮겨다닌다. 관리자가 어떻게 변해도 그의 위치는 변하지 않는다. 그는 프로젝트가 취소되더라도 해고되지 않는다. 왜 그럴까? 도사 프로그래머는 도로 충만하기 때문이다.
제 8 권 하드웨어와 소프트웨어
도사 프로그래머 가라사대: "바람이 불지 않으면, 풀은 움직이지 않는다. 소프트웨어가 없으면 하드웨어는 쓸모가 없다."
8.1
제자가 스승에게 묻기를, "한 컴퓨터 회사는 다른 회사들에 비해 월등히 큽니다. 난쟁이들 사이에 선거인처럼 보입니다. 이 회사의 한 부서만으로도 산업을 일으킬 수 있을 정도입니다. 왜 그렇습니까?"
스승이 답하여 가로되, "왜 그런 어리석은 질문을 하는가? 그 회사는 크기 때문에 큰 것이니라. 만일 그 회사가 하드웨어만 만들었다면 아무도 사지 않았을 것이다. 그 회사가 시스템의 유지보수만 했다면, 사람들은 그 회사를 하인처럼 다루었을 것이다. 하지만 그 회사는 이 모든 일을 하기 때문에 사람들은 그 회사를 신으로 여기는 것이다! 그들은 남들과 경쟁하려 들지 않기 때문에, 아무런 어려움 없이 세상을 정복하는 것이다."
8.2
어느날 스승이 제자의 곁을 지나치고 있었다. 스승은 제자가 휴대용 게임기에 열중해 있음을 알았다. "미안하지만 내가 좀 볼 수 있을까?" 스승이 물었다.
제자는 깜짝 놀라 게임기를 스승에게 건네주었다. "이 게임은 Easy, Medium, Hard등 세단계로 이루어져 있구나. 하지만 이런 게임기에는 모두 또 다른 레벨이 더 하나 존재하고 있다. 이 레벨에서는 게임기가 사람을 정복하려 들지 않으며, 사람도 게임기를 정복할 수 없다." 스승이 말했다.
"대단하십니다, 스승님." 제자가 탄성을 질렀다.
"어떻게 게임기에 또 다른 레벨이 있다는 사실을 알아내셨나이까?"
스승은 게임기를 땅에 떨어뜨리더니 발로 밟아버렸다. 그러자 갑자기 제자는 깨달음을 얻었다.
8.3
개인용 컴퓨터로 작업을 하는 프로그래머가 있었다. 어느날 그는 자신의 작업실에 놀러온 메인프레임 프로그래머에게 자랑하기 시작했다. "나를 좀 보라고. 나 혼자만 쓸 수 있는 운영체제와 하드디스크도 있어. 컴퓨터 용량을 다른 사람과 나누어 쓸 필요도 없지. 소프트웨어는 성능이 우수할 뿐 아니라 쓰기도 편해. 왜 메인프레임처럼 불편한 환경에서 일을 하는 거지?"
그러자 메인프레임 프로그래머는 자신의 시스템을 친구에게 설명하기 시작했다. "메인 프로그램은 컴퓨터실에서 명상하는 고대의 현인처럼 앉아 있다네. 그 디스크 드라이브는 마치 거대한 기계의 바다처럼 서로 연결되어 있지. 소프트웨어는 다이아몬드처럼 다양한 면을 지니고 있으며, 원시림처럼 서로 얽혀있네. 각각 독특한 프로그램들은 마치 거세게 흐르는 강물처럼 시스템으로 들어왔다 나가지. 그게 내가 메인프레임을 좋아하는 이유라네."
개인용 컴퓨터 프로그래머는 이 말을 듣고 할 말을 잃었다. 하지만 두 프로그래머는 죽을 때까지 친하게 지냈다.
8.4
갠지스 강으로 가던 하드웨어가 소프트웨어를 만났다. 소프트웨어 가로되, "너는 음이요 나는 양이로다. 우리가 함께 여행한다면 크게 유명해지고 많은 돈을 벌 수 있음에 틀림이 없도다."
그리하여 그들은 한쌍이 되어 세상을 정복할 야심을 품게 되었다.
그들은 찢어진 누더기를 입고 가시나무 지팡이를 집은 채 절름거리는 펌웨어를 만나게 되었다. 펌웨어가 그들에게 가로되,
"도는 음과 양을 넘어 존재하느니라. 도는 호수의 물처럼 조용하고 움직이지 않느니라. 도는 명성을 구치 않으며, 따라서 아무도 그 존재를 알지 못하느니라. 도는 부를 구치 않으니, 도는 그 자체로 완전하기 때문이니라. 도는 시간과 공간을 넘어 존재하느니라."
크게 부끄러워진 소프트웨어와 하드웨어는 집으로 돌아가고 말았다.
제 9 권 에필로그
마침내 도사 프로그래머 가라사대: "하산하거라."
원본 출처 : The Tao Of Programming
Labels:
Programming
,
The Tao Of Programming
,
TistoryOldPost
,
프로그래밍
,
프로그래밍의 도(道)
2010/03/10
한글판 안드로이드 입문서 3rd Edition 제본하다
그간 "알짜만 골라 배우는 안드로이드 프로그래밍"라는 책으로 틈틈히 공부를 하고 있다가 Kandroid 에서 공개한 "한글판 안드로이드 입문서 3rd Edition"을 접하고서는 학습서를 바꾸었다. "한글판 안드로이드 입문서 3rd Edition"가 "알짜만 골라 배우는 안드로이드 프로그래밍"보다 체계적으로 정리가 된 것 같으며 설명한 내용도 보다 충실해 보였다.
책으로 출판없이 PDF 로만 공개가 되어 휴대의 편의성은 있지만 왠지 모니터 화면으로 보는 책은 익숙치 않아서 제본을 하였다. 5백여 페이지에 이르는 방대한 양을 한 권의 책으로 만들기 위해 한 페이지에 두 화면을 인쇄하여 만들었는데
그런데로
그런대로 볼만 하였다.
Download : kandroid_book_3rd_edition.pdf(17.9MB)
<
Original Post : http://neodreamer-dev.tistory.com/378
SQLite 3.6.23 Released & Library (Static, Dynamic, VC, CB)
SQLite Release 3.6.23 On 2010 March 09 (3.6.23)
SQLite Library for C++ Builder (DLL 및 정적라이브러리)
Changes associated with this release include the following:
- Added the secure_delete pragma.
- Added the sqlite3_compileoption_used() and sqlite3_compileoption_get() interfaces as well as the compile_options pragma and the sqlite_compileoption_used() and sqlite_compileoption_get() SQL functions.
- Added the sqlite3_log() interface together with the SQLITE_CONFIG_LOG verb to sqlite3_config(). The ".log" command is added to the Command Line Interface.
- Improvements to FTS3.
- Improvements and bug-fixes in support for SQLITE_OMIT_FLOATING_POINT.
- The integrity_check pragma is enhanced to detect out-of-order rowids.
- The ".genfkey" operator has been removed from the Command Line Interface.
- Updates to the co-hosted Lemon LALR(1) parser generator. (These updates did not effect SQLite.)
- Various minor bug fixes and performance enhancements.
SQLite Library for C++ Builder (DLL 및 정적라이브러리)
SQLite Library for Visual C++ ( DLL 및 정적라이브러리 32/64bit)
Labels:
SQLite
,
SQLite for C++ Builder
,
SQLite for Visual C++
,
SQLite library
,
SQLite Static Library
,
TistoryOldPost
2010/03/09
SDK Tools, Revision 5 Released (March 2010)
Android SDK 가 설치된 경로에서 "SDK Setup.exe"를 실행 시키면 자동으로 업데이트 체크를 하고 업데이트를 할 수 있다.
SDK Tools, Revision 5 내용 보기
SDK Tools, Revision 5 (March 2010)
Dependencies:
SDK and AVD Manager:
Emulator:
Layoutopt:
Dependencies:
- If you are developing in Eclipse with ADT, note that SDK Tools r5 is designed for use with ADT 0.9.6 and later. After installing SDK Tools r5, we highly recommend updating your ADT Plugin to 0.9.6.
- For Mac OS platforms, OS X 10.4.x (Tiger) is no longer officially supported.
SDK and AVD Manager:
- Fixes SSL download for the standalone version of the SDK Updater.
- Fixes issue with 64-bit JVM on Windows.
- Adds support for platform samples components.
- Improves support for dependency between components.
- AVDs now sorted by API level.
- The AVD creation dialog now enforces a minimum SD card size of 9MB.
- Prevents deletion of running AVDs.
- Settings are now automatically saved, no need to click "Apply".
Emulator:
- Emulator now requires SD card to be 9MB or more.
Layoutopt:
- Fixes layoutopt.bat to execute correctly on Windows.
Android NDK, Revision 3 Released
Android 에서 C/C++ 기반의 개발을 지원하는 NDK 가 업데이트 되었다. 이번 업데이트에는 OpenGL ES 2.0 지원이 추가 되었다.
General notes:
- Adds OpenGL ES 2.0 native library support.
- Adds a sample application,hello-gl2, that illustrates the use of OpenGL ES 2.0 vertex and fragment shaders.
- The toolchain binaries have been refreshed for this release with GCC 4.4.0, which should generate slightly more compact and efficient machine code than the previous one (4.2.1). The NDK also still provides the 4.2.1 binaries, which you can optionally use to build your machine code.
Subscribe to:
Posts
(
Atom
)