閱讀開源項目代碼的意義有哪些?
以及各個領域的優秀開源項目。
若是與自己工作相關的開源代碼,那麼閱讀的話,會很有效的幫助到自己解決一些問題,知其然才能用的好。
若是與自己工作無關的開源代碼,很多時候是出於一種興趣去看,也希望能學習到一些好的設計與好的代碼寫法,從而可以讓自己以後寫代碼也如此。要知道,開源出來的代碼,大多數都還是能看的,更不用說著名的了。程序員都還是比較好面子的,不能看,寫的丑,一般也不好意思開源出來。
當然,很多時候閱讀開源代碼,也是因為上了一天的班了,想放鬆一下。看到比較好的,然後作者也留下了聯繫方式,若他也比較熱心的話,願意一起聊聊項目的話,有可能也會多一個朋友。當然,看到的代碼若有問題,還可以交一兩個Patch,也算是功德一件。如果你大致讀過內核里網路協議棧的代碼,就會明白用戶態網路編程中某些舉動(優化by信仰)是無用功。
跟你讀書一樣啊, 要優美寫作和談笑風生的前提是博覽群書
很多人都會編程, 但是實現能力各有千秋
實現能力是什麼?告訴你紅黑樹原理, 讓你實現一個map
告訴你幀同步原理, 讓你實現一個demo告訴你tcp粘包原理, 讓你處理粘包不參考前輩代碼, 怎麼寫的出來?這裡參考絕對不是抄. 或者說, 前幾次可以抄, 抄熟了就是自己的, 爛熟於心我覺得主要是學習優秀代碼的寫作技巧吧:-D
曾經看過 @lepture 開源的 june ,裡面有一段用 __call__ 來實現許可權控制的代碼,非常漂亮,當時特地摘錄如下:
在上面看到了有一個裝飾器 @require_user,這是對用戶進行的許可權管理。實際上試著想一下,一名用戶可能會有多個角色,如果對這些角色每個都定義一個裝飾器,就會有太多的重複了。在這種情況下我們來看看作者是怎麼做的:
# 定義了一個基本類
class require_role(object):
roles = {
"spam": 0,
"new": 1,
"user": 2,
"staff": 3,
"admin": 4,
}
def __init__(self, role):
self.role = role
def __call__(self, method):
@functools.wraps(method)
def wrapper(*args, **kwargs):
if not g.user:
url = url_for("account.signin")
if "?" not in url:
url += "?next=" + request.url
return redirect(url)
if self.role is None:
return method(*args, **kwargs)
if g.user.id == 1:
# this is superuser, have no limitation
return method(*args, **kwargs)
if g.user.role == "new":
flash(_("Please verify your email"), "warn")
return redirect(url_for("account.setting"))
if g.user.role == "spam":
flash(_("You are a spammer"), "error")
return redirect("/")
if self.roles[g.user.role] &< self.roles[self.role]:
return abort(403)
return method(*args, **kwargs)
return wrapper
# 之後定義不同的許可權限制
require_login = require_role(None)
require_user = require_role("user")
require_staff = require_role("staff")
require_admin = require_role("admin")
看優秀的開源 Python 代碼就像閱讀一首詩,doc string 和 _prefix 的使用,utils 的抽離以及 User-Defined Behaviour 的封裝,elegant idiomatic Pythonic,work like a charm^_^
對了, @7sDream 寫的 zhihu-oauth 代碼質量也很好哦,裝飾器 @Decorator 那裡做的非常漂亮,竟然被點名了23333~~
一定要說看源碼還有什麼作用,那就是增強你的信心(大霧......), requests 在 github 上列出的第一個版本 v0.2.3 里有一個文件(core.py)是用 tab 作為 whitespace 的,,,這麼厲害的作品一開始也寫的這麼渣,感覺自己現在寫的不好也沒有什麼啊(噗)
最近在寫一個從 Kafka 向 ES 實時處理數據的中間件,就應用了之前看過的一些技巧(用 tricky 來形容可能會更合適些⊙﹏⊙b)
---
最近因為要用 Kafka,所以也在試著看 Kafka 的代碼,從 Kafka Design 開始去看,但並發和 Synchronized 這裡看著還是有些費力。Scala 語法的複雜度即使是以 Better Java 的角度來看也一點都不低。
---
而 Java ,因為寫並發程序的經驗之前就主要是在 implements Runnable 後用 Executor submit 這個水平,所以在看 Java 開源代碼還是有些吃力的,很多核心思想就淹沒在了繁瑣的 JavaBean 的 setter/getter 方法里,果然是適合工程化開發的語言,大神評價 Java 是 "verbose yet obvious",誠不我欺也。最近正在看阿里出品的 JStorm 代碼,希望能在看完之後對並發和 Java 開發有更好的了解。
想要知其然並知其所以然
跟作家看書的意義一樣。。。
閱讀開源代碼的意義:自己公司的框架可以借(chao)鑒(xi)優秀的開源代碼
1.培養興趣愛好,想在某個領域入門,看優秀開源項目然後實現甚至超越他的效果肯定比枯燥的看論文有效,入門看論文可能會把僅有的興趣磨掉。2.學習一些技巧,很多優秀的開源項目不但效果很好,而且還把代碼優雅的寫成了藝術。3.非常有效的提升能力的方法,深入研究一個優秀開源項目勝過讀多篇優秀論文。4.寫出優秀開源項目的前提,感覺單純看論文寫出優秀開源項目太不實際。
避免閉門造車,給程序員省去很多很多精力,給商業公司帶來不可估量的經濟效益。很多次,我看代碼注釋中有這麼一句聲明「Feel free to use,copy,reference,or modify this program in any way」的時候有一種熱淚盈眶的感覺。感謝前輩們的無私貢獻。給我的感動,好像好像妹子含情脈脈地看著你,把自己放心地交給你。
閉源代碼,想閱讀也看不到。。。
閱讀源碼可以清楚的知道作者是怎麼實現,也就是how,而至於為什麼選擇這種方式實習,也就是why,很值得我們思索。
谷歌的兩大開源庫,chrome庫及android庫,包含了計算機系統相關的絕大多數功能,應該充分利用,糖果雲提供了這兩個庫的源碼檢索:http://www.tgyun.cc/lib/chrome,http://www.tgyun.cc/lib/android-7.1
吸收別人的設計思想,避免閉門造車,這對有一定經驗的人來說,是性價比最高的提高途徑之一學習新的技術
哪個畫家不是從臨摹和瞎畫開始?
讓自己知道很多不知道的想法和實現方式,同時合作者的交流能夠促進自身思維進化
離他們更近一些
對老程序員就不知道了.......
不過對於我這種初級想 往中級爬的人來說,閱讀開源代碼是有很多好處的!
- 學習自己沒有的知識
- 學習他人的寫法,有助於自己代碼質量的提高
- 多知道一些技術的用法,而且項目已在,相當於直接有個demo,沒事就自己造一造...
說的簡單點吧,開始入門的時候,MVC 甚至只有VC了, 一個C里全是代碼,開始寫起來是挺爽,一旦後期維護,自己都要炸了......
然後沒事看看別人寫的,誒?發現他的代碼好簡潔,分工很明確... 沒事就模仿寫一寫......
還有最重要一點 就是,,,自己會了.以後自己也可以寫點其他的東西,然後也試試開源試試? 僅僅為了裝逼用?....1.理解該項目的實現原理,避免在使用時遇到報錯或不work的情況手足無措。2.學習該項目的組織和設計。提高自己組織的能力。3.開腦洞,這個功能還可以這樣寫(??ω??)?4.just for fun
閱讀開源代碼的時候,我才明白APUE那些經典的書是有多牛逼,平時掃一眼就過了,結合牛人的代碼,有更深的領悟。
推薦閱讀:
※有哪些有意思的,很cool的開源項目 ?
※Intel 為什麼會成為 Linux 內核最大的貢獻者?
※如何評價今天發布的 Cyanogen OS 12?
※一千行以上,五千行以下有哪些值得學習的開源項目?
※如果Windows XP系統微軟不提供更新服務了但決定成為自由軟體,現在會怎麼樣?