如何閱讀Telegram(Desktop)的源代碼?

如題,其實是想問拿到一份C++的工程代碼,如何進行閱讀(沒有過實際項目開發經驗的大學生)。我嘗試了用EA進行逆向得出一個UML,但是這個UML無比複雜,不知道是不是我哪裡操作不對。所以請前輩們指點!


閱讀代碼是一個很大的話題。我簡單的說說吧。

閱讀代碼實際上是編寫代碼的反向過程,那麼我們首先要搞清楚編寫代碼需要做哪些工作。

編寫代碼,我們首先要確定系統的框架。這個系統是單線程的,還是多線程的?是線性處理的,還是事件觸發的?一般來說,我們會使用或者開發一個應用框架來處理這個層面的工作。在確立了框架之後,後續的代碼就需要遵循框架的限制和要求進行編寫。

確定了框架之後,我們需要編寫業務邏輯。這時候需要的是對業務需求的理解。

我們還有可能需要處理一些技術細節問題。技術細節一般會被封裝到框架開發的階段,但不排除在業務處理階段也需要處理一些技術細節。

然後你需要做容錯和異常處理。現實中的異常可能非常多,你需要對每一種異常都給出對應的處理方式。

最後可能需要做一些優化的工作,為了提升性能,有可能需要使用一些非常手段,優化通常會破壞代碼的可讀性。

在編寫代碼時,這些工作很可能不是一個人完成的。有些人負責框架,有些人負責業務邏輯,有些人負責技術細節,有些人負責優化。

而在讀代碼的時候,你看到的是一份巨細靡遺的東西,不會有人很清晰的區分出:這裡是框架,這裡是技術細節,這裡是異常處理,這裡是優化……

所以,閱讀代碼的第一步,就是要把這些部分反向拆分出來。

首先你要知道這個系統使用了什麼框架,你還得去熟悉這個框架的使用。如果使用的是通用框架,問題會簡單些,通常可以找到對應的資料。如果是專用框架,那麼你最好祈禱有對應的文檔,可以通過閱讀文檔對整體架構做理解,這樣看具體代碼會容易的多。如果沒有文檔,那麼最好能找到人問。如果這些都沒有,那就就需要你有一定的功底了。一般來說,框架層面的技術就那麼幾種,你首先要對這些技術有足夠的了解。比如網路開發,你得知道Proactor、Reactor、Actor之類的常見模型,並知道他們的工作原理。這樣你就可以通過一些粗讀來判斷一個網路框架用了哪種模型,然後你就可以知道這個框架里的各個部分在做什麼事了。然後逐步深入,就可以慢慢的分析出整個框架的完整面貌。

然後可以開始閱讀業務邏輯。這時候需要你對業務比較了解。你得知道一件事大致是怎麼做的。然後通過閱讀代碼來驗證或者否定或者完善自己的想法。在業務代碼中可能還會充斥著各種細節和異常處理。你需要把這些抽絲撥繭的分離出來。要注意的是,在現實中,尤其是一些事件回調機制的系統中,業務邏輯有可能不是一跟到底的,而是分散在好多不同的事件處理中,這種代碼你得先理清楚事件的觸發順序,然後才能理清業務。

最後是優化部分,這種如果你不是真的需要深究,一般可以跳過。通常比較好的源碼,優化都會有比較良好的封裝和注釋,不應該對正常的閱讀產生太大的阻礙。

基本上來說,如果你對一份代碼一無所知,是沒法閱讀的。閱讀的前提是你知道很多背景知識,然後自己假設自己可能會怎麼寫,然後通過閱讀代碼來驗證而已。如果有文檔的話要多加利用,對系統有整體理解後再深入進去會更容易。

當然,閱讀代碼通常也是有目的的,你是想了解整個系統的總體運作機制?還是需要去改一個bug?或者想為他增強功能?根據目的的不同,可以從不同的層次開始,直接定位到自己的需求,而無需一開始就對整個代碼了如指掌。這其實是一個很好的閱讀切入點,比泛泛而讀通常進展更快。

另外,偶爾的也會遇到一些糟糕的代碼,框架和業務糅合,到處充滿了細節,整體邏輯切割得七零八落。這樣的代碼,我一般就直接放棄閱讀了。


恰好前幾天研究了一下,主要是界面部分,感覺是,真心覺得代碼寫的很亂,風格很差。不要太費心去研究這個軟體的界面部分(僅指界面部分,網路部分未分析)。


看樣我要放棄閱讀了


重要的就是學習其思維方式和解耦方式。


看了兩個星期iOS端的源代碼,各種莫名其妙的字元串、參數,各種if、else!以為寫的非常垃圾,今日一看Mac端的源代碼,才發現更加垃圾啊!!


請問樓主:有沒有編譯成功這個項目?我在windows和linux都嘗試過了,按照其說明一步步來進行編譯,但總是會有出錯的,兩個平台都沒有編譯成功。。。如果沒有編譯成功去看源碼,很痛苦呀~~~


網路 界面 邏輯,分層分模塊;注意分多線程。


大事化小,小事化了。頑強的啃下去。


EA是啥??


推薦閱讀:

為什麼 Qt 框架不是很流行?
哪裡有QT項目視頻教程下載?
qt中界面美化使用QSS的話有什麼好的模板或者開源網站提供qss文件?
Qt如此強大為什麼就是火不起來呢?
初學QT,課本看不下去啊,請問前輩們知道網上有什麼教學視頻講得比較通俗易懂的嗎?

TAG:逆向工程 | 軟體工程 | QtC開發框架 | C | 源碼閱讀 |