본문 바로가기
📝 회고/✅ 22년 회고

[일일 회고] 22.02.21~22 페어 프로그래밍(아이엠 그라운드 자기소개하기도 좋지만 그라운드 룰(Ground Rule)!) & 일급 컬렉션 🤝 🥇

by kukim 2022. 2. 22.

이번 주 과제는 다음과 같다.

과제 : 로또 게임 프로젝트

단계 : 3단계 +a

방법 : 2인 페어 프로그래밍(팀원 : 땃쥐, 쿠킴)

진행(21,22일) : Step1(소스코드, PR)와 Step2 절반

 

📝 배운 것

 

✅ '아이엠 그라운드 자기소개하기'도 좋지만 '그라운드 룰(Ground Rule)'도!

페어 프로그래밍 첫날, 팀원을 만나 간단한 자기소개를 했다. 간단히 기술적인 세팅(Github 저장소 설정, JetBrain의 Code With me...)을 하고 곧바로 프로젝트에 시작했다. 페어프로그래밍 역할(내비게이터, 드라이버) 교대를 15~20분 마다 번갈아가며 코딩했고 집중하다 보니 3시간 연속 안 쉬고 코딩도 했다. 시계는 어느덧 오후 11시 15분... 오늘은 여기까지 하기로 했다.

엉엉

상당히 피곤했다.
무엇이 잘못되었을까?

 

yeha의 조언으로 페어 프로그래밍을 위해서는 팀원 사이에 자세한 룰이 필요하다는 것을 알았다. Ground Rule을 알게 되었고 내일 적용하기로 했다.

 

다음날 (22일) 팀원과 그라운드 룰(Ground Rule) 몇 가지를 정할 수 있었다.

 

룰을 정한 뒤 오늘은 성공적인 페어 프로그래밍을 할 수 있었다. 정한 시간만큼 효율적으로 집중하여 코딩할 수 있었고, 중간중간 휴식을 두어 체력을 아낄 수 있었다. 저녁 개인 시간도 생겼다.

 

아래는 그라운드 룰의 몇 가지 예이다. (참고 : ye-ha 노션 프로젝트 관리 템플릿 공유)

 

1. 시간

- 함께 프로젝트에 집중하는 시간은 몇 시부터 몇 시까지인가? (e.g. 오전 10시 ~ 12시 / 오후 2시 ~ 6시 / 오후 7시 ~ 9시)

- 식사 시간은 언제인가? (점심, 저녁)

- 개인적으로 연락이 어려운 시간 (e.g. 오후 7시 이후 찾지 말아 주세요)

- 되도록 1시간마다 10분의 휴식 시간 갖기

- 개인적인 일이 있다면 미리 말해주기 (e.g. 내일 병원을 가야 해 오후 2~3시까지 자리를 비웁니다)

-...

 

2. 기술

- 코드 관리 (저장소는? 커밋 메시지는? 브랜치 관리는?)

- 코딩 컨밴션은?

- 페어 프로그래밍의 네비 게이터와 드라이버 역할 명확히 하기 

-...

 

3. 스크럼, 에너지 뿜 뿜

- 페어 프로그래밍 시작과, 끝에 개인의 컨디션 상태, 오늘 진행한 프로젝트에 대한 간단한 스크럼

- 한 기능을 끝내면 긍정적인 말이나 행동으로 에너지 올리기

-...

 

✅ 일급 컬렉션 적용하기

이번 프로젝트에서 호눅스와 로치의 리뷰 덕분에 일급 컬렉션 적용을 해볼 수 있었다.

복수의 로또 티켓(lottoTickets)을 List<> 형태로 가지고 있는 것이 아닌 LottoTickets 객체를 일급 컬렉션으로 만들어 사용했다. 일급 컬렉션 안의 List<LottoTicket> 멤버 변수를 불변으로 사용하고 있다. 일급 컬렉션의 장점은 향로님의 글에서 볼 수 있듯이 4가지가 있다.

1. 비즈니스에 종속적인 자료구조이다. 2. Collection의 불변성을 보장한다. 3. 상태와 행위를 한 곳에서 관리한다. 4. 이름이 있는 컬렉션이다.  추가적으로 완전한 불변을 위해 getter에 unmodifiableList도 추가해주었다. (참고 글)

// 전체 소스 코드 : https://github.com/ttasjwi/java-lotto/tree/step1
// 적용 전
List<LottoTicket> lottoTickets = LottoTickets.createRandomTickets(money);
// 적용 후 : 컬렉션(LottoTickets안의 List<LottoTicket>에 불변성 보장
LottoTickets lottoTickets = LottoTickets.createRandomTickets(money);

public class LottoTickets {

    private final List<LottoTicket> lottoTickets = new ArrayList<>();

    private LottoTickets(Money money) {
        long numberOfLottoTickets = money.numberOfBuyableLottoTickets();
        for (long count = 0; count < numberOfLottoTickets; count++) {
            lottoTickets.add(LottoTicket.createRandomTicket());
        }
    }

    public static LottoTickets createRandomTickets(Money money) {
        return new LottoTickets(money);
    }

    public List<LottoTicket> getLottoTickets() {
        return Collections.unmodifiableList(lottoTickets);
    }

}

// 적용 전
List<LottoNumber> winningTicket = InputView.inputWinnigTicket();

// 적용 후 : 상태와 행위를 한 곳에서 가진다.
WinningTicket winningTicket = InputView.inputWinnigTicket();

public class WinningTicket {

    private final Set<LottoNumber> winningNumbers;
    private final LottoNumber bonusNumber;

    public WinningTicket(Set<LottoNumber> winningNumbers, LottoNumber bonusNumber) {
        validateDuplicateLottoNumber(winningNumbers, bonusNumber);
        this.winningNumbers = winningNumbers;
        this.bonusNumber = bonusNumber;
    }

    private void validateDuplicateLottoNumber(Set<LottoNumber> winningNumbers, LottoNumber bonusNumber) {
        if (winningNumbers.contains(bonusNumber)) {
            throw new IllegalArgumentException(String.format("보너스 번호 %d가 당첨번호와 중복됩니다.", bonusNumber.getNumber()));
        }
    }

    public Rank match(LottoTicket lottoTicket) {
        int matchCount = calculateMatchCount(lottoTicket);
        boolean matchBonus = isMatchBonus(lottoTicket);
        return Rank.of(matchCount, matchBonus);
    }

    private boolean isMatchBonus(LottoTicket lottoTicket) {
        return winningNumbers.contains(bonusNumber);
    }

    private int calculateMatchCount(LottoTicket lottoTicket) {
        return (int) lottoTicket.getLottoNumbers().stream()
                .filter(winningNumbers::contains)
                .count();
    }
}

👍 Keep

- 페어 프로그래밍에 그라운드 룰을 적용

- 새로운 것을 배우고 적용

🔥Problem

- 운동 시간을 내자.

🚒 Try

- 에너지가 100이라면 80 정도만 쏟고, 나머지 20은 휴식과 운동을 하자.

- 번아웃되지 않고 오래 공부하자.

댓글