Devin.KR

6개월 실행 계획 세우기 - 주 단위 시간표와 증거

개발자KR 조회 1

이 장에서 배우는 것

앞 장에서 짧은 기간에 팀으로 서비스를 완성한 경험과 이전 경력을 자신의 강점으로 정리했다. 이제 그 강점을 보여 줄 시간을 배치한다. 수료 뒤에는 정해진 등교 시간과 제출일이 사라진다. 자유롭게 공부할 수 있다는 장점이 있지만, 하루를 열심히 보내고도 무엇이 남았는지 설명하기 어려워지기도 한다. 이 장에서는 하루 가용 시간을 출발점으로 삼아 24주 계획을 만들고, 매주 확인할 완료 증거를 정한다.

6개월 계획은 취업 날짜를 예측하는 문서가 아니다. 시간이 부족해졌을 때 무엇을 남기고 무엇을 줄일지 정하는 기준이다. 24주는 이 장에서 사용하는 운영 단위이며 달력의 여섯 달과 정확히 같지는 않다. 입사 시점도 사람마다 다르므로, 마지막 단계는 실제 입사 여부에 따라 바꾸어 사용한다.

  • 하루에 실제로 쓸 수 있는 시간을 주간 작업량으로 바꾼다.
  • 학습·코딩 테스트·프로젝트·지원의 비율을 현재 단계와 우선순위에 맞춰 조정한다.
  • 쉬는 주와 점검 주를 미리 넣어 계획이 밀리는 이유를 확인한다.
  • 가용 시간과 우선순위를 입력한 설정으로 24주 계획표를 생성한다.
  • 투입 시간과 완료 증거를 구분해 다음 주 계획을 수정한다.

문제 상황

수료 직후에는 할 일이 한꺼번에 보인다. 자료구조를 다시 읽어야 하고, 코딩 테스트도 풀어야 한다. 팀 프로젝트에서 맡았던 기능을 설명하려면 코드를 다시 살펴봐야 하고, 지원 서류도 준비해야 한다. 모두 필요한 일이므로 하루에 조금씩 전부 하기로 정한다. 그러나 저녁에는 네 가지 작업 중 어느 것도 마치지 못했다는 느낌이 남는다.

예를 들어 평일 저녁에 세 시간을 쓸 수 있는 독자가 있다고 하자. 첫날에는 학습 영상을 보다가 시간이 끝난다. 다음 날에는 프로젝트 실행 오류를 고친다. 그다음 날에는 채용 공고를 읽다가 관심 있는 기술을 발견해 새 학습을 시작한다. 어느 활동도 쓸모없지는 않지만, 한 주 뒤에는 설명할 수 있는 결과가 드물다. 문제는 의지가 약해서가 아니라 서로 다른 작업이 같은 시간대를 차지하도록 계획했기 때문이다.

팀 프로젝트를 끝낸 경험은 여기서 도움이 된다. 기능을 나누고, 마감에 맞춰 범위를 줄이고, 동료에게 진행 상황을 설명해 본 적이 있다. 그 방식을 개인 일정에도 적용한다. 이번 주에 다룰 범위를 먼저 정하고, 끝났다고 판단할 자료를 붙인다. 계획을 지켰는지 확인할 때도 자신을 평가하는 대신 작업량과 결과를 비교한다.

가용 시간을 주간 작업량으로 바꾸기

가용 시간은 하루의 빈칸을 모두 더한 값이 아니다. 생활과 생계를 유지하면서 반복해서 확보할 수 있는 시간이다. 식사와 이동, 돌봄, 구직에 필요한 행정 업무를 뺀 뒤에도 남는 시간을 적는다. 평일에 세 시간을 확보할 수 있다고 해도 주말까지 같은 시간을 쓸 수 있다는 뜻은 아니다. 이 장의 도구는 하루 시간과 주간 활동일 수가 일정하다고 가정한다. 요일별 차이가 크다면 주간 합계를 먼저 구한 뒤 설정에 맞는 값으로 낮춰 잡는다.

시간을 다루는 최소 단위는 30분짜리 칸으로 정한다. 하루 세 시간, 주 5일이면 30칸이다. 이 가운데 일부를 예비 칸으로 남기고 나머지만 활동에 배정한다. 오류를 조사하거나 약속이 길어져도 다른 작업을 바로 밀어내지 않도록 하는 여유다. 예비 칸까지 매번 채워야 하는 목표로 받아들이면 여유를 둔 의미가 사라진다.

30분은 계산 단위일 뿐 집중을 끊는 신호가 아니다. 프로젝트에 네 칸이 배정되었다면 두 시간을 이어서 써도 된다. 반대로 이동 전후의 짧은 시간에 설명 기록을 정리할 수도 있다. 중요한 것은 배정된 시간 안에서 끝낼 작업의 크기를 정하는 일이다. “프로젝트 개선”보다 “내가 맡은 조회 기능에서 수정할 문제 하나를 정하고 이유를 기록하기”가 주간 일정에 넣기 쉽다.

주간 가용 시간에서 예비 시간을 먼저 빼고 남은 시간을 네 활동에 배정한다
이번 주에 할 일과 완료 증거
확인이번 주에 할 일완료 증거
□반복해서 확보할 수 있는 하루 시간과 활동일 수를 적는다.생활 일정이 반영된 주간 가용 시간 메모
□네 활동의 우선순위를 정한다.각 우선순위의 이유를 한 문장씩 적은 기록
□도구를 실행하고 첫 주의 작업을 고른다.생성한 계획표와 활동별 작업 한 줄
□주말에 계획과 실제 결과를 비교한다.완료 증거의 위치와 다음 주 변경 사항

첫 주에는 시간을 더 확보하는 일보다 현재 확보한 시간이 실제로 유지되는지 확인하는 일이 우선이다. 계획에는 15시간을 썼는데 실제로는 9시간만 가능했다면 다음 주에는 9시간을 기준으로 다시 만든다. 남은 6시간을 다음 주에 빚처럼 더하지 않는다. 반복해서 확보되지 않는 시간을 계속 포함하면 이후 계획의 비율도 의미를 잃는다.

단계와 우선순위로 비율 정하기

24주는 점검, CS 메우기, 코딩 테스트, 프로젝트 다듬기, 지원·면접, 입사 후 적응의 여섯 단계로 나눈다. 여기서 CS는 컴퓨터 과학(Computer Science)을 뜻한다. 단계는 그 시기에 가장 먼저 확인할 문제를 나타낸다. 특정 단계가 끝나야 다른 활동을 시작할 수 있다는 조건은 아니다. 초반에도 직무 요구를 살펴볼 수 있고, 지원 기간에도 필요한 학습을 이어 간다.

도구는 단계별 기본 가중치에 개인 우선순위를 더한다. 가중치는 시간을 나눌 때 사용하는 상대적인 수다. 예를 들어 프로젝트 기본값이 5이고 개인 우선순위가 3이면 합산 가중치는 8이다. 가중치가 두 배라고 해서 결과물이 두 배로 늘어나는 것은 아니다. 같은 주의 다른 활동보다 더 많은 시간을 배정한다는 뜻이다.

개인 우선순위는 1부터 3까지 사용한다. 1은 유지할 활동, 2는 보완할 활동, 3은 이번 계획에서 더 집중할 활동이다. 모든 항목을 3으로 정하면 개인 설정으로 활동 간 차이를 만들기 어렵다. 먼저 현재 지원 준비를 막고 있는 문제를 한 가지 고른다. 프로젝트 설명이 불분명하다면 프로젝트에, 제한 시간 안에 풀이를 마치기 어렵다면 코딩 테스트에 더 높은 값을 준다.

24주 단계별 중심 활동과 남길 증거
주차단계중심 활동완료 증거 예시
1~2주점검시간과 작업 범위 확인가용 시간표와 첫 주 결과 비교
3~6주CS 메우기프로젝트와 연결할 학습 선정학습 질문과 설명 기록
7~10주코딩 테스트풀이와 복습 시간 확보풀이 기록과 실패 원인
11~16주프로젝트 다듬기개선 작업의 범위 제한변경 내역과 확인 결과
17~20주지원·면접지원 준비와 회고 반복지원 기록과 답변 수정 내역
21~24주입사 후 적응업무 학습 또는 지원 지속입사 시 업무 기록, 미입사 시 지원 기록

각 활동의 구체적인 공부법과 산출물 작성법은 뒤에서 다룬다. 지금은 달력에 들어갈 범위만 정한다. 학습 칸에는 《비전공자를 위한 컴퓨터공학 지도》로 질문의 위치를 찾고 《개발자를 위한 컴퓨터 사이언스》로 설명을 보완할 시간을 둔다. 데이터 관련 질문에는 《데이터베이스 개론》과 SQL 연구소를 연결한다. 한 주에 이 자료를 모두 읽는다는 뜻은 아니다. 이번 주 질문에 맞는 자료 하나를 고르는 기준이다.

코딩 테스트 칸은 《논리로 푸는 알고리즘》과 코드패스에서 고른 학습·풀이·복습에 사용한다. 프로젝트 칸은 《클린 코드 노하우》와 《코드 리뷰 실무》에서 자신의 변경 작업에 필요한 주제를 확인하는 시간으로 연결한다. 지원 칸에는 《개발자 실무 면접》을 참고해 설명을 준비하고 기록할 시간을 둔다. 자료를 추가할 때에는 기존 칸 안에서 교체한다. 자료 수가 늘었다는 이유로 하루 가용 시간을 늘려 적지 않는다.

쉬는 주와 점검 주를 계획에 넣기

이 장의 쉬는 주는 8주, 16주, 24주다. 해당 주에는 전체 가용 칸의 절반만 계획에 사용한다. 나머지 절반은 비워 둔다. 쉬는 주에 밀린 작업을 전부 옮겨 넣으면 실제로는 평소보다 바쁜 주가 된다. 꼭 유지할 작업을 고르고, 나머지는 없애거나 이후 주의 다른 작업과 교체한다.

점검 주는 4주, 12주, 20주다. 전체 가용 시간은 유지하되 예비 칸을 약 3분의 1로 늘린다. 이 칸은 지난 결과를 확인하고 다음 범위를 고치는 데 쓴다. 일반 주에는 약 5분의 1을 예비 칸으로 둔다. 칸 수가 정수여서 나눗셈의 나머지는 활동 시간에 남을 수 있다. 이 비율은 이 도구의 운영 규칙이며 모든 사람에게 맞는 기준은 아니다.

점검할 때는 계획 시간, 실제 사용 시간, 완료 증거를 함께 본다. 시간을 충분히 썼는데 증거가 없다면 작업의 종료 조건이 모호했을 수 있다. 증거는 있는데 시간이 과하게 들었다면 다음 작업을 더 작게 나눌 수 있다. 가용 시간이 줄었다면 배분 비율을 바꾸기 전에 전체 칸 수부터 낮춘다.

점검 주에는 확인 시간을 늘리고 쉬는 주에는 전체 계획량을 줄인다

입사 후 적응 단계의 달력은 입사일부터 다시 잡는다. 21주에 입사했다면 이 계획의 마지막 네 주는 입사 후 첫 90일 중 일부에 해당한다. 90일 전체가 이 24주 안에 포함되는 것은 아니다. 아직 입사하지 않았다면 뒤에 나오는 설정값을 바꾸어 지원·면접 단계를 이어 간다. 달력의 이름만 적응으로 바꾸고 실제로 하지 않은 업무 경험을 증거로 남기지 않는다.

완성 코드

다음 내용을 main.py로 저장한다. 입력을 기다리거나 현재 날짜를 읽지 않으므로 같은 설정에서는 항상 같은 결과가 나온다. 기본 설정은 하루 세 시간, 주 5일이다. 출력의 숫자는 모두 30분 단위 칸 수이며, 네 활동의 열 순서는 학습·코딩 테스트·프로젝트·지원이다. 예비 칸은 별도 열로 표시한다.

STARTED_JOB은 마지막 네 주를 입사 후 적응으로 표시할지 정하는 예시 설정이다. 기본값은 True다. 아직 입사하지 않았다면 False로 바꾼다. 이 값은 취업 가능성을 계산하지 않으며, 개인 우선순위도 채용 평가 점수가 아니다.

ACTIVITIES = ("학습", "코테", "프로젝트", "지원")
DAILY_HOURS = 3
DAYS_PER_WEEK = 5
PRIORITIES = (1, 2, 3, 2)
STARTED_JOB = True

PHASES = (
    (2, "점검", (3, 1, 3, 1)),
    (6, "CS 메우기", (5, 2, 2, 1)),
    (10, "코딩 테스트", (2, 5, 2, 1)),
    (16, "프로젝트 다듬기", (2, 2, 5, 1)),
    (20, "지원·면접", (1, 2, 3, 5)),
    (24, "입사 후 적응", (4, 1, 4, 1)),
)
REST_WEEKS = (8, 16, 24)
REVIEW_WEEKS = (4, 12, 20)


def validate_settings():
    if type(DAILY_HOURS) is not int or not 1 <= DAILY_HOURS <= 8:
        raise ValueError("하루 시간은 1~8 사이의 정수여야 한다.")
    if type(DAYS_PER_WEEK) is not int or not 1 <= DAYS_PER_WEEK <= 7:
        raise ValueError("활동일은 1~7 사이의 정수여야 한다.")
    if len(PRIORITIES) != len(ACTIVITIES):
        raise ValueError("우선순위는 활동별로 네 개가 필요하다.")
    if any(type(value) is not int or not 1 <= value <= 3
           for value in PRIORITIES):
        raise ValueError("우선순위는 1~3 사이의 정수여야 한다.")
    if type(STARTED_JOB) is not bool:
        raise ValueError("입사 여부는 True 또는 False여야 한다.")


def phase_for(week):
    for end_week, name, base_weights in PHASES:
        if week <= end_week:
            if end_week == 24 and not STARTED_JOB:
                return PHASES[4][1], PHASES[4][2]
            return name, base_weights
    raise ValueError("주차는 1~24 범위여야 한다.")


def allocate(slots, weights):
    total_weight = sum(weights)
    result = [slots * weight // total_weight for weight in weights]
    remainders = [slots * weight % total_weight for weight in weights]
    order = sorted(
        range(len(weights)),
        key=lambda index: (-remainders[index], index),
    )
    remaining = slots - sum(result)
    for index in order[:remaining]:
        result[index] += 1
    return result


def make_plan():
    validate_settings()
    weekly_slots = DAILY_HOURS * DAYS_PER_WEEK * 2
    rows = []
    for week in range(1, 25):
        phase, base_weights = phase_for(week)
        if week in REST_WEEKS:
            mode = "휴식"
            capacity = weekly_slots // 2
        else:
            mode = "점검" if week in REVIEW_WEEKS else "일반"
            capacity = weekly_slots
        reserve = capacity // (3 if mode == "점검" else 5)
        weights = [
            base + priority
            for base, priority in zip(base_weights, PRIORITIES)
        ]
        allocation = allocate(capacity - reserve, weights)
        if sum(allocation) + reserve != capacity:
            raise RuntimeError("주간 배정 합계가 맞지 않는다.")
        rows.append((week, phase, mode, reserve, allocation))
    return weekly_slots, rows


def main():
    weekly_slots, rows = make_plan()
    print("24주 계획표 | 1칸=30분")
    print(f"기본 가용: 주 {weekly_slots}칸")
    print("주 | 단계 | 운영 | 예비 | " + "/".join(ACTIVITIES))
    for week, phase, mode, reserve, allocation in rows:
        amounts = "/".join(str(value) for value in allocation)
        print(f"{week:02d} | {phase} | {mode} | {reserve} | {amounts}")


if __name__ == "__main__":
    main()

줄별 해설

ACTIVITIES부터 STARTED_JOB까지는 독자가 바꿀 설정이다. 활동 이름과 우선순위의 위치가 서로 대응한다. 기본 우선순위 (1, 2, 3, 2)는 프로젝트에 가장 높은 값을 준다. 순서만 보고 착각하지 않도록 설정을 바꾼 이유도 별도 메모에 남긴다. 이 도구는 하루 시간을 정수로만 받는다. 30분 단위의 가용 시간을 직접 입력받는 기능은 연습 문제에서 확장한다.

PHASES의 각 항목은 종료 주차, 단계 이름, 네 활동의 기본 가중치다. 첫 항목의 종료 주차가 2이므로 1주와 2주는 점검 단계가 된다. 그다음 항목은 6이므로 3주부터 6주까지 적용된다. 단계의 종료 주차는 늘어나는 순서여야 한다. 휴식과 점검 주차는 별도로 두어 단계와 운영 방식을 구분한다. 출력에서 단계가 “점검”이고 운영이 “일반”인 첫 주도 이 때문에 가능하다.

validate_settings()는 계산 전에 설정을 확인한다. type(value) is int는 이 예제에서 정수 설정만 허용하기 위한 검사다. Python에서 참·거짓 값이 정수처럼 계산되는 경우도 있지만, 하루 시간에 True를 쓰는 실수는 받아들이지 않는다. 우선순위는 개수와 값의 범위를 모두 검사한다. 잘못된 설정은 그럴듯한 계획표로 바꾸지 않고 오류로 알린다.

phase_for()는 종료 주차를 차례대로 살피고 해당 주의 단계를 돌려준다. 마지막 구간에서 STARTED_JOB이 False이면 지원·면접의 이름과 가중치를 사용한다. 휴식 주차는 그대로 유지되므로 미입사 상태에서도 24주는 줄인 작업량으로 운영한다. 이 함수는 make_plan()이 만드는 1부터 24까지의 주차를 받도록 작성했다.

allocate()는 배분할 칸 수와 가중치를 받는다. 먼저 전체 칸에 각 가중치를 곱하고 가중치 합으로 나눈다. //는 정수 몫을 구하므로 이 단계의 합은 배분할 칸보다 작을 수 있다. %로 구한 나머지가 큰 활동부터 남은 칸을 하나씩 준다. 실제 비율에서 덜 받은 부분이 큰 활동에 남은 칸을 돌려주는 방식이다.

sorted()에 전달한 기준은 나머지의 음수와 활동 위치다. 음수로 바꾼 나머지가 작을수록 원래 나머지는 크다. 나머지가 같으면 활동 위치가 앞선 쪽을 먼저 고른다. 이 규칙 덕분에 동점에서도 결과가 일정하다. 내부에서 만들어지는 가중치는 모두 양수이고 배분할 칸은 음수가 아니므로, 남은 칸은 활동마다 한 칸씩 주는 범위 안에서 처리된다.

make_plan()은 시간 설정을 칸으로 바꾸고 24번 반복한다. range(1, 25)는 끝값 25를 포함하지 않는다. 쉬는 주에는 가용량을 먼저 절반으로 줄이고, 그 안에서 예비 칸을 뺀다. 따라서 기본 설정의 쉬는 주에는 15칸 중 3칸이 예비이고 12칸이 활동에 배정된다. 나머지 15칸은 계획에 넣지 않은 시간이다.

zip()은 단계 가중치와 개인 우선순위를 같은 위치끼리 묶는다. 앞서 길이를 검사했고 기본 가중치도 네 개이므로 각 활동의 합산 가중치를 만들 수 있다. 배분 뒤에는 활동 합계와 예비 칸을 더해 해당 주 가용량과 같은지 확인한다. 이 검사는 계획의 양적 일관성을 확인할 뿐, 작업을 실제로 마칠 수 있다는 보증은 아니다.

main()은 계획을 화면에 출력한다. {week:02d}는 주차를 두 자리로 맞춘다. 목록에 모은 행을 일정한 순서로 출력하므로 실행 시각이나 파일 상태가 결과에 영향을 주지 않는다. 저장 기능은 포함하지 않았다. 남길 계획표는 실행 결과를 복사하거나 셸의 출력 저장 기능을 사용해 보관한다.

실행 결과

기본 설정으로 실행한 결과다. 예를 들어 1주의 학습 6칸은 세 시간이고, 프로젝트 9칸은 네 시간 30분이다. 네 활동 24칸과 예비 6칸을 합하면 기본 가용량 30칸이 된다. 휴식 주에는 합계가 15칸으로 줄어든다.

python3 main.py
24주 계획표 | 1칸=30분
기본 가용: 주 30칸
주 | 단계 | 운영 | 예비 | 학습/코테/프로젝트/지원
01 | 점검 | 일반 | 6 | 6/5/9/4
02 | 점검 | 일반 | 6 | 6/5/9/4
03 | CS 메우기 | 일반 | 6 | 8/5/7/4
04 | CS 메우기 | 점검 | 10 | 7/4/6/3
05 | CS 메우기 | 일반 | 6 | 8/5/7/4
06 | CS 메우기 | 일반 | 6 | 8/5/7/4
07 | 코딩 테스트 | 일반 | 6 | 4/9/7/4
08 | 코딩 테스트 | 휴식 | 3 | 2/5/3/2
09 | 코딩 테스트 | 일반 | 6 | 4/9/7/4
10 | 코딩 테스트 | 일반 | 6 | 4/9/7/4
11 | 프로젝트 다듬기 | 일반 | 6 | 4/5/11/4
12 | 프로젝트 다듬기 | 점검 | 10 | 3/5/9/3
13 | 프로젝트 다듬기 | 일반 | 6 | 4/5/11/4
14 | 프로젝트 다듬기 | 일반 | 6 | 4/5/11/4
15 | 프로젝트 다듬기 | 일반 | 6 | 4/5/11/4
16 | 프로젝트 다듬기 | 휴식 | 3 | 2/3/5/2
17 | 지원·면접 | 일반 | 6 | 2/5/8/9
18 | 지원·면접 | 일반 | 6 | 2/5/8/9
19 | 지원·면접 | 일반 | 6 | 2/5/8/9
20 | 지원·면접 | 점검 | 10 | 2/4/6/8
21 | 입사 후 적응 | 일반 | 6 | 7/4/9/4
22 | 입사 후 적응 | 일반 | 6 | 7/4/9/4
23 | 입사 후 적응 | 일반 | 6 | 7/4/9/4
24 | 입사 후 적응 | 휴식 | 3 | 3/2/5/2

입사 후에는 학습 칸을 업무 이해에, 프로젝트 칸을 맡은 작은 변경과 확인에 사용할 수 있다. 지원 칸은 계속 지원하는 상황이 아니라면 개인 경력 기록과 설명 정리에 사용한다. 회사 업무 시간은 개인 가용 시간과 섞지 않는다. 입사 뒤 생활이 달라졌다면 하루 시간과 활동일 수를 먼저 줄여 다시 실행한다. 업무 기록에는 회사의 비공개 코드나 자료를 옮기지 않고 자신이 배운 점과 확인한 절차를 남긴다.

실무에서 자주 틀리는 것

활동마다 반올림해 합계가 달라진다

활동별 비율을 각각 반올림하면 전체 배정량이 원래 칸 수와 달라질 수 있다. 세 칸을 같은 가중치의 네 활동에 나누면서 각각 반올림하면 네 칸이 된다. 정수 몫을 먼저 배정하고 남은 칸만 추가해야 주간 가용량을 지킬 수 있다.

# 틀린 코드
slots = 3
weights = (1, 1, 1, 1)
result = [round(slots * weight / sum(weights)) for weight in weights]

# 고친 코드: 완성 코드의 배분 함수를 사용한다.
result = allocate(slots, weights)
# 결과는 [1, 1, 1, 0]이다.

24주를 만든다고 생각하고 23주만 만든다

반복 범위의 끝값은 포함되지 않는다. 1주부터 24주까지 필요하면 끝값을 25로 정한다. 출력 마지막 줄이 24주인지 확인하는 일은 작은 검증이지만 계획표 누락을 찾는 데 도움이 된다.

# 틀린 코드
weeks = list(range(1, 24))

# 고친 코드
weeks = list(range(1, 25))

지난주 미완료 시간을 전부 더한다

미완료 작업을 그대로 더하면 가용 시간보다 많은 계획을 만들게 된다. 먼저 유지할 작업을 고르고 이번 주 작업과 교체한다. 다음 예시는 필요한 작업을 별도 목록에 남기되 자동으로 시간에 더하지 않는 수정이다. 이월 목록에 남겼다고 이번 주 완료를 약속한 것은 아니다.

# 틀린 코드
weekly_slots = 30
unfinished_slots = 10
planned_slots = weekly_slots + unfinished_slots

# 고친 코드
weekly_slots = 30
carryover = ["조회 기능 변경 이유 정리"]
reserve = weekly_slots // 5
planned_slots = weekly_slots - reserve

양수 가중치면 모든 활동에 시간이 생긴다고 생각한다

가용 칸이 적으면 정수 배분 결과가 0인 활동도 생긴다. 가중치는 최소 한 칸을 보장하지 않는다. 이 도구는 주간 합계를 지키는 쪽을 선택한다. 반드시 한 칸이 필요한 활동은 시간표를 검토하면서 다른 활동과 교체하고, 전체 합계를 다시 확인한다.

# 틀린 코드: 가용량보다 배정 합계가 커질 수 있다.
result = allocate(2, (1, 1, 1, 1))
result = [max(1, value) for value in result]

# 고친 코드: 0인 활동을 확인해 수동 조정 대상으로 남긴다.
result = allocate(2, (1, 1, 1, 1))
unassigned = [
    name for name, value in zip(ACTIVITIES, result)
    if value == 0
]

한눈에 보기

계획을 만들고 수정할 때 확인할 기준
항목도구의 규칙독자가 확인할 것
가용 시간하루 시간 × 활동일 × 2칸반복해서 확보 가능한 시간인가
배분단계 가중치에 개인 우선순위를 더한다.지금 가장 큰 준비 공백이 반영되었는가
일반 주가용량의 약 5분의 1을 예비로 둔다.예비 칸을 의무 작업으로 채우지 않았는가
점검 주4·12·20주에 예비 칸을 늘린다.시간과 완료 증거를 함께 비교했는가
쉬는 주8·16·24주의 가용량을 절반으로 줄인다.이월 작업으로 빈 시간을 메우지 않았는가
마지막 구간입사 여부에 따라 단계와 비율을 고른다.입사 후 90일 계획을 별도로 이어 가는가

이 장의 완료 증거는 생성한 24주 계획표, 첫 주의 구체적인 작업 목록, 한 번의 주간 회고다. 계획표만 저장하면 시간 배분은 확인할 수 있지만 실행 가능성은 확인할 수 없다. 첫 주가 끝난 뒤 각 활동에 쓴 시간과 결과물 위치를 한 줄씩 붙여야 다음 수정의 근거가 생긴다. 다음 장에서는 확보한 학습 칸에 넣을 CS 질문을 프로젝트에서 찾아본다.

연습 문제

  1. 기본 설정에서 하루 시간을 두 시간, 활동일 수를 5일로 바꾼다. 일반 주, 점검 주, 쉬는 주의 가용 칸과 예비 칸, 활동 합계가 각각 얼마인지 계산하라.
  2. allocate(7, (3, 2, 1, 1))의 결과를 구하라. 이어서 allocate(3, (1, 1, 1, 1))의 결과와 동점 처리 기준을 설명하라.
  3. 아직 입사하지 않은 상황으로 설정을 바꾼다. 기본 시간과 우선순위를 유지할 때 21주와 24주의 단계, 예비 칸, 활동 배분을 구하라. 24주를 일반 주로 바꾸지 않아야 하는 이유도 적어라.
  4. 하루 시간을 정수 시간으로 받는 대신 30분 단위의 칸 수로 받도록 바꾸어라. 하루 두 시간 30분, 주 4일을 설정하고, 첫 주 프로젝트 칸에서 수행할 작업과 완료 증거를 한 문장씩 작성하라.

정답과 해설

  1. 기본 가용량은 2 * 5 * 2이므로 20칸이다. 일반 주는 예비 4칸과 활동 16칸이다. 점검 주는 20 // 3으로 예비 6칸, 활동 14칸이다. 쉬는 주는 가용량부터 10칸으로 줄이고 그중 예비 2칸, 활동 8칸을 배정한다. 쉬는 주에 계획하지 않은 10칸과 예비 2칸은 서로 다른 몫이다.

  2. 첫 결과는 [3, 2, 1, 1]이다. 가중치 합과 배분할 칸 수가 모두 7이어서 나머지가 없다. 두 번째 결과는 [1, 1, 1, 0]이다. 정수 몫은 모두 0이고 나머지는 모두 3이다. 동점이면 활동 위치가 앞선 순서로 칸을 주므로 앞의 세 활동이 한 칸씩 받는다.

  3. STARTED_JOB = False로 바꾼다. 21주는 지원·면접 단계, 예비 6칸, 배분 2/5/8/9다. 24주는 지원·면접 단계, 예비 3칸, 배분 1/3/4/4다. 입사 여부는 활동의 내용과 비율을 바꾸지만, 미리 확보한 휴식 필요성을 없애지는 않는다. 미완료 지원 작업은 이후 계획의 작업과 교체한다.

  4. DAILY_HOURS 대신 DAILY_SLOTS = 5를 두고 활동일을 4로 정한다. 검증 함수의 시간 검사도 DAILY_SLOTS가 1~16 사이의 정수인지 확인하도록 바꾼다. 주간 계산은 weekly_slots = DAILY_SLOTS * DAYS_PER_WEEK로 수정한다. 이때 기본 가용량은 20칸이고 첫 주 배분은 4/3/6/3, 예비는 4칸이다. 프로젝트 작업은 “내가 맡은 조회 기능의 변경 후보를 한 가지 고른다”로, 완료 증거는 “변경 후보의 위치와 선택 이유를 적은 메모를 남긴다”로 정할 수 있다. 여섯 칸 안에 구현까지 어렵다면 선택과 설명을 이번 주 종료 조건으로 둔다.

댓글 0

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

댓글을 남기려면 로그인이 필요합니다.