讀代碼比寫代碼難,真的嗎?
上讀代碼比寫代碼難,真的嗎?來聽聽別人都怎么說!
wsivoky
很多人不明白代碼意味著什么,代碼意味著要隨時理清這一坨:
讀代碼:找到圖中兩個節(jié)點之間的可能路徑。改代碼:替換一個節(jié)點,完整地保證那個節(jié)點和每個節(jié)點之間的連通性,正確性。寫代碼:新增一個節(jié)點,然后(其實不管你怎么)連到原圖中。產(chǎn)品經(jīng)理:我其實根本就不關(guān)心這些線是怎么連起來的。以上,讀代碼是NP難度,寫代碼,不好意思,對很多人是P級別的。
馮東
首先,就不說寫的爛的代碼了,只說寫的好的代碼。寫的好的代碼,依然是很難閱讀的。寫的好的代碼,一般是遵循一些原則。而這些原則,很難從最后的代碼中反推出來。這些原則一般都是 declarative knowledge,而我們看到的代碼大多是 imperative code。即使是 functional program 或者 declarative language 的 code,一般也是用低級的抽象來描述高級的原則。
舉一個類比,目前體育比賽中很多規(guī)則的修改,都是借鑒以往比賽中一些舊規(guī)則導(dǎo)致比賽比較沉悶,或者被運動員鉆空子的經(jīng)驗教訓(xùn)。但是單單去看這些規(guī)則,你無法反推出來它們是為了避免什么情況。
所謂的「讀懂寫的比較好的代碼」,一般是從代碼以外的途徑了解作者的意圖。然后再掌握作者貫徹這些意圖的一些基本習(xí)慣。遵循原則的代碼已經(jīng)如此難以閱讀,事實比這個還糟糕。任何原則應(yīng)用于具體問題,都有例外。所以在任何代碼中,都有遵循原則的代碼和例外的代碼。好的代碼只是減少后者的比例,而無法完全杜絕。
vczh
好的代碼,讀起來容易,但這是有前提的——就是你得跟作者有相同的知識背景。當(dāng)然這一般是達不到的。就算人家有注釋,說不定你得把注釋當(dāng)成關(guān)鍵字,好好地Bing一把,學(xué)他個三五個月,你才能理解作者的意圖。
王子亭
自我開始編程以來,我一直覺得讀別人的代碼的難度,要幾倍于自己寫代碼。一直以來我都很困惑,難道是我技藝不精,所以讀別人的代碼很困難么。其實不是,我能看懂代碼中的每一句話,并沒有我不認識的語法,但連在一起就不懂為什么作者要這么安排代碼了。后來我漸漸有了一些想法,代碼是程序員給計算機的命令,是作者思考過后的產(chǎn)物,但思考的過程卻沒有體現(xiàn)在代碼上,這就好比一道數(shù)學(xué)題,只有一個最終答案,所有的計算過程都被省略掉了,自然難以理解作者的意圖。
一段代碼一開始寫出來,后來發(fā)現(xiàn)存在問題,陸陸續(xù)續(xù)地改過好幾版是很常見的事情。最終版本中可能每個小的細節(jié),都是作者花了很多時間試錯的結(jié)果,但這個試錯的過程并沒有直接地體現(xiàn)在代碼上。另一方面,代碼中往往存在一些「隱含前提」,例如假定函數(shù)的參數(shù)已經(jīng)在傳入之前被以某種方式處理過了,這個假定很可能于另一個文件的某行代碼有關(guān),這種聯(lián)系很難引起閱讀者的注意。當(dāng)然,好的設(shè)計可以緩解這個問題,但很難被徹底地解決。代碼的歷史會被保存在版本控制系統(tǒng)里,但說實話,按我的經(jīng)驗,很少真的有人去翻版本歷史,因為正確地使用版本控制工具相比起寫代碼是一項比較不受重視的技能,在這種情況下翻歷史是非常耗時的。
當(dāng)然,有些人會將一些細節(jié)以注釋的形式添加到代碼中,但注釋也只能承載很小的一部分信息,因為維護注釋也是一項很高的成本,我個人一向是反對添加注釋來解釋代碼的。所以閱讀代碼實際上并沒有看上去那么輕松,為了徹底理解一段代碼,很有可能你需要付出和編寫這段代碼差不多的努力,來了解這段代碼的歷史和前提。前面提到的是閱讀「好的代碼」的情況,比如大多數(shù)活躍的開源項目,如果是面對質(zhì)量較差的代碼情況就更為糟糕了。所以我的觀點是,讀代碼絕對不是一種好的學(xué)習(xí)方式,我認為學(xué)習(xí)一項技術(shù)應(yīng)當(dāng)先閱讀書籍,然后嘗試自己實踐,最后再參考代碼質(zhì)量較高開源項目。對于大多數(shù)項目而言,可能從未把「供他人學(xué)習(xí)」當(dāng)作目標,只有當(dāng)你自己實踐過,積累了一些經(jīng)驗并且也遇到過一些困難的時候,你才能讀懂代碼并且從中學(xué)到解決問題的技巧。而在開始實踐之前,最好的知識來源是書籍,因為書籍的內(nèi)容是經(jīng)過精心的安排的,最高目標就是供他人閱讀。
達達
用熱力學(xué)來回答一下這個問題:因為從思路轉(zhuǎn)換成代碼是熵增加的一個過程,要把代碼重新整理成思路是熵減少的一個過程。
好比一副有序的撲克牌很容易變亂,已經(jīng)變亂的撲克牌要變有序需要做更多的功。所以,寫代碼容易,讀代碼難。
MisterFin
假如你讀到這樣一篇文章:“張三把一個不明物體A、一個不明物體B、兩個不明物體C交給了杰克,杰克拿起A,把A的一部分出示給皮爾杜,皮爾杜開始在從一個本本里掏出一個東西,連同收到的東西一起交給門捷洛夫,門捷洛夫鼓搗了半天...然后告訴皮爾杜不對,皮爾杜又掏出一個東西...門捷洛夫告訴皮爾杜對,皮爾杜告訴了田中...”提問:張三在干嘛呢?你會不會頭疼上面都在胡說什么呢?如果做一個替換:張三 —— 顧客;杰克 —— 收銀員;皮爾杜 ?門捷洛夫 田中 —— 收銀臺(掃描 查詢 顯示)。讀代碼的困難之處同上,就是你沒法知道作者設(shè)置的x, y, count, option, timeline等變量究竟代表了什么東西。
貓殺
讀代碼有兩種情況,一種是讀局部,某個算法、流程的實現(xiàn);一種是讀全局,整體架構(gòu),模塊的組織耦合之類的。讀代碼的目的有兩種,一種是純學(xué)習(xí),看別人怎么做;一種是要用,缺文檔的項目要從代碼猜出怎么使用,要加功能做修改等。寫代碼你只需要知道一種實現(xiàn),讀代碼你可能需要知道多種實現(xiàn)。
要能很容易的讀懂別人的代碼,簡單的說就是要見多識廣,涉及的方面很多,不管是知識上還是技巧上的,所以難度主要是在這一點上體現(xiàn)。代碼的質(zhì)量影響也很大,但是如果你有大量讀(寫)爛代碼的經(jīng)驗,難度會顯著的下降。拿到一個項目的代碼,你知道這個項目要做什么事情,有多少種可能的實現(xiàn)方法,比如是MVC還是View-Document,很快你就能從各種線索中確定是哪一種,方向一確定,隨后的事情就簡單了,尋找的都是不同的地方(往往也是好看的地方)。比如拿到個JS寫的前端交互項目來做修改,一看到EventBus的出現(xiàn)就知道八九不離十是MVP模式了。
讀代碼對工具鏈的熟練程度要求也很高,自己寫代碼,某些人硬要不用IDE拿記事本寫,也就只是慢點而已。讀一個大型項目如果不會熟練的利用工具,快速在各種定義、調(diào)用和實現(xiàn)之間跳轉(zhuǎn),那就是找虐。還有一個就是目的性,有著目的性的去讀就要容易得多。比如我讀Chrome的源代碼就是對其多進程架構(gòu)感興趣,于是從入口點開始追蹤,窗口的初始化、IPC的建立逐步的去順藤摸瓜的看。幾次讀Linux的源代碼時,都是因為項目需要,去研究Linux的時鐘管理、驅(qū)動層實現(xiàn)等。尤其是大項目,整體讀完的可能性和實用性不大,帶目的性的、參考性的去讀就要合適一些。除此之外還有很多瑣碎的技巧性的東西,都是需要長期積累的。
王瑞期
情況有很多:
1:知識背景不同。比如你對數(shù)據(jù)庫的實現(xiàn)了解很少,你就完全不知道整個代碼到底是要實現(xiàn)什么算法,什么數(shù)據(jù)結(jié)構(gòu)。
2:思考方式不同。有人喜歡 a*(b c),有人喜歡 a*c a*c ,右撇子總是很難理解左撇子左手比較有力的那種感覺。
3:無關(guān)干擾很多?!伴T前有兩棵樹,一棵是棗樹,另一棵也是棗樹”,表達了作者當(dāng)時什么樣的意境?其實作者就是隨便這么一寫,但是別人看了,總覺得有深意,被繞進去了。
4:寫代碼時臨時起意的情況很多。建房子,你知道標準流程就那樣了,所以一看就知道怎么建的。但是代碼呢,比如我要寫一個類,這個類專門用于建房子,我最初設(shè)想有幾個方法:拿錢,設(shè)計,找建筑隊,建設(shè),裝修。然后寫著寫著,我發(fā)現(xiàn),拿錢這事吧,該有個方法來處理怎么拿。然后設(shè)計這事吧,我得寫個方法,找出我最滿意的設(shè)計方案。。。。等等,在寫代碼的過程中,總體流程算是線性的,但是詳細的代碼過程中,會有很多突然蹦出來的東西。而我們讀代碼,模擬不了作者腦子不停蹦創(chuàng)意的過程,所以,就總覺得這代碼怎么感覺在迷宮里轉(zhuǎn)悠呀。
李遙
同樣是代碼,讀別人的SQL、HTML、CSS比讀別人寫的C 、JavaScript要容易,為什么?原因在于非聲明式的語言會引入Personal Style這個問題,而別人的Personal Style不像一個編程語言有教程有指南有參考手冊,而且作者本人也不一定前后一致,很多情況下你只能“痛苦地”揣測他為什么這么寫,因此你的大腦自動就排斥做這種事。
胡江
讀比你水平高的代碼,自然難。難在跟上人家的想法。讀水平相當(dāng)?shù)拇a,難。難在了解代碼后面來龍去脈,推測作者的意圖。讀低水平代碼。難在把爛東西看完還要一針見血總結(jié)出道道,避免自己犯同樣錯誤。讀代碼難,其實難在對自己的認識和對對象的把握。最后再扯一下,其實題目也不準確,并不是所有讀代碼都難。例如開車狹路遇高手,對方會清楚地表達他的駕駛意圖,讓你輕松決定如何處理。或是人家油門一踩,你還沒反應(yīng)過來車已經(jīng)過去了。有而最怕的是前方本側(cè)有障礙,你特地給對方留出一大塊車道先行。結(jié)果對方遠光不關(guān),一腳剎車等你來闖關(guān)。
聲明:本文來源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請與我聯(lián)系刪除。
------------?END?------------
●嵌入式專欄精選教程●精選匯總 | ST工具、下載編程工具●精選匯總 | 嵌入式軟件設(shè)計與開發(fā)●精選匯總 | STM32、MCU、單片機
歡迎關(guān)注我的公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
歡迎關(guān)注我的視頻號:
點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。