如何学编程?


此文最早发布在新生大学平台,是为在新生大学学习编程的初学者而写
详情参见[xinshengdaxue.com]


凡是可以被思考的,都可以被清楚地思考;
凡是可以被言说的,都可以被清楚地言说;
----维特根斯坦

什么是编程?

现代计算机的起点是源于莱布尼茨的一个梦想:将人的理性还原为计算,并且有强大的机器能够执行这些计算。这就需要两个前提:

  • 一切都可以被计算;
  • 可以执行一切计算的机器;

从十七世纪以来,数学家和哲学家主要就是在围绕上面两个问题展开自己的研究。
在数学领域,人类已经可以用一套统一的符号来处理代数表达式,并不断尝试用符号来表征全世界所有的概念和事物。另一方面,另外一些科学家,例如笛卡尔和费马,已经论证了,可以将几何通过某种方式转换为代数。因此,那个时代最顶尖的数学家在尝试下面的步骤:

  1. 将全世界的知识归纳起来;
  2. 针对上述的全集用一套符号体系进行表征;
  3. 用莱布尼茨所述的“推理演算”针对这些符号进行运算。

这一艰苦但充满挑战的过程,在那个伟大时代也产生了大量优秀的人才和成果,希尔伯特、康托尔、哥德尔等人都做出了重大的贡献。其中布尔在《思维的法则》中证明了逻辑问题可以演变为数学问题,现代编程语言的运算逻辑由此奠定。而现代编程语言的概念就源自弗雷格在《概念文字》所描述的:所有演绎推理都可以归纳在一个逻辑体系内。
这段时间内,哲学家也为编程语言和计算机的产生做出了重大贡献:维特根斯坦在逻辑哲学论中为现代编程语言的面向对象思想奠定了坚实的基础:

“对象包含了事务的全部状态的可能性,……,这种固定不变的模式由对象组成”。

在数学家和哲学家将一切均可计算的梦想逐渐实现的时候,图灵描述了一种通用的计算机模型,图灵机由此诞生。冯诺伊曼等人用电子管实现了这种模型,“可以执行计算的机器”发明出来了。
一直到今天,现代编程语言依然沿着当年的套路发展,而硬件形态不管变化多大,图灵机的基本原理和冯诺伊曼体系也始终没有本质变化。
因此,简单来说,现代编程语言(或者更精确一些的说是一种“图灵完备”编程语言),应该能够完整的描述某一个现实领域的问题,并通过运算规则,操作计算设备获得分析过程和结果。
所谓学习编程,就是学习使用一种特定的语言,来描述现实世界的一个问题,再将这个问题通过计算机的运算,给出分析和解答。

进入程序的思维逻辑

很多人说编程难,主要是因为还没有具备所谓的“编程思维”。而编程思维,正如上面所述,需要用一种新的语言形式来描述世界。我们都知道那个著名的笑话:

老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”
当晚,程序员老公手捧一个包子进了家门。。。 老婆怒道:“你怎么就买了一个包子?!”
老公答曰:“因为看到了卖西瓜的。”

这个故事,充分的表达了用程序思维和生活思维的差异。那么,为什么程序思维会有如此的不同?
第一,人类的常用表达方式和逻辑习惯的是不完备的,很多信息包含在模棱两可的描述中,而用编程的方式来描述问题,必须做到完备和精确,因为截止到目前,机器的宽容度在很大程度上还远不如一个低年龄的儿童。不管多么厉害的代码,一个逗号都不能出错。
第二,“图灵机”的思维模式,是一种机械方式,因此,当前的编程语言,难免需要符合机械流程,也就是一种线性逻辑。而人的逻辑,本质上是一个非线性的反馈系统。所以在思维决策模型上的差异,导致编程的逻辑过程必然与人脑思维过程不同。

因此,学习编程,需要让自己养成这种线性思维,或者说是一种理性的反馈系统。否则,很难从所学的知识中举一反三,并建立自己的知识体系。因此,在学习时,经常的画流程图和时序图是一个好的习惯。用一些图表将自己的思维表达清楚能够有助于用机械逻辑来表述自然思维。另一个方式是写伪代码。有兴趣的同学可以搜索一下。

了解你所写的代码

不可否认,现在写代码已经变得越来越容易,老一辈程序员执念的很多东西已经不再被年轻人提及。随着技术的演进,越来越多的普通人,只需要简单的训练,就可以完成业务逻辑的编码工作,这是技术的进步,是生产效率提高的标志。
但是对于立志成为伟大程序员的人而言,解决业务问题并非其终极目标。在这个世界中,能够写一些代码的人不少,但能成为优秀程序员的人却并不多。这导致
了一方面很多学编程的人找不到工作,另一方面,很多高薪的工作却无人应征。

怎样才能从一个普通码农演变成一个专家级程序员?上网搜一下会有很多分析,我在这里只想提一个很基本的观点:“了解你所写的代码”。
比如随便一行最简单的代码:
var a = 1;
如果你是一个普通的程序员,你应该知道这行代码解决了什么问题。如果你是一个专家级的程序员,你应该知道这些:

  1. 系统是如何执行这行代码的?
  2. 系统因为执行了这行代码,发生了哪些改变?

如果要做到这两点,你需要对以下内容有比较深刻的理解:

  1. 深刻的掌握你所使用的编程语言;
  2. 了解和掌握你的程序所运行的操作系统;
  3. 在某些情况下,需要了解硬件的一些特性和限制,以及操作系统在这些硬件上的影响。

因为你写的代码,作用于一台图灵机,中间需要有操作系统,可能还有你所使用的编程语言所使用的运行时(例如Java Runtime)。

如果你立志成为一名优秀的程序员,你需要从一行程序出发,一步步的追踪到硬件的执行。这时候,你会发现很多隐藏在程序之下的东西。

优雅的控制机器

很多不懂程序的人,都会发现一个现象:凡是会写代码的,都会修电脑,修手机,修一切的电子产品……
可是,写程序和修电脑之间有什么必然联系么?
事实上,是真的有联系的。修手机的能力,来源于对手机的理解和对手机的控制力。这种控制力,包括各种输入输出设备(摄像头,传感器,蓝牙),包括操作系统,包括工具类的应用软件。
如果一个程序员希望自己的代码能够在一台设备上运行良好。他确实需要关注以上这些东西。一个程序是否可以合理的使用外设?是否在操作系统中兼容性良好?是否和主流软件不冲突?都是一个程序员需要考虑的问题。因此,一个合格的程序员,确实需要习惯性的捣鼓自己的手机、自己的电脑
对程序员而言,一个幸福的事实是,随着可穿戴设备和智能家居设备的逐步普及,越来越多的传统设备配备了操作系统,成为了可编程设备。
如今,一个程序员懂得Android开发,就可以使用程序控制电视定时播放,可以控制智能手表表针的显示样式,可以控制空调的出风温度,可以将手机和门禁连接,可以在汽车的中控台上部署一个程序和手机共享音乐……
身为一个当代程序员,有太多的机会掌握一个以前只有专业人员才能掌握的设备,可以将不同的硬件和服务连接在一起创造出新的使用场景,在这个机器拼接的世界中自由发挥自己的智慧。

常学常新,吐故纳新

学习编程是一件无止境的事业,其一是编程语言和相关的知识技能如浩瀚星河,无穷无尽,其二是新技术,新思路层出不穷,日新月异。因此,仅仅是能在一个领域跟上时代的发展,都需要付出相当的时间和精力。但这种快速的变化也为程序员带来了无穷的机遇,随着新技术的引进,一些传统的问题可以有新的解决方案,更高的效率。作为一个优秀的程序员,理应不断的自我革新,用新知识和新技能自我革新。事实上,所有的高阶程序员,具备的一个基本能力和素质,就是不断的尝试新鲜事物,不断的阅读新的项目代码。也会主动的改进之前做过的项目,那怕它们当前运行良好。

同时,也不必因为新技术太多而产生恐慌,任何技术都有其特定的价值和适用范围。不必因为出现了新东西就急于否定手头正在学习和使用的技术。每一个新技术的掌握,都建立在对现有技术的充分理解之上,因此,学好当下,恰恰是掌握未来的最佳方式

学到不如做到

学习编程的最佳方式,就是把它做到可以运行。在学习任何一门语言或技术之前,都可以给自己设定一个目标,例如学习JavaScript,可以要求自己做一个博客;学习Android,可以要求自己做一个日历App。一个可以运行的程序,不管多简陋,都具备必要的完整性和稳定性,在完成一个可运行程序的过程中,必然涉及到诸多方面的问题和陷阱。解决这些问题的过程,正是学习的最佳路径。在学习过程中,将各种新知识和新技能应用于一个自创项目,使之不断完善,是一个非常好的办法,它天然的帮助学习者制定了学习规划和进度。有一个明确的目标,就会有明确的学习路径,解决问题时就不容易发散。更有助于提升效率,也更容易衡量学习效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 最近几年,程序员这个职业逐渐升温,学编程的人也越来越多,国外有个非盈利的开源社区,叫做FreeCodeCamp,目...
    程序员在深圳阅读 4,998评论 16 153
  • 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及...
    dle_oxio阅读 11,075评论 6 244
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 看到简书上写德国一些事情的文章,会让我恍然大悟原来这些也可以写啊,而且会有那么多人看,而后我想大概呆了几年,缺少好...
    鲜于早早阅读 368评论 6 8
  • True and True True False and True False 1 == 1 and 2 == 1...
    Mango907阅读 540评论 0 0