業餘大叔程式心得筆記#11:程式語言的與除錯方式的個性/葉光釗

更新於 發佈於 閱讀時間約 5 分鐘

每一種程式語言,都有一些展現自己個性的點;如果沒有一些參透過的領悟,很難去瞭解它們的本質;不同的程式除錯方式,也有不同的風格。你專精的程式語言是哪一種?又有什麼樣的個性呢?你的除錯偵探方式,又是哪個流派?

過去一陣子有些看軟體工程師履歷的機會;這些應徵者在技能欄上,多半會列出許多的程式語言,像是C、C++、C#、JavaScript、Java、R、Python、Ruby等等,而且多半會加上「精通」兩字。看多了這類履歷之後,不由得會好奇,每個人對「精通(某種工作技能)」的定義有什麼不同。
筆者自己是半路出家,寫程式能力是自學而來的,而且完全只把程式語言當作工具,從來沒有什麼特別偏好;依照專案的性質,什麼稱手就用什麼。如果真遇到沒用過的語言,Google和StackOverflow網站就成了好朋友;盡量找範例,copy/paste毫不客氣。
雖然這樣下來也混了數十年,但捫心自問,要聲稱「精通」什麼語言,還真有點不好意思說出口。

程式語言是有個性的

不過話說回來,究竟在這個領域有些資歷,對於各式各樣的程式語言還是有些心得;比較有趣的心得之一,就是我覺得程式語言是有「個性」的。
從經驗來看,各種語言都有一些展現自己個性的點;如果沒有一些參透過的領悟,很難去瞭解它們的本質。
舉來來說,職涯中使用比例最高的應該就是C語言了。我把它定義為「刻苦耐勞」型,早期根本是用來當作組合語言的跳板;在實務上,甚至經常有將C編譯器編好的組合語言內容拿出來,然後用手工繼續修修改改的情形。
要能善用C語言,對電腦底層的運作必須有基本的瞭解,尤其是記憶體存取方面。許多學BASIC或FORTRAN語言的人始終弄不懂C,多半是卡在「指標」(pointer)的使用上,更不說用「pointer的pointer」來表示二維矩陣這種奇怪的觀念了。
至於C++,雖然本質上與C是截然不同的兩種動物,但常被看作「C的華麗加強版」(但我承認自己也常常這樣用)。除了「class」(類別)等等物件導向語言的關鍵字讓入門者頭痛之外,「template」(模版)的使用也是個門檻。
雖然標準模版庫(STL)提供的資料結構很方便,可是編出來的程式碼大得嚇死人;像我這種用慣了C的吝嗇傢伙,能不用就不用。
另外有兩個語言,我則是定義為「夢幻」型的:一個是Smalltalk,另一個是 Lisp。
之所以這麼說,是我在接觸它們的時候,並沒有可以執行的實際環境;雖然買了一堆參考書籍,而且所有執行都是憑空想像,但它卻是我學習物件導向語言的啟蒙(夠神奇了吧)。
其中有一段時間,再怎麼絞盡腦汁,就是弄不懂什麼是「傳送訊息給一個物件」,一直到某一天吃早餐時想到,其實就是「function calls」,差點把嘴裡的豆漿噴出來。
最近比較有興趣的,則是JavaScript;我發現它根本是Lisp的「呼畢勒罕」,而且它的取名真是個天大的誤會。這是一個很「公主」的語言:機制很純粹,什麼東西都是物件(object),只是除錯除起來會令人發瘋。
既然大家都有個性,那有沒有「老好人」式的語言?
有。在我看來,過去人人必學的BASIC、和現在的Python,就屬於比較沒個性的語言。雖然Python近年因為人工智慧(AI)方面的應用而紅遍半邊天,但我覺得跟語言本身實在沒啥關係,全靠一缸子的套件(packages);不過這也是它們的優點:門檻低、入手快。
我自己最最喜歡的,還是Forth語言。它是我看過最「短小精幹」的設計;一個超小型編譯器和一本詞典,就可以堆砌起一個世界,不愧是天才設計師Charles Moore的傑作。
年輕的時候,曾經用它來設計一套在Apple II電腦上跑的Logo turtle繪圖工具;原本以為已經佚失,最近一搜尋居然發現,語言本身和這套工具還活著,真是驚喜。可得好好想想能用它來做些什麼。

除錯和推理也有流派

我從年輕時就喜歡看推理小說,而且習慣一開始翻書就一路看不停。從撲朔迷離的線索之中,抽絲剝繭找出線索,最後真相大白;那種看到最後「原來如此」的感覺,很容易欲罷不能。
身為一個推理小說迷,以及還算資深的程式員,很難不注意到「推理解謎」和「除錯」兩種心智活動之間,令人驚訝的相似程度。
推理小說有好幾種派別;早期最熟悉的是「安樂椅神探」,一位厲害的偵探完全無需出門探案,只要由旁人提供線索,即使不需要親眼看到現場,也能推論出答案。
早期在除錯工具不多的現實中,我們也常會做「在大腦中除錯」的事情;只用筆和紙,再三重覆檢查邏輯的流程。不過就像神探不是常人,這樣的事沒辦法常做;不但累人、而且非常沒效率,不可能像書中的主角那麼風光。
後來熱衷的是「現實派」。主人翁通常是警察之類的執法人員,既不神奇、也不是天才,只能一步一腳印,蒐集那些看起來微不足道、但很多時候可能是破案關鍵的線索。
這跟程式員的現實生活就接近多了:在除錯的時候,多半就是鍥而不捨的一再重複 追蹤程式碼執行、看看找不找得到微小的差別。程式員的日常中,有九成時間就是一直盯著黑底白字的編輯器,深怕漏看了什麼;隨著解錯(破案)的時限越來越近,壓力也越來越大。
而現代化軟體大廠的除錯模式,就跟以上的單打獨鬥完全不同。他們的方式就跟CSI科學辦案一樣是團隊作戰,有專門的測試人員執行測試用例(test cases),就像是蒐集科學證據;也有專門的工具,用於分析測試結果、或是程式產生的紀錄檔,如同科學家做DNA解譯一樣。
SDE解錯就純粹是「證據走到哪裡,案子就辦到哪裡」;沒有什麼模糊地帶,直接了當。
話說回來,看推理小說還是比程式除錯有趣多了;欣賞別人動腦的成果,比自己燒腦所花的力氣輕鬆太多。
你專精的程式語言是哪一種?又有什麼樣的個性呢?你的除錯偵探方式,又是哪個流派?
為什麼會看到廣告
avatar-img
1.4K會員
2.0K內容數
為您送上頂尖作者的最新管理與科技產業思維。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
自從iPhone獨力貢獻超過一半的利潤之後,外界就開始擔心Apple對單一產品的依賴是否太重;然而,這個數字在本季結束時掉到了48%,又有人要擔心「iPhone玩完了」。其實這個變化不是壞事,而是利潤開始轉向整個生態系、讓Apple營收結構更加成熟的象徵。
由於類比訊號很容易失真,因此人類將類比訊號轉為數位,創造了虛擬世界;而相較於「身」,這個虛擬世界就如同「心」。幾千年來,人類修煉自己的內心,以便離苦得樂,這些則屬於「靈」的境界;但這些年來,我深深覺得身、心、靈之間的距離似乎越來越大。
雖然Tesla Model 3看起來是一款能幫Elon Musk賺錢、並且讓Tesla在轎車市場站穩腳步的產品;但該公司最近一季的巨額虧損,仍然讓許多股民憂心忡忡。究竟這些虧損會不會傷到Tesla的元氣?就讓我們來探討一下。
人們用來消磨時間與金錢的方式,近年來已經有了大幅改變;而這種新的消費型態,變成了新聞媒體的主要競爭對手。本文所提供的,就是一些關於這個趨勢的實際狀況與調查資料。
當AI創新應用「遍地開花」時,就會出現大批的應用人才、AI新創公司會紛紛出現、傳統產業也會轉型升級。但這波AI熱潮發展的重點,更應該放在公共政策訂定、教育、應用、以及解決民生議題上,而不是如何培養AI獨角獸。
大企業為了追求利潤,會以專利壁壘和規模門檻保護自己,讓技術無法與街頭智慧結合;但在物聯網的時代,生產規模效益將不再是最重要的優勢,而開源設計網站和無所不在的互聯網,也讓技術不再是跨國企業的禁臠。
自從iPhone獨力貢獻超過一半的利潤之後,外界就開始擔心Apple對單一產品的依賴是否太重;然而,這個數字在本季結束時掉到了48%,又有人要擔心「iPhone玩完了」。其實這個變化不是壞事,而是利潤開始轉向整個生態系、讓Apple營收結構更加成熟的象徵。
由於類比訊號很容易失真,因此人類將類比訊號轉為數位,創造了虛擬世界;而相較於「身」,這個虛擬世界就如同「心」。幾千年來,人類修煉自己的內心,以便離苦得樂,這些則屬於「靈」的境界;但這些年來,我深深覺得身、心、靈之間的距離似乎越來越大。
雖然Tesla Model 3看起來是一款能幫Elon Musk賺錢、並且讓Tesla在轎車市場站穩腳步的產品;但該公司最近一季的巨額虧損,仍然讓許多股民憂心忡忡。究竟這些虧損會不會傷到Tesla的元氣?就讓我們來探討一下。
人們用來消磨時間與金錢的方式,近年來已經有了大幅改變;而這種新的消費型態,變成了新聞媒體的主要競爭對手。本文所提供的,就是一些關於這個趨勢的實際狀況與調查資料。
當AI創新應用「遍地開花」時,就會出現大批的應用人才、AI新創公司會紛紛出現、傳統產業也會轉型升級。但這波AI熱潮發展的重點,更應該放在公共政策訂定、教育、應用、以及解決民生議題上,而不是如何培養AI獨角獸。
大企業為了追求利潤,會以專利壁壘和規模門檻保護自己,讓技術無法與街頭智慧結合;但在物聯網的時代,生產規模效益將不再是最重要的優勢,而開源設計網站和無所不在的互聯網,也讓技術不再是跨國企業的禁臠。
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
程式語言在特定環境下就是魔法 現實世界也應該要有非大眾可以理解的規則與金手指才對 #因為架構太完整,這篇噗浪有用匿名發過 #故事取用前請簡單告知
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
對於程序式編程來說,程式是由一系列的指令組成,例如計算數值、印出訊息、修改變數、呼叫子程序、配置變數的記憶體空間等。定義函式是為了讓一些程序可以重複利用,因此稱為子程序,其中參數為子程序中特別的變數,讓我們能夠透過它們控制子程序的行為。函式的回傳值只是一種方便將結果帶回來的方法,但一般只能回傳一個值
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
程式語言在特定環境下就是魔法 現實世界也應該要有非大眾可以理解的規則與金手指才對 #因為架構太完整,這篇噗浪有用匿名發過 #故事取用前請簡單告知
Thumbnail
TypeScript是一種由Microsoft開發和維護的開源編程語言。它是JavaScript的超集,主要擴展了JavaScript的語法,增加了靜態類型檢查和其他特性,使得開發大型應用程序更為方便和可靠。
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
關於程式語言的學習,只要掌握住幾個基本特性要熟悉幾種程式語言也不困難,這三個基本特性就是…
對於程序式編程來說,程式是由一系列的指令組成,例如計算數值、印出訊息、修改變數、呼叫子程序、配置變數的記憶體空間等。定義函式是為了讓一些程序可以重複利用,因此稱為子程序,其中參數為子程序中特別的變數,讓我們能夠透過它們控制子程序的行為。函式的回傳值只是一種方便將結果帶回來的方法,但一般只能回傳一個值
Thumbnail
在剛開始寫 JavaScript 可能大多數的人不會特別意識到 JavaScript 的型別系統有什麼特別之處,我是在看完 Youtube 上 CS50 的課程,才理解到在不同的程式語言中,會因為語言的特性而有不同的系統,JavaScript 就是偏向比較特別的那一種。
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護