소프트웨어 開發者는 大槪 게으르다. 적어도 컴퓨터 앞을 잘 떠나지 않는다는 面에서 그렇다. 冊床 한便에 수북이 쌓인 飮料水 캔이나 間食 包裝紙 따위는 開發者들이 모여있는 空間에서 쉽게 目擊할 수 있는 光景이다. 움직이지 않는 만큼 慢性的인 運動 不足에 시달린다. 開發者는 돼지나 멸치 中 하나라고 自嘲的인 말을 하는 理由다.
開發者 時節의 마크 저커버그. 2005年의 모습이다. 冊床 위가 지저분한 것을 보면 저 時節 開發을 했던 것이 分明하다. 삐딱하게 앉은 姿勢마저 이 確信에 힘을 실어준다.
그뿐만이 아니다. 字板 두드리는 것마저 대단히 귀찮아한다. 한 打라도 적게 치기 위해 갖가지 매크로를 設定하고 各種 플러그인들을 찾아 헤맨다. 이쯤 되면 컴퓨터로 밥 벌어먹는 사람이 맞나라는 疑問이 생길 地境이다.
그렇다고 無酌定 게으르다고만 볼 수는 없다. 開發者들은 큰 意味 없는 反復 作業을 極度로 警戒하는 習性을 가졌다. 코딩할 때 키보드와 마우스를 오가는 것조차 浪費라고 생각한다. 키보드만으로 모든 編輯이 可能한 ‘VI 에디터’나 ‘Emacs’ 等을 利用하는 開發者가 흔한 理由다. 甚至於 여기에 性이 차지 않으면 必要한 道具를 새로 만들어 버리기까지 한다. 어느 것이 本業인지 헷갈릴 程度다.
프로그램을 作成할 때도 마찬가지다. 같은 役割을 하는 코드가 여기 저기 흩어져 있는 것을 가만히 두고 보지 못한다. 於此彼 여기에 必要한 것은 손가락 몇 番 더 움직이는 程度밖에 없는데도 말이다. 代身 重複된 코드를 묶어 한 個의 函數로 만들어 버린다. 共通으로 使用할 수 있는 코드를 만드는 것은 이것저것 생각할 것이 豫想밖으로 많은데, 이런 精神的 勞動의 수고로움을 마다하지 않는 것이다.
開發者들에게 神經症的 强迫이 있어 이런 것은 決코 아니다. 머릿속에서 그려낼 수 있는 論理 흐름의 量은 아무래도 制限이 있을 수밖에 없다. 사람이기 때문이다. 텍스트 空間의 政敵인 코드를 보며 時間 空間의 動的 實行 狀態를 豫測하려면 더욱 그러하다. 프로그램의 複雜度가 올라갈수록 增加하는 버그의 危險을 回避할 方法으로 構造的 프로그래밍 方法論이 提起된 理由다. 여기에 核心을 차지하고 있는 것이 바로 函數다. 오름次順 整列의 複雜한 論理 展開를 函數 呼出 한 줄로 머릿속에서 簡單히 消去해 버릴 수 있기 때문이다.
알고리즘 系의 最終 보스로 評價받는 에츠虛르 데이크스트라. “GOTO 問議 해로움”(Go To Statement Considered Harmful)이란 多分히 論爭的인 題目의 論文을 發表하며 構造的 프로그래밍 方法論을 主張했다.
마침 判斷門 敎育을 進行하며 아이는 지나치게 複雜해진 코드를 어려워했다. 狀況만 봐서는 函數를 가르치기 딱 좋은 때라 생각했다. 複雜한 코드가 瞬息間에 簡單해지는 奇跡을 經驗하는 것만으로 函數 使用의 必要性을 몸소 깨달을 수 있을 것이다. 이제 必要한 것은 9살 아이가 물 흘러가듯 槪念을 理解할 수 있도록 實習 課題를 配置하는 것이다.
먼저 實習 課題의 內容은 그림 그리기로 構成했다. 變數와 判斷을 進行하며 지나치게 槪念的인 方向으로 치우쳤다는 反省에서 出發했다. 아이의 눈에서 지루함을 느꼈다. 暫時 쉬어가는 時間이 必要하다 생각했다. 아무래도 9살 아이에겐 卽刻的이고 視覺的인 反應으로 動作을 理解하는 게 더 어울릴 것이다. 더구나 엔트리의 函數 블록은 結果 값 返還 機能을 提供하지 않는다. “f(x)=ax+b”와 같은 數學 函數의 役割을 期待할 수 없다는 말이다. 오로지 函數 안에서 動作 制御 程度가 可能한데, 그렇다면 그림 그리기야말로 函數 敎育에 제格이라 判斷했다.
다음으로 코드 묶음으로서 函數의 意味가 段階的으로 傳達될 수 있도록 構成했다. 同一하게 四角形을 그리지만 서로 다른 方式을 利用하여 具現하도록 했다. 처음에는 順次 遂行이 이뤄지도록 하고, 다음에는 信號 보내기와 받기를 利用해 코드 묶음이 抽出되는 點을 보여주며, 마지막으로 信號를 函數로 代替하는 것으로 段階를 엮었다.
코드 묶음이 函數로 變換되는 過程을 段階的으로 傳達했다. 위 세 코드는 모두 同一하게 四角形을 그리는데, 信號와 函數를 利用해 코드 묶음이 抽出될 수 있음을 보여주려 했다
敎育 두 時間 동안 아이는 큰 어려움 없이 코드 묶음으로서 函數의 意味를 把握했다. 勿論 角度 等에 對해서는 別途의 說明이 必要했다. 아직 學校에서 배우지 않은 것이기 때문이다. 0度에서 180度까지 角度를 바꿔가며 實行해 보라고 했다. 直觀的으로 角度를 익힐 수 있을 것이라 判斷했다. 이내 곧 아이는 별이 그려졌다며 神奇해 했다.
아이가 우연하게 별 模樣을 만들었다(왼쪽). 實習으로 만든 簡單한 그림板으로 ‘金’을 그렸다(오른쪽)
自身이 만든 그림板으로 이것저것 그려보던 아이가 문득 물었다. 信號만 利用해도 되는데 굳이 函數를 使用하는 理由를 모르겠다는 것이다. 엔트리에서 函數의 內容을 보거나 고치려면 函數 블록을 더블클릭해야 하는데, 信號를 利用하는 게 더 便하다는 것이다. 信號 보내기로는 角度와 邊 길이를 傳達할 수 없지 않냐고 答했다. 아이는 지지 않고 答辯의 꼬리를 물었다. 變數 만들고 거기로 傳達하면 되는 것 아니냐며 투덜거렸다. 제법 날카로운 質問이나, 9살 아이에게 딱히 說明할 方法을 찾기 어려웠다. 높은 凝集도와 낮은 結合도(High Cohesion, Low Coupling) 原則이 適用된, 再使用性 높은 코드를 만들기위해 全域 變數의 使用은 抑制되어야 한다고 9살 아이에게 말할 수는 없다. 보기 좋은 떡이 먹기도 좋다는 俗談으로 얼버무릴 수밖에.
도움資料
1) 12~13日 次 敎案을 共有합니다.
https://drive.google.com/drive/folders/1Jq8TgernewDdRkHsoJUCskZbhFNhl-fV
2) 아이와 만드는 코드도 共有합니다. 엔트리 메인畵面의 共有하기에서 “chloe10”을 檢索하세요.
※筆者紹介
김기산
企業에서 IT 디바이스 소프트웨어 開發者로 일하고 있다. 大學에서 電子工學을 專攻하고 20年 가까이 리눅스 開發者로 지내다가 뜻밖의 契機로 育兒休職을 냈다. 지난해 한層 强化된 '아빠의 달' 制度의 受惠者로, 9살 아이와 스킨십을 늘리며 福祉 擴大의 肯定的인 面을 몸소 깨닫고 있다.