做了很多年移动开发,有时候也会疲倦,当你一遍又一遍的写着业务代码的时候,你会发现自己很孤独,你就像站在了一座小岛上,岛屿周围都是迷雾,看不清周围的全貌,这个时候就该想想,我会一辈子困在岛上吗?面对浩如烟海的计算机知识,完成业务对自身技术水平提升非常有限,面对这种状况,如果你还想一辈子干下去,必然就要抱着终生学习的心态来思考。
很多人尤其是学历没那么好的,没有名校光环,有的时候会妄自菲薄,我觉得大可不必,无论你是哪所学校毕业的,你的学历如何?既成事实的事情没有办法改变,你的抱怨不能将现状变好,反过来如果你用心去学习,别去考虑以后,只要踏实做好当下,我始终相信量变会达到质变,学历不好又怎么样?不是名校又如何?王侯将相宁有种乎?世界上哪来那么多天才,大家智商都差不多,千万别把自己看低了,把别高看别人,你学习知识根本不需要通过学历去证明,现在互联网不像以前,如今的网络能找到全世界最好教师的课程,有最牛老师出的书籍,跟着他们学,不必顾及以后,不要顾及你的付出是否有回报,不要抱怨社会不公,以后的事情自然而然会是你理想的样子。
作为程序员而不是码农,我觉得内功修炼分为三大块,第一块是算法与数据结构,第二块是计算机操作系统与计算机组成原理,第三块是网络。
其中算法与数据结构是重中之重,程序员首要任务就是编程,编程能力的高低表现在你写出的程序是否具备优秀的性能,时间和空间复杂度是否满足或超出当前需求。这种能力的提升只有一个字,练!没有其他任何捷径可走。或许你会觉得算法有个毛用,如果你对自己的定位是码农确实没用,任何优秀的软件或者开源项目乃至操作系统本身底层全部都是算法与数据结构,或许你觉得算法与数据结构对眼前工作没什么帮助,公司也不要求你掌握这方便知识,但是你自己必须励志成为一个优秀的软件工程师,你的待遇,你的前途都是建立在你足够优秀的基础上,你或许会觉得国内大环境不好,都是cv战士,如果是这样,别在意别人,和你自己比,换个角度站在国家民族的高度上去看这个问题,我们国家在基础软件方面严重落后,大环境都喜欢赚快钱,没有沉淀,但是现在国家已经意识到问题的严重了,所以作为个人更应该去准备应对未来,知识与技能的学习没有尽头,学习算法数据结构前期推荐书籍《算法4》、推荐视频课程是左程云的数据结构算法课,不用看其他的,只要你吃透它们,任何算法面试都不会有问题,不过满足工作需要就结束了吗?未必,如果有志自研算法,深入研究的话,推荐《算法导论》和配套麻省理工大学配套视频课程,如果书中知识理解困难就去补对应的课,怕个啥,就算你高中毕业那又如何?你又不需要向这本书、这套视频课程去证明你的学历,哪个不会就突破哪个,终生学习就意味着学无止尽,没念过高等数学就不能学了吗?看不懂不能想办法看懂吗?一遍不行两遍,两边不行三遍,要有愚公移山的精神,没人规定只有博士才能看算法导论,普通人一样可以,知识装在脑子里才是自己的,写不写paper对于存在于你脑海中的知识没有任何影响。
计算机操作系统与计算机组成原理,推荐《深入理解操作系统》这本书,B站也有配套的作者视频课程。操作系统的重要性不言而喻,理解操作系统底层原理能让你写出更健壮的代码,考虑问题直接上升一个层次,比如嵌套循环遍历矩阵,如果你学过系统内存空间分配原理,你就知道行优先遍历比列优先遍历在性能上优秀好几倍,如果你知道每个基本数据类型所占字节数,再结合实际问题就能预判系统数据溢出的可能性。知道计算机编程语言的每个符号在计算机底层的运作机理有助于开发更优秀的软件,甚至具备开发操作系统的能力。
计算机网络,推荐《计算机网络教程 自顶向下方法》《TCP/IP详解》卷一、卷二、卷三。现在开发程序基本不再是单机软件了,计算机网络相关知识在现在乃至将来都非常重要,从理论的七层网络模型,再到实际的各层次的协议,从ip报文经过层层网关到达世界的另一端,无数个比特在各种底层网络系统中来回穿梭,为什么端口是16位的?为什么ipv6地址取之不尽?为什么有了TCP还要设计UDP?tcp握手挥手为什么要这么设计?https如何保证安全?很多网络知识都能从这些经典书籍中找到答案,学习计算机网络知识能让你了解数据在网络世界之间是怎么传递的,在开发设计与网络相关的产品中,会更加注重诸如网络延迟、网络安全、高并发、高可用等性能与指标。
以上是我总结的程序员需要修炼的三大方面内功,这些内功无论哪一个都胜过无数个外功,那些个编程语言的设计开发者、操作系统的开发者、芯片的设计者、著名开源框架的开发者,哪个不是内功高手,内功高手创造外功招式,让码农们依照他们的招式来练武,芯片设计出来,芯片所有引脚的含义也出来了,芯片内部就是黑盒,你不用关心,嵌入式程序员必须按照他们的文档来操作对应的寄存器,这能说明底层嵌入式开发很高深吗?springboot开发者指定你必须使用java开发语言,按照我的套路来开发。微软操作系统规定可执行文件叫exe,动态库名称必须以dll结尾。学人工智能来python这,这里汇聚了很多数学大牛开发了很多ai相关api。音视频编解码领域,几乎所有的软件解码都基于ffmpeg。随着时间的推移,新的语言,新的框架层出不穷,golang、docker、k8s,新语种让程序员一行顶旧语言几行,效率是提升了,可人也变傻了,变聪明的永远是语言的创造者,编译器的发明人。当你在争论哪种编程语言世界第一,别人在创造更加优秀的语言,docker、k8s让人也变懒了,方便易用的事物底层其实全部都是最本质的东西,只要计算机还是二进制,这些东西不会改变,而如果在新框架、新语言这些表层工具的使用上花费大量时间,将会得不偿失,因为你不是制定规则的人,所以努力让自己成为具备制定规则能力的人才是程序员这一辈子所要追求的。
怎么这么像捞?