Loading...
Great Ideas Never Rust
안녕하세요, 문명주입니다.
저의 현생 프로필 사이트는 따로 있습니다. NAMUWIKI
#include <studio.h> 를 치다가 코스를 drop하고 궁금해서 C언어 책을 주문해 공부하기 시작했습니다. 독학은 재밌었고 코딩에 빠져 1학년 기말고사를 던지고 한학기 휴학, 집에서 C, C++, Java, TCP/IP Socket, Windows API 등을 공부했습니다. CLI를 공부하다 이 코드들로 UI는 어떻게 구성하는걸까? 라는 의문점이 든 것은 제가 프론트엔드라는, UI가 있는 시스템을 만드는 취향을 가진 사람임의 암시입니다. Windows API, Unity를 공부하고 다음과 같은 게임들을 직접 만들었을 때가 정말 즐거웠습니다.
예전엔 "하루 공부를 모두 블로그에 써야하는" 병에 걸렸었지만, 지금은 꽤나 지혜로워 졌습니다 나 자신만이 아닌 다른이들에게 이로운 글을 쓰고자 글의 강약 조절을 위해 여러 블로그를 운영합니다. 22살인가 23살에 학교를 떠나 서울로와 단칸방에서 자취를 시작, 개발자로 살았습니다. 2025년 29살인 현재까지 개발자로서 어떤 일을 했고 어떤 프로젝트를 했는지는GithubProject GalleryLinkedIn에서 확인하실 수 있습니다.
특히 앱 & 웹에서 다양한 플랫폼을 다루며 많은 공부를 했습니다. 특히 Android, iOS, React Native, Flutter, Web, Electron입니다. 이걸 하면 저걸 까먹고 지금도 모든걸 완벽히 다할줄 아는건 아닙니다. 이것저것을 전문성이 없어 보일 수 있습니다. 그러나 하나에 빠졌을 때 결코 얕게 공부한적은 없습니다.
Android Native 개발로 첫 Frontend의 문을 두드렸고 무작정 공부를 하며 많은 회고를 했습니다.모바일 플랫폼을 공부한 지 1년한국 개발자는 알고리즘을 몰라도 되나요? 어린 시절의 치기일 수 있지만 계속해서 위대한 개발자란 무엇인가 회고하며 높은 경지로 가기위해 노력했습니다. 기회가 생겨 iOS를 접했던 저는 계기를 맞게됩니다. 여타 다른 안드로이드 개발자들이 그러하듯 MVP, MVVM, Clean Architecture등에 주화입마가 걸려가며 DI, Design Pattern, Reactive 등의 패러다임을 하나하나 공부했었고 그런것들이 iOS에선 어떻게 구현될까? 하면서 살펴보는 재미가 있었습니다. 식견이 많이 넓어졌고 꼭 구글의 개발자들이 제시하는 개발경험과 설계가 정답이 아님을 알게되었습니다. 그러다보니 하나의 프레임워크에 매몰되어 Jetpack의 Room의 이번 버전에 뭐가 나왔나 세세하게 살펴보는것보다 여러 프레임워크를 폭넓게 공부하는 것이 공부의 효율성이 높다고 인지했습니다. Web, React Native, Flutter를 공부하며 다시 심심하면 Android를 공부하기도 하고 다시 Flutter를, 다시 iOS를, 이런식으로 살아왔습니다. 은탄환이 없듯이 계절에 따라 좋아보이는 것이 달라지며 또 공부할 동기를 주는것 같습니다.
저는 모든게 빠릅니다. 일단 타자가 1,000타입니다. 또한 제 에디터의 설정은 한치의 오차도 없이 저한테 최적화되어있습니다. 절 옆에 앉혀두고 코딩을 시켜본다면 제 에디터의 현란한 화면전환과 조작에 멀미를 하게됩니다. 코딩도 AI Coding Assistance가 나오기 전까진 인간중에선 거의 생활의달인이였습니다.expo-release-it commit history를 보면 1주일 채 개발하지 않고 대부분의 코어 기능을 탑재해 출시했습니다. (게다가 여긴 군대였다.) 개발과 코딩은 빠르게 하는것이 중요한것이 아니다, 견고한 설계와 구현이 중요하다 라고 할 수도 있지만 결국 개발자들이 맨날 들어야 하고 해야하는 일은 자신의 능력을 메타인지하여 일정을 제시하는 것입니다. 견고한 설계와 구현은 기본입니다. 전 위대한 개발자의 여러가지 필요조건 중 속도는 당연한 것이라고 생각합니다. 개발 공부만이 아닌 개발 속도도 갈고 닦아야 한다고 생각합니다. AI 툴의 힘을 빌리는것, Editor의 모든 Shortcut을 커스터마이징 하는것, 타자 연습을 하는것, 밤을 세워 나만의 해커톤을 하는것, 모두 그 노력에 해당합니다. (너무 Competition Programming적인 발상일 수도 있겠습니다.)
저는 20살의 막바지에 코딩을 시작했고 처음 코딩을 배울때 들었던 감정은 이걸 어릴때부터 수행했던 사람들이 부럽고 많이 뒤쳐졌다고 생각했습니다. 딱히 저의 실력을 객관화할 지표가 없었기 때문에 저는 뒤를 돌아보지 않고 공부에 집착하기 시작했습니다. 특히 까먹는 것을 정말 싫어했기 때문에 네이버 블로그에 그날 공부한것을 꼭 써야했고 이 블로그엔 2,000개의 글이 존재하게 되었습니다. 다음과 같은 기록에서 작성일을 보면 제가 하루에 얼마나 많이 글을 썼었는지 알 수 있습니다.

잠에 들려다가도 Android에서 어떤걸 어떻게 구현하는지? Fragment의 anti-pattern은 무엇인지라는 질문을 스스로에게 던지면서 하나라도 답할 수 없으면 당장 궁금증을 해결하고 잠에 들어야 했습니다.
이건 지금 생각해보니 기획 회의를 할 때 이건 어떻게 구현이 되어야하고 어느정도의 기간이 걸릴지 가상적으로 생각하고 회의에서 바로 답변을 하기 위한 좋은 능력이 되었습니다
이젠 저런 다시 보지도 않을 양산형 글은 안쓰지만 이런 공부 습관들이 AI가 이렇게 발전한 아직까지도 Docs를 제대로 읽고 지식과 사용법을 습득하는데 재미를 느끼게 해준 이로운 거름입니다. 전 현재 군대에 와있고 이러한 성향을 버리진 않았습니다. 틈날때 공부를 하고 개발을 할수(어차피 개발병이니까) 있었습니다. 20대의 중후반에 되돌아보니 공부에 집착하고 불안해하던 날들의 기록들이 제 가장 강력한 무기가 되었습니다.
인생에 성공 경험은 중요합니다. 많은 도전에 대해 시도하고 성장할 수 있는 용기의 원천이 됩니다. 제 인생에서의 첫 성공은 남들보단 조금 특별한 중학교 2학년때의 카트라이더 프로게이머였습니다. 전 재능이 있었기 때문에 프로게이머가 되는것은 쉬웠습니다. 그저 재밌어서 즐기다보니 어느정도의 조건을 충족하여 TV에서 생중계로 게임을 할 자격을 얻을 수 있었습니다. 하지만 저는 인생 처음으로 벽에 부딪혔습니다. 13차 리그부터 출전을 했지만 14차리그에 자만을 하다 최종 상위 8명이 진행하는 결승전에 가지 못했습니다. 저는 분했고 당황스러웠습니다. 그날부로 여행을 가서도 키보드를 들고다니며 피시방에서 연습을 했고, 이전에 그저 즐겼던 게임으로써가 아닌 욕심을 가지고 결과를 보기위한 노력을 지속했습니다. 그리고 15차 리그엔 결승전에 갔습니다. 1등도 한 번 했습니다.

객관적으로 주목을 받는 TOP Player는 아니였지만 어린 나이에 노력으로 원하는 것을 쟁취한다는 것이 어떤 의미인지 알아버린 저는 이후로도 그 경험을 바탕으로 연전연승을 이루게 된 것 같습니다. 제가 가장 좋아하는 제 플레이는 아래 동영상입니다. 해설분들과 캐스터분들도 칭찬을 해주셔서 더 기억에 남습니다.
그 이후의 성공은 롤에서 시즌2에 다이아1 찍기, 오버워치에서 시즌 4에 겐지 트레이서로 상위 500등 달성하기 등이 있었지만 넘기도록 하겠습니다.
고2 때 내신 4~7등급 정도를 종횡무진하던 저는 대학을 가야겠다고 생각을 합니다. 왜인지는 기억이 안납니다. 어쨌든 고 3때 6월 모의고사에서 34434이 나왔지만 수능때는 12112로 좋은 대학에 갈 수 있었습니다. 전 이게 카트라이더 선수 생활을 하며 방송에서 게임을 해야했던 긴장감을 다루는 경험으로 실전에 강해진것이라고 생각합니다. 중2 때 카트라이더로 배웠던 노력은 돌아온다라는 믿음하에 제 모든걸 갈아넣은 수험생활이였고 또 한번의 성공을 맛보게 되었습니다. 고3 때의 학업 스트레스는 O2JAM이라는 건반 리듬게임 게임을 즐겨 했습니다. 여기서도 큰 성공을 거두게 됩니다. 이때 저는 11시 30분에 마치는 자습학원에서 공부를 열심히 하고 돌아와 새벽3, 4시정도까지 이 게임을 하면서 스트레스를 풀었습니다. 이것도 카트라이더에서 배운 열정을 담아 키보드를 두드리다보니 세계 랭커의 반열에 들 수 있었고 전 개인적으로 이것이 제 인생 업적중 하나가 아닐까 생각을 합니다.
이 게임을 하다가 손목에 물이 차서 주사기로 빼고 깁스를 한 상태로 키보드를 살살치는 방법까지 연구하여 게임했던 생각이 납니다.
저보다 수능을 잘본사람은 많고, 개발을 좋아하고 잘하는사람은 분명히 있을테지만 저보다 여기에서 손이 빨랐던 사람은 극히 희박하거나 제가 활동하던 시절엔 없었기 때문에 의미가 있습니다.
그 이후 전 스타트업들에서 개발좀 하다가 튜링에서 수학대왕을 개발해 100만 사용자가 넘는 앱을 혼자 관리하는 성공, GOP에 끌려갈뻔했던 제가 해군 SW개발병으로 합격해서 개발자로서 수없이 많은 장점을 누리며 복무할 수 있는 성공등을 하고있습니다. 제 성공경험들이 즐비해있지만 크고 작은 좌절들을 겪지않은것이 아닙니다. 오늘은 공부에 실패가 많았다 (21/06/20) 아직까지 익숙해지지 않는 좌절들과 실패들이 항상 깔려있지만 또 제 성공경험들이 해결을 해줄것이라 믿습니다.[일상] 오늘의 일지 (21/06/21)인생은 시소니까요.
언젠가부터 지식을 공유하는것이 재밌다고 생각했습니다. 모바일 플랫폼을 공부한 지 1년에 적어두었듯이 맨땅에 헤딩을 많이하며 공부를 해보다보니 훨씬 좋은 방법들을 알게되어서 그 방법을 알려주고 싶었습니다. 연합동아리 SOPT 활동은 지식을 공유하기에 좋은 장이였고 그땐 그냥 스터디도 진행하고 뒤풀이로 술도먹고 했지만 지나고나니 즐기며 그렇게 지식을 나누었다는 사실이 기억에 남습니다. 코딩테스트 스터디, 깃 스터디, 안드로이드 스터디 등의 커리큘럼을 짜고 직접 대학생들을 대상으로 강의했고 온라인도 진행하고 오프라인도 진행하고 소규모, 대규모로도 진행하며 말도 좀 할줄 알게 됐습니다. 사진은 찾으려다보니 회식사진밖에 없어서 올리긴 좀 그렇고 여하튼 그 경험을 기반으로 CrossPlatform Korea에서 여러가지 발표도 진행하게 되었습니다. 이런 강의와 발표뿐 아니라 글쓰기, 오픈소스활동으로도 제가 가진 재능을 나누고 있습니다. 성장하지 못하면 분해할 정도로 열정있는 사람들이 좋고 그런 사람들을 도와주는것, 그냥 이래야 한다고 이전부터 깨달았습니다.
전 언제부터인지 모르겠지만 에디터에 광적인 집착을 해왔습니다. AST와 LSP가 제공해주는 Code Token의 Color Scheme, VCS에서의 changed, renamed, deleted, added, conflict에 대한 항상 동일한 색상으로 보여야 합니다. keyword는#A7D5FF로, 클래스는#FFDAAD로, 문자열은#FFFCD7로 보여야 합니다.
Xcode
Zed
Webstorm
Neovim이런 형태로 코드들이 나열되어있는것을 보는것이 기분이 좋습니다. 전 사실 코딩을 이것때문에 하는 것일지도 모른다는 생각을 합니다.
모든 에디터의 커맨드들이 정해진 shortcut으로 동작해야 합니다. 최근 VIM을 설정하며 더 복잡해지고 AI agent를 쓰기 시작해서 더 설정해야할 setup들이 많아졌습니다. 취향에 맞는 에디터를 찾고자 에디터 설정에 기본적으로 2주에서 1달정도의 시간을 썼으며 현재는 TypeScript를 사용할 땐 Zed, Webstorm와 iOS를 개발할 때 Xcode를 사용합니다. WebsStrom은 TypeScript를 개발하기에 정말 잘 만든 에디터입니다. 눈치를 채지 못하게 코딩을 빠르게 할 수 있고 Cognitive Load를 줄일 수 있는 기능들이 숨겨져있고, 의식하지 않으면 인지하지 못합니다. 예를 들어, JavaScript에서는 String Literal을 백틱안에 감싸는데, 일반 quotes로 감싸여져 있는 문자열 안에서 $와 {를 치기만 하면 자동으로 감싸진 quote가 백틱으로 바뀝니다. 또한, monorepo project에서 A 모듈이 B 모듈을 참조하고 빌드 구조상 B의 번들링된 파일을 A가 import하는 경우가 있는데, 이 때 A에서 B의 usage를 Go to Definition 하면 VSCode나 Zed에서(vtsls를 그냥 쓰는)는 빌드된 결과물(js)로 가지만, 웹스톰에선 개발자의 의도대로 ts source로 갈 수 있습니다. type Fruit = 'apple' | 'banana'에서 apple에 커서를 대고 Go to Definition을 하면 Fruit으로 갈 수 있습니다. 이것이 왜 환상적인 기능이 아닌가요? WebStorm이 TypeScript Reasoning & LSP가 현재 Hybrid로 구현이 되어있어서 맛이가있다는 평도 있지만(사실 맞고 JVM으로 짜서 에디터가 느림), 이런 세세한 DX가 고려된 에디터는 유일무이합니다. 다른 에디터들에 비해 Multiplexing이나 VIM지원, 성능이 아쉽지만 이런 세세하게 개발 속도를 보장해주는 장점들이 지금 WebStorm(+VIM Plugin)을 쓰게된 이유입니다.
어느날, 알고리즘을 공부해보고 싶었습니다. 엄밀히 말하면 코딩 테스트를 공부하고 싶었습니다. 취업을 준비해본적이 없어서 코딩 테스트를 본 적이 없지만 다들 공부를 한다고 하니 저도 해야될 것 같았습니다. 원래 알던 사이트인 BOJ(백준)을 풀기 시작했고, 첫날엔 탑 뭐시기를 하는 골드 5정도 스택 문제에 3시간을 써야 했습니다. 제 처참한 실력에 분노 조절을 하지못하고 제대로 공부를 시작해보기로 합니다. 일단kks227님의 대회 알고리즘 커리큘럼을 처음부터 따라가기 시작합니다. 브루트포스, BFS, DFS, Greedy, DP, Tree, String, Stack 뭐시기 등등들을 쭈욱 공부하면서 연습문제를 풀고 메이플 스킬트리찍듯이 머리속에 욱여넣었습니다. 점점 풀수있는 문제들이 늘어났고, 재미도 들렸습니다. 문제를 생각하는 과정 자체를 즐긴 나날들도 존재합니다. 회사를 퇴근하기전에 한 문제를 봐놨다가 집까지 걸어가면서 그 문제를 생각하고, 집의 엘레베이터에서 해답을 떠올리고 바로 집에 도착하자마자 코딩을하고 제출을 했는데 맞았을 때의 기억이 생생합니다. 그렇게 3000문제쯤 풀다보니 골드, 플레티넘 수준의 대부분의 문제들의 유형을 모두 외워버릴수있게 되어서 아이디어를 요구하는 문제가 아니라면 1분안에 방향성을 잡을 수 있게 되었습니다. 대충 카카오의 코딩테스트를 7문제 모두 푸는데 1시간이 좀 더 걸렸던걸로 기억합니다. 슬프게도 알고리즘도 점점 저에게 생각을 요구하지 않았습니다. 엄밀히 말하면 제가 더 어려운 문제들을 생각하기가 점점 무서워졌습니다. 해답을 이해하는데만 30분 이상이 걸리는 문제들을 복기할때면 상당히 피로감이 몰려왔고 점점 빠르게 쉽게 풀 수 있는 "이미 풀 줄 아는" 문제들만 몇개 풀고 하루를 마쳤습니다. 더 큰 문제는 제가 코딩을 좋아하고 해답을 찾아내는 탐색추론을 사랑하는 것만큼 수학적인 사고와 수학 자체를 크게 흥미를 가질 수 없었던 것입니다. 정수론과 조합론, 이산수학 책들을 사서 읽으며 아예 알고리즘도 안풀고 수학만 공부할때도 있었지만, 내용 자체는 코딩으로 문제를 해결한다는 순수한 행위에 비해서는 재미없었습니다. 난이도가 플레티넘 다이아몬드로 가면 알고리즘을 알면 쉽게 풀 수 있는 문제와 그냥 수학적 추론을 요구하는 문제, 두 타입의 문제가 쉬운 문제들보다 뚜렷하게 나뉘었습니다. 이미 아는 알고리즘들과 문제해결 방법들을 조합해서 퍼즐처럼 풀 수 있는 문제들(물론 이런 문제들이 쉽다는건 아닙니다.)과 순수한 수학적 추론을 해야하는 문제들을 대하는 제 태도자체가 달라졌기 때문에 문제를 편식하게 된 저는 더 이상 PS를 즐길수 없게 되버렸습니다. 브루트포스, 덱, Knapsack을 배울땐 직관적이고 신기하고 재밌습니다. 근데 이런식으로 알고리즘을 배우고 문제를 푸는 과정도 점점 부담이 되었습니다. 기존에 이미 알던것들도 까먹기 십상이고, 결국 DP를 배우고Divide & Conquer Opts를 배우게되거나, DFS를 배우다Heavy Light Decomposition나Centroid Decomposition을 배우나 결국 그냥 증명과 구현이 더 복잡한 알고리즘을 공부해서 문제를 푼다는 템플릿같은 행위가 지겨워졌습니다. 특히 FFT같은걸 공부하고 문제를 풀 때는 내가 이걸 1주일도 기억 못할것같은데(물론 제가 수학을 못하기 때문입니다. 여기서 아까 말한 수학에대한 적은 흥미가 문제가 됩니다.)이걸로 문제를 푸는게 의미가 있나 생각을 하다, 점점 알고리즘을 진짜로 메이플 스킬트리 찍듯이 공부하고 쓰고있었구나를 깨닫게 됩니다. 알고리즘을 접은 이유를 거창하게 열거했지만, 제가 얻은것이 없는건 아닙니다. 그냥 순수 코딩 체급자체도 올라갔고 CodeForces도 퍼플도되고 백준도 랭커도해보고 이 경험을 기반으로 코딩테스트 스터디도 열어봤습니다. 무엇보다 알고리즘 블로그에 있는 여러 알고리즘 노트들은 제가 그 시절을 열심히 살고 순수하게 Problem Solving을 즐겼다는 발자취로 남아있기 때문에 의미있습니다. 많은 포스팅들이 있지만Nim Game & Sprague-Grundy Theorem알고리즘이 제가 공부하고 정리했던 수백가지의 알고리즘들 중 가장 기억에 남고 글도 잘쓴것 같습니다. 재미있는 2년이였던것 같습니다.
하고싶은게 많아 군대를 미루다가 늦은 나이에 입대했습니다. 해군 SW개발병으로 계룡대에서 복무중이며 군대라는 것 빼고 만족하며 복무중입니다. 개발병 합격 수기 는 개발병을 합격했을 때 썼던 글, 근황은 250625 군생활 일지 등에서 확인하실 수 있습니다. 이런저런 활동을 많이 한것처럼 보이지만 이제 귀찮아서 개발이나 공부만 하면서 시간을 녹이고 있습니다. 오히려 군대에 와서 공부와 내 개발을 더 많이 하게되는것 같습니다. 회사를 다닐 땐 회사일이 바빠서 조금 뒷전으로 미룬것들도 다 합니다. 아마 전역전 6개월 전후부터 전역 후 직장에 바로 들어갈 준비를 할 것 같은데 여러 회사를 지인들을 통해 견학다니며 나에게 맞는 회사란 어디인가를 생각하고 미래를 그리고 있습니다.
오픈소스를 하는 이유는 거창하지 않습니다. 많은 사람들이 내 소스 코드를 써주는 것에 보람을 느끼거나, 소통을 통해 실력을 키우거나 유명해지기 위함이 아닙니다. 솔직히 저는 나만의 공간에서 누구와의 소통도 없이 개인적인 프로젝트에 극도로 몰입하는 것이 여러 사람과 협업하는 것보다 살아있음을 느끼기도 합니다. 그럼에도 오픈소스를 하는 이유는 제가 "위대한 개발자"라고 생각하는 사람들이 오픈소스를 행해왔고 행하고 있기 때문입니다. 그리고 그들을 닮는것이 목표이기 때문입니다. 이전엔 위대한 개발자가 막연하게 되고 싶다고 생각했고 위대한 개발자란 무엇인가에 대해서 고민했습니다. 몇해가 지나 몇가지 찾아낸 필요조건들은, 자신의 아름답게 잘 짜놓은 코드를 나눠주어 널리 이롭게 하는것,유창하게 강연을 하는것, 아무도 생각하지 못한 창의성으로 문제를 해결하는것 등이였습니다. 하지만 위대한 개발자의 필요충분조건은 지금에서야 존재하지 않는다는 것을 깨달았고, 그렇기 때문에 감사를 하되 만족이 없는 삶에서 계속해서 추구할 수 있는 목표가 된다고 생각합니다.
당신의 동기를 갉아먹는다
당신이 틀릴수도 있다
돌아가는 것보다 훨씬 빠르다. 당신에게 아무리 강력한 AI가 있다고 해도
Pair Programming에서 당신 동료의 인내심을 시험하고싶지 않다면
생김새만 멀쩡한 디자인 시스템을 만들지도 말고 쓰지도 마라.
팀원한테 민폐다