벌써 올해도 공기가 쌀쌀해졌다. 한 해가 지나갈수록 '참 많이 배운 나날'이란 생각을 했었는데, 다행히 올해도 그렇다. 많은 배움 중 하나는 개발이라는 세계다. 컴퓨터 안에서 동작하는 서비스를 구현해 볼 줄이야. 지금이야 코드를 작성하면 실행이 된다는 게 익숙해졌지만, 문득 신기하다는 기분이 한 번씩 든다. 마치 게임을 하다가도 이 모든 게 어떻게 일어나고 있는지 생각하면 경이로워지는 것처럼.
개발을 배워서 좋은 점은 소프트웨어를 더 잘 이해하게 되었다는 것이다. 여전히 하드웨어적 지식은 바보나 다름없지만, 그래도 클라이언트와 서버가 뭔지 알았다. http가 뭔지도 알고, 브라우저에서 개발자도구로 웹페이지가 어떻게 생겨먹었나 볼 수도 있다. 더 나아가서 눈으로 볼 수 있는 사이트를 구현할 수도 있다. 꽤 유용한 지식이면서도 동시에 그 자체로 참 재미있다. 아무 생각 없이 밤에 코딩했다가는 시간 가는 줄 모르고 자야 할 시간을 놓치기 일쑤다.
개발을 배우다
올 초에 컴퓨터 개론 및 실습수업에서 파이썬을 배운 뒤, 여름 방학 때 인프런에서 김영한 님의 자바 강의를 들으며 제대로 된 개발 공부를 시작했다. 문법과 동작 원리 같은 기본적인 내용부터 IDE 단축키와 같은 사소한 지식, 그리고 의존성 주입과 관심사 분리 등 당시에는 와닿지 않았던 말들까지 전부 흡수하려 노력했다. 그런데 와플에서 세미나를 진행해 보니 내가 알던 세계가 정말 좁다는 걸 알았다. 나도 물론 공부한 것들이 기초 중 기초라는 건 알았지만, 바깥세상이 이 정도로 넓은 줄 몰랐다! 변수의 선언 방식이나 콘텍스트의 의미들을 열심히 찾아보던 나날들은 크게 의미가 없었다(물론 의미가 있다!). 세미나가 시작되고 간단해 보이던 환경 설정에만 수십 분을 잡아먹고(제트브레인의 노예가 된 나는 VScode에서 진행된 환경 설정을 따라 하려 별의별 시도를 다했었다), Git 사용 방법을 몰라 혼자 진행하던 프로젝트에서 컨플릭트가 발생하고... 한 치 앞도 보이지 않는 길을 걸어가는 기분이었다. (지금도 여전히 Git은 알쏭달쏭하다.)
더 당황했던 건 Typescript였다. 이놈의 타입은 어떻게 생겨먹은 건지 도통 이해가 안 갔다. 처음에는 자바랑 비슷하게 생각했는데 lint랑 함께 하니 완전히 다른 도구였다. 사용하는 언어조차 제대로 모르는데 코드를 제대로 짤 수 있을 리가. 과제로 나온 2048 게임 만들기는 AI가 작성해 준 코드에 숟가락만 올린 채 스파게티 코드를 차곡차곡 쌓아가고 있었고, 타입은 as로 우기고 모든 기능은 App.tsx에 때려 박은 정신 나간 코드를 완성했다. 코드를 붙여 넣으면서도 이게 아니라는 걸 알고 있었지만 너무 늦어버렸기에... 다음번에 잘해보자 하며 2048 코드는 저 멀리 묻어뒀더니 이게 웬걸, 세미나 마지막 과제가 2048 리팩토링!
부채살과 리팩토링
과제를 보자마자 멀리 매장했던 과거의 코드를 떠올렸다. 곧장 '처음부터 다시 쓰는 게 낫겠는데?!' 싶었지만, 창피를 무릅쓰고 볼 필요가 있겠다는 생각이 들었다. 문제점과 개선점은 고민하지 않아도 뭔지 명확했다. 곧장 App.tsx에 왕창 쑤셔 넣은 기능들을 하나씩 분리했다. 블록을 움직이는 로직, 게임이 끝나는 조건을 체크하는 로직 등등 마구마구 해체했다. 분리하고 각각의 세부적인 코드들을 정리했다. as로 우기던 타입 대신 정정 당당하게 올바른 타입을 먹여주고, 배열도 reduce, filter, map 등으로 깔끔하게 만들었다. 새삼 지난날 코스트코에서 부채살 원육을 사다 손질하던 기억이 떠올랐다.
부채살 손질에서 가장 먼저 필요한 건 겉의 떡지방과 근막을 겉어내는 일이다. 원육을 둘러싼 근막과 지방을 제거하면 고기의 결이 보이는데, 이를 목적에 따라 분리해 주면 된다. 나는 구이용으로 몇 덩이 덜어내고 나머지는 국거리용으로 쓸 계획이었다. 원육을 분리하면서도 안에 박혀있는 지방과 근막을 계속해서 제거해야 하고, 다 분리한 뒤에도 마무리 손질을 더 해줘야 한다. 그런데 근막과 지방을 제거하는 게 생각만큼 깔끔하게 되지 않는다. 만약 고기 손질에 능숙하지 않다면 살점이 날아가는 걸 감수하더라도 과감하게 제거해야 한다. 괜히 아깝다고 정교하게 하려다 시간은 시간대로 쓰고, 제대로 제거도 되지 않아 결국엔 더 많은 살점을 날려먹는다.
리팩토링을 하고 나니 부채살 손질하고 별반 다를 게 없었다. 처음에 보이는 큼직한 구조를 파악하고, 각각의 기능을 큼직큼직하게 분리한다. 그 과정에서 끊임없이 코드 손질도 해준다. 분리를 끝내면 마무리로 깔끔하게 다듬어주고 끝낸다. 나는 리팩토링에 능숙하지 않은 초짜기에 정교하게 잘하려 하기보다, 조금은 너덜너덜하지만 과감하게 코드 덩이들을 떼어냈다. 여전히 이게 맞는 구조인지, 알아보기 쉬운 코드인지는 모르겠다만 어쨌거나 코드 손질은 끝! 괜히 정교하게 하려다가는 시간은 시간대로 날려먹고 코드 퀄리티도 버릴 수 있으니 일단은 닥치는 대로 하는 게 맞겠다는 생각으로 후다닥 끝냈다.
돌아보니
꽤 성장했다고 느낀다. 학기를 병행하며 짧은 기간 동안 참 많이 배웠다. 환경 설정, 깃 사용법, 폴더 구조, 아키텍처, 그리고 새로운 지식을 습득하고 써먹는 방법까지. 여전히 배워야 할 게 산더미고 부족한 것도 많은 초짜지만, 그럼에도 개발이라는 세계에 발바닥을 적시긴 한 셈이다.
개발을 배우기 전에 내게 호기심을 가지게 한 말이 두 개가 있다. 하나는 개발이 '창조자가 되는 멋진 일'이라는 것이고, 다른 하나는 개발은 무작정 부딪히며 배워야 한다는 말이다. 사실 어떤 분야든 적당한 수준에서 적용될 수 있는 주장인데, 유독 개발에서만 아주 강하게 주장된다고 느꼈다. 이런 주장들이 맞고 틀린 지 왈가왈부할 수 없는 가치관적인 이야기기도 하고, 경력이나 실력도 초라하지만... 지금 시기에 이렇게 생각한다는 주관을 편하게 남겨보려 한다.
개발 유튜브 영상에 달린 댓글을 하나 가져왔다.
원래 제 학과는 이미 알려진 세상의 이치를 배우는 물리학과였는데, 코딩을 접하고 제가 신과 같은 창조자가 될 수 있다는 매력에 빠져 컴공을 복수 전공해서 졸업했어요.
나는 이 글을 보고 신과 같은 창조자라는 게 무엇인지 고민했다. 아마 개발을 통해 세상에 없던 무언가를 만들어낸다는 관점에서 창조자라는 단어를 썼을 것이다. 그러나 단순히 새로운 것을 만들어낸다는 의미로 '창조'를 말한다면 그 문턱이 너무 낮아지는 것 아닌가 싶었다. Rober Morris가 무질서, 해체라는 개념을 제시하고, Marina Abramovic가 행위예술로 예술의 본질을 재정의하듯, 현대미술의 최전선을 항해하는 것이야 말로 신과 같은 창조적 행위가 아닐까. 그들의 도전과 내가 세미나를 하며 이런저런 기능을 만든 코딩을 비교하자면, 확실히 같은 창조라고 보기에 내게는 어려움이 있다.
사실 내 기준에서의 창조일 뿐이지, 누군가는 자신의 개발을 창조적인 일이라 하며 좋아할 수 있다. 그걸 말리고 싶은 마음도 없고. 그러나 나는 창조라는 개념까지 가지 않더라고 이미 매력이 차고 넘치는 세계라 생각한다. 개발을 하다 보면 일상 속에서 시도 때도 없이 '어? 이렇게 하면 되지 않을까?' 하며 곧장 노트북으로 향한다. 밥을 먹든, 산책을 하든, 심지어 잠에 드는 순간이든 계속해서 생각이 날 만큼 중독성이 강하다. 게다가 매 순간 새로운 지식이 나오고, 그것들을 이해하고 적용하다 보면 시간 가는 줄 모른다. 아직은 경험해보지 못했지만 실제 유저와의 상호작용을 한다면 그 재미는 배가 되지 않을까. 그런 점에서 개발은 내게 놀이 같다. 그것도 스도쿠나 모노그램 같은 퍼즐 놀이. 주어진 문제 공간 안에서 최선의 답을 찾으려 노력하고, 갑자기 번득이는 기발함으로 멋진 답을 내놓기도 하고, 가끔은 지레짐작으로 마구 휘두르다 얻어걸리기도 하고, 답도 없는 상황에 갇혀 절망하기도 하고, 재미있다가도 어느 순간 싫증 나지만, 또 안 하다 다시 하면 세상 그렇게 재미있는 게 없는 중독성 강한 놀이 말이다.
놀이와 같은 특성 덕분인지 어린아이가 이것저것 시도해 보며 성장하듯, 계속해서 새로운 지식에 도전하며 시행착오를 통해 성장하는 일이 개발자의 기본 소양인 듯하다. 나도 두 달이라는 짧은 시간 동안 프로젝트성 과제를 진행하며 정말 많이 배웠다. 역시 개발은 직접 부딪혀봐야 실력이 는다는 말이 이해가 갔지만 동시에 의문점이 남아있다. 대체 어느 정도로?
수학을 공부하다 보면 이해가 안 되던 개념들이 이상하게 뒤의 내용을 배우다가 와닿는 순간이 있다. 그건 학습이 앞을 향해 나아가는 단방향적 과정이 아니라, 이후의 내용이 다시금 과거의 개념과 상호작용하며 맞물리는 유기적 특성을 갖고 있기 때문이다. 수열을 배운 뒤 극한을 배우고, 그다음 미적분을 배우면 다시금 수열과 극한에 대해 보는 시선이 달라진다. 그런 점에서 우선은 완벽하지 않더라도 시행착오를 거치며 계속 학습해 나가는 게 중요하다. 특히 개발은 지식이 워낙 방대하고 각각이 너무나 긴밀하게 얽혀있어 그러한 시행착오의 중요성이 더 큰 것 같다. 다만 어느 정도의 기준은 필요하다고 본다. '개발은 일단 해보면 돼!'라는 사람도 프런트엔드 개발자에게 openAI의 AI 엔지니어처럼 딥러닝으로 인공지능 모델을 만들어보라는 과제에는 질색을 할 것이다. 이 사실이 내겐 너무 당연한데도, 이상하게 개발의 세계에서는 이 정도의 '일단 해봐'가 즐비하다고 느낀다.
세미나에서는 웹에 대해 배운 뒤 리액트와 API, 그리고 추가적인 라이브러리를 학습하는 일련의 과정들 덕분에 수월하게 배울 수 있었다. 중간에 갑자기 커진 규모의 아키텍처에 당황하긴 했지만, 나름대로 이유를 찾으려 계속해서 질문하고, 또 이에 대해 답변해 주는 좋은 사람들이 있었기에 길을 잃지 않고 배울 수 있었다. 만약 내가 세미나에 참여하지 않았다면 이 지식들을 같은 기간 안에 배울 수 있었을까? 개발을 계속했다면 언젠가는 배우기야 했겠지만 훨씬 더 오래 걸렸을 것이다. 그것도 아주 빙글빙글 돌고 넘어지며 말이다.
시행착오는 늘 성장을 만든다. 인생에 정답이 없음을 깨닫고 나면 이상하게 돌아간 과거도 지금의 나를 만들어준 소중한 경험임을 안다. 문제는 그런 우회가 늘 '좋은 성장의 기회'는 아니다. 적어도 학습에 있어서 방향성을 잃지 않을 필요가 있다. 괜히 세계적인 학자들이 머리를 맞대며 좋은 교육과정을 만들기 위해 노력하는 게 아니다. 마찬가지로 개발의 세계도 어느 정도 좋은 교육과정이 있다고 생각한다. 다만 새로운 지식이 빠르게 생겨나고 바뀌기에 정형화된 과정을 만들기 까다로운 것뿐 아닐까. 다른 학습 분야와 달리 '모든 시행착오'가 '좋은 시행착오'인 일단 갖다 박으면 되는 세계는 아니라 생각한다. 좋은 시행착오가 뭐냐고 묻는다면 나도 잘 모르겠다. 솔직히 그런 걸 내놓을 수도 없다고 생각한다. 하지만 분명하게 아닌 것이 무엇인지는 알 수 있다.
<자유로서의 발전>은 우리가 살아가는 세상 속 부정의를 없애는 게 중요하다고 말한다. 그러나 정의가 무엇이고 부정의가 무엇인지 논해야 하는데 하나만의 진리를 정의삼을 수 없다는 다원적 질문에 저자는 이렇게 말한다. 정의가 무엇인지 하나의 주장으로 내세울 수 없더라도, 기근과 기아, 차별, 죽음과 같은 일이 '명백한 부정의'라는 사실은 변함없다고. 갑자기 정의라는 이야기가 나와서 이상하긴 하지만 '일단 해봐'도 비슷한 맥락에서 바라보고 싶다. 변화무쌍한 개발 세계에서 특정 학습 방법이 제일 좋다고 말하는 것은 불가능하지만, 그렇다고 해서 모든 시행착오들이 정당화되는 지나친 다원주의를 적용하는 것도 문제가 있지 않을까.
‘자유로서의 발전’이라는 접근법에 깔려 있는 동기는 모든 상태를 ‘완전한 질서’로 줄 세우는 것이 아니라 주목받아야 할 발전 과정의 주요한 측면들에 주의를 환기하려는 것이다.
<자유로서의 발전> - 아마티아 센
개발 경력에 비해 거창한 이야기들을 너무 늘어놨다. 와플에서 활동하다 보면 금세 또 생각이 바뀔 수도 있고. 그래도 과거에 이런 생각을 했었구나~ 하며 돌아볼 수 있는 하나의 기록으로 남기는 게 의미가 있으니까.
시험공부만 하다 보니 너무 지루하다. 얼른 토이프로젝트나 했으면. 종강하고 나서 다시 개발하며 이리저리 부딪힐 생각을 하니 기대된다. 이번엔 어떤 시행착오를 겪고, 또 어떤 지식을 배울 수 있을까?
'공부 > 코딩' 카테고리의 다른 글
바닥부터 공부하기 - 서버와 클라이언트, 그리고 AWS (0) | 2025.01.25 |
---|---|
바닥부터 공부하기 - 들어가는 말과 패키지와 번들러 (0) | 2025.01.20 |
Git 정리 1편: 기초 개념과 사용법 (2) | 2024.10.15 |
JavaScript 정리 1편 : 배열 메서드 (Array Method) (0) | 2024.09.06 |
HTML / CSS 정리 3편 : Flexbox (0) | 2024.09.01 |