본문 바로가기

활동/SK네트웍스 Family AI 캠프 2기

SK네트웍스 Family AI 캠프 2기 : 16th week (8월 5주차 + 8월 회고)

이번 주에는 새로 오신 선생님께 수업을 들었어요!

이커머스, 물류 등의 도메인 영역에서 20년 넘게 경력을 쌓으신 분이라 배울 점이 많을 것 같아요 :)

CTO 경력도 여러 번 있으신 분이라 그런지 거시적 판 흐름 읽는 법에 능하신 것 같더라구요.

 

SK네트웍스 Family AI 캠프를 통해 여러 사람들을 만나면서 시야가 조금씩 확장되고 있다는 게 느껴져요.

물론 시장이 얼어붙었기 때문에 불안함이 아예 안 든다고 하면 그건 거짓말이겠죠...^^;;

그래도 묵묵하게 자신의 몫을 다하는 사람은 시대 불문하고 매사 필요하다고 생각하기에 오늘도 힘내보려고 합니다!

 

불안한 감정도 제 일부라는 것을 받아들이고 겸손한 마인드로 임해야겠어요.

수학계가 혼란한 존재로 규정하던 무리수를 인정하면서 시야가 확장된 것처럼, 사람도 불안한 감정을 수용할 줄 알아야 눈이 탁 트이는 것 같아요!

 

추운 시기이지만 잘 견뎌 보겠습니다! 

이 글을 보시는 모든 분들... 그리고 저까지 포함해서 모두 힘내보자구요~!

 

 

● 성취

단위 프로젝트가 끝난 후면 기분이 늘 붕 뜨게 되더라구요.

어수선한 마음을 다 잡으면서 새로운 공부 내용에 임한 제 자신에게 칭찬을 해주고 싶습니다!

가시적인 큰 성과도 중요하지만, 이런 소소한 성과들도 중요하다고 생각해요.

 

그리고 소소한 성과들이 모이면 나중에 큰 성과가 되더라구요 ^_^

 

● 학습

이번 주는 이론 위주의 수업을 들었습니다!

'AI 활용 애플리케이션 개발'이라는 주제 하에 필요한 이론 내용들(SW공학, Linux 명령문 등) 위주로 가볍게 배웠어요.

새로 오신 강사님도, 수업을 듣는 저희들도 적응하는 시간이 필요하기에 이번 주는 무겁지 않게 진행되었습니다.

 

따라서 이번 주간 포스팅은 가볍게 쓰겠습니다 :)

 

# 소프트웨어 공학 (SW공학)

사실 저는 현업 시장에서 AI 엔지니어 업무를 잠깐 경험한 적이 있습니다.

업무를 직접 겪기 전까지는 코드 작성이 가장 중요하다고 생각했는데, 예상과 다르게 문서화 작업도 많이 필요하더라구요.

 

수업을 들으면서 SW공학 지식이 있으면 개발 문서화 작업을 할 때 특히 유용하겠다는 생각이 들었습니다.

왜냐하면 '소프트웨어 공학(SW공학)'은 소프트웨어의 개발/운용/유지보수 등의 SW 생명주기 전반을 체계적으로 다루기 위해 필요한 지식들을 모아 놓은 분야거든요!

 

코드를 잘 다루는 것도 중요하지만, 실제 프로젝트는 여러 명이 참여하므로 소통이 상당히 중요합니다.

소통의 중심에는 늘 문서가 있으므로, 문서화 작업을 절대 소홀히 하면 안 된다고 강사님께서도 말씀하셨어요!

개인적으로 저는 개발자에게 문서는 생명줄과 같은 역할을 한다고 생각해요.

이러한 이유로 해당 주제를 흥미롭게 들었습니다!

SW공학에서 배운 내용의 일부를 여기에 정리해 보겠습니다~

 

• WaterFall (폭포수) 모델

 

'폭포수 모델'은 개발 생명주기를 단계적으로 수행하는 모델입니다.

말 그대로 위에서 아래로 떨어지는 폭포수처럼 순차적으로 프로세스가 진행됩니다.

이 방식은 작은 조직보다는 주로 대기업처럼 큰 집단에서 많이 쓰이는 방법으로 알고 있어요!

 

 

• 애자일 (Agile) 모델

 

영어로 Agile은 '기민한, 민첩한'이라는 뜻을 갖고 있어요.

폭포수 모델 등을 비롯한 기존의 SW공학 방법론은 변화하는 상황 속에서 융통성 있게 대응하기 힘들어요.

반면에 '애자일 모델'을 사용하면 기민하고 민첩하게 반응할 수 있습니다.

 

위에서 소개한 '폭포수 모델' 을 보면 알 수 있듯이, 폭포수 모델은 완벽하게 계획을 세워서 프로세스를 처리하겠다는 인상이 강해요.

그러나 '애자일 모델'은 가볍게 시도한 후에 해당 경험을 교훈 삼아서 다음 시도에 유동적으로 반영한다는 특징이 있어요.

그 특성 때문에 애자일 모델을 소개할 때에는 회전하는 원을 많이 사용한답니다!

 

애자일 모델의 특징 4가지를 꼽자면 아래와 같아요.

  • 절차와 도구보다 개인과의 소통을 중요시 합니다.
  • 문서보다는 실행되는 소프트웨어에 더 가치를 둡니다.
  • 계약 절충보다는 고객 협력이 중요합니다.
  • 계획을 따라하는 것보다 변경에 잘 대응하는 것이 중요합니다.

 

 

# 리눅스 (Linux)

'리눅스'는 IT 업계에서 정말 많이 쓰이는 OS(Operating System, 운영체제)라서 중요합니다!

AI 개발, 백엔드, 네트워크, 보안 등 리눅스가 안 쓰이는 곳을 찾기가 더 힘든 것 같아요.

 

상업성이 강한 Windows는 커널 등의 핵심기술을 비공개했기 때문에 자유도가 낮지만, 리눅스는 오픈 소스 기반이기 때문에 윈도우에 비해 자유도가 높습니다!

 

자유도가 높아서 연구 및 디버깅 자료가 많을 뿐 아니라, 무료이기 때문에 기업이 안 쓸 이유가 없다고 하네요 ^_^

열심히 배워야겠습니다!

 

• 리눅스 기본 명령어 13가지

  • ls : 현재 디렉토리에 있는 파일 목록을 나열합니다.
  • cd {이동할 디렉토리 경로} : 디렉터리를 이동합니다.
  • pwd : 현재 디렉토리의 전체 경로를 화면에 출력합니다.
  • rm {삭제할 파일 이름} : 특정 파일을 삭제합니다. -r 옵션을 이용하면 폴더도 삭제할 수 있습니다.
  • cp {원본 파일 이름} {새로 만들 파일 이름} : 특정 파일을 새로운 이름으로 복사합니다.
  • touch {새로 만들 파일 이름} : 새로운 이름으로 크기가 0인 새 파일을 생성합니다.
  • mv {파일 이름} {파일을 옮길 디렉토리 경로} : 파일을 다른 디렉토리로 옮깁니다.
  • mkdir {새로운 디렉토리 경로} : 새로운 디렉토리를 만듭니다.
  • rmdir -r {삭제할 디렉토리 경로} : 특정 디렉토리를 삭제합니다.
  • cat {파일 이름} : 특정 파일 내용을 화면에 출력합니다.
  • head {파일 이름} : 파일의 앞 10줄만 화면에 출력합니다
  • tail {파일 이름} : 파일의 마지막 10줄만 화면에 출력합니다.
  • clear : CLI 터미널 화면을 깨끗하게 지웁니다.

tmi이지만 강사님께서는 주니어 개발자들이 리눅스를 다룰 때 rm, rmdir 등의 명령어는 안 쓰는 걸 추천한다고 하네요...!

리눅스는 윈도우와 다르게 휴지통 기능이 없기 때문에, 주니어 개발자들이 중요 파일을 실수로 날리게 되면 복구 비용이 더 커질 수 있다고 합니다.

 

rm, rmdir 명령어 대신에 cp 명령문 사용을 더 권장하셨습니다!

 

● 개선

이번 주말에는 알고리즘 실력을 점검하고자 하는 마음으로 엔코아에서 제공하는 모의 코딩테스트에 참여했습니다.

문제 유형은 대체로 구현이 많았습니다.

DFS, BFS처럼 배워야 풀 수 있는 유형이 아니라 기본에 충실한 사람이라면 충분히 도전해 볼 만한 문제였어요!

 

알고리즘 테스트 때 풀었던 문제들을 정리하고 글을 마치겠습니다.

 

• 1번 문제 : 춤추는 작은 까탈레나

# 문제 1 : 춤추는 작은 까탈레나
from typing import Tuple
import sys
input = sys.stdin.readline

n, k = map(int, input().split())

dance_coordinate = dict()

for i in range(n):
	row = list(map(int, input().split()))
	for j in range(n):
		if row[j]:
			dance_coordinate[row[j]] = (i, j)
	
	
def calculate_distance(pos1: Tuple, pos2: Tuple) -> int:
	return abs(pos1[0] - pos2[0]) + abs(pos1[1] - pos2[1])
	
	
result = 0
for i in range(1, k):
	result += calculate_distance(dance_coordinate[i], dance_coordinate[i+1])


print(result)

 

이 문제는 좌표 정보를 기반으로 이동 거리를 구하는 문제입니다.

수학적 개념이 약간 가미되어 있다는 느껴졌어요.

'맨해튼 거리' 공식을 n번에 걸쳐서 적용한 버전이라는 생각이 들었습니다.

 

 

• 2번 문제 : 9와 4분의 3 정거장

# 문제 2 : 9와 4분의 3 정거장
import sys
input = sys.stdin.readline

n, k = map(int, input().split())

name_dict = dict()
for _ in range(n):
	name, study_time = input()[:-1].split()
	hours, minutes = map(int, study_time.split(':'))
	study_minutes = hours*60 + minutes
	
	if not name in name_dict:
		name_dict[name] = [study_minutes]
	else:
		name_dict[name].append(study_minutes)
		
		
def calculate(name: str) -> bool:
	time_li = name_dict[name]
	total_time = sum([(time_li[i+1] - time_li[i]) for i in range(0, len(time_li), 2)])
	
	if total_time >= k*60:
		return True
	else:
		return False

	
result = 0
for name in name_dict.keys():
	if calculate(name):
		result += 1
	
print(result)

 

이 문제는 문자열 처리와 시간 계산이 중심이 되는 구현 문제였습니다.

해당 문제의 핵심은 학생에게 부여된 모든 시간 데이터를 분 단위 기준으로 통일하는 것이었습니다.

이렇게 접근하면 꼬여 있던 문제가 한 결 쉽게 풀려집니다~

 

 

 

• 3번 문제 : 복소수의 곱셈

# 문제 3 : 복소수의 곱셈
from typing import Tuple
import sys
input = sys.stdin.readline

n = int(input())
complex_num_li = input()[:-1].split()

def parse_num(complex_num: str) -> Tuple:
	temp_num = complex_num.split('+')
	return int(temp_num[0]), int(temp_num[1][:-1])

def calculate(num_1: str, num_2: str) -> str:
	a, b = parse_num(num_1)
	c, d = parse_num(num_2)
	
	real_num = (a*c - b*d)
	img_num = (a*d + b*c)
	return f"{real_num}+{img_num}i"

result = complex_num_li[0]
for i in range(1, len(complex_num_li)):
	result = calculate(result, complex_num_li[i])

result_a, result_b = parse_num(result)
answer_a, answer_b = abs(result_a) % 100007, abs(result_b) % 100007 
print(answer_a, answer_b)

 

복소수 개념 이해를 베이스로 삼은 구현 문제입니다.

수학에 대한 거부감이 있으신 분들은 문제 지문을 읽을 때부터 많이 힘드셨을 것 같아요.

그래도 차분하게 읽으면 충분히 도전해 볼 만한 문제였답니다!

(해당 문제의 마지막 부분이 중의적으로 해석될 여지는 있어 보였으나... 구현 연습용으로 쓰기는 좋다고 생각해요.)

 

이번 한 주도 정말 정신없이 지나갔네요!

자고 일어나서 마저 또 공부를 이어가야겠습니다~

화이팅 할게요!!

 

 

● 8월 회고

8월에는 좋은 선생님을 만났던 덕분에 내적으로 많이 성장할 수 있었습니다 :)

이전에 잠시 개발자로 근무하던 곳이 개발자 선배가 부족한 곳이었어서, 선생님의 가르침 하나하나가 소중하게 느껴졌습니다.

 

남들이 볼 때에는 진로를 향해 느리고 답답하게 나아간다고 생각할 수도 있겠지만, 덕분에 저는 이 과정 속에서 많은 것을 배울 수 있게 되어 영광이라고 생각합니다.

그리고 원래 개발 실력은 삽질 투자 시간과 어느 정도 비례하잖아요...? 그래서 마냥 속상하지는 않아요.

이 시간들을 제 자산으로 만들면 되는 거니까요!

 

남은 시간들도 새로운 강사님께 알차게 배워서 쑥쑥 성장해 보겠습니다 ^_^

 

 

+) 부족한 부분이 있으면 댓글로 말씀해 주세요! 겸허한 마음으로 더 공부하겠습니다.