BEYOND SW 캠프 15기 8주차 회고

mijuckboon·2025년 3월 15일
post-thumbnail

부트캠프 8주차를 돌아보며 회고를 작성한다.

학습 내용

  1. 자료 구조, 알고리즘
    그래프 자료 구조에 대해 학습하고 정렬, 그래프 탐색, greedy, 동적 프로그래밍, 분할 정복, 백트래킹 등 주요 알고리즘을 학습하였다.
  2. JDBC
    Spring 프레임워크에 대해 본격적으로 학습하기 전, 내부적으로 사용되는 원천 기술인 JDBC에 대해 학습하였다.

배운 점

1. 자료 구조는 알고리즘의 정수

동적 배열은 요소를 자유롭게 추가, 수정, 삭제할 수 있어, 한 번 초기화하면 크기를 변경하는 것이 불가능한 배열에 비해 사용이 편리하다. 사실 그 동적 배열의 내부를 살펴보면 수행할 로직을 미리 작성해둔 정적 배열이다.
스택, 큐, 트리, 그래프 등 여러 자료 구조는 자료를 효율적으로 처리하기 위해 잘 구현해둔 알고리즘의 집합체라고 할 수 있다. 왜 자료 구조와 알고리즘이 한 덩어리로 움직이는 지를 배울 수 있었다.

2. 자료 구조에서의 trade-off

개발 공부를 하다보면 많이 접하게 되는 키워드가 trade-off인데, 자료 구조를 공부하며 여기서도 많은 trade-off가 발생함을 알게 되었다. 배열 형태로 구현할 수 있는 리스트와 우선순위 큐를 비교해보면 다음과 같다.

연산 별 시간 복잡도
  1. ArrayList
  • 접근: O(1)O(1)
  • 삽입, 삭제
    • 마지막 위치: O(1)O(1)
    • 중간: O(N)O(N)
  • 최솟값: O(N)O(N)
  1. LinkedList
  • 접근: O(N)O(N)
  • 삽입, 삭제
    • 시작 또는 마지막 위치: O(1)O(1)
    • 중간: O(N)O(N) (탐색 시간)
    • 삽입, 삭제 자체는 포인터만 바꾸는 O(1)O(1) 연산이므로 ArrayList에 비해 성능이 좋다.
  • 최솟값: O(N)O(N)
  1. PriorityQueue
  • 접근: 인덱스로 접근 불가
  • 삽입: O(logN)O(\log N)
  • 최솟값
    • 접근: O(1)O(1) (peek())
    • 삭제: O(logN)O(\log N) (poll())

내부 구현을 살펴보면 결국 모두 배열 구조일 것이므로, 한 연산의 성능을 유의미하게 개선하면 다른 연산의 성능은 나빠질 수밖에 없다. 따라서 자료 구조는 필요한 연산의 종류와 빈도 등을 고려하여 가장 적절한 것을 선택해야 한다.

DP 유의사항

DP(동적 프로그래밍)은 하나의 문제를 작은 문제로 나누어 해결하는 방식인데, 일반적으로 그 과정에서 점화식이 사용된다. 이때 유한 개의 값만 가지고 규칙을 완전히 결정할 수 없으므로, 수의 규칙으로부터 패턴을 파악하기보다는 모든 nn에 대해 일반화 되는 지를 확인하는 것이 안전하다. 아래는 해당 내용을 다루는 수학 밈 이미지이다.
mathdoge
좀 극단적인 예시이긴 하나, 실제로 f(1)=1,f(2)=3,f(3)=5,f(4)=7f(1) = 1,\, f(2) = 3,\, f(3) = 5,\, f(4) = 7을 만족하는 함수는 무수히 많기 때문에 1,3,5,71,\,3,\,5,\,7만 보고 다음 수를 99라고 섣불리 판단해서는 안된다. (물론 대체로는 99인 경우가 많을 것이다.) 한 가지 덜 억지스러운 예시를 하나 들어본다.

다음 (?) 안에 들어갈 수는?
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, (?)

아마 대부분 피보나치 수열의 규칙에 따라 8989일 것으로 예상했을 것이다. 하지만 주어진 수열이 an=en12a_n = \left \lceil e^{\frac{n-1}{2}} \right \rceil (n0,xn \ge 0,\, \lceil x \rceilxx의 ceiling)이었다면 답은 8989가 아닌 9191이다. (출처: https://oeis.org/A005181) 비교를 위해 파이썬 코드를 이용하여 피보나치 수열과 해당 수열을 20번째 항까지 나열해보았다.

import math

fibonacci = [1, 1] # dp 배열
sequence = []

for i in range(2, 20):
    fibonacci.append(fibonacci[i-2] + fibonacci[i-1])

for i in range(20):
	current = math.ceil(math.exp((i-1)/2))
    sequence.append(current)

print(f'fibonacci: {fibonacci}')
print(f'sequence : {sequence}')

유사 fibonacci
이와 같이 피보나치 수열과 10번째 항까지 일치하지만 11번째 항부터 다른 값을 갖는 수열도 찾을 수 있다.

프로젝트 실무 특강

이번주 수요일 오후 6시부터 10시까지 한화시스템 PM으로 근무중이신 연사님의 특강이 있었다. 수업 이후 특강을 들으려니 많이 피곤했지만, 대기업의 체계적인 프로젝트 관리 방식에 대해 배울 수 있었다. 또, 기업에서 어떤 인재를 원하는 지에 대해서도 많이 말씀해주셨다. 아래에 배운 내용을 정리해본다.

1. 프로젝트는 문서로 시작하여 문서로 끝남

하나의 프로젝트를 관리하기 위해 정말 많은 문서가 작성된다. 사업계획서, 제안 요청서, 제안서, 과업지시서, 요구사항 정의서, 요구사항 명세서, 이슈 보고서, 위험 보고서 등 회사 내부에서도 회사와 고객 간에도 수많은 보고와 서류가 오고간다.

본 부트캠프를 포함하여 몇몇 부트캠프에서는 회고 작성을 중요하게 생각하는데, 여기에는 과거의 기록을 돌아보며 성장하기 위한 일기의 의미도 있지만 서류 작성에 대한 연습의 의미도 있는 듯하다. 필자를 포함하여 이과 출신의 많은 사람들이 글 쓰는 것을 어려워 하는데, 회사에 잘 적응하려면 글을 많이 써보는 것이 좋겠다. 글을 쓰기 위한 주제를 선정하는 것도 쉽지 않은데, 주간 회고는 훌륭한 글감이라고 생각한다.

2. 진행 상황 관리, 요구사항 프리징

진행 상황 관리 방식은 프로젝트 규모에 따라 다른데, 작은 규모의 프로젝트에서는 클라우드에 저장된 엑셀 파일을 편집하는 방식으로 진행된다고 한다. 하지만 엑셀 파일은 구성원 모두가 편집할 수 있기에 정확하게 관리되지 않을 수 있어서, 큰 규모의 프로젝트는 솔루션 혹은 자체 개발한 PMS(프로젝트 관리 시스템)을 통해, PM의 승인을 받아야 완료된 작업으로 처리하는 방식으로 관리된다는 점이 인상적이었다.
또한, 프로젝트가 진행되는 중간에 새로운 요구사항을 반영하려다보면 프로젝트의 진행이 늦어지고 이로 인해 실패 가능성이 높아지므로, 특정 기간 이후에 발생하는 추가 요구사항은 2차 프로젝트에 반영하는 등, 요구사항 프리징을 한다는 내용도 배웠다.

3. 기타 조언

  1. 기본적인 태도의 중요성
    연사님께서는 PM으로 근무하신지만 20여 년 정도 되는 분이었는데, 경험 상 코드 작성에서 문제를 일으킨 개발자는 대체로 지각을 자주 하거나 근무시간에 자리를 오래 비우는 등 기본적인 태도에 문제가 있는 경우가 많았다고 한다.
    회사는 기본적으로 업무 능력이 중요한 곳이지만 기본적인 태도가 훌륭한 직원이라면 약간의 실수는 용인되는 경우도 있고, 능력의 차이가 정말 크지 않다면 태도와 업무 능력은 대체로 비례할 것이다.

  2. PMP 자격증
    회사별로 약간의 차이는 있지만 프로젝트 관리 방법론은 전세계 공용이라고 한다. 특히 대기업의 프로젝트 관리가 이와 같은 방법론을 따르므로, PM 직무에 관심이 있거나 대기업 취업에 관심이 있다면 PMP(프로젝트 관리 전문가) 자격증을 공부해보면 좋을 듯하다. PMP 자격증이 있으면 기업에서 좋아할 것이라고 한다.

  3. 프로젝트에 관한 조언
    인사관리시스템 등 남들 다 하는 뻔한 주제의 프로젝트는 인사 담당자 눈에 들어오지 않는다고 한다. 뻔한 시스템을 직접 구현해보는 것은 별로 의미가 없어서 만약 한다면 사용한 기술 및 차별점을 잘 어필해야 하고, 그보다는 상용화된 시스템을 분석해보고 가장 잘 나가는 솔루션 만의 차별점을 분석해보는 것이 좋다고 한다.
    또, 책이나 부트캠프 수강에 비해 실무에 더 도움이 될만한 공부를 원하였다. 부트캠프는 기본적인 실력을 갖추기 위한 과정으로 생각하며 열심히 다니고, 수료 후에도 취업 준비를 계속 한다면 실무에 연관된 보다 깊은 내용을 찾아보며 실습해봐야 할 듯하다.

프로젝트 팀 리빌딩

이번주 금요일에는 지난 1차 프로젝트를 함께한 팀을 떠나 백엔드 및 프론트엔드 프로젝트를 함께 할 2차 팀원을 만났다. 지난 팀원들이 좋았기에 헤어지는 게 좀 아쉽지만, 다양한 사람들을 만나 네트워크를 형성하는 것이 중요하니 새로운 팀에서 잘 적응해봐야 겠다. 아무래도 같은 팀이 아니면 이야기를 나눌 일이 별로 없어서 서로에 대해 잘 알기가 어려운데, 새로운 사람들과 연을 맺고 알아갈 수 있어서 좋다.
팀원들의 이전 소속팀이 대부분 다르다보니, 각자의 프로젝트 경험을 공유하며 여러 차이점을 발견할 수 있었다. 지난 프로젝트와는 다른 새로운 방식이나 도구를 적용해보게 되어 이번 프로젝트가 기대된다. 금요일에 진행된 첫 회의에서의 아이스 브레이킹이나 진도가 조금 아쉽긴 하지만, 앞으로 잘 하면 충분히 보완할 수 있을 것으로 생각한다. 함께 할 2차 및 3차 프로젝트에서 좋은 결과물을 낼 수 있도록 최선을 다할 생각이다.

느낀 점

  1. 코테 준비에 보강이 필요하다.
    그동안 수업시간에 주어지는 실습 문제들은 대체로 수업 시간 내에 해결이 가능했는데, 알고리즘 수업에서 주어진 백준 실습 문제는 다소 난이도가 있어 일부 문제는 아직 풀어보지도 못했다.
    알고리즘 공부는 주로 python으로 백준 단계별로 풀어보기, class 문제 등을 따라 풀며 진행했는데, 아직 목표치까지 완주하지 못해 트리, 그래프 카테고리에 속하는 문제 및 어려운 문제에 대한 경험이 부족하다. 프로젝트 준비와 병행하려면 꽤 바쁘겠지만, 알고리즘 문제 풀이 감각 유지를 위해 1주일에 5문제 정도라도 꾸준히 풀어봐야겠다.

  2. 파일 시스템은 많은 파일을 관리하기에 적합하지 않다.
    이번주에는 "백준허브" 크롬 확장 프로그램을 활용하여 기존에 백준에서 python으로 작성한 알고리즘 문제 코드, 프로그래머스에서 작성한 SQL 문제 코드 등을 정리하는 시간을 가졌다. 특히 백준 알고리즘 문제는 단계별로 풀어보기 및 클래스 정보를 모두 관리하고 싶었는데, 전체 문제 수가 꽤 되다보니 파일 시스템으로 관리하는 게 불편하다고 느꼈다. 우선은 아래와 같이 정리했는데, 중복된 내용을 서로 다른 파일로 저장 중이다.
    파일 시스템
    다른 공부할 것들도 많기에 우선은 이 상태로 두고, 나중에 스프레드시트 혹은 관계형 DB를 이용한 효율적인 관리 체계를 구축해볼 생각이다. 관리 체계를 잘 잡으면 boj01000.py 파일만 저장하더라도 단계별로 풀어보기, 클래스 정보 관리에 원하는 순서대로 정렬까지 가능하며, 심지어 같은 문제를 푼 java 코드도 함께 관리할 수 있을 것이다.

  3. 부트캠프에 꽤나 몰입 중이다.
    약 2개월 가까이 주어진 일정 소화 및 귀가 후 공부 등 대부분의 시간을 부트캠프와 관련있는 작업을 하며 보냈다. 그렇게 지내다보니 몇 번은 부트캠프 관련 꿈을 꾸기도 했는데, 자면서도 생각날 만큼 많이 몰입 중이구나 싶었다. 시간은 한 번 지나가면 돌이킬 수 없다. 부트캠프 수강 또한 그러하니, 남은 기간에도 몰입하며 최대한 많은 것을 배워가야겠다.

profile
곽진웅, 백엔드 개발자 준비 중

2개의 댓글

comment-user-thumbnail
2025년 3월 16일

일정이 맞지 않아 아쉽게도 프로젝트 실무 특강을 수강하지 못했는데 정말 유용한 정보 제공해 주셔서 감사합니다!!

항상 멀리서나마 진웅님의 열정 넘치는 모습을 보며 한번쯤 같이 코드리뷰를 하거나 프로젝트를 진행해보고 싶었는데 이번에 함께되어 너무 좋습니다. 함께 하는동안 부족하지만 노력하는 모습 보여드리도록 하겠습니다!!

1개의 답글