E D R , A S I H C RSS

Pair Programming


나의 컴퓨터에서 둘이서 서로 상의면서 번갈아가며 프로그래밍을 는 방법.


1. Pair Programming Approach

PairProgramming 을 적용해보는 방법, 스타일 등등
  • Pair Refactoring - 꼭 소스 코드가 아니더라도 위키 페이지에 대한 문서구조조정는 경우에도 적용할 수 있다. 특히, 해당 토론이 벌어진뒤 양론으로 나누어졌을 경우, 각 의견 지지자들이 Pair 로 문서구조조정을 할때 이용할 수 있다.
  • 5분 Pair-Change - 장과 단이 존재는데. 장점으로 본다면, 자신의 프로그래밍 차례가 빨리 돌아오면서 Pair 끼리의 Feedback 이 빠르다는 점에서 집중도가 높다는 점이 있다. 단, Junior 의 경우 자신의 사고가 성숙해질 시간을 방해할 수 있다. 이 경우 5분으로 시작, 점차적으로 Change 의 기간을 늘려주는 방법이 있다.

2. 효과

  • 코드 에러율의 감소 - 내가 간과고 넘어가기 쉬운 에러들에 대해서 지적이 빠르다.
  • Protocol Analysis, 지식의 전달 - Seminar:CognitivePsychology참조. 다른 사람의 사고과정을 관찰고, 또한 자신의 사고과정을 다른 사람으로 여금 관찰할 수 있게 해준다. 이는 자신의 프로그래밍 과정중 잘못된 부분을 고치는데 도움을 준다.
  • Communication
  • 해당 시간 내 집중도의 상승, Pair Pressure - 평소 프로그래밍 외의 것(프로그래밍 중 음악듣기, 쓸데없는 웹서핑, 메일 읽기)에 대한 잡음을 없앤다. 작업 자체에만 몰두게 해준다. TestDrivenDevelopment 와 상호작용이 빠른 언어(Python 등..)를 이용면 Feedback 이 빠르므로 집중도가 더 높아진다.

3. Pair Programming 에 대한 오해?

  • Pair 중 Expert는 Junior에게 많은 설명을 해줘야 한다? - 이는 Junior 의 Feedback 을 보고 결정는 것이 좋다. 처음부터 Expert 가 꼭 '선생님'이 될 필요는 없다.
  • Junior : Expert 간 격차에 따른 효율성의 문제 - PairProgramming
  • Junior : Junior Pair 는 의미가 없다? - 결과물에 상관지 않는 학습의 경우 그 의미가 있다. Junior 의 실력 한계 내에서의 Output 으로도 의미가 있다. 처음 프로그래밍을 익히는 사람에게 Pair 를 는 것 자체가 새로운 학습경험이 된다.


PairProgramming 의 다른 적용 예로서 PairSynchronization 이 있다.


4. PairProgramming 경험기

4.1. 동문서버 프로그램 개발중

진행한 사람 : 강석천, 윤상혁

동문서버 프로그래밍 팀의 인수인계용으로 이용되었었다. PP를 주로 고 한두번의 VPP를 했다. 해당 소스를 같이 만들어가면서 기존의 프로그램을 설명했다.

4.1.1. 제기된 문제점 & 해결법

Expert : Junior . 즉, 해당 분야에 대한 전문가 : 초심자 의 문제이다. 이 경우 그 진행이 늦어질 수 있다. (Expert : Expert는 최고의 효율성을 가진다. 물론 이것도 열린 마음을 바탕으로 한다. Junior : Junior 도 나름대로(?) 빨리 움직인다. (제대로 움직인다는 보장은 못한다. -_-;)) 그리고 Expert가 해당 프로그래밍에 대한 답 (코드)을 이미 알고 있는 경우 Expert의 집중도와 긴장감을 해치게 된다.
이 때에는 Expert는 놀지말고 (-_-;) Observer의 역할에 충실한다. Junior 의 플밍는 부분을 보면서 전체 프로그램 내의 관계와 비교해보거나, '자신이라면 어떻게 해결할까?' 등 문제를 제기해보거나, reference, 관련 소스를 준비해주는 방법이 있다.

나의 문제점으로 제기된 것은, Junior 가 Expert의 권위에 눌릴 수 있다는 것이다. Junior 는 질문에 용감해야 한다. Expert는 답변에 인색해서는 안된다. 열린 마음이 필요한 일이다. (Communication 과 Courge 는 XP 의 덕목이다. ^^)

4.1.2. 발견된 장점

전문가라 더라도 프로그래밍의 실력과 다른사람에게 답변해주는 능력은 다르다. 커뮤니케이션 능력은 실제 도메인에 대한 지식과는 다를 수 있다. Expert 는 Junior 에게 설명을 해줌으로서 기존의 지식에 대한 정리를 해 나갈 수 있다. Junior 는 혼자서 삽질는 것보다 더 빨리 필요한 지식에 대해 접근할 수 있다.

4.2. TFP 연습중

진행한 사람 : 강석천, 박지환

간단한 아날로그 시계를 만드는 프로그램이였다. MFC + CppUnit 로 작업했다.

4.2.1. 제기된 문제점 & 해결법

  • Pair 의 진행을 이끌어가는 것 - 프로그래밍의 흐름이라고 해야 할까. 디자인을 어느정도 선정도로 맞추고 어떠한 문제를 풀 것인가에 대한 약간의 선이 필요할 것 같다. 이 경우에는 초반 디자인이 허술했었다는 약점이 있었다. '전체적인 관점에서 무엇무엇을 면 프로그램이 완성될 것이다' 라는 것. UserStory 만 생각EnginneringTask 를 간과한 것이 큰 문제였다. (그때 EnginneringTask 에 대한 개념이 없었었다는. 어디서 함부로 주워만 지식. --; 사고를 자 사고를. -_-)
    • ExtremeProgrammingPlanning 이라는 책을 보면 해결책을 구할 수 있을 것 같다. (Xp 책들의 장점이자 단점이라면 얇은 두께의 분책이려나.. --a)
  • Pair 의 분배 - TFP를 공부느냐고 시작한 것이였던지라, 상대적으로 CppUnit 에 익숙지 않은 사람에게 코딩을 주도게 했다. 한 1주일정도 되는 프로젝트라면 Junior로 여금 경험을 쌓게 함으로써 오히려 장점으로 작용할 수도 있을 것 같다. 지만, 역시 적절게 분배를 했었어야 할 것 같다.
  • 집단 삽질. --; - 이것은 헤프닝이라고 보는 것이. -_-;; Test Code 에서 둘이 라디안 구는 공식을 거꾸로 쓰고 '왜 값이 틀리다고 는거야!' 며 1시간을 삽질했다는 후문이 있다는. --;
    • 지만 UnitTest도 그렇듯이, 많은 장점을 가진 방법을 완벽지 않다는 이유로 사용지 않는다는 것은 아쉬운 일일 것이다.
  • 아직은 효율성이.. - 일종의 Learning Time 이라고 해야 할까? 대부분 실험에서 끝난다는 점. 퍽 고 처음부터 효율성을 극대화 할 순 없을 것이다. 참고로 이때는 아날로그 시계 만드는데 거의 3시간이 걸렸다. Man-Hour 로 치면 6시간이 된다.

4.2.2. 발견된 장점

집중도는 거의 최고라는 점! (이 점에서 둘이 서로 동의를 했다.) 평소 혼자 프로그래밍할때는 중간에 웹서핑을 는 등 주위가 산만해지는 경우가 많았다. 지만 이 Pair 중에는 사람들이 프로그래밍과 토론에만 전념할 수 있었다. (오히려 중간중간 일부러 10분 휴식을 두어야 했다.)

TestFirstProgrammingPairProgramming 은 집중도에 관해서는 가장 훌륭한 선택인 것 같다. (단, Pair와의 담합행위가 이루어지면 곤란겠다. -_-;)

4.3. bioinfomatix 프로젝트중

진행한 사람 : 강석천, bioinfomatix 에서 일시는 분들

학습목적이 아닌 실질적인 개발을 위한 PairProgramming 으로는 처음인듯 다. 2주간 격일로 일을 했었는데, XP 스타일로 프로젝트를 진행였다.

4.3.1. 제기된 문제점 & 해결법

* Junior 로서의 실수 - 기존 앞에서의 경험에서는 상대적으로 내가 Expert 의 위치에서 작업을 였다. 이번에는 Junior 의 입장에 서게 되었는데, 기존에 Junior 의 위치에 있었던 사람들의 실수를 내가 게 되었다. 어려운 부분에 대해서는 이해를 제대로 지 못했음에도 불구고 Expert의 속도를 저해할지도 모른다는 생각을 며 대강 넘어갔었다. (다른 Junior 의 경우도 PP에서 어려움을 겪는 부분중 나가 이것일지도 모른다. 특히 선후배 관계의 경우) 지만, 이는 오히려 사태를 악화시킬 수 있다. 프로그래밍 작업을 계속 Expert에게만 의존게 되기 때문이다. 확실게 개념을 공유해야 Observer 의 역할과 Driver 의 역할 둘 다 잘할 수 있다. (쉬운 일은 아니다. 확실히)
  • 보통 코딩을 주도는쪽이 빨리 지치며 집중력도 떨어지게 된다. 특히 PairProgramming 의 경우는 상대편 Pair에 대한 배려상 해당 시간에 작업 이외의 다른 일을 거의 지 않는다. (화장실도 자주 안간다;;)
  • 상황에 따라 다르겠지만, Driver / Observer 의 교체시간을 두는 것이 좋은 것 같다. 위의 이유에서.
  • 상황에 따라서는 말로 는 것 보다 코드로서 이야기는 것이 더 직관적일 때가 많다. 코드로 이야기 고, 다시 의견을 듣고 수정거나 키보드를 넘겨서 리펙토링 는 식으로 대화할 수 있겠다.
  • 자존심문제? - Pair를 의식해서여서인지 상대적으로 Library Reference나 Tutorial Source 를 잘 안보려고 는 경향이 있기도 다. 해당 부분에 대해서 미리 개인적 또는 Pair로 SpikeSolution 단계를 먼저 잡고 가벼운 마음으로 시작해보는 것은 어떨까 한다.

4.3.2. 발견된 장점

  • On-Side Customer 와의 PairProgramming - 프로젝트 중간에 참여해서 걱정했었는데, 해당 일시는 분과 직접 Pair를 고 질문을 해 나가면서 전체 프로그램을 이해할 수 있었다. 특히 내가 BioInfomatics 에 대한 지식이 없었는데, 해당 도메인 전문가와의 Pair로서 서로 상호보완관계를 가질 수 있었다.
  • Junior 의 위치에서 바라본 학습 효과 - 이전에 상경이형이 채팅 프로그램 만드는 법을 직접 보여줬을때가 생각이 난다. (그때 '자. 15분동안 나 만들어줄께~' 면서 후다다닥 MFC로 서버/클라이언트 예제를 바로 보여주던 모습은 잊혀지지 않는다;) Junior 의 입장에서 Expert 행동 나는 Check Point 이다. 좋은 습관과 프로그래밍 스타일, 디버깅는 모습을 직접 눈으로 확인할 수 있었다.

4.4. IPSC 중

진행한 사람 : 강석천, 류상민

ProgrammingContest 에 있는 K-In-A-Row 문제를 푸는 일을 했다.

4.4.1. 제기된 문제점

  • 아쉽다면.. 페널티; 흑;;; 답이 안나왔다. --;
  • 대화 - 상대방이 '알고 있을 것이다' 라는 점도 실제는 모르고 있는 경우가 많다라는 생각을 해본다. 친한친구 이더라도, 상대방을 잘 안다라고 생각더라도, 상대로부터 읽지 못한 정보는 너무나 많기에.
    • 보간법의 오차를 줄이려면 Control Point 를 늘리고, 간격을 좁혀야 할것이다. 잦은 대화는 그 자체가 부일지 모르겠지만, 또한 오해를 줄일것이다.

4.4.2. 발견된 장점

  • 협동 - 이번경우는 비교적 협동이 잘 된 경우라고 생각한다. Python 으로 문제를 풀기 위한 프로그래밍을 는데는 석천이, Idea 와 중간에 데이터 편집을 는데에는 정규표현식을 잘 이용는 상민이가 큰 도움을 주었다. 적절한 때에 적절게 주도는 사람이 전환되었던 것으로 기억.
  • 집중 - 이번 경우에는 '시간제한' 이라는 것까지 있어서인지; 석천은 더더욱 프로그래밍 자체에 집중했다. (스크립트 언어 스타일의 접근방법과 이전의 TDD 연습도 한몫 거든듯. 조금씩 만들고 결과 확인해보고 조금 또 만들어보고 결과 확인을 했다. 단, 이번엔 Test Code 를 안만들어서, 뒤에가서 버그가 났을때 대체를 못했다는.-_-; 잘될때는 문제가 아니다. 잘 안될때, 문제상황에 대한 대처가 중요다고 생각.)

5. VPP : Virtual Pair Programming

장소와 시간 등의 문제로 PairProgramming를 진행지 못할때에는 Virtual PairProgramming 을 시도 할 수 있다.
넷미팅, VNC 등의 개발 프로그램을 공유할 수 있는 프로그램과 음성채팅 등으로 Virtual PairProgramming을 할 수 있다. (오.. 좋아진 세상~) 단,PairProgramming 에 비해 아쉬운점들이 있다. (관련 책들을 찾아서 보여주지 못한다는 것 등등) 나중에는 PC카메라와 스캐너 등등 이용할 수 있지 않을까. ^^

1002는 VNC와 넷미팅 (그때 넷미팅 화면공유시 XP가 뻗었던 관계로. -_-;) 을 이용, Python을 공유해서 다른 곳에 있는 사람과 SpikeSolution 을 VPP로 시도한 적이 있다. VNC가 화면 refresh가 느리다는 단점 빼고는 별다른 지장이 없었다. 모르는 라이브러리들을 Pair 는 사람이 다운받아주고, 라이브러리를 설치고. 모르는 것은 Pair 에게 물어보고, 어떻게 만들까 토론했던 경험이 좋았다.

대인관계에 대해 소극적인(?) 사람들은 오히려 말이 많아질 수도 있는 방법일듯 다는. -_-a (지만, 얼굴 안보이는 사람이라 더라도 지킬 것은 지키자.!)

6. PP 경험후기

  • 언어 : PHP
  • 파트너 : 직장동료
  • 드라이버 : Benghun
  • 구현과제 : 데이타베이스 클래스(Database.inc)
참고사항 : 몇몇 함수에 대해서만 TDD를 적용시켰다.
나는 .NET의 System.Data의 구조를 보고 즉시 PHP에 적용시키고 싶어졌다. ASP.NET에는 SqlConnection , OdbcConnection , OleDbConnection을 제공해 준다. 이 클래스들을 잘 사용DataTier의 종류가 바뀌어도 코드의 수정을 최소화 시킬 수 있다. PHP는 여러가지 종류의 데이타베이스 관련함수를 제공해준다. 어떠한 데이타베이스를 사용느냐에 따라 동일한 기능을 는 다른 이름의 함수를 호출해야만 한다.

IConnection을 이용해 각각의 Connection에 대해 단일의 인터페이스를 제공IConnection을 구현MySqlConnection , SqlConnection , OciConnection을 만들자는 것이 나의 생각이었다. 파트너는 switch구문을 이용해 클래스의 상속 구조를 없애는 것과 비교해서 어떠한 이점이 있는가에 대해 질문했다. 이것은 장시간의 토론으로 이어졌다.

나의 생각은 다음과 같았다.
~cpp 
class IConnection
{
    function Connect(){}
    function Execute(){}
    function Close(){}
    ...
}
 
class OdbcConnection : IConnection
{
    function Connect(){ odbc_connect(); }
    function Execute(){ odbc_do(); }
    function Close(){ odbc_close(); }
}
 
class MySqlConnection : IConnection
{
    function Connect(){ mysql_connect(); }
    function Execute(){ mysql_query(); }
    function Close(){ mysql_close(); }
 
}

파트너의 생각은 다음과 같았다.
나의 클래스를 구현고 구현된 나의 클래스에서 switch로 호출되어야 는 함수를 결정면 된다는 것이었다.
~cpp 
class Connection
{
    function Connect()
    {
        switch(UsingDatabase){
            case Odbc: odbc_connect();
            case MySql: mysql_connect();
            ...
        }
    }
 
    function Execute()
    {
        swtich(UsingDatabase){
            case Odbc: odbc_do();
            case MySql: mysql_query();
            ...
        }
    }
}
나는 일차적으로 switch코드를 없앨 수 있다는 점을 설명했다. 우리는 Connection클래스가 그다지 크게 바뀌지 않을 것이라는 것에 대해 동의했었고 이 점을 근거로 switch를 사용는 것이 유지보수를 힘들게 는가에 대해 질문했다. 솔직히 이정도 코드라면 누구나 수정할 수 있을 것이라고 생각한다. 그리고 그렇게 많은 시간을 필요로 는 작업도 아니라고 생각한다. 파트너는 Connection을 생성는 부분을 include 화일로 관리고 그곳에 한번만 define문을 작성면 문제가 없다고 주장했다.
~cpp 
// in GetConnectionObject.inc file
 
define("UsingDatabase", Odbc);
 
function GetConnectionObject()
{
    return new Connection(); 
}

나는 이에 대해 나의 프로젝트에서 여러개의 데이타베이스를 사용게 될 경우 여러개의 추가적인 파일들을 관리해야 될지도 모른다고 했다. 그리고 new SqlConnection(); , new MySqlConnection()과 같은 방식으로 사용는 것이 더 직관적인 것 같다고 설명했다.

추가적으로 토론했던 사항 : Connection 클래스의 생성자에 매개변수로 데이타베이스 타입을 넘겨주면 된다는 것과 파생된 클래스를 생성는 것

긴 토론 끝에 파트너는 나의 의견에 동의했지만 만약 계속 이런 속도로 작업이 진행된다면 회사에서 가만있지 않을 것이다. (어제도 TDD를 사용했었는데 기존의 코딩시간에 비해 3배정도 더 늦어졌다. 그리고 다 끝내지도 못했고 무엇을 먼저 테스트 해야할지 갈팡질팡했었다. 처음부터 함수단위 테스트만 시도해야겠다는 생각이 원인같다.)

PP의 장점은 토론을 많이할 수 있다는 것(의사소통 + 지식공유?)과 집중력이 높아진다는 것이었다. 처음이라 그런지 코딩시간보다 토론시간이 더 길었다. 기존의 방식대로 혼자 코딩면 PP를 는 것 보다 더 많은 코드를 생산할 수 있었다. PP에 익숙해지고 서로의 의견차이를 줄이면 점점 생산속도가 나아지리라 예상해 본다.

See Also


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:59
Processing time 0.0394 sec