<html>
<frameset rows="1*">
   <frame name="main" src="http://dev.abydos.kr/">
</frameset>
</html>
Inline Translator가 로드되지 못했습니다. 다시 시도하시려면 새로고침해주세요.

'개발도 하냐?' 카테고리의 다른 글

CakePHP Framework  (0) 2010.06.09
editplus setting  (0) 2010.06.06
SI프로젝트 산출물  (0) 2009.12.14
BitTorrent 의 정리  (0) 2009.12.12
SI개발자 발전단계  (0) 2009.12.06
1. 분석
   1.1. 현업요구사항정의서
        : 해당 프로젝트를 수행하는 가장 기본이 되며 고객의 needs을 담고 있는 문서입니다.
          이를 통해 다양한 스펙산정이 가능합니다. 이부분에서 요구ID를 도출합니다.
   1.2. 기능챠트
        : 현업요구사항을 근간으로 큰 카테고리를 만들어 한눈에 해당 프로젝트가 무슨 일을 하는
          것인지 보여줄 있습니다.
          * 이부분은 개발방법론에 따라 유스케이스다이어그램으로 대치할 수도 있을 것으로
            판단되어지고, 기능챠트와 같이 가도 무관하다는 판단입니다.
   1.3. 프로세스 정의서
        : 기능챠트를 기준으로 각각의 프로세스를 보여줍니다. 때에 따라 확대된 프로세스의
         표현도 가능합니다.
         * 개발방법론에 따라 시퀀스다이어그램을 넣어도 무방하다는 판단입니다.
   1.4. 인터페이스정의서
        : 상기 현업요구사항정의서,기능챠트,프로세스정의서를 근간으로하여 레가시 및 대외계
          시스템, 웹서비스 등 어떤식으로 인터페이스를 해야 한다는 정의를 담고 있습니다.
   1.5. 기타

2. 설계
   2.1. UI(화면)설계서
        : 웹App 혹은 CS App 든 간에 고객이 사용하고자 하는 화면단을 보여주는 문서입니다.
   2.2. ERD
        : 해당 업무의 DB를 생성하고 테이블관의 상관 관계를 표현하는 문서로 더이상 설명이
          필요없으리라 믿습니다.
   2.3. 테이블목록
        : 테이블정의서도 있지만, 테이블목록은 관리자가 한눈에 시스템을 구성하고 있는 DB
          테이블을 보여준다는 측면에서 필수라는 판단입니다.
   2.4. 테이블정의서
        : 테이블필드 value와 설명, 바이트수 등을 표기합니다.
   2.5. 프로그램 목록
        : 실직적으로 설계단계에 프로그램목록이 나오지 않지만 일단 설계 단계에 넣는 것이
          타당한 것 같습니다.
          * 개발방법론에 따라 클래스다이어그램, 컨포넌트명세서, 클래스정의서 등도 포함 될 수
            있을 것 같습니다.
   2.6. 개발표준 정의서
        : 변수명, brace, 클래스네임,파일명,규칙등 코딩관련 규칙을 정의함으로써 일선 담당자가
          소스코드를 확인해도 눈에 익숙할 수 있게 하기위한 문서입니다.
   2.7. 단위테스트 시나리오
        : 분석,설계의 기본적인 요건이 충적되면 이쯤하여 단위테스트시나리오가 나와야 할 것
          같습니다. 아마도 고객의 싸인이 필요한 부분일 것입니다.
   2.8. 통합테스트 시나리오
        : 설계단에서 하기는 많은 어려움이 있지만, 단위테스트를 근간으로 고객의 요청을 좀더
          보완하여 통합테스트시나리오를 작성합니다. 고객의 싸인은 필수입니다.
   2.9. 기타
 
3. 개발
   3.1. 소스코드(개발원시코드)
        : 말그대로 오류수정까지 끝난 원시코드 자체를 말합니다.
   3.2. 단위테스트 결과서
        : 단위테스트시나리오를 기준으로 테스트한 결과를 보여줍니다. 아마도 많은 문제점을
          안고 있고, 이 과정을 통해 고객의 요구사항도 많은 변동이 있는 시점입니다.
          * 변경요청서도 필요할 시점입니다.
   3.3. 결함/오류보고서
        : 단위테스트를 통해 알게된 에러의 원인과 수정에 대한 내용을 나타냅니다.
          이를 통해 오류코드정의서를 뽑아내고 보완합니다.
   3.4. 오류코드 정의서
        : 해당시스템에서 발생할 수 있는 오류들을 코드화하여 보여줍니다.
   3.5. 통합테스트 결과서
        : 단위테스트를 통해 보완된 내용들을 포함하고, 통합테스트시나리오의 보완을 통해
          실시된 통합테스트 결과를 보여줍니다. 개발을 완료했냐 안했냐의 잣대가 되는 문서로서
          고객의 싸인이 가장 필요한 부분입니다. 이부분에서 반려가 일어나면 위의과정을 반복해야
          합니다.
   3.6. 시스템 이행계획서
        : 통합테스트가 끝나면 Standby하고 있는 시스템에 소프트웨어,하드웨어 기타 등을 몇월,
          며칠, 몇시에 누구누구가 무엇을 가지고 옵져버는 누구이며 어떻게 이행을 할 것인지
          등을 표현합니다.
   3.7. 기타
 
4. 구현
   4.1. 시스템 이행결과서
        : 시스템 이행계획서를 통해 이행된 결과를 확인받는 문서입니다.
   4.2. 사용자매뉴얼
        : 사용자화면이 있을 경우 나오는 매뉴얼입니다.일반적인 조작법을 기록하며, 화면 등을
          예시합니다.
   4.3. 운영자매뉴얼
        : 시스템전반에 관한 모든 내용을 담고 있습니다. 분석,설계,개발 절차에서 나오는 문서를
          담고 있습니다.
   4.4. 교육(인수)명세서
        : 사용자매뉴얼 및 운영자매뉴얼을 중심으로 해당 담당자 및 사용자에게 시스템전반 및
          세부사항을 교육/인수한후 싸인받는 문서입니다.
   4.5. 개발산출물별 검사리스트
        : 예시된 산출물들이 이상없이 인수되었는지를 개별로 체크한후 고객의 싸인을 받는
          문서입니다.
   4.6. 프로젝트 완료보고서
        : 최종적으로 개발한 내용, 인도물, 하드웨어, 고객대표, 개발자대표싸인을 받음으로써
          명실상부한 프로젝트 완료보고서입니다.
   4.7. 기타
 

'개발도 하냐?' 카테고리의 다른 글

editplus setting  (0) 2010.06.06
hidden frame  (0) 2009.12.27
BitTorrent 의 정리  (0) 2009.12.12
SI개발자 발전단계  (0) 2009.12.06
무능력한 개발자  (0) 2009.12.06

출처 : http://www.torrentdown.com/bbs/board.php?bo_table=in_co_ta&wr_id=763&sca=&sfl=&stx=&spt=&page=9


비트토렌트란 무엇인가?

 

BitTorrent(비트토렌트)는 개인들간 피어투피어(peer-to-peer)로 연결하여 대용량 파일을 빠

른 속도로 공유하도록 만들어진 프로토콜이다. 트래커(tracker)라 불리는 중앙 서버가 사용자들간

의 파일 교환을 조정해 준다. 트래커는 사용자간의 연결만을 도와 줄 뿐이며 공유되는 파일의 내

용에 대한 정보는 취급하고 있지 않기 때문에 비교적 적은 대역폭으로도 많은 수의 사용자간의 파

일공유를 가능하게 해준다.
 
토렌트의 핵심 철학은 사용자들이 파일을 업로드 해 주어야만 다운로드 할 수 있다는 것이다.

즉 자신의 다운로드 속도는 자신의 업로드 속도에 비례한다. (이는 당나귀(eDonkey)를 이용해본

사람들은 잘 이해할 것이다.) 이렇게 함으로써 네트워크 대역폭을 가장 효율적으로 이용할 수 있

으며 특정 파일을 다운하고자하는 사람들의 숫자가 늘면 늘수록 토렌트를 통한 파일 공유의 효율

은 더 증가하게 되는 것이다.

 

 

 

비트토렌트는 어떻게 작동하는가?

 

비트토렌트를 이용해서 파일을 공유하려면 3가지가 필요하다.

(1) 비트토렌트 클라이언트, 즉 다운로드 프로그램,

(2) 공유 파일의 정보를 내장하고 있는 토렌트 파일 (확장자가 .torrent로 끝나는 파일)

(3) 클라이언트에게 파일의 소스의 위치를 추적(track)해 주고, 각 클라이언트간 파일의 업로드와
다운로드를 조정해 주는 트래커(tracker). 트래커는 당나귀 네트워크에서 중앙 서버의 역할을 해

준다.

 

비트토렌트 클라이언트는 당나귀 클라이언트와 달리 독자적으로 오픈되지 않는다.

즉, torrent 파일을 클릭하지 않는 이상 비트토렌트 클라이언트는 항상 비활성 상태로 있게 된다.


http://www.suprnova.org

 같은 토렌트 정보 사이트에 올라와 있는 토렌트 파일을 클릭하거

나 이미 자신의 컴퓨터에 다운로드 받아놓은 토렌트 파일을 클릭하면 비로소 비트토렌트 클라이

언트는 활성화되어 다운로드와 업로드 기능을 수행한다. 즉, 토렌트파일이 없는 경우는 작동하지

않는 것이다. 혹 시작메뉴에 있는 비트토렌트 클라이언트를 클릭하면 클라이언트는 토렌트 파일

을 열것을 요구한다. 토렌트 파일이 없으면 비트토렌트 클라이언트는 자동으로 다시 닫히게 된다.

 

트래커는 동일한 토렌트 파일(즉, 동일한 hash code를 가지고 있는 토렌트 파일)을 오픈한 사

람들끼리만 연결시켜 준다. 만일 내가 2개의 서로 다른 트래커에 등록된 2개의 토렌트 파일을 오

픈시켜 2가지 다른 파일을 동시에 다운로드 받고 있다고 한다면 (예를들

어,Lord.of.the.Rings.3.Screener.3CD.torrent와 Kill.Bill.Screener.2CD.torrent를 이용하여 두 영

화를 동시에 다운하는 경우),

내 컴퓨터에는 두개의 비트토렌트 클라이언트가 오픈 되어 서로 다른

트래커와 연결 되어 파일을 다운로드/업로드하고 있을 것이다. 이점이 비트토렌트가 당나귀 네트

워크와 가장 크게 다른점이다.

즉, 당나귀 네트워크는 서버 중심의 파일공유 시스템인데 반해, 비트토렌트 네트워크는 트래커가

중심이 아니라, 공유되는 파일을 중심으로 네트워크가 형성되는 것이다.

즉, 당나귀의 경우는 서버접속 --> 서버에게 다운받을 파일의 소스의 위치와 숫자 문의 --> 서버

가 소스파악/다운로드/업로드 조정의 순서로 일처리를 한다면, 비트토렌트의 경우는 토

렌트 파일 오픈 --> 지정된 트래커 접속 --> 트래커의 다운로드/업로드 조정의 순서로 일이 처리

되는 것이다.
 
따라서 비트토렌트의 경우는 토렌트 파일을 매개로 공유되는 특정 파일에 관심이 있

는 사람들끼리만 연결시켜 줌으로써 트래커가 소스를 찾기 위해 시간을 허비하지 않아도 되는 것

이다. 이런 이유로 당나귀 네트워크와 비교한다면, 당나귀는 중앙 네트워크 방식인 반면에, 비트

토렌트는 분산 네트워크 방식이라고 불리워지는 것이다.

 

비트토렌트의 분산 네트워크 방식은 당나귀에 비해서 빠른 연결과 다운로드/업로드 조정을 함

으로써 파일 공유 속도가 빠른 반면에, 네트워크의 안정성이 매우 약하다. 즉, 공유 네트워크가 특

정 파일에 관해 관심을 가진 사람들 위주로 분산적으로 형성되기때문에, 시간이 지남에 따라 파일
공유자의 숫자가 줄어 들면, 그만큼 특정 파일의 공유 네트워크의 폭이 줄어드는 것이다.

즉, 비트토렌트 네트워크는 생성되고 소멸되는 주기가 굉장히 짧은 일종의 게릴라식 네트워크라

는 것이다.

이 때문에 비트토렌트를 이용하여 오래전에 공유되었던 파일을 다운로드하기란 정말 어렵다.

최초로 공유된지 한달정도 지난 파일의 경우, 인기 있는 파일이어서 계속 공유자들이 릴레이 되지
않는 이상, 그 소스를 찾기란 당나귀처럼 쉽지 않다.

그대신 많은 사람들이 동시에 관심을 가지고 있는 최신의 파일인 경우는 동시에 많은 사람들이 공

유하기 때문에 쉽고 빠르게 다운로드 할 수 있다. (하지만 최근에는 비토렌트 서치엔진


http://www.n4p.com 같은 것이 등장하고, 또 트래커의 안정성이 예전보다 향상되고 있기 때

문에, 파일 공유주기가 예전에 비해 점점 늘어나고 있는 추세이다. 따라서 비트토렌트 네트워크를
통해서 구할 수 있는 파일의 숫자가 엄청 늘어나고 있음.)

 

 

 

비트토렌트가 당나귀와 다른 점은 무엇인가?

 

비트토렌트는 당나귀 네트워크와 같이 파일을 조각내어 공유한다는 면에서는 파일 공유 방식

이 동일하다. 하지만 동일한 조건이라면 (즉, 소스를 가지고 있는 사람의 수와 인터넷 회선의 속

도가 같은 경우) 당나귀 네트워크보다 다운로드 속도가 훨씬 더 빠르다.

왜냐하면, (1) 파일의 소스를 추적(track)하여 원하는 사람에게 연결시켜 주는 당나귀 네트워크의
중앙 서버 역할을 하는 트래커(tracker)는 파일의 내용에 관한 정보를 포함하고 있지 않기 때문에,
파일 공유 조정(coordination)에 필요한 정보량이 당나귀네트워크 방식보다 훨씬 적어서 다운로

드하려는 사람과 업로드 하는 사람간의 연결 속도가 더 빠르기 때문이다.

(2) 파일 찾기 기능이 없는 것이 단점이기는 하지만 이것 또한 다운로드 속도가 당나귀에 비해 빠

른 이유 중에 하나이다. 당나귀와는 달리, 비트토렌트는 이미 설명했듯이 분산 네트워크 방식을

취한다. 즉 트래커는 오직 하나의 공유 단위(단일 파일일 수도 있고 여러개의 파일을 포함한 디렉

토리일 수도 있음)에 관심이 있는 사람들끼리 연결을 시켜준다.

(3) 트래커가 파일조각 (file parts)을 연결된 클라이언트들에 배분할 때 따른 클라이언트가 받지

않은 조각들을 우선해서 배분해 준다. 즉, 각 클라이언트들에게 서로 다른 조각들을 우선해서 배

분해주므로, 각 클라이언트가 같은 조각을 받기 위해 대기하는 시간을 최소화 해주고, 또한 각 클

라이언트간에 서로 다른 파일 조각들을 교환하게 함으로써 최단 시간내에 파일 공유를 극대화시

켜준다.

(4) 또한 비트토렌트는 당나귀에 비해 리소스를 훨씬 적게 사용하기 때문에, 비트토렌트 사용 중

컴퓨터가 느려진다거나 하는 일이 없으므로 다른 프로그램을 사용하는데에 큰 지장이 없다.

 

그 대신 비트토렌트의 경우는 당나귀와 같은 검색 기능이 없다. 당나귀의 경우는 사용자가 다

운로드 받은 파일을 공유 폴더에 넣어 두기만 하면 자신은 다른 파일을 다운 받더라도 그것을 원

하는 사람이 서버를 통해서 계속해서 그 파일을 다운 받을 수 있지만 (즉, 업로드/다운로드 파일

이 다를 수 있지만), 비트 토렌트의 경우는 소스를 가진 사람이 토렌트 파일을 오픈시켜 놓지 않

는 이상 (이를 seeding이라 한다. 즉, 완전체를 가진 사람이 업로드만 해주는 경우, 이를 시딩이

라고 한다.) 파일의 소스를 구할 수는 없는 것이다. (제작자 Bram Cohen의 설명에 의하면seeder

(완전체를 가진 사람)가 없더라도 각 클라이언트들이 가진 서로 다른 파일 조각들의 합이 100 퍼

센트이면 seeder없이도 파일을 100퍼센트 받을수 있다고 함.)

 

파일 검색 기능이 없는 것이 비트토렌트의 불편한 점이기는 하지만, 무수히 많은 공유 사이트

를 통해서 많은 사람들이 관심을 갖고 있는 최신 파일(영화/게임/애니/유틸 등등)을 구하기란 어

렵지 않다.

 

당나귀를 어느 정도 사용한 사람이라면 몇시간, 아니 몇일동안 다운받은 파일이 가짜(페이크)

로 드러나, 허탈해서 화가난 적이 한번쯤은 다 있을 것이다. 하지만, 토렌트 네트워크에서는 가짜

파일이 거의 없다.

 

당나귀의 경우는 다운로드하는 파일과 업로드 하는 파일이 다를 수 있다. 하지만 비트토렌트

의 경우는 2개 이상의 토렌트를 오픈시키지 않는 이상, 다운로드와 업로드하는 파일이 다를 수 없

다. 즉, 특정 토렌트 파일을 오픈시키면 자신이 그 토렌트에 담겨있는 파일을 다운로드하고 동시

에 업로드하는 것이다.

 

당나귀의 경우 공유 단위가 단일 파일인 반면, 비트토렌트는 공유 단위가 파일뿐만 아니라 복

수의 파일을 포함한 디렉토리도 포함된다. 즉, 당나귀 네트워크에서는 복수의 파일을 공유할 경우
압축을 하거나 시디 이미지로 만들어서 1개의 파일로 만들어야만 공유가 가능하지만, 비트토렌트

에서는 자신의 하드에 있는 디렉토리 자체를 하나의 토렌트 파일에 담아서 공유가 가능하다. 물론
별도로 토렌트 파일을 만들어야 하는 번거로움이 있기는 하지만, 공유를 위해 여러개의 파일을 단

일 파일로 압축을 하거나 하나의 시디 이미지로 만들 필요가 없다는 것이다.

 

 

 

그럼 언제 어떤 용도로 비트토렌트를 사용하는것이 좋은가?

 

위에서 살펴보았듯이, 토렌트는 당나귀에 비해 빠른 다운속도라는 장점이 있는 반면, 네트워

크의 안정성, 파일 검색 기능, 오래된 파일을 구하기 힘든점 등의 단점이 있다. 그리고 아직 한국

에서는 쓰는 사람이 많지 않기 때문에 한국 관련 파일도 많이 공유되고 있지 않다. 따라서 현재로

서는 최근에 외국에서 새로 나온 영화/게임/음악/유틸/등등을 다운 받는 경우에 사용하면 당나귀

보다 훨씬 빠른속도로 다운 받을 수 있으리라고 생각된다. 당연한 말이겠지만, 한국 사용자가 늘

면 늘수록 한국 관련 파일들도 비트토렌트를 통해서 구할 수 있게 되리라고 본다.


용어정리

업/다운로드 받을때 나오는 메뉴에 대해 간략하게 설명 드리겠습니다
 
이름    번    크기    완료  상태    배포  피어  다운속도  예상시간  업로드    비율  가용
 
 
 
이중에 이름/번/크기/완료/상태 까지는 누구나 다 아실테고
배포 부터 설명 드리겠습니다
 
* 배포(seeds) -    X (Y)
 
여기서 X 는 자신에게 달라붙은 완전체 값입니다
즉, 100% 인  사람이 몇명이 나에게 화일을 보내주고 있냐 입니다
 
Y 는 현재 온라인 상의 총 완전체 갯수입니다
Y 가 0 이면 완전체가 현재 없다는 것이죠
 
  만약, 자신이 직공으로 화일을 최초 공유 하는 사람이거나 다운이 완료되어 배포자가 되었다면
X 값은 항상 0 입니다
왜냐하면 자신에게 화일을 받아 완료..즉, 100%가 되는순간 그사람은 배포자가 되어
(Y 값이 1증가) 나에게서 떨어져 나가게 되기 때문입니다... 100%를 가지고 있는 사람끼린
서로 화일을 주고 받을 일이 없기때문에... 붙을 필요가 없는것이죠
또... 만약... 어떤사람이 최초 공유자에게서 화일을 받아
다운로드 완료가 되었는데... 토렌트 상의 Y값이 1 증가하지 않는다면
그사람은 다운만 받고 공유를 꺼버린게 되는것이죠
 
직공을 해서 최초 공유를 하다보면 X값은 항상 0이고 Y값이 시간이 흐름에 따라 점점 증가하는것을 보게되고
다운받는 입장이라면... 접속하여 다운되는 순간 X값과 Y값은 일정한 수치를 이미 가지고 있는것을 볼수 있습니다
 
*피어(peers) - A (B)
 
A는 자신에게 붙은 모든 사람을 뜻합니다. 
내게서 다운을 받아가건... 내게 화일소스를 보내주건, 완전체이건.. 받고있는 도중이건....
나와 관계된 사람은 모두 A숫자에 포함됩니다
 
B는 완료된 사람(완전체)을 제외한 이 화일에 관계된 모든 사람을 뜻합니다
나와 관계없고... 서로 지들 끼리 주고받아도... 나와 같은 화일을 주고 받는것이라면
이 숫자에 포함 됩니다
 
*업로드
 
자신이 토랜트를 통해서 여러사람에게 보내준
화일에 대한 총 용량 입니다
다시말해 업로드 양이죠
 
*비율(ratio)
 
화일의 총 용량과... 자신이 업로드한 양에 대한 비율입니다
곱하기 100을 하면 % 값이 나온다고 생각 하심 됩니다
 
*가용(avail)
 자신과 위에 얘기한 A,B들이 현재 가지고있는 소스들을 주고받으면 몇개의
완전체를 만들수 있냐는 소리입니다
 
만약, 자신이 화일을 최초 공유하는 소스라면
공유를 시작하는순간 가용은 1부터 시작합니다
자신이 완전체 이기 때문에 백분율로 따지자면 곱하기 100을 해서
100프로 부터 시작하는것이죠
 
자신이 업로드를 하다보면 배포값 즉 X,Y가 모두 0 일경우라도(완전체가 나 외엔 존재하지 않을경우)
 가용이 2.000 (200%) 가 넘어가 버리면
내가 공유를 끊더라도... 자기들끼리 서로 주고 받아서 완전체를 만들수 있다는 뜻입니다
그러니... 공유를 하다가 2가 넘어가 버리면 공유를 끊고 나와버려도... 계속 완전체가 공유 된단 소립니다...
즉.. 최초 공유를 할때 Y가 1이상이 되거나 가용이 2 이상이 되면 공유를 끊어도 된다는 것이죠
물론 최초 다운로드 완료자가 공유를 끊고 나가지 않는다는 전제하에서말이죠
 
또, 다운자 입장에서...자기가 다운을 받으러 들어갔는데... 완전체가 한명도 없이...
가용이 1이 넘는다면
배포자가 없어도 화일을 끝까지 다 받을수 있다는 얘기입니다
반대로, 배포자(Y)도 0 이고....가용이...0.899  이렇게 되있다면
이화일은 89프로에 까지밖에 받을수 없는 화일입니다
물론 받는 도중..... 완전체가 나타나 마저 공유가 된다면
끝까지 받을수 있겠죠

'개발도 하냐?' 카테고리의 다른 글

hidden frame  (0) 2009.12.27
SI프로젝트 산출물  (0) 2009.12.14
SI개발자 발전단계  (0) 2009.12.06
무능력한 개발자  (0) 2009.12.06
자바개발시 점검사항  (0) 2009.12.06
  1. 뉴비 : 막 졸업했거나 학원수료. "취업좀.."

    • "이바닥은 학력보다는 실력이다" 라는 이상한 믿음. "어떤게 전망이 좋나요?"가 늘 궁금하다.
    • 자바는 Copy & Pastes 하니깐 쉽다. 자바스크립트는 어렵다.
  2. 개초보 : 1년 정도 경험. 템플릿 주면 대충 알아서 만드는 단계. 프레임웍을 이해하고 다루는데는 미숙.

    • 중수랑 하는게 비슷한데 연봉은 적다고 불만임. 프리랜서 하고싶음. 도메인 업무보다는 코딩테크닉을 하고싶어함.
    • 내 꿈은 아키텍쳐. 현재 진로방향은 막연히 DBA.
  3. 초수 : 프레임웍에 대한 의문과 회의가 들기 시작함. 간단한걸 왜 복잡하게 돌려 하는지 모르겠음. 디자인 패턴은 다 개소리임.

    • "이바닥 별거 없는데.. 거품이 너무 많다." , "웹은 SQL이 절반 이상이다." 현재 회사에 불만가득.
    • 고만고만한데서 실력있다는 소리를 자주 듣는다. (이때는 잘 모른다. 이게 작업용 멘트라는것을..)
    • SQL에는 자신있는 단계. 어떤 복잡한 SQL도 업무만 안다면 작성 및 튜닝 가능.
  4. 중수1단계 : 고수/또는 체계화된 플젝의 도움을 받아 프레임웍의 진가를 알게됨. 오픈소스를 효율적으로 사용. 

    • 자신감이 넘침. 신기술 사용에 적극적. 프레임웍에 서툴거나 자신과 생각/사상이 다르면 까기 시작함. 적극적인 블로깅/자기PR
    • 현재의 프로세스에 문제가 있다고 판단 => 고칠 수 있고 고치려는 의지가 있음.
    • 익명 클래스와 command패턴, 클로저 등이 자연스러워지고 새로운 프레임웍이 나와도 금방 적응 가능.
  5. 중수2단계 : 나는 팀의 리더.  아무리 잘나봐야 똑같은 대우라는걸 알게됨. 의욕상실. 기존 개발자들의 반발. 현실은 시궁창.

    • 드림팀을 꾸리고 싶음. PM을 해야할거같은 상부의 압박. 결국 사람이 가장 어렵다는걸 깨닳음.
    • 현재의 프로세스에 문제가 있다고 판단한지 오래지만 어쩔 수 없다고 생각. "기술 보다는 영어좀 해둘껄" 하는 생각이 간절함. 책 내고 싶음.
    • 코딩과 프로세스를 도와주는 각종 Tool에 관해 능숙함. 중/소규모 실제 프로젝트에 적용 가능한 아키텍쳐 구성 가능 및 가능한 지위
  6. 중수3단계 : 프로젝트 내의 기술적 우위로 팀/회사에서의 확고한 지위.

    • 솔로플레이에 능함. 기술의 도입으로 내가 가지는 득실을 중요히 생각하게 됨. 손해보는 짓은 안함.
    • ORM에 익숙하고 거기에 따른 설계 가능. 그루비나 루비 같은 동적 객체지향 언어로 매니악한 코드 만드는것을 즐김.
  7. 고수 : 프리랜서로 전환. 생산성에 치중함. 유지보스는 안드로메다.

    • 너무 잘하지도, 못하지도 않는 중용을 발휘함. 별로 하는거 없어보여도 절대로 뺄수 없는 그런 존재.
    • "만 라인의 코드를 작성하는 이와, 일의 공허함을 깨닫고 코딩 없이 성과를 얻는 이중에서 누가 보다 유닉스 같은가?" by 에릭 레이몬드.
    • 플젝을 떠돌며 모아놓은 jar와 모듈들이 가득함. 손수 짜는거 보다 import하는게 익숙함. 오픈소스를 수정/확장해서 사용하는데 능숙.
  8. 신 : 다 무의미 하다는걸 깨달음. 따르는 자가 있지만 정치를 하기 싫어서 물좋은 SM자리 하나 얻어서 남은 여생을 운둔하며 보냄.

    • "마음이 가는데로 코딩을 했는데도 리팩토링할 곳이 없더라"

http://erwins.springnote.com/pages/3759175

'개발도 하냐?' 카테고리의 다른 글

SI프로젝트 산출물  (0) 2009.12.14
BitTorrent 의 정리  (0) 2009.12.12
무능력한 개발자  (0) 2009.12.06
자바개발시 점검사항  (0) 2009.12.06
한국에서의 개발방법론이란..  (0) 2009.12.06
  1. 출처 - okJsp
  2. 첫째는 '열심히 하지만 결과를 쓸 수 었을 때'입니다. 2~3주 하루 12시간씩 작업한 결과물이 아무리 좋게 보아도 변수명 바꾼 것에 불과한 듯이 보이는 상황을 대하게 되면 화를 내야하는지 그냥 포기하고 혼자 끙끙거리며 모르게 다시 만들어야 하는지 간간 깊은 고민에 빠집니다. 불행하게도 저는 마음 크기가 종지만해 화를 내는 쪽이긴 합니다만, 그나마 화를 내어 놓고도 일정 때문에 제가 손을 보곤 합니다.
  3. 둘째는 '자부심은 강하지만 결과과 이상할 때'입니다. 스킬에 대한 중요성, 관련 경험, 학습 내용 들에 대한 자긍심이 굉장한데 비하여, 내어놓은 결과물은 예를들면 1줄짜리 쿼리를 10줄로 만들어둔데다 원하는 결과도 도출되지 않는 상황인 경우입니다. 함부로 의사를 전하면 크게 상심할까봐 참 대응하기 곤란하더군요.
  4. 셋째는 '하고 싶은 것만 한다'입니다. 박식한데다 경험도 풍부하지만, 하고 싶은 파트가 아니면 절대 하지 않으려는 경우로 몇명만이 단촐하게 일할 때는 여간 고로운게 아닙니다. 명확히 하자면 성격 또는 게으름의 문제이겠으나, 결과적으로는 능력을 보여주지를 못하니...
  5. 넷째는 '논리 결여'입니다. 재미있는 것은 이런 부류의 이들이 상대적으로 사회성도 뛰어나고 자기 자신에 대한 투자에 게으르지 않다는 것입니다. 충분한 학력과 현장 경험에도 불구하고 C & P에만 능숙해져 있는 것을 보면 차라리 다른 쪽으로 방향을 돌려보는 것도 좋지 않은지 권해주고 싶습니다.
  6. 다섯째는 '레퍼런스를 찾기 능력 결여'입니다. 농담반 진담반으로 '내 실력의 절반은 네이버와 구글이 키웠다'라고 말해도 허하게 들리지 않을 정도로 레퍼런스로 넘쳐나는 요즘임에도 불구하고 막히면 막히는 족족 포기해버리고 다른 이들의 도움을 찾는 경우로, 심하게 표현해 '귀찮다'라는 생각이 자꾸 떠오르게 됩니다.
  7. 여섯번째로 '할 수 없다고 말하기 싫어하는 자존심'입니다. 무능함과 '할수 없음'은 다르다고 생각하고, 대부분의 이들이 순수하게 현황을 이야기하면 함께 고민해보고 격려함에도 불구하고, 아무리 급박한 상황이라도 '못한다'라는 말을 꺼내지 않은체 폭발 직전까지 끌고가는 경우를 대하곤 합니다.
  8. 일곱번째로 '내일만 커보인다' 부류입니다. 남의 일은 쉬워보인다던가 하는 1차원적인 것이라면 차라리 귀여운데, 프로덕트 전체를 보지 않으려고 하며 오만해하는 경우에는 답이 없습니다. 특히나 아집이 강한 이들이 이러하다면... 전 '실력으로 눌러야한다'라는 생각으로(제가 실력이 있다는 말은 아닙니다. 허허~) 멀쩡한 척 하면서 밤세워 작업한 뒤 보여주며 '쉽던데~'라고 말하는 부류이지만, 결과적으로 이런 이들과 충돌하게 되면 나중에 다시 보지 않게 될 확률이 현재까지는 100% 더군요.
  9. 마지막으로... 위의 일부 또는 전부를 갖춘데다 '시간 투자'로 모든 것을 판단하려는 부류입니다. 결과를 도출하였다는 사실이 아닌 아주 간단히 수치화할 수 있는 시간을 얼마나 소요했는가로 판단하는 부류이지요. 이런이들이 아래 사람이라면 '나만 일한다'는 불만을 들어야하고, 윗사람이라면 '너는 왜 노냐?'라는 지적을 감수해야하며, 중간 관리자라면 '잘 가르쳐봐'라는 업무와는 전혀 무관한 교관 노릇을 감수 해야합니다.

'개발도 하냐?' 카테고리의 다른 글

BitTorrent 의 정리  (0) 2009.12.12
SI개발자 발전단계  (0) 2009.12.06
자바개발시 점검사항  (0) 2009.12.06
한국에서의 개발방법론이란..  (0) 2009.12.06
XP 개발방법론  (0) 2009.12.06
위험도 분류 설명 점수
심각 서버 소스 객체지향 인터페이스 설계 실패로 인한 각개전투 묻지마 코드.  
1. 도메인 모델을 map으로 사용.  
2. 계층, 모듈화 무시. 인터페이스 설계 없음.  
3. 비슷한 일을 하는 class가 중복으로 존재. class가 1000라인을 넘어감.  
4. 비즈니스로직의 일부 혹은 전체가 SQL or PL/SQL에 탑재  
멀티 스래드 멀티 스래드 객체의 자원 공유(static,singleton) 오류 위험  
일관된 예외 처리 1. 공통 예외처리를 위한 서버(java) & 클라이언트(javascript or actionscript) 로직이 없음.  
2. 예외 발생에도 불구하고 '성공적으로 실행되었습니다'라는 메세지가 발생.  
DB 무결성 1. FK가 잡혀있지 않음. 어플리케이션에서 무결성 관리가 되지 않음. 채번(PK)에 오류.  
2. 트랜잭션 관리가 되지 않음.  
형상관리 형상관리의 부재 : 형상관리 위한 CVS or SVN등을 사용하지 않는다.  
경고 프레임웍 도입 자체 프레임워크를 개발해서 도입 (자바One에서 나온 실패한 프로젝트의 대표적인 원인. 유지보수가 힘듬)  
MVC프레임워크를 사용하지 않음. (즉 MODEL-1 기반의 project.)  
Hibernate등의 ORM을 사용하지 않음.  
선언적 트랜잭션 또는 예외처리(레이어링 or AOP)가 없거나 도입했는데도 사용하지 않음.  
불필요한 코드 소스코드에 불필요한 try-catch문이나 트랜잭션 관련 API가 포함됨,  
단위테스트 자동화된 테스트 케이스(JUnit등)가 부족하거나 없음.  
성능 대용량 요청 등에 관해 성능을 무시한 && 병목구간을 발생시키는 코딩. SQL튜닝이 안되어있음.  
보안 기본적인 보안관리가 안되어 있음 (SQL공격, 인증우회 등등).  
클라이언트 소스 어설픈 Ajax 사용으로 인한 동기화 / 비동기화 처리 실패 인한 산발적 오류 발생  
비지니스로직의 일부가 클라이언트 스크립트로 코딩되어있음.  
DB설계미스 DB설계 미스 & 정규화 실패로 인한 잦은 join과 대량의 중복 & null컬럼 발생  
개발롼경 Ant나 Maven을 사용하지 않음.  
DB중심의 프로그래밍 업무 로직이 SQL 또는 SP에 들어가 있음. DB특유의 프로그램(pakage/function)이 자주 사용됨.  
권고 서버 코드 일반적인 표준/오픈소스 패키지를 사용하지 않고 자체 개발/코딩  
ex) Concurrent패키지의 Executor를 사용하지 않고 new Thread(runnable).start() 등의 명시적인 스래드 생성 코드를 사용.  
ex) Apache의 Util을 사용하지 않고 자체 개발한 StringUtil을 사용  
UI중심의 프로그래밍 클라이언트 스크립트의 비중이 과도하게 많음. 업무로직이 스크립트에 탑재되어 있음.  
개발 표준 네이밍 룰이 없거나 혹은 지켜지지 않음.  
Logging정책이 없거나 지켜지지 않음. (소스코드에 System.out.print... 등의 코드가 출현.)  
DB중심의 프로그래밍 PL/SQL등의 SP가 사용된적이 있음.  
성능 인덱싱 miss 및 SQL튜닝 miss로 인한 속도 저하. 어설픈/잘못된 페이징 처리.  
주석 난잡한 주석 or 필요한곳에 없는 주석 or 틀린주석(갱신이 안된 주석)  
보안 잘못된 공인인증서 사용. (클라이언트에만 인증서 로직이 들어감.)  
의존관계 정의 실패 lib에 많은 jar가 있지만 어디에 사용되는지 확인 불가.  
jar가 각기 다른 버전으로 중복해서 존재.  
서버 코드 일반적인 표준/오픈소스 패키지를 사용하지 않고 자체 개발/코딩  
ex) Concurrent패키지의 Executor를 사용하지 않고 new Thread(runnable).start() 등의 명시적인 스래드 생성 코드를 사용.  
클라이언트 소스 IE 위주의 코딩 (비표준, 마이플랫폼 등의 국산 X-internet, table레이아웃 등)  
JavaScript와 css가 html상에 섞여있음  
개발환경 지속적인 통함툴 또는 이슈 트래커를 사용하지 않음.  
FTP등을 사용하여 문서/자료를 공유함( 즉 온라인 위키 문서 공유를 하지 않음.)  

'개발도 하냐?' 카테고리의 다른 글

SI개발자 발전단계  (0) 2009.12.06
무능력한 개발자  (0) 2009.12.06
한국에서의 개발방법론이란..  (0) 2009.12.06
XP 개발방법론  (0) 2009.12.06
JAVA Application 한글깨짐 해결  (0) 2009.12.03
방법론에 대한 견해가 있어서 펌

  1. 출처 : http://erwins.springnote.com/pages/2880322
  2. 처음 책 보고 썼을땐 멋있어 보였는데 나중에 보니까 이게 웬 헛소리.. ㅠㅠ

  3. 개요

    1. 소프트웨어 공학에 무수한 개발 방법론이 있고 다양한 산출물이 있지만 이미 실제 개발자에게는 무시된 지 오래이다. 개발자에게 방법론을 거론해봐야 무시당하기 쉽다.
    2. 비단 한국에 국한된 일뿐만이 아니다.  소프트웨어로 가장 유명한 기업인 MS에서조차 예외는 아니다. 거대한 산출물을 쌓아서 창고에 처박아버리고 다시는 보지 않는 사태는 전 세계 에서 일어나고 있다.
    3. 혹시 당신의 회사가 "비주얼 어쩌구 아키텍트" 라고 불리는 거창한 소프트웨어 방법론 환경을 구상 한다 던지 UML과 XP사이에서 갈팡질팡 하고 있다면 이미 문제에 봉착해 있을 확률이 높다.
    4. 유명한 스타 개발자 조엘은 자신의 책에서 화성인 아키텍트를 이야기 한다. 화성인 아키텍트가 화성에서나 가능한 플랜을 지구로 가져오지 않는 것이 개발자를 돕는 것이다.
    5. 이 바닥에서 4년이면 자신이 알고 있는 지식의 50%를 갱신해야 한다고 한다. 이로 인해 소프트웨어 엔지니어링과 현실간의 갭은 점점 더 멀어져 다른 나라 이야기 인 듯 들린다.
    6. 왜 이런 현상이 일어나는 것일까?
  4. 기초를 알자 : 2가지 개발 방법론의 종류

    1. 개발 방법론

      1. 방법론 자체가 이미 너무나 오래된 생각이다. 개발자들 사이에서 방법론은 조롱거리가 된지 오래이며 심지어 방법론 무용론을 주장하는 사람들도 있다.

      2. 특히나 SI시장의 대부분을 차지하는 웹 개발은 그 특수성 때문에 설계 자체가 필요 없다는 주장도 많다.

      3. 대부분의 개발 방법론은 박사 학위, 또는 논문을 위해 경험 없는 대학원생이나 교수에 의해서 만들어 진다.

      4. 방법론 공학 연구 커뮤니티에서 조사한 결과 방밥론을 그대로 실무에 적용하는 실무자는 거의 없음이 밝혀졌다. (By 소프트웨어 공학의 사실과 오해:인사이트).  그리고 지금도 방법론은 만들어지고  있다.

    2. 개발 방법론을 분류하는 것은 개인의 판단마다 다르다. 공신력을 위해서 가장 권위 있는 ant(By apache재단) committer의 말을 인용한다.

      ant자체가 XP와 밀접한 관계가 있는지라 약간의 편향된 의견일수도 있다.  XP와 RUP는 가장 널리 알려진 방법론으로 그 외의 방법론들은 이것의 변형이라 할 수 있다.

      또한 이 둘은 구체적인 방법과 도구를 제시한다. 따라서 이들 두 가지 방법론을 알아본다.

      1. Rational Unified Process(RUP)

        1. Rational Software Corporation에서 만들었다. Rational Rose의 제작사이다. (현재는 IBM에 합병)
        2. UP가 방법론이며 RUP는 그것을 상품화한 Rational사의 상품이다. 이것으로 1998년도에 난립해있던 컨설팅 회사들를 평정할 수 있었다.
        3. 핵심 키워드는 “설계”이다. 반복적이며 관점적(Perspective)이고 아키텍쳐 중심적인 프로세스 모델로서,
          이 모델에서 소스코드란 프로젝트의 이터레이션(iteration)을 통해 생성되는 산툴물의 하나에 불과하다.
        4. 아이러니 하게도 원 설계자는 그래디 부치는 패턴 도입에도 공한을 한 객체지향 공학의 권위자 이다. 그는 GOF의 디자인 패턴의 서문을 썼으며 애자일 연합체의 설립 멤버이기도 하다.
          (이는 RUP와는 대조적인 성격의 것으로 RUP의 근본적인 문제점을 공격했다.)
        5. 설계 기간을 길게 잡은 후 개발에 들어간다. 모토는 뼈대를 잡은 후 살을 붙이자는 것이다. 개념화->구체화->구축->전이 등의 이터레이션 반복으로 설계가 완료되면 신속한 개발이 가능하나 추후 수정 사항 발생시 대처가 곤란하다. 개발 완료시까지 배치기 지연된다.
        6. 핵심은 UML 등의 문서이다. 쉽 고, 표준화되고 언어에 상관없이 모든 개발 프로세스를 정형화할 수 있는 UML은 각 개발자와 사용자, 고객과의 통신 수단이 되며 중요한 산출물 중의 하나이다. UML을 이용해 개발을 모르는 관리자도 검수가 가능하며 개발자들 간의 의견 소통을 돕고 오해를 미연에 방지한다.
        7. 테일러링을 통해 프로젝트에 적합한 방법론을 구현할 수 있다. XP방법론도 이 입장에서 보면 RUP를 소규모 프로젝트에 적합하게 리테일러링 한 것에 불과하다.
        8. 소스코드는 이러한 UML을 특정 형태(자바, C#등)에 맞추어 서술한 것에 불과하다. UML은 객체 지향을 표현하는 표준 언어이기 때문에 이을 이용해 어느 언어로든지 단기간에 전이가 가능하다. 이상적이지 않은가? 더 이상 말 안듣는 프로그래머는 필요 없다. 코더와 설계자만 있으면 된다!
        9. XP는 산출믈을 만들기 싫어하는 개발자들의 핑계에 불과하다. 작인 Iteration으로 나누어 개발하는 애자일 기법은 나무만 보고 숲을 보지 못하는 우를 범할 가능성이 크다.
      2. eXtream Programing(XP) (1999 XP explained)

        1. XP란 eXtream Programing의 약자로 “가장 단순한 것이 가장 좋은 것이다.“를 모토로 한다.
        2. 창시자인 켄트벡은 짝프로그래밍, TDD(테스트주도개발), 디자인패턴, 리랙토링 등을 대중화 시킨 가장 유명한 프로그래머들 중 하나이다. (이미 열렬한 신봉자들의 교주가 되어버렸다.)
        3. 핵심 키워드는 “코드진화”이다. XP는 최초의 요구사항이 후반에 반드시 바뀔 것을 당연시한다. 이를 위해 변화에 따른 비용 그래프의 증가 곡선을 평평하게 프로그램을 유지한다. 즉 개발 후반부에 기능을 추가하는 것이 초반에 추가하는 것과 크게 다르지 않다.
        4. 전통적인 폭포수 개발형태를 접한 사람이라면 이런 것이 가능할지 의문이 들것이다. XP는 자체문서화, 리팩토링, 자동화 도구(Ant등), 단위테스트(JUnit) 등으로 이것을 가능하게 한다. 이는 모두 IDE와 프로그래밍 기술의 발달로 가능해진 것이다.
        5. 자체 문서화(따로 문서를 만들지 않고 소스 자체를 문서화한다), 프로그래밍 패턴을 통해 빠른 설계가 가능하다. 설계는 필요이상 하지 않는다. 이후 지속적인 리팩토링을 거치기 때문에  개발후반 수정사항이 생기더라도 개발 초반과 동일한 수정 기간만이 필요하다.
        6. 소스코드 차제가 문서이자 산출물이며 개발자의 개발 의도를 표현해준다.
        7. 개발자와 설계자가 달라서 생기는 엄청난 비극을 미연에 방지해준다. 즉 책임의 소재가 명백하다.
        8. 초기에 10인 이하의 프로젝트용으로 평가받았으나 기술의 발달로 RUP를 빠르게 대체해가고 있다.
  5. 문서화 / UML의 문제점

    1. IDE 의 발달로 개발은 점차 자동화 되어가도 있지만 문서는 그렇지 않다. 즉 성과에 비해 시간이 너무 많이 걸린다. 이를 극복하기 위해 리버스 엔지니어링 이라는 편법이 동원된다. 물론 이 짓은 산출물을 위해 보여주기 위한 종이문서를 생산하기 위한 것으로 본래의 취지와는 안드로메다로 떨어지게 된다 무엇을 위한 산출물일까? 가능하다면 더 이상 책상위에 문서가 있어서는 안 된다. Trac, JIRA 등의 걸출한 이슈트래커가가 있음에도 엑셀을 사용하는 것은 왜일까? 답은 당신이 사용할 줄 몰라서 이다.
    2. 개발자가 보기에 문서보다는 IDE의 지원을 받는 소스가 이해하기 편하다.  개발자를 위한 문서란 대부분의 경우 있을 수 없다. 전달 매체가 책이라면 클래스 다이어그램의 압승이다. 하지만 PC를 사용 가능하다면 실제 코드를 이클립스로 보는 게 훨씬 쉽고 정확하다.

      MSDN을 생각하자. MS는 소스를 오픈하지 않았기 때문에 MSDN이라는 거대하고 복잡한 매뉴얼을 만들 수 밖에 없었다. 이렇게 거대한 매뉴얼을 만들었지만 아직도 개발자들의 불만은 끊이지 않고 있다. 소스 10장을 문서화하고 모든 예외상황을 기술하려면 100장도 모자란다.

    3. 실제 정상적인 작업에서는 refactoring작업이 빈번히 일어난다. 밥을 먹다가도 더 좋은 메소드 이름이 생각나면 하루에도 '몇 번씩 수정을 하는 일이 비일비재 하다. 사용자가 보기에 거창한 수정이라도 IDE 또는 프레임워크의 도움으로 간단히 끝나는 경우가 많다. 이들은 IDE가 자동으로 하지만 문서는 손으로 고쳐야 한다. 일이 일을 만든다. 소스 1시간 고치고 이를 위해 4개의 문서를 수정해야 한다면 당신은 하겠는가? 원시시대로 돌아갈 생각인가?
    4. 한번 에 좋은 설계를 하는 것은 불가능하다. UML 모델링으로 설계를 수정 하는 것 보다 refactoring으로 소스를 직접 수정 하는 것이 더 빠르고 쉽고 안전하다. IDE는 오타를 내지 않는다.
    5. 소스로 UML을 만들어 내는 것은 쉽지만 UML로 소스를 만드는 것은 매우 어렵다. (자동화 도구의 부재이다.) UML작성 후 소스코드 작성이라는 이중 작업을 수행해야 한다.
  6. RUP의 문제점

    1. 최근의 대세는 XP이며 특히나 문서에 취약한 반면 툴 사용에 능숙한 개발자는 대부분 XP를 선호한다. (개발자가 아닌 사람은 대부분 RUP를 선호하는듯..) 나역시 XP를 선호하니 RUP의 약점을 공격해 보겠다.
    2. RUP의 중요 원리중 “문서 작업을 최소화 하라”, “유연하라” 등이 있다. 하지만 공룡과도 같은 이 기법은 이를 무색하게 만든다.
    3. 앞의 RUP태생을 말했던가? 이는 다분히 상업적인 전략이며 이 방법론의 주 임무는 다음과 같았다. 첫째 관련된 CASE툴의 판매, 둘째 컨설팅 시장을 장악하는것.
    4. 완벽한 요구사항 도출로 후반 수정사항을 없애겠다는 RUP의 시도는 실패로 끝났다. 이는 한국만의 문제점이 아니다. 갑에게는 완벽했던 요구사항을 한방에 뒤집기란 손바닥 뒤집듯 쉬운 일이다. 무수한 수정으로 문서의 존재 이유가 떨어진다. 문서의 업데이트에 너무 많은 시간이 소요된다. 문서의 정확도 역시 떨어진다. 이로 인해 만들어놓은 문서를 보지 않게 된다.
    5. refactoring의 발달로 설계의 중요성이 예전만큼 중요하지는 않다. 시간이야 좀 걸리겠지만 테스트만 잘 작성되어 있다면 개발 후반에도 얼마든지 수정이 가능하다. 썩은 기둥을 안고 가는 것 보다는 현명한 판단이 될 것이다.
    6. 산출물을 작성해도 그것을 읽을 줄 아는 고객은 전무하다. UML은 생각보다는 쉽지 않다. 간단하게 표현하는 데는 여전히 효율적이지만 조금만 세부적으로 들어간다면 다이어그램이 복잡해지고 알아보기 힘들게 된다.
    7. RUP에 의하면 소스는 단순히 개발 과정의 산출물일 뿐이다.  RUP를 기반으로 한 산출물(보통 UML)만 있다면 어떠한 개발언어로든지 변경이 가능하다. 즉 설계자가 설계만 잘하면 단순 코더들이 이 설계(산출물)를 토대로 소스를 뽑아낸다는 말이다. 여기서 박사급 설계자는 고급 인력이고 실제 개발자들은 단순 코더화 된다. 개발자들이 이러한 프로세스를 좋아할리 없다. ORM을 모르는 DBA와 개발을 많이 접해보지 못한, 2~3년 전의 옛날 책으로 공부한 고급 설계자들은 시대에 뒤떨어진 엉뚱한 설계를 내어놓는다. 팀내의 불화가 생기고 프로젝트는 위기로 향한다. 이 UML을 가지고 소스를 코딩하라고요? 농담이시겠죠?
    8. 설계자와 코더가 동일한 사람이 아니라면 이는 문제 발생의 소지가 커진다. 무책임한 셜계가 나오고 설계가 아무런 쓸모 없어질 가능성이 매우 크다.
    9. ORM 등의 각종 프레임워크와 미들웨어, JUnit, SVN, ANT등의 자동화된 도구를 사용할 줄 모르는 사람도 설계를 한다. 이들은 설계에 지대한 영항을 미치는 것들로 설계자가 이를 모른다면 엄청난 비극을 불러올 것이다. 물론 이 비극은 전세계에서 매일 일어나고 있다.
    10. 웹 중심 개발로 인한 설계의 모순  ?? 잘 모르겠음.

      1. 현재 대부분의 SI는 엔터프라이즈(클라이언트-서버-DB를 all-in-one으로 개발하는것) 개발이다. 그리고 엔터프라이즈의 대부분은 웹개발이다. 웹개발은 서버프로그램 , 클라이언트 프로그램으로 나뉜다. 리치 클라이언트와 Ajax등의 기술이 유행하면서 클라이언트 프로그램의 중요성이 점점 더 커지고 있다.

      2. 하지만 위에서 말한 개발방법론은 모두 객체지향 프로그래밍에 해당하는 것으로 클라이언트 프로그래밍에 사용되는 스크립트 언어에는 해당되지 않는다.

      3. 산출물에서 클라이언트 스크립트 언어에 관한 자료를 찾아 불 수 있는가? 즉 당신이 보는 문서는 반쪽짜리이다.

      4. 텍스트 기반인 스크립트 언어는 특성상 구조적으로 배치가 가능하면서도 설계가 자유롭고 변형이 쉽기 때문에 문서를 남기는 것이 매우 힘들다. 이 다이나믹한 언어들은 심지어 런타임으로 평션(자바로 따지자면 class)의 수정마저 가능하다. 이는 RUP에서는 받아들이기 힘든 체제이다. 소스 그 자체를 문서로 보고 지서속적인 리팩토링을 하는 것만이 대안일 것이다.

  7. 한국에 특화된 문제점

    1. 완벽한 인원과 충분한 기간, 그리고 환상적인 고객과 개발 금액이 조화를 이룰 때 RUP방법론이 성공할 수 있다.

      1. 하지만 하도급이 보편화된 한국에서 그럴 일은 없다. 한국에서 실제 프로젝트 금액의 몇%가 실제 개발비로 사용될까? 한번 생각해 보라.

      2. 흔히 빅3로 불리는 대기업과 발주기업의 유착관계는 실제 투입비용을 절반 이하로 떨어트려서 SI산업의 하향평준화에 큰 공을 세웠다.

    2. RUP가 적용 가능한 대형 프로젝트의 경우 단일 업체에서 체계적인 프로젝트 진행이 가능한 경우는 없다. 대부분 끊임없는 하도로 이어져 을 업체마저 어디까지 하도가 되었는지 관리가 거의 불가능하다.

    3. 명확한 정의가 없다. 화려한 미사어구로 표현했지만 정작 읽어보면 애매모호하거나 다의성을 지닌다. 이는 공학에서 금기시해야 하는 원칙이지만 소프트웨어 공학에서 만큼은 당연하리만큼 통용된다. 공학이지만 코드도, 수학도, 과학도 없다. 단지 말뿐이다.  끔찍하다.

    4. 제안서 기술평가 항목에 방법론은 들어가지만 실제 소프트웨어의 질을 결정하는 사항들은 빠져있다. 방법론에 거창한 것이 들어가 있지 않으면 점수를 받기 힘들다. 한국에서 XP방법론은 요원한 것이다. 이것은 제도의 문제일 것이다.

  8. 결론

    1. 이미 컴포넌트의 재사용, RUP, CBD식의 방법론 같은 것들은 실패한 것으로 대부분 판명되었으다. 시대에 뒤떨어진 이러한 문제를 생각하느라 시간을 허비하지 말자.

    2. 재사용에 관한 훌륭한 대안으로 “디자인 패턴”을 공부하라. 이는 유일하게 실무에서 나온 이론으로 개발자들의 열렬한 환호를 받고 있다.

    3. 당장 아무것도 도움이 안되는, 개 풀뜯어 먹는 소리만 해대는 소프트웨어 공학을 잊어라. 그리고 수십년 간의 프로그래밍 노하우와 연구들, 이론들이 집대성된 ANT, SVN, OSGi, Maven, Trac같은 도구들을 공부하고 사용하라. 앞서 고생한 선배들의 가르침이 담겨 있을 것이다.

Our highest priority is to satisfy the customer

through early and continuous delivery

of valuable software.

우리가 가장 중요하게 여기는 것은

제 시간에, 지속적으로 가치 있는 소프트웨어를 인도함으로

고객을 만족시키는 것이다.

방법론의 변천

1970년대가 되어서야 폭포수 방법론이 등장했고, C 4세대 언어 도구들이 등장한 80년대에는 생명주기 관점에서 소프트웨어 개발 방법을 바라보게 되었다. 90년대가 되어서 반복과 통합된 프로세스를 토대로 하는 RUP가 등장했고, 이를 계승한 컴포넌트 기반 방법론인 CBD가 현재 위세를 떨치고 있다.

이와는 다른 관점에서 나온 방법들이 있다. 카네기 멜론 소프트웨어 공학 연구소에서 나온 업무능력 성숙도 평가 기준(Capability Maturity Model; CMM)은 개발 프로세스 향상을 통해 성공적인 프로젝트 수행이 가능하다고 얘기하고 있고, 중소규모의 개발팀에 적용해서 큰 효과를 보고 있는 XP방법론이 유행하고 있고, XP와 뜻을 같이하는 여러 방법론들의 연합체인 애자일 방법론도 개발자들 사이에서 큰 흐름을 형성하고 있다.


eXtreme Programming (XP)

Kent Beck이 만든 방법론으로 기존의 개발 방법론은 위에서 아래로 진행하는 반면 XP방법론은 아래부터 위로 향하는 습성을 갖고 있다. 농담 삼아 하는 얘기인지 모르지만 프로젝트에서 갈 데까지 간 개발자들이 극한의 상황에서 살아남기 위해서 만들어졌기 때문에 extreme이라는 단어를 붙였다고 한다.

XP에서 얘기하는 내용을 보면 방법론이라기 보다는 개발자 개인 및 팀원 간의 습관이라고 보는 것도 무리가 없다. 그림 8.에서 제일 안쪽에 있는 원은 개인의 실천사항을 얘기하고 있고, 중간의 원은 팀원간의 실천사항을 표현하고 있다. 제일 바깥의 원은 전체 프로젝트에서 일어나는 실천사항을 표현한다.


사용자 스토리가 나오면 스파이크라고 하는 핵심 기술을 빨리 구현해서 보일 수 있는 시범 프로그램을 만들어서 기한내에 완성이 가능한 스토리인지 가늠해 본다. 그 이후 구체적인 계획을 잡고 개발을 하고, 최종적으로 사용자 스토리에 있는 내용을 테스트케이스로 잡아서 고객의 인수테스트를 통과하면 작은 배포버전을 만든다. 보통 이 기간을 2주로 잡고 있으며 2주마다 기능을 추가해서 동작하는 소프트웨어를 만들어간다. 물론 처음에는 아주 기본적이고, 핵심적인 프로그램으로 시작하고, 2주 분량의 기능만 추가해서 진행하기 때문에, 고객은 진행되는 일의 산출물을 보면서 안도하고, 개발자는 동작하는 프로그램의 배포에서 꾸준한 성취감과 동기부여를 얻을 수 있다.

멀티랭귀지가지원되는 버전의 Java EE SDK를 사용하면 문제가 쉽게 해결되지만
설치된 SDK가 그렇지 못할때는

//1.번
MS Windows에서 C:\WINDOWS\Fonts 디렉토리에 있는 'gulim.ttc', 'batang.ttc', 'mingliu.ttc' 이렇게 3개의 한글 관련 파일을 LINUX에서 Java가 설치되어 있는 위치에서 fonts 관련 디렉토리 (${JAVA_HOME}/jre/lib/fonts)로 복사해 놓습니다.
새로 복사한 3개의 한글폰트 파일들을 ${JAVA_HOME}/jre/lib/fonts/fonts.dir 파일에 아래처럼 등록합니다.
<초기등록되어_있던_폰트_갯수> + 3
...
batang.ttc -ms-batang-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0
gulim.ttc -ms-gulim-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0
mingliu.ttc -ms-mingliu-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0
 
최초 등록되어 있던 폰트 파일 갯수가 72개였다면, 새로 3개의 폰트 파일을 더 등록하므로 총 75개가 되고 이 값을 맨 첫줄에 적어준 후, 새로 등록할 3개의 폰트 파일을 위처럼 추가로 적어줍니다.
 
2.번
${JAVA_HOME}/jre/lib 디렉토리에 'font.properties.ko' 파일을 만들어 한글폰트를 등록해서 사용하면 됩니다

첨부 :
java로 데몬 형태의 프로그램을 작성할 경우가 있다.
이때 기동이야 java 커맨드로 실행을 하지만,
중지시키기 위해서는 Ctrl+C 를 하거나 백그라운드 실행시 Kill 을 시켜야 하거나 한다.
좀 더 있어보이기 위해 여타 다른 데몬처럼 start, stop 커맨드를 사용하도록 만들어 본다.

핵심은 shutdown 을 처리를 ServerSocket 을 열고 해당 포트에 대한 Socket 통신으로 이루어진다는 점이다. 만들고자 하는 데몬이 통신서버라면 기존 통신 포트 외에 컨트롤 포트를 하나 더 사용하는 것이다.

Tomcat 의 경우 server.xml 의 맨 처음에 나오는 것은 다음과 같다.
<Server port="8005" shutdown="SHUTDOWN" debug="0">
여기서 port 가 바로 shutdown 처리를 위한 포트이고, 이 포트에 shutdown 으로 설정된 SHUTDOWN을 소켓으로 보내면 Tomcat 이 중지된다.

아래는 톰캣과 유사한 형태로 작성한 소스이다.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.AccessControlException;
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;


public class Server {
 private static final String COMMAND_SHUTDOWN = "shutdown";
 private static final int COMMAND_PORT = 8099;
 
 private boolean started;
 private Random random;
 private Timer timer;
 
 private Server() {
  this.started = false;
  this.random = null;
  this.timer = null;
 }
 
 private void start() {
  // 여기서 서버가 수행하는 쓰레드를 start시킨다(반드시 쓰레드이어야 한다).
 
  // 에로서 Timer를 사용하여 1초마다 메시지 출력...
  this.timer = new Timer();
 
  timer.scheduleAtFixedRate(
    new TimerTask() {
     public void run() {
      if ( started )
       System.out.println("1초마다 메시지");
     }
    }
    ,new Date(),1000 );
 
  await();
 }
 
 private void stop() {
  // 서버가 수행하던 쓰레드를 중지시킨다.
  // 예로써 Timer 중지...
  this.timer.cancel();
  this.timer = null;
 
  System.out.println("중지되었습니다.");
 }
 
 /**
  * 서버소켓을 열고 shutdown 요청이 있을때까지 대기...
  */
 protected void await() {
  try {
   ServerSocket serverSocket = null;
   try {
    serverSocket = new ServerSocket(COMMAND_PORT, 1, InetAddress.getByName("127.0.0.1"));
    started = true;
   } catch (IOException e) {
    e.printStackTrace();
   }
   while ( started ) {
    Socket socket = null;
    InputStream stream = null;
    try {
     socket = serverSocket.accept();
     socket.setSoTimeout(10*1000 );  // 타임아웃 10초...
     stream = socket.getInputStream();
    } catch (AccessControlException e) {
     continue;
    } catch (IOException e) {
     System.exit(1);
    }
   
    StringBuffer command = new StringBuffer();

    // Cut off to avoid DoS attack
    int expected = 1024;
    while ( expected < COMMAND_SHUTDOWN.length() ) {
     if ( random == null )
      random = new Random(System.currentTimeMillis());
    
     expected += (random.nextInt() % 1024);
    }
   
    while ( expected > 0 ) {
     int ch = -1;
     try {
      ch = stream.read();
     } catch (IOException e) {
      ch = -1;
     }
     // EOF
     if (ch < 32) break;
    
     command.append((char)ch);
     expected--;
    }

    // 소켓을 닫는다.
    try { socket.close(); } catch (IOException ignore) {}
   
    String cmd = command.toString();

    // shutdown 명령시 루프 중지
    if ( COMMAND_SHUTDOWN.equals(cmd) ) {
     break;
    }
   }
   // 서버 소켓을 닫는다.
   try { serverSocket.close(); } catch (IOException ignore) {}
  } catch(Throwable t) {
   t.printStackTrace();
  } finally {
   // 서버 종료 처리...
   try { stop(); } catch (Throwable ignore) {}
  }
 }
 
 /**
  * 소켓으로 shutdown 커맨드를 보낸다.
  */
 private static void shutdown() {
  Socket socket = null;
  OutputStream os = null;
  try {
   socket = new Socket("127.0.0.1", COMMAND_PORT);
   os = socket.getOutputStream();
   for (int i = 0; i < COMMAND_SHUTDOWN.length(); i++) {
    os.write(COMMAND_SHUTDOWN.charAt(i));
   }
   os.flush();
  } catch(Throwable t) {
   t.printStackTrace();
   System.exit(1);
  } finally {
   try { os.close(); } catch(Throwable t) {}
   try { socket.close(); } catch(Throwable t) {}
  }
 }
 
 
 public static void main(String[] args) {
  try {
   if ( COMMAND_SHUTDOWN.equals(args[0]) ) {
    shutdown();
   } else {
    Server server = new Server();
    server.start();
   }
  } catch (Throwable t) {
   t.printStackTrace();
  }
 }
 
}

실행/종료 : java Server start / java Server shutdown


'개발도 하냐?' 카테고리의 다른 글

XP 개발방법론  (0) 2009.12.06
JAVA Application 한글깨짐 해결  (0) 2009.12.03
웹접근성을 보장하는 웹개발을 위한 고려사항  (0) 2009.12.02
Cross Domain Script 해결법  (0) 2009.12.01
HTML vs XHTML?  (0) 2009.12.01

+ Recent posts