下拉查看目录

张砷镓:为什么你应该开始学习编程了?

2017-02-17 张砷镓 学习学习再学习 学习学习再学习

版权声明

本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明; 转载时请务必注明作者。


以下是《共同成长社区》第 59 次分享

分享者是张砷镓

张砷镓

张砷镓,86 年射手座一名具有独立思考能力和代码洁癖且兴趣爱好广泛的程序猿目前就职于 58 赶集集团。传说中的神童”,6 岁小学毕业,11 岁上大学,15 岁毕业骨灰级游戏玩家曾在魔方、扫雷、俄罗斯方块等领域取得国内第一多次打破全国记录并作为嘉宾参与《佳片有约》、《天天向上》等节目录制扫雷网saolei.net创始人。

《共同成长社区》的分享,并不是 “私密” 的,我们不在乎分享内容是否流出去,事实上,我们会主动拿出绝大多数的内容分享至社区之外 —— 因为所有的分享,最终传播得越广越有价值。

若要进一步了解《共同成长社区》,请在后台点击 “收费社群” 的子按钮 “共同成长” ……  

请注意:共同成长社区已停止接受直接加入,请参阅这篇文章


有一家饭店的大厨,菜烧得很好吃,一传十,十传百,食客从五湖四海闻名而来。然而这对饭店的老板来说,并不单纯是一个好消息。因为客人不是奔着饭店,而是奔着大厨的手艺来的。老板必须想办法留住这位大厨,否则他一旦被别人挖走,饭店的生意就会一落千丈了。然而即便老板不惜血本保证了大厨的忠诚度,风险也依然存在:

  • 大厨休息或请假的时候,菜品的口味就无法让顾客满意;

  • 大厨只有一个,如果想在多个地方开分店,那口味也就不能保证了;

  • 大厨再厉害,同时也只能炒一个菜,而顾客越来越多,输出总是供不应求;

  • 大厨年纪大了总是要退休的,如果收徒的话,怎么继续保证徒弟的忠诚度呢?

有一天,老板突然悟到,决定菜品口味的是大厨烧菜的过程,而不是大厨本人。如果大厨愿意把自己每个菜的菜谱都写出来,那不就可以请别的厨师来操作了吗?虽然别人按照菜谱烧出来可能达不到原味的 100 分,但 90 分总是能达到的,而这样的差距是一般的食客无法分辨的。这样只要菜谱在,饭店菜品的质量就能得到保证,扩张店面、开分店什么的就都不成问题了。

于是老板和大厨谈了一个晚上,说服了他用菜谱技术入股。几年后,饭店生意越来越好,开了无数家分店,老板赚了很多钱,大厨也得到丰厚的分成,不用再天天靠手艺吃饭了。

这个故事对你有什么启发吗?


什么是编程?

在洗衣机出现之前,人们只能用手来洗衣服,需要经过浸泡、揉搓、漂洗、拧干的一系列流程,每天都需要花掉好几个小时。而洗衣机的发明解放了家庭妇女的双手,让她们可以把原本用来洗衣服的时间去做其他事情。随着洗衣机的不断迭代升级,洗衣服的整个流程最终会被人们遗忘,只有设计洗衣机的工程师们知道。

所谓程序,就是为了实现一个需求而设计的逻辑流程。大厨的菜谱和洗衣机的工作流程都是程序,只不过前者由人来执行,而后者由机器来执行。正是因为有程序作为媒介,我们才可以分离设计者、调用者和执行者的角色。虽然程序的执行效果未必能让其设计者满意,但它已经可以脱离设计者而存在,可以被其他人执行、验证和改进。

所谓编程,就是指编写程序。将烧菜的过程写成菜谱,本质上就是在编程。通过编程,我们更加透彻地理解并阐述了事物的本质,让曾经专属于某个人、某个团体、某个地方甚至某个时刻的东西,得以独立的存在和发展。从这个角度来讲,说编程是在创造生命也不为过。

编程可以说是一种标准化的写作。标准化保证了服务和产品的质量,也使大规模复制和扩张成为可能。KFC 正是依赖其详尽到炸薯条的油温秒数的食品加工手册,才将分店开满世界各地的。陶华碧如果不能将她的辣酱配方和制作过程清楚地描述出来,交由标准化生产线去制造的话,那么今天“老干妈”最多只是一个小乡村里的作坊级产品,不可能走上我们的餐桌。

我们每天的生活,都在和各种技术产品和服务打交道,比如导航、搜索引擎、聊天软件……你可曾想过,这些产品和服务背后的原理是什么?相信除了程序员群体之外,绝大多数人不会去想这些问题,因为编程的本质就是:设计一个逻辑流程来实现指定的需求,使调用者无需了解实现细节即可达到目的。

由于程序和编程的广义概念太过笼统,为不导致概念混淆,之后我们提到的“程序”和“编程”,特指使用计算机编程语言编写,由机器来运行的程序。


解放时间和注意力

假设你已经在某岗位工作了一段时间,根据经验总结出来每天下班前有下面三件事需要做:

  • A. 在公司内网系统查询某业务当天的数据(约 10 分钟);

  • B. 整理成日报表并存档(约 15 分钟);

  • C. 把几个核心数据用电子邮件发送给领导(约 5 分钟);


你可以在认真梳理过之后,将这个流程写下来,贴在办公桌前,或者记在脑子里,每天下班前,都照着这个流程来操作,确保每个步骤都不被遗漏。虽然研究整理这个流程让你很兴奋,但千篇一律的流程每天都执行一遍就太枯燥无味了…… 等等,这活我不可以找个秘书来干吗?

当然可以,雇佣他人是一种用金钱换时间的解决方案。但是这同时又引入了许多新的问题:

  • 你需要花钱(废话);

  • 你需要把要做的事解释给秘书听,并确保他能听懂(沟通成本);

  • 秘书下班或休假时,这些事你还得自己做(有时间限制);

  • 你要为秘书犯的错误承担责任(质量得不到保证);

  • 每次秘书犯了错误,你都需要进行教育(培训成本);

  • 秘书会直接接触业务数据和信息,难保有泄密的可能(安全隐患);

  • 换一个秘书,以上的事情都得再来一遍……

这不是把事情搞复杂了吗?人的成本太高,提供的服务又不可靠。而如果你会编程的话,也许你可以:

  • 编一个小程序来完成查数据、做报表、发邮件的流程,再配置一个定时任务每天自动执行;

  • 谨慎一点的话,可以让程序先发到自己的邮箱,检查没有问题后再转发给领导;

  • 必要的话,还可以让程序在运行出现意外时给你的邮箱或手机发报警通知;

  • 如果你愿意,甚至可以给内网办公系统直接加上邮件报表这个功能……

假设你原本手工做完 ABC 流程需要半个小时,那么你的程序每执行一次,就为你节省了半个小时的时间。假如你写程序用了三个小时,那么一周就能收回成本,以后全部都是净赚的。如果程序运行的时间足够长,那么单次运行的均摊成本将趋近于零。可以看出,编程是一种用时间换时间的解决方案。

当然,你需要将要做的流程写成机器能读懂的程序;如果需求发生变化,你需要对应地修改程序;如果程序运行时出了 BUG,你需要调试修复……但更重要的是:程序不拿工资,不可能辞职,不需要休息,不会闹情绪,不可能犯错,只要你的流程正确,依赖的资源不出问题,它就可以 7*24 小时一直运转下去。

每当我们通过编程实现了一个需求,就好比造出了一把锤子。今后你遇到类似的问题,都可以拿这个锤子来解决。当然有时会遇到锤子不称手的情况,需要改进和调整。但在大多数情况下,这个锤子都是可以直接拿来用的。也就是说:完全相同的问题,你只需要解决一次就好,不会浪费时间在重复的工作上。

通过编程,你可以将那些枯燥无味的重复性工作交由机器来接管,这样就可以将你的时间和注意力从具体的事务中解放出来,去做更有价值的事情。比如研究和优化工作流程,或者陪伴家人,又或者去读一本书……


体验“开挂”的人生

喜欢网游的朋友可能都知道外挂这东西,这是指和游戏一起运行、为了提升游戏体验的小程序。外挂一般分为两种,一种是在游戏系统框架内简化玩家操作的辅助性外挂,提供如自动拾取、自动打怪、改键之类的功能;另一种是利用游戏漏洞营造不平等的作弊性外挂,提供如开图、加速、无敌之类的功能。

当我们说某个人“开挂”时,其实是在说他的表现明显超出正常的范畴。我们可以想象一下,当原始土著碰到端着冲锋枪,乘着降落伞从天而降的美国大兵时,大概就是一种“我 X,这哥们开挂了吧?”的感觉。

要知道,身体并不强壮的人类之所以能征服地球,就是因为我们会创造并使用工具来突破生理的局限,做到原本不可能做到的事情。在即将到来的全信息时代,编程将是创造工具,甚至使用工具的主要方法。我们天天都在使用的软件和 APP,不管是文字处理,K 歌软件还是搜索引擎,都已经和我们的生活融为一体,成为我们生命的延伸。通过使用这些软件,我们可以不断突破自己经验和能力上的局限,我们随时都在给自己“开挂”。

然而大多数人都是在被动地等待别人来满足自己的需求。他们会使用通过朋友推荐、广告宣传等各种渠道推送给自己的软件,然后感慨一下:“哇,居然还可以这样!”他们只会使用软件提供的标准功能,而一些个性化特殊需求如果软件不支持的话就只能放弃掉了。这就和穿衣服一样,大多数人只会买标准尺寸穿,如果这里紧那里松,这里长那里短,也就只能忍了。

还有少部分人会主动考虑如何去满足自己的特殊需求。他们会想:“如果有 XXX 功能就好了……”他们会主动去寻找能满足自己需求的软件,研究软件的个性化配置,或者给软件的开发者提功能建议,当然如果开发者不鸟他,也就没辙了。同样,追求个性的人可能会找裁缝为自己量身订做或者修改衣服,使其尽可能地适合自己。当然裁缝比较欢迎大众化的需求,一些小众化的需求本来可以实现,却会因为各种原因被拒绝。

只有极少数的人有能力自己去实现那些别人不能满足的需求。他们能在原有软件的基础上开发插件,对软件进行二次开发,甚至写出一个全新的软件。同样,追求完美的人可能会亲自把关设计、选材、加工等各个环节,并把一件衣服改过来改过去,直到自己彻底满意为止。

如果说学好英语能为你的世界打开一扇门,让你拥有更多选择的话;那么学好编程就能让你有机会以“上帝视角”来认识和改造这个世界,并拥有几乎无限的可能性。因为在现实中的一切最终都会被信息化,而你可以通过编程来对信息做任何形式的加工和处理,只要你想得到,就能做得到。

你想体验“开挂”的人生吗?那就赶紧开始学编程吧。


培养深入的思维方式

每个人都应该学习编程,因为它将教会你如何思考。

—— 苹果创始人,乔布斯 [1]

思考,是人之所以为人的行为,而编程是一种对人的思考进行再思考的行为。我们不需要把每件事情都想清楚,就可以在现实社会中生存。对某些从事机械性操作的职业来说,甚至可能完全不需要进行思考。然而在编程时,我们只有在想清楚之后,才能把程序写出来。

事实上,编程是将人的想法“实体化”的过程,这要求我们进行更深入、更细致、更全面地思考。为了实现一个需求,你必须对其原理和运转流程了解得十分透彻,否则就无法用编程语言精确地描述出来让机器去执行。在实体化的过程中,想法的结构缺陷和逻辑漏洞会自然凸显出来,你总会发现存在没有考虑到的可能性,以及需要进一步思考的细节。在编写正确、高效、优雅的程序的同时,我们也在不断塑造自己的大脑,让它能思考得更清楚、运转得更高效。

编程要求我们能够对事物和流程进行各种维度上的拆分,并在不同的抽象层次上进行完整自洽的思考,这使我们有可能去解决那些规模无比庞大的问题。通过在抽象层次上的划分,我们能做到在宏观上考虑整体的同时,也能在微观上考虑每个细节。经过合理拆分后的细粒度需求简单明了,更适合团队协作,其成果还可以在不同场景下进行复用。在一个成熟的软件或互联网公司,上千名工程师一起开发同一款产品是很常见的,而这种协作的规模除了行为艺术以外,几乎是不可想象的。

编程是不断解决问题的过程,也是不断完善解决问题的方法论的过程。一个优秀的程序员总是解决问题的高手。在编程的需求定义、方案设计、编码实现、调试纠错等各个阶段中,都将面临无穷无尽的问题。这个问题要不要解决?什么时候解决?其根源是什么?需要考虑哪些方面?如何做取舍?有哪些方案可供选择?选择的原则是什么?……解决问题的方法论展开来讲可以写一本书了,有机会再和大家好好聊聊。


在未来更好地生存

半个世纪以前,美国有 70% 的人口在农场工作;随着自动化耕种的大面积普及,现在只剩下不到 1%。 

—— 凯文 · 凯利,《必然》

迄今为止,人类从事的简单重复性的工作(如洗衣、耕种、制造等)已经几乎完全被机器接管,人类的工作方向已经转向对机器的研发和维护。而那些需要复杂知识和精密操作的工作(比如驾驶汽车、外科手术等)也正在被机器逐步接管。

资本是具有自我意志的,它会无限制地追求自增长,且不为人性所改变。所以当产出的质量不变,而机器的成本显著低于人工成本时,几乎所有的体力劳动者都会失业。毕竟机器不知疲倦,不会抱怨,干得比人又快又好又省钱,人类怎么可能和机器竞争?只有在一些正享受人口红利的发展中国家(比如中国和印度),由于技术引入成本比人工成本高,目前体力劳动者还有一些生存的空间。但技术的成本会不可阻挡地快速持续下降,而人口红利的窗口期将快速消失,拐点很快就会到来。

与此同时,人工智能正在将逐渐接管人类的简单重复性思考活动(如寻路、翻译等),人类只需要下达命令、制定原则和做出选择即可。人工智能甚至已经进入了那些被我们认为是“人之所以为人”的领域:写作、编曲、绘画……

Google 的 AlphaGo 战胜李世石是一个里程碑式的事件,它证明了人工智能已经可以在人类最擅长的思考领域超越人类。现在最优秀的棋手都在向 AI 学习下棋,职业棋手和 AI 进行日常训练已经成了常态。纯机比纯人强,人机比纯机强,这早已是棋界的共识。

当人工智能在某个思考领域的能力接近或超过人类,而其成本极其低廉时,在资本意志的作用下,这个领域就会将不可逆地被人工智能迅速占领。我们今天已经习惯了使用计算器来取代大脑进行数字计算,在不远的将来,我们也会习惯将原本需要自己思考的许多问题交给人工智能来处理。在可以预见的未来,所有构建在经验和技能基础上的非创造性工作岗位都会消失,人类的工作方向会转变成对人工智能的研发和维护。

人工智能全面普及的时代正在以光一样的速度向我们飞奔,可能下一秒就将我们远远地甩在身后,连车尾灯都看不到。届时,几乎所有的工作都将和人工智能密不可分。只有那些理解人工智能,能够很好地和人工智能合作,并帮助改进人工智能的人,才能在那个时代更好地生存下去。

每个人都应该尽早开始学习编程,我的孩子起步太晚了,我觉得应该在教他们 ABC 和颜色的时候就开始。

—— 美国第 44 任总统,奥巴马 [2]

在《未来我们该学什么语言?》一文中,我曾畅想过未来可能出现的脑接口技术,以及与之配套的人机共用结构化语言。届时我们的大脑将直接接入互联网和人工智能,可以瞬间将需要的知识和信息下载到大脑中……我们将成为神一样的存在。但前提是你必须具备编程基础,才能享用这一革命性技术带来的成果。

如果到那时候你还没学会编程?那可以洗洗睡了。


我知道你会问……

我又不准备当程序员啊,有必要学编程吗?

你可能会开车,还是个老司机,很会享受驾驶的乐趣,但你未必愿意去当一名出租车司机吧?同样的道理,学习编程不一定非要做程序员,但却能使你拥有全新的视角、深入的思维方式和无处不在的效率优化思维,这都将成为你重要的软实力。在不久的将来,编程将会变成像英语、驾驶一样人人必备的技能。到那时,你希望自己是一名老司机,还是搭车族呢?

笑来老师曾经说过,“学这个有用吗?”其实是一个很可怕的想法。由于很多东西现在看起来并没有什么用,大多数人就放弃了学习,而只有少数人会抱着“学学看能有什么用”的念头去尝试。在之后的某一天,真正需要这项技能和知识时,那些选择放弃的人只能感慨“要是当时…… 就好了!”,而选择学习的人则会惊喜地发现“哇,原来还能用在这里!”…… 所谓的“惊喜”和“运气”其实就是这样一回事:在不知不觉间,已经提前做好了准备。

那我能不能现在努力赚钱,然后雇一个专业的程序员呢?

不错,你是可以找一个程序员来实现你的想法,但我们之前请秘书时遇到的诸多问题又会接踵而来。更重要的是,如果你不会编程,你可能连个靠谱沾边的想法都提不出来。就好比没有见过汽车的人,只会想着让别人为他造一辆更快的马车。只有在理解了某个事物的原理之后,这个事物的概念才能在你的脑中清晰起来,才能真正融入你的认知结构中。

有了清晰的概念,你才能对其进行思考,判断它能够用来做什么,不能做什么。如果概念不清晰,你甚至都无法讲清楚自己的需求,更难和程序员进行沟通和合作。每一位程序员在面对“给我做一个淘宝”这样的需求时,都会崩溃的。

我的英语很烂,能学会编程吗?

英语不是学习编程的瓶颈,关键在于理解其概念和原理,以及改变思维方式。虽然几乎所有编程语言的关键字都是英语,但常用的关键字也就那么几个。正如只要会说 Sorry 和 How much,就能去国外旅游一样,编程对英语的要求真心不高。热门语言的相关书籍,常用的软件基本都有中文版。如果你愿意的话,甚至可以用中文来给程序里的变量、函数和类命名。

什么时候开始学编程比较好?我已经工作好多年了,现在开始学还来得及吗?

任何时候开始都不晚,当然越早越好。

中国第一款杀毒软件 KV300 的作者王江民,就是 38 岁才开始学习编程的。至于应该怎么学,从哪里开始,这将是我今年的主要思考方向,敬请期待我后续的公众号系列文章。也许你可以先试试这些网站:

  • http://www.codecombat.com :通过玩游戏来启蒙,有中文版,适合初学者

  • http://www.khanacademy.org :纯英文视频讲解教学,适合学霸和笔记党

  • http://www.codecademy.com :交互式实战,效果最佳,但需有一定基础

后话

曾经何时,想要建立一个网站服务,需要购买动辙数万元的专业服务器,支付昂贵的机房托管和带宽租赁费用,聘请专业的开发人才或团队来研发,再通过广告和运营活动去拉拢用户…… 门槛如此之高,使绝大多数人望而却步,只有企业才能负担得起。

而现如今,云服务器甚至比家里的宽带都便宜了,各种开源技术唾手可得,各种开放平台提供了免费的用户和渠道,一个 APP 通过社交网络可能瞬间火遍全国…… 有了树莓派这样超便宜的卡片电脑,再加上现在各种家电都在向智能化发展,想通过编程在实现自己的一些小创意,真是不要太简单。

我们正身处一个只要愿意思考,就能改变世界的时代。那么你是愿意去改变世界,还是等待被世界改变呢?

参考资料

  • [1] Steve Jobs - The lost interview (1995):http://t.cn/zWfyUhS

  • [2] Obama - Everybody’s Got to Learn How to Code: http://t.cn/RJHRJga



长按以上二维码关注“学习学习再学习”(xiaolai-xuexi),后台输入关键字有自动回复:

输入“理财”,一篇文章推送:《理财系列文章列表(第一部分15篇);
输入“女生”,三篇文章推送;
输入“社交”,一篇文章推送;
输入“利息”,一篇文章推送;
输入“时间”,获得《把时间当作朋友》(第三版)全文在线阅读链接……
输入“分享”,一篇文章推送:《如何做好一场分享?》


评论