1. 程式人生 > >拿什麽心情來閱讀我的代碼(程序員的必備心理技能)

拿什麽心情來閱讀我的代碼(程序員的必備心理技能)

概念 術語 挖掘 偏好設置 而在 set 以及 理解 集中

技術分享

原文首發於我的微信公眾號:GeekArtT .

閱讀源代碼的開始階段,最好從感興趣、自己有直觀感受且有相對豐富準確的文檔的項目開始。如同最開始閱讀數學證明,最好從淺顯易懂的教材開始,之後再開始最前沿的paper閱讀。

閱讀源代碼需要同閱讀證明一樣的耐心,甚至更多。數學的定義或許就在前一頁,可是源代碼的某個新的類卻需要你不斷地Google,進而找到適合自己的關於原始概念的定義論述。

閱讀源代碼一定要放空自己的心,要做好精心死磕的準備。至少要在心理上給自己留出足夠多的空間與時間。大不了拿出大段時間去浪費,去閱讀、去死磕、去慢慢地把玩這個小片段的內容。(或者更成熟的想法是,完全集中註意力在自己的閱讀工作上,根本不去關心它所需要花費的時間。)在這個階段,最好拿出最為自私的氣魄,TMD全世界的事情和期望都不管了,我就要在這個小小的代碼片段所形成的邏輯框架裏慢慢破解我的問題。

能否繼續下去之後的閱讀,這個階段的心理就是絕對的分水嶺。不要去想什麽意義不意義,不要去思考什麽浮躁的進度或者世界期望、又或是想什麽此生也就如此的屁話,那些“存在”的問題是在決定是否開始閱讀的時候考慮的,而不是閱讀之中。在閱讀的過程中,就如同已經在雪山上的登山者,已經毫無退路,最優做法就是不要把自己的精力浪費在任何無關事情之上,而是把所有力氣花在問題攻堅上。

在這一刻,研究者是世界的王者。世界都必須為他而停止,他要擁有至高無上的心理信心。因為,一名研究者的珍貴價值之一,便是能夠完全吃透繁雜深奧的問題和論述。而這項工作兼具思維的復雜性與勞作的漫長艱辛。他需要將自己的智慧挖掘到最深處。並在同時,他要像一名在流水線上勞作的工人,經歷無意義的重復勞作和蠻長時間的煎熬。因為破解這些謎題,需要一次又一次西西弗斯式的基礎工作。不斷地提出一個猜想,然後找尋證據去證明或者否定,然後繼續下一個問題,又或是提出另一個思路,繼續做探索和驗證。

而思路的建立或者潛在可行方案的直覺,都會牢牢建立在你對某個類或者某個文件的認知和相應定義的理解上。例如,向一個初學Android的人直接拋出PreferenceManager的概念會讓人一頭霧水。你可能會有潛在的猜測,偏好設置?僅僅是某個setting文件的管理?又或是神馬?可是為什麽在使用它的時候又會用到工廠模式?相應的edit是要去編輯神馬呢?

不,這些都只是你一廂情願的猜測。甚至,你的猜得越遠,錯得越厲害。而錯誤的起步,當然就是源自於你對PreferenceManager定義的猜測。這是代碼世界中更加tricky的一個坑。不同於數學證明,由於數學領域的大多數術語都是稀奇古怪的或者生僻從未聽說過,在閱讀證明時,我們反而能更加警覺、仔細地去按圖索驥,找到定義最原始的出處,去確保自己的理解無誤。而在代碼的世界裏,由於命名需要可理解、通俗易懂,大多數的命名都會找尋生活中常見的詞語。而這裏,便是入坑的開始。

如果你對人文歷史有足夠充分的研究,你便會知道日常用語的多意性以及它所帶來的後果的慘痛性。當在代碼中充斥著各種似曾相識的名字時,你便會被這個“名”(名字)所迷惑。你會下意識地根據自身的經驗去猜測它的作用和所指。雖然好的代碼規範總是要求對命名要做到避免模糊和誤用的特性,但你憑什麽知道你閱讀的這份代碼遵從了它呢?

所以,真正正確的打開方式是,你必須確保你對其中的每一個術語都真正做到了知道它的原始定義所在。你必須要有可信程度極高的證據來支持你對定義的理解:最可信的莫過於定義這個術語的源代碼,其次是它的官方API文檔說明。你不可以用自己的歷史經驗來作為正確理解的論據。相反,你需要把這份艱辛的苦力做好、做紮實,為每一個術語找到最原始的依據,然後根據這個依據來確保自己的理解正確。

有了“術語考據”這一步的堅實基礎,之後的代碼閱讀就會相對輕松。例如在上面的例子中,如果你查詢過Android文檔,查看過StackOverflow上的解析,你便會發現這個PreferenceManager是特有的存儲臨時信息(方便App內部溝通共享)的方式。那麽,之後運用工廠模式的理由就變得顯而易見了。所以,和數學證明的研讀極其類似,找準了定義、吃準了最原始的“名”背後的“道”(真正所指),就能夠為之後的過程起到四兩撥千斤的巨大作用。

當然,這一過程無疑是費時費力的。往往,一個下午的嘗試也就只能換取一行代碼的正確理解。而身處這一耗盡心力的過程中,你絕望地感覺到,似乎所有的工作都毫無進展。然而,如同對數學證明的學習,這也正是其價值所在。沒有多少人能夠繼續這種耗時耗力的孤獨堅持,而這每一步的微小進展,其背後都有難以估量的時間與大量嘗試的累積。所以在這一刻,閱讀者需要在心裏樹立起毫無理由的自信心,讓世界為自己去停止,讓他人的期望在此刻消失。此時此刻,只有代碼的破解與思維的運轉。

如此耐心勞作,方能習得最精妙的技術,最堅實的設計。


如果你喜歡我的文章或分享,請長按下面的二維碼關註我的微信公眾號,謝謝!

技術分享

拿什麽心情來閱讀我的代碼(程序員的必備心理技能)