brunch

You can make anything
by writing

C.S.Lewis

by 영춘 Oct 25. 2022

다중감각 프로그래밍

소프트웨어를 감각하는 일

로저 니본의  “일의 감각 전문가의 성장을 주제로 다루는데 어떻게 견습생이 각각의 단계를 거쳐 장인으로 나아가는지 보여줍니다. 실제 저자 역시 전문가로서의 이력을 갖고 있는데 외과 의사로서 다양한 수술을 경험했으며 현재 의료 분야에서의 교수법과 다양한 전문가를 연구하는 교수로 일하고 있습니다. 책의 내용  감각을 주제로 이야기하는 부분이 있는데 특히 다중감각의 사용을 이야기하는 부분이 흥미로웠습니다.


간단히 인용해보자면,

“Recognizing what's right has taken Andrew decades to learn. It's not something he can put into words because it's about sensation. He's not just using his hands, but 'reading' the press with his whole bod;; responding to the feel, sound and smell of his materials. He knows exactly the amount of pressure to apply. But when he let me have a go, I felt clueless. I was just pulling a heavy lever, with no idea what I was aiming to achieve.” - Excerpt From, “Expert, Roger Kneebone”

인쇄술 장인의 이야기에서  장인은 작업이  진행되고 있는지 알아차리기 위해 다양한 감각을 사용합니다. 그저 손으로만 행하는 것이 아니라 듣고 맡는  “느끼는것이 필요합니다.

“This multisensory awareness is what experts depend on. When you dissect the craft of any expert, you'll find something similar. Yet when you talk to these experts, they struggle to explain. They say things like, 'Well, you just do what's right - you just know.' But unless you've spent the years they've spent doing it, you can't 'just know'. And even then, you never really get there.” - Excerpt From, “Expert, Roger Kneebone”

이런 다중감각적인 인식은 말로 설명하기 어려운데, 작업의 질을 “그냥알아차리기 위한 실력을 갖추려면 수년의 경험이 필요합니다.


소프트웨어 엔지니어 입장에선 어떤 해석을   있을까요? 보통 키보드와 마우스, 그리고 모니터라는 인터페이스를 통해 작업물과 상호작용하는데 작업의 질은 물질적이기보단 논리적입니다. 코드의 간결함이나 논리적 일관성, 유지보수의 용이함, 결합도  다양한 측면이 존재하는데 이것들을 하나의 감각이라고 비유한다면 다중감각적인 인식이 작용한다고 말할  있습니다.


소프트웨어를 작성하는 일은 그저 아이디어를 코드로 옮기는 일은 아닙니다. 서로 다른 엔지니어가 같은 명세를 갖고 작성한 소프트웨어의 결과물을 본다면 비슷할  있습니다. 명세를  지켜 구현한다면 의도한 입력-결과가 나오겠지요. 하지만 실제 작성된 코드는 비슷하지 않고 각자의 개성을 갖고 있습니다. 그리고 이곳에서 소프트웨어 견습생과 장인의 차이가 나타납니다. 소프트웨어 작성 경험이 많을수록 자신이 만들어낸 결과물이 어떤 특성을 갖는지 다른 요소들과 어떻게 상호작용할지 미리 생각해볼  있습니다. 초심자에 비해 인지적 용량 측면에서 여유를 갖고 있기 때문이겠지요.


소프트웨어 엔지니어도 다중감각적 인식을 행하는  같지만 역시 아쉬움이 남습니다. “내가 작성 중인 소프트웨어와  풍부하고 다양하게 상호작용할  없을까?” 모니터를 통해 전달되는 시각 정보 이외의 채널로 인식할  없을까?  질문이 이번 작업의 계기가 되었습니다. “다중감각 프로그래밍프로젝트는 소프트웨어 엔지니어와 소프트웨어 작업물 사이의 연결고리를 다양한 감각으로 확장합니다. 개념 증명 형태로 구현한 것은 소프트웨어 결과물의 질을 나타낼  있는 지표와 연동된 음향 신호 Sound Cue입니다.


저는 주로 Python으로 작업을 하는데 소프트웨어의 품질을 위해 몇 가지 도구를 활용합니다. 하나는 Linter라는 이름의 도구인데 소프트웨어 코드를 정적으로 분석하여 문법적인 오류를 찾아내거나 정해진 규칙을 위반한 사례 등을 찾아 알려줍니다. 또한 Python 언어의 경우, 동적 타입 언어이기 때문에 런타임 에러에 취약합니다. 타입 관련 오류를 줄이기 위해 Type Hinting 혹은 Type Annotation으로 불리는 방법을 사용합니다. 간단히 설명하면 변수 혹은 함수의 타입을 추가로 명세하여 변수 사용 혹은 함수 호출  올바른 타입을 사용하고 있는지 코드 수준에서 확인하는 것입니다. 다소 복잡한 이야기를 했는데 쉽게 말하면 코드 상의 문제점을 파악해주는 도구가 있고  결과를 사용할 생각입니다.


Pylint 그리고 Pyre라는 도구를 실행하면 얼마나 많은 문제점이 있는지 알려주는데 여기서 얻을  있는 문제점 개수를 활용합니다. 문제점 개수를 간단한 수식을 통해 다른 숫자를 계산하는데  숫자는 음향 신호의 발생 주기입니다. 코드에 문제가 없다면 1 주기로 음향 신호를 발생시키고 문제가 증가함에 따라 음향 신호가 발생하는 주기가 빨라집니다. 소프트웨어 엔지니어는 음향 신호가 빠르게 반복되는  알아차리고선 작업을  진행하기 전에 소프트웨어 품질을 위한 작업을 수행할  있습니다.


그럼  작업을 위해 어떤 코드가 필요했을까요?

Sonic Pi 설치

Sonic Pi로 명령을 전달해주는 Python HTTP Server

Pylint/Pyre 결과를 숫자로 바꾸는 Bash Script

정해진 주기에 따라 음향 신호를 요청하는 Bash Script


먼저 Sonic Pi 설치합니다. 사실 하나의 소리만을 발생시킨다면 tput bell 같은 명령으로 터미널  문자로 소리를 발생시켜도 됩니다. 이번엔 Pylint Pyre 결과를 따로 들려주기 위해 다소 과한  같지만 Sonic Pi 이용했습니다. Sonic Pi Ruby 프로그래밍 언어를 이용해 작곡을 하고 연주할  있는 a code-based music creation and performance tool입니다.


msp-sonic-server.py

from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
from base64 import b64decode

from sonic_pipe import SonicPipe
pi = SonicPipe(use_daemon=True)

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urlparse(self.path)
        params = parse_qs(parsed.query)
        for statement_b64 in params.get("statement", []):
          statement = b64decode(statement_b64).decode()
          print(f"statement => {statement}")
          pi.pipe(statement)

        self.send_response(200)
        self.send_header("Content-Type", 'text/html; charset=utf-8')
        self.end_headers()
        self.wfile.write("ok".encode("utf-8"))

if __name__ == "__main__":
    port = 12345
    httpd = HTTPServer(("0.0.0.0", port), SimpleHTTPRequestHandler)
    print(f"Server running on port:{port}")
    httpd.serve_forever()

 서버로 statement 보내면 Sonic Pi 전달하여 연주를 합니다.

-> % cat compute-pylint-sleep-secs.sh
#!/bin/bash

PYLINT_COUNT=$(cat | grep -E "^.:" | wc -l)
echo PYLINT_COUNT: $PYLINT_COUNT

PYLINT_SLEEP_SECS=60
if [ ! -z $PYLINT_COUNT ]; then
    DIVIDEND=300
    DIVISOR=$((5 + $PYLINT_COUNT * 2))
    PYLINT_SLEEP_SECS=$(($DIVIDEND / $DIVISOR))
fi

echo PYLINT_SLEEP_SECS: $PYLINT_SLEEP_SECS
echo $PYLINT_SLEEP_SECS > /tmp/msp-sleep-secs-pylint

 코드에서는 Pylint 오류 개수를 이용하여 음향 신호 발생 주기를 구합니다. 에러가 없을  1 주기로 소리를 만들고 에러가 많아질 수로  빈번하게 발생시킵니다. 예를 들어 에러가 50개라면 2 간격으로 소리가 발생합니다.

-> % cat ring-a-bell.sh
#!/bin/bash

PYLINT_STATEMENT="sample :elec_blip, rate: 1.0"
PYRE_STATEMENT="sample :elec_blip, rate: 1.5"

PYLINT_EXRIRES_AT=0
PYRE_EXRIRES_AT=0

while true; do
    PYLINT_SLEEP_SECS=$(cat /tmp/msp-sleep-secs-pylint)
    PYRE_SLEEP_SECS=$(cat /tmp/msp-sleep-secs-pyre)

    NOW=$(date +%s)
    if [[ $NOW -gt $PYLINT_EXPIRES_AT ]]; then
        (curl -s "http://looking-glass:12345/?statement=$(echo $PYLINT_STATEMENT | base64 -w0)" >/dev/null &);
        PYLINT_EXPIRES_AT=$(($NOW + $PYLINT_SLEEP_SECS))
        echo "[$(date)] msp-sleep-secs-pylint = $PYLINT_SLEEP_SECS"
    fi

    if [[ $NOW -gt $PYRE_EXPIRES_AT ]]; then
        (curl -s "http://looking-glass:12345/?statement=$(echo $PYRE_STATEMENT | base64 -w0)" >/dev/null &);
        PYRE_EXPIRES_AT=$(($NOW + $PYRE_SLEEP_SECS))
        echo "[$(date)] msp-sleep-secs-pyre = $PYRE_SLEEP_SECS"
    fi

    sleep 1
done

마지막 코드는 앞서 소개한 HTTP Server 소리 발생 요청을 보내는 부분입니다. elec_blip이라는 종류의 악기로 전자음을 발생시키고 음고의 차이가 있는 두 가지 소리를 사용합니다.

https://youtu.be/K53B-pQf6Jo

데모 영상입니다. Pylint 감지되는 오류의 숫자를 늘리면 음향 신호 발생 주기가 2초로 줄어들고 빠르게 반복되는 소리를 통해 코드 품질에 문제가 생겼음을 인지할  있습니다.


 이로써 다중감각 프로그래밍 프로젝트의 개념 증명이 완료되었습니다. 앞으로 몇 가지 작업을 추가로 해볼 생각인데, 먼저 진동모터를 몇 개 주문해두었습니다. 소리를 감각 채널로 사용하면 같이 일하는 동료들에게 폐가 되지 않겠습니까? 헤드폰을 사용할 수도 있지만 번거로우므로.. 키보드에 진동모터를 부착시켜 진동을 통해 같은 정보를 전달하고 싶습니다. 또한 진동과 소리를 동시에 사용할 수도 있고 다른 감각을 사용할 수도 있는데 이를테면 피부로 느낄  있는 열기 혹은 주변 밝기 등입니다. 이번엔 코드 품질과 관련된 지표를 사용했지만 다른 정보를 활용할 수도 있겠지요? 이를테면 현재 사용 중인 컴퓨터의 CPU 사용량 혹은 메모리 사용량을 정보로 사용한다면 얼마나 장치를 활용하고 있는지 무리가 되는  아닌지 파악할  있을 겁니다. 무얼 느껴보고 싶으신가요?


작가의 이전글 가장 게으른 대체품 만들기
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari