天天看點

針對OpenSSL吐嘈的吐嘈-如此唱反調

前些天寫了一篇《令人作嘔的OpenSSL》,頓時引來了大量的惡評,令我非常尴尬,同時也覺得悲哀。

如果說you can you up之類的,我覺得起碼這人看出了我的本意,隻是懷疑我的能力,但是我看到一些人竟然在我評價了一段僵屍代碼後認定我不懂編譯代碼,這就悲哀了,這段代碼大緻如下:

#if 0 /*abcdefghijklmn, ( and

          ABCDEFGHHHHSASA

          */

.....

#endif

請問有人會這麼寫代碼嗎?我隻是指出這段代碼确實不合理而已。悲哀點在于,有些人為自己能看懂這段代碼感到非常榮幸和自豪,因為他知道編譯器先處理掉注釋再做宏的預處理,這隻能說明他沒有忘掉當初學C語言時學到的東西,既然編譯器的行為标準不是他制定的,那麼他一定是學來的。很多人都不是在看第一行代碼,寫第一行代碼的時候才知道它的,如果來了一個新人,他不懂這些,當然隻是還沒有學到,知道這麼一個事實對于coder來講是早晚的事,知道這一點确實不是什麼值得自豪的事情,但他有邏輯,能看懂别人的代碼,面對這麼一大堆僵屍代碼,這不是折磨人嗎?難道不令人費解嗎?确實,編譯器沒有迷惑,隻是編譯器憤怒了而已,如果C标準不允許這麼寫的話,編譯器會輕松很多,能看懂這段代碼并覺得這麼寫沒問題的人,記住,是編譯器在縱容你,慣着你,不要得寸進尺。

      不好的東西不管作者是誰都是不好的東西,即使是大師拉的屎也不是香的。不過我早就猜到會有人不同意我的觀點,隻要是大家都在用的,存在即是合理的,他們就非要找一個這麼做的理由不可,甚至還搞出這麼做是“一種藝術”,...請看清楚,關于do {...} while (0)是我之前一直使用的,但是後來我舍棄了這種做法,明白它妙處的人隻知其一不知其二,都知道它能代替goto,但是卻不知道它應該用在哪裡。如果你覺得它比goto好的話,Linux kernel的粉絲們是不是又要站出來為goto來平反呢??事實上,Linux kernel同時使用了do{}while(0)和goto,隻不過前者都是用在宏定義中而已,Linux之是以用goto是因為它可以實作序列化的回退,正如:

sth1

...goto err sth1 if error

sth2

...goto err sth2 if error

sth3

...goto err sth3 if error

return

err sth3

err sth2

err sth1

在err sth3往下,一系列的回退可以自動進行。當然,如果你憎恨goto,用多層的do{}while(0)也是可以的,但是問題又來了,不是也有人說過層次太多不好嗎?問題是,就因為某個大濕說了一句goto不好,從此goto就背上罵名了?如果你不是存在主義者,是不是應該大罵goto的引入者或者C的發明人呢?其實,goto也是藝術。事實上,以上指出的其二就是,任何東西,看你怎麼用,屎不能喂人,但可以喂狗,僅此而已。

      誠然,OpenSSL代碼可以編譯過,也可以運作,它的庫已經被用于大量場合,這就說明它是正确的,是的,它并不錯,它沒有問題。問題在于,我們不應該評價代碼本身的錯與對,以及編譯器如何地将其優化成人看不懂的機器碼,我們更應該關注的是它能給我們帶來什麼,它如何讓後來人可以看得懂,不那麼令人費解地被了解,進而擴充它實作自己的定制需求,這才是根本,代碼的生命力也是以而展現出旺盛。對于OpenSSL而言,可讀性是差了點,也許跟它的曆史以及開發模式加上缺人手有關,這些社群都是承認的,可是同學們把它當教條就不對了,認為它應用廣泛并且是大師參與其中就膜拜它。開源的東西并不都是好的,也并不都是大濕的作品,開源的本質恰恰是消除了階級門檻而帶來的自由,随便一個菜鳥都可以在github上開一個項目,同時,也有很多大濕參與的項目由于各種原因而夭折,這些原因中就包括代碼太爛,太過技巧性,别人無法參與進來。英語和國語的益處有目共睹,那就是它們的通用性,當然,你可以站在民族主義,文化主義的立場上反駁甚至憎恨我,但是我的意思是,不管你再不喜歡,不管它們多大程度的抹殺了你獨特方言給與的創造性,你還是接受了它們,不是嗎?你有你的方言,你可以說你的母語多麼的美,但是面對另外一種同樣美的方言,母語的時候,你們将無法交流,無法互通有無...對于計算機程式設計語言寫出的代碼而言,可讀性,可了解性就是通用性,要讓每一個人都能讀這段代碼,能改這段代碼。

      别把代碼寫的易讀看成什麼沒有技術含量的事情,代碼本身就不是什麼極其重要的東西,它隻是一個交流的媒介,不光是人與機器的交流,還包括人與人的交流,不像高深的數學,代碼不值得讓你寫得如此排他。

      每個程式員在剛畢業後幾乎都曾經認為寫一些很有技巧性的絢爛代碼會顯得自己水準很高,看不慣那種平常的代碼,也許老師教過說goto不好,那就再也不用它,然後換成do{}while(0)或者switch case之類的,也許老師又教過,說OO的多态可以免去else if,然後就當成了教條,時刻捍衛這些教條的同時,殘留着一點小叛逆,這就造就大量炫技巧的代碼,奇葩的代碼,比如隻用一行代碼實作一個複雜的功能之類的。這類代碼可讀性極差,以至于很難維護,幾乎不可擴充,在不久的以後,面臨全面重寫。這種喜歡炫技的,特别較真兒,鑽牛角尖,你說一件事這麼做不好,他非要給你找出這麼做很藝術的原因,反之你說這麼做很不錯,他卻非要挑一個毛病,總之,總是想表現他與衆不同,表現的自己很有不同的想法。這種人倒是挺适合參加比賽或者去單打獨鬥,不太适合在團隊工作,同時我也覺得,公司在面試的時候,不要再出那種很能讓人炫技巧但是網上答案一搜一大堆的題了...

      喜歡唱反調的并不一定是懷疑論者,他們并沒有勇氣或者能力向權威提出質疑,更多地,他們是搗蛋鬼,毫無針對性,抓住什麼都不放,就像大多數記者一樣,看到人家做好事,就說是作秀,看到人家無動于衷,就說是冷漠...很多人從大學畢業後,攜帶了一身的迂腐書生氣,愛較真,你說一個觀點,他就反駁,你說好,他就找出一點能證明不好的證據,你說不好,他就說你不懂這麼玩的藝術性,他們這麼做完全就是為了反駁你而反駁你,沒有絲毫的邏輯性,經不起任何推敲...他們很喜歡甄别說這話的人是誰,如果是權威,他們反而會把哪怕明顯錯誤的觀點當成教條,但是專家權威千萬别犯錯,否則他們就會永遠被攻擊,哪怕稍微有一次,權威的觀點真的就是對的。這就是一邊倒的書生氣。這就要扯到教育了...

      現如今很多人已經認識到了傳統教育的悲哀,迫不及待地想要采用美式教育或者日式教育方式,但在認識到自己的局限性在于态度而不是方法之前,所做的一切最終還是悲哀。

      在這個神奇的國度,同樣一個問題,美國人日本人那樣回答就說是引導思考,自己人如果那樣回答相信很多人都會覺得是毫無根據的信口開河,很多人已經喪失了判斷能力!生活在一個沒有思考的世界,生活在一個隻有标準答案的世界,生活在一個鄙視推理重視事實的世界,我每天面對的就是嘲諷和惡意!是以,如何進行教育的方法并不重要,重要的是先改變自己的态度,學會思考和判斷!否則,美式日式的教育也會被模式化,成為教條!更正一下,中國人失去推理判斷力已經2000年了。也許更久,也許根本就沒有推理判斷力,必須有人給指個方向才能走!這也許就是集權的原因。拿漢唐雄風反駁我的,那是你根本不懂成長曲線!

      很多孩子,在很小的時候表現的絕頂優秀,可是長大後就泯然衆人,每個人或者社會都有自己的成長曲線,擁有促進早熟的環境并不是什麼值得高興的事實,相反它是夾生飯的溫床,很多人在YY漢唐雄風的時候,說不定來了一隊羅馬軍團就能把皇家衛隊給滅了,雖然也有把羅馬軍團滅了的極大可能性。當初西班牙人滅了美洲帝國之前,那些帝國之間不也轟轟烈烈地上演戰國七雄嗎?如果當地的人同樣YY,說阿茲特克國王的無敵軍隊可以橫掃整個西歐(如果他們确實知道有西歐的話),那麼我想大部分的人也會贊同的。有點跑題,但事實就是,不加推理信口開河的可能是你而不是我。我沒有依據,我就不會肯定的說某件事,我說的僅僅是自己的設想猜想,或者僅僅是自己的一點看法,如果有人那我所論述的這些看法來較真,那他就真的上套了。

      有一點我很相信,那就是喜歡唱反調的人基本就是幹活的人,這是最最令人悲哀的地方,因為不唱反調的人基本都當了上司,也基本失去了任何解決問題的能力,當然也包括唱反調的能力...

      我發現一個讓别人相信你的好辦法,那就是表達論點時千萬别推理,直接說在某個外國人寫的書上看到的即可,但别太具體,因為教育出來的很多人的強烈的鑽牛角尖癖好....理論聯系實際就是一脬屎,如果牛頓生在中國,那他的所謂毫無摩擦力的理想平面不被罵死才怪!

      别人先提一個問題并給個答案,可以回答和反駁,但是卻沒有能力提出問題或者不敢針對一個問題給出自己的答案或者哪怕是一點點看法。

繼續閱讀