728x90

**Disclaimer - AMD GPU 관련 정보는 전부 Disregard 하세요.

sudo apt install git
sudo apt install openjdk-11-jdk
sudo apt install apt-transport-https curl gnupg
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo apt update && sudo apt install bazel-3.7.2
sudo unlink /usr/bin/bazel
sudo ln -s /usr/bin/bazel-3.7.2 /usr/bin/bazel

 

bazel --version

https://github.com/bazelbuild/bazel/releases/tag/3.7.2

chmod +x bazel-3.7.2-installer-linux-x86_64.sh
sudo ./bazel-3.7.2-installer-linux-x86_64.sh
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout r2.7
sudo apt install python3-pip
pip3 install six numpy wheel
pip3 install keras_preprocessing

 

for AMD GPU user only.

sudo apt install libnuma-dev
sudo apt install llvm

https://www.amd.com/en/support/kb/release-notes/rn-amdgpu-unified-linux-22-20

 

Radeon™ Software for Linux® 22.20 Release Notes

Article Number RN-AMDGPU-UNIFIED-LINUX-22-20 Release Date: June 28, 2022 This article provides information on the latest version of Radeon™ Software for Linux®. Radeon™ Software for Linux® 22.20 Highlights Introducing support for Ubuntu 22.04 and Ubu

www.amd.com

sudo amdgpu-install --usecase=rocm,hip,mllib --no-dkms

관련문서
https://amdgpu-install.readthedocs.io/en/latest/install-script.html#

sudo usermod -a -G video $LOGNAME
sudo usermod -a -G render $LOGNAME
sudo reboot
apt show rocm-libs
echo 'export PATH=$PATH:/opt/rocm/bin:/opt/rocm/profiler/bin:/opt/rocm/opencl/bin' | sudo tee -a /etc/profile.d/rocm.sh
sudo ldconfig

Tensorflow pre-install configuration

./configure
infinity@infinity-ubuntu:~/tensorflow$ ./configure
You have bazel 3.7.2 installed.
Please specify the location of python. [Default is /usr/bin/python3]: 


Found possible Python library paths:
  /usr/lib/python3/dist-packages
  /usr/local/lib/python3.8/dist-packages
Please input the desired Python library path to use.  Default is [/usr/lib/python3/dist-packages]

Do you wish to build TensorFlow with ROCm support? [y/N]: y
ROCm support will be enabled for TensorFlow.

Do you wish to build TensorFlow with CUDA support? [y/N]: n
No CUDA support will be enabled for TensorFlow.

Do you wish to download a fresh release of clang? (Experimental) [y/N]: n
Clang will not be downloaded.

Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -Wno-sign-compare]: 


Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: n
Not configuring the WORKSPACE for Android builds.

Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.
	--config=mkl         	# Build with MKL support.
	--config=mkl_aarch64 	# Build with oneDNN and Compute Library for the Arm Architecture (ACL).
	--config=monolithic  	# Config for mostly static monolithic build.
	--config=numa        	# Build with NUMA support.
	--config=dynamic_kernels	# (Experimental) Build kernels into separate shared objects.
	--config=v1          	# Build with TensorFlow 1 API instead of TF 2 API.
Preconfigured Bazel build configs to DISABLE default on features:
	--config=nogcp       	# Disable GCP support.
	--config=nonccl      	# Disable NVIDIA NCCL support.
Configuration finished
bazel clean --expunge
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

for AMD user Only

sudo apt install rocm-libs miopen-hip
bazel build --config=opt --config=rocm //tensorflow/tools/pip_package:build_pip_package

 

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
ERROR: tensorflow-rocm 2.11.0.540 has requirement flatbuffers>=2.0, but you'll have flatbuffers 1.12 which is incompatible.
ERROR: tensorflow-rocm 2.11.0.540 has requirement keras<2.12,>=2.11.0, but you'll have keras 2.9.0 which is incompatible.
ERROR: tensorflow-rocm 2.11.0.540 has requirement tensorboard<2.12,>=2.11, but you'll have tensorboard 2.9.1 which is incompatible.
ERROR: tensorflow-rocm 2.11.0.540 has requirement tensorflow-estimator<2.12,>=2.11.0, but you'll have tensorflow-estimator 2.9.0 which is incompatible.
pip3 install --upgrade /tmp/tensorflow_pkg/tensorflow-2.9.3-cp38-cp38-linux_x86_64.whl

'Dev_Note > Krafton Jungle' 카테고리의 다른 글

아이디어 피칭 방법과 순서  (0) 2023.01.29
vue.js + electron 개발 환경 세팅  (0) 2023.01.24
OpenCV 개발환경 세팅  (0) 2023.01.20
Project RoomFit Figma Wireframe  (0) 2023.01.20
Reminder : 팀 리더로서의 역할  (0) 2023.01.20
728x90

Baseline

infinity@infinity-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.5 LTS
Release:	20.04
Codename:	focal

 

OpenCV Dependencies

1. Ubuntu repo update/upgrade

sudo apt-get update && sudo apt-get upgrade

2. Install cmake

sudo apt-get install build-essential cmake

3. Install pkg-config

sudo apt-get install pkg-config

4. Extra dependencies

sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev
sudo apt-get install ffmpeg libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev
sudo apt-get install libv4l-dev v4l-utils
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install libgtk-3-dev
sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev
sudo apt-get install libatlas-base-dev gfortran libeigen3-dev
sudo apt-get install python3-dev python3-numpy

 

Install OpenCV

1. Download OpenCV source / OpenCV contrib

cd ~
mkdir opencv
cd opencv
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zip

2. Unzip

unzip opencv.zip
unzip opencv_contrib.zip

3. cmake Config OpenCV compile settings

cd opencv-4.4.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=OFF -D WITH_IPP=OFF -D WITH_1394=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D BUILD_PACKAGE=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D WITH_QT=OFF -D WITH_GTK=ON -D WITH_OPENGL=ON -D BUILD_opencv_python3=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.4.0/modules -D WITH_V4L=ON  -D WITH_FFMPEG=ON -D WITH_XINE=ON -D OPENCV_ENABLE_NONFREE=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D OPENCV_SKIP_PYTHON_LOADER=ON -D OPENCV_GENERATE_PKGCONFIG=ON ../

Mac OS 에서 zlib 관련 오류시 옵션 추가

 -D BUILD_ZLIB=OFF

4. compile

make

5. install

sudo make install

 

python3 import cv2 version check

infinity@infinity-ubuntu:~$ python3
Python 3.8.10 (default, Nov 14 2022, 12:59:47) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
4.4.0
>>> exit()

 

728x90

https://www.figma.com/proto/48AH4xyTxGILCdhq0RO9So/Roomfit-Wireframe?node-id=0%3A2&starting-point-node-id=0%3A2 

 

Figma

Created with Figma

www.figma.com


프로토타입 혹은 와이어프레임의 목적

  1. 프로젝트를 진행하기에 앞서 구성원들에게 프로젝트의 궁극적인 방향과 최종 목표를 가시적으로 제공 해 줄수 있다는 점에서 훌륭한 수단이다.

  2. 유즈케이스 시나리오와 그에 상응하는 페이지 구성을 가시적으로 만들어 봄으로서, 프로젝트 진행도중 미쳐 생각하지 못했던 사용 시나리오를 급하게 생각해내야 할 상황을 미연에 방지 할 수 있다.

  3. 프론트엔드 작업시 가이드라인이 된다. 많은 프로토타이핑 툴들이 최소한의 CSS 속성 Export부터 더 나아가서는 코드로 변환해주는 기능들을 지원하고 있다.

  4. 세부적인 디자인 요소를 미리 정해두고, 인터페이스를 정의해 둚으로서 백엔드-프론트엔드 협업시 잘못된 소통에 의한
    상호 충돌을 방지하고 매끄러운 연결을 도와준다.
728x90

프로젝트의 책임자이자 리더로서 기획한 프로젝트의 결과물이 잘 나오도록 하는것이 가장 1차적인 목표이지만
경험상, 프로젝트의 인적, 시간적, 역량적인 자원은 "언제나" 한정되어있고 "이상"과는 거리가 멀기 때문에 가지고 있는 자원을
최대한 활용하여 가진 리소스 안에서 최대의 결과물을 내도록 하는 것이 가장 중요하다.

물론 팀장의 기술적 역량이 아주 뛰어나 흔히 "캐리" 할 수 있는 상황도 있겠지만, 현실은 그렇지 못하고
더욱이 프로젝트의 규모가 커지고, 코드베이스가 대규모 일 수록 아무리 뛰어난 한명의 기술자라도
그 모든 것을 커버하는 것은 불가능하다.

그렇기에 팀장으로서 기술적 역량과는 별개로 인적 자원을 다루는데는 많은 요령이 요구된다.

팀장으로서 모든 사람이 같은 수준의 프로그래밍 기술을 가지고 있는 것은 아니라는 것을 인식하는 것이 중요하며,
경험이 적을 수 있는 사람들과 협력하고 지원할 수 있는 방법을 찾는 것이 중요하다.

  1. 명확한 지침과 가이드라인을 제공하기

    팀원 모두가 프로젝트의 궁극적인 목표와 그 목적에 대해 그들이 무엇을 해야 하는지에 대해 이해하고 있도록 한다.
    태스크에 대한 명확한 지침을 제공하고, 팀원 각각이 그들이 무엇을 해야 하는지를 명확하게 이해하도록 유도해야 한다.

  2. 기술 수준에 따라 작업 할당하기

    팀 구성원의 기술 수준 및 경험과 일치하는 태스크를 할당하는 것이 중요하다.
    설령 팀 구성 당시 팀원의 기술적인 숙련도가 미흡하더라도, 역량에 맞는 태스크를 할당하는 것은
    팀원으로 하여금 스스로에 대한 확신과 자신감을 심어 줄 수 있고,
    그것은 궁극적으로 시간에 지남에 따라 해당 팀원의 기술 수준을 성장시켜 줄 수 있는 동력원이 된다. 

  3. 교육 및 리소스 제공하기

    팀원들이 스킬 향상에 필요한 교육 및 리소스에 접근 할 수 있도록 한다.
    프로젝트 주제와 사용되는 기술 스택에 대한 튜토리얼, 레퍼런스 코드 또는 경험이 풍부한 팀 구성원의 멘토링 등을 제공한다.

  4. 협업 및 커뮤니케이션 장려

    팀원들이 함께 협업하고 공개적으로 의사소통할 수 있도록 격려하는 것 또한 팀 리더로서의 역할이다.
    이것은 모든 구성원들이 서로에게서 배울 수 있는 상호 지원적인 환경을 만드는데 필수적이다.

  5. 인내심을 갖고 이해하기

    팀의 목표를 달성하는 것이 궁극적인 목적이긴 하나, 팀 리더로서 팀원을 이끌고 포용하는 것 또한 중요한 역할 중 하나이다.
    어려움을 겪고 있는 팀원들에게 인내심을 갖고 이해하며, 지원과 격려를 제공한다.
728x90

  • 최단 경로 알고리즘 Shortest Path Algorithm
  • 다익스트라 Dijkstra 알고리즘
  • 벨만-포드 Bellman-Ford 알고리즘
  • 플로이드-워셜 Floyd-Warshall 알고리즘
  • 최소 신장 트리 MST Minimum Spanning Tree 
  • 단일 출발지 최단 경로 SSP : Single Source Shortest Path
  • 모든 쌍의 최단 경로 ASP : All Pairs Shortest Path
728x90

  • 그래프 탐색
  • DFS 깊이 우선 탐색
  • BFS 너비 우선 탐색
728x90

  • 스패닝 트리 Spanning Tree
  • 최소 신장 트리 MST Minimum Spanning Tree
  • 크루스칼 Kruskal 알고리즘
  • 프림 Prim 알고리즘
728x90

  • 그래프 종류
  • 단방향 그래프
  • 무방향 그래프
  • 연결 그래프
  • 단절 그래프
  • 완전 그래프
  • 인접행렬
  • 인접리스트
728x90

  • 트리
  • 이진트리
  • 이진 검색 트리
  • 균형 검색 트리 (AVL Tree, Red-Black Tree, B-Tree, 2-3 Tree)
  • BFS 너비 우선 탐색
  • DFS 깊이 우선 탐색
  • 전위 순회 Pre Order
  • 중위 순회 In Order
  • 후위 순회 Post Order
728x90

  • 스택 Stack (LIFO : Last In First Out)
  • 큐 Queue (FIFO : First In First Out)
  • 우선순위 큐 Priority Queue
  • 양방향 대기열 덱 Deque(Double Ended Queue)
728x90

  • 정렬 알고리즘 Sorting Algorithm
  • 선택정렬
  • 삽입정렬
  • 버블정렬 칵테일정렬
  • 퀵정렬
  • 병합정렬
  • 힙정렬
  • 트리정렬
  • 기수정렬
  • 도수정렬
  • 셸정렬
  • 시간복잡도
728x90

 

  • 배열 탐색
  • 선형탐색
  • 이진탐색
  • 해시법
  • 시간복잡도
  • 연결리스트 탐색
  • 이진 검색트리 탐색
728x90

728x90

arr 라는 리스트에 n개의 정수를 입력 받을때

1. 가장 원시적인 방법 (temp 변수에 받아 리스트에 append.)

for i in range(n):
    a = int(input())
    arr.append(a)

2. 바로 배열에 입력(append의 매개 변수로 input()전달)

for _ in range(n):
    arr.append(int(input()))

 

3.  For 문이 내포된 리스트 입력

arr = [int(input()) for _ in range(int(n))]

 

*4. For 문이 내포된 2차원 입력 (2차원 배열)

n = int(input())
a = [[*map(int, input().split())] for _ in range(n)]

 

C 언어스러운 사고방식을 버리고 Python스러운 코드작성을 위해 노력하는중.

728x90

1. max(0, n) : 최대값 함수를 이용해 0과 비교하면 양수는 그대로 나오고 음수는 0으로 대체되어 나온다.

 

2. (abs(n) + n )/2 : 절대값 n 과 n을 더한뒤 2로 나누면, 양수는 그대로 나오고 음수는 0으로 대체되어 나온다.

728x90
from typing import Any, Sequence


def bin_search(a: Sequence, key: Any) -> int:
    a.sort()  # 이진 탐색은 정렬된 배열을 탐색할때 가장 빠르다. 받아온 배열을 정렬.
    pl = 0  # p left 는 인덱스 0 에서 부터 시작
    pr = len(a) - 1  # p right 는 가장 마지막 인덱스 에서 시작

    while True:
        pc = (pl + pr) // 2  # p center은 가운데 인덱스 에서 시작
        if a[pc] == key:  # 검색값이 a배열의 중앙 요소와 같으면
            return 1  # 1 반환
        elif a[pc] < key:  # 검색값이 a배열 중앙 요소 보다 작으면
            pl = pc + 1  # 새로운 p left 인덱스를 중앙인덱스 보다 오른쪽으로 옮겨줌 (우측 탐색)
        else:
            pr = pc - 1  # 검색값이 a배열 중앙 요소 보다 크면, 새로운 p right 인덱스를 중앙인덱스 보다 왼쪽으로 옮겨줌 (좌측 탐색)
        if pl > pr:  # p left 인덱스와, p right 인덱스가 교차하면, 배열안에 검색값이 없다는 뜻
            return 0


num = int(input('원소 수를 입력하세요 : '))
x = [None] * num

print('배열 데이터 입력')

for i in range(num):
    x[i] = int(input(f'x[{i}] : '))

ky = int(input('검색 할 값을 입력하세요 : '))

idx = bin_search(x, ky)

if idx == 0:
    print('검색값을 갖는 원소가 존재하지 않습니다.')
else:
    print(f'검색값이 있습니다.')

 

이진 탐색의 조건 : 탐색 대상의 데이터가 정렬된 상태여야 한다.

 

이진 탐색의 종료 조건

    1.  a[중앙인덱스] == key 일때

    2. 검색 범위가 더 이상 없을 경우 : p left 와 p right 가 크로스 될 경우

728x90
import copy


def seq_search(seq, key):
    print("검색 함수 호출됨!")
    a = copy.deepcopy(seq)
    a.append(key)  # 보초키를 추가 (검색할 값을 마지막 인덱스에 추가)
    print(f'복사되어 보초값 추가된 배열 by.deepcopy : {a}')

    k = 0
    while True:  # k 값을 추가 시키면서 탐색 대상 배열 순회
        # print("seq_search : While Loop 진입")
        print(f'탐색중인 인덱스 : {k}')
        if a[k] == key:
            break
        k += 1
    return -1 if k == len(seq) else k
    # 있으면 해당 값의 인덱스 값을 반환 (배열 길이와 비교하여 나온 값이 보초키값일 경우는 -1 반환)


num = int(input("원소 수를 입력하세요 : "))
x = [None] * num  # 원소 수가 num인 배열을 생성

for i in range(num):
    x[i] = int(input(f'x[{i}] : '))

ky = int(input('검색할 값을 입력하세요 : '))

idx = seq_search(x, ky)

if idx == -1:
    print("검색값을 갖는 원소가 존재하지 않습니다.")
else:
    print(f"검색값은 x[{idx}]에 있습니다.")

 

선형 탐색은 탐색시 마다 2가지 종료 조건을 체크 하게 된다

    1. 검색값이 없을 때 : 즉 검색 대상 배열의 끝 도달

    2. 검색 값이 있을 때

 

보초법(Sentinel Method)를 사용하면, 검색할 키값을 대상 배열의 끝에 미리 추가 해둔뒤

원본 검색 대상 배열의 원래 인덱스 크기 보다 검색된 키 값이 있는 배열의 인덱스 크기가 더 크면

검색값이 없는 것으로 취급하는 방법으로 매 탐색 if 분기중 검색값이 없을때를 제외시킴으로 검색 비용을 감소 시킬 수 있다

728x90

728x90

728x90

728x90

728x90

728x90

728x90

728x90

728x90

 

크래프톤 정글 1주차 알고리즘 커리큘럼에 들어가기 앞서 파이썬 문법에 대해 조금 더 공부해야겠다는 생각이 들었다.

 

대다수 동기들은 코딩 학원이나 여타 교육기관을 통해 "파이썬"을 어느정도 공부하고 들어온 분들이 대다수였다.

 

 

전공자로서 파이썬을 다뤄보지 않은 것은 아니지만,

 

학부 3,4학년 즈음 신설된 데이터분석시각화,빅데이터 시스템 설계 등의 과목에서

 

pandas 와 matplotlib, numpy 등의 라이브러리를 사용해보고

 

졸업작품에서 OpenCV 기반의 얼굴인식 프로그램을 위해 간략하게 다뤄본것이 전부였기 때문에

 

파이썬 전반의 자세한 문법과, 함수사용법, 자료형에 대해 익숙하지 않았기에 파이썬 기본서를 찾아보게 되었다.

 

 

그러던 중 찾게 된 서적은 한빛미디어, 윤인성 저의 혼자 공부하는 파이썬.

 

https://bit.ly/3fjh70m

 

혼자 공부하는 파이썬(개정판)

어쩌다가 책을 집필/번역하기 시작해서 지금까지 계속해서 집필/번역하고 있다. 현재 직업 특성상 집에서 나갈 이유가 없다는 것에 매우 만족하고 있다. 커피와 홍차를 즐겨 마신다. 요리, 피아

books.google.co.jp

 

Google 도서에서 15,840원에 구매 할 수 있으며

 

기본적인 파이썬 공부 환경 세팅 부터 시작하여

 

1. 자료형

2. 조건문

3. 반복문

4. 함수

5. 예외 처리

6. 모듈

7. 클래스

 

로 구성된 큰 챕터로 중간중간 파이썬 코딩에 대한 꿀팁과 리스트, 딕셔너리, 튜플과 각종 반복문/조건문을 조합하여

 

"파이썬" 스러운 코드를 짜는 방법을 자연스럽게 알려주는 책이다.

 

C언어와 같은 기본적인 프로그래밍 언어에 대한 기초 지식과 파이썬을 간단하게나마 다루어 보았던 사람이라면

 

3~4일정도면 완독이 가능할 듯 하며

 

피보나치 수열, 팩토리얼, 하노이의 탑 등 파이썬을 이용한 기본적인 알고리즘 문제들도

 

챕터 내용 사이에 자연스럽게 녹여둔 서적으로

 

파이썬을 공부하는 사람이라면 소장하고 있으면 앞으로 몇번씩은 되짚어볼 서적이라고 생각된다.

 

728x90
Krafton Jungle은 KAIST SW사관학교 정글과 MOU계약을 맺어 동일하게 진행되는 Krafton사의 교육 프로그램이다.

나의 이공계로의 첫발은 초등학교 때 부터였다. 4월 과학의 달이면 매년 고무동력기 경진대회와, 라디오 만들기, 과학상자 등으로 만들어 내는 즐거움과 수상의 기쁨을 나에게 알려주었던 그 시절이 앞으로 내가 이공계로서의 길을 걸어야 겠다고 나 스스로를 납득시켰던 최초의 사건이었다고 생각한다. 부모님의 교육에 대한 열정과 남들보다 조금 일찍 가지게 되었던 학업에 대한 관심 덕에 서울시 교육청에서 진행하는 영재교육 프로그램에서 소위 말하는 본격적인 엘리트 코스를 경험하게 되었고, 이러한 경험은 자연스럽게 중학교때에도 이어져 서울대 영재교육원을 다니며 나와 같은 관심을 가지고 같은 길을 걸어가는 친구들과 함께 열정을 공유하는 경험을 할 수 있었다.

하지만 지나치게 불씨를 일찍 당겼던 탓일까, 아니면 그 모든 열정의 끝에는 결국 합격과 불합격이라는 평가의 관문이 있었기 때문일까, 나의 소위 "엘리트 코스" 에서의 여정은 중학교에서 막을 내렸다. 흥미가 가는 분야에만 집중하는 성격 탓이기도 하고 학교의 친구들과는 다른 공부를 한다는 희열에 취해 과학고등학교 진학을 위해 필수적이었던 학교 내신을 제대로 챙기지 못하였던 탓에 화학 올림피아드 수상경력과, 서울대학교 과학 영재원 수료라는 스펙을 가지고도 내신조건을 충족하지 못해 어처구니 없게도 당연히 진학하리라고 생각했던 과학고등학교 진학에 실패하였다.

일반계 고등학교를 진학하고 나서 인생의 내리막은 시작되었다. 과학고등학교 진학 실패 이후, 어려운 가정형편에도 불구하고 나의 교육에 모든 것을 쏟아부었던 부모님과의 갈등은 더욱이 커져만 갔고, 나 스스로도 과거의 실패에 대한 트라우마로 인해 공부에 대한 흥미를 잃고 그저 이전까지 공부했던 관성으로만 고등학교 시절을 지내게 되었다. 남들보다 조금 나은 머리와 중학교 때 먼저 달려두었던 선행학습 덕에 공부를 하지 않고도 고등학교 2학년 까지는 어느정도 성적을 유지 할 수 있었지만, 이과수학과 수학능력시험에서 필수적으로 요구하는 성실성과 탄탄한 기초를 간과했던 나는 그렇게 대학 진학에도 실패하고 재수, 삼수를 거듭하여 여러 현실조건들과 경제적 사정들과 타협한 끝에 국립대인 충북대학교에 소프트웨어학과에 입학하게 되었다.

어렸을때부터 IT 기기와 컴퓨터를 좋아하던 나에게 있어서 소프트웨어학과로의 진학은 너무나도 당연한 선택이었고, 삼수끝에 드디어 내가 좋아하는 분야의 공부를 할 수 있을거라고 굳게 믿고 대학생활의 첫 발을 띠었다. 그러나, 국립대 특유의 경직된 커리큘럼과, 학교에 대한 외부 지원을 위해 학생들에게 강요하던 공학인증은 전공과 교양의 선택을 극단적으로 제한하였고, 학과에서 지정한 교과목만 정해진 순서에 맞추어 들어야 정상적인 졸업을 할 수 있었다. 아직까지 숲을 보지 못하고 나무만을 생각하고 있었던 나에게, 본인 연구 외에 교수법에 전혀 관심이 없는 교수들의 지식 늘어놓기는 지루하기에 짝이 없었고 내가 생각했던 컴퓨터공학과 화이트 보드에 교수들이 늘어놓고 있는 저 알 수 없는 내용들이 과연 무슨 접접이 있을까 의구심만 들게 만들었고, 자연히 학과 공부에 대한 열정도 차갑게 식었다.

나중에서야 깨닫게 되었지만, 전공시간에 배웠던 그 교수들이 늘어놓았던 지식들이 꼭 아무린 쓸모없는 지식은 아니었으며, 매우 학문적이고, 현업과는 동떨어진 지식들이나 결국 그 지식들이 지금의 화려한 IT 시대를 만들어낸 토대가 되는 지식들이었다는 점을 알게 되었을 때는 이미 처참한 학점으로 학교를 졸업하고 나서의 일이었다. 내가 학교에서 유일하게 관심을 가지고 흥미와 열정을 느끼며 참여했던 모든 과목들은 팀프로젝트로 진행되었던 "무언가 만들어 내는" 결과물을 도출하는 과목들이었고 그럴때마다 팀장으로서 기획과 팀협업을 리드했던 경험은 학과 공부에 거의 모든 흥미를 잃었던 내가 마지막 까지 학업을 아예 놓지 않았던 이유 이기도 했으며, 졸업 할 때 쯔음에야 겨우 신설된 빅데이터나 인공지능 같은 과목들 또한 다시금 컴퓨터 과학에 대한 나의 흥미를 자극해주기 충분했었고 F로 점철된 교양, 전공기초 과목들의 학점들을 매꾸느라 한학기에 24학점씩 듣고, 생활비를 위해 토,일 하루 12시간씩 카페 알바를 하며 힘겹게 졸업장을 따던 나를 지탱해주는 과목들이었다.

그렇게 2020년 8월 에서야 나는 학과에서 강요하던 공학인증 조건을 충족하고 겨우 졸업 할 수 있게 되었지만, 관련 업종 취업을 위해 필수적인 코딩테스트를 위한 두려움이 컸다. 머리속에서 로직은 그려지지만, 막상 그걸 코드로 옮기려고 하면 문법조차 막막해서 손이 움직이지 않았기 때문이다. 기초적인 전공공부를 소솔히 한 탓이다. 또한 여기에 더불어 학교 다닐때 아버지께서 간암 판정을 받으셨었는데 병환이 갈수록 심해져 간병을 위해 우리 가족들 모두의 역량이 소모되고 있었다. 해가 갈수록 아빠의 병세는 악화되어 갔고 간기능 악화로 인해 몸의 독소를 해독하지 못해 주기적으로 찾아오는 간성 혼수와 응급실 행은 나를 포함해 가족 모두의 마음을 갉아 먹고 있었다.

이 시절 나는 인생에서 가장 어두운 시간을 보내고 있었다. 하루에도 몇번씩 분노와 슬픔의 복합적인 감정의 소용돌이 속에서 해메며 눈물을 흘렸고, 나이가 차며 자꾸만 조급해지는 취업에 대한 현실의 제약과, 가족의 병환, 감정의 소모 속에서 심한 우울증을 앓고 있었다. 우울증이 무서운 점은 그 상황을 해쳐 나갈 일말의 의지 조차 꺾여버린채로 무기력의 심연 속으로 가라 앉으며 그 사실을 온전히 인지하고 있기 때문에 우울의 양성 피드백에 갇혀버린다는 점이다. 온종일 방안에서 스스로를 가둔채로 지내다 이대로는 도저히 안될거 같아 2021년 말, "살아 남기 위해" 정신과를 찾아가서 상담을 받고 약을 먹기 시작했다.

그렇게 지내던 중 2022년 2월, 여느때와 다름 없이 간성 혼수로 인해 응급실에 실려간 아버지의 상태가 심상치 않았다. 지난 7년의 병간호 동안 항상 응급실을 왔다 갔다 했지만, 이번에는 간성 혼수가 심하게 진행된데다 신장능력 또한 저하되었고, 그로 인해 심장또한 망가지고 있었다. 2022년 2월 20일 가족들 모두가 중환자실에 모인채로 아버지는 마지막 숨을 내쉬며 돌아가셨다. 아직도 아버지의 마지막은 뇌리에 강하게 남아있다. 사람이 죽을때 마지막 숨이 그렇게 길줄은 몰랐다. 마치 힘겹게 삶에 대한 미련을 붙잡고 길게 내쉬는 한숨 같았다. 그날 삼성병원 8층 암병동 밖의 창문에는 올해 마지막 눈발이 새차게 날리고 있었다.

아버지의 장례식을 마치고, 엄마는 30년을 넘게 함께 해온 배우자의 상실로 인해 힘들어 하고 계셨지만 아이러니 하게도 아버지의 죽음은 가족들 모두에게는 서로 더욱 돈독해지는 계기가 되었다. 한사람에게 전부 소진되었던 감정들이 비로소 서로를 위해 돌아갈 여유가 생긴 탓 이었으리라. 아버지가 돌아가시며 동생은 뚜벅 뚜벅 걷는 뚜벅이, 나는 한번에 힘차게 비상을 준비하는 새 라고 하셨다. 동생은 나와 다르게 꾸준히, 그리고 묵묵히 하나하나 자기 갈길을 걷는 성격이고, 나는 흥미가 있는 일에는 그 누구보다 열정적이고 집중하여 결과를 내지만 그 외의 일에는 통 노력을 기울이지 않는 성격이었다. 아버지께서는 마지막 눈을 감는 그 순간까지 삶에 대한 미련과 의지가 너무나도 강했던 탓에 옆에서 지켜보는 가족들의 안타까움을 더 했었다. 아마 아빠는 눈을 감는 그 순간에도 내가 비상할 그 순간을 지켜 볼 수 있으리라 생각하셨을 것이다.

아버지의 죽음과 장례식을 뒤로하고 49제를 지내며 가족들과 상실의 아픔을 추스리고 난뒤 비로소 나는 앞으로 나아갈 심적인 여유와 여력이 쌓이기 시작했다. 지난 2년간 생산적인 일이라고는 손에서 거의 놓았던터라 어디서 부터 시작해야 할지, 뭐 부터 공부해야 할지 너무나도 막막했지만 일단 정보처리기사 국가자격증 부터 따기로 목표를 정하고 책을 사서 공부하기 시작했다. 다행히도 대부분의 내용은 이미 전공과정을 거치며 어느정도 기반 지식이 잡혀있던 상태였고 2022년 7월 24일, 시험출제가 바뀌고 나서 역대 최소 합격률을 자랑했던 정기 기사 2회 실기에 합격을 할 수 있었다.

정보처리기사 합격은 정말 오랫만에 느껴보는 성취였다. 무언가를 위해 도전할 의지조차 꺾여 있었던 수년간의 어둠 속에서 할 수 있겠다는 가능성을 느꼈던 계기가 되어주었다. 실패가 두려워 도전하지 않았고 도전하지 않아 더더욱 자신감을 잃던 무한 루프를 탈출시켜 주는 브레이킹 포인트가 되어 주었다. 취업 정보를 위해 인터넷을 돌아다니다가 우연히 크래프톤 정글 모집에 대한 광고를 보았을 때도 그때 즈음 이었을 것이다. 원래 애드블럭등으로 대부분의 광고를 막아두고 있었기에 어디서 어떻게 볼수 있었는지조차 사실 잘 기억이 나지 않지만, 비전공자도 개발자로 거듭 날 수 있게 해준다는 크래프톤 정글은 지난 2년간의 공백과 현실적인 이유들로 이제는 거의 포기 하고 있었던 개발자에 대한 꿈을 다시금 지펴주는 계기가 되었다.

크래프톤 정글 지원서를 접수하고 입학시험을 위해 배부된 자료를 보고 공부하면서 다시금 마음속에서 새로운 도전으로 부터 오는 두근거림과 무언가 몰입하는데에서 오는 열감을 느낄 수 있었다. 입학시험 당일날 제시된 과제를 만들며 처음에 각종 Try/Catch 예상 항목을 고려해둔 채로 시작하며 각 메모를 독립적으로 식별하기 위해 자바스크립트 단에서 난수 생성을 해 각 인스턴스 항목별로 식별가능한 ID 를 부여하는 방법을 1차적으로 생각해두었지만 완벽하지 않은 방법이라고 생각되어 욕심을 부리던 와중에 MongoDB 로 부터 웹으로 ObjectID를 받아와서 처리하는 과정에서 자료형이 호환이 안되는 문제에 부딪혔다. 때문에 모든 요구사항과 로직이 완성된 상태였지만 시간이 부족한 탓에, 각 메모의 개별 식별문제를 해결하지 못하고 제시하는 요구사항을 충족하지 못한채로 제출을 하게 되었다.

좌절감도 컷지만, 신기하게도 시작했던 과제를 마저 완성 하고 싶은 마음도 있었다. 합격 여부와 관계없이 해당 문제만 해결하면, 내가 만들었던 웹 프로그램이 정상적으로 작동 할 것이라는 확신 또한 있었고 그 끝을 보고 싶어서 제출시간이 지나고 나서도 계속 프로그래밍을 하여 완성본을 만들어 냈다. (https://github.com/InFinity-dev/2022_KraftonJungle_Test) 해냈다는 보람도 있었지만, 좀더 빨리 해당 문제를 해결 하는 방법을 알아내서 완성본을 제출 했으면 좋았을거라는 아쉬움도 컷다. 사실 미완의 과제를 제출 했기에 당연히 불합격을 예상하고 있었으나, 2022년 9월 20일 크래프톤으로 부터 문자 한통을 받았다. 입학시험 합격을 축하하며 다음 전형인 인터뷰 일정에 대한 안내였다.

인터뷰 준비는 따로 하지 않았던 것 같다. 다만 기술 면접에 대비해 입학 과제에 썼던 로직과 무엇때문에 미완으로 제출했었는지, 그래서 어떤 식으로 개선시켜 완성시켰는지 답변하기 위해 작성했던 코드에 대한 리팩토링과 코드 리뷰를 조금 진행했었고, 그 외 면접때 나왔던 질문에 대해서는 그냥 솔직하게 있는 그대로 마음 속에서 우러나는 대로 답변했던 기억이 난다. 10월 4일 최종 합격 문자를 받고 나서야 초조한 마음이 가라앉았다. 사실 크래프톤 정글 입학에 실패한다면 다음 과정으로 무엇을 할 지 막막했던 상태였다. 30살이 넘은 나이와 관련학과를 졸업한지 2년이 지난 공백, 그리고 빈약한 전공기초지식으로 개발자의 꿈을 포기하고 공무원이나 다른 직종을 위해 준비해야 하나 하고 있던 와중 크래프톤 정글 합격 문자는 다시금 내가 개발자를 꿈 꿀 자격을 주는 티켓이었던 것 같다.

크래프톤 정글 입소 전날, 이제 들어가면 공부만 해야 된다는 생각에 마지막으로 밤새 게임을 했다. 한창 하던 에이펙스 레전드라는 게임이 있는데 밤낮이 바뀐채로 생활하다 보니 북미에 사는 외국인들과 플레이 하며 친분을 쌓고 IGL(In Game Leader)역할을 맡아 배틀로얄 장르를 플레이 하는 재미에 푹 빠져있었던 와중이었다. 첫날이니 적당히 오리엔테이션을 하고 기숙사에서 짐풀고 일정이 마무리 될거라는 생각에 가서 자면 된다고 생각했었다. 하지만, 크래프톤 정글에서의 첫날은 그야말로 "정글"에서의 첫날이었고, 첫날부터 Python Flask와 Jinja2 템플릿엔진, 그리고 DB 연동을 통해 기획한 웹 어플리케이션을 만들어 내야 하는 과제가 주어졌다.

JSON Web Token(JWT)를 활용한 로그인 로직을 완성하기 위해 찾아보던중 JWT의 원리와 장점을 설명한 문서들을 찾아보고 Git에서 JWT를 적용한 프로젝트를 받아서 코드를 돌려보며 잠시동안 푹 빠져든탓에 첫날밤을 그렇게 새고, 두번째 밤은 마감시간에 쫓겨 기획한 개발 요구사항을 완성하기 위해 팀원들과 밤을 새며 내리 3일을 제대로 자지 못했다. 하지만 그렇게 피곤한 와중에도 머리속에는 온통 "왜 안되지? 어떻게 해야 작동하게 만들수 있는거지?" 라는 생각으로 가득했다. 프로젝트 데드라인이 다가오면서 조급한 마음도 있었지만 한편으로는 "평가 요소"가 없기에 그 와중에도 즐거운 마음으로 임 할 수 있었던 것 같다. 온전히 팀 협업 경험과 몰입 경험을 느낄 수 있게 하기 위해 배려해준 크래프톤의 기획이었다고 생각한다.

3일에 걸친 첫 팀 협업 프로젝트 발표가 끝나고 반별로 회식을 하며 많은 사람들과 얘기를 나누고, 코치님들과도 심도 있는 대화를 나눌 기회가 있었다. 가장 인상 깊었던 점은 단지 컴퓨터 공학을 전공한 전공자들 뿐만 아니라 굉장히 다양한 분야에서 서로 다른 삶의 궤적을 살던 사람들이 한가지 목표를 위해 이 자리에 모이게 되었다는 점이었다. 그리고 그렇게 모인 모두가 기대 이상의 결과물을 내며 0주차 첫 프로젝트 발표를 마쳤다는 점에서 알량한 전공자로서의 위기의식과 함께, 자신감 또한 얻었다.

지금 크래프톤 정글에 모인 모두는 각 개인의 역량과, 이제까지의 삶의 궤적은 각기 다를 지라도, 단 한가지 공통점이 있다. 그것은 자기 주도적으로 자신의 삶에서 뭔가를 바꾸고자 하는 의지와 열정으로 이 곳에 와 있다는 점이다. 아마도 입학시험의 과제 완성 여부에 따라 당락을 결정하지 않고 모든 요소를 고려하여 크래프톤 정글 1기 지원자들을 뽑은 이유는 코딩 실력을 판단하는 시험이 아닌, 목표에 대한 열정과 삶을 바꾸고자 하는 의지를 보고 뽑은 탓이 아닐까 싶다.

각 개인으로서 누구나 어제보다 내일 더 나은 삶을 살기 위해 노력하고자 하는 의지가 있다. 다만 그 의지의 불꽃의 시작은 처음에는 미약하기 나름이라, 게으름과 나태함으로 인해 쉽게 사그라 들기도 하고, 또 어떨때는 누구보다 간절함에도 불구하고 현실적인 제약과 외부적인 요인으로 흔들려 꺼지기 십상이다.

크래프톤 정글에는 각 개인 한명한명의 가슴속에 모두가 그런 불꽃을 조심스럽게 피워낸 채로 이 자리에 모였다. 혼자만의 불꽃으로는 쉽게 사그라 들던 그 의지와 열정이 크래프톤 정글이라는 바람막이와 불쏘시게 안에서 옆에 있는 사람의 불꽃을 만나 더욱 화려하게 타 오를 것을 기대한다. 1 + 1 = 3이 됨을 보여줄수 있는 자리가 되리라고 믿는다. 서로의 열정이 누군가를 밟고 올라서야하는 경쟁이 아닌 협력과 시너지를 만들어 낼 수 있는 기회의 장을 크래프톤 정글이 제공하였다. 사회에서는 좀처럼 얻기 힘든 기회이다. 이런 기회를 준 크래프톤 정글에 나는 정말 감사하다. 크래프톤 정글에 입소하지 못하고 개발자로서의 꿈을 접었다면, 평생 가슴 한켠에는 이루지 못했던 꿈에 대한 미련과 후회가 남아있었지 싶다.

5개월간의 크래프톤 정글 프로그램이 끝나고 나의 역량이 어느정도가 될지는 아직 알 수 없다. 하지만 분명한점은 그 5개월간의 과정을 수료하고 난뒤 가지고 나가게 되는 몰입경험과 같은 곳을 바라보는 팀원들과의 잊기 힘든 협력경험은 앞으로 그 어느 곳에서도 값지게 쓰일 배양토가 되어 좋은 개발자로 성장해 나갈 수 있는 밑거름이 될 것임에는 분명하다.

나의 나이, 졸업후 공백기간 등을 고려해봤을때 현실적인 관점에서 크래프톤 정글은 나에게 있어 개발자로서의 진로를 갈 수 있느냐 없느냐를 결정하는 마지막 기회라고 생각한다. 세상에 뭔가를 만들어 내는것에 희열을 느끼는 나로서는, 개발자는 쉽게 포기 할 수 없는 꿈이다. 앞으로의 여정이 기대됨과 먼 미래에 되돌아 봣을때 지금 이 순간, 이 자리가 나의 인생에 있어서 길이 남는 힘찬 첫 발자국으로 기억되길 새롭게 각오해본다.

2022년 10월 29일. 크래프톤 정글에서의 첫주를 마치며.

'Personal Note > Diary' 카테고리의 다른 글

개발자로서 가져야할 태도와 지향점  (0) 2023.03.20

+ Recent posts