Mr.C/文
子曰:“知者不惑,仁者不忧,勇者不惧。”
-
前言
《穷爸爸,富爸爸》里面有句话是这样说的:“对于受过良好教育的爸爸,工作的稳定就是一切;而对于富爸爸来说,不断学习才是一切。”
许多时候,我们的恐惧并非来自所恐惧的事物,而是来自我们自己的未知,想克服某种恐惧,我想最好的解决方法是主动去适应,也就是人们常说的,走出舒适区。
随着近二十年计算机界的蓬勃发展,继而导致了某个新品种程序猿的大量"繁殖",如果你身边也有该品种的存在,并且你想和他们可以有职业上的交流,或者想要套得猿心,懂得猿类之间术语,读此系列文,事可成矣。
-
如何走上编程之路?
本文的目的是让你知道如何像一个计算机科学家那样思(da)考(kai)问(nao)题(dong),这个脑洞的打开方式结合了数学、工程和自然科学三个学科的最优特性。比如说:
- 很数学的方式:计算机科学家们[1]使用一套标准符号去表示他们的idea(计算机领域也会涉及到很多计算,比如图像处理中的线性数学、数据挖掘中的统计学、概率学等)。
- 很工程的方式:计算机科学家们同样需要设计一些组件,并把它们组合成一个系统,在组合的过程中还需要权衡各种方案带来的利弊。
- 很科学家的方式:计算机科学家们同样会去观察一个复杂的系统,并且会做出一些假设,通过实验区验证是否可行。
计算机科学家最重要的一项技能是 “解决问题能力”,问题解决能力意味着你需要拥有以下三项技能点:
- 知道问题在哪里(犹如当年霍去病打匈奴,你要打败敌人,首先得知道敌人在哪)
- 能够制定出解决问题的方案(作战计划)
- 并且可以清晰、正确地实现方案(战场上的排兵布阵)
当然,想在计算机领域有所成就,除了需要拥有以上三点问题基本解决技能外,掌握编程技能是必不可少的。
如果你觉得你拥有以上技能点,那么就可以开始上路啦(T^T)~~~ 对,就是那条传说中的 编程之路。
On one level, you will be learning to program, a useful skill by itself. On another level, you will use programming as a means to an end. As we go along, that end will become clearer.
-
编程之路之—— 算法
如果说 解决问题方式 是计算机科学最重要的部分,那么就是在解决问题中所创造出来的解决方案可以说是重中之重,这里的解决方案,我们便称之为 算法。
算法是一连串解决问题的招式,比如我们想从A点到B点,那我们选择的方式可以有 自己开车、坐地铁、坐公交或者打Uber(当然,如果你是数年前的本山大叔,还可以坐直升飞机),这里的方式就是我们解决 “从A点到B点” 这个问题的的“算法”,由此可见一个好的算法和一个差的算法,虽然同样可以解决问题,但是他们之间的效率却可能相差上百倍(这就是一个好的程序员顶得上十个普通程序员的说法来源之一)。
算法是理论上的解决方案,而实际上对算法的实现需要依赖于具体的编程语言,“编程语言是一种工具”(我想这句话每个读计算机的孩子都有听伟大的老师们讲过吧?)。
事实也确是如此,编程语言就好比你选择了Uber后打到的是一辆奥迪还是一辆奥拓,算法在某种程度上决定了我们解决某个问题的速度等级,但编程语言(前提是对不同计算机语言同样熟悉的情况下,不包括语言学习时间成本)只是影响我们到达目的地的舒适度。
** 所以,算法很重要。**
-
编程之路之——程序
按照维基百科的说法:程序(英语:procedure),指特定的一系列动作、行动或操作,而这些活动、动作或操作必须被运行于相同方式以为了在相同环境下恒常得出相同的结果(例如紧急应变程序)。不太精确地说,程序可以指一序列的活动、作业、步骤、决断、计算和工序,当它们保证依照严格规定的顺序发生时即产生所述的后果、产品或局面。一个程序通常引致一个改变。
其实,看完维基百科的中文解释后,作为几乎天天跟程序打交道的我也是一脸蒙圈的...
这样子会吓走一大批妹纸的,对,怪你囖,维基百科君。
其实程序我们可以这样理解,它分为5个部分:
- 输入
- 输出
- 数学和逻辑语句
- 判断语句
- 循环
喂喂~ 别走吖!我还没解释完呢,不要看到这个5个名词就看不下去了好不好?
我们可以把这五个过程对应为我们平时撩女(男)神的过程,在计算机执行的程序就好比我们的撩妹(汉)过程:
程序组成部分 | 计算机 | 撩妹(汉)过程 |
---|---|---|
输入 | 键盘/文件(*通常从文件获取,比如我们在Windows下常看到的.exe **)/网络外设 | 对女(男)神发自内心(或身体)的期盼 |
数学逻辑 | 与、或、非逻辑是否成立 | 女(男)神当天的心情是否适合date?(如:只要Ta 6级考试通过或者你找到了一家好吃的餐厅:可Date,称之为或。 需要Ta 6级考试通过并且你已经找到了一家好吃的餐厅才可Date,称之为与。没有人约Ta的时候你才可Date得到,称之为非 ,可怜T_T。) |
条件判断语句 | if语句 | 你今天是否已经达到了约对方的条件?达到则可执行 下一步:拿起手机,给Ta发微信或者打电话啦~~ |
循环语句 | while或for语句 | 如果被女(男)神拒绝了午餐,是否继续重复约晚餐?如果晚餐还被拒绝了,是否重复约明天早餐? 如此反复...称之为循环矣。 |
输出 | 图像显示或者发送某些数据到设备上 | 这里的输出,当然是,要不要准备好Date完之后的事宜啦。 |
- 是不是很简单?
是不是很简单?
是不是很简单?
假设计算机是我们的身体,那么程序就是运行在我们身上的思考过程。
我们身体 所观、所闻、所触 就相当于计算机中键盘或者鼠标的 输入,而我们在获取外界的信息后再大脑内部经过的思考过程,就相当于 程序在进行 数学与逻辑运算、条件判断以及是否循环的过程,而最终我们的 所行 以及 所想 就是我们大脑在执行程序后的输出。-
编程之路之——Bug & Debug
什么是bug? bug正常翻译为中文的意思为:虫子。
那为什么我们程序上的错误会被称为Bug呢?
因为... 它第一次出现真的是因为一只Bug:
据说,1947年9月9日,一只小飞蛾钻进了计算机电路里,导致系统无法工作,一位名叫格蕾丝·赫柏的人把飞蛾拍死在工作日志上(见图),写道:就是这个 bug(虫子),害我们今天的工作无法完成——于是,bug一词成了电脑系统程序的专业术语,形容那些系统中的缺陷或问题。
我相信Bug这个词大家并不难理解,不过我还是以 幽默、易懂、充满趣味 的方式再讲一遍吧!
以 A点到B点 为例,Bug 我们可以理解为是在我们从A点到B点过程中出现的各种意外,比如:
- 接单的Uber司机突然被交警抓了(此时Debug方法为重新下单)
- 走路过去B点的时候突然下起大雨 (此时Debug方法为等雨停或买把伞)
- 比如本山大叔因为太过高调而... (此时Debug方法为:不~ 这不是bug,这是特性!)
以** 追女(男)神** 为例,Bug 我们可以理解为我们在约会过程中各种小插曲,比如:
- 对方因为打游戏或者煲韩剧通宵并且关机 (此时Debug方法为,等~)
- 对方因为心情不好而不想和你说话,并扔了一只狗 (此时Debug方法为,等~)
- 对方因为另一个人而放了你飞机 (此时Debug方法为...
所以,Bug 和 Debug就是一个出现问题和解决问题的过程。
如果你一直听到你的程序员朋友说他一直在加班调Bug,你不需惊讶,因为在我们的生活中我们自己不也是一直处于出现问题和解决问题的过程中么?
我们属于大自然创造出的奇迹,而计算机只是我们人类所创造出来的物品,那么,连我们人类本身都一直出现问题的话,程序它,一直有Bug,又有什么不正常呢?
而且,计算机科学家们正在 创造着我们的计算机世界,创造者们在创造过程中不断修正错误,也就没有什么不正常的了,所以, 请善待你身边一直加班改Bug的 猿类。
-
结语
本话题也将以系列文的方式推出,本章先以 幽默、易懂、充满趣味(捂脸) 的方式介绍 算法、程序以及Bug 三个计算机界基本法概念,望喜欢。
本文部分内容译自一本关于Python开源书籍 How to Think Like a Computer Scientist,感谢!
-
其实计算机科学家和软件工程师(程序猿)是有差别的,计算机科学家偏向于计算机理论,而软件工程师会更偏向于计算机应用,一般来说,"大多数的后者" 应用 "少数的前者"所研究出来的理论至现实世界中。所以他们之间的语言和方法,是共通的。 ↩