工作4年多才学会怎么去读源码,可悲么?

麦克斯 发布于 01/07 15:44
阅读 6K+
收藏 11

最近慢慢的尝试去看spring的源码,学习spring,以前都是只会用就行了,但是越是到后面,发现只是懂怎么用还不够,在面试的时候也会经常被问到一些开源框架的源码问题,即使在网上各种百度,当时也能回答出来了也是很皮毛,不痛不痒的回答。想问下各位是怎么去读源码的,这篇 spring加载applicationContext并注册bean过程是本人尝试读懂spring源码的第一篇笔记,欢迎指导,是否有什么错误理解?后续还会继续对spring的依赖注入,scopes、AOP等进行学习。。

加载中
6
新de代码
新de代码

    国内的信息产业环境不成熟,举个最明显的例子,目前编程领域的从业人员超过半数都是通过培训机构出来的,甚至那些计算机专业毕业的学生,也不得不通过几个月的技能培训,才能找到工作,那我上了四年的计算机专业学了有什么用?通过剖析计算机从业人员接受的基础教育结构,市场环境,还有企业需求,最终得到的结论是,一个标准 IT 企业需要具备的条件如下:

1. 计算机底层研发能力

2. 企业应用编程

3. 推向市场的产品

 

相对于这三项对位的计算机从业人员团队需要的技能如下:

1. 计算机底层知识

2. 企业应用逻辑编程

3. 产品定位与规划能力

 

从业人员的个人能力获得途径如下:

1. 学校的信息技术基础教育(底层知识)

2.培训机构 (编程能力)

3. 企业工作经验(产品能力,也就是项目经验)

 

    综合国内基础教育结构,市场环境,还有企业需求,可以看出,培训机构是国内信息技术教育缺失的产物,简单来说就是学校只教基础,而企业需要高层编程能力,所以培训机构就是在这样的环境下产生的。一句话总结本质原因就是:

产学脱钩,导致学校人才供给无法满足市场企业需求。

 

    说明了原因,再来看另一个问题,写代码的都知道有 “一致性” 的概念,大了说有架构一致性,小了说有代码风格一致性,看前人的代码看着头疼就是因为你和写代码的人设计,代码风格都不一致,所以会有冲突。

 

    那么对于我们从小学到大学的整个教育过程这个大项目来说,其实存在巨大的不一致性,举个例子,你的小学老师教了你们六年,对学生的能力,特点是最熟悉的,可是升入初中之后,换了初中老师,这个过程中唯一留下能让初中老师用的 “交接文档” 就是以前的分数,这样的情况下,因材施教,因地制宜,从何而来?非要一对一的提高成绩的话,那么之前小学老师做的工作,初中老师要重复做一遍,才能对学生充分了解,并且初中老师只有三年时间,还没算上中间换老师的情况。过了初中之后,同样的情况会在高中,大学老师的身上重复发生,大家都在重复造轮子,就是因为一个求学者整个十几年的教育流程中的设计和把控是有缺陷的。

 

    这还是在学校教育项目内的问题,那么像毕业之后参加培训这种项目外的情况如何呢?这个影响就严重了,在没有人引导和告知的情况下,培训生普遍不知道培训机构的本质是大学教育过程的延伸,几乎所有的培训生都是觉得,培训就是用来找工作用的,潜在逻辑是,参加培训,培训机构包分配,然后我就能找到工作了。这种情况下,在培训机构学到的东西与学校知识的对接,不一致性就极其巨大了。

 

    通过以上分析,终于可以说回为什么工作四年才会看代码这个问题。从培训出来找到工作开始,之前分析的1,2,3条件中的2,也就是编程能力,已经在编程机构初步获得了,3条件,也就是企业产品需求,需要在长时间的工作当中去获得相关的感觉或者产品意识。当工作个五六年,随着自身职称的提高,遇到的问题也越来越难,面对企业的高并发,高访问这些问题,已经不能用培训机构获得的 CURD 来解决了,这个时候学校底层知识才迎来了应用的机会。这个时候,才会回顾以前的职业生涯,总结经验,然后把学校的底层知识捡起来,去解决 CURD 解决不了的难题。这个时候,才懂得了代码的深层意义。

 

    可以看出,理想的情况应该是,大学坚实的底层技术,配合中间层的编程能力,然后获得高层的企业工作能力,这个良好的架构设计最终因为现实原因割裂开了。底层是学了,但是没有用武之地,学生毕业之后没有在学校获得编程能力,面临的是 “断崖式的成长”,是的,本来应该是平缓过度到社会,结果却是断崖式的,中间缺失的一部分,将在生活中,通过鼻青脸肿式的棍棒教育,在社会这所大学里获得。

 

    大家读到这里,是不是觉得生活黑暗,要怨天尤人,并且抱怨为什么有这样的教育设计?这里要说一下的是,先有鸡还是先有蛋这个问题,是一个难题,好的学生是好教师教出来的,但是好的教师是哪里来的?如果没有好老师,那么教出来的学生是什么样的?将来这些学生成了老师又会是什么样的?这样岂不是恶性循环?要知道,教育问题,在世界上都是个及难解决的问题。并且教育问题不是靠个人能够解决的问题,这需要国家,社会,企业,家庭,教师,学生等等一起努力去改革,家长简单的把学生扔给学校,是没有办法100%培养出高素质人才的。我国目前还只是社会主义初级阶段,国家的重中之重是经济建设,有了钱,才能搞教育,除了教育,还有医疗,国防,还要抵御西方的恶意抵制。用钱的地方那么多,钱包却那么小,所以要辩证客观的看问题。一个企业在资金有限的情况下还会有所权衡,更不用说一个16亿人的大企业,我们所要做的,就是不灰心,充满希望的继续乐观生活,只有国家强盛,才有我们生活质量的进一步提高。

 

最后说一下怎么避免工作很久之后才发现底层知识的缺失吧,不废话,直接给出如下:

1. 未雨绸缪,不要太功利主义,不要觉得之后能赚钱的知识才是要学的知识,平时多看些编译原理,数学方面的知识,不是计算机专业的同学可以去搜一下国内外计算机专业名校的课程安排,然后去慢慢学习

 

2.多写代码,没有时间看底层,就反向去学底层,以代码为手段,遇到问题就深挖原理,在编程中深入底层,熟悉原理

 

3.培养全栈思维,全栈不是一个岗位,而是一种思维,可以用一种系统的观点让你重新认识自己目前的工作与岗位,获得全栈的简单方式就是多用新技术,然后横向对比,最终回到自己目前所用的语言,也就是跳出语言学语言

 

4.寻求大神帮助,大神的经历与能力都是经过实践验证的,大神的能力提升方法也一定是高效率的,通过大神的提点,能够避免许多走弯路的情况。

 

5.多读人文历史类书籍,在团队中工作,没有好的情商,好的人文情怀,同事关系一定会出问题,技术只是实现产品的手段,产品之外还有广阔的知识领域与人生乐趣,不要太封闭自己,多读好的小说和书籍,你会发现一片不一样的天地。

 

5.最后一点,对于以后想要成为大神的同学也是最重要的一点:警惕碎片化方式。不管是生活还是工作,大众的生活习惯已经趋向于碎片化,这是社会高速发展的结果,而编程需要的核心能力却是与碎片化相对的深度思维方式,不要小看碎片化,长时间在这种方式下生活,会丧失大脑的深度思考能力。是不是看超过5分钟以上的长文会有头晕不适的情况,是不是短视频app看的停不下来,有多久没有读一本超过300页的长篇书籍了?适度的娱乐是没问题的,但长时间如此的生活方式,会使大脑处理信息的能力退化。未来 AI 浪潮是大势所趋,国家也制定了相关的人工智能战略,而 AI 时代的编程从业者,需要的就是深度的,长时间的思考能力。 你可以不学底层,你可以继续靠 CURD 就能月入过万,但寒冬来临时,如果被裁了,那就不能怨社会了。如今都在谈论现在的寒冬有多可怕,又有多少人看到 AI 领域百万难求一人的情况呢。这一冷一热的两重天气,只有系统化思维的人才能看到原因,也只有这样的人,将来的路才会越走越宽。寒冬不可怕,在寒冬里没有生存能力,才是最可怕的。

 

以上言语,写出来与君共勉。年底了,我在这里提前给大家拜个年,祝大家在“寒冬”里,能够度过一个幸福安稳的新年 ~~

冰霜之卅ya
冰霜之卅ya
回复 @MZHS : 对,可能会忘记。 但是再次拿起来就很快。
HeyS1
HeyS1
回复 @MZHS : 确实是这样,比如公司用架构是单机,去学那些分布式微服务,学完搞个demo就完事了。并不会经常使用,渐渐就忘记了
MZHS
MZHS
我发现东西不用就会忘记,像初中学的sin cos这些东西早就都还给老师了。但是我有这种信心,就是只要你告诉我公式,我就可以做出初中的题,为什么?因为学了半天各种公式,做了海量的题,得到的是解决问题的能力,遇到问题后的思考方式。整天做CRUD的人学了其他的技术,如果工作中用不到,想立刻上手出东西是不太现实的,感觉要解决这种问题得趁学完后的热乎劲跳槽到高新技术公司从搬砖开始干起。
2
我叫金正恩
我叫金正恩

换个更有意义的项目看吧,就围绕着Map<String,Method>的框架,没必要花时间。

2
喜之郎
喜之郎

spring源码真没什么好读的,重要的是理解他的理念,这样能帮助你更好的使用它。就像你坐完飞机,你也不用搞清飞机是怎么造的一样。但是你得知道飞机里面不能吸烟,安全带怎么带等问题。

黑狗
黑狗
你要真的去读了 你才知道 spring里面的实现写得真不好...
2
双城记
双城记

可不可悲跟你有没有读源码没关系。走错学习方法的路,花大把时间读了一大段对本身技能没有任何长进的源码还天真的认为这是学习才是悲哀。

花一天读一堆源码,再花一天排版画图写文章,虽然你看懂了,但是这些东西依然不是你的,这跟以前上学填鸭教育没区别。

还不如把时间花再如何自己如何实现类似的Spring的框架上,再参照spring的实现比较异同。

0
hitank1
hitank1

悟已往之不谏,知来者之可追

麦克斯
麦克斯
说的在理,不积跬步无以至千里啊
0
isscy
isscy

请问 学源码 看的什么书?

麦克斯
麦克斯
其实,我也没看书,硬着头皮一步步的debug源码,有不懂的地方就网上查下,毕竟肯定有很多大神都会去深入研究一些框架的源码的
0
Yot2
Yot2

你的意思是不读源码,就不能称之为大神?

你一样可以写源码让别人读。

麦克斯
麦克斯
nono,只是觉得读源码应该是一种必备技能。哈哈,毕竟面试当中有很多喜欢问源码的东西; 当然能写出源码给人读的人就已经是大神了。 读源码只是一种学习的途径,就像看书一样,吸取知识转换成有用的营养成分供自己进步罢了。
0
trivia
trivia

硬着头皮读。

先读懂流程。

然后去看设计模式,框架里大多数都是设计模式的体现。

思考框架是如何利用这些设计模式的。

思考Factory,Listener, Builder, Chain, Callable,Loader,Module这些概念,能不能将自己以前写过的过程式代码利用设计模式重构?

重构的时候思考哪些功能是拓展性质的,可以预留拓展点,以怎样的形式拓展?(换句话说,让别人用你的东西,还要用的简单和舒服,通过扩展增强)

 

饮龙井
饮龙井
框架的源码大多抽象话到极致,读起来如果没有注释不见得能读懂,你以为是读业务代码呢啊
麦克斯
麦克斯
哈哈我现在就是跟你说的这样去看的
0
fengidri
fengidri

不晚, 有了使用经验再看源码, 这样才能知道, 为什么这样设计. 很多人一上手就看源码. 总感觉这样高大上, 但看懂了和理解是完全两回事. 没有使用经验, 真正理解是很困难的. 

KL博客
KL博客
回复 @incess : 层次不一样吧,懂了就是自己懂了而已,很难把这个和别人说清楚,理解的话,就可以按自己的理解和别人说清楚
L
Luck__St
回复 @incess : 看懂就是知道怎么回事了,理解感觉更注重于应用于实践。
incess
incess
看懂和理解不一样嘛...... 解释一下哪里不一样.我个人觉得你说的这是一个意思
0
f
freezingsky

什么时候改变不晚? 当下!

返回顶部
顶部