| EN
觀察報告

Live Coding:一個工程師樂手的心得與比較

丁啟祐,2024,《逐格漫步》,「檔案影像創作計畫:再編碼」展演現場,C-LAB臺灣當代文化實驗場,第14屆臺灣國際紀錄片影展。圖/TIDF提供
Info 相關資訊
發布日期2024.07.01
Live CodingTIDF
編按:即時程式撰寫(又稱「現場編碼」,以下統一使用「live coding」)近年蔚為風潮,C-LAB亦曾舉辦過多場展演、相關講座及工作坊,今年5月並與台灣國際紀錄片影展(以下簡稱「TIDF」)合辦「檔案影像創作計畫:再編碼」⸺五組藝術家結合多種媒材與技術構成的現場表演。本篇因此特邀作者李宗儒,從軟體工程師與樂手的角度分享經驗,提出不同的觀點激盪。

「Live coding讓我們從另一種方向,來思考程式編碼⸺它可以是什麼,而非它是什麼。……Live coding令軟體變得很奇怪,讓我們的視野得以超越程式的常規實作與詮釋。」 1

說起一切的開端,我想起自己在大學期間,偶然認識了一位用程式操作音樂和即時繪圖的藝術家,他的東西很酷,那時的我卻難以理解。直到我開始跨足軟體工程師的工作,才明白要達成這樣的效果,不僅需要更高階的軟、硬體環境,還得花上不少時間調整。就在我好奇是否有門檻更低、對初學者更友善的做法之際,藝術家丁啟2019年在C-LAB臺灣當代文化實驗場舉辦的「隨響製噪⸺玩聚場音樂計劃」Live Coding工作坊,便成了一次很好的體驗機會。

當年工作坊結束之後,我沒有花太多心思繼續鑽研。時至今日,已經是我從事軟體工程師的第六年,現在更理解工作上程式設計的內核,也有自信能更快理解live coding的操作說明和常見玩法。本次接到邀稿後,我用一個月閱讀相關文本,並嘗試製作了一個音檔之後2,發覺即便live coding與作為工作的程式設計,均是以撰寫程式碼為表達方式,兩者其實有非常本質的區別;甚至可以說,live coding想要達成的意圖,恰好是公司中的軟體工程師,一般會想極力避免的。

接下來,我會介紹一些作為軟體工程師的工作心得,再將這些想法,與我目前對live coding的瞭解進行比較。

作者用Strudel進行編碼的成品的網頁截圖。

Live Coding

「Live coding」是一種以即時改變、執行程式碼的方式,產生聲音與影像的表演形式。除了聽/看到程式碼執行後的輸出結果,這類演出的一貫做法,是將程式碼本身投影在螢幕上,讓觀眾在表演進行的同時,也能夠看到表演者如何經由程式碼生產出聲音及影像。換句話說,live coding的重點不是電腦科技,而是強調編寫程式的行為本身,如何在現場構成表演3

這一個月以來,當我再次著手嘗試live coding時,我的印象是整個生態系比起五年前的經驗,更加容易上手了:當初必須自行安裝SuperColliderTidalCycles等軟體4,縱使對於已有相關行業經驗的我不算太困難,但在工作坊中可以看出,這對沒有使用過終端機、程式編輯器等開發工具的參與者來說,難度是比較高的。隨著網路技術的持續發展,今時今日已有StrudelHydra5等能夠直接在網頁瀏覽器上操作的live coding軟體,完全不需任何安裝步驟,使用者只要學會基本語法,便能直接開始動手玩。

另外,除了正職是軟體工程師外,我本身也有在演奏吉他及參與樂團活動。雖然live coding使用的工具是我熟悉的,但產生出來的音樂,卻與我一般演奏的經驗大相徑庭。以我使用過的軟體Strudel為例,多數時候,一個字串代表了一個聲音排列形式的循環6。比如「bd*3 sn」意味著在這個循環中,會先出現三下大鼓,再出現一下小鼓。四個聲音之間的時間差是相等的,一個循環分割成四分。若我在這個字串中額外加入一下小鼓,使其變成「bd*3 sn*2」,這代表的是循環從四等分變成了五等分。但在一般常見的音樂中,即便有變拍,也不會像live coding的語法,直接改變整個節奏的速度,絕大多數是在不同拍號之間改變,頂多是在常見的節拍長度進行轉換7。換句話說,這和以4/4拍為基礎的流行音樂8不同;在live coding的世界中,並沒有規範必須是四分音符或六連音,只要你想得到的,都可以把一個循環分割成任意等分9

另一個和其他音樂表現截然不同之處,在於live coding很輕易便能同時發出多種不同的聲音。舉個簡單的例子,當一般樂團想要演奏一首歌時,需要有負責不同樂器的演奏者,如吉他手、貝斯手、鼓手等,編排段落也有技術、器材相關的限制。但這些都可以經由live coding編輯器中的程式碼來表現,且在熟悉操作的情況下,很快就能做出流暢的樂句與段落轉換10;然而,在多人參與的樂團中,若想做出同樣絲滑的變換,沒有全員一起耗費大量時間練習、搭配,是難以達成的。

鄭先喻,2024,《Generations of Resolution》,「檔案影像創作計畫:再編碼」展演現場。圖/TIDF提供

Coding for a Living

在live coding中,「撰寫程式」本身先於一切;但在實際的工作裡,程式設計卻是發生在公司營運及效率的考量之後。在進行細部比較之前,我想先闡述一些作為軟體工程師的工作心得。

一開始,人們之所以需要寫程式,是因為想要自動化某些重複性高、徒手操作很麻煩的事情。但是,作為受公司聘用的軟體工程師,首要處理的是別人的事情,而不是工程師自己覺得麻煩的事情:公司決定季度目標,訂立需要完成的功能,產品經理再將所需功能,規劃、切割成便於分配的工作項目11。近年來「敏捷開發」12大行其道,工程師收到工作需求後,一般會先評估是否能將該功能,拆分成更細的項目,再估計每個項目所需的時間,與定義各項目的完成條件。

預判工作完成的時間與條件,意味著工程師必須完全理解該功能的描述,並想到將新功能加於既有產品的做法。在我的經驗中,這其實是寫程式最花時間的部份,也就是研讀既有的程式碼、寫「虛擬碼」(pseudocode)13,以及利用各種資料結構,來模擬功能的預期結果。此時也是最適合思考,如何將演算法設計得最有效率的時刻。例如,今日蔚為主流的雲端運算,各個雲端服務供應商的計價方式,都是以運算資源及執行時間為基礎,花費的運算時間越短,所需的運算資源就越少,公司就能減低運營上的經費,降低關門大吉的風險。

關於「效率」的另一個關鍵,在於得盡量避免「重造輪子」。若要讓公司賺錢,產品就必須盡力符合客戶需求,而工程師用在實現單一功能的時間越短,公司就能滿足更多客戶所需的功能。不論是重複使用產品的部份既有程式碼,或是使用網路上其他開發者提供的功能實作,在實務上都比自己從頭重新寫過來得好。在我的經驗中,當懷疑某個功能不只是我有需求時,通常簡單搜尋一下,便能找到前人的實作或說明。當然,不見得能即套即用,但大多時候只需稍作修改或研讀,便能將其轉化成我需要的功能,而不必自己花時間摸索。

在零零總總的前置作業之後,便能真正開始處理程式碼,來實現所需的功能了。即使程式設計的原則14多如牛毛,根據使用語言及環境,也有不同的設計方針,大方向卻是相似的:減少重複、壓低花費、增加效率。其中,我覺得最容易被忽略的是程式的可維護性15,為此撰寫註解是相當繁瑣的事,等於是花時間寫下跟業務不相關的程式碼;同時,也得撰寫與功能相對應的測試,這是為了確保寫下的功能,得以解決業務所需16;最後,工程師將改動的程式碼提交到平台上,請其他同事提出修改建議。來回修正之後17,才會套用到公司的程式碼庫,並於一定時間內釋出至客戶的軟體環境。日後再根據客戶的回應,進行功能新增及除錯18

劉東昱 × 莊勝凱,《動態現實》,「檔案影像創作計畫:再編碼」展演現場。圖/TIDF提供

Live Coding vs. Coding for a Living

從上述軟體工程師的工作內容中,或許可以看出,「程式」本身所佔的比重,其實沒有那麼大,更重要的反而是公司的盈虧,並滿足客戶的需求。換句話說,作為工作的程式設計,本質上還是服務於公司的運行,對「撰寫程式」本身,反而不會投以多少關注;相對地,在live coding的場景中,程式本身卻被拉到前景:螢幕上呈現正在操作的程式代碼,觀眾聽/看到的是表演者編織著變動中的音樂架構,及其大腦、眼、耳與手並用下的演出姿態。

隨著音樂與視覺不停地進行,表演者一邊輸入指令,並在音樂的斷點處按下「Ctrl + Enter」,將輸入的指令傳給軟體,來改變聲音或影像。可以說,live coding和工作中的程式設計,觀看的方向完全相反:觀眾感受到的並非程式本身多有效率、解決的問題又有多重要,而是聲音在加入一個低通濾波器19之後,如何被徹底改造,並體現程式的產出和進行中的時間,兩者之間的交互關係。

另一個不同之處,在於對「隨機性」所採取的態度。誠然,在整個電腦科學之中,「隨機性」是不可或缺的一大要素20,但「隨機性」在日常工作中,反而是需要盡可能避免的:當我們給定固定的輸入時,期望的是程式碼輸出的結果能夠被清楚地定義,沒有任何模稜兩可的空間,以及不可預期的副作用21;相對地,live coding作為一種演出形式,是無法與「隨機性」分開討論的。對此,我想提出以下兩個觀察:

1. 演出使用的軟體,有非常多函數用來表達「隨機性」的概念,例如choose、sometimesBy等函數。前者是從一個固定陣列中隨機挑出一項,後者則是根據機率,來決定是否應該要執行某些操作。這些都是隨機地去改動整個程式的控制流程,藉以產生無法預測的輸出。

2. 類似於模組合成器的操作,在live coding的軟體中,一個常見的做法是使用隨機產生的訊號,作為聲音或是影像的主要來源,像是各類噪音產生器,可當作控制濾波器強度的信號來源,也可作為基本的聲訊/影像來源單獨使用。

另外,我認為和「隨機性」一體兩面的,是live coding強調「即興演出」的特性。藉由即時改動程式碼,來推進表演進行,正在執行的程式也將隨著表演者的輸入,一併地受到改變。有趣的是,包含演出者在內,沒有人能夠準確預測未來程式執行的結果。這個特性和軟體工程師的工作性質,基本上背道而馳。若工程師不完全按照給定的需求來撰寫,而試圖自行添加或減少功能,通常需要花更多的時間與溝通成本,才有可能實現。實際上,在軟體工程師的職涯發展中,唯一能跟「即興演出」或「創意」扯上關係的,或許就是求職面試中的「白板題」環節了22

YouNuts(張晏慈 × 蔡寧),《超級正向(之下)》,「檔案影像創作計畫:再編碼」展演現場。圖/TIDF提供

TL;DR

在我看來,live coding與軟體工作的相似之處,僅止於兩者均使用電腦作為操作工具而已。不同於營利取向的軟體開發,live coding中寫程式的出發點,是為了程式本身在演出中不停演變與迭代。也就是說,兩者的差別來自面對程式,和編寫程式的行動本身,有著截然不同的觀點;另一方面,就音樂編曲而言,live coding也是非常特殊的。不同於一般的音樂創作過程,需要考量籌備時間和技術上的若干限制,它在操作上擁有的自由度,遠遠超出常規狀況所能容許的範圍。在熟悉語法的前提下,唯一能夠限制演出的,或許只有表演者本身的創意、手速與演出時限,以及電腦的剩餘電量而已。

Live coding最吸引我的,在於利用簡單的指令,就能對當前播放的音樂進行很大幅度的改動。輸入十幾個字符,新增一個濾波器,或是增加一個offset函數後的切分節奏,耳中聽到的聲音便與之前截然不同。「Live coding令軟體變得很奇怪,讓我們的視野得以超越程式的常規實作與詮釋。」23與此同時,我會說live coding也讓音樂變得奇怪,樂曲的變化更即時恣意,而這一切卻又是如此輕而易舉地達成。

林育德 × THRIVE13,《播音員今天早到》,「檔案影像創作計畫:再編碼」展演現場。圖/TIDF提供

責任編輯:童詠瑋

Info 相關資訊
發布日期2024.07.01
Live CodingTIDF
Footnote 註釋
01
Alan F. BLACKWELL et al.Live Coding: A User's Manual. MIT Press, 2022, p. 3.
02
我花了一個鐘頭後做出的成品:https://strudel.cc/?_TaKAO-kWh_n
03
即時編碼(live coding)和實時運算(real-time computing)是不同層次的概念:前者強調的是現場人為的「coding」;後者指的是系統接收指令後,在無明顯延遲的情況下,立即運算處理的能力。比如在本次TIDF的表演中,唯一跟「實時運算」有關的,是藝術家鄭先喻的《Generations of Resolution》,他利用Max/MSP的程式語言模組,放映國家電影及視聽文化中心典藏的台影新聞影像片段的同時,也轉傳給人工智慧模型,令其生成新的影像片段,並在表演的後半段播放這些生成的影片。
04
SuperCollider是一個本地端的音訊伺服器,以及對其操作的語言接口;TidalCycles則是一種為live coding設計的語言,其特點是能夠非常輕易地創造與修改聲音的進行模式。
05
Strudel為TidalCycles的網頁移植版,相較基於Haskell語言所設計的後者,前者由Javascript語法設計而成;Hydra則是一個基於瀏覽器的視訊合成live coding軟體,語法也是Javascript。
06
也可以利用「mini notation」的方式,來改變一個字串代表幾個循環,如「[bd hh sn hh]/2」便代表在兩個循環之中,完成「bd hh sn hh」。
07
像是從連續的四分音符,轉換成三連音。
08
關於4/4拍之於西方流行音樂的討論,可參考:Simon,“Why 4/4 Time Dominates in Pop,” t. blog, September 28, 2023.
09
若將一個循環切割得極細,會使本為分散的取樣鼓聲,聽起來像是有音高的單音一樣。可參考:SleepyAstroboi, “Making chillstep music with code | Tidal Cycles live coding performance,” YouTube, July 15, 2023。
10
推薦一位利用Strudel做出Grimes的「Music 4 Machines」前奏的神人,請參見:https://strudel.cc/?1kNtQpK_Js15
11
或是由客戶直接發信給公司,請求儘快實作某個他們所需的功能到產品之中。又或是在某些極端的情形下,公司老闆自己有獨到的見解,要求員工將他個人的奇思妙想,轉化成可用的產品功能。可參考PTT求職版上的經驗分享。
12
請參考「Y Combinator」論壇中的討論
13
關於「pseudocode」的定義,可參考]〈數學軟體實作 - Function handle and pseudo code〉的說明。
14
一些最常見的設計原則像是SOLID、DRY、ACID、快速失敗、低耦合等等。
15
未來如果有同事需要參考你開發的功能,就必須讀懂你寫的程式碼。但程式碼繁雜、難以理解,倘若沒有附上任何註釋,除了同事與你的關係會大幅惡化,也會拖累整個團隊的開發速度。不過,近期有更多工程師會使用人工智慧,自動化產生程式碼的註解,而這也是人工智慧在程式設計產業中,最主要的使用情境之一。
16
測試本身要能模擬客戶使用的模式與輸入參數,並事先得知輸出的結果。我的經驗是,寫測試的時間,大約佔總體寫程式時間的三到五成。
17
這個過程可能會拖很久,我曾經花了一天完成功能,結果來來回回卻拖了兩個星期,才將其正式合併至程式碼庫中。
18
除錯分成兩種情形:能在開發環境重製的錯誤,以及必須在客戶環境才能察覺的錯誤。不管是哪一種,一般都需要進到後台的資料庫,查找造成錯誤的物件。至於在客戶環境中除錯相當麻煩也更有壓力,通常只在客戶有迫切需求時才會發生。當然,一般來說根本不應該發生,但對所謂的VIP客戶說不,是不可能的。
19
濾波器能夠改變音訊的頻率組成,將特定頻率範圍的訊號降低。例如一個低通濾波器(low pass filter),便能夠排除高於某個頻率的訊號,使得最終聽到的聲音特別低沉。
20
實際上,現在的密碼學完全建立在隨機性上。我曾經在工作中遭遇一個問題,就是剛啟動的虛擬機器的隨機性不足,導致無法產生密碼,沒有辦法從遠端獲得協定證書。參見「Stack Overflow」論壇中的討論
21
相關的「副作用」,可參考《JavaScript Functional Programming 指南》第3章
22
通常會在一個有白板的辦公室,或是通過Zoom、Google Meet等線上會議系統,加上Google Doc等允許線上同步編輯的軟體來進行。考官會給面試者一些問題,要求以程式碼或pseudocode,來表達自己如何解決這些問題,並講解實作方法,讓考官理解面試者的思考邏輯。題目多從大學的演算法課程變形而來,但算法千奇百怪,又都十分複雜。根據我的經驗,除了要盡量記熟常見題型,也會需要一點臨場創意,才能在不知道答案的情況下,將學過的資料結構及演算法套用在題目上。有趣的是,即便白板題開得異常困難,大多數工作內容卻不複雜,沒有太多需要發揮創意的空間。
23
同註1。
Author 作者
李宗儒軟體工程師,獨立樂團「MassMan」和「既視感」吉他手。家中賣不出去的專輯已堆滿半間房間,有意購買者請洽詢Instagram(@massmanb99)。
More 相關文章
群像
林木材:從寫作到策展,紀錄片的紀錄者
林木材最初以職業影評人為志業,從事紀錄片工作多年,在多方涉獵後逐漸跨越到策展領域,並以策展的角度持續推廣多元而具實驗性的紀錄片作品。
發布日期2019.10.31
TIDF文化實驗紀錄片
觀察報告
關於革命與浪漫主義:從《告別⸺到南方去》到《黑色 ANARCHISM WALKERS⸺在詩與革命之間遊走的黑色青年》
2024年10月的第一個週末,牯嶺街小劇場一、二樓同時上演了兩場演出,頌詠「石板床上的耶穌」的《告別⸺到南方去》,以及召喚孤魂降身受肉歸來的《黑色》,分別演繹了某種關於革命的浪漫。
發布日期2024.11.20
劇場左翼浪漫主義革命
觀察報告
無頭鬼可以二次觀看嗎?高俊宏與梁廷毓歷史書寫中的遞迴系統
高俊宏與梁廷毓的歷史書寫隱然地越出了爭奪歷史詮釋權,以及建構「被大敘事埋沒者」之主體身分的書寫邏輯。他們如何將再次自我表述的可能性內蘊在其創作中,此一「可被自我再製」又意味著什麼?
發布日期2024.10.23
書寫歷史遞迴系統