真的有必要去学习源码吗?

如果你只想成为一个初级工程师,是完全没有必要研究任何框架或者语言本身的源码的。但是如果你想在IT领域有一定的成就,那源码学习是你一条必经之路。

我见过不少初级工程师,开发出来的程序逻辑上没有问题,但是性能低下。程序上线就承受巨大压力,甚至引发性能故障,严重影响个人业绩。

归根到底,还是在底层原理上吃亏。不管学习什么技术,浅尝辄止肯定是不行的。今天就通过一个实际的问题来给大家讲下查看源码的好处。

想必大家在写程序的时候,一定会报很多的错误,有些错误是逻辑上的问题,有些是传参类型的错误。还有一种就是我程序可以运行,但是又不知道为什么可以运行。等等这类问题,其实都是可以通过查看框架或者语言本身的源码来解释的。

大家如果用过scrapy_redis的小伙伴,都知道我想完成分布式的爬虫,一定要在配置文件中设置Redis的连接。设置的方式有两种,如下面代码所示

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

但是有没有小伙伴想过,如果不设置的话可不可以。抱着试一试的态度,来进行尝试。当我把爬虫运行起来之后,竟然也把相应的键值保存进去了。不相信的小伙伴可以自己去试试。

这令我很是费解,所以我决定去看看scrapy_redis源码来一探究竟。

可以看到scrapy_redis的源码其实也并没有太多,所以查看起来还是比较方便的。从名字上也能大概猜到,connection.py是连接Redis的。

connection.py文件,通过查看注释,大概能了解到这个函数的作用。通过get_client方法,并使用默认的参数来返回一个Redis客户端。

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,扩展我们的项目需求

通过学习源码,学习开源大牛们是如何运用设计模式的,然后运用到我们开发的项目中,使我们的项目的模块更易于扩展;通过学习源码,我们能编码更高效。为什么呢?如果我们对某个开源项目源码很熟悉,那么我们就可以对这个项目的源码信手拈来应用到自己项目中,不是么?总之学习源码好处多多,这也是成为大牛们的必经之路吧,只有学习和借鉴别人优秀的作品,自己才能造出更优秀的作品。

最后送给大家一句话,你知道的越多,你不知道的就越多。

你可能感兴趣的:(python,程序员)