雷軍問我:你寫程序有寫詩一樣的感覺嗎?

想問問愛好編程的各位,你們有過這種感覺嗎?


寫小玩意時,思考怎樣簡短優美有內涵,或許會有這種感覺。
一般工作時,感覺更像長篇小說的編輯,找前後矛盾、錯別字、用詞不當、無意義對白,或者索性改寫吧。


很久以前我也是這麼想的,但是自從我寫的程序越來越複雜,需要處理的corner case越來越多,我感覺我寫代碼就像是在拼狗屋的手辦——是沒有辦法一塊一塊就這麼按順序拼起來的,拼了一半發現姿勢不對,要重拼。


你知道寫一個Parser,分成詞法分析和語法分析兩部分,正常來講,詞法分析器叫Lexer,語法叫Syntax Parser,我覺得這樣不押韻,所以改了名字,叫

Lexical Parser

Syntactical Parser


寫小程序或者自己玩的時候有。寫公司的代碼則有一種用爛泥糊破牆的感覺。


我相信有一天矽谷的老闆會親自到復旦北大北師大南大山大浙大的中文系高薪聘請會寫詩的程序員,因為寫程序的終極真理和寫詩基本類似。如果一個人沒辦法弄明白為什麼『仄仄平平仄仄平』的下句非要對『平平仄仄仄平平』,那麼他也一定弄不明白為什麼循環只能嵌套不能交叉為什麼用跳轉語句就會得到『義大利麵條』。套用靜安先生的話講就是:『程序以境界為最上。有境界則自成高格,自有名句。』這種道理很難用一兩句話解釋清楚,非要講的話我們可以從華山嶽掌門那裡的『以氣御劍』學起。至少我們知道,會編程和會編好的程是兩碼事,這就好比『我的所愛在山腰』和寫『枝上柳棉吹又少』是兩碼事一樣。
###################################
這本書是王詠剛和周虹著的《凌波微步 軟體開發警戒案例集》這是輪子哥推薦過的 @vczh 很可惜,這本書已經停版了。淘寶有的買,感謝淘寶,感謝盜版商。


我不會寫詩,所以我不知道寫詩是什麼感覺!

但我寫程序確實有不一樣的感覺,我寫完程序後,特別喜歡再重新看看自己寫的程序,哪裡寫得好哪裡寫得不好,基本不用修改後,我會欣賞自己的程序,然後心裡默默的對自己說:窩草,牛逼,寫的真漂亮!

這感覺,就像我看我兒子畫的畫一樣:窩草,畫的不錯,小崽子有希望啊! :)


以下代碼里關鍵字有 each-of , as, then, where

each-of Seq as elem then function(elem) where
function = ...

不知道以上代碼會不會引起你的共鳴。

就是那種行到水窮處,坐看雲起時。

一切經過看似無心的構造,剛剛好。


。。。我寫程序像是在罵人,還得加上注釋


只要給夠錢就可以

各減平均各自乘相加除以項數開方


沒有。
diverge = (lambda x. x x) (lambda x. x x)
Ad astra cosmosque scientia, quae potentia est, est.


有,非常有。一堆代碼夾雜著意識流,現代主義,後現代主義,虛無主義,現實批判主義的情感,而當代碼review時,同時可以感受浪漫主義色彩和百年孤獨般的蒼涼


你問我寫代碼有沒有寫詩的感覺?
我是碼農,不是詩人,
只會拉屎,不會寫詩。
有時會是拉稀的感覺,
泄出來的代碼不成形。
但更多是便秘的感覺,
代碼就是憋著不出來。
然而最煎熬的是調試,
那就是在糞坑裡捉蛆。
當然最暢快的是發布,
那是奮發圖強的結晶。


作為一枚長期寫單片機代碼的嵌入式程序員,寫的最多的就是驅動,個人感覺驅動程序就是講究對仗,正向走一遍再反向走一遍。一般程序結構是這樣的。
register()
----init()
--------start()
------------read()
----------------interrupt()
------------write()
--------stop()
----deinit()
unregister()

於是乎我想到一首詩,
遠看泰山黑乎乎,
上頭細來下頭粗。
如把泰山倒過來,
下頭細來上頭粗。


一般寫點東西呢,都是先從頭到尾走一邊,把基本流程走通。

然後再走一遍,把重複的地方獨立提取出函數,構思清晰準確有意義的變數名,考慮一下邊邊角角的 special case,適當再寫點文檔。(帶 refactor 的 editor 或者 IDE 比較好用)

再有時間了,沉澱一下,整體功能和架構,再整理一下,看看能不能用簡潔通用合理的方法實現。

配上測試,補充好文檔,建個 repo 收藏起來。

……

哪天突然想到一個可以改進的點子,開個新分支實驗一下,如果確實好,還能過了測試,那就再提交。


但其實真能都走完這些流程的代碼真心不多。

留在這裡算是個自我鞭策吧。


有時候,個別情況,還喜歡玩一下一行流。用一行代碼實現一個小巧獨立完整的實驗。

會有一點點禪味。

遇到複雜的 bash 操作,寫成一個接納參數的 bash 函數腳本。

寂靜。

再或者是可以根據輸入的不同參數在 CLI 命令行和 GUI 圖形界面之間變身的小程序。(GUI 做交互,調試實驗參數,實時觀察實驗效果;CLI 批量跑測試,或者迅速跑一個樣本拿到結果)

也試過 Python 調 exe,調 dll,調 pyd,調 py,調 matlab,實現功能。然後再一點點吃回來,都再收編回 python。

海納百川。

對了,還曾經有一段時間,每天在 Julia 的 REPL 裡面寫 Py 代碼。每天打開就是 using pycall。

元神出竅。


# The Sieve of Eratosthenes - 埃拉托斯芬篩法
use Lingua::Sinica::PerlYuYan;

用籌兮用嚴。井涸兮無礙
。印曰最高矣 又道數然哉。
。截起吾純風 賦小入大合。
。習予吾陣地 並二至純風。
。當起段賦取 加陣地合始。
。陣地賦篩始 繫繫此雜段。
。終陣地兮印 正道次標哉。
。輸空接段點 列終註泰來。

作者:落憂
鏈接:https://www.zhihu.com/question/22916854/answer/23058515
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


心中有詩,自然處處是詩。

寫代碼,是語句像詩,還是性能像詩,還是運行起來像詩,還是功能像詩,亦或是都是詩,每個都不同,追求也不同,可能還會互相矛盾。其中一個是詩,另一個可能就是屎。

心中有詩,自然處處是詩。

詩表達了心中的感受,代碼表達的是邏輯,代碼像詩,並不是帶著感受去寫邏輯,而是這個邏輯本身就是詩。為什麼這個邏輯本身是詩呢 ?就像數學的優雅一樣,體現了透徹深刻簡單的本質規律。同樣一個功能,有千千萬萬的思路與實現方法,詩意就隱藏其中。心中有詩,自然處處是詩。


謝邀

有啊

我是工科的,但是畢竟是科班出身
語文課上也學過很多文人對文章做斟酌的故事
比如下面這句

春風又綠江南岸,明月何時照我還

想必這個「綠」字改來改去的故事
幾乎所有經歷過義務教務的同學都被老師講過

雖然我覺得大多數語文的閱讀理解都是牽強附會
可能連作者本人都沒想過的東西都扯上
這裡權且認為這個「綠」字是詩人反覆琢磨之後的結果

試想,當時王安石的心情可能是複雜的
想要借寫詩來抒發自己的情感
適逢春意興起,綠水依依,岸邊生機盎然
而自己也要離開故地,前往新處
世事無常,總有春秋更替,世代輪迴
此去不知何時能夠回來

詩人的執著讓他無法簡簡單單地
用「到」表示春風已來春天已到
他想賦予春風以人性

春風是自己想要把岸邊改頭換面的
就像老天是想讓我離開故地前往新處的
就像我是想要擺脫舊處境迎來新局面的

就像詩人將自己的欲求情感思想編織在詩行中
程序員將自己的執著理念思想鑲嵌在代碼行中

對於安卓按鈕的一個點擊事件,最基本的處理方式是這樣的:

mBtn.setOnclickListener(new View.OnClickListener(){
void onClick(View view){
dataA.compute();
compB.callActions();
}
});

但是這樣太過雜亂無章,整整六行代碼
其中有用的不過兩行
但是卻跨越了3個層級
這裡面充斥著「他們要求我這樣寫」
而不是「我要表達什麼」
代碼的功能是表達
而不是執行,那是編譯器以及執行機關的事情

class SomContext implements View.OnClickListener{

Button mBtn;

void bindActions(){
mBtn.setOnclickListener(this);
}

void onClick(View view){
dataA.compute();
compB.callActions();
}

}

這樣,層級削減了
層級削減了,事務的複雜度就降低了
然而,上層建築增加了負擔
而且 onClick 的表達也是不好的不明確的與邏輯無關的
所以這樣做不好

class SomContext{

Button mBtn;

void bindActions(){
mBtn.setOnclickListener(new View.OnClickListener(){
void onClick(View view){ computeAndCallActions(); }
});
}

void computeAndCallActions(){
dataA.compute();
compB.callActions();
}

}

這樣,表達表意更清晰了,但是仍然有許多冗餘

class SomContext{

Button mBtn;

void bindActions(){
mBtn.setOnclickListener({computeAndCallActions()});
}

void computeAndCallActions(){
dataA.compute();
compB.callActions();
}

}

這樣,冗餘變少了
然而點擊之後的操作並沒有通用性
比起放到一邊
接近事件綁定的地方更好

class SomContext{

Button mBtn;

void bindActions(){
mBtn.setOnClickListener({
dataA.compute();
compB.callActions();
});
}

}

對事件的響應回到了事件綁定的地方
setOnClickListener 仍然冗長不堪

class SomContext{

Button mBtn;

void bindActions(){
mBtn.onclick={ dataA.compute() compB.callActions(); }
}

}

最後的代碼古怪,不合常理
然而滿足了編寫者的心理訴求
簡潔不冗餘
對事件的處理就在事件綁定的地方
不為其他組件增加不必要的負擔
編寫者覺得:美!

上面的過程就是不斷斟酌字字句句
不斷追求內心的表達
不斷追求美的過程
和詩人寫詩是一樣的

然後接手的程序員覺得:Fuck!


2017年10月24日09:20:35 添加的

不得不說

段子看多了嚴重影響寫正經文章

光追求效果去了

上面的例子可能稍微好玩一點

但是最終結果不夠好

《設計模式》裡面有許多比較好的例子

我實際上想表達的是

在代碼編寫上,不斷接受新事物新技術

將陳舊的冗餘的,表意不準確的代碼

重構成新穎的簡潔的表意準確的代碼

提高代碼可讀性

為代碼的維護和團隊合作提供便利

降低後續軟體迭代的複雜度

這種對可持續發展的追求與詩人對美的追求是一致的

自然科學與人文科學,技術與藝術

只有領域內追求美的人越來越多

這個領域才能健康地發展

歐耶(^o^)/


寫詩是不可能了,這輩子都寫不了詩,每天在挖坑、跳坑、填坑。


短的有寫詩的感覺;
做一個項目就像寫長篇小說;
用心做一個項目有點像曹雪芹:滿紙荒唐言,一把辛酸淚。都雲作者痴,誰解其中味。


感覺更像是寫小說;

因為我會時不時大段書寫;

時不時大段大段的刪減;

乃至重寫;

或者謄抄;

有時得沉下心來精修,描繪某個特定的場景;

有時得逐字逐句推敲場景,流程,邏輯;

但封裝清晰,交代清楚時也可一日千里;

要是你沒備份好,說不定還會丟失最後40行代碼。


推薦閱讀:

哪種語言適合沒有編程經驗的人學習?
為什麼階乘一定是偶數?
作為一個有理想的程序員,必讀的書都有哪些?
為什麼軟體學院的學費那麼貴?
存在用0和1一位數一位數敲出的視頻嗎?

TAG:創作 | 編程 | 愛好 |