编程与优雅解决问题的方法

我一直认为,学习编程是学习计算机的基础,但是学习计算机并不是为了用 C++ 写个 CLI 的随机数发生器向那些学外国语专业的人秀一下自己比他们厉害,可以用计算机作出多么赞的事情,也不是为了向别人证明自己会多少种排序算法,多少个类的设计,甚至是懂多少门语言,而应该是优雅的解决问题的方法,即我们利用计算机来帮助我们的优雅地解决实际生活中问题的方法.

如何解决问题

首先我们得学会 找到问题的真正所在,否则何谈解决方法?

之后,我们拿掉 “计算机 / 编程” 这两个主语,该如何优雅地解决问题?

我小时候听过一个 可能并不真实的 故事,是关于工厂中如何辨别箱子中是否装满了货物的问题. 有人建议安装一个秤,逐个称重量比较,另一个方案是使用吹风机,能吹走的就没装满,吹不走的就是满的. 两个方案来都是可行的,问题都可以得到解决,只不过前者需要购买一个秤,而且设计不易达到工业的流水线作业的要求,具体实现起来比较复杂,而后者显然要优雅的多,找个吹风机放在运送带旁边就是了.

编程也是一样,既然是解决问题,我们理应使用一个自顶向下的方法,先找到一个问题的解决范式,然后在实践的基础基础上学习对应的理论知识来解决问题,这一点上国内的优先学习理论(上来就学数组,指针等)的方式是绝对错误的. 再加上我校学习的是 C++,这样的学习会极大地限制使用者的思维,导致很多学生学了编程后除了老师要求的所谓 “课程设计” 以外都不知道自己的编程技巧可以用来做什么.

如何利用编程解决问题

就以最近我和 Allen 正在开发的 AreaLoad 为例吧,设计的动机很简单,就是因为发现目前已经有的上传平台太弱了,缺陷很多,而且上传作业作为一个长期的工作,很多课程都会用到,于是就萌生了一个自己写上传平台的想法,由于动态网页的最方便较为主流的实现是 PHP 而不是某院领导瞎扯的 ASP,躲在学校说话不怕挨打 ,所以就决定使用 PHP 写一个文件上传平台.

由于之前我对于 PHP 一无所知,所以在实际设计上传平台之前我先大致规划了一下设计的思路:

嗯,我们需要一个上传平台 -> 吼,用 PHP 和 SQL 编写 -> 文件上传部分的 PHP 代码是什么?-> 一个老师得有多个课程吧,多写几个课程 -> 学生上传完后得记录吧,用 SQL 数据库(PHP 怎么连接 SQL 数据库?)->…-> 原型设计完成,Awesome!

接下来就是具体的代码实现,各种 Google 找对应的 PHP 函数,SQL 使用方法, 哪里不会点哪里 ,由于这个项目的实现是我个人的兴趣,而且用新的语言做出一个可以被使用的产品非常有成就感,在短短的 10 天中,和 Allen 合作的情况下完成了 AreaLoad 的第一个可以被使用的版本,和老师协商后就被投如到了 “Web 技术基础” 课程的作业收取中,受到这个的鼓励,在总计开发 28 天的时候(也就是昨天),AreaLoad 已经成为了一个比较自治和稳定的作业上传框架了,我和 Allen 打算之后将其扩展成为一个通用的上传平台,结合 LDBS 消息聚合系统缩短文件和消息在学校中的传输路径,增强安全性同时增加信噪比.

如何学习一门编程语言

可能有人会觉得能在这么短的时间内上手 PHP,我的学习能力一定很强,看什么会什么,然后事实并非如此,说来惭愧,我为了 PHP 尝试学习过三次,前两次一次是高一的寒假,一次是高考后的暑假,每次都是大张旗鼓从图书馆借了多本 PHP 相关的 “权威书籍”,然后在看了不到 20 页后就让他们躺在书架上吃灰了,究其原因很简单,学了不知道做什么. 比如数组,和 C 很像,书中有对应的案例,输出了一个表格,但是输出一个表格能干什么?我不知道,也想不到,所能做的仅仅是跟着书中的代码模仿一下写一个一样的表格,学习 PHP 的过程如同现在高等数学的学习过程,味同嚼蜡,十分不爽.

而这次在实践中学习 PHP,不仅没有去专门借任何一本书,还很快地理解了 PHP 的设计范式和这门语言的使用特点,上手极快.

且不说计算机专业的学习课程安排架构,仅仅就从某一个特定需要学习的语言来看,对于一门语言的学习方法我建议如下思路:

  • 首先 Google 一下这门语言是否有学习的前景(如果没啥前景的话,还是不要学了比较好,别被所谓 “基础” 或者 “知识都是不变的” 这样的理论骗了,他们这么说 仅仅是因为他们不会又不想学而已 ,哪有什么不变的,如果 Windows 系都是不变的话,为什么我们不去学 Windows2000 的使用呢?虽然他们可能会辩解说学了某某语言可以让你很快地上手前沿的语言,但是谁又会为了更快地上手 Win10 而先去学 Win2000 呢?)

就比如 Python 吧,作为一个动态强类型的语言,其语法的先进性,缩进的表示方法以及各式各样的语法糖是远超过类 C 语言的,类似的 Go 和 Rust 更是如此,是数学和计算机科学完美结合的产物,除了底层硬件驱动和 极其 追求效率的开发目前还需要 C 以外,淘汰类 C 语言指日可待.

  • 然后看一下 Github 上面你要学习的语言一般是用来做了什么东西?

  • 最后你可以想想这门语言可以实现什么让你感觉或者让这个世界更加美好的东西?

  • 给自己定一个自己感兴趣的目标(比如用 Python 实现一个 OJ 系统?用 PHP 做一个自己的财务管理系统?用 Lisp 写个自己愿意用的博客系统?用 BASH 写一个脚本用来一键备份数据?),就可以开始航行了!

不过需要牢记,在你学习的过程中一定要多去阅读一些大神写的代码,获得更好,更先进的设计理念,完全自己走容易走歪,而完全跟着那些没有实际项目经验的人写出来的 “课本” 上的设计思路容易思维僵化.

扩展阅读


我的博客使用了Disqus评论框,如果你看不到评论框,那么多半Disqus服务在你所在的地区被墙,请使用代理访问。