閱讀他人的程式碼(6)閱讀的樂趣:透過程式碼認識作者
|
|
<!-- NO MAIN PHOTO -->
即便每個人的寫作模式多半受到他人的影響,程式人通常還是會融合多種風格,而成為自己獨有的特色,如果你知道作者程式設計的偏好,閱讀他的程式碼就更得心應手。
|
|
閱讀程式碼時,多半會採取由上而下、抽絲剝繭的方式。透過記錄層層展開的樹狀結構,程式人可以逐步地建立起對系統的架構觀,而且可以依照需要的粒度(Granularity),決定展開的層次及精緻程度。
建立架構觀點的認識是最重要的事情。雖然這一系列的文章前提為「閱讀他人的程式碼」,但我們真正想做的工作,並不在於徹底地詳讀每一行程式碼的細節,而是
想要透過重點式的程式碼「摘讀」,達到對系統所需程度的了解。每個人在閱讀程式碼的動機不盡相同,需要了解的程度也就有深淺的分別。只有極為少數的情況
下,你才會需要細讀每一行程式碼。
閱讀程式碼是新時代程式人必備的重要技能
這一系列的文章至此已近尾聲,回顧曾探討的主題,我們首先研究了閱讀程式碼的動機。尤其在開放原始碼的風氣如此之盛的情況下,妥善利用開放原始碼
所提供的資源,不僅能夠更快學習到新的技術,同時在原始碼版權合適時,還可以直接利用現成的程式碼,大幅地提高開發階段的生產力。所以,閱讀程式碼儼然成
為了新時代程式人必備的重要技能之一。
接著,我們提到了閱讀程式碼前的必要準備,包括了對程式語言、命名慣例的了解等等。在此之後,我們反覆提起了「由上而下」的閱讀方向的重要性。
由上而下的閱讀方式,是因為我們重視架構更勝於細節。從最外層的架構逐一向內探索,每往內探索一層,我們了解系統的粒度就增加了一個等級。當你識
別出系統所用的架構時,便能夠輕易了解在這個架構下會有的角色,以及它們之間的動態及靜態的關係。如此一來,許多資訊便不言可喻,毋需額外花費力氣,便能
夠快速理解。
好的名稱能夠摘要性地點出實體的作用
追蹤原始碼時,固然可以用本來的方式,利用編輯器開啟所需的檔案,然後利用編輯器提供的機制閱讀,但是倘若能夠善用工具,閱讀程式碼的效率及品質都能大大提升。在本系列文章中,我們介紹了一些工具,或許你還可以在坊間找到其他更有用的工具。
我在這一系列的文章中,實際帶著大家閱讀、追蹤了一個名為ml_pod的開放原始碼專案。它是一個Winamp的iPod
plug-in程式。在追蹤的過程中,我們試著印證這一系列文中所提到的觀念及方法。我們採用逐漸開展的樹狀結構來記錄追蹤的過程,並藉以建立起對系統的
概觀認識。
就原始碼的閱讀來說,之前的討論涉及了工具面及技巧面。但還有一些主題不在這兩個範疇之內,例如,善用名稱賦予你的提示。名稱做為隱喻
(Metaphor)的作用很大,好的名稱能夠摘要性地點出實體的作用,例如我們看到autoDetectIpod(),自然而然能夠想像它的作用在於自
動(Auto)偵測(Detect)iPod的存在。
我們在展開樹狀結構時,有時候需要預看一層,有時卻不需要這麼做,便可得到印證。程式人都會有慣用的名稱以及組合名稱的方法,倘若能夠從名稱上理
解,便毋需鑽進細節,可以省去相當多的時間。例如,當我們看到parseIpodDb()時,便可以輕易了解它是剖析(Parse)iPod的資料庫
(DB),因此便不需要立即鑽進parseIpodDb()中查看底細。
儘管如此,能否理解程式人命名的用意,和自身的經驗以及是否了解原作者的文化背景,是息息相關的。
命名本身就是一種文化產物。不同的程式人文化,就會衍生出不同的命名文化。當你自己的經驗豐富,看過及接觸過的程式碼也多時,對於名稱的感受及聯想的能力自然會有不同。
這種感受和聯想的能力,究竟應該如何精進,很難具體描述。就我個人的經驗,多觀察不同命名體系的差異,並且嘗試歸納彼此之間的異同,有助於更快地提升對名稱的感受及聯想力。
轉換立場,理解作者的思考方式
除了工具及技巧之外,「想要閱讀程式碼,得先試著閱讀寫這個程式碼的程式人的心。」這句話說來十分抽象,或許也令人難以理解。
當你在閱讀一段程式碼時,或許可以試著轉換自己的立場,從旁觀者的角度轉換成為寫作者的心態,揣摩原作者的心理及處境。當你試著設身處地站在他的立場,透過他的思考方式來閱讀、追蹤他所寫下的程式碼,將會感覺更加流暢。
許多軟體專案,都不是由單一程式人所獨力完成。因此,在這樣的專案中,便有可能呈現多種不同的風格。
許多專案會由架構師決定主體的架構及運作,有既定實施的命名慣例,及程式設計需要遵守方針。在多人開發的模式下,越是好的軟體專案,越看不出某程式碼片段究竟是由誰所寫下的。
不過,有些開放原始碼的專案,往往又整合了其他開放原始碼的專案。有的時候,也很難求風格的統一,便會出現混雜的情況。好比之前提到的ml_pod專案,因為程式碼中混合了不同的來源,而呈現風格不一致的情況。
我在閱讀非自己所寫的程式碼時,會觀察原作者寫作的習慣,藉以對應到腦中所記憶的多種寫作模型。在閱讀的過程中,讀完幾行程式碼,我會試著猜想原
作者在寫下這段程式碼時的心境。他寫下這段程式碼的用意是什麼?為什麼他會採取這樣的寫法?順著原作者的思考理路閱讀,自己的思考才能更貼近對方寫作當時
的想法。
當你短暫化身為原作者時,才能更輕易的理解他所寫下的程式碼。
如果你能知道原作者的背景,程式設計時的偏好,閱讀他的程式碼,就更能得心應手了。
從程式碼著手認識作者獨有的風格,進而見賢思齊
我在閱讀別人寫下的程式碼時,我會試著猜想,原作者究竟是屬於那一種「流派」呢?每個人都有自己獨特的寫作模式,即便每個人的寫作模式多半受到他
人的影響──不論是書籍的作者、學習過程中的指導者,或一同參與專案的同儕,但每個程式人通常會融合多種風格,而成為自己獨有的風格。
物件導向的基本教義派,總是會以他心中覺得最優雅的物件導向方式來撰寫程式。而閱讀慣用、善用設計模式的程式人所寫下的程式碼時,不難推想出他會在各種常見的應用情境下,套用哪些模式。
有些時候,在閱讀之初,你並不知道原作者的習性跟喜好,甚至你也不知道他的功力。但是,在閱讀之後,你會慢慢地從一個程式人所寫下的程式碼,開始認識他。
你或許會在閱讀他人的程式碼時,發現令人拍案叫絕的技巧或設計。你也有可能在閱讀的同時,發現原作者所留下的缺失或寫作時的缺點,而暗自警惕於心。這也算是閱讀他人程式碼時的一項樂趣。
當你從視閱讀他人的程式碼為畏途,轉變成為可以從中獲取樂趣的時候,我想,你又進到了另一個境界。
作者簡介:
王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是Internet應用系統的開發。曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。
|
相关推荐
最强大的破解密码程式,能破解各种密码程式,本程序资料仅提供个人学习使用,禁止非法操作
《一键CNC程式自动串联——登峰连程式软件详解》 在现代制造业中,计算机数控(CNC)技术已经成为加工中心的重要组成部分。高效、精确的CNC编程是保证生产效率和产品质量的关键。"一键CNC程式自动串联"的登峰连程式...
### CNC程式串联方法详解 #### 一、引言 CNC(Computer Numerical Control,计算机数字控制)技术在现代制造业中扮演着极其重要的角色。它不仅提高了加工精度和效率,还极大地降低了生产成本。在实际操作过程中,...
2021年6月,Mcam9.1程式单插件的发布,成为了该领域中值得瞩目的新里程碑。这款插件不仅支持广泛的应用平台,如Excel和WPS,而且整合了诸多实用功能,成为提升CAM编程效率和质量的强有力工具。 Mcam9.1程式单插件的...
总结来说,"PIN码第8位小程式(修正)"是一个用于处理PIN码特定部分的工具,可能是为了计算或验证PIN码的第8位。这个程序可能来源于网络,使用时需注意安全问题,确保其来源可靠,并且仅在理解其功能和风险的情况下...
6. "Mastercam自动程式单"可能是一个单独的文件或程序,是Mastercam自动程式单的核心部分,用户可以通过运行这个文件来启动功能。 总的来说,Mastercam自动程式单是一个强大的工具,能够自动化处理复杂的机械加工...
对于刀具比较多的零件加工程式调机方便可以对刀具分开后处理调试程式。
X Window 程式设计入门--第一章 什么是 X Window X Window 程式设计入门--第二章 X Programming 的第一步 X Window 程式设计入门--第三章 绘图(Graphic) X Window 程式设计入门--第三章 绘图(Graphic) X Window 程...
MATLAB程式設計《入門篇》:投影片、教學影片、範例程式
对NC文件一键串联 扫码读取NC文件 适用人群 CNC现场功能 : 扫描程序单上的二维码调用程序 也可手动拖动文件1更改刀号 2手动排序 3.修改刀补4.使用仿真软件打开5.一键串联发送6.一键发送刀U盘7.M08前加 /8.支持多坐标...
在IT行业中,尤其是在制造企业的CAD/CAM领域,程式单(Program Sheet)的转化是一个重要的环节。这个主题聚焦于“程式单转化-PM转UG单格式”,涉及到如何将PM软件(可能指的是PathMachining或PowerMILL,一种常用的...
在第五版的《Windows程式开发设计指南》中,作者身违背受敬重的Windows Pioneer Award(Windows开路先锋奖)得主,依据最新版本Windows作业系统,以可靠的取材资料校定这一本经典之作一再一次深入探索了Win32程式...
Sitetalk网站及Sitetalk应用软件程式使用说明知识 Sitetalk网站及Sitetalk应用软件程式...Sitetalk网站及Sitetalk应用软件程式提供了一个功能强大且实用的社交媒体平台,用户可以通过该平台与他人进行信息交流和互动。
"Mastercam9.1自动程式单插件"是针对这款软件的一个增强工具,专为提高编程效率和自动化程度而设计。在工业生产中,程序单是数控加工中的重要文档,它包含了所有关于工件加工的详细信息,如刀具路径、切削参数、工件...
在第五版的《Windows程式开发设计指南》中,作者身违背受敬重的Windows Pioneer Award(Windows开路先锋奖)得主,依据最新版本Windows作业系统,以可靠的取材资料校定这一本经典之作一再一次深入探索了Win32程式...
### C程式码比对分类 #### 概述 本文提出了一种针对C语言程序的分类方法。该方法基于字符串比对技术,将C源代码转换为代数表达式进行处理。通过计算不同程序之间的编辑距离(Edit-Distance),可以有效地度量它们...
天遥G3.G5.G7.G9系列键鼠对码程式
标题中的“PowerMILL自动出程式单”指的是利用PowerMILL软件进行数控编程时,能够自动生成加工程序清单的功能。PowerMILL是一款由Delcam公司开发的高级 CAM(计算机辅助制造)系统,广泛应用于三维粗加工、精加工...
N11数据程式管理工具是一款专门针对数据处理和管理的应用程序,它旨在简化与数据相关的各种任务,提高工作效率。在IT行业中,数据管理是至关重要的,尤其对于大数据分析、数据库维护以及业务智能等领域。N11工具可能...
"程式舞曲程序4.1",这个听起来既技术化又富有艺术气息的名称,揭示了这样一个事实:它可能是一款将编程技术融入音乐创作过程的应用程序。 首先,我们不妨将目光转向该项目的标签"程式.1"。这个简单的标签似乎在...