这里说的『高大上』的专业课,主要指算法、数据结构、操作系统、编译原理、线性结构、离散数学等等。
对于大学不是计算机专业,但以后想要从事前端开发工作的同学来说,这些『高大上』的计算机专业课是否有必要花时间去了解呢?
『基础决定你可能达到的高度, 而业务决定了你的最低瓶颈』,两者不可偏废。
说说我自己吧。
我的计算机基础就非常薄弱,但是我当年进公司却拿了较高评价的Offer。起初,我会反感公司校招时放那么多计算机基础的题目,会反感领导要求前端有计算机背景(这主要是因为自己基础薄弱,但心里又比较自负)。
但是知道的越多,就越感受到自己的渺小。因为我感受到了我那皮毛都算不上的基础知识带给我的巨大收益,我会开始计算并焦虑我好像得花非常多的时间来弥补自己知识的短板。所以我认为:计算机基础知识非常重要,它决定了你能走到什么高度。
我其实是很羡慕那些学了4年甚至7年计算机的同学,但是我发现,有些科班的同学甚至无法和我交流类似的知识体系。这说明应试教育体系下,所谓的计算机基础还是需要通过思考和实践来真正成为自己的东西,否则并没什么卵用。
前端的发展非常快,以至于你今天关注的新东西,明年再看可能就截然不同甚至被废弃了。所以保持高的学习力来应对这种变化非常重要。高的学习力在很大程度上和你的计算机基础紧密相关(先抛开智力等不可抗因素)。
现在纯前端范畴里还几乎没有出现新创的知识领域。但是反过来说,从来没有一个领域有Web前端这么飞速发展,不断的有在旧知识体系在它上面重演。我记得有一句名言大概是这个意思:所有东西都会用js实现一遍。 我现在深以为然。
我相信在很多人也看出来了,前端这些年看似发展的非常蓬勃,但其实并没有太多新鲜的东西,一切都是重演。计算机基础是以不变应万变的秘诀。现在的前端现在已经不再需要『我会写java后台代码』等等愚蠢的强调来站直腰板了,成熟的公司已经开始重视前端带来的实际价值,。所以前端本身当然不能固步自封,巩固计算机基础,用以灵活应用到日常业务,用以吸收新鲜技术,也就是自然而然的事情。
有同学或许还会问:前端做项目如何积累经验?
这里面有主动和被动两个方面积累经验,但归根结底都是基于思考。
被动——由项目需求、特点决定,如视觉交互或前后端技术架构的特殊性导致你要去思考解决方案,进而积累经验,这个机会是可遇不可求的。
主动——学习现在热门的技术,ES6(babel) 、Commonjs(browserify)、React、同构Webapp开发等等. 确定它们的潜在风险和适用场景后 应用到你的产品开发中。 这个机会是人人都可争取的。
就个人而言,我在每一个阶段都会反思, 我是否比上一个半年要进步了。如果没有,就会浑身不舒服。
最后再列下我觉得部分已经让我受益的基础知识:
- 高中的物理知识 + 最最基础的大学物理;
- 编译原理的最最基础的前端知识用以一致的处理文本类问题,把你从糟糕的逻辑判断和正则表达式的滥用中拯救出来;
- 大学中的矩阵论、线性代数 ,进而一些计算机图形学的简单理解。这些并不一定要和webGL结合,但是和物理一样可以帮助你做出『符合直觉』的效果和动画;
- 数据结构和基本算法,你要清楚特定的基础数据结构可以处理的问题,其实很多不是那么基础的算法和数据结构都需要自己在实际需求中去摸索或学习, 所以如果你已经知道这些算法,那可以跳过很多耗时的技术选型阶段, 这就是知识的广度带来的优势;
- 一些函数式编程的思想, SICP是大家广泛推荐的书, 然而我还没看完。一些衍生的内容,比如不变数据结构的定义和应用,事实上你现在就可以通过几十行代码在js里实现不变数据结构的帮助函数来帮助你在复杂应用里实现undo, redo甚至历史回溯功能,而不需引入facebook那高大120kb的immuable.js。