Lars Hvam 住在丹麥哥本哈根,非常熱愛 ABAP 程式語言。我們在 Exercism 上把 ABAP 學習軌道建起來之後,找了 Lars 輕鬆聊了聊他最後是怎麼踏入科技業的。
Jonathan: 大家好,歡迎各位。我叫 Jonathan,是 Exercism 播客的主持人,今天請到 Lars 一起來聊聊。Lars,你目前人在哪裡呢?
Lars: 我在丹麥的哥本哈根。
Jonathan: 太好了。所以你在赤道稍微北邊一點,我現在則是在赤道很南邊的地方。很高興今天能請你上節目。很開心我們能有這次對談,那我就直接開始,進入本週的節目吧。Lars,跟我們聊聊你自己吧。你是怎麼踏入科技業的?又是怎麼走到現在這個位置的?
Lars: 嗯,我想想,我目前在哪裡,就像我們剛剛說的,哥本哈根。我主要是在 SAP 自訂程式碼 ABAP 這個領域做顧問工作。至於我怎麼會走到那裡?嗯,跟平常一樣,說來話長。不過這就是科技業嘛,那我們就來聊聊科技這條路吧。我年輕的時候,那是很久以前了,我和我的同卵雙胞胎兄弟...
Jonathan: 你有個同卵雙胞胎,那我怎麼知道今天講話的不是你另一個雙胞胎兄弟呢?
Lars: 他在做 Microsoft 的東西。
Jonathan: 好喔,這有點嚇人。
Lars: 所以,有關 SAP 的事就儘管問他吧,那他就不能問我有關 Microsoft 的事,那我就答不出來囉。
Jonathan: 是啊。
Lars: 我們年輕的時候就開始了。會在 Commodore 64 上玩,我記得我在那台 Commodore 上用 BASIC 這個程式語言寫了一些非常基礎的程式,接在一台黑白、非常小的電視螢幕上。這樣一玩就是好幾個小時。後來換了新電腦,在 386 和 486 上寫 QBasic,把記憶體升級到 8 MB,那在當年可是件大事呢。對,那時候是 QBasic,也寫過 Pascal。後來慢慢接觸到 Windows,我寫了很多 Visual Basic。
Jonathan: 好喔,哇。
Lars: 那些經歷都在我身上留下了一些印記。Visual Basic,還有念博士時寫的程式。沒錯。
Jonathan: 好喔,不錯、不錯。是啊,這經歷很讚。
Lars: 後來我上了大學,念了資訊科學碩士,做著各種程式設計的工作,然後很隨機地接了一份小工作,因為我需要錢付房租。又做了其他程式相關的工作。而這一路走來,我在 SAP ABAP 自訂程式碼開發這塊已經待了大概 15 年。嗯,對。所以,下一個問題呢?為什麼?為什麼我會一直留在這裡?因為 ABAP 現在算不上是很現代的程式語言,它跟 COBOL 很像,但它同時也是個非常有趣的程式語言,因為它的範圍非常廣,有很多不同的敘述,而且有很多不同的地方可能出錯。
Jonathan: 好喔。所以這其中有很多問題解決的挑戰,也有很多種除錯工作。這就是它的本質嗎?
Lars: 對。我通常會說,我做這類工作是因為我真的很喜歡除錯,而且有大量的舊程式碼可以拿來除錯,對吧?就像上週我才在修一個 20 年的舊程式。我當時想,好喔,酷、酷。而且每次看進一個舊程式,即使我做這行很多年了,總還是會有一些舊的、新的東西可以學,一些一直在用、而且每天還在跑的舊功能,對吧?
Jonathan: 好喔,所以你是 15 年前加入的?是同一間公司,還是從學 SAP 的 ABAP 開始,然後待過不同的公司?
Lars: 現在喔,我現在有自己的公司,做自己覺得有趣的事,要做什麼由我自己決定。我也替好幾家顧問公司做過很多顧問工作,還當過實習生。所以現在我是自由接案,接一些案子,這樣才能再付得起房租。這很重要。
Jonathan: 是啊。聽起來這是你人生中一個很常見的主題,就是付錢、付房租。
Lars: 是啊。
Jonathan: 想辦法付錢。
Lars: 但還是會花太多時間在開源專案上,一不小心就跑去挑戰別的東西了。
Jonathan: 是啊。所以你有團隊跟你一起工作嗎,還是就你自己一個人?你平常一天、一週的工作大概是什麼樣子?
Lars: 我自己一個人,有自己的公司。說到合作,我確實會跟客戶合作,對吧?而在開源領域,我在開源社群裡也有很多好朋友,他們偶爾會幫我處理一些東西,我也會幫他們一些忙,所以是雙贏的局面。
Jonathan: 是啊。所以 Exercism 上的 ABAP track,如果我沒記錯的話,好像基本上是你負責打造起來的,或者說你的參與程度很高。可以跟我們聊聊這部分嗎?
Lars: 對。這個 ABAP track 是由許多社群成員一起建立起來的,主要是來自 ABAP 開源專案社群的成員。當然,我們的情況比較特別,得從零開始打造自己的用戶端,不過那又是另一個故事了,改天再說。
Jonathan: 是啊、是啊。
Lars: 我們有很多人一起貢獻 Exercism 的內容。不過 ABAP track 有點特別,對吧?因為它是一個其實很難入門的程式語言,你沒辦法像 JavaScript 那樣直接下載一個 Node 執行環境,或是 Python 的執行環境。在 ABAP 裡,你不太容易這樣做。目前最新的做法是用 Docker 容器,我記得那個容器有 16 GB 那麼大。
Jonathan: 16?
Lars: 你得有至少 32 GB 的記憶體才跑得動它。而且不是很多人手邊就有這種基礎設施可用。再說,用這種基礎設施來跑,在 Exercism...我也不太確定,在整個生態系背後的基礎架構上根本不可能,因為 track 用的都是一堆小小的 Docker 容器,啟動、執行程式碼、檢查練習,然後再關掉。
Jonathan: 是啊。
Lars: 而且啟動一個這麼大的 Docker 容器,很容易就要花上 10 分鐘。
Jonathan: 不會吧。真的假的。
Lars: 所以我們需要不同的做法,幸好我一直在做我的靜態分析工具。那是幾年前開始的,它有抽象語法樹。所以我們實際上會把這些程式碼轉成 JavaScript 程式碼,然後在 Node 上執行,再把回饋給出去。所以我們會說,我們支援的並不是官方語言 ABAP 本身;而且 ABAP 還有點特別,就像我前面提過好幾次的,它並沒有真正完善、正式的語言規格描述,不像其他被設計出來的語言那樣。我覺得 ABAP 主要是從七〇年代、或是它剛開始的那個年代一路演變到現在這個樣子。所以我們只能邊做邊摸索。
Jonathan: 那這樣在你的日常工作裡會帶來什麼樣的挑戰?我猜是因為你每天都得用全新的眼光看問題,試著進入當初寫這個程式的人的思考方式,因為你能參考的東西很少。這樣說對嗎,你能參考的說明文件非常少,所以你...
Lars: 說明文件其實很多,只是它們就只是文字,而且並不總是百分之百正確。
Jonathan: 好喔。
Lars: 正確的做法是直接去試那段程式碼,看它實際上做了什麼,對吧?當然,語言裡有很多東西是正確的。但還有就是,當我們在 SAP 系統裡工作和建置東西時,通常一個系統裡會有好幾個開發者,而這一個系統裡就有超過 2 億行的程式碼,還有超過 8 萬張資料庫資料表。
Jonathan: 天啊。
Lars: 這其實是好事,我喜歡這種做法。尤其是當你把所有東西都建得很緊密時,你可以做出很多很酷的靜態分析,把各種東西串在一起;反之,如果你用的是微服務架構,一切就都是鬆散耦合的。兩種做法各有優缺點。
Jonathan: 所以你是比較偏好單體式的架構嗎?這樣說公允嗎,還是說...你喜歡就好。
Lars: 是啊。我確實比較喜歡單體式。嗯,好喔,酷。
Jonathan: 遺留程式碼。是啊,都是些存在很久的東西,就是這類的東西。
Lars: 對,我喜歡舊東西,挺有趣的,對吧?我常說,等我老了,我想去寫 PL/1 或 APL 這類的程式語言。我不知道啦,說不定我也能在 ML 上做,對吧?
Jonathan: 也許吧,我們現在底下什麼都有。來看看我們有什麼。Abl,你是說 APL 還是 Abl?
Lars: APL。喔,可是沒有 APL track。
Jonathan: 喔,說不定這是個機會。
Lars: PL/1 也一樣,沒有 PL/1 track。好喔,好喔,那這樣就有兩個 track,社群裡的人可以...
Jonathan: 喔,你現在就要報名了嗎,那...
Lars: 不是啦。所以,比如說 ABAP track 每天實際上是怎麼運作的?ABAP track 是對「正確」的一種近似,我們總是試著讓它更接近百分之百。所以實際上會有人交出正確的解法,但在 Exercism 上就是跑不起來。
Jonathan: 好喔。
Lars: 因為我搞出來的這套奇怪的轉譯工具。但一步一步、一天一天,它開始能運作了,我們也不斷地為後端、為 Exercism 的 runner 等各個部分加上更多單元測試。然後希望有一天它會達到百分之百完美,不過...
Jonathan: 誰知道呢,誰知道從那之後會發展出什麼。那現在,你一個星期通常跟幾個客戶合作?是一、兩個,三個,還是多達十個?
Lars: 就一、兩個。
Jonathan: 好喔。這樣持續一段時間了嗎?
Lars: 是啊,我做顧問工作已經好幾年了。
Jonathan: 那你的工作主要是集中在哥本哈根嗎,還是疫情期間你有機會更遠端地跟其他地方合作?你大概是怎樣,會常常出差嗎,還是...
Lars: 我年輕的時候常常到處跑,但現在我通常就是待在家裡遠端工作。
Jonathan: 好喔。
Lars: 就是這樣。
Jonathan: 是啊,讓你的咖啡機一直保持溫熱。
Lars: 是啊。
Jonathan: 讓事情持續運轉。那最後...你剛剛說你從很小的時候就開始寫程式,從相當小的時候就對這方面有興趣。程式設計有沒有在某個時間點對你來說變得說得通?有沒有哪個瞬間是你突然開竅的,還是說這是你從小自然而然就懂的東西?你會怎麼形容?
Lars: 喔,我不知道耶。我覺得我一直都懂怎麼寫程式,對吧?
Jonathan: 是啊。
Lars: 但通常來說,我年輕的時候寫的一直都是程序式程式設計。我記得大學某個時候,有一門介紹函式式程式設計和邏輯程式設計的課。那是兩種完全不同的程式設計範式。據我所知,Exercism 上有 Prolog。對,有 Prolog track。所以還沒試過邏輯程式設計的人,我推薦去寫寫 Prolog;Standard ML 應該也在那裡,可以讓你弄清楚自己對於程序式程式設計的想法...不過還有很多其他事情可以做。所以,是啊,我每天都在學新東西,所以並沒有什麼「開竅」的那一刻。
Jonathan: 所以你到現在還在跟一切奮戰嗎?不是啦,只是我覺得很有趣,因為我自己的很多經驗是,我必須把自己沉浸在某個東西裡,比如一門語言。然後突然之間,那些原本很陌生的概念,一夜之間就有什麼轉變了,幾乎會讓人覺得「喔哇,這完全說得通」。我在播客裡訪談過的其他人也說過,對,他們有類似的經驗。我就問他們是怎麼辦到的,他們說...有一個女生說,喔,我就把程式想像成一個故事,函式就是裡面的角色,諸如此類。所以我覺得那真的很有趣。那你是怎麼決定,比如說 ABAP,就是你要專注的東西?就只是因為「喔,這個能付房租」,還是「我就是真的很喜歡它,比起 JavaScript 之類的我更偏好它」?
Lars: 踏入程式設計總是從隨機開始的,對吧?寫點 BASIC 之類的,寫點 Ada,都是隨機開始的。而 ABAP 之所以突出,是因為它算是一種非常具有挑戰性的程式語言,因為它的敘述種類非常多;像 Java 和 JavaScript 其實沒有那麼多敘述,它們有的是龐大的函式庫。相較之下,在 ABAP 裡,很多函式庫的東西本身就是程式語言的一部分;而在 JavaScript 裡,你呼叫不同的函式庫時,用的都是同一種語言結構。
Jonathan: 好喔。
Lars: 是啊。
Jonathan: 好喔。所以幾乎可以說你是隨機發現了 ABAP。那往後看,接下來大概 10 年...不知道你想不想得到那麼遠,不過,就程式設計和工作來說,你接下來 5 到 10 年會是什麼樣子?你心裡有沒有個底,像是「喔,這是我希望到達的位置,這是我希望做的事」?
Lars: 啊,你永遠不會真的知道,對吧?所以只要我覺得某件事有趣,我就會一直做下去。如果它不再有趣了,我就放下它,去做別的事。
Jonathan: 好喔,所以那就是...
Lars: ...計畫,對吧?在我看來,一件事要能每天做下去,就得有趣。我想 10 年後我的菜單上大概還是 ABAP 吧。這也跟另一點有關:我對程式語言和技術其實挺挑剔的。所以我寫 ABAP,也寫 JavaScript 跟 TypeScript,除此之外我盡量不碰其他語言。
Jonathan: 是啊。好喔。但如果我說,Lars,你現在得放下 ABAP 和 JavaScript,去學另一種程式語言。你有沒有想法自己會想選哪一種?好,那我就說囉。
Lars: 好啊,我們剛剛就聊過 APL 了。
Jonathan: 好喔,是啊。
Lars: 那是個很酷的...搞不好比我還老的語言,我不知道,差不多吧。APL 和 PL/1,我想這兩個都比 ABAP 還要老。
Jonathan: 好喔,哇。那為什麼是它們?你對它們的哪一點感興趣?
Lars: APL 我其實沒真正試過,但網路上有幾個模擬器可以玩玩看。它充滿了一堆希臘字母,所有東西都是矩陣相乘...我也說不上來,它就看起來非常奇怪,甚至可以說有點蠢。但這也正是它有趣的地方,對吧?總得要有某種挑戰。PL/1 就又是另一回事了,是截然不同的東西。我也不是很確定。
Jonathan: 有點神祕,又有點...
Lars: 是啊。倒也不是。我喜歡老派的經典東西,而不是那些新潮花俏的玩意兒。所以我大概會說 Rust 吧,不對。說不定哪天我會去碰 Rust,但那不是因為我得碰,不是因為我想。
Jonathan: 是啊。那你有沒有注意到,使用 ABAP 的人在減少還是增加,還是這個語言最近有復甦的趨勢?你的看法是什麼?
Lars: 是啊,這很難說,因為 ABAP 是那種在大型跨國企業內部運行的大型系統,所以很難取得真正正確的公開數字。但謠傳是,真正熟悉這套語言的開發者年齡正在上升,而且越來越接近退休、要退出市場了。
Jonathan: 好喔。
Lars: 就像 COBOL 一樣,對吧?它是個老語言,年輕人不太覺得有趣,對吧?所以就是像我這樣的老人。但這也是我們為什麼會做這個 ABAP track 的原因,對吧?我們想讓更多年輕人接觸這個語言,而 Exercism 是個很好的平台,可以試玩很多不同的東西。而且它很容易上手。註冊、點一下、登入,就開始寫你的程式碼,搞定。
Jonathan: 是啊。那你有注意到有很多人在寫這個 track 嗎?ABAP track?
Lars: 有。我們現在有將近 5,000 名學生。
Jonathan: 哇,太厲害了。
Lars: 是啊,今年九月有一場社群程式碼挑戰賽,是由 SAP 的開發者推廣人員主辦的。目的是想讓更多人上到平台上,試做一些練習,主題是我們所謂的「內部表格」。在其他語言裡,這些通常就是陣列,但在 ABAP 裡我們叫它內部表格;還有巢狀內部表格,在其他程式語言裡通常叫做「陣列的陣列」。
Jonathan: 是啊。
Lars: 那場活動為我們帶來了很多新學生。我們也收到了很多回饋,以及 GitHub 上的一些 bug 和 issue。這在 ABAP 的世界裡也是我們不太習慣的事,就是跨多個組織合作。實際上在 GitHub 上分享程式碼,在這個社群裡並不是那麼常見的事。
Jonathan: 這是因為大家一直都很各自為政嗎?就是這家公司做自己的事,另一家公司做自己的事,所以開發者之間其實不太交流,他們各自在自己的情境裡,分享和合作也就比較少。還是說原因是別的?
Lars: 這也跟 SAP 系統的本質有關,因為它是標準系統,什麼都能幫你做。所以通常我協助客戶,是因為客戶需要一些特別的東西。
Jonathan: 嗯。
Lars: 而所謂的「特別」,是相對於讓他們業務與眾不同的地方。所以那很可能不是其他客戶能用的東西,他們也不會想用,因為那個客戶之所以獨特,跟另一個客戶的獨特之處不一樣。不過現在開源社群正在慢慢發展、開始分享程式碼,只是通常停在一些工具層級的東西,像是記錄(logging)和錯誤處理之類的。但它終究會走到那一步,只是在 SAP 的世界裡,任何事都要花上五年以上。
Jonathan: 是啊,就是為了讓一切開始產生那樣的動能。這是我們訪問每個上節目的人都會問的問題之一,你可能有看到我寄給你的那份文件。我們通常會問來賓,在科技圈裡,哪一個觀點或看法是你會堅持、絕不妥協的?或者說,在科技圈裡,哪個立場是你願意誓死捍衛,確保它永遠屹立不搖的?它可以是像「如果你做前端,我一律把邏輯寫在 CSS 後面」這種傻氣的堅持,也可以是非常瑣碎的小事,或是像「我永遠不用 GitHub」之類的。都可以,但你得能夠為自己的論點辯護、把你的觀點講清楚。所以,那一件事、那個觀點是什麼...?
Lars: 一個,一個。一個觀點。
Jonathan: 好喔,我可以讓你講兩個,兩個也行。對,三個。好,三個,你可以有三個觀點,因為我知道技術人通常一點都不固執己見,對吧。
Lars: 是啊。我想如果有人要形容我,有時候我對事情有非常強烈的意見。我其中一個主要的觀點就是:要懂得說不,「這不可行,去做別的、更適合這個解決方案和技術的做法」。所以像 Jenkins 這類工具,要說不。對 Jenkins 說不。它是我喜歡提出來、認為大家都不該用的工具之一,對吧?
Jonathan: 為什麼?為什麼?原因是什麼?
Lars: 把你的管線放在離程式碼近一點的地方會容易得多。所以如果你...我就覺得它已經過時了。
Jonathan: 好喔。所以那就像是多了一層不需要的抽象,如果你知道自己在做什麼的話。
Lars: 是啊。還有其他工具可以把事情做得更好。另一個我建議跳過的工具是 Eclipse。在 Java 的世界裡,如果你回顧個五、十年前,Eclipse 通常被用來建置 Java 程式碼。但從我的角度來看,現在 Eclipse 甚至已經不是用來建置 Java 程式碼了。它通常變成一些大型企業應用程式的東西,被用在 Eclipse 上、拿來建置 Eclipse,而這從一開始就不是它真正的用途。做這件事沒有太多其他方法,而且還有很多其他工具可以選。所以 Eclipse 就這麼黯然失色了。
Jonathan: 好喔,我喜歡。那我再給你一個機會,第三個觀點是什麼?
Lars: 空白,也就是空白字元。我的一個副業專案是 ABAP 的靜態分析。其實在 ABAP 裡,我們有很多不同的敘述,也有很多不同的縮排方式、大小寫寫法、匈牙利命名法等等。對。文章裡某處出現兩個連續空白,這種事真的會讓我很受不了。
Jonathan: 那是因為它會打亂一切,簡直就是場噩夢嗎?
Lars: 它就是會讓你讀到一半分心,不管是讀一篇文章還是一段程式碼。喔,這裡怎麼有兩個空白,這會讓我突然卡住。
Jonathan: 好喔、好喔。那我整理一下:Jenkins,讓你的管線靠近程式碼;Eclipse,不需要;還有連續兩個空白。這些就是我讓你講的三個觀點,嚴重程度好像不太一樣。不會啦,這真的很棒。我覺得你在這些立場上都守得很好。
Lars: 還有,講到持續整合,不要讓持續整合變成「持續等待」。
Jonathan: 好喔,所以你把程式碼推上去,然後它就杵在那裡等 PR,是這個意思嗎?
Lars: ...而是要讓開發者很快拿到回饋,而不是讓他們等個一、兩個小時才有任何回饋。
Jonathan: 好喔。那這是因為系統上、制度上它是一種防呆機制嗎?所以才會這樣設計?還是只是為了暫停一下,讓東西可以被審查?還是為什麼...
Lars: 純粹就是爛架構。
Jonathan: 是啊。好喔、好喔,有意思。那今天最後一個問題。希望你到目前為止還聊得開心,我想問你這個:這週你有什麼想推薦給 Exercism 社群的?如果你能為社群推薦一件事,那會是什麼?什麼都可以,去吃壽司、去跳進河裡,隨便什麼都行。
Lars: 當然是試試看這個 track。那大概...
Jonathan: 這個我也算你免費的,這個太簡單了。好喔。
Lars: 但當然,就像前面提過好幾次的,記得要玩得開心。這件事必須有趣。所以有時候即使有些想法很奇怪,只要它有趣,就去試試看,看看會發生什麼事。這也是我在做開源專案時常說的:就直接跳進去,看看它有不有趣。試試看。如果不行,那也沒關係,就跳到下一個派對、下一個開源專案或下一門語言。
Jonathan: 是啊。
Lars: 因為在科技圈裡、在科技圈外,有太多事情可以做了,如果你一直覺得無聊,那真的不太值得。
Jonathan: 是啊,當然。這是個很好的建議。所以,各位在外面的人,在科技圈裡好好玩吧。最後,非常感謝你今天撥空參與,真的很感謝。等我把錄音停掉之後,你先別離開,我們最後再聊一下。我只是想說一聲大大的謝謝。各位有興趣的人,去看看 ABAP track,去跑一些練習,看看你寫得怎麼樣。如果你想學一門已經存在很久、而且重要性與影響力又重新成長的語言,可以這麼說,因為它支撐著許多核心的跨國平台,那些人你認得,那些公司你也認得。如果你想學這條內行的路,那 ABAP 絕對值得你去看看。Lars,等我們整理好之後,會把你提到的所有節目連結放在下面的說明欄。但在那之前,非常謝謝你,我等等再跟你聊。總之,再次感謝,非常感激。
聆聽、學習,並從我們的社群成員身上獲得啟發。