那些開源軟體真的會有人去閱讀嗎?
感覺應該絕大多數的軟體都沒有人去閱讀吧?如果是,那開不開源豈不是並沒有什麼關係了嗎?
舉個例子,我一個同學這學期的課程大作業是完成Realtime的ROS核心構建,那麼他要怎麼做呢?
閱讀ros核心源代碼,閱讀Linux Kernel,閱讀RT Linux代碼。。。然後編譯一個rtlinux並且使用rtt介面去重寫一部分ros的核心代碼。再舉個例子,之前學iOS的時候在做webview/webkit到native code 的reflection,我怎麼知道什麼情況下可以做什麼情況下該用什麼trick呢?為什麼傳了一個struct過去就直接爆了呢。
我就去下載了一份webkit的源代碼,讀了一下解釋器以及native介面部分,馬上就明了了webkit的reflection局限性。在這個過程中我又順便學習了一下webkit/以及objective c的動態性的本質,馬上就理解了obj c的局限性。現在這樣雖然我的純oc寫的行數不超過五百行,但是可能還算了解oc的了。然後因為讀了一部分的js解釋器內容,又加深了對於js的內存管理等的理解,比看書不知道快到哪裡去了。
如果我想的話,可以直接擴展reflection的c++ code ,重寫一個webkit已達到我的reflection需求。再舉個例子,最近在搞anroid,發現android的姿態儀最近優化的很不錯(之前是裸的重力+磁場確定姿態),於是馬上下載了一份android源代碼,花了十分鐘定位到姿態儀的fusion.h文件,一看class的成員函數
Fusion();
void init(); void handleGyro(const vec3_t w, float dT); status_t handleAcc(const vec3_t a); status_t handleMag(const vec3_t m);vec4_t getAttitude() const;
vec3_t getBias() const; mat33_t getRotationMatrix() const; bool hasEstimate() const;
就知道android用的是卡爾曼濾波了,哎呦不錯這個好的感覺。
至於之前最痛苦的一段經歷是讀pixhawk的源代碼,讀完之後大概就知道一個合格的飛控是怎麼回事了。
對於一個初步接觸某個領域的人而言,讀這個領域的源代碼是最好的快速入門的方法,學51的時候就下一個minium rtos的代碼,一讀就理解pc指針啊,寄存器啊,觸發器中斷這些東西是什麼鬼了, 比如學遊戲編程我就去讀一下unreal引擎的渲染部分(當然這是因為我想擴展功能),搞飛控的時候我就抓開源飛控來讀,想學元編程了直接去念解釋器的代碼,去年寫markdown時候覺得不爽就下個markdown的源代碼自己改幾行。快速定位到核心部分只需要一下午你就成為(中文社區)這個的小專家了。這樣很快能理解框架設計者的思維,很快就可以think in it.還有學習源代碼可以很大程度提高自己的工程設計水平。。。
另外是說調試,這個確實,稍微做的深入點都會接近東西的一些坑(像我這種不肯老實堆代碼喜歡各種trick的特別是),如果是java反編譯調試其實跟讀源代碼沒有區別(昨天就是考debug一個東西理解了android的思路),如果是c/c++ code,沒有源代碼調試真的會死人的(看不懂asm)。
比如我下一步是折騰在android平台上clojure和js協作的reflection,work with html5,可能需要自己寫一個js 2 clojure的解釋器,那麼最好的辦法其實是去讀一下clojure的代碼。另外就是想做android的webview 中html的cavans標籤加速渲染,查了半天沒有太好的辦法,搞不好又得去改源碼了。其實吧,說閱讀什麼的有點過於文藝了……我一般是直接抄的
工作上,大項目看過 postfix、部分 Android、Apache、部分 Java 標準庫、部分 Tomcat;個人興趣看過 Linux Kernel、XFree86 等。
拿到源碼除了可以學習、修改,還有一個很重要的用途是調試。雖然沒源碼有符號信息也能調,不過有源碼可方便太多了。開源軟體是理論入門的最便宜的實踐。不開源的軟體,如果也能讀到源代碼,你會發現更加精妙的世界。
實習在做一個物聯網智能卡項目,目前的主要工作就是閱讀 node.js 和 openssl 的源代碼,而且要修改 node.js 的源碼來適配公司的需求。快看吐了。偶爾碰巧理解代碼的思想的話會很開心
有時做可行性分析也會看源碼來了解細節。
有問題的話 github 上作者大神會很耐心地解答,著實受寵若驚也許有這麼個作用:當有人抄襲你的代碼或者思路時,你至少有個證據,證明這份代碼是你在何時何地開源發布的。換句話說,開源是一種廉價的方便的對著作權的宣告。
當然同時:你的程序只有開源才能免費的上傳到 github。所以如果你選擇 github 作為代碼託管而不是選擇 bitbucket,那麼你必須開源。源碼不是面向所有人 關注的人自然要讀 我最近幫助一個程序員解決問題 就是讀一個github只有一百多star的庫 我把它徹底閱讀完了 才解決問題
拿來抄的軟體有必要讀一讀。
只是拿來用的開源軟體,你他媽能好好跑就行了,別坑我!但Linux上面坑真太多了,可能最後逼得自己寫。
因為一般人都是在IDE里閱讀,哪裡不懂,點進去就可以看實現細節
推薦閱讀:
※開源軟體的開發是如何進行的?
※為什麼很多開源軟體都用 C,而不是 C++ 寫成?
※軟體開源後,能否有開源和商業化兩種授權?
※如何看待國服我的世界裡修改了 forge卻 不開源,無視 LGPL 協議這一行為?