이번에 '스타트업' 부트캠프 강사로 섭외되어 2주 정도의 상당히 짧은 기간 동안 PHP 강사로서 다녀왔다. 나도 스타트업을 꿈꾸고 있기도 하고, PHP를 주 프로그래밍 언어로 하는 내게 있어서는 상당히 반가운 이야기가 아닐 수 없었기에 섭외가 들어왔을 때 생각이라는 과정을 거치지 않고 수락한 느낌도 있다. 부트캠프에서 나를 인지하게 된 경로는 『PHP 7+ 프로그래밍』 강의와 내 저서인 『어썸 라라벨』일 것으로 추측된다. 국내에서 PHP를 제일 잘 가르친다는 자부심이 있었기도 하고, 타인을 가르치는 일도 꽤 적성에 맞는 나로서는 강의를 하는 일은 그리 어려운 일은 아니지만, 취업을 목표로 하는 다른 개발자 양성 부트캠프와는 다르게 '스타트업'을 목적으로 하는 예비 창업가들을 대상으로 가르친다는 점에서 수업의 내용에 있어서는 일반적인 코딩강의와는 다르게 차별점을 두어 주의를 기울이기로 했다.
냉정하게 이야기해서 우리나라의 개발자 취업시장의 채용공고를 기준으로 비교했을 때 자바에 비해 PHP는 약 1/5~1/8 수준에 불과하다. 그래서 취업을 위한 부트캠프에서는 현실적으로 PHP를 주 과목으로 선정하기에는 자바에 비해 상대적으로 매력적이지 않다. 국내 한정 PHP 개발자로 취업하기에는 초기 시장진입에 있어서 경쟁자가 많은 자바보다 기술적 진입장벽이 낮은 것도 맞지만, 더 높은 커리어를 쟁취하고 추후 이직시장에서도 기회의 측면에서 큰 차이가 나기 때문에 이 문제는 인정하고 넘어가야 할 분명한 사실이다. 초기에 PHP로 시장을 진입한 이후에도 결국 현실에 타협하고 다른 언어로 넘어가는 PHP 개발자도 많은 편이다. 한국에서 PHP가 나아가야 하는 길은 이미 고여버린 기존의 기업들이 PHP로 새로운 프로젝트를 시작하는 것을 막연하게 기대하는 것이 아니라 능동적으로 신생 스타트업들이 PHP를 사용하여 서비스를 구성할 수 있도록 하고 생태계를 확장시키는 일일 것이다. 애초에 기존의 기업들이 멀쩡하게 잘 쓰던 자바 놔두고 바꿀 이유 따윈 없다.
코딩을 배우는 목적이 취업이 아니라 스타트업이라면 개발자 취업시장에 대한 문제는 일단 넣어두어도 된다. 이 경우 직업 개발자와는 달리 코딩을 업이 아니라 도구로써 접근하기 때문이다. 코딩을 처음 접하고 백엔드를 전혀 모르는 상태에서 자바를 기반으로 하는 스프링을 배우려고 하다가는 생소한 개념들과 기술에 가로막혀 포기하는 비중이 늘어나기 마련인데, 낮은 진입 장벽과 높은 자유도를 가진 PHP는 예비 창업가들이 빠르게 MVP(Minimum Viable Product)를 만들어보고 실험하기에 있어서 안성맞춤인 언어라고 볼 수 있다. 복잡한 기술적인 개념들과 원리는 오히려 그들에게 독이 될 뿐이라는 사실을 난 이미 잘 알고 있다. 메이킹(Making)에만 너무 몰입한 나머지 정작 중요한 시장조사, 마케팅, CS 등에 시간을 쓰지 못하면 말짱 도루묵이 되는 것은 뻔한 결말이다. 개발자들에게는 꽤나 나쁜 인식이 박혀있는 PHP를 교육과정에 추가한 것은 학원의 입장에서는 다소 모험적인 시도였을지도 모르겠지만, 프로그래밍 언어를 창작의 도구라는 관점에서 보았을 때, 도구의 장단점을 제대로 이해하고 기획한 것이라 볼 수 있는 것이다. 이번 부트캠프를 기획한 직원에게는 칭찬을 해주고 싶은 마음이다.
코딩을 업으로 하는 직업 개발자에게는 그 기술이 좋니 나쁘니 왈가왈부하는 일이 비일비재하지만, 나는 그런 기술적 논쟁보다는 그래서 이걸로 뭘 만들고 어떤 가치를 창출할 수 있는가와 같은 실용적인 관점에서 바라보는 것을 좋아해서 처음 백엔드를 배울 때 개념은 많은데 결과물은 내 뜻대로 잘 나오지 않는 자바보다는 장점이 명확한 PHP를 선택한 것도 있었다. 본질적으로 프로그래밍 언어라는 것은 그저 다른 도구를 만들기 위한 도구라는 점에서 접근한 것이다. 코딩이라는 행위로 인해 나타난 결과물 또한 서비스나 응용프로그램과 같이 결국 어떤 일을 하기 위한 도구이므로 결국 프로그래밍 언어라는 것은 '도구를 만들기 위한 도구'에 지나지 않은 것이다. 각 언어마다 장단점이 있고 저마다의 역할이 있는데, 이를 잘 파악하고 후세대 개발자에게 전달하는 것이 선배의 역할이지 이해가 부족한 상태로 특정 언어와 기술을 비하하는 것은 바람직하지 않다.
부트캠프에 참여한 수강생의 목표가 취업이 아닌 '스타트업'인 데다가 그 중 PHP를 교육하는 기간이 휴일을 포함한 2주라는 상당히 짧은 기간이라는 조건 때문에 내가 이들에게 기대했던 것은 PHP를 얼마나 제대로 숙달하냐의 문제는 아니었다. 이 과정이 PHP 전문 개발자를 육성하는 과정이 전혀 아닐 뿐만 아니라 기간도 너무 짧았기 때문이다. 그에 더해 대부분은 코딩이라는 것을 생판 처음 접하는 경우였기 때문에 이러한 점을 고려해서 PHP에 종속적인 내용이 아니라 조금 더 코딩에 대한 포괄적이면서도 공통적인 부분에 집중하기로 교육 방향을 정했다.
다만 그전에 해야 하는 일, 첫날 첫 시간에 내가 한 것은 PHP에 대한 선입견부터 지우는 것이었다. 코딩을 처음 하더라도 내가 배우는 것이 무엇인지 검색하기 마련인데, 부득이하게도 특정 기술에 대한 가스라이팅 전문가인 일부 기성 개발자들의 횡포로 인해 PHP는 보안이 안 좋고 느리다는 식의 나쁜 인식이 퍼져있었기 때문에 헬로월드 조차 해보지도 않은 상태로 이미 나쁜 선입견을 깔고 가는 지경에 이르러 이 부분을 해소하고 인지시켜야 하는 것이 선결 과제였다. 그렇지 않으면 도대체 왜 자바가 아니라 PHP 같은 것을 배우고 있는 것인지 처음 배우는 그들의 입장에서는 이해할 수가 없기 때문이다. PHP라는 언어가 가진 도구로써의 장점과 기존에 제기된 문제들이 현재 개선되었다는 것까지 납득을 시켜야 한다는 것이 다소 슬픈 이야기이기는 하나, 자바 공화국인 대한민국의 코딩시장의 수준과 인식이 특정 기술에 대한 선입견으로 범벅되어 후세대의 개발자들에게까지 전해지는 등의 꽤나 바람직하지 않은 수준에 머무르고 있으므로 어쩔 수 없는 일이라 볼 수 있었다.
비단 PHP 에만 해당되는 부분이 아니라 전반적으로 코딩에 대한 공통적인 부분을 상당히 많이 언급했다. 클라이언트와 서버, 프런트엔드와 백엔드, 백엔드에서 처리하는 일들, 코딩이 무엇을 의미하는지, 코드가 아닌 글로 로직을 먼저 생각하는 일, 서비스를 만들기에 앞서 만들어야 할 간단한 문서들, 서비스를 구성할 때 사용하면 좋은 솔루션과 오픈소스, 도구들과 같은 내용말이다. 이러한 내용들은 실용적인 측면을 중시하는 내게 있어서는 중요한 내용이고, 실제로 초기 서비스를 구축하는 예비 창업가들에게도 중요하게 해당되는 내용이기에 방향성이 일치하여 그들에게도 큰 도움이 되었다는 긍정적인 피드백을 받았다. 오죽하면 실제로 PHP 코드를 작성하는 것보다도 수업 중간중간에 언급했던 코딩에 대한 공통적인 내용이 더 좋았다는 이야기도 있었다.
이는 PHP 와는 직접 관련 없이 직접 서비스를 만들어야 할 예비 창업가들이 생각해야 하는 내용이었기 때문에 코드 자체를 완벽하게 이해하냐 마냐에 대해서는 크게 집중하지는 않았다. 사실 이들에게 문법 같은 것은 크게 중요한 것이 아니다. 그저 백엔드와 코딩에 대한 전반적인 이해를 돕기 위해 초보자도 배우기 쉬운 PHP라는 도구를 사용했을 뿐이다. 짧은 기간이었기 때문에 시간이 지나면 문법은 반드시 까먹는다는 것을 전제로 했고, 대신 코딩에 대한 공통적인 부분만큼은 이해시키고 넘어가자는 것이 이번에 내가 코딩강사로 일할 때 추구한 가치라 볼 수 있다. 특히 이번 강의에서는 개념과 기술적인 것에만 매몰되고 집착하는 것은 내가 추구하는 방향성과는 거리가 멀었다.
지금은 지난 과거와는 달리 코딩 AI 가 상당히 발전한 상태이기 때문에 코드를 치기 위해 코드 편집기를 먼저 여는 것보다는 코드가 아닌 글로써 로직에 대한 이해를 하고 넘어가는 것을 가장 중점적으로 여겼다. 이제는 생성형 AI라는 존재로 인해 코딩으로 직접 구현하는 것은 중요도가 과거에 비해서는 내려갔다. AI에 거부감이 있는 보수적인 개발자들이 보기에는 탐탁지 않을지도 모르겠지만, 현실은 너무나도 빠르게 변하고 있다. 내가 구현하고자 하는 기능의 로직을 말로 올바르게 설명할 수 있으면 AI에게 코딩을 부탁할 수도 있고, 이러한 방식으로 코딩을 이해하면 PHP 가 아니라 다른 언어를 사용하더라도 충분히 커버되는 내용이었기 때문이다. 그래서 늘 옆에서는 ChatGPT를 켜놓고 수업을 진행했다.
한 가지 경계했던 점은 AI에 대한 지나친 과의존이었다. AI 가 있는데 내가 직접 코드를 짜야하는 이유에 대해서라든지, 오류 메시지가 나면 오류 메시지에 대한 고민도 안 해보고 바로 물어본다든지와 같은 것이다. 생성형 AI는 질문자가 어떻게 질의하냐에 따라 천차만별의 대답을 내놓는다. 요구하는 기술적 수준을 구체적으로 명시하거나 로직과 체계를 갖추어 질문하는 것은 생성형 AI를 잘 사용하기 위한 방법이다. 즉, 질문자의 질의 수준에 따라 생성형 AI 도 함께 똑똑해지는 것이다. 문제는 AI 가 내놓는 대답은 내가 긴 시간 고민하고 도출한 결론도 아닐 뿐만 아니라 지금 당장의 문제해결을 위한 것이기 때문에 결국 내 것이 되지는 못할 가능성이 크다는 점이다. AI의 도움을 받아서 지금 당장의 오류를 해결은 했는데, 본질적으로는 똑같지만 문맥만 다른 오류를 접했을 때 해결하지 못하는 것이다. 초보자에게 AI는 양날의 검이다. 따라서 AI로 도움을 받거나 일을 위임하는 것도 좋지만, 지나친 의존은 오히려 사용자를 멍청하게 만든다는 것을 인지해야 한다.
수업의 커리큘럼 자체만 놓고 보면 그저 평범하게 문법을 익히고 회원제 게시판을 전통적인 PHP 프로젝트의 형태로 만드는 일이었지만, 앞서 이야기한 백엔드와 코딩에 대한 전반적인 내용을 설명하는 것에 있어서는 PHP가 가진 특유의 낮은 진입장벽 덕에 큰 도움이 되었다. 내가 처음 코딩을 배울 때는 C를 배웠는데, 메모리가 어쩌니 포인터니 뭐니와 같은 기술적인 개념들에 매몰된 나머지 정작 중요한 논리와 메인로직을 짜는 내용은 등한시되었다. 난 이게 정말 싫기 때문에 과거와 같은 교육방식은 되풀이하지 않으려 했다. 특히 반복문으로 무의미한 별찍기를 하는 것은 정말 혐오한다. 개념이나 기술, 아키텍처와 같은 내용에는 집착하지 않고 코드를 짜기 위해 거쳐야 하는, 먼저 로직을 머릿속에 그리고 글로 표현하는 과정에 대한 내용을 반복함으로써 코딩은 그저 말로 작성한 로직을 코드로 번역하는 행위일 뿐이라는 그 본질에 다가서는 것에 중점을 두었다.
회원제 게시판을 전통적으로 구현하는 일 이외에도 해킹과 보안, 코드 분할과 같이 코드의 내실에 대한 내용도 시간을 들여 보충했다. 내게 주어진 짧은 정규 수업시간 만으로는 문법, 인증과 게시판, 댓글, 파일 업로드와 다운로드 등의 기능만 구현해도 상당히 버거웠으나 결국 해킹과 보안에 대한 내용을 빼버리면 검색해서 나온 대로 PHP는 보안이 좋지 않다는 인식에서 절대 벗어날 수가 없기 때문에 빼먹을 수가 없는 문제였다. PHP는 자유도가 높은 언어다. 자유도가 높다는 것은 규칙과 제약이 많지 않다는 것이고, 그만큼 코드의 품질이 개발자의 역량에 크게 좌우된다는 뜻이다. 개발자가 보안을 고려하지 않고 코드를 작성한다고 해서 구현에 있어서는 그 어떠한 문제도 발생하지 않는다. 다만 그대로 해킹에 노출되고 취약한 코드가 작성될 뿐이다. PHP의 보안이 나쁘다고 평가받는 것은 언어의 문제가 아니라 개발자의 역량문제라는 점을 명확하게 인지시킬 필요가 있었다. PHP는 알리오올리오 파스타 같다. 중학생도 배울 정도로 진입하기도 쉽고 만들기도 어렵지 않지만 잘하기는 그만큼 어려운 것이다.
프로젝트의 구조적인 측면에서도 볼 때 전통적인 구조로 작성된 PHP 프로젝트는 메인로직이 담긴 파일 이외에는 다른 파일이 거의 없기 때문에 직관적이라는 장점은 있지만 코드의 분할이 되지 않아 체계적이지 않다는 큰 단점이 있는데, 이는 다른 언어로 작성된 체계적인 웹 프레임워크를 경험하고 나면 PHP는 구조적으로 코드가 체계적이지 않다는 인식이 필연적으로 발생하기 마련이다. 따라서 코드를 분할하고 체계적으로 구성하는 것도 보충했다. 물론, PHP 에도 풍부한 생태계와 체계적인 구조를 지닌 라라벨(Laravel)이라는 멋진 프레임워크가 있지만 PHP 언어와는 달리 생각보다 진입장벽이 높은 편이기 때문에 적합하지 않아 수업시간에는 소개만 하고 넘어갔다. 간혹 가스라이팅 수단으로 자바가 아니라 스프링과 PHP를 비교하는 사람이 있는데, 이는 대단히 멍청한 행동이다. 스프링은 프레임워크이므로 라라벨과 비교해야 하며 자바는 언어이므로 PHP와 비교 대상이 되어야 한다.
문법적으로는 최소기능 구현에 딱 필요한 내용인 함수까지만 진행했기 때문에 메인 로직을 포함한 모든 기능은 전부 함수화 했다. 주석을 굳이 쓰지 않더라도 중학생이 봐도 이해할 수 있는 읽기 쉬운 코드야 말로 코드를 짜는 것에 있어서 내가 추구하는 최고의 가치였기 때문에 내 성향상 로우레벨 함수를 그대로 사용하는 것은 내 교육의 방향과 일치하지 않는다. 특히 말로 작성한 로직을 코드로 바꿀 때는 코드를 함수화를 해서 표현하면 코드의 절대적인 길이는 늘어나지만 읽을 때 훨씬 이해하기 쉬워진다는 장점이 있다. 어찌 보면 이러한 내용들은 내가 이 시대의 많이 남아있지 않은 대한민국의 PHP 개발자이자 강사로서 해야 하는 일이자 의무이다. 개인 블로거와 크리에이터들로부터 전파된 PHP에 대한 무분별한 선입견으로부터 해방시키고, 과거로부터 써오던 안티패턴은 지양하면서도 보안과 체계를 갖춘 코드를 작성할 수 있도록 해야 하는 것이다.
강의를 시작하기 전, 처음 커리큘럼을 짤 때 내가 간과했던 사실은 생각보다 진도가 느렸다는 점이다. 코드를 작성하는 타이핑 속도를 내 기준으로 생각한 것은 큰 착오였으며 나도 그새 코딩을 처음 배웠던 올챙이 적 시절을 잊어버린 것인지 진도를 빠르게 나가려고 했던 것도 있다. 교육과정에서 개별 수강생이 기능을 테스트해 보고 에러의 원인을 찾고 개선하는 과정도 생각하지 않은 심각한 오류를 범했다. 기능 이해 - 명세 정의 - 로직 기술 - 기능 구현 - 기능 테스트 - 오류 해결 - 코드 설명 - 질의응답이라는 반복되는 프레임워크에서 많은 부분을 고려하지 못했던 것이다. 결국에는 내가 계획했던 진도보다 1/2 수준으로 느리게 나갔다. 계획하기로는 레거시 프로젝트를 MVC 아키텍처까지 개선하는 것을 목표로 했었지만 MVC는커녕 레거시로 구현만 하는 것에도 시간을 다 보내버렸기 때문이다. 온라인이 아닌 오프라인 강의라는 차이점도 있었으므로 이 부분은 고려하지 못한 것이 착오였다. 이제는 나만의 강의 프레임워크가 구성되었기 때문에 기회가 된다면 다음에는 조금 더 현실적으로 커리큘럼을 계획할 예정이다.
수업의 운영측면에서 좋은 피드백을 받았던 것은 반복과 복습이었다. 온라인으로 수업할 때는 수강생이 스스로 강의영상을 돌리고 멈추고 반복할 수 있지만, 오프라인에서는 그렇지 않기 때문이다. 교육에 있어서 예습과 복습은 모두 중요한 사안이지만, 장기기억으로 남으려면 결국 꾸준한 복습은 필연적이기 때문에 이를 중요시 여겼다. 다음날에 배울 내용을 예고하고 수업자료를 제공하여 예습하도록 했으며 주요 개념은 수업시간에 배우고, 과제에서 수업시간에 배운 주요 내용을 복습하게 했으며 다음 날에 과제를 리뷰하는 것으로 같은 내용을 네 번 머릿속에 입력시키고 이해시키고자 했다. 그럼에도 불구하고 이해하고자 하는 노력을 안 하는 사람은 필연적으로 있기 마련인데, 안타깝지만 그 사람에게 더 신경을 쓰면 노력하고 있는 다른 사람이 시간손실을 보기 때문에 의지가 보이는 사람에게는 정규수업시간 이후에도 시간을 더 투자했다. 나도 사람이기 때문에 태도가 좋고 열심히 하려는 사람이 있으면 일대일로도 봐주고 지도하는 편이다. 냉정하게 말해서 할 생각이 없는 사람을 붙잡고 있는 것은 시간낭비다.
나의 첫 오프라인 코딩강의였고, 그 특성상 즉각적으로 피드백을 들을 수 있다는 점에 있어서 즐겁게 수업했다. 처음에는 더디다가도 점차 나아지고 코딩에 대한 감을 잡아가는 수강생을 보면 보람이 느껴지기도 했다. 오프라인 강의에 대한 체계적인 프레임워크가 잡혔다는 점에 있어서 나도 크게 성장했다. 교육은 때때로 개인의 삶을 바꾸거나 깨달음을 줄뿐만 아니라 개인의 실질적 가치를 증대시키고 개선한다. 그리고 나는 그런 일을 좋아한다. 어찌 보면 내가 개발을 하는 것도 단지 엔지니어로서의 기술적 호기심이나 욕심이 아니라 개발자로서 그저 내가 만든 도구로 누군가의 문제를 해결하여 사람이나 기업의 가치를 증대시키고 개선할 수 있기 때문에 하는 것일지도 모른다는 생각을 문득 하게 된다.