王垠在《程序員的心理疾病》中提到 Python 的缺點是哪些?
原文鏈接:程序員的心理疾病
這種以語言取人的現象甚至出現在一些公司里。很可笑的是,我前段時間面試的所有使用 Python 的公司,最後都認定了我是 Python
的菜鳥。然而我的水平顯然高過 Python 的創造者 Guido van Rossum 很多。在製造了 PySonar
之後,他對程序語言的理解,他的每一個可笑的錯誤都被我看得清清楚楚。當然,Ruby 就更爛了。@王垠,望不吝賜教。
Guido van Rossum 是 Python 的作者, 然而關於 Python 的許多決定是由開發者們共同決定的. PEP(Python Enhancement Proposals): PEP 0 -- Index of Python Enhancement Proposals (PEPs) 是他們提出和論證各種特性和細節的地方. 可以看到, 每一個PEP若想被認可, 是要給出具體的用例去證明的, 不是說誰更聰明就聽誰的. 開發者們大都是對理不對人的, 就算是Guido提出的觀點, 有不對的地方也會被批評, 這在 Python 的開發者郵件列表裡時不時可以見到. 具體例子可以看:
- 早期關於 decorator 格式的討論: [Python-Dev] 2.4a2, and @decorators
- 關於Python多繼承的實現: http://python-history.blogspot.com/2010/06/method-resolution-order.html
然而我的水平顯然高過 Python 的創造者 Guido van Rossum 很多。 ... 他對程序語言的理解,他的每一個可笑的錯誤都被我看得清清楚楚。
說自己的水平比Guido高多少並沒有用, 要敢說自己的水平比整個 Python 開發者社區所有人加起來都要高才能說別人的是"可笑的錯誤". 當然, 我相信王垠還真敢這麼說.
綜上, 王垠所認為 Python 的"錯誤", 很有可能是經過各種討論後折中出來的決定, 它們未必對所有人都是最好的選擇, 但是是由一些對這個語言有著長久使用經驗和深刻理解的人共同做出的決定.一點題外話(咦, 這整篇都是題外話啊), 一個人多聰明真的沒意義, 有意義的是你為大家創造了多少價值.
王垠看起來是個異常自我的人,因此也難得的,異常真實。
「水平高過 Python 創造者很多」這句話第一次看的時候讓我非常震驚,看過他的其他blog之後,略微明白了一點,作為專業的程序語言設計師,他絕對不是在評論語法、API、縮進之類的外在特性,而是在評論語言的設計思路和面對的問題域,這些更本源的東西。
王垠甚至可能不精通比較細節的Python的語法和API,從而導致了面試的公司「認定了我是 Python 的菜鳥」,公司關注的是用語言的API解決問題,他關注的是語言的設計思路和內在氣質,關注點不同,產生誤解也就不足為奇了。
他在blog中多次表達過,語言應該貫徹設計師的理念,而且面對實際的問題。那些邏輯混亂,試圖「解決那些根本不存在的問題」的語言,深為他所不齒。
可惜他沒看到,用戶越多的語言,兼容和妥協越多,設計師個人理念表達的越少,有點像「能力越大,責任越大」的俗套。同為設計師的王拿自己寫的小眾語言橫向比較,把這些兼容和妥協認為是設計師理念混亂,甚至上升到個人水平問題,就有點過了。
好在瑕不掩瑜,如果你能理解和忍受他過於膨脹的自我,去閱讀他的blog,裡面其實異常精彩,不乏振聾發聵的獨特見解,另外,噴 Guido van Rossum 對他來說真的算不了什麼,blog 中他不但噴遍康奈爾的老師、同學和圖靈獎得主,甚至還怒噴了10年前推崇Linux的自己。一個小小的 Python設計師,我估計他還真沒太放在心上。
本來我不想回答這個問題的,但是有個傻孩子噴王垠完全噴錯點,我去評論指出他噴錯,然後他就惱羞成怒,反過來噴我專門「烏煙瘴氣」,還把我後面的回復刪了。但我是什麼人嘛,「烏煙瘴氣」界的代表嘛,當然早就預料到了。所以一般從來不做備份的我也居然破天荒備份了下評論。下面貼一下。(基本為原文,但是我忍不住改得更烏煙瘴氣一點。注意【】內的部分為原評論所無。)
注意,本答案包含了大量針對性的評論和對詭辯術的分析,這雖然不是對本題的直接回答,但是有助於各位識別那些有問題的答案,因此希望不要基於此理由而點「沒有幫助」——當然如果你認為我說的那些問題全地球人早知道了,那你就點吧。而如果你認為我的分析有錯誤請回復指出或者直接點「反對」。
答@kidnayball
你說我把javaeye搞得烏煙瘴氣。。。看來我應該向 @范凱 道歉吧……不過你也太抬舉我了,早年俺最勤奮的時候在javaeye的排名榜最高也僅僅在30開外,因為懶的緣故,我最近n年都不太在iteye寫文章了。
好了,別【他媽】扯我了。【討論問題的時候不是好好討論,先打標籤?而且裝成能揭發人家的陳年歷史,這種噁心的二流文人伎倆?——所有【】括弧內為原評論所無。但是既然單獨寫答案,就必須把這種要害寫出來。大多數人未受過詭辯術之訓練而難以嗅到這種陰險的氣息。】
我不過是指出一個簡單事實,縮進與靜態分析毫無關係。如果王垠連parse縮進都搞不定,他還混個鳥!
所以我說你噴王垠噴錯方向了。如果你還是堅持王垠會認為縮進會造成靜態分析不便的話,那隻能說明你在parser方面實在是門外漢。還有,我這不是討論嗎?難道一定要說:「誒樓主,你的觀點非常有啟發性哦,只是我有一點點補充意見供你斟酌哦……樓主有空的話就看看哦,我絕對絕對沒有任何說你是噴子的意思哦……」才算是討論?好吧,如果你認為這樣才是討論,那我就對傷害了您脆弱的心靈鄭重道歉。
好了,說點正經的。
你「猜」pysonar是分配下來的任務,王垠很可能不喜歡這任務,這種猜測是沒有任何依據的。按照王垠自己的說法,寫個python分析器完全是他自己提出來的,他在google的導師一開始根本不相信他能完成。所以麻煩在開噴前先做點功課。【當然這裡是我沒邏輯,因為如果會做功課那就不會亂噴了。】
你「猜」王垠不喜歡做靜態分析,也沒有任何依據。【注意他行文里的措辭,顯得好像只是簡單的猜測,但是實際上純粹是下三爛的詭辯術。正常邏輯是,王垠寫了一個非常出色的針對動態語言的靜態分析器,並以此為驕傲;所以我們估計王垠應該是很喜歡靜態分析,所以才能有動力做到那麼好,並以此為傲。但是他說了一句看似永遠正確的「他做了一個東西,不等於他喜歡做這個東西,更不等於他認為做這個東西的過程很舒坦」,就輕描淡寫的否定了正常邏輯。還有那個「更不等於」跟前一句是遞進關係,但是本身是廢話。這是一種高級詭辯術,就是把未經證明的事情以修辭遞進的方式扔出來。實際上,我們喜歡做一件事,難道都是因為過程舒坦?恰恰相反,許多程序員之所以喜歡寫程序,是因為這是一項有挑戰的工作,過程很可能是不那麼舒坦甚至很不舒坦,這樣你才會在完成後感到無上的成就感。但是這裡他用一個修辭遞進就完成了:就算王垠寫了靜態分析,他也可能不喜歡靜態分析,更進一步,他不喜歡靜態分析可能是因為這工作讓他不舒坦。注意這裡跳躍了多少層?更陰險的是,這裡還潛藏著一層意思:王垠是因為不舒坦所以噴python。這種毫無事實根據,也沒有邏輯的潛台詞,實際上就是變相的人身攻擊。而且特別陰險。當然,這裡要說的是,他未必是有意的進行陰險的人身攻擊。因為被我一眼就看穿了,所以說段數其實不夠啦。要我猜測的話,他(以及不少人)是因為以前所養成的不良討論習慣導致的。】
【「以王垠說過『用縮進界定語法結構導致for/if出現歧義』的缺點」,這裡我說了,王垠的意思是縮進導致很容易因為按錯一個鍵導致語義變化而且程序還能運行你也發現不了。所以我在評論里說沒搞懂王垠的意思就別亂噴。但是他就開始說什麼「我在澳洲10年」,實在好笑。就算是純正美國人英語語言學博士,就能證明你正確理解了王垠的意思嗎?好吧,繼續往回找,說什麼「使用者們大部分覺得這沒問題」。大部分人覺得沒問題,就證明那沒問題?這種幼稚的論斷就不提了,實際上關鍵問題在於他說的「用縮進界定語法結構導致for/if出現歧義」跟我指出的「很容易因為按錯一個鍵導致語義變化而且程序還能運行你也發現不了」對於歸納王垠的觀點來說是相同的嗎?用一個不甚準確的歸納然後安在王垠頭上樹靶子,如果是故意的,那是陰險,如果不是故意的,那是表達能力有問題。表達不確切被人指出還不承認,那就是耍流氓。】
你說你是「從工程界角度」,難道您能代表「工程界」我就不能了?難道我被歸為和王垠一類的「學術界」或「科研界」……受寵若驚啊!哦我又自作多情了,估計我是被劃為「烏煙瘴氣界」的。
嗯,我再烏煙瘴氣一句,你後面說的所謂「設計決策」是玩弄文字遊戲【注意這段他後來悄悄刪掉了】。王垠說的「設計錯誤」就包含了「設計決策錯誤」。
注意,多說一句,我並不完全贊同王垠對於縮進語法的觀點,我自己設計的模板語言用的就是縮進語法。【我在其他評論里寫了,按照王垠自己的觀點,語法不重要,結構化IDE才是王道。但如果用結構化IDE,是不難避免按錯一個鍵導致縮進變化導致語義變化你還發現不了的問題的。所以也許可以噴王垠是自相矛盾。不過王垠講的因果關係是縮進誤操作很容易破壞語義且發現不了,而結構化IDE(注意不是現在的IDE)可以很大程度上避免誤操作。所以嚴格來說,拋開孤立的觀點不說,他的邏輯本身並沒有自相矛盾。】我這裡說的只是你要噴王垠可以,但得噴對點,噴得有根據,噴得邏輯。否則你就在王垠反對派的隊伍里就只能扮演豬一樣的隊友的角色。
---- 對本題的直接回答開始的分割線 ----
實際上要我猜的話【終於到正面回答問題的時候了】,王垠說的python缺陷,不是說不可能跟靜態分析有關。但是有兩點,第一,估計他看的主要是語義缺陷(比如他噴haskell的類型系統),第二,如果要說跟靜態分析相關的話,應該是那些在王垠看來無必要的但導致無法或很難靜態分析的特性。我不是python專家,因此難以就python舉例,但是可以說下JavaScript。JavaScript的with語句就公認是這樣一種設計錯誤。(with本來可以不設計成那樣,就不會導致破壞了語言的靜態作用域並嚴重影響語言性能的優化。)當然上述也都是我的猜測,很可能猜錯,歡迎大家噴我,最好是王垠本人來噴。
---- 回答結束的分割線 ---
最後說一個額外的事情,什麼是「噴子」。除了跟熟悉的人打打鬧鬧(比如我說計子老師就是每逢王垠必噴),對於不熟的人,我是不會說他是噴子的。
因為有兩種行為屬於人身攻擊。(我反對人身攻擊,但是不反對說髒話。不說髒話也可以進行惡毒人身攻擊,說髒話也可能只是語氣助詞而實際是愛的表現。)
其一,對私域的攻擊。
比如對於問題「應不應該廢除死刑」,你對支持廢除死刑的人說「你支持廢死是因為你爸媽是死刑犯。」或者對於問題「性產業應不應該合法化」,你對支持合法化的人說「你支持合法化因為你愛嫖娼。」
(若他能證明他爸媽確實是死刑犯,或他確愛嫖娼,則問題就複雜化了,涉及到了下面的第二點。不過99.9%的情況下這類言辭純粹就是發泄。)
其二,在沒有證據的情況下給對方的行為定性。這也包含那些看似有理有據實際上毫無邏輯充斥詭辯的行為。這種人身攻擊常具有隱蔽性,甚至顯得溫文爾雅,頗有道理,一般人容易被蒙蔽。
舉例來說,他說「別像你在javaeye那樣把這裡也搞得烏煙瘴氣好么」,實際上是暗示我是一貫搞烏煙瘴氣的人,在沒有任何論證的情況下,這是一種對私人品德的攻擊。儘管口氣上並沒有那麼不善,但是其實是很糟糕的行為。
這樣一種隱蔽的人身攻擊甚至你都很難舉報,因為大部分社區(包括知乎)的管理員只會按照死板的字眼去判斷某句話是否違規。我認為這是所謂劣幣驅逐良幣的深層原因之一(cc @庄表偉 ),胡攪蠻纏撒潑耍賴未必要說髒話,而有理據的激烈討論卻可能因為偶爾粗口被刪除。
反過來,我說他在「噴」王垠之前,都給出了論證。(如果我論證有問題,歡迎指出錯誤。)另外,注意一點,我從來沒有給他定性為「噴子」。因為「噴子」是指這個人一貫亂噴成性。我只看到了他噴王垠,沒看到他噴其他人或者在過去其他話題里噴,自然無法論證他一貫亂噴成性。不過現在我傾向於雖然無法定性為噴子,但是說他撒潑耍賴是能比較可靠論證的。比如他要我注意:1. 相對於你來說,我在知乎是一個新人
我為什麼要注意你是個新人?新人就應該有特權?我們應該額外照顧新人的情緒包括容忍他亂噴別人而不能指出來?還真是像小孩的耍賴邏輯——因為我是小孩所以你說我就是你不對!
2. 我在這裡發表了一條貌似簡單,其實有深意的回答。(對錯暫且不論)
嘿,貌似簡單實有深意啊,這怎麼聽都不是新人,而是大師風範啊!這種大師潛台詞就是你丫不能領會我的深意!還「對錯不論」,真謙虛!相比而言,我給你論對錯,就落下下乘了噢。這就是常見的大師論不下去就用「我有深意」來耍賴的絕招。
3. 你根據這條貌似簡單的回復,在沒有其他證據支持下,首先認為我不知道王垠寫過PySonar,然後認為我沒認真讀他的博文,由此得出我在噴王垠。並對我發出了「你什麼邏輯啊」, 「所以你們這些人連王垠說什麼意思都沒搞清楚還好意思在噴王垠「 之類不友善的評論」
我哪裡認為你「不知道王垠寫過PySonar」?我一開始說的是「你什麼邏輯啊,他都做了PySonar了。」(幸好評論可刪不可改。)可見我批評的點是在邏輯上,而不是你是否知道他寫沒寫過。而且我之所以批評你是「邏輯問題」而不是像後面批評你說「pysonar可能是被分配的任務」是「沒有證據的瞎猜」,顯然是我認為你(已經或應該)知道他寫過PySonar。那麼這裡演的是哪一出?您是記憶出了問題?還是邏輯有問題?還是激動了?如果都不承認的話,那就只有「撒潑耍賴」可以解釋了。
其後又說我因為認為你不知道他寫過pysonar然後認為你沒認真讀他文章。這又是一個高級詭辯術。我確實認為你沒有讀懂他的文章,是指那篇關於縮進的文章。你後面摘的「所以你們這些人連王垠說什麼意思都沒搞清楚還好意思在噴王垠」的前文是「他說的縮進容易導致歧義是指……(這)跟靜態分析毫無關係」。可見我的論證過程是簡單到不能再簡單:
A. 王垠的意思是xxxx
B. 你沒搞清楚王垠的意思
C. 所以你這是噴
要攻擊我的論證,很簡單,要麼證明王垠的意思不是xxx,要麼證明你其實搞清楚了王垠的意思。後來你確實想論證你其實理解(比如什麼在澳洲十年啥的),但是估計是這種論證太弱了,所以這裡把我的論證歪曲成:
A. 你不知道PySonar,所以你沒有讀他的博文
B. 你沒讀文章就噴,所以你是個噴子
C. 你是個噴子,所以你說的話都沒有邏輯
顯然這個論證到處是漏洞,而且充斥著「不友善」,是典型的人身攻擊風範。
問題是這根本不是我的論證,而是你臆造出來安在我的頭上。扎個稻草人當然可以隨便扎了!
類似的伎倆還包括,我從來沒有定性你是噴子,但是你卻寫道:由於你已經把我定性為噴子,為了避免造成無意義的爭吵(估計要你想我道歉也不太可能),我們就此打住吧。請不要再在我的評論里討論了,謝謝。
這裡包含幾個陷阱,第一是給我安了個「把我定性為噴子」的莫須有罪名。第二,「為避免無意義爭吵」而「請」我不要再評論。看上去禮貌,實際上是以退為進。我若真不評論,豈非被做實了那莫須有罪名?待我進一步評論後,果然不出我所料他刪除了我的評論。
最後「不友善的評論」,我的評論確實不是「友善」的,但是,那是不是「不友善」?其實未必。判斷「友善」必定存在主觀理解。前面我就說了,包含粗口的激烈爭論也可能是真知灼見,只要討論者的關注焦點不是在「友善與否」而是在「理性與否」。就算是「不友善」的,誰規定評論必須友善?我們是來討論的,不是來秀禮貌的。(注意,反對人身攻擊,不是因為不友善,而是因為無價值。)
好了,暫時先寫到這裡。其實當年我在javaeye炮轟《JavaScript征途》那書的時候,就說了,其實書未必多爛,我最不能忍的,是該書作者對正常技術評論的那些帶有文人陰險氣的回復,硬是把技術討論變成人身攻擊,還是普通人很難發現的那種,以至於引來幫腔、同情和鄉愿。而這麼多年來,若我們還是對技術界的這種講不清楚道理就耍賴的真正的「烏煙瘴氣」視而不見,難怪王垠要歸結為「心理疾病」了啊!
我所知道的有:
利用縮進(或者是layout)的控制結構
看王垠的blog http://yinwang0.wordpress.com/2011/05/08/layout/
1. 少打一個縮進或者多打一個縮進造成的歧義(尤其是在for/if裡面套if/for)
2. 空間和時間的節省並非足夠高效
3. 修改代碼的時候,常常會手動調整縮進
簡單的一個例子,你在 for 下面 nest 一個 if,然後不小心 &<&< 你一眼看不出來哪裡奇怪了
補充一下吧,在這個答案里:https://www.zhihu.com/question/30703519/answer/49450423
答主指出 (王垠原話出處我沒空找了,但這樣的論調我記憶中不止一次)
而王垠批評這個特性最直接的動因,則是他自己說的:「在設計這個靜態分析的時候,我發現 Python 的設計讓靜態分析異常的困難,Python 的程序出了問題很難找到錯誤的所在,Python 程序的執行速度比大部分程序語言都要慢,這其實是源自 Python 本身的設計問題。」換言之,這個特性讓他不滿,是因為這個特性讓他很難設計靜態分析器,雖然他馬上將理由引到所謂「這門語言的設計問題」上。
搞笑的是,某V自己也贊同了該答案。(不想再戰,就不圈了)
而在某大V對我口誅筆伐一年後,王垠自己發了博文:
有些人以為王垠對自己做的 PySonar 和 RubySonar 引以為豪,以為他是 Python 和 Ruby 的專家。而其實呢,他做這些東西只是為了掙點錢來糊口。他其實根本不在乎 Python 和 Ruby,反倒認為給這些語言做東西貶低了自己的價值。
我把這個引文貼到某V的答案下,他說「反正我當時沒錯」,「你是在詆毀王對人類知識的態度」(想像力爆棚啊),然後關了評論。
============ 原答案分隔線 =================
綜合 程序語言的常見設計錯誤(2) , http://yinwang0.wordpress.com/2011/05/08/layout/
和在 程序員的心理疾病 中提到 「在製造了 PySonar 之後,他對程序語言的理解,他的每一個錯誤都被我看得清清楚楚。」 等總總跡象,我臆斷他所認為Python語言的最大問題是:
不適合做靜態分析
============
可能邏輯有點跳躍,評論中有人指出邏輯不清晰:既然他已經做出了PySonar這個靜態分析器,怎麼能說Python不適合做靜態分析呢 ;或者他怎麼會認為Pythoon不適合做靜態分析呢;又或者即使他認為Python不適合做靜態分析,但你怎麼能確認他所說的python缺陷都屬於這個類別呢。(因為原評論里沒有明說,後面三種可能是我腦補的,如果沒有說中評論的本意,歡迎指正)。
所以下面展開一下,先說明,我對python只是了解,日常用的動態語言是那種他認為更不堪的 —— Ruby。如果對Python理解有誤的地方歡迎指出:
首先,「不適合做」不等於「不可能做」,只不過做的過程中會遇到一些令人不爽的麻煩。
他所說的錯誤,大部分是在做PySonar時發現的(他在上面的引文中自己說的),也就是對他「做靜態分析器」這個特定任務造成麻煩的地方。以他說過「用縮進界定語法結構導致for/if出現歧義」的這個缺點,如果問實際使用python的人,恐怕大部分人都不覺得是個事。但對寫靜態分析器的人來說,則多多少少算是個坑。至於那篇對於動態語言的地圖炮,則更為明顯。初看時我一頭霧水,「弱類型面向對象」,不就是所謂動態語言的定義么。一些在定義層面就出了錯的語言,怎麼會流行起來?但再結合他做過PySonar來看,就好理解了:給動態語言做靜態分析真心不爽啊! (對他來說未必複雜,但從文章看上去,有一種遇到不完美事物的不爽)
其次他做了一個東西,不等於他喜歡做這個東西,更不等於他認為做這個東西的過程很舒坦。
根據他的博文,PySonar是2009年到2010年他在google實習時做的,我不知道google實習的具體運作(看過電影,但畢竟是電影),不排除PySonar這個任務是被分配下來的,即使他能做一定的決策,在公司和團隊中也不會像在學校里選題那麼自由。也就是「給動態語言做靜態分析」這個事情,未必是他自己真心喜歡做的一件事(如猜想錯誤歡迎指出)。
最後,假定有一種語言特性,按照學術界里程序語言設計理論,是錯誤的。但在實踐中並沒有造成太大麻煩,甚至不少人還很喜歡(例如python的強制縮進,有人不喜歡,但也有不少人很喜歡。而不喜歡的人多數是因為不自由,而不是他所指出的for/if歧義問題。同理,動態語言的duck typing,使用者們就是沖著這個去的,你把這個「缺陷」修復了,語言是完美了,只不過沒人會去用)。而且對於一個完全可以自由發展的開源語言(相對於Javascript),經過多年發展,沒人肯花工夫去修復這個錯誤 (我想說的是,如果使用者們真的認為這是個錯誤,早就修復了)。那可不可以說,這個」錯誤「並不是出現在使用上,而是出現在這個理論所關注的特定領域,例如,做靜態分析。
====================================
以下內容與完全主題無關,是對賀師俊的討伐答案之回復。但因為本人的話癆成性,超過1000字無法貼到回復里,只能放這裡了。以下內容,」答主「指 賀師俊,「本回答」 指 他的在本問題下的回答。
====================================
先來看看關於答主這條回答的正當性,算起個提綱
正常技術討論,是不需要正當性的。但罵戰,就必須要正當性,只有理由正當,才可以在討論正題的同時,夾帶一些貶低對手的私貨。正如本條回答,私貨之多,如果不具備正當性,很容易被認為是無理取鬧。當然這種低級錯誤答主是不會犯的。在javaeye罵戰時正當性一般是「樓主在誤導小朋友」,彷彿「誤導」二字一出,在台下那些正在聽別人誇誇奇談,眼神迷離的觀眾們就會猛然醒悟,被答主拯救於水火之中。自然對於這種試圖誤導他人的壞蛋,怎麼貶低都不為過。但這次,我沒有推廣任何東西,誤導這個理由不好用了,所以需要另找正當性。現在看看這條答案的正當性在哪裡呢,在答主看來:
1. 我在一條答案里噴王垠 (或者客觀效果令人覺得是噴)
2. 他一眼看穿了我的邏輯錯誤和技術白痴,並予以指出
3. 我被他揭破後,惱羞成怒,指責他把「javaeye」搞得烏煙瘴氣(暗示他就是個喜歡把論壇搞得烏煙瘴氣的人,屬於人身攻擊),並拒絕與他繼續對話
4. 他本著「被你罵了沒理由不駁斥」的出發點,還是進行了回復
5. 我刪除了他後來的回復,還擺出一副高高在上的樣子列了1,2,3 (我不知道在答主看來這3點是如何的,因為他逐條分開反駁,似乎沒有明白我之所以列這三條的意思)
按照一般吵架動手評理的觀點,誰先挑起事端,誰就屬於不正當的一方。在答主看來,挑起事端的位置是1,而在2他進行了文明理性的回擊,然後我在3進一步挑起事端,並在5進行了厚顏無恥的刪帖,因此他這篇回答極具正當性。可以放手大罵我的二流文人陰險性格,充滿邏輯陷阱的詭辯,豬一樣的角色。
這個正當性的邏輯鏈,如果有漏洞的話,就在於以下幾點:
對於第一點,我究竟有沒有噴王垠。或者即使沒有故意噴,在表達方式上有沒有已經盡量避免聽者誤解 (總不能說你覺得我說的話令你誤解了為噴就是我在噴吧,這就屬於倒果為因的循環論證了)
對於第二點,在他「指出我的邏輯錯誤」時,有沒有夾帶人身攻擊的私貨。如果有,這些攻擊的內容是否正確(罵矮子是矮子我總不能說別人錯吧)。
如果以上兩點成立,那先動手的就不是我,那麼第三點中對於答主的指責,就只不過是還手,而不是挑事。如果能進一步證明這種「烏煙瘴氣」的說法並非無的放失,那效果更好。
最後是在第五點中,我刪除他的回復是否正當。既然我要終止交流,為何還要列那三點「事實」。
如果我能在以上幾點打破答主的邏輯鏈,那麼答主這篇對我充滿了人身攻擊的答案,將失去正當性。按道理,還再歉我一句道歉(答案中對於傷害我脆弱的心靈的道歉我就接受了,一次半次沒事的,下次注意就好了)。如果我無法打破,你反正已經罵爽了,我們兩清,我向王垠道歉(估計他一點也不在乎)。
當然最後的結果很可能會是無解,我覺得我打破了,答主覺得沒打破。這沒辦法,那就終止交流吧,我求之不得。我覺得把該說的東西都說出來了就行了。答主可能要說,和局也算你贏,你太狡詐了吧。沒辦法,誰叫一開始是你來踩我的場子呢,我從頭到尾的目的,就是Please leave me alone啊。
-------- 辯論規則分割線 -------
在正式開始討論正題之前,我覺得應該先對後面可能產生的辯論立下一些基本的規則,當然答主可以反對。但我覺得有一些基本規則,能少走一些彎路以及偏題的可能。
首先是關於行文風格的,老實說我不太明白什麼叫「二流文人的陰險文風」。「像你這種就是」這樣的小學生用語我覺得答主也說不出口,那麼我就主動承認吧,我這種就是二流文人的陰險文風。但是既然是辯論,各人肯定要用自己最熟悉的方式去行文。否定對方文風實在是沒有太大意義,就相當於戰士跟法師說「有種你跟我近戰」。你叫我用上流文人的光明正大文風,那還不如我叫你不能用逐句反駁的組織方式,和停止在討論正題同時赤裸裸地夾帶人身攻擊的行為(我承認這是你的行文風格,在我未能對你的正當性證偽前,只要不同時引入邏輯問題,夾帶一些攻擊我倒無所謂),至少目標還明確一些。如果答主對文風的分別確實無法忍受,那最好的方法就是終止討論,我再次表示求之不得。
-------- 題外話分割線 ------
不過,由於答主已經在主貼中對我的陰險文風進行了一些否定,那麼禮尚往來我也評論一下答主很常用的逐句駁斥方式。這是一種比較討巧,但略顯下乘的辯論方式,首先說明你不屑或無法把自己的這一輪說理有序地組織起來,甚至沒有去歸納對方的主要觀點和論證過程,而要藉助對方原本的行文組織。其次,逐句回答這種方式是怎麼來的,源頭是新聞組裡回答問題,因為早期的新聞組客戶端不方便查看交流記錄,因此採用逐句回答的方式把答案直接嵌入問題相關的地方。這種組織方式很容易導致讀者只看答案中的引文,而不去看原文。如果是全文引用,那還好,如果是只抽關鍵點來回答(礙於篇幅這是很常見的做法),特別是駁斥,很容易陷入斷章取義的境地。當然理性的讀者讀完答案(或反駁文章)後,會回頭看原文,但已經有了先入為主的印象,打亂了時序,對原文作者不利。第三,通篇反駁文章很容易陷入只有駁斥而無立論的境地,看上去對手都是錯的,但最後自己也提不出什麼可行的東西來。唯一好處就是:爽,把對方文章每一個錯誤點都駁得落花流水,大殺四方,讓對手知道自己每一句話都是錯的,無地自容,還有什麼比這更爽?
以上純屬陰險文人回咬一口的題外話,請陪審團無需參考。
-------- 題外話結束分割線 -----
其次是關於充分條件與必要條件,和證實與證偽區別的。希望在這些基本的邏輯規則上不要有太多分歧。答主估計會說我很陰險:你很多話都加了「可能」,「未必」這類限定詞,你豈不是立於不敗之地。你要證實舉一種可能的情況就行了,我要證偽則要證明絕不可能。這沒辦法,一來實情如此,二來加了這些限定詞雖然增加了罵我的難度,但同時也降低了我這句話的可信度,說服力以及我提供這種猜想所獲取的聲望值,有得必有失,我已經付過價錢了。況且,你總不能說我的錯誤就是沒能提供一句有明顯錯誤的話讓你來罵吧, 「讓你罵得爽」好像不屬於我的職責範圍,我也沒求著你來罵我,對吧。這些話你最多說它們是廢話(不過下面我會討論它們究竟有沒有價值),但不是錯話。當然,答主提到一點我非常認同,就是任何時候不應該對別人的私域進行負面的公開評論,包括加上了「可能」等限定詞。那麼不負面並加上了「可能」修飾詞可以嗎?我覺得問題不大,你認為在路上見到一個人衣服上沾著貓毛,你公開評論:這個人可能喜歡貓。只要允許知情人士反駁,這種評論我覺得沒有道德上的問題,法律就更說不上了。至於那些對「可能」二字直接選擇性失明的人士,對不起,我誤導你們了,但這篇東西不是寫給你們看的。
好吧,暫時就想到這麼多。答主可以反對或補充。
-------- 辯論規則結束分割線 --------
現在開始進入正題。在順序上,我將先對在情感上引起負面影響的關鍵點和容易論證的點進行展開,然後再談一些邏輯複雜些的點(其實本來也不複雜,被答主繞著繞著就複雜了,我會試圖把它們理順)。避免大家打瞌睡……(如果你現在還沒睡著的話)
1. 關於刪評論
首先先說說刪評論的問題,這是一個容易激起公憤的事情,影響大家閱讀的心情,所以先回應這個。
首先,決定刪除樓主的評論,是基於我對知乎這個平台的理解。我覺得在這裡回答或評論的東西,應該與主題相關。而在當我發現答主認為我在「噴王垠」之後,我和答主的對話不可避免會在我到底「有沒有噴王垠」這個問題上展開。而這種討論對主題沒有任何幫助,並且以我答主的了解,肯定不會是三言兩語可以打發的,必然影響其他對主題有價值的評論。所以,我在說明「在你仍然認定我在噴王垠的話請不要回復」後,把答主後來繼續添加的所有回復都刪除了,只保留聲明前已發的回復。而且刪除後我留了言,再一次說明了刪除的原因。刪除評論後,為了能儘快終止不必要的交流,我把答案中對答主的@ 也修改了。禮數上我覺得沒有問題。
其次,是答主自己在評論最後寫 「又回復了這麼多。要刪除的話隨你」,我想既然答主這麼大度,所以立馬就刪了,甚至都沒仔細看。答主當時在我的評論下留了大概有這篇答案一半的篇幅。我不否認在被刪除的回復中有討論問題的部分,但討論的過程又夾雜了一些對我本身素質的評論 (好吧,看了這個答案才發現其實是素質評論之中夾雜了一些討論主題的地方),除了在現在答案中看到那些,我記得其中還有「玻璃心」這個字眼。我覺得太過糾纏不清,辯論下去則離題,不辯放著則等同默認且礙眼,難得答主自己又表示可以隨便刪除,當然刪之。老實說我都沒有截圖,這段話所說的東西我無法提供證據,但我相信答主還不至於在這種問題上糾纏吧。即使答主不認也無所謂,不影響論證。答主如果要聲明我這段是亂說,我道歉並請所有讀者忽略這段,犧牲一個論據幫助了解我的朋友們看清一個人,算是值了。
那既然我刪除了答主的評論,是為了終止交流,為何又列了三點所謂「事實」,讓答主思考呢。答主在這個答案中對這三條「事實」採用了逐條反駁的方式,結果完全沒駁到點子上(這就是逐條反駁的壞處),因為忽略了最後一句最關鍵的話:「請你再閱讀一遍王垠的《程序員的心理疾病》一文,對號入座」。好吧,再說具體一點,請移步《程序員的心理疾病》一文,打開《去讀文檔》一節。看看王垠寫了什麼:
1. 王垠進入了Java聊天室,對這個社區來說他是一個新人
2. 有好幾次他問了一些「貌似基礎,而其實很深入的語言設計問題」
3. 他受到了他所認為的不禮貌的對待:被告知「去讀API」
好,現在請對號入座。那些令王垠不爽的人(如果看到王垠這篇博文),當然可以也像答主那樣對他逐條駁斥。老實說吧,在這點上我都覺得王垠有點玻璃心了。不過,anyway,既然答主在我答案的評論里是為王垠抱打不平,那我就用王垠的例子來告訴答主,前面我為什麼說「不要像在javaeye那樣把這裡也搞得烏煙瘴氣」,我不是還欠答主一個解釋么。鑒於答主自己在許多地方也是先說結論,遇到爭議再展開說原因,我這種論述順序應該沒有問題吧。你也許會說,類比不當,你怎麼能跟王垠比,請別忘了,他對於社區是一個新人,我在知乎也是一個新人。強調我是新人不是要你呵護我,而是說明我並無其他劣跡,你怎麼就斷定我是「噴子」呢。(這條答案里,答主只是說我在「噴王垠」,而不是「噴子」。但很不幸,他的表達方式里有一些其他問題,導致讀者很容易這句話理解為「你們這些噴子」,這個後面再展開討論)。答主同時辯稱,他對我的不友善回復是很正常的,討論中不必要友善。那麼請看王垠的例子,「不禮貌」的門檻低到什麼程度,「對一個看上去很基礎的問題,告訴你去讀API」。王垠這篇文章的題目叫《程序員的心理疾病》,相對他來說,我所遇到的這種社區氛圍,用一句「烏煙瘴氣」來形容,不為過吧。
2. 關於我有沒有噴王垠,順帶談談噴王垠的方向
這是個非常關鍵的問題,如果我在最初的答案里就噴了王垠,那我就是挑事者,而答主就是抱打不平的正義朋友。反之,如果我沒有噴王垠,還能進一步證明答主在前面邏輯鏈的第二步中對我進行了人身攻擊。那麼我在第三步的「烏煙瘴氣」一說即使無法證明,那也是被污衊後的回擊,當然能證明更好。下面分主觀和客觀兩方面論述:
a. 主觀上,我完全沒有在技術上噴王垠的動機
首先,在給其他人的回復中我提過,我對王垠的技術非常佩服。早年也參考過他的emacs配置來學習。雖然我不用PySonar,但他不是還在做RubySonar么,雖然還不是完全版但也值得期待。他跟我又毫無交集,我根本沒理由從技術上去噴他。王垠這篇《程序員的心理疾病》,我覺得從工程界的角度去看比較幼稚,很多邏輯鏈都既長且脆弱,正如答主所說,要噴我也會從邏輯鏈的角度下手,而不會選擇技術或揣摩心理這麼高難度的角度,何況在中文論壇上以技術駁倒他對我沒有任何好處,下面會說到。
就以這個python缺點的話題來說把,他要從他做過PySonar因此了解Python里的設計錯誤開始,到公司面試時不應該輕視他,中間的邏輯鏈不知道隔了多少層,你先要證明這些你認為是錯誤的地方真的就是錯誤,然後要證明這些錯誤的數量多到或嚴重到一個不容忽視的地步(極端點來說,如果Python里就這一個縮進的錯誤,知道了「所有」錯誤也沒有什麼可以拿來說的),然後要證明知道這些錯誤的話就比python的作者要優秀,再證明比python作者優秀的人不管在面試中表現如何都不應該被公司輕視,最後還應該證明一下公司錯過了他這個高手確實是一種損失。中間任何一點斷裂,這個鏈條就不成立。
其次.我根本沒有通過在中文論壇噴高手而出名的動機。我生活與工作環境不在國內,且已移民,因家庭關係不打算回國了,工作找的是西人公司。在中文論壇上出名對我根本毫無用處。在iteye等論壇上可以用這個名字搜到我,也就是沒事寫寫博客,而且都是些基礎東西,主要是和新手聊起來時可以直接告訴他們去那裡看。論壇帖子只寫過不超過10個,僥倖有一個被加精得了150分,僅此而已。說這麼多只是想說明,我沒有興趣在網路上出名(好吧,也不排除是早年想出名沒出成,自暴自棄了)。
再次,你看我這麼話癆,如果我要噴王垠,也不會只噴一句了。
b. 客觀上,我有沒有逞口舌之能,事實上噴了王垠的地方呢。這又分兩點,我跟答主交流,到我認為他說我是噴子於是反擊並要求終止交流,總共就發表過兩次意見,第一點是對主問題的回答,第二點是對答主問」你什麼邏輯「的回答。
先說主答案,我列出三條論據(王垠的兩篇博文加上王垠在《心理疾病》一文中的一句描述),提出一種可能:「我臆想王垠所說python的最大問題是:不適合做靜態分析」。
這個答案據答主所說,最值得爭議的地方是:這種「臆想」,「可能」的答案,可不可以拿出來說,是不是邏輯陷阱試圖誤導讀者。我的理解是,可以。因為雖然我在說這句話時沒有真憑實據,而只是從一些現有的信息去推測。在王垠站出來現身說法之前,所有其他人的任何回答,都是只一種可能,我只不過強調了其中的不確定而已(當然,你可以理解為為了將來被王垠本人否定時免責。但正如我前面所說,強調答案中的不確定性,代價是削弱了答案的力度與萬一猜對時所得到的聲望值,我已經為換取這種免責付過費了)。如果王垠一直都不打算透露答案,那麼這種思路就由其存在的價值。而且題主問題是:「王垠所說的python缺陷有哪些」,那麼,不排除(哎呀,又用不確定辭彙了,但事實如此)題主所關注的是:「王垠所說的python缺陷里會不會有嚴重的使用上的問題」,如果這樣,假如王垠又一直不出來回應的話,我的答案至少是一個非常切題的猜想。當然,我不是胡猜,列出的三條論據中,其實第一篇文章是要說明「使用上的問題可能是這個級別的」 (但後來被答主繞到parser上去了,這是後話),真正證明「不適合做靜態分析」的是第二篇(那篇是關於動態語言的一些抱怨,是的,我認為純屬是抱怨,他認為「弱類型面向對象」這種做法是不妥的)以及他的那句話「做了PySonar後,Python的設計缺陷我都一清二楚」。請注意他不是說用了Python一段時間後,而是寫了一個靜態分析器後,那麼很容易得出他所指的python缺陷大部分是在做靜態分析器的過程中發現的,再結合前面他對動態語言的不爽,那麼我認為有足夠證據去推斷他所認為python的最大問題很可能是不適合做靜態分析。
怎麼解讀我這句話呢,首先臆想就是「可能」的意思這個就不說了。「最大問題」,就是這不只是一個問題,還有一些跟靜態無關的其他小問題,只不過我認為與靜態分析相關的問題佔大部分。「不適合做靜態分析」,就是相對於別的語言,給Python做靜態分析時有特別繁瑣或不符合人類直覺的地方。這是一個很虛的問題類別,由很多與靜態分析有關的具體小問題組成。換言之,我在說,他所說的問題大部分可歸為這一類。特彆強調一下,我不是說「不適合做靜態分析器」,不適合做靜態分析還包括第二篇博文所指的不適合人腦進行靜態分析(所以才要額外去寫個靜態分析器,而且難度比靜態語言的分析器要高呀),到目前為止,我的論點沒有牽扯到具體技術,論據中提到PySonar只是一個時間上的證明(做PySonar時發現的缺陷)。而且,我認為我已經盡了最大努力,強調我答案的不確定性,避免對王垠的想法做無根據的定性。
然後,答主問了一句「你什麼邏輯,王垠都寫了PySonar了「。請注意,這時具體技術才變成了討論焦點,不是我引入的,是答主自己引入的。而且,在我看來,這個評論的邏輯是不清晰的,我推出之前結論時,其中一個論據就是PySonar,那麼這句話不是為了給我提供一個新信息,而是答主認為,王垠寫了PySonar的話,他的所指的問題就不可能大部分都是不適合做靜態分析的問題(我的回答是可能,那反面就是不可能)。同一個論據,我們做出了不同解讀。因此我只能腦補其中的邏輯鏈,於是提出了三種讓這種邏輯成立的可能,並分別展開。
第一種可能時:「王垠做了PySonar,因此說明Python本身適合做靜態分析器,因此王垠不可能認為Python的最大缺陷時不適合靜態分析」。而我要證偽,即「即使王垠做了PySonar,但也不能說明Python本身適合靜態分析」。 在這點的討論中我確實出現了一個失誤,就是答主引入具體技術後,因為我以上列出的三篇文章中只有第一篇是談具體技術的,因此我就直接以這篇文章的內容去論述,而導致出現爭議。在第一點時就選用了這篇文章的for/if縮進的內容作為例子,試圖論證雖然王垠雖然已經做出了PySonar,但Python本身仍然有可能是不適合做靜態分析(器)的地方(也就是做起來相對靜態語言要麻煩)。當然,以答主在編譯方面的水平,一眼就看穿了縮進對靜態分析沒有影響,但他提出的論據是:因為轉換為AST後縮進不存在了。顯然這不是一個證明沒有影響的充分條件:不存在的東西當然沒有影響,但由存在到不存在的過程呢,其他語言有語法塊標示符,python沒有,那麼在王垠對python源代碼進行解釋(如果他確實做了這一步的話)時,仍然可能遇到一些與語法塊標示符不同之處,令他覺得是缺陷。但因為這時討論是以for/if歧義這個具體例子來展開的,而這個例子在王垠文章的描述中,是以使用問題的方式出現的(在我看來,這是使用問題可以確認,不算大問題,但同樣的現象也有可能在解釋時需要一些特殊處理(相對於使用語法塊標示符),所以我直接拿這個來做例子)。總而言之,我使用了for/if這個例子,試圖證明「即使王垠寫了python分析器,但他仍然有可能認為python不適合進行靜態分析」。答主認為我舉的這個例子不能充分證明結論,因為其與靜態分析完全無關,對於這點我持保留意見。但對不起,我要用大招了,我的論點是「可能」呀,一個例子不通不代表就被證偽了。而且「一個人為一樣東西做了一件事,可以推出這樣東西適合做這件事」,這個邏輯本來就不通,甚至都不需要舉例,我在這裡的主要的問題是畫蛇添足了。 至此,在這個問題上,我甚至都還不認為答主已經完全證偽,自然談不上什麼被看穿後惱羞成怒。我後面指責「烏煙瘴氣」的反擊跟這個完全沒有關係。至於在技術上噴王垠,從頭到尾沒想過,即使我的論據無法證明論點,但論點本身沒有任何噴的意思,這應該不算噴吧?
然後第二點,這是答主認為我在噴王垠的主要證據。首先我們看看論點。我腦補的第二條邏輯鏈是:「王垠做了PySonar,因此他主觀認為Python適合做靜態分析,因此他不可能認為這是主要缺陷」。而我要論證的是:「王垠做了PySonar,不代表『他認為』python適合做PySonar」。我的論證過程是:一個人認為一樣東西適合做一件事,他會有什麼表現呢,至少他應該覺得用這樣東西做這件事時,很舒坦,而如果他在沒有任何外部影響的情況下,會主動去做這件事,也就是他喜歡做這件事,這樣可以就可以說明他「認為」這件東西適合做這件事了。這裡我試圖做的,是證偽。也就是存在一種可能(再強調一次,王垠沒出來證實之前,任何論斷都是「可能」),王垠未必非常喜歡「為python寫靜態分析器」這件事。而支撐我的這個推論的論據是,王垠不遲不早,去google實習期間才做PySonar。而Google是Python的主要推行者。因此我們不能排除他選擇做PySonar時受到了外部條件的影響,包括挑戰難度,而不是因為給Python做靜態分析器是他一直以來的夢想,或者做的過程令他感到很舒坦。而只要不是這兩種情況,他就有可能即使在給Python做靜態分析器,但仍然認為Python是不適合做靜態分析的(相對於其他語言)。
關於這點,答主則理解為我這是對私域的惡意揣測,對王垠勞動成果的侮辱。我覺得上面的思路已經說明了,我主觀上沒有「惡意揣測王垠並進行侮辱」的意圖,一切為了證明一個腦補出來的論點。而之所以有這個論點,是因為答主問題的邏輯鏈不完整。那麼客觀上有沒有盡量消除定性的誤解呢。 我使用兩個「不等於」,是為了撕裂「一個人做了一件事」與「一個人喜歡一件事」以及「一個人覺得做一件事很舒坦」三者之間的因果聯繫,這點我本來覺得是不應該有任何誤讀的,答主能把它理解為「你認定王垠不喜歡開發PySonar的過程」,我確實是覺得一點辦法都沒有,或者答主指導一下我應該如何表達這個意思而不被誤讀且不顯啰嗦。
而我在兩個「不等於」間使用「更」這個遞進關係,是因為「喜歡」與「覺得舒坦」有一定內在聯繫,一個人很可能喜歡一件事,而不認為它舒坦。但不太可能不喜歡一件事,卻認為它舒坦。因此當無法推導出喜歡時,就更無法推導出舒坦了。與答主所說的什麼遞進修辭邏輯陷阱(話說這是個啥,除了這裡用來指責我外你能舉個其他例子嗎?)全無關係。
最後結論一句,我覺得我的描述已經給出了足夠的不確定性提示:「未必是他真心喜歡做的一件事(如猜想錯誤歡迎指出)」。
最後一點,因為我的最初回答是「最大問題」,因此即使我證明了「王垠確實有可能在做PySonar的過程中認定一些Python不適合做靜態分析的缺陷」,還需要證明「他最終所說的缺陷,大部分是靜態分析缺陷而不是使用上缺陷」,在這裡我使用了一個由果推因的取巧方式:1. 首先王垠自己說了在缺陷是在編寫PySonar過程中(而不是使用中)發現的,因此即使他在編寫靜態分析器是發現一些會導致使用問題的特定場景,未必是實際使用中經常遇到的問題或者在使用者中已經流傳開繞過這個問題的慣用法,因此對於一般使用者,這不算是個嚴重的缺陷。 2. 對於一個已經廣為流行,且升級以社區推動,又已易用為目標的語言。由最開初的發明者所引入的使用缺陷,一直以來沒有被收復,說明這個缺陷並不被使用者所重視。那麼這些使用缺陷,王垠說出來自然是最好,即使最終他沒有整理出來。作為Python的使用者也不需要太擔心。因此從嚴重性來看,我認為可以得出「王垠所說的設計缺陷中大部分為與靜態分析這個特定領域相關的問題」。這裡又引發了與另一位朋友關於小問題算不算問題的討論,所幸沒有火藥味,而我也因此得知了一些C語言應用方面的信息,這種討論我認為相對來說是一種健康的討論。這在後面關於烏煙瘴氣論里會展開說。
上述被認為是噴王垠的三點討論,它們是並列單選的,是由我因為答主的「你什麼邏輯,王垠都已經做了PySonar了」這一句簡單但邏輯跳躍的問話而腦補出來的三種完善邏輯鏈的可能。我試圖通過對這三種可能逐一證偽(答主的推理是:王垠已經做了PySonar,因此不會是你說回答的那樣」,我要證明的是「即使他做了PySonar,我回答中的說法仍然有可能成立」),而不是我分別要從三個方面去噴王垠。而在表述上,我一開始已經明確說明由於我不清楚答主提這個問題實際是什麼推理過程,但列出了三種可能,並明確說明了下面要逐一論述,在一些可能導致定性說法的地方,均使用了不確定的修飾詞。因此,答主在問題中,對我這三點論證過程逐一批駁,並試圖論證我對王垠進行人身攻擊,我認為是不成立的。答主如果認真閱讀了我的回答,其實只需要選取其中一點(畢竟這三點是我對答主真實想法的猜測)或者提出一種新的可能,展開討論就行了。
------ 關於上面討論的補充 -------
想了一下,上面的討論重點還是不夠突出,這裡補充一下我跟答主整個交流過程的模型(包括本答案中答主對我的駁斥部分)
我:從A,B,C(C中包含D), 可以推出E
答主:你什麼邏輯,明明有D
我:??? D怎麼可以證明直接非E。你要從D推導出非E,至少應該先從D推導出F,G,H中的任意一個。下面我來說明,僅僅通過D不能推導出F,G,H中任意一個。
。。。。 (分別討論僅僅由D不能推導出F,不能推導出G,也不能推導出H,其中F和G涉及對王垠個人想法的一些推斷)
答主:什麼,你竟然認為王垠不F,也不G。你這是二流文人陰險的人身攻擊!
------- 2月18日更新 --------
本來,到了這裡,關於我對王垠人身攻擊這事已經告一段落,完全是由於答主腦子裡邏輯原件短路,把「A不能推出B」直接當做「非B」來處理了,純屬子虛烏有。但答主似乎急於抨擊我那二流文人的陰險作風,在論證人身攻擊時又夾帶討論起邏輯陷阱來。我覺得這裡是個很有趣的地方,所以先偏離一下主線,也討論一下「邏輯陷阱」。
----- 邏輯陷阱討論開始 -------
先說答主對我的邏輯陷阱指責。由於我對王垠人身攻擊這件事從根上就不成立,所以自然事實上是不存在什麼邏輯陷阱的。但我們先原諒答主的短路,人非電腦,誰都有一時短路的時候,就當答主理解得沒問題,我確實說「非B」了。問題是,我原文里沒有對「非B」進行詆毀呀,但是答主又想證明我噴呀,怎麼辦呢。挺而走險吧,改原文!於是「不排除是Google分配的」變成了「很可能是Google分配的」,「未必喜歡給動態語言做靜態分析」變成了「猜王垠不喜歡靜態分析」。不帶這樣的吧,我原文還寫在可刪不可改的評論里的呀。你這算是自己在路上挖個坑一手拿著鏟子一手指著我喊「你個壞蛋整陷阱」嗎?你把不確定性最強的「不能排除」變成傾向肯定的「可能」就算了,還加個「很」。「王垠未必」變成「猜王垠不」就不說了,我都麻木了,還喪心病狂到把「動態語言」這個限定詞都去掉了。我當然沒有任何證據推定王垠不喜歡做靜態分析呀,但他對動態語言的可靜態分析性的弱點分析博文,我連鏈接都給你貼了好不。
於是,答主三大段關於邏輯陷阱的論述,說得人毛骨悚然,我如果是粉絲看得都要熱淚盈眶:想不到世上還有此等奸滑之徒,答主再一次救我於水火啊。只是萬萬沒想到,這把火是答主自己放的。
好吧,把指責我的邏輯陷阱部分證偽了就算了。下面來看答主給我下的邏輯陷阱,說起來就火大:
------- 暴走模式開始 ----------
答主,你給下絆子就算了,還下這麼低級的絆子。雖然我是新人,也不要當我傻的好么,按王垠的說法,你用這種東西對待我,是對我的不禮貌啊!從你在回復里提「連王垠什麼意思都沒搞清楚就好意思噴王垠」我就知道你有什麼花花腸子。難道你以為我會傻乎乎地跟你爭論「我其實知道王垠是什麼意思所以我好意思噴他」嗎?對付這種在主題外夾帶私貨的行為最好做法就是立馬終止交流。誰知你還扯著不放了,見我不咬餌,算是豁出去了嗎?直接下「你的問題是沒有噴對方向」這麼明顯的陷阱,你不如再豎塊「此地無銀三百兩」的牌子。我辯輸了就是沒噴對方向,辯贏了就是噴對了方向,總之我張口就是噴。還一副很有氣度的樣子:「你要噴王垠可以,但得噴對點,噴得有邏輯」,可以【你妹啊】,這次可以,下次也可以,然後我不就變成你定義中的噴子了么?難道以後被你遇上,說一句「哎呀,兄弟你又來噴了」,我還好意思說「我雖然經常噴,不過都噴得對點,噴得有邏輯」。你這算是騙小年輕吃搖頭丸嗎?
------- 暴走模式結束 ---------
不過話說回來,簡單直接,就騙你一時不注意,這才叫邏輯陷阱。就像知乎里最常見的邏輯陷阱:不問是不是,就問為什麼。至於那種邏輯跳躍好幾層的,偵探小說里才會有。
------- 邏輯陷阱討論結束 ------
關於邏輯鏈第一點就說完了,結論是,我沒有對王垠進行任何人身攻擊。答主之所以夢見發生了人身攻擊主要是由於其大腦邏輯零件進水。
2. 邏輯鏈第二點:答主在「揭穿我的技術能力」時,有沒有進行人身攻擊。
我記得答主好像提過「即使你聲稱主觀上沒有人身攻擊意願,但如果表達方式上讓讀者覺得是人身攻擊,也算人身攻擊」,不過找不出來了,可能在被我刪掉的評論里或者我記串了。不過這不是問題,由答主從一條遞進修辭(其實是「A不等於B,更不等於C」這樣的相關性判斷,因為相對於B,僅僅從A就能推出C的可能性更小,那就用個「更」唄)都能跳過幾層邏輯,發掘隱含意思,找到潛台詞,論證出原來是一種很隱蔽的人身攻擊,那上述這條顯然成立。為了公正起見,我在前面中又加入了一條:「且說話人沒有在語言表達上盡量規避聽者誤解」。
答主在我的答案下評論中的最後一句:「所以你們這些人連王垠說什麼意思都沒搞懂還好意思去噴王垠。」 我認為是對我的人身攻擊。
「噴」在一般人的理解中,是一個貶義詞,按正常理解,說A在噴B,特別時A其實是正常說理,而根本沒有對B進行攻擊,僅僅由於第三方腦子邏輯零件進水了所以認為是攻擊,跳出來說A在噴B,對A是一種誣衊。但答主後來又聲稱在他的字典里,說別人「噴某人」(這件事)其實是一種打打鬧鬧的和諧舉動。只有說別人是「噴子」(這類人)才是攻擊。好吧,就算按答主的字典解釋,這句話會不會被理解為答主說我是「噴子」。答案是,會。因為答主加了個複數主語「你們這些人」。既然跟我單獨交流一件事,說「你連王垠說什麼都……」就好了,為何要扯個複數主語呢。這句話先把我歸到一個人群中,然後描述這個人群的共性。答主的本意也許是,這群人就是指在「這次噴王垠」事件中的那些人(話說如果是這樣的話,為啥要跟我扯其他人,其他人怎麼樣跟我有什麼關係?)。但問題是,你在主語里專門把單數繞成複數,那麼噴王垠的次數自然也變成複數。在沒有其他限定信息時,讀者不會認定為 「每人各只噴了一次」 這種特殊情況,而是理解為這群人經常噴王垠。且噴的時候連「王垠說什麼意思都沒搞懂」。一群人,經常「亂噴」王垠,那我們怎麼稱呼這群人。按照樓主在本答案中的定義:「噴子」。
答主在這裡表達上不但沒有盡量規避誤解,還捨近求遠把單獨交流時的主語改用複數,先把對方歸類再作定性(噴王垠),增加了把我理解為「噴子」的可能。而這種定性最終被證偽(見前文),故此可以認為是一種人身攻擊。
證畢。
===== =======
本來想繼續寫關於我說烏煙瘴氣的問題,但想了一下,還是暫不展開了,一來證明自己清白就夠了,答主攻擊我,我當然還擊,但沒必要再去主動攻擊,二來不想再糾纏太多,浪費時間。關於烏煙瘴氣的話就看做我是報復性地還擊吧。畢竟事情發展到目前為止,我無緣無故被答主詆毀為噴子,回罵一句同樣程度的話並不為過。為何說是同樣的,我們為什麼討厭噴子,就是因為他們把社區搞得烏煙瘴氣。你說我是噴子,本來就已經隱含了對我破壞社區氛圍的指責。只不過你是從給人定性入手,我是結果導向而已,說的是一回事。
如果答主一定要我說出我為什麼要提javaeye,我自然能說出個所以然,但如無必要我覺得無須展開說。反正我不是暗示了掌握什麼歷史猛料,要論證也是從答主公開可查的帖子或博客上去談,只不過對答主在社區中所起的作用有不同的解讀方式而已。答主問 「如果這樣我豈不是要向范凱道歉」,我倒是覺得不用。如果你覺得iteye現在根本沒有衰落,自然不用做任何道歉。如果你認同現在的iteye衰落了,在我看來,自從他在javaeye上推ruby而輕java,社區就已經踏上了不歸路,一個掛羊頭賣狗肉,連自己的根在哪裡都找不到的社區,一時間再繁榮也只能為他人作嫁衣裳,最終走向衰落是正常的。借Oracle發難之機改名為iteye,其實倒是好事,至少算是名正言順了,可惜稍嫌遲了。而且整個社區的底子就是java,不是改個名就能轉過來的。這就離題太遠,不多說了。
== 完畢 ==
我能看出馮小剛拍的電影有很多毛病,但我能拍出和他一樣的電影嗎?
不可能,因為我連基本的導演知識都沒有。即便有,也要其他的很多因素,比如有人給你投錢,你自己有時間等等。
評價能力和製作能力實際上是兩種能力,而且可能存在無法逾越的鴻溝,評價總是簡單很多。
製作能力是包含了評價能力的,因為無法評價事物就不可能做出好東西。
有很強的製作能力,就一定有很強的評價能力,反過來就不一定。
有很強評價能力的人,可能幹不出什麼名堂,也可能很牛逼,都是有可能的。至於這個人是不是真的很牛逼,還是做出點東西才能下結論。
說 Python 縮進不好,我看這主要是個口味問題,有的人就很喜歡縮進,比如說我,我覺得這樣可以少輸入很多end或者}。有人喜歡吃甜的,有人喜歡吃鹹的,你不能因為自己喜歡吃甜的,就說鹹的好難吃,把菜做得偏鹹的廚子水平遠不如自己。。。憑心而論,我自己在5年前剛接觸python時因為縮進的問題給我造成過幾次沮喪,然後自那以後我成功的學會了使用IDE也好,使用像nodepad++這樣的文本編輯器也好,第一件事情就是去設置tab=4空格之後,就再也沒有因為縮進對我造成過困擾了。所以我在網上看到有吐槽python縮進問題的時候,我大多會在心裡默默的想,這應該不是技術問題,而是一種思想認同的問題。
我們要有愛。
他在公司因為不會Python被取笑,然後他又在blog里憤怒的取笑他們,我們作為看客,在這裡又取笑他?
更好的去接受別人提出的意見,即使是尖銳的。世界上哪有什麼東西是完美的呢。
我們么,無非就是在那麼多不完美的東西裡面,針對情景去選擇對的那個。
很多人其實是討厭,能力出眾但很狂妄的人,而並非針對他的一篇文章,一段話。不過確實能力出眾的人不一定有多大的成就,這就是他們的小辮子,大家不要太較真了。
祝願世界和平。所有答案都看完了md不是在噴垠神就是在噴縮進要麼就是互噴, 你們這麼牛逼誰來說一下到底有啥缺點?
其實我挺喜歡python的縮進的,比java和C#無休止的{}強多了!
自從我教會了公司的財務用coffee-script來幫公司內部的管理機器人寫擴展,來幫助他做一些重複性的財務統計工作。我就明白了,雖然原作者言語偏激,但是他有些話是對的。
Rui L說的非常好了。
其實這個文章說的大部分還是有一定道理的,整個軟體行業確實滿是烏煙瘴氣。。。。。
不過:王同學的:
這種以語言取人的現象甚至出現在一些公司里。很可笑的是,我前段時間面試的所有使用 Python 的公司,最後都認定了我是 Python 的菜鳥。然而我的水平顯然高過 Python 的創造者 Guido van Rossum 很多。在製造了 PySonar 之後,他對程序語言的理解,他的每一個可笑的錯誤都被我看得清清楚楚。當然,Ruby 就更爛了
就我們面試程序員來說,如果是面試python程序員,那麼基本就考一些語言特性,如果這些語言特性不熟悉,那麼當然就會認定是一個python菜鳥
我們使用python的原因和理由,就是為了解決編程中最沒有價值的編碼問題,使用python的目的是不使用python。
至於「我的水平顯然高過 Python 的創造者 Guido van Rossum 很多」,有什麼意義?
對客戶來說,要的是又快又好的做出東西,運行穩定,後期容易維護,這些python已經完美的做到了;
開發工作不是炫技! 水平高低,聰明與否對項目毫無意義,有用的是做了多少工作,貢獻了多少價值
雖然不認為他說的完全客觀,但還是給偶爾自以為是的自己狠狠打了一個臉。
樓主想問得東西王垠在文章里沒有明確列出,畢竟不是文章主題么。不過從他關於PySonar演講中可以看出來一點吧:http://www.yinwang.org/resources/pysonar-slides.pdf
討厭Python縮進的人, 表示: 空格縮進,混用tab, 莫名其妙BUG頻出...
支持者: 用個好IDE. 再也不會有看起來怎麼都對, 其實運行不了.
討厭標籤控制流的, 表示, 用{}表示block, 版面雜亂:
支持者: 用個好IDE, 自動reformat. 好看得1B..
綜上所述. 好多答案爭了個半天, 結果就是一個好IDE就能解決的. 回答的不在點子上.
當然了..我確實在初學的時候被tab坑得有點內傷.
情景一:
我: 這破程序怎麼跑不動啊!
菜鳥朋友B: 發過來!
我: 好! (發過去)
B(複製粘貼): 沒錯啊! 我能運行.
我: 我重裝下Python...
(重裝若干次後...)
我: 你TMD, 用的是什麼編輯器?
B: WingIDE啊!
我: 我干! 那個會自動轉換tab為4個空格.
可以想像當時, 我差點就想刪掉Python了..
我說說自己認為的Python坑吧..
我已經徹底走上了濫用動態特性的路子,在Python這種指針傳遞來傳遞去的, 尤為明顯.
能用一個變數不斷變換表示的, 我絕對不會用2個
假設A為str
A=int(A)
A+=2
A=str(a)
可以想像, 這樣的寫法, 在團隊作戰中,絕對是個噩夢... 因為你根本不知道預期的輸出會是什麼.
經過封裝和抽象之後, 問題更加嚴重.
但在動態語言的個人代碼中, 卻是可以降低內存CPU佔用的trick...
甚至也能節約你想個好變數名的腦力與時間..
(我會說,我人在外國讀書, 雅思原來6.5 現在估計6.75的人, 想取個優雅的變數名, 還會用Google translate么...)
並且因為Python的dict 性能太強.. 造成腦袋變懶.
我覺得在大多數程序員心中, 靜態語言才符合, 美的追求吧.但就是因為時間不夠. 才會被迫發明了動態腳本.
常用語言: Python HTML JavaScript
曾經選修: Java.
看得我真的太無趣了,不就是一個縮進與"{}",";"的區別么,有這麼影響力,一個程序這是你就點東西? 你以為他們在執行時會執行一個空格還是括弧啊?
邏輯才是最重要的,其它都只是表現形式而已,說白了,哪天python心情不好,把空格與花括弧對調下,你們都樂呵了,但是有用么? 為了這個你能寫出更快運行程序,還是開發效率更高的程序?
如果你行,你開發個中國操作系統試試,那時你再看哪個語言好。還有,如果linux里用python解釋器當系統語言,估計也不會慢,不信你試?
其實我挺喜歡python的縮進的,比java和C#無休止的{}強多了!
自從我教會了公司的財務用coffee-script來幫公司內部的管理機器人寫擴展,來幫助他做一些重複性的財務統計工作。我就明白了,雖然原作者言語偏激,但是他有些話是對的。
看完回答好像大家都想寫一篇《王垠的心理疾病》似的。他果然是支持和反對都一邊倒的人
看完回答好像大家都想寫一篇《王垠的心理疾病》似的。他果然是支持和反對都一邊倒的人
看完回答好像大家都想寫一篇《王垠的心理疾病》似的。他果然是支持和反對都一邊倒的人
推薦閱讀:
TAG:王垠人物 |