Search
Duplicate

신수형 자기소개서

취미가 개발인 개발자 신수형입니다.

개발에 큰 흥미를 느낀건 2021년 10월 해커톤에 참여하고 난 이후였습니다. 당시 42서울에서 교육을 받고있었는데 내부에서 교육자료를 만드는 해커톤에 참여하게 되었습니다. 해당 해커톤은 팀만의 교육과정을 직접 만들어 소개하는 것을 주제로 진행되었습니다. 2주간의 기간동안 진행되었는데 4일차 되던 날 한가지 의문이 들었습니다. “교육과정을 직접 만드는 것 까진 좋지만, 실제로 다른 학생들이 교육과정에 참여할 수 있으면 좋지 않을까?”
이후 저희팀은 해당 해커톤에 참여한 교육과정을 모아 소개하고 참여, 채점 등을 진행할 수 있는 교육 플랫폼을 개발하기로 하였습니다. 당시 서비스 개발을 처음 참여했지만, 이 문제를 해결하고 싶다는 의지를 가지고 남은 열흘 가량 몰입해서 개발을 진행했습니다. React 도 처음, 백엔드와 함께한 프로젝트도 처음이였지만 마지막날 결국 원하는 기능을 만들어 해커톤 당일 발표할 수 있었습니다. 실제로 해당 발표에서 평가단의 큰 호응을 받아 최우수상을 받았습니다.
해당 과정에서 개발에 몰입해서 성과를 내는 경험이 큰 자극제가 되었습니다. 이후 다양한 프로젝트를 진행하면서 새로운 문제를 찾고 팀원들과 함께 해결해 나갔습니다. 취업을 위해서가 아닌 개발의 모든 과정이 즐거워서 개발자를 목표로 삼았습니다.

다양한 프로젝트에서 적극적으로 수학 지식을 활용

최근 Canvas api를 활용한 차트 라이브러리(라이브러리 링크) 만들었습니다. 해당 과정에서 Frame Count에 따른 막대 그래프의 애니메이션을 적용하기 위해서 수학 지식을 적극적으로 활용했습니다. 막대의 시작 높이, 목표 높이와 증감함수, 속도 등을 사용자 설정으로 입력 받아서 추상화된 함수를 구현하였습니다.
또한 C언어를 사용해 간단한 Ray tracing을 구현(프로젝트 링크)하였습니다. 해당 프로젝트는 2차원상에 3차원 도형을 렌더링하는 프로젝트였습니다. Raytracing을 직접 구현하다 보니 수학적인 지식이 많이 필요했습니다. 충돌과 같은 경우 판별식을 활용하면 어렵지 않게 구현할 수 있었지만, 굴절률과 반사율을 계산하고 구현하는 것이 까다로웠습니다. 특히 반사의 경우 반사가 한 번 이루어질 때마다 흡수율이 존재해야 했고 굴절은 매질마다 굴절, 반사가 동시에 일어나야 했습니다. 한 번에 구현하는 것이 어려웠기 때문에, 100% 반사부터 구현하고, 흡수율 구현, 굴절 구현 등 작은 업무 단위로 쪼개어서 개발을 진행하였습니다.
학부에서는 기초수학 A, 미분적분학 A+ 성적을 받았습니다.

한국어 음성 딥러닝을 활용한 립싱크 프로젝트 제작 경험

코로나로 인해 화상회의를 사용이 증가했습니다. 하지만 화면을 가리거나 단순한 2D 캐릭터를 보여주는 경우 대화의 경험이 많이 떨어지는 것을 느꼈습니다. 그래서 2D 캐릭터를 보여주더라도 사용자의 발화에 따라 립싱크를 할 수 있다면 화상회의에 대한 사용자 경험이 조금 더 긍정적일 것이라고 생각했습니다.
영어 발화에 대한 립싱크 툴들의 정확도는 높았지만 한국어 음성에 대한 정확도는 높지 않아서 직접 한국어 음성에 대한 딥러닝을 해보기로 하였습니다. 우선 음성을 텍스트로 바꾸는 STT를 진행한 후, 텍스트에 대해 발음 기호로 변경하고 해당 발음에 맡는 이미지를 매핑하는 방식으로 구현하였습니다. STT는 OpenSpeech의 RNN-Transducer 모델을 활용해 학습을 진행했습니다. 해당 모델을 결정한 이유는 실시간 변환에서의 장점입니다. AI Hub의 한국어 음성 데이터를 활용해 학습을 진행했습니다.
하지만 실제로 화상 회의는 멀리 떨어진 서로 다른 클라이언트에서 진행됩니다. 따라서 추론 과정을 클라이언트에서 직접 진행했어야 하지만 서버에서 추론을 진행하고 클라이언트로 뿌려주는 방식을 사용하다보니 싱크가 안맞는 문제가 발생했습니다. 당시 딥러닝에 대한 지식이 부족해 모델의 사이즈를 줄이거나 추론 엔진을 포팅하는 것에 어려움을 느껴 아쉽게도 클라이언트 사이드에서의 추론 기능은 완성하지 못했습니다.

혼자보다 함께가 더 즐겁습니다

개발은 혼자 하면 100%의 실력을 발휘할 수 있지만, 함께하면 200% 이상의 실력을 발휘할 수 있다고 생각합니다. 함께 문제에 대해 토론하고 다양한 접근방법을 교류하다보면 더 효과적이고 최선의 해결책을 찾을 수 있습니다. 문제가 발생하면 함께 학습하고, 제가 배운 내용에 대해서는 팀원들에게 항상 공유합니다.
개인 프로젝트를 진행하면서도 문제에 직면했을 때, 혼자 고민하기보단 해당 문제를 공유하고 다양한 동료들의 의견을 들어보려고 노력합니다. kakao map api를 활용한 프로젝트 진행 중, 장소 검색 api를 사용시 중복된 검색결과를 포함해 호출 횟수가 너무 많아진다는 문제가 있었습니다. 해당 문제를 팀원들에게 공유하고 서비스워커와 cdn캐싱을 사용해보자는 해결책을 찾아낼 수 있었습니다. 이후 검색에서의 api 호출 횟수를 30%정도 줄일 수 있었습니다. 해당 경험에 대해서도 문서(링크)를 작성해 팀원들과 공유를 하였습니다.

시작한 일은 끝까지 책임집니다.

한번 시작한 일은 끝까지 책임집니다. 저는 팔만코딩경이라는 커뮤니티를 이끌고 있습니다. 해당 커뮤니티는 42서울 학생들이 공부한 내용을 공유하는 지식공유 공간입니다. 커뮤니티를 처음 만들었을 때에는 10명 정도의 소수 인원으로 시작했습니다. 처음엔 게시글도 많지 않아서 함께 커뮤니티를 만들어나갈 컨트리뷰터를 모집하는 것이 쉽지 않았습니다. 적은 인원이지만 꾸준히 게시글을 작성했으며, 블로그 작성을 어려워 하는 동료들을 모았습니다. 포스팅 가이드 세션을 진행하면서 동시에 커뮤니티에 포스팅을 올리는 것을 도와주었습니다. 6개월 이상 이러한 활동을 진행하고 나서 드디어 커뮤니티가 스스로 운영되기 시작했습니다. 2023년 현재까지도 지속적으로 커뮤니티를 운영하고 있으며 현재 월 평균 2만 5천명이 방문해주는 공간이 되었습니다.
팔만코딩경에서의 끝까지 책임지는 경험이 다른 프로젝트에서도 큰 도움이 되었습니다. 개발 프로젝트를 진행할 때에도 ‘끝까지 해보자’라는 마음이 생겨 중도 포기하는 프로젝트 없이 참여한 모든 프로젝트를 배포까지 마무리 할 수 있었습니다.

C++, Javascript 숙련도

42서울 교육에 참여하면서 다양한 C, C++ 프로젝트에 참여하였습니다. C를 활용해서 printf 메소드를 직접 구현해보는 프로 젝트, bash와 같은 shell 프로그램을 만드는 프로젝트 등을 구현하였습니다. 또 Ray Tracing 프로젝트를 진행했습니다. C++을 활용해서 소켓을 활용한 웹 서버를 직접 구현해보는 프로젝트를 진행했습니다.
이처럼 다양한 프로젝트를 만들어 보면서 C, C++ 에 대한 숙련도를 많이 올릴 수 있었습니다. 랜더링에 대한 지식, 소켓의 활용, 메모리를 효율적으로 관리하는 패턴, 포인터와 래퍼런스를 활용한 성능 개선, 패딩 바이트를 신경쓴 구조체 선언 등 다양한 지식을 습득했습니다. 추가로 알고리즘 학습을 C++로 진행하면서 모던 C++ 문법에 대한 지식을 함께 쌓고 있습니다.
Javascript 및 Typescript를 활용해서도 다수의 프로젝트를 진행했습니다.
React, next.js를 활용한 프로젝트를 진행했고, node js를 활용한 cli 프로젝트도 진행했습니다. 프로젝트 이외에도 Javascript에 익숙해지기 위해 다양한 학습을 진행했습니다. Closure를 이해하기위해 직접 React의 useState hook을 closure를 활용해 구현해 보았습니다. Canvas API의 roundRect 함수와 같이 몇몇 브라우저나 특정 버전에서 지원하지 않는 API를 위해 prototype 확장을 사용하였습니다. 입력 파라미터에 따라 콜백 함수의 파라미터의 타입도 변경되어야 하는 경우 Typescript의 Generic을 활용하였습니다.

동영상 기술에 대한 관심

Raytracing 및 canvas 프로젝트에서 나타나듯이 시각적인 정보를 다루는 프로젝트에 매우 관심이 많습니다. 영상처리에 대한 프로젝트를 진행하지 않았지만 영상도 이미지의 연속된 정보라고 생각합니다. 제가 경험했던 것들이 동영상 기술에도 적용될 것이라고 기대합니다. 또한 성능을 신경쓰는 개발을 좋아하기 때문에 효과적인 영상처리 기술에 대해서도 많은 궁금증이 있습니다.
최근 chrome에서 WebGPU API가 출시되었는데 해당 API를 활용한 개발에도 많은 관심이 있습니다.

기술질문 - 공통

PNG와 JPG의 차이점은?
PNG와 JPG는 압축방식과 투명도 지원에서 차이가 있습니다. 프로젝트를 진행할 때에는 로고와 같이 투명도 있는 이미지를 주로 사용했기 때문에 PNG 확장자 파일을 주로 사용했었습니다.
Dynamic Programming이란?
Dynamic Programming이란 큰 문제를 효과적으로 해결하기 위해 이전의 연산결과를 활용하는 프로그래밍 기법입니다. 주로 알고리즘 문제의 시간 단축을 위해 사용했었습니다.
Virtual Memory란?
실제 메모리는 크기에 제한이 있기 때문에 해당 크기보다 큰 프로세스도 실행시킬 수 있도록 논리적 주소를 활용해 메모리를 관리하는 기법입니다. 이미지나 영상의 경우 작업하는 파일이 메모리의 용량보다 클 가능성이 충분히 존재하기 때문에 Virtual Memory를 활용하는 것이 필수적이라고 알고 있습니다.
Garbage Collection이란?
프로그램이 동적할당 된 영역 중 더 이상 접근하지 않는 영역을 자동으로 해제하는 기법입니다. C++은 Garbage Collection이 없기 때문에 직접 메모리 관리를 해주어야 합니다. Javascript의 Garbage Collection은 Reference Counting을 주로 활용합니다. 참조된 횟수를 체크해 더이상 참조되지 않는 오브젝트를 메모리 상에서 지워줍니다.
Cache란?
Cache란 자주 사용하는 데이터를 복사해둔 임시 저장소입니다. 웹 서비스에서의 Cache란 주로 API 요청에 대한 Cache가 될 수 있습니다. 브라우저, Cdn, Service Worker Cache 등을 활용해 서버의 부하를 줄일 수 있고 응답 속도 개선도 이룰 수 있습니다.
프로젝트 에서 검색 요청에 대한 Cache를 적용해 API 호출 횟수를 줄이고 검색 속도를 증진시킨 경험이 있습니다.
Database Index 추가의 장단점은?
index를 추가하면 큰 규모의 테이블에서의 검색 성능을 향상시켜 줍니다. 핵심 장점으로는 검색시의 속도 향상이 있고, 단점으로는 인덱싱된 자료구조를 위한 저장공간이 추가로 필요합니다. 데이터가 자주 업데이트 되는 경우 인덱싱을 진행하는 과정때문에 더 부하가 걸릴 수 있습니다.
비대칭 암호화란?
비대칭 암호화란 암호화, 복호화시 서로 다른 키를 활용하는 암호화 방식입니다. SSH 연결 혹은 SSL 인증과정에서 해당 방식을 사용하는 것으로 알고 있습니다.
GIT의 장점은?
GIT의 가장 큰 장점은 형상관리를 할 수 있는 것입니다. 손쉬운 형상관리 덕분에 다양하게 기능구현을 테스트해보고 적절한 코드를 선택해 기능개발을 이어나갈 수 있습니다. 개발 중 버그가 난 부분을 빠르게 파악할 수도 있습니다.
Branch, Pull Request 등을 활용해 효율적으로 협업을 진행할 수 있습니다.

기술질문 - Vrew

UTF-8이란?
유니코드를 위한 인코딩 방식 중 하나입니다. UTF-8은 문자를 1-4바이트로 표현하는데 C++에서는 UTF-8 문자열을 분석하기 위해서는 비트마스킹을 활용해 해당 문자가 몇 바이트로 표현되는지를 찾아내야 합니다.
웹에서 주로 사용하는 방식입니다.
React란?
React란 UI를 구축하기위한 선언적 Javascript library입니다. React를 활용하면 컴포넌트 단위로 개발이 가능해 재사용성에서 장점이 있고 코드 분리, 결합에 용이해 손쉽게 파트를 나누고 협업할 수 있습니다.
함수형 프로그래밍 패러다임이란?
함수형 프로그래밍을 한문장으로 말하면 대입문 없이 프로그래밍 하는 것이라고 할 수 있습니다. Side Effect가 없는 순수 함수간의 합성으로 함수형 프로그래밍을 할 수 있습니다. 하지만 서버와의 통신 등은 Side Effect가 발생할 수 밖에 없기 때문에 서비스를 100% 함수형 프로그래밍으로 구현하긴 어렵습니다.
Callback hell이란?
Callback hell이란 Javascript에서 비동기 프로그래밍시 발생하는 문제입니다. 비동기 처리를 위해 연속적으로 callback function을 사용하다보면 callback 내부에 다시 callback을 수없이 호출하게 되는 현상을 말합니다.
최근에는 Promise, async/await 을 활용해 Callback hell을 방지할 수 있습니다.
async I/O란?
I/O 작업이 다른 작업들보다 오래 걸리기 때문에 I/O 작업을 요청한 후 다른작업을 수행하는 것을 의미합니다.
Asynchronous Blocking I/O 는 I/O Multiplexing과 유사합니다.
Asynchronous Non-Blocking I/O는 javascript의 asnyc의 동작원리와 비슷합니다.
C++을 활용해 web server를 만드는 프로젝트에서 해당 내용에 대한 학습을 진행했었습니다.
C++ 에서 다형성이란?
C++에서 다형성이란 하나의 메소드를 호출하더라도 다양한 일을 할 수 있는 것을 말합니다.
C++에서는 virtual 키워드를 활용해 다형성을 만들 수 있습니다. virtual이 존재하는 클래스는 virtual table을 만들어서 런타임에 해당 메소드가 어떤 메소드를 호출할지 결정하도록 만들어줍니다.
C++의 다형성을 학습하기 위해 만든 프로젝트입니다. 해당 프로젝트에서는 action 메소드를 virtual로 선언해 자식들마다 action을 다르게 구현하였습니다.