天天看点

我对编程的思考

思考的由来

最近想深入研究JavaScript这门语言,自然免不了找来许多被奉若圣经的书,比如《JavaScript精粹》、《JavaScript忍者秘籍》、《精通JavaScript》等,这些书中主要探讨的问题诸如闭包、词法作用域、this指向问题、原型继承等问题,着实是我在深入学习这门语言之前所未曾预料到的。就像很多国内的培训机构在给来培训Web前端的学生讲的一样:JavaScript是用来给页面添加行为的。类似

getElementById()

等是最常见的,随后又是

jQuery

等框架,当然是流行什么培训机构就教什么,最近尤其

Vue

React

等也已经成为了各大机构的必备。但实际上这门语言内部有着非常复杂的机制,当然其中很大一部分原因是因为当初设计的问题,但也正是因为这样,在各种的解决方案中又出现了许多优秀的思想跟设计。之前我并未考虑这门语言的面向对象编程,因为与我们常见的以“类”为基础来进行面向对象编程不同,典型的代表便是我们常用的

Java

对象与对象之间可以通过某种机制实现相互的继承、一个值也可以作为一个对象…这些在JavaScript中到处存在的神奇让我开始思考:我们习以为常直接使用的编程语言,我们是否真的了解它?也许你会说可以通过读源码去了解它的设计原理,甚至可以自己去实现一个编译器的设计,但在它设计之上的东西呢?比如我们习惯了以类声明来实现对象继承,而在JavaScript中便不同了。相似的功能却都是为了实现“代码复用”等这些功能。作为开发者,尤其是前端的开发者,经常因为库的流行而不得不去更新自己的技能,但我们是否能够摆脱这种窘境呢?也许你会说这是因为库的设计理念和思想都有了进步,也许你会说去读源码,但实际上当你读懂一个流行库的源码之后新的库已经代替了之前的库,而且设计的思想和架构也出现了很大的改变。

Node

之前可能你说读懂

jQuery

就行了,其他的设计思想都差不多,但后来的这些流行库却完全推翻了这个说法。我们是否总是在学习新的技术呢?这看起来真是个愚蠢的题,PHP更新到了7.3,我们要去学习新特性;Java9也已经发布,可能成为将来的趋势;前端又有新的库流行了,我们要赶紧去看文档、看源码…我们究竟是在不停的更新工具,还是在学习技能呢?

技术不是只用来解决一个问题的

从C到PHP,再到Python,到Java、JavaScript,总是会产生一个疑惑,我是否真的学会了编程呢?C的应用场景好像涉及到的不多,PHP可以做网站后台,JavaScript互动性很强,而Python简直大火,各种培训机构开始"Python+人工智能”,许多从未学习过编程的人跃跃欲试,做其他开发的人员也蠢蠢欲动,仿佛学会机器学习算法就能年薪百万,尤其“零基础”的旗号更是吸人眼球。为了实现这个目标,还开设了高等数学等基础知识课程,一周时间帮你搞定所有数学基础。还有量化金融,大数据,无一不是如此。真正热爱编程的人有多少?真正能够克服难题的又有多少?好比学习JavaScript,入门很简单,好像只有简单看一下视频来个

getElementById()

就能做出一个动态效果了,学习什么设计模式、函数式编程还有什么用呢?短平快、高收入,如果真的这么简单,那还真的就烂大街了。事实上可能很少有人去认真读完一本技术类的专著吧,也许会觉得根本不需要,哪里不会搜哪里,网上总能找到解决的方案,但是这样却很容易造成知识体系的不完整。你可以是自学编程,也可以是机构培训,但你不能够只会做一个网站。这就像是流水线一样,步骤是明确的,甚至遇到的问题可能都是可穷尽的。我们越是快速的去学习一个东西,就越是容易只能够利用这种技术解决一个问题。

编程的应用场景

我们应该更多的去思考我们遇到的问题如何编写一个程序来解决,这个问题经常不是业余上的时候,实际上生活中。学习中任何时候、任何地点都能够产生这样的问题,我们能够思考如何使用程序来解决呢?我们的问题是什么呢?这个问题我们需要怎么转换为一个设计程序的问题呢?很多时候经常会有人抱怨,没有应用场景,好像只有在一个实际的企业上班参与一个项目的时候才能应用。但那已经是把编程固化了,好像只有遇到这些问题的时候才能够运用我们的编程技能。但实际上你自己都明白,不是这样的。初高中的时候老师经常讲要学习知识迁移,对于编程我们是否能够做到呢?

如何看待算法、编译原理、计算机组成等内容

有时候我们总是绕不开一个问题,我们是否需要除编程语言之外的编译原理、计算机组成原理这些东西呢?答案似乎是不言而喻的,因为大学计算机专业这些内容是必备的。但是经常有人说跟本用不上,尽管能够增进对程序运行机制的理解,但实际开发中真的有那么多时间给你去慢慢琢磨吗?对于这些问题我也想过多次。我们在计算机学科的学习是否需要边界?因为真的探索原理时一不小心就到了硬件的层面,当然不需要去完全了解硬件又是如何设计的,那么问题来了,探索编译原理、计算机组成原理的时候我们又有多少机会亲自去接触这些实体的部件呢?当然很少有机会,那么实际我们所认为深入学习过的还是一种感性的理解状态。在很多强类型语言比如C++,Java因为语言设计的规范性和内部处理机制的清晰,很少会产生像JavaScript那样非常奇观的问题,比如this指向莫名其妙的变化,变量提升等问题,即便这样但我仍觉得JS的这种赋予开发者的自由是一种特质。在遇到诸如变量提升这类问题时,我们往往就需要从JS的编译器入手考虑,函数和变量的声明先被处理,因为这样的原因产生了很多意料之外的问题。这个时候编译的作用就体现出来了,因为我们必须了解JS处理时是如何和我们书写代码的顺序不同,造成我们理解的困难的。在学习JS时我不断和其他语言做比较,这些语言都在实现一些功能,但是处理的方式却又有很大不同,就比如类继承和原型继承的问题。

如果说到算法,我们的大脑无时不刻都在进行算法设计和选择的问题,我们旅游时对于路线的安排就是一个很好的例子。花在路上的时间最短,而且同时考虑费用的问题,这就是一种算法的问题,只是当我们需要将它用程序一步一步的设计出来的时候就不那么容易了。前人为我们总结了很多算法问题,就像我们中学学的各种的几何证明一样,有谁还记得起来呢?但是又会有谁觉得它真的没用呢?它对于我们分析问题、解决问题的思维训练让我们在脱离几何证明之后依然存在。那我们学习编程呢?脱离具体做网站、做小程序等之外,编程对我们思维的影响是否存在呢?

从一门强类型语言的完整学习塑造编程思维

很多时候大学里的程序设计与算法和数据结构课程是分开的,但其实很多时候认为数据结构困难或者算法难的原因可能也在此。现在很多人都说大学里应该把C换成Python,因为C在实际工作中用不到,但在大学里不是在培训班里,大学里是来学程序设计训练自己的编程思维,而不是短平快的要去找工作,忽略掉这一点将造成很大的损失。C语言非常的“完整”,因为它相对JavaScript这种语言没有隐藏很多细节,因此我们自身能够学习到的才更多,而不是只学了一门语言,只能够做一个网站。强类型语言和弱类型语言相比,强类型语言对于我们思考数据类型等问题有很大帮助,而弱类型语言缺失了这一点,当然也让我们的开发更加便捷。如果说完整的学习一门语言,达到我们塑造编程思维的效果,选择强类型语言会是一个更好的选择,因此相对强类型语言,弱类型语言同样“隐藏”了很多细节。笔者打算学习《精通C++》这本1200多页的大部头,因为它非常全面,包含了常用的数据结构以及算法,这样可以与其他语言形成参照,明白相近的效果在不同语言中是如何处理的,不同的语言又各自具有哪些特质。以一种新的方式去完整的学习这门可以说是对开发者要求作为严格的语言,从而更好的锻炼自己的思维。

愿每位热爱技术的朋友都能努力在正确的方向上,并且保持热爱。

继续阅读