thumbnail

간략 필자 소개 - for Korean

HitCount

Sourcerer profile

좌우명: 평생학습(Lifelong learning), 민이호학 불치하문(敏而好學 不恥下問)

개발자. 더나은 경험을 추구하며, 기술적으로 성장하는 성취감을 좋아합니다. 모든 일을 체계적으로 진행하는 것을 좋아하며, 다양한 의견을 수용해 최적의 결과를 만들 때 가장 큰 성취감을 느끼곤 합니다.

현재는 학업에 집중하고자 NineVR이라는 VR 스타트업에서 퇴사하고 펫/토이 프로젝트를 만들며 다음 학기를 준비하고 있습니다(2020. 2 졸업 예정).

최근 사용한 언어 및 라이브러리: Node, Javascript(React, Redux, etc.), CSS3(SCSS, StyledComponents), HTML5(JSX)

DevOps에 관심이 많지만, 좋은 인프라를 관리하기 위해서는 개발이라는 분야를 등질 수 없기 때문에 DevOps 엔지니어 이전에 훌륭한 개발자가 되고자 합니다. 그에 따른 다양한 언어를 편식없이 학습하고 있습니다.

그 중 퍼포먼스가 뛰어나고, 객체지향을 학습하기에 좋다고 생각하는 C/C++에 대해 애정을 가지고 있고, 현재 가장 활발한 발전을 이루고 있다고 생각되는 Javascript에 매력을 느껴 최근(2018. 11 ~)에는 Javascript를 이용하여 프로젝트를 진행하고 있습니다.

이와는 별개로 머신러닝 프로젝트(2018. 06)를 진행하며 공부한 스크립트 언어인 Python에도 애정이 있고, Java는 안정적인 웹 개발을 위해 버릴 수 없는 언어라고 생각하기 때문에 최근(2019. 01 ~)에 다시 공부하고 있습니다.

선호하는 개발 환경: MacOS(Zsh, Bash), Linux(Ubuntu), Opensource
선호하는 도구: AWS, React, Node, Django(+ Flask)
최근 관심있는 도구: Docker, CI(젠킨스, 써클 등), Kubernetes

이렇게 다양한 도구를 사용하고, 이것저것 공부하는 이유는 제가 생각하는 개발자라는 직업은 배움을 게을리하지 않고, 무언가를 만들기 위해 다양한 경험을 해야 한다고 생각하기 때문입니다.

그래서 때로는 잡다하게 공부했다는 생각이 들 때가 있었습니다. 하지만 그 생각도 잠시 배움을 즐기고 있는 저 자신의 모습이 행복하기 때문에 지금까지, 그리고 앞으로도 후회없이 다양한 기술을 학습하고자 합니다.

주제 별

참여한 재능기부 및 대외활동

2013. 07. 01 ~ 2013. 07. 15: 말레이시아 IT 봉사단 'Comma' - IT STAFF
2016. 05. 23 ~ 2017. 08. 20: 마음치유학교, Ari(컨텐츠 제작 담당) - 홍보팀장
2016. 09. 03 ~ 2016. 12. 03: 보건복지부 나란히걷기 - 발달장애 아동을 위한 문화 교육 선생님
2016. 09. 07 ~ 2016. 12. 14: 대한민국 교육 봉사단 씨드스쿨 - 홍보팀장
2017. 02. 27 ~ 2017. 05. 29: 스타트업캠퍼스, Signature Course 2nd - Tech Lab(개발자)
2017. 05. 23: 5월, 소프트웨어에 물들다 - 의정부 어린이도서관(STAFF)
2017. 12. 27: DevOps Korea meetup - STAFF
2018. 01. 29 ~ 2018. 03. 16: 평창 Olympic/Pralympic - Passion Craw(IT STAFF)

2018. 04. 01 ~ 현재: Djangogirls Seoul - Organizer
2018. 08. 12 ~ 현재: AWS(KRUG) University Student Group - Member

2018. 03 기준 총 봉사시간: 500시간 이상

근무 및 아르바이트 경력

2015. 11. 25 ~ 2015. 12. 31: 나노믹아트 - 단순 생산직 근무자
2016. 04. ~ 2016. 08: 프로젝트 HongU - Web Software Developer
2016. 06. ~ 2016. 10. 13: 패스트캠퍼스 - OpenCV와 함께하는 컴퓨터 비전 캠프 조교
2018. 08. 20 ~ 11. 20: 나인브이알 - (Contents) Software Engineer<UE4을 활용한 클라이언트 게임 개발 및 사내 개발 인프라 관리>

공모전 및 수상 경력

2017. 09. 28 ~ 12. 21: (비공식) 컨트리뷰톤, uftrace/perf – 오픈소스 Contributor, 우수상(2등)
2018. 08. 16 ~ 10. 25: (공식) 컨트리뷰톤, gitShare – 오픈소스 Contributor, 우수상(2등)
2019. 01. 08 ~ 02. 27: (공식) 네이버 D2 CAMPUS FEST, boggler – 오픈소스 Maintainer로써 결승 진출

입영기록

2014. 02. 25 ~ 2015. 11. 24: 대한민국 해병대(1사단) - 네트워크 관리/운용병, 전산/체계 관리/운용병

보유 자격증

2017. 12. 24: DAsP(데이터아키텍처 준전문가) - 데이터진흥원
2017. 12. 23: 리눅스마스터 2급 - 한국정보통신진흥협회

최근에 진행한 프로젝트 3개(맡은 역할, 인원 수, 기간, 내용 등)

2018. 04. 01 ~ 2018. 11. 21: 강의 공유 플랫폼, Athena(4명) - DevOps(주도), Front-end(일부), Back-end(일부)

사용한 도구: React(Mobx), Node(Express, SocketIO), AWS(EC2, Route53, RDS), Git(GitKraken, GitHub)

이번 프로젝트의 시작은 수강했던 강의의 한 학생의 불편함이었습니다. 그 학생은 장애를 가지고 있어 수업을 듣기 위해서는 누군가의 도움이 필요했고, 그 도움조차 그 학생의 학습을 완벽히 도울 수는 없었습니다. 그래서 그 학생에게 도움이 되고자 그를 위한 프로젝트를 만들었습니다. - 3주 정도 서비스 후 서비스 유지비를 고려해 무기한 폐지하게 되었습니다.

작업물의 완성도는 낮았지만, 프로젝트를 진행하며 DevOps를 위해서는 안정적인 Development가 선행되어야 한다는 것을 깨닫게 되었습니다. 그래야 Operation을 위한 제대로 된 서비스를 제공할 수 있다는 것을 깨닫게 되었습니다.

뿐만 아니라 작업물의 완성을 목표로 진행했기 때문에 소스코드의 질이 떨어졌습니다. 이에 리펙토링의 필요성을 느꼈고, 프로젝트를 하나하나 수정하는 것보다 새로운 프로젝트를 만드는 것이 나을 것 같다고 생각해 새로운 프로젝트(Boggle)를 만들게 되었습니다.

결과적으로는 운영에 실패해 접게 되었지만, 생애 처음으로 구현부터 서비스 운영까지 진행하는 프로젝트를 경험했다는 중요한 경험이었습니다.

프로젝트 소스코드 주소: https://github.com/rayleighChild/athena

진행 간 부족한 점 피드백: https://github.com/rayleighChild/athena_FAQ

2018. 12. 01 ~ 현재: 음성인식 기반 메모 플랫폼, Boggler(4명) - Front-end(주도), Design(주도)

사용한 도구: React(Redux, ...), Node(Express, Passport, ...), Git(GitKraken, GitHub, Git-Bash, ...), Opernsource Editor(VSCode), Mozilla/DeepSpeech등 여러 오픈소스 프로젝트

보글러의 가장 큰 핵심은 스트리밍 혹은 파일로 입력받은 음성 정보를 분석해 이를 텍스트로 변환시킨다는 점입니다. 가령 미팅에서의 가벼운 대화 혹은 강연자의 음성을 텍스트로 변환해 보다 나은 필사 환경을 제공합니다.

때때로 우리는 강의를 듣거나 중요한 일을 녹음합니다. 하지만, 이렇게 녹음된 자료는 텍스트로 옮겨 적어야 하는 불편함이 있죠. 더불어 이런 작업은 꼭 필요한 일이 아니라면 쉽게 잊혀지곤 합니다.

이처럼 보글러는 음성을 텍스트로 변환하기 위한 작업의 피로를 줄이기 위한 도구로 만들어지고 있습니다.

팀 내에서는 프론트 엔드와 디자인을 담당하고 있습니다. 또한, 전체적인 프로젝트 진행 방향과 구성원의 일정관리, 프로젝트 이슈 관리 등을 주도적으로 진행하며 프로젝트 관리를 병행했습니다.

위의 두 프로젝트를 진행하며 느낀 핵심 키워드는 “사용하는 기술에는 정당한 이유가 필요하며, 회사에서 사용하는 모든 기술에는 정당한 이유가 있다”라는 깨달음이었습니다.

이를 통해 프로젝트를 진행하기 전에는 마냥 트랜드를 따라 개발하는 것이 옳은 줄 알았지만, 사실은 기본에 충실해 기능과 구현에 적절한 기술을 사용하는 것이 옳다는 것을 깨닳았고 기본에 충실해야 좋은 서비스를 만들 수 있다는 것을 알게 되었습니다.

프로젝트 주소: https://github.com/rayleighChild/boggler - 현재 진행 중.

2018. 01. 23 ~ 01. 28: Mozilla/DeepSpeech 기반 Nodejs 함수 NPM Module(2명) - 프로젝트 설계 및 주도

사용한 도구: Node, Mozilla/DeepSpeech

앞서 설명한 보글러에서 편하게 사용하기 위해 오픈 소스 기반 Speech Recognition(음성 인식) 서비스인 Mozilla/DeepSpeech의 기능을 Node 모듈로 만든 프로젝트입니다.

해당 프로젝트를 진행하면 전 과정을 주도적으로 설계했습니다. 또한, 기존의 Mozilla/DeepSpeech에서 제공하는 NPM 모듈이 있었지만 터미널 기반으로 사용해야 했기에 이를 코드로 사용하면 좋겠다고 생각해 진행하게 되었습니다.

더불어 퍼블리싱 경험을 통해 사용자의 피드백을 받을 수 있었으며, 사용자로부터의 요구사항에 맞게 프로젝트의 기능을 수정했던 경험이 기억에 남습니다. 가령 사용자의 요구였던 동기적으로 함수가 호출되어 결과를 반환하는 방식을 체택한 사례(https://github.com/teamthesol/node-DeepSpeech/issues/2)는 개인 프로젝트로 진행하는 것과는 또다른 경험을 얻을 수 있는 계기가 되었습니다.

현 기준 총 다운로드 수: 876회

프로젝트 주소: https://github.com/teamthesol/node-DeepSpeech

가장 기억에 남는 문제 해결 사례 소개

1. 기능 구현 - 비동기적으로 구현되어 있는 함수를 동기적으로 구현하기 위해 수정한 사례

문제 정의

: 앞서 소개한 STT 기반 프로젝트인 Node-DeepSpeech라는 프로젝트는 처음에 구현될 때(0.2.4 버전)만 해도 비동기적으로 사용자에게 제공되었습니다.

그래서 사용자의 입장에서는 인식된 음성 데이터의 전달은 원하는 시점에 성공적으로 전달할 수 있었지만, 분석되어 전달받은 문자 데이터의 반환 시기를 알 수 없었습니다(https://github.com/teamthesol/node-DeepSpeech/issues/2).

문제 해결 과정

: 우선적으로 Node라는 언어의 메커니즘 자체가 단일 스레드 기반으로 클러스터링을 통해 마치 멀티 스레드 환경에서처럼 한 번에 여러 작업을 동시에 수행하고 있었기 때문에 일반적인 함수를 사용한다 하더라도 비동기적으로 사용되고 있었습니다.

이를 해결하기 위해서는 별도의 함수 혹은 키워드가 필요했고, 이를 해결하기 위해 구글에서 동기적으로 함수를 구현하는 방법을 찾아 결국에는 Stackoverflow를 통해 callback function, Promise, async/await의 3가지 방법이 있다는 것을 알게 되었습니다.

첫 번째 방법인 callback function의 경우에는 callback hell이라고 부르는 고전적인 문제를 안고 있었기 때문에 체택할 수 없어 나머지 두 방법 중 하나인 Promise로 함수를 구현하는 방식을 체택하게 되었습니다.

결론

: 이번 사례를 통해 로컬에서만 개발하고 개인의 요구에 맞춰 기능을 구현하던 과거를 반성하게 되었고, 사용자의 요구를 실현한다는 것에 대한 안목이 생겼습니다.

해결된 문제 링크
: https://github.com/teamthesol/node-DeepSpeech/commit/f6d56fc853abcb3cf85737ba04615ee8264867df

2. FrontEnd - 오디오 파일 분석을 통한 기능 구현 및 스타일링 사례

문제 정의

: 링크를 통해 미디어(유튜브, 트위치, 음성 파일 등)를 제공하는 형태였던 기존의 방식을 사용자의 파일을 통해 이를 분석하여 웨이브(frequency wave)를 그려야했고, DeepSpeech를 적용하여 텍스트를 분석하는 로직이 필요했습니다.(https://github.com/teamthesol/boggler/issues/18)

문제 해결 과정

: 우선적으로 문제를 정의하는 과정에서 하나의 문제가 아닌 여러 개의 문제를 한 번에 해결하려 하는 것 같다고 느껴 이를 여러 문제로 정의할 필요성을 느끼게 되었습니다.

  1. Audio Frequency wave 그리기(기본 뼈대 제작): https://github.com/teamthesol/boggler/issues/31
  2. Editor 그리기(기본 뼈대 및 참고할 예시 코드 삽입): https://github.com/teamthesol/boggler/issues/30

각 과정에서는 기능을 나눠 기능과 스타일링을 구현했고, 우선적으로 기능 구현을 먼저 해결하려 했습니다. 1번 기능인 Audio Frequency wave의 틀을 먼저 만들고, 기능을 구현한 이후에 스타일링을 구현했습니다.

1번에서는 오픈 소스 중 하나인 waveform-react를 사용했고, 여기에 사용되는 오디오 파일을 버퍼로 디코드하는 로직과 이를 반환할 시점이 디코딩이 끝난 이후여야 했기에 동기적으로 구현되어야 했습니다.

이를 위해 async/await 방식을 체택해 기능을 동기적으로 구현했고, 이에 따라 분석된 버퍼 데이터를 waveform-react에 삽입해 Audio Frequency wave를 그릴 수 있었습니다.

이어서 2번 기능인 Editor에서는 에디터의 기능을 하게 될 textarea와 여기에 들어온 텍스트를 바탕으로 사용자에게 텍스트를 보여줄 Article 기능이 필요했습니다.

더불어 텍스트는 state로 관리해 사용자의 변경에 따라 해당 state가 변하게 구현해야 했고, 변화되는 것과 동시에 사용자에게 보여주는 Article에서도 rerender가 일어나야 했기 때문에 이에 대해서도 고려해야 했습니다.

결론

: 이번 사례를 통해 하나의 메서드는 하나의 문제만 해결해야 한다는 것을 깨닫게 되었고, 여러 문제가 섞인 이슈를 해결하기 위해서는 문제를 기능 단위로 나누는 것이 효율적이라는 것을 깨닫게 되었습니다.

더불어 문제를 해결할 때 어느정도의 설계가 있어야 효율적으로 기능을 구현할 수 있다는 알게되었습니다.

해결된 문제 링크 1

해결된 문제 링크 2

기타 내용

2018년 회고: https://bit.ly/2FmPAaL  
Github: https://github.com/rayleighko  
Mail: gmj1197@gmail.com  
Djangogirls, seoul: https://djangogirls.org/seoul/  
AUSG: https://www.facebook.com/AUSG-311547172765852/  
Facebook page: https://www.facebook.com/RaykoDev