처음 만드는 소프트웨어는 약하고 부서지기 쉽습니다.
개발자가 소프트웨어를 만드는 행위는 꾸준히 버전을 업그레이드해서 생명력을 갖도록 하는 일입니다.
소프트웨어 버전이 올라갈수록 기능이 추가되고, 예외 상황을 대처하면서 점차 단단해지고 완성되어 갑니다.
그런 소프트웨어를 만드는 경험을 반복하려면 개발자도 자신을 업그레이드해 차근차근 버전을 올려야 합니다.
지속적으로 성장하는 소프트웨어 버전처럼 개발자 자신의 메이저 버전을 업그레이드하는 마이너 원칙들을 소개합니다.
낯선 방식으로 해결하기
앞서 ‘두리번거리면서 속력과 방향을 자주 확인하기‘에서 다룬 ‘나만의 속도’는 ‘메타 인지’라는 용어와 맞닿아있습니다.
나만의 걷는 속도, 나만의 식사 속도, 나만의 독서 속도, 나만의 성장 속도를 인지하는 것은 어려운 일입니다.
자기 자신에 대해 한발 물러나서 살펴볼 기회도, 그런 방법도 낯설기 때문입니다.
어떻게 나만의 속도를 인지할 수 있을까요?
나만의 속도를 인지하려면 기준점과 변곡점이 필요합니다.
그래서 두 번째로 시도할 원칙은 나만의 속도를 인지하는 데 유용한 ‘낯선 방식으로 해결하기’입니다.
학습은 익숙한 것을 의식하지 않고 반복하는 게 아니라, 낯선 것을 의도를 갖고 배우는 겁니다.
나만의 속도가 있는 것처럼, 학습 방법 중에서도 자신에게 익숙한 방법이 있습니다.
선생님이 칠판을 사용하는 수업에는 다들 익숙할 겁니다.
선생님은 자신이 이해한 지식을 작은 단위로 나눠서 말로 표현하고, 수업을 듣는 학생들은 선생님이 구조화한 지식에 대한 설명을 그대로 수용하는 방식입니다.
그렇게 선생님이 학생에게 전달한 지식을 외우고 잘 기억하는지 확인하는 게 바로 시험입니다.
학교에서는 이미 알려준 지식을 암기해서 시험지에 있는 답을 찾아내고, 몇 개 정답을 찾았는지 나타내는 점수가 좋으면 학습이 뛰어난 것으로 간주합니다.
IT 교육 서비스에서 진행하는 온라인 수업이나 코비드 바이러스로 인한 온라인 수업도 매체만 다를 뿐 결국 같은 방법입니다.
학생은 선생님이 전달하는 상징과 개념, 표와 그림, 단어와 문장, 맥락 등을 이해하려고 노력합니다.
새로운 지식이 기존 지식과 만나면 서로 강하게 연결됩니다. 반면에 정확하게 이해되지 않은 새로운 지식은 느슨하게 연결됩니다.
느슨한 연결 고리는 약해서 언제든지 끊어지고 곧 사라집니다.
10년 전에 프로그래밍 언어를 처음 배우는 학생들에게 자바 문법을 알려주고 이런저런 프로그래밍 연습을 하는 수업을 담당한 적이 있습니다.
자바 자료형을 설명하면서 C 언어의 int, float 같은 원시 타입(primitive type)과 자바의 Int, Float 같은 클래스 타입이 어떻게 다른지 차이점을 소개했습니다.
나름 친절하게 풀어서 설명했는데도, 설명을 듣자마자 다들당황스러운 표정을 지었습니다. 모르는 자료형을 설명하면서 또 다른 모르는 단어로 설명했기 때문이었습니다.
이처럼 모르는 것을 알고 있는 것으로 설명하지 못하면 연결 고리가 생기지도 않습니다.
나는 익숙하기 때문에 이미 알고 있지만 다른 사람들은 모를 수 있는 개념을 구분하지 못한다는 것을 인지하지 못했습니다.
나에게 익숙한 것은 내가 잘 알기 때문에 설명하기 쉽다고 생각하지만 상대가 누구인지에 따라서 상황은 달라집니다.
무엇인가 안다고 생각할 때는 이미 알고 있는 것과 그렇지 않은 것을 이분법으로 구분합니다.
그래서 이미 알고 있는 개념과 단어를 이용해서 그 개념을 설명하려고 시도합니다.
심리학자들은 이럴 때 확증 편향과 지식 착각이 발생한다고 합니다. 자기도 모르게 지식을 알고 있다고 착각하고 확신을 가지게 됩니다.
확신을 갖고 개념과 단어들을 연결한 문장을 다른 사람에게 전달해도 원시 타입과 클래스의 일화에서처럼 모르는 개념만으로 설명하면 안 됩니다.
청자가 아는 말로 설명해야 합니다.
바로 그 순간 ‘이미 알고 있다고 생각했던 개념과 지식’을 ‘여전히 익숙한 것’과 나는 ‘알고 있다고 착각한 것’으로 구분할 수 있게 됩니다.
어떤 대상이 물어봤더라도 이해하기 쉽게 설명할 수 있어야 진정으로 아는 겁니다. 그렇지 못하다면 알고 있다고 착각했던 겁니다.
다음 그림에서는 3단계로 구분해서 표시했지만 사람마다 범위와 간격이 달라질 수 있습니다.
알고 있고 익숙한 것을 확인하는 가장 좋은 방법은 배경지식이 없는 사람에게 새로운 개념을 설명하는 겁니다.
처음부터 100% 이해시키는 것을 목표로 설명하지 않아도 됩니다.
작은 개념을 설명하고 이해한 만큼 다시 설명해보라고 하면서 10회 동안 주고받기를 해도 됩니다.
진정으로 알고 있는 거라면 어떤 상황에도 다른 표현으로 다시 설명하려고 시도하겠지만, 그렇지 않다면 설명하다가 막히게 될 겁니다.
과거에 느슨한 연결 고리가 생성되었지만 고리가 끊어져 지금은 모르게 되는 경우일 수도 있습니다.
저는 12살에 베이식(BASIC) 언어로 프로그래밍을 시작했고, 중학생 때 터보 파스칼을 배우다가 대학에서는 C와 C++을 배웠습니다.
새로운 언어를 배우는 것은 호기심 가득하고 흥미롭고 즐거운 도전이었습니다.
그렇지만 다른 언어를 주로 사용하다 보면, 기존에 익숙하던 언어의 문법이 떠오르지 않을 때가 있습니다.
이처럼 자주 사용하지 않는 문법, 즉 느슨한 연결 고리는 끊어지기 쉽습니다.
반면에 여러 언어에서 공통적으로 사용하는 개념은 강한 고리가 연결되기 때문에 기억에 오래 남습니다.
학창 시절을 되돌아보면 고등학교까지는 무조건 외워서 시험을 봐야하는 과목이 많았습니다.
국사, 세계사, 한자 같은 암기 과목은 벼락치기 방법으로 단기 기억에 의존해야만 했습니다.
그렇게 외웠던 지식은 시험이 끝나고 이틀만 지나도 잊혀집니다.
인지공학과 교육공학에서는 기억을 형식지와 암묵지로 구분합니다.
형식지는 문서화 데이터화가 가능한 지식으로서 단기 기억과 장기 기억을 활용하는 지식입니다.
자주 사용하지 않으면 시간이 지나면서 잊게 됩니다.
반면 암묵지는 언어나 문자로 표현하기는 어려운 몸으로 체화된 지식입니다. 춤추기, 자전거 타기 등을 예로 들 수 있습니다.
형식지나 암묵지 모두 기억이라 떠올리는 노력이 필요합니다만 암묵지는 형식지에 비해 그 노력이 적게 듭니다.
그래서 10년 전에 배운 국사 지식을 제대로 떠올리려면 각잡고 공부를 해야겠지만 10년만에 자전거를 타면 조금 비틀거리다가 이내 안정을 찾을 수 있습니다.
그렇기에 성장하는 나를 만들려면 형식지에 속하는 프로그래밍 지식을 나만의 암묵지로 만들어야 합니다.
암기로는 프로그래밍 지식을 암묵지에 저장할 수 없습니다.
암묵지는 머리로만 외우는 것이 아니라 감각을 이용해서 몸에 익숙해져야 하기 때문입니다.
물론 프로그래밍 형식지가 필요 없다는 말이 아닙니다.
소프트웨어를 학습하는 단계부터 암기 위주 익숙한 학습 방식을 내려놓고, 낯선 방식으로 직접 소프트웨어를 만들면서 해결하려고 노력해야 합니다.
메타적인 관점에서 바라봅시다.
학습하는 과정에서 자신의 학습 방식, 이해하는 방식, 설명하는 방식, 학습 과정을 개선하는 방식까지 학습해야 합니다.
앞선 원칙에서 설명한 속도와 방향을 인지하는 것부터 시작하세요.
그러고 나서 의도적으로 익숙한 방식을 멀리하고, 의도적으로 낯선 방식을 선택해보세요.
프로그래밍 언어나 개발 환경에 제약사항을 추가해보세요.
익숙한 것을 반복하면 더 오래 기억할 수 있게 되지만 성장하지는 못합니다.
성장을 위한 더 효과적인 방법은 의도적으로 낯선 환경을 만들고, 제약사항을 추가해서, 도전적이면서 살짝 어렵지만 재밌는 요소를 찾아서 학습하는 겁니다.
내가 익숙하게 풀었던 문제나 코드를 새로 익히는 언어로 풀어보는 것도 좋습니다.
새로운 언어가 아니라면 함수를 작성할 때 10줄 이내로만 작성하려고 시도해봐도 좋습니다.
객체지향 언어에 익숙하다면 함수형 표현으로 작성하려고 해봅시다.
익숙한 통합 개발 환경 대신에 터미널에서 CLI 명령만으로 빌드를 직접 해보는 것도 흥미로운 제약사항입니다.
마우스 없이 키보드만으로 단축키 쓰기에 도전해봅시다.
이렇게 제약사항을 추가하면서 의도적인 수련을 반복하면 형식지에 암묵지가 더해지는 기적을 만나게 될 겁니다.
만약 제약사항을 찾기 어렵거나, 자기 자신을 돌아보기 어렵다면 다른 개발자를 만나봅시다.
3편에서 소개할 원칙은 ‘개구리를 해부하지 말고, 직접 만들기’입니다.
★ 더 나은 개발자로 성장을 꿈꾼다면
★ 먼저 헤쳐온 테크 리더들의 원칙에서 해답을 찾아보세요
“나도 테크 리더가 될 수 있을까? 어떻게 선배 개발자들처럼 성장할 수 있을까? 3년 10년 후에도 개발자로 살아갈 수 있을까? 팀워크는 도대체 어떻게 맞춰야 하는 걸까?”
개발자로 살아가면서 하루에도 천 번을 되묻는 물음에 마켓컬리, 레몬트리, 카카오, 코드스쿼드, 무신사, 몰로코, 데이블, 인프런, 패스트캠퍼스 테크 리더 9명이 답합니다.
지금까지 만나 볼 수 없었던 생존과 성장의 원칙에서 자신만의 해답을 찾아보세요.
김정
소프트웨어 교육 기업 코드스쿼드 대표로 모바일 iOS 마스터를 담당합니다. 케텔 시절 비파툴, 델마당 개발자 커뮤니티를 시작해서 취미 맥개발자 커뮤니티 OSXDev를 거쳐 레츠스위프트 커 뮤니티 운영진으로 끊임없이 살아가는 중입니다.