有一家饭店的大厨,烧得一手好菜,通过口碑相传,客人从四面八方闻名而来。然而这对饭店的老板来说,并不单纯是一个好消息。因为客人不是奔着饭店,而是奔着大厨的手艺来的。老板必须想方法留住这位大厨,否则他一旦被他人挖走,饭店的生意就会一泻千里了。然而即使老板不惜血本保障了大厨的忠诚度,危险也仍然存在:
大厨劳动或销假的时候,菜品的口味就无奈让顾客称心;
大厨只有一个,如果想在多个中央开分店,那口味也就不能保障了;
大厨再厉害,同时也只能炒一个菜,而顾客越来越多,输入总是供不应求;
大厨年纪大了总是要退休的,如果收徒的话,怎么持续保障师傅的忠诚度呢?
有一天,老板忽然悟到,决定菜品口味的是大厨烧菜的过程,而不是大厨自己。如果大厨违心把本人每个菜的菜谱都写进去,那不就能够请别的厨师来操作了吗?尽管他人依照菜谱烧出来可能达不到原味的 100 分,但 90 分总是能达到的,而这样的差距是个别的食客无奈分辨的。这样只有菜谱在,饭店菜品的品质就能失去保障,扩张店面、开分店什么的就都不成问题了。
于是老板和大厨谈了一个早晨,压服了他把菜谱写进去,而后用菜谱技术入股分成。于是大厨一边炒菜一边解说,让助手把菜谱记下来,交给了老板。老板于是请别的厨师拿着菜谱如法炮制,大厨验收并领导批改菜谱,如此这般数次之后,菜谱就定稿了。
几年后,饭店生意越来越好,开了有数家分店,老板赚了很多钱,大厨也失去丰富的分成,不必再天天靠手艺吃饭了。起初有一位厨师把菜谱偷传了进来,于是这道菜就红遍了大江南北……
故事讲完了,你有什么播种吗?
什么是编程?
在洗衣机呈现之前,人们只能用手来洗衣服,须要通过浸泡、揉搓、漂洗、拧干的一系列流程。而全自动洗衣机的创造使洗衣服的工作人人都能够轻松实现,从而能够将本来用来洗衣服的工夫解放出来去做其余事件。随着洗衣机的一直迭代降级,洗衣服的整个流程最终会被人们忘记,只有设计洗衣机的工程师们理解流程,因为他们负责对其进行优化和改良。
大厨炒菜的过程,和洗衣服的工序,都是流程。什么是流程呢?流程就是_为了_实现一个需要而设计的形式逻辑。而程序就是记录并承载流程的媒介。记录炒菜流程的菜谱,和洗衣机主控芯片里记录了洗衣工序的软件,都是程序。不同的是,菜谱由人来执行,而洗衣工序由机器来执行。
咱们能够再举几个例子:
- 打太极拳的套路是流程,而记录这些套路的拳谱是程序;
- 用钢琴弹奏曲子的指法是流程,而记录这些指法的钢琴谱是程序;
- 老师备课时设计的教学过程是流程,而记录这些过程的教案是程序;
- ……
将炒菜的过程写成菜谱,就是在编写程序,也就是编程。如果你已经记录过相似流程的货色,没准可能是作息时间表(记录了每天必做事件的程序列表)或者交通路线图(记录了去某地的行程),那么其实你曾经在编程了。
所以,编程真的没有那么神秘,对吧?
通过编程,咱们更加透彻地了解并论述了事物的实质,让已经专属于某个人、某个个人、某个中央甚至某个时刻的货色,得以独立的存在和倒退。尽管程序的执行成果未必能让其设计者称心,但它曾经能够脱离设计者而存在,能够被其他人执行、验证和改良。从这个角度来讲,说编程是在发明生命也不为过。
编程能够说是一种标准化的写作。标准化保障了服务和产品的品质,也使大规模复制和扩张成为可能。KFC 正是依赖其详尽到炸薯条的油温、秒数的食品加工手册,才将分店开满世界各地的。陶华碧如果不能将她的豆瓣酱配方和制作过程分明地形容进去,交由标准化生产线去制作的话,那么明天“老干妈”最多只是一个小农村里的作坊级产品,不可能走上咱们的餐桌。
咱们每天的生存,都在和各种技术产品和服务打交道,比方导航、搜索引擎、聊天软件……你可曾想过,这些产品和服务背地的原理是什么?置信除了程序员群体之外,绝大多数人不会去想这些问题,因为:
这跟我没有关系啊!我又不去干这行……
应该只有专业人士能力搞懂吧,我可不行!
能用就行了,想那么多干啥,多累呀!
他们这么想并没有错,因为编程的实质就是:设计一个逻辑流程来实现指定的需要,使调用者无需理解实现细节即可达到目标。
因为程序和编程的狭义概念太过抽象,为不导致概念混同,下文中提到的“程序”和“编程”,特指应用计算机编程语言编写,由机器来运行的程序。
解放工夫和注意力
假如你曾经在某岗位工作了一段时间,依据经验总结进去每天上班前有上面三件事须要做:
A、在公司内网零碎查问某业务当天的数据(约 10 分钟)
B、整顿成日报表并存档(约 15 分钟)
C、把几个外围数据用电子邮件发送给领导(约 5 分钟)
你能够在认真梳理过之后,将这个流程写下来,贴在办公桌前,或者记在脑子里。这天然比那些不晓得流程的人要强得多,你能够确保每个步骤都不被脱漏地执行到(然而这并不能齐全保障)。尽管你曾经花了工夫认真思考过,但每天这样枯燥乏味的流程都须要本人执行一遍……等等,这活我不能够找个秘书来干吗?
当然能够,雇佣别人是一种用金钱换工夫的解决方案。然而这同时又引入了许多新的问题:
你须要花钱(废话)
你须要把要做的事解释给秘书听,并确保他能听懂(沟通老本)
秘书上班或休假时,这些事你还得本人做(有工夫限度)
你要为秘书犯的谬误承担责任(品质得不到保障)
每次秘书犯了谬误,你都须要进行教育(培训老本)
秘书会间接接触业务数据和信息,难保有泄密的可能(安全隐患)
换一个秘书,以上的事件都得再来一遍……
这不是把事件搞简单了吗?人的老本太高,提供的服务又不牢靠。而如果你会编程的话,兴许你能够:
编一个小程序来实现查数据、做报表、发邮件的流程,再配置一个定时工作每天主动执行;
审慎一点的话,能够让程序先发到本人的邮箱,查看没有问题后再转发给领导;
必要的话,还能够让程序在运行出现意外时给你的邮箱或手机发报警告诉;
如果你违心,甚至能够给内网办公零碎间接加上邮件报表这个性能……
假如你本来手工做完 ABC 流程须要 30 分钟,那么你的程序每执行一次,就为你节俭了 30 分钟的工夫。如果你写程序用了三个小时,那么一周就能发出老本,当前全部都是净赚的。如果程序运行的工夫足够长,那么单次运行的均摊老本将趋近于零。能够看出,编程是一种用工夫换工夫的解决方案。
当然,你须要将要做的流程写成机器能读懂的程序;如果需要发生变化,你须要对应地批改程序;如果运行时出了 BUG,你须要调试修复……但更重要的是:程序不拿工资,不可能辞职,不须要劳动,不会闹情绪,不可能犯错,只有你的流程正确,依赖的资源不出问题,它就能够 7 *24 小时始终运行上来。
每当咱们写程序实现了一个需要,就好比造出了一把锤子。今后你遇到相似的问题,都能够拿这个锤子来解决。当然有时会遇到锤子不称手的状况,须要继续地降级和优化。但在大多数状况下,这个锤子都是能够间接拿来用的。也就是说:完全相同的问题,你只须要解决一次就好,不会浪费时间在反复的工作上。
通过编程,你能够将那些枯燥无味的重复性工作中的局部甚至全副,交由机器来接管,这样就能够将你的工夫和注意力从具体的事务中解放出来,去做更有价值的事件。比方钻研和优化工作流程,或者陪伴家人,又或者去读一本书……
体验“开挂”的人生
喜爱网游的敌人可能都晓得外挂这货色,这是指和游戏一起运行、为了晋升游戏体验的小程序。外挂个别分为两类:一是在游戏零碎框架内简化玩家操作的辅助性外挂,提供如主动拾取、主动打怪、改键之类的性能;二是利用游戏破绽营造不平等的舞弊性外挂,提供如开图、减速、无敌之类的性能。
随着游戏行业的迅猛发展,现今很多网游都曾经装备了本来由辅助性外挂提供的性能,辅助性外挂正在逐步沦亡,只剩下舞弊性外挂和衍生的一系列彩色产业链,你懂得。
当咱们说某个人“开挂”时,其实是在说他的体现(数量、速度、精确度……)显著超出失常的领域。当原始土著人碰到应用着各种科技产品的现代人时,大略就是一种“**,这哥们开挂了吧?”的感觉。
要晓得,身材并不强健的人类之所以能驯服地球,就是因为咱们会发明并应用工具来冲破生理的局限,做到本来不可能做到的事件。在行将到来的全信息时代,编程将是发明工具,甚至应用工具的次要办法。咱们天天都在应用的软件和 APP,不论是文字处理、K 歌软件还是搜索引擎,都曾经和咱们的生存融为一体,成为咱们生命的延长。通过应用这些软件,咱们能够一直冲破本人教训和能力上的局限,咱们随时都在给本人“开挂”。
然而大多数人都是在被动地期待他人来满足本人的需要。他们会应用通过敌人举荐、广告宣传等各种渠道推送给本人的软件,而后感叹一下:“哇,竟然还能够这样!”他们只会应用已有软件提供的规范性能,而一些个性化的非凡需要就只能因为软件不反对放弃掉了。这就和穿衣服一样,大多数人只会买规范尺寸穿,如果这里紧那里松,这里长那里短,也就只能忍了。
还有少部分人会被动思考如何去满足本人的非凡需要。他们会想:“如果有 XXX 性能就好了……”他们会被动去寻找能满足本人需要的软件,钻研软件的个性化配置,或者给软件的开发者提性能倡议。同样,谋求共性的人可能会找裁缝为本人量身订做或者批改衣服,使其尽可能地适宜本人。
只有极少数的人有能力本人去实现那些他人不能满足的需要。他们能在原有软件的根底上开发插件,对软件进行二次开发,甚至写出一个全新的软件。同样,谋求完满的人可能会亲自设计衣服,并把一件衣服不停地改来改去,直到本人彻底称心为止。
如果说学好英语能为你的世界关上一扇门,让你领有更多的抉择的话;那么学好编程就能让你有机会以“上帝视角”来意识和革新这个世界,并领有简直有限的可能性。因为在事实中的所有最终都会被信息化,而你能够通过编程来对信息做任何模式的加工和解决,只有你想得到,就能做失去。
你想体验“开挂”的人生吗?那就连忙开始学编程吧。
造就深刻的思维形式
每个人都应该学习编程,因为它将教会你如何思考。——苹果创始人 乔布斯 [1]
思考,是人之所以为人的行为,而编程是一种对人的思考进行再思考的行为。咱们不须要把每件事件想分明,就能够在事实社会中生存。对某些从事机械性操作的职业来说,甚至齐全不须要进行思考。然而在编程时,咱们只有在想分明之后,能力把程序写进去。在编写正确、高效、优雅的程序的同时,咱们也在塑造本人的大脑,让它能思考得更分明、运行得更高效。
编程要求咱们主观地去思考事物的实质,将注意力放在事物自身,而不是事物与咱们的关系上。当现代的妇女在河边洗脏衣服时,她可能在想:“河水好冷啊……这衣服色彩真丑陋……我家孩子为啥这么淘气……”而当咱们在为洗衣机设计程序时,只会想:“哦,这有一堆脏衣服须要洗”。其实很多本来困扰你许久的问题,只有跳出“我”的领域,进行“忘我”的思考,就变得特地简略和容易解决。
编程是将人的想法“实体化”的过程,这要求咱们进行更深刻、更粗疏、更全面地思考。为了实现一个需要,你必须对其原理和运行流程理解得非常透彻,否则就无奈用编程语言准确地形容进去让机器去执行。在实体化的过程中,想法的构造缺点和逻辑破绽会天然凸显进去,你总会发现存在没有思考到的可能性,以及须要进一步思考的细节。
编程要求咱们可能对事物和流程进行各种维度上的拆分,并在不同的抽象层次上进行残缺自洽的思考,这使咱们有可能去解决那些规模无比宏大的问题。通过在抽象层次上的划分,咱们能做到在宏观上思考整体的同时,也能在宏观上思考每个细节。通过正当拆分后的细粒度需要简单明了,更适宜团队合作,其成绩还能够在不同场景下进行复用。在一个成熟的软件或互联网公司,上千名工程师一起开发同一款产品是很常见的,而这种合作的规模除了行为艺术以外,简直是不可设想的。
编程是一直解决问题的过程,也是不断完善解决问题的方法论的过程。一个优良的程序员总是解决问题的高手。在编程的各个阶段(需要定义、方案设计、编码实现、调试纠错……)中,都将面临无穷无尽的问题。这个问题要不要解决?什么时候解决?其本源是什么?须要思考哪些方面?如何做取舍?有哪些计划可供选择?抉择的准则是什么?……解决问题的方法论开展来讲能够写一本书了,且容我有工夫另撰一文来表。
在将来更好地生存
半个世纪以前,美国有 70% 的人口在农场工作,随着自动化耕种的大面积遍及,当初只剩下不到 1%。——凯文·凯利《必然》
从登陆月球到生产纳米机器人,咱们曾经通过设计并应用各种机器实现了人类本来不可能亲手做到的各种事件。迄今为止,人类从事的简略重复性的工作(如洗衣、耕种、制作等)曾经简直齐全被机器接管,人类的工作方向曾经转向对机器的研发和保护。而那些须要简单常识和精细操作的工作(比方驾驶汽车、外科手术等)也正在被机器逐渐接管。
洗衣机解放了家庭主妇们的双手,全自动流水线则辞退了工厂里的大部分工人。只有在一些正享受人口红利的发展中国家(比方中国和印度),因为技术引入老本比人工成本高,目前膂力劳动者还有一些生存的空间。但技术的老本会不可阻挡地疾速继续降落,而人口红利的窗口期将疾速隐没,拐点很快就会到来。
资本是具备意志的,且不为兽性所扭转。当产出的品质不变,而技术的老本显著低于人工成本时,简直所有的膂力劳动者都会就业。机器不知疲倦,不会埋怨,干得比人又快又好又省钱,人类怎么可能和机器竞争?
与此同时,人工智能正在将逐步接管人类的简略重复性思考流动(如寻路、翻译等),人类只须要下达命令、制订准则和做出抉择即可。人工智能甚至曾经进入了那些被人们认为是“人之所以为人”的畛域:写作、编曲、绘画……
Google 的 AlphaGo 战败李世石是一个里程碑式的事件,它证实了人工智能曾经能够在人类最善于的思考畛域超过人类。当初最优良的棋手都在向 AI 学习下棋,职业棋手和 AI 进行日常训练成了常态。纯机比纯人强,人机比纯机强,这早已是棋界的共识。
当人工智能在某个思考畛域的能力靠近或超过人类(这在很多畛域曾经做到了)时,而其老本极其低廉(这是早晚的事)时,在资本意志的作用下,这个畛域就会将不可逆地被人工智能迅速霸占。咱们明天曾经习惯了应用计算器来取代大脑进行数字计算,在不远的未来,咱们也会习惯将本来须要本人思考的许多问题交给由有数程序组成的人工智能来解决。在能够预感的将来,所有构建在教训和技能根底上的非创造性工作岗位都会隐没,人类的工作方向会转变成对人工智能的研发和保护。
人工智能全面遍及的时代正在以光一样的速度向咱们飞奔,可能下一秒就将咱们远远地甩在身后,连车尾灯都看不到。届时,简直所有的工作都将和人工智能密不可分。只有那些了解人工智能,可能很好地和人工智能单干,并帮忙改良人工智能的人,能力在那个时代更好地生存上来。
每个人都应该尽早开始学习编程,我的孩子起步太晚了,我感觉应该在教他们 ABC 和色彩的时候就开始。——美国第 44 任总统 奥巴马 [2]
在《将来咱们该学什么语言?》一文中,我曾畅想过将来可能呈现的脑接口技术,以及与之配套的人机共用结构化语言。届时咱们的大脑将间接接入互联网和人工智能,能够霎时将须要的常识和信息下载到大脑中……咱们将成为神一样的存在。但前提是你必须具备编程根底,能力享受这一革命性技术带来的成绩。
什么,那时候你还没学会编程?能够洗洗睡了。
我晓得你会问……
可是我又不筹备当程序员啊,有必要学编程吗?
你可能会开车,还是个老司机,很会享受驾驶的乐趣,但你未必违心去当一名出租车司机吧?同理,学习编程不肯定非要做程序员,但却能使你领有全新的视角、深刻的思维形式和效率优化的思维,这都将成为你重要的软实力。在不久的未来,编程将会变成像英语、驾驶一样人人必备的技能。到那时,你心愿本人是一名老司机,还是搭车族呢?
“学这个有用吗?”其实是一个很可怕的想法。因为很多货色当初看起来并没有什么用,大多数人就放弃了学习,而只有多数人会抱着“学学看能有什么用”的念头去尝试。在之后的某一天,真正须要这项技能和常识时,那些抉择放弃的人只能感叹“要是过后……就好了!”,而抉择学习的人则会惊喜地发现“哇,原来还能用在这里!”……所谓的“惊喜”和“运气”其实就是这样一回事:在人不知; 鬼不觉间,曾经提前做好了筹备。
那我能不能当初致力赚钱,而后雇一个业余的程序员呢?
不错,你是能够找一个程序员来实现你的想法,但咱们之前请秘书时遇到的诸多问题又会接踵而来。更重要的是,如果你不会编程,你可能连个靠谱沾边的想法都提不进去。就好比没有见过汽车的人,只会想着让他人为他造一辆更快的马车。只有在了解了某个事物的原理之后,这个事物的概念能力在你的脑中清晰起来,能力真正融入你的认知结构中。
有了清晰的概念,你能力对其进行思考,判断它可能用来做什么,不能做什么。如果概念不清晰,你甚至都无奈讲清楚本人的需要,更难和程序员进行沟通和单干。每一位程序员在面对“给我做一个淘宝”这样的需要时,都会解体的。
我的英语很烂,能学会编程吗?
英语不是学习编程的瓶颈,关键在于了解其概念和原理,以及扭转思维形式。尽管简直所有编程语言的关键字都是英语,但罕用的关键字也就那么几个,热门语言的相干书籍也都有译版。如果你违心的话,甚至能够用中文来给程序里的变量、函数和类命名。正如只有你认得 start / save / load / quit 这几个单词,就能去玩英文游戏;只有会说 sorry 和 how much,就能去国外游览一样。
我曾经工作好多年了,当初开始学还来得及吗?该从什么中央开始?
任何时候开始都不晚,当然越早越好。中国第一款杀毒软件 KV300 的作者王江民,就是 38 岁才开始学习编程的。至于应该怎么学,从哪里开始,这将是我往年的次要思考方向,敬请期待我的后续系列文章。兴许你能够先试试这些网站:
http://www.codecombat.com:通过玩游戏来启蒙,有中文版,适宜初学者
http://www.khanacademy.org:纯英文视频解说教学,适宜学霸和笔记党
http://www.codecademy.com:交互式实战,成果最佳,但需有肯定根底
后话
已经何时,想要建设一个网站服务,须要购买动辙数万元的业余服务器,领取低廉的机房托管和带宽租赁费用,延聘业余的开发人才或团队来研发,再通过广告和经营流动去笼络用户……门槛如此之高,使绝大多数人望而生畏,只有企业能力负担得起。
而现如今,云服务器甚至比家里的宽带都便宜了,各种开源技术唾手可得,各种开放平台提供了收费的用户和渠道,一个 APP 通过社交网络可能霎时火遍全国……有了树莓派这样超便宜的卡片电脑,再加上当初各种家电都在向智能化倒退,想通过编程在实现本人的一些小创意,真是不要太简略。
咱们正身处一个只有违心思考,就能扭转世界的时代。那么你是违心去扭转世界,还是期待被世界扭转呢?