LOLWUT: a piece of art inside a database command

Salvatore Sanfilippo

LOLWUT:藏在資料庫指令裡的一件藝術品

原文由 Salvatore Sanfilippo 發布,訂閱此部落格

最近這幾天相當緊繃。在關於是否該把 Redis 複寫(replication)中使用的詞彙替換成其他用詞的爭論中,有一個論點是這樣的:去做那些不會產生任何技術成果的工作,到底值不值得?

當我動手修改 Redis 原始碼、盡可能把特定詞彙拿掉時,我開始思考,無論我對自己正在做的事抱持什麼看法,我就是那種喜歡寫下不會產生可衡量技術效果的程式碼的人。替換詞彙這件事本身就很煩人,即使在那之中也還是有幾個值得一試的技術挑戰。但還有另一種程式碼,我認為它具備一種叫做「hack value」(駭客價值)的特質。它或許解決不了任何技術問題,卻依然值得一寫。有時是因為撰寫過程本身就帶來回報,有時則是因為用上了非常高深的技術想法,去解決一個其實沒什麼用的問題,有時寫程式純粹就是出於藝術上的理由。

某種程度上,過去幾天在 Twitter 上大多缺乏根據、混亂又情緒化的討論,讓我覺得,到了這個時候,我們已經離 60 年代最早的那批駭客非常遙遠。隨著年紀漸長,我發現要以駭客的視角來談論技術變得越來越困難——那是一種沒有高牆、沒有現成定見,唯一的限制就是探索本身的視角。現在你說的每句話都有所謂的最佳實踐,每個想法都有禁忌。對於這樣的現狀,我只想說 LOLWUT,因為我不覺得自己被它代表,它也不代表我心中的駭客精神。所以,我的想法是,花一點在技術上毫無用處的時間,去探索一些屬於 60 年代的東西。

我的注意力立刻轉向我最喜愛的電腦藝術作品之一:Georg Nees 的《Schotter》(https://en.wikipedia.org/wiki/Georg_Nees)。在繪圖機與 ALGOL 程式的幫助下,Nees 探索了如何透過混沌(隨機性)與重複的圖樣來撰寫程式、生成藝術。《Schotter》之所以引人注目,在於作品本身的簡潔,以及觀者在凝視時所能體會到的深層意涵。在一片完全平靜、有序的表象之下,深處卻藏著失序。或者,若將它上下顛倒,它就像暴風雨中的大海。無論海面看起來多麼洶湧,深海依舊平靜。

有可能把一件藝術作品變成一個資料庫指令嗎?這件事很有挑戰性,因為 Redis 主要透過命令列介面來使用。如今的終端機當然比過去華麗許多,但在上面呈現像樣的圖形仍然很困難。另一方面,即時運算卻帶來了巨大的優勢:藝術作品可以是動態的,每次生成時都不一樣。

在繼續之前,我想先讓你看看最終的成果:

雖然解析度非常低,原作的精神依然保留著。為了實現這一點,我用了一個最近被不少想在文字終端機上顯示有趣內容的程式所採用的技巧。那就是利用點字的 Unicode 字集,來建立一個比終端機單一字元更密集的像素矩陣。具體來說,每一個字元可以容納 2x8 的像素網格。

實驗的第二部分,是讓這件藝術作品可以參數化:

可以透過改變方塊的數量與輸出的解析度,來產生原作的不同版本。最後,原始碼本身也想成為文學程式設計(literate programming)的一個範例,以更像是一份教學、說明每件事做了什麼、為什麼要這麼做的形式來撰寫,而不是一個晦澀難懂的產生器。你可以在這裡找到程式碼:

https://github.com/antirez/redis/blob/unstable/src/lolwut.c

LOLWUT 從 Redis 5 開始也將成為一項傳統。在每一個新的 Redis 主要版本中,這個指令的實際功能都會完全改變,只有幾項規則是固定的:

  1. 它不能做任何在技術上有用的事。
  2. 它執行起來必須夠快,這樣在正式環境的實例上呼叫 LOLWUT 才是安全的。
  3. 它的輸出在某種程度上必須具有娛樂性。

我為 Redis 5 寫了第一個版本,至於之後的版本,如果有人感興趣,我會請其他曾對 Redis 有貢獻的人來寫其他的 LOLWUT 版本,否則就由我自己再寫一次(但我希望不是這樣)。LOLWUT 應該提醒我們,自己所從事的工作——寫程式——一開始並不是只為了產出有用的東西。最初,它主要是在探索各種可能性。我也希望 LOLWUT 能提醒 Redis 社群,電腦終究是關於人的,不可能只從技術層面的影響、用一種抽離人味的方式來思考。有人在使用系統,有人在打造系統,諸如此類。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言