마스터즈 2020 코스를 마치고
컴퓨터 공학의 역사가 다른 분야에 비해서는 상대적으로 짧지만, 그중에서도 소프트웨어 개발 분야는
더 효율적으로 일하고, 더 소프트하고, 더 유연하게 개발하기 위해 노력하는 부분이 꽤 다르다. 올 해초부터 전 세계 모든 사람들이 강제적으로 집에서 일하고 있지만, 원격으로 일을 하기에 가장 영향을 덜 받은 직업 중에 하나가 소프트웨어 개발자들이 아닐까 싶다.
과학과 공학은 서로 디딤돌이 되어주며 상호 보완적으로 발전해왔다. 인류 역사에서 철학이나 수학과 함께 가장 오래된 학문 중에 하나인 과학은 이제 공학의 힘을 빌려서 더 정밀하고, 더 광활한 분야까지 연구할 수 있다. 올해 마스터즈 코스를 하면서 컴퓨터 공학과 컴퓨터 과학이 어떻게 다르냐는 질문에 다음과 같은 그림을 그려서 설명했다.
과학은 자연에 존재하는 개념과 원리를 찾아내기 위해서, 이런저런 가정을 해보고 관찰하고 측정해서 데이터를 수집하고, 분류해서 규칙을 설명하는 새로운 모델을 완성해간다. 그렇게 만들어진 모델은 공학으로 다시 인공적으로 재현하는 부품을 설계하고, 제품을 개발해서 그 실체를 다시 검증하는 단계를 거친다. 과학자들은 다시 도구를 활용해서 또 다른 가설을 만들고 과학적 발견을 반복한다.
그렇다면 다시 위의 질문으로 돌아가서 컴퓨터 과학과 컴퓨터 공학의 범위나 역할은 무엇이 다를까. 대학에서 컴퓨터 과학과와 컴퓨터 공학과 전공과목들을 펼쳐놓고 생각해봤다. (아래 그림은 개인적인 관점에서 정리한 것이고 학교마다 실제 수업 범위는 다르며, 전공 학점으로 인정하는 범위도 다를 수 있다.)
좌측에 있는 초록색 범위는 컴퓨터 과학과 (혹은 일부 학교는 전산학과)에서 배우는 전공과목들이다. 컴퓨터가 동작하기 위해서 필요한 이론적인 배경 지식들과 원리를 설명하는 과목들이 대부분이다. 대부분 수학 지식이 꼭 필요하고, 실제로 증명된 이론들이 바탕을 이루고 새로운 분야의 원리를 설명한다. 그래서 전공생들에게도 꽤 어려운 과목들이다.
우측에 있는 붉은색 범위는 전자공학과에서 배우는 전공과목들이다. 물리, 화학, 전기적인 원리를 바탕으로 전자 부품을 만들고, 연결해서 전자 회로를 만든다. 반도체 원리를 공부하고 집적 회로를 설계하고, CPU나 메모리 부품을 만들기도 한다. 이런 부품들을 결합해서 컴퓨터 하드웨어를 구성한다.
가운데 있는 파란색 영역이 컴퓨터 공학 분야인데, 컴퓨터 원리와 하드웨어 회로 동작까지 두루 공부하고 컴퓨터에서 동작하는 다양한 소프트웨어를 만드는 방법들을 공부한다. 세부적인 전공과 조합에 따라서 하드웨어에 가까운 소프트웨어를 공부하기도 하고, 특수한 목적을 가지는 임베디드용 소프트웨어를 공부하기도 한다. 컴퓨터 과학에 원리를 바탕으로 새로운 소프트웨어를 구현하는 분야도 있다.
위 그림은 소프트웨어 교육이 어떤 의미를 가지는가 보여주는 '컴퓨터처럼 생각하기' Computational Thinking에 대한 그림이다. 우리가 살아가는 현실에는 수많은 문제들이 존재한다. 사람들은 크고 작은 문제들을 해결하기 위해서 선택을 하고 행동을 한다. 무엇을 먹을지 고민하고 재료를 사서 요리를 하기도 하고, 낯선 약속 장소에 가기 위해서 지도를 찾아보기도 한다. 이런 것들이 생활 속에서 만나는 문제들이다.
소프트웨어는 컴퓨터 하드웨어에서 어떤 의도로 특정한 문제를 해결하는 자동화된 프로그램을 말한다. 컴퓨터를 사람이라고 비유하면, 우리가 고민하고 선택하고 행동하기 위해 생각하는 과정이 소프트웨어의 역할이다.
소프트웨어를 만드는 방식을 배우는 과정은 현실에서 문제를 찾아내기 위해서 관찰하고, 언어로 표현하고, 문제 상황을 공감하고 이해해서 눈에 보이지 않지만 추상적으로 문제를 표현할 수 있어야 한다. 그렇게 문제를 정의하고 나서 논리적으로 분석하고, 단계적인 절차를 추리하고, 더 좋은 방법을 비판적으로 찾아낸다. 이런 해결 방법을 찾고 나면, 스스로 몸으로 행동하는 게 아니라 컴퓨터가 자동으로 계산하고 절차적으로 처리하도록 준비하는 게 바로 프로그래밍 과정이다.
그리고 한 단계 더 나아가서, 그렇게 프로그램을 만들다 보면 프로그램이 동작하는 과정을 확인해서 의도한 결과가 나오는지 확인하고 오류를 수정하는 과정을 거치게 된다. 이런 절차를 '디버깅'이라고 부른다. 디버깅은 가설을 세우고 제대로 동작하는지 확인하는 공학적인 검증 절차를 포함한다.
소프트웨어 교육을 한다는 것은 이 모든 과정을 포함해야 한다. 문제를 분석하고, 요구사항과 제약사항을 찾아내고, 논리적으로 문제 해결 절차를 분석하고, 그것을 컴퓨터가 이해할 수 있는 프로그래밍 언어나 도구를 활용해서 구현한 다음, 구현한 내용을 디버깅 과정을 통해서 검증해야 한다.
다른 학문과 다른 점이 있다면 이 모든 과정이 컴퓨터 화면이나 가상 환경에서 일어나기 때문에 시간과 장소에 제약을 받지 않는 편이다. 더구나 요즘 컴퓨터들은 언제나 어디서나 인터넷에 연결이 되어 있어서 가상 환경이 다른 사람들과 연결되어 있다. 문자, 음성, 영상으로 원하는 상대와 얼마든지 대화를 주고받을 수 있다. 그래서 디지털 노마드처럼 휴양지에서 일을 하기도 하고, 코로나 시대에 어디서든지 일을 하는 데 불편함이 없다. 물론 그만큼 신뢰와 책임감이 더 필요한 것은 당연하다.
필자처럼 소프트웨어 개발을 하다가 전문적으로 소프트웨어 교육을 하는 사람들은 교육 과정에서도 소프트웨어 개발자들의 문화를 충분히 경험하고 이어갈 수 있도록 학습 환경을 만들자고 주장한다. 선배 개발자들은 소프트웨어를 만들면서 시행착오를 거쳤다. 너무 긴 기간 동안 프로젝트를 완벽하게 만들기보다는 더 자주 작은 단위로 절차를 반복하면서 점진적으로 개발하는 방식이 좋다는 것을 깨달았다. 학습 과정도 마찬가지 방식이 적용되어야 한다. 한 학기 동안 배워야 하는 지식 덩어리를 한꺼번에 학습하고 점검하는 게 아니라 작은 지식으로 나누고 자주 확인하고 피드백을 주고받으면 점진적으로 개선하는 게 더 효과적이다.
그렇게 자주 피드백을 주고받으려면 함께 일하는 동료끼리 피어 리뷰를 해야 한다. 짧은 주기로 피드백을 주고받기 위해서 개발자들은 구현한 코드를 서로 공유하고 다른 사람의 코드를 보고 그들의 생각을 주고받는 리뷰 과정을 거친다. 이런 짧은 주기 피드백은 학습 과정에서도 매우 효과적이다. 적절한 타이밍에 받는 피드백은 성장을 도와준다.
개발자들은 회사에서도 피드백을 주고받지만, 회사 바깥에 있는 비슷한 관심사를 가진 커뮤니티에서도 지식과 코드를 공유한다. 이런 공유 문화는 오픈 소스 커뮤니티라는 독특한 생태계를 만들었다. 내가 만든 결과물을 무료로 다른 사람들과 공유하고, 다른 사람이 만든 코드에 기여하면서 즐거움을 느낀다. 개발자 커뮤니티 공유 문화는 작은 코드 조각부터 전문적인 운영체제 소프트웨어까지 그 범위와 대상이 다양하다.
소프트웨어 교육은 소프트웨어 개발 문화를 반영해야 한다. 단지 소프트웨어를 배워서 결과물을 만들어내고, 남들에게 자랑하고, 자기만족으로 끝나기를 바라지 않는다. 이제 컴퓨터를 활용하는 분야는 점점 더 늘어나고 소프트웨어는 그 분야에 필요한 도구가 돼서, 또 다른 문제를 해결하는 바탕이 되어야 한다. 마치 과학과 공학이 서로 원리를 찾아내고, 그것을 재현해서 다음 단계 문제를 해결하는 도구가 되었던 것처럼.
과학뿐만 아니라 다양한 분야에서 소프트웨어를 활용해서 업무와 직업의 변화를 가졌던 것처럼, 소프트웨어 교육을 통해서 다른 교육 분야가 더 부드럽고, 유연하게 변화하고 발전할 수 있기를 기대한다. 그것이 소프트웨어 교육의 미래라고 생각한다.