真的有必要去學習源碼嗎?

若是你只想成爲一個初級工程師,是徹底沒有必要研究任何框架或者語言自己的源碼的。可是若是你想在IT領域有必定的成就,那源碼學習是你一條必經之路。面試

我見過很多初級工程師,開發出來的程序邏輯上沒有問題,可是性能低下。程序上線就承受巨大壓力,甚至引起性能故障,嚴重影響我的業績。redis

歸根到底,仍是在底層原理上吃虧。無論學習什麼技術,淺嘗輒止確定是不行的。今天就經過一個實際的問題來給你們講下查看源碼的好處。編程

想必你們在寫程序的時候,必定會報不少的錯誤,有些錯誤是邏輯上的問題,有些是傳參類型的錯誤。還有一種就是我程序能夠運行,可是又不知道爲何能夠運行。等等這類問題,其實都是能夠經過查看框架或者語言自己的源碼來解釋的。設計模式

你們若是用過scrapy_redis的小夥伴,都知道我想完成分佈式的爬蟲,必定要在配置文件中設置Redis的鏈接。設置的方式有兩種,以下面代碼所示框架

REDIS_URL = "redis://127.0.0.1:6379"
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379

可是有沒有小夥伴想過,若是不設置的話可不能夠。抱着試一試的態度,來進行嘗試。當我把爬蟲運行起來以後,居然也把相應的鍵值保存進去了。不相信的小夥伴能夠本身去試試。scrapy

這令我非常費解,因此我決定去看看scrapy_redis源碼來一探究竟。socket

能夠看到scrapy_redis的源碼其實也並無太多,因此查看起來仍是比較方便的。從名字上也能大概猜到,connection.py是鏈接Redis的。分佈式

connection.py文件,經過查看註釋,大概能瞭解到這個函數的做用。經過get_client方法,並使用默認的參數來返回一個Redis客戶端。ide

def get_redis_from_settings(settings):
 """Returns a redis client instance from given Scrapy settings object.
 This function uses ``get_client`` to instantiate the client and uses
 ``defaults.REDIS_PARAMS`` global as defaults values for the parameters. You
 can override them using the ``REDIS_PARAMS`` setting.

接下來去查看下get_client方法,這個方法作了一個判斷,判斷你是經過那種方式傳的Redis配置。這其中有一個defaults.REDIS_CLS,這就是我們解開謎團的關鍵了。函數

def get_redis(**kwargs):
 """Returns a redis client instance.
 Parameters
 ----------
 redis_cls : class, optional
 Defaults to ``redis.StrictRedis``.
 url : str, optional
 If given, ``redis_cls.from_url`` is used to instantiate the class.
 **kwargs
 Extra parameters to be passed to the ``redis_cls`` class.
 Returns
 -------
 server
 Redis client instance.
 """
 redis_cls = kwargs.pop('redis_cls', defaults.REDIS_CLS)
 url = kwargs.pop('url', None)
 if url:
 return redis_cls.from_url(url, **kwargs)
 else:
 return redis_cls(**kwargs)

經過查看defaults.py文件,能夠找到REDIS_CLS。

REDIS_CLS = redis.StrictRedis

在去查看StrictRedis這個類。

StrictRedis = Redis

Redis類中的__init__方法,你們能夠看到,其實就是用的本地的地址和端口,因此若是不寫的話,scrapy_redis默認會鏈接本地的Redis。至此謎團就解開了。

def __init__(self, host='localhost', port=6379,
 db=0, password=None, socket_timeout=None,
 socket_connect_timeout=None,
 socket_keepalive=None, socket_keepalive_options=None,
 connection_pool=None, unix_socket_path=None,
 encoding='utf-8', encoding_errors='strict',
 charset=None, errors=None,
 decode_responses=False, retry_on_timeout=False,
 ssl=False, ssl_keyfile=None, ssl_certfile=None,
 ssl_cert_reqs='required', ssl_ca_certs=None,
 ssl_check_hostname=False,
 max_connections=None, single_connection_client=False,
 health_check_interval=0, client_name=None, username=None):

相信你們看到這裏,大概能明白了源碼能夠幫助咱們解決開發中或者學習中的一些疑問。那你們必定還會有疑問,我真的有必要花大量的時間去學習源碼嗎?或者說花大量時間去學習源碼真的有必要嗎?

我給你們總結了幾點緣由,也歡迎你們來補充。

首先編程是個理工科的東西,咱們去看一些優秀框架的源碼,去研究一些底層的原理,能夠更好的幫助咱們理解。閉門造車是造不出好車的,一樣天天只停留在CURD也不能提升你的編程能力,最可能是你的CURD愈來愈熟練。

第二點我以爲大多數大廠,如今面試的時候愈來愈多的會問到底層,會問到源碼,好比阿里面試就會問到不少源碼的實現機制,以及你作過的項目。因此有時候爲了面試不少人也會去學習源碼,可是這種以面試爲驅動的學習,每每達不到很好的效果,基本面試後就會扔到一邊。

學習源碼,咱們能獲得什麼?

既然咱們花費了那麼多時間去學習源碼,去研究源碼?咱們的收益有多少,咱們究竟能獲得多少回到回報呢?能夠先確定的回答,固然有很大的回報。前面也說過,學習開源框架源碼能幫助咱們解決項目遇到的bug,擴展咱們的項目需求

經過學習源碼,學習開源大牛們是如何運用設計模式的,而後運用到咱們開發的項目中,使咱們的項目的模塊更易於擴展;經過學習源碼,咱們能編碼更高效。爲何呢?若是咱們對某個開源項目源碼很熟悉,那麼咱們就能夠對這個項目的源碼信手拈來應用到本身項目中,不是麼?總之學習源碼好處多多,這也是成爲大牛們的必經之路吧,只有學習和借鑑別人優秀的做品,本身才能造出更優秀的做品。

最後送給你們一句話,你知道的越多,你不知道的就越多。

相關文章
相關標籤/搜索