迭代思维:如何高效编程?
在编程的路上,你是不是曾有过这样的经历:虽然学会一门编程语言后会写代码了,但是有时写出的代码可能并没有想象的那么好。比如:
- 你的代码只要没有经过测试,发布上线后总是会频繁发生故障;
- 每次你修改完代码后,程序总会出现各种意外问题;
- 当别人读完你的代码后,会说“逻辑太复杂”“代码看不懂”“代码不够简洁”之类的话;
- 每隔一段时间后你看自己写的代码,发现不仅可读性差,而且很多逻辑连自己也看不懂了;
- 你接手了离职同事留下的代码,却因为文档和注释太少,花了很长时间才看懂代码中的关键逻辑;
- 你想在代码中新增功能,却不知道该先改动哪里,不知道改动的影响范围有多大。
后来你手头上必须完成的工作任务越积越多,编程的效率变得越来越低,甚至有时还会影响到项目交付。
那为什么你的编程效率不高呢?这是因为你把提升编程效率 等同于提升编码速度了。如果你想成为一名真正的高效编程者,除了代码写得快以外,还得学会一些其他的方法和技巧。
因此,今天我们就来聊聊高效编程中的那些关键技巧。
什么是高效编程?
这里我先分享一个我的故事。刚学会编程时,我以为:高效编程 = 高效写代码。于是开启了疯狂写代码模式,在不停地编码与调试中,度过了一年又一年,并以此沾沾自喜。但这样坚持了很多年后,却慢慢发现自己的编程效率不仅没有提高,反而越来越慢。
这时我意识到,整体编程效率之所以无法提升,是因为我一直都只是关注写代码的效率。这便带来三个问题:
- 只关心代码是否正常运行,而对最终是否满足用户需求不在意;
- 容易陷入代码细节而忽略整体,比如,系统设计、项目进度、与他人协作等;
- 不太关心可测试性、可维护性,以及简洁的高质量代码该怎么写。
简言之,正是因为太过于关注写代码,让我忘记了很多其他重要的事。比如,项目移交后,代码可能会被别人维护,代码是否容易测试,代码是否健壮,等等。
当从更广的维度去审视写代码这件事时,写代码的效率只是整体编程效率的一部分,若只是盯着这一部分去提升或优化,很可能会顾此失彼,最后像我一样整体效率压根没有提高过。
所以说,高效编程除了需要提升细节上的编程效率外,还需要你能时常跳出细节思维,从整体的工作流程上去思考与改进。
这样总结来说,高效编程其实是一种高效的工作流。
如何高效编程?
高效编程应该具备下面五个要素:
高效编程 = 原则 * 工具 * 编码 * 反馈 * 迭代
合理运用这些要素,才能真正地提升高效编程能力。这种能力,一方面来自编程的实践积累,另一方面也来自各种技巧的合理使用。
1. 建立原则
建立原则是高效编程的第一步。
为什么建立原则很重要?因为原则能让在你编程时,不会轻易遗忘一些重要的事情,比如,项目进度、代码质量、会议效率等。
在过去编程实践中,我踩过很多坑,这里我为你总结了三条有效原则。
第一条原则:问题到你为止。你一定遇见过这样的情形,当你发现某人的模块功能出现问题时,你去咨询对方,对方却对你不理不睬,然后回复一句:去找 XXX,这不是我的问题。从你的角度来看,你遇见了问题只是想要咨询与讨论,但是对方给你的感觉却像是在推卸责任。
千万记住,无论是不是你的问题,你都应该尝试去终结这个问题。
因为这样做不仅能让你规避推卸责任的思维习惯,还能让你提升解决问题的实力。比如,不是你的问题,你会尝试和对方一起找到这个问题的来源;是你的问题,你会思考下一次应该怎么做才能不再出现类似的问题。
最后,你会发现越是经常这样做,你在别人心中的分量就会越重,因为问题一到你这里就终止了。
第二条原则:多读、多写代码。编程是一门重视实践的技术,你不写代码就一定不能提升对代码细节的感受力。
提升代码的感受力是提升编程效率的一种途径,有两个办法。
- 方法一:多读别人的代码。无论是优秀的开源框架的源代码,还是通篇 if-else 的无注释业务代码,你都应该多读,通过多读才能发现什么是优秀代码,什么是烂代码。
- 方法二:多写自己的代码。编程犹如跑马拉松,需要付出很多汗水真实地训练,才有可能完成一次比赛。不要被一些原理讲解所误导,原理学习很重要,但是真实的编码同样重要,因为代码从编写到调试再到运行、发布、部署,会出现很多复杂的问题,解决这些问题同样对提升编程效率有很大的帮助。
第三条原则:打破砂锅问到底。其实,任何时候,对于问题都要有“打破砂锅问到底”的精神。
具体提问的技巧,可以采用 5WHY 法。例如:
Q:你在做什么? A:解决一个 Bug。 Q:你为什么要解决这个 Bug? A:测试提了一个 Bug。 Q:为什么测试会提这个 Bug? A:测试认为这是一个 Bug。 Q:为什么测试会这么认为? A:……❞
你发现没有,当你不断提问的时候,也是发现问题本质的一个过程。而解决编程上的本质问题越多,越能反过来提升编程上的效率。
2. 打磨工具
除了 IDE 编程工具和编程语言环境的使用外,要想提升编程效率,你应该还需要一个组件实验环境和一个工具代码库。
从 IDE 的安装、多种编程语言包到 Git 等基础工具的配置,作为一个编程者,你一定非常熟悉了。但是,在编程过程中,除了写代码外,你还需要大量地阅读代码和实验新工具,比如,开源的数据库、MQ、缓存组件等。
为什么这么说呢?
当你在平时任务非常繁重的情况下,如果没有一个可以立即实验操作的环境,那么你就很容易因为一点点麻烦而放弃新的尝试。而这背后其实隐藏了一个本质问题:长期做事时缺乏提前准备的习惯。
编程效率看上去是当前的某种执行效率,但是如果长期都没有提前准备的习惯,那么效率就会变得越来越低,因为你很可能一直都在做低效重复的事情,一直没有新的突破。比如,工作十年使用的是第一年就学会的技能方法。
所以,你平时如果有空闲时,应该多尝试搭建一下新组件的实验环境,一方面可以熟悉组件特性,另一方面是培养你编程上多准备的习惯。
至于工具代码库,虽然现在网络上确实有很多很好用的工具库,但是我依然强烈建议你要试着建一个自己的工具库。这个工具库存储的可以是你工作中常用的自动化测试脚本、一段简练的代码片段、对某个工具的二次或三次封装等。
更重要的是,在这个过程中,通过对工具的打磨,你能找到一些不变的代码特性,学习到优秀的代码设计应该怎么做。
这样随着时间的推移,你的编程效率会随着工具效率的提升而变得更高。
3. 实践编码
高效编程是一个不断实践的过程,虽然写代码不是全部,但不写代码就不是编程。
“高效”的反面是“低效”,低效编程有如下三大特征。
第一个,靠运气编码。也就是我们通常所说的复制粘贴编码,或面向搜索编码。
这样的编码会造成思考停滞,虽说会让你在未来的几年里沉浸在每天敲代码的喜悦里,从短期看似乎是在高效编程,但把目光放长远点,这是典型的长期低效编程,一直在原地踏步。
为什么说不要靠运气编码?因为运气有时靠不住。你应该不断积累你的编程实力,最后用实力来解决编程问题。
第二个,重复硬编码。我经常对身边的人说,我不反对硬编码,但我反对很多次重复硬编码。
因为硬编码有时是无奈的做法,比如,领导立即要一个都还没有上线的数据做报告,或者立即就要演示一个 Demo,特性都是紧急,甚至有可能做完了以后再也不会用到。
如果你一直这样重复硬编码,带来的后果会很严重,不仅会把系统搞崩,还会让维护代码的其他人非常痛苦。更重要的是,你会忘记了真正的高效是抽象、封装和复用,最后被更多的编码任务压垮。
第三个,写 PPT,开会。这个就比较好理解了,但是估计你会经常遇到或者曾经头疼过。
PPT 可以作为总结时的有效材料,但是编程不是写 PPT,PPT 写得多,编码时间自然剩得少。提升编程能力,必须要多写代码,才能发现更多问题,然后再去总结归纳、写 PPT。千万不能本末倒置。
至于开会,本意是为了与更多的人沟通、对齐一致,但是开很多无效的会,会耽误提升编程效率,毕竟编程需要思考时间,同时还需要编写、调试、测试时间。
在实践编码这一步,如何做到高效编程呢?你应该已经想到了,那就是要避免低效编程,避免以上做法。
4. 及时反馈
编程时只写代码是不够的,想要获得更高的效率,还要学会及时反馈遇见的问题。
你可能认为,编程时需要更多的思考时间,即便遇见问题只要自己能解决就行,与人沟通会浪费编程的时间。
沟通的确会在某种程度上降低写代码的效率,但是它会在另外的地方补足:团队效率。
你应该知道,现代大型软件产品的开发工作都是团队合作编程,很少有一个人单独完成的。(当然,也有大神人物独立完成的产品,但毕竟是少数。)
如果你开发完了自己的模块,却不及时反馈给团队其他成员,那么极大的可能是,团队其他成员也在等待着你的模块,你们相互等待,这样整体效率其实很低。
当你及时反馈问题时,团队成员也能通过你的进度来及时调整他们的计划,团队整体的协作效率无形中便提高了。另一方面,在编码过程中你不断与他人沟通,不仅能让对方更容易理解你的代码,也能及时发现一些低级错误,降低 Bug 的修复成本。
这也是为什么很多开发团队都会要求每日站立早会和平时多沟通的原因,就是为了及时地让大家做反馈,在开发早期就能发现并解决问题。
其实,不管团队有没有要求,你都应该更进一步地要求自己时常这样做,这会给你带来真正的效率提升。
5. 迭代更新
什么是迭代?简单来说,每一次对过程的重复就被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。迭代有如下三个关键特征。
- 每一个迭代都应该有输入、处理和输出。比如,你在负责设计某个数据中台的数据清洗服务中的一次功能优化时,输入可能是各种新的异构类型的数据,处理是做数据的过滤与保存,输出的是某种规范的结构化数据。这就是我们通常说的一次功能迭代。
- 记录版本。每一个迭代通常又叫一个版本。为什么要记录版本?因为版本要作为一个历史记录被反复查看。
- 不断更新。当你有了版本和迭代输出,一个迭代才能被更新,也就是在既有版本下对输入、处理、输出的整体优化。
编程本身就是一个重复的过程,你可能经常在用迭代,不过可能会在无意间忽略了迭代的关键点——记录版本。
当你在编程时,会面临一个问题:每一次的代码修改都会或多或少覆盖原有的代码,久而久之,代码可能是最新的,功能看上去也是最全的,但你想要回顾时,却发现历史版本太难寻找,比如,一直使用 1.0-SNAPSHOT 的版本号。
如果没有历史版本,你会很快忘记过去开发过哪些功能、没开发过哪些功能,虽然功能不断在迭代前进,但一年后你几乎就会忘记你曾经做过什么。
正确的做法是:记录版本并且记录每一次关键修改信息。
记录版本很容易理解,可以使用语义版本规范(主版本.次版本.修订号)或者时间版本(20200111.fix)等。
更重要的是记录每一次关键修改信息,这是下一次迭代更新的输入。 这样做的好处在于,当你修改一个功能时,你能清楚地知道你新增或修改了哪些功能,而功能实现的背后其实是你如何实现这个功能的思路。
比如说,你开发了一个上传功能,在 V1.0 版本只支持 .pdf 格式,在 V2.0 版本时你希望支持 .doc 和 .xlsx 格式,如果只是记录版本号,你最多是大概知道功能有什么变化,但如果你记录的是:
V1.0.0,支持 .pdf 格式【实现:封装三方库 iText 】【0.5 天】【遇见 XXX 问题】【2020-01-11】 V2.0.0,计划支持 .doc 和 .xlsx 格式【实现:封装三方库 easyexcel】【1 天】
这样的关键信息,可以不断扩充(甚至可以是一篇文档),成为你编码结束后的一次简单总结。不要小看这次总结,在时间过去很久后,再看时你会发现,原来过去你写代码时是这样想的,用时居然这么久,而且还用了很老旧的库,等等。
最重要的是,你过去的经验没有被浪费,你能从信息中获得思考,更能减少重复犯低级错误的概率。
总结
如果你时常把编程干成这样:编程 = 写代码 + 写代码 + 写代码……那么你一定要及时停下来想想,编程到底意味着什么。
编程 ≠ 写代码。 不要把你的有效时间,浪费在只写代码上,这样你的编程能力甚至个人成长都会变慢。
编程不是一个体力活,编程应该是一个综合的脑力活:编程 = 写代码 + 讨论 + 学习 + 反思。
你在学习编程知识和编程技巧的同时,应该多和同事讨论编程,从项目中积累更多实践的经验,不断应用到下一次的编程中去。
每一次的编码实践都是你提升效率的好机会,更别忘记及时反馈你遇到的问题,或者主动与他人分享你的实践想法。
只有当你把编码变成一次又一次的迭代,才能从短期的高效编程变成真正的长期高效编程。
如果此文对你有所帮助,希望能随手点个转发!
End
上一篇: Original | 一篇关于无模型预测的文章(强化学习 II)
下一篇: python 迭代器 - 迭代器获取 - for 循环 - 生成器 - 屈服 - 生成器表达式 - 常用内置方法 - 面向过程的编程 - 05
推荐阅读
-
迭代思维:如何高效编程?
-
php 目录迭代器 RecursiveDirectoryIterator 如何提高效率
-
反传销网8月30日发布:视频区块链里的骗子,币里的韭菜,杜子建骂人了!金融大V周召说区块链!——“一小帮骗子玩一大帮小白,被割韭菜,小白还轮流被割,割的就是你!” 什么区块链,统统是骗子 作者:周召(知乎金融领域大V,毕业于上海财经大学,目前任职上海某股权投资基金合伙人) 有人问我,区块链现在这么火,到底是不是骗局? 我的回答是: 是骗局。而且我并不是说数字货币是骗局,而是说所有搞区块链的都是骗局。 -01- 区块链是一种鸡肋技术 人类社会任何技术的发明应用,本质都是为了提高社会的生产效率。而所谓区块链技术本质不过是几种早已成熟的技术的大杂烩,冗余且十分低效,除了提高了洗钱和诈骗的效率以外,对人类社会的进步毫无贡献。 真正意义上的区块链得包含三个要素:分布式系统(包括记账和存储),无法篡改的数据结构,以及共识算法,三者互为基础和因果,就像三体世界一样。看上去挺让人不明觉厉的,而经过几年的瞎折腾,稍微懂点区块链的碰了几次壁后都已经渐渐明白区块链其实并没有什么卵用,区块链技术已经名存实亡,沦为了营销工具和传销组织的画皮。 因为符合上述定义的、以比特币为代表的原教旨区块链技术,是反效率的,从经济学角度来说,不但不是一种帕累托改进,甚至还可以说是一种帕累托倒退。 原教旨区块链技术的效率十分低下,因为要遍历所有节点,只能做非常轻量级的数据应用,一旦涉及到大量的数据传输与更新,区块链就瞎了。 一方面整条链交易速度会极慢,另一方面数据库容量极速膨胀,考虑到人手一份的存储机制,区块链其实是对存储资源和能源的一种极大的浪费。 这里还没有加上为了取得所谓的共识和挖矿消耗的巨大的能源,如果说区块链技术是屎,那么这波区块链投机浪潮可谓人类历史上最大规模的搅屎运动。 区块链也验证不了任何东西。 所谓的智能合约,即不智能,也非合约。我看有人还说,如果有了智能合约,就可以跟老板签一份放区块链上,如果明年销售业绩提升30%,就加薪10%,由于区块链不能篡改,不能抵赖,所以老板必须得执行,说得有板有眼,不懂行的愣一看,好像还真是那么回事。 但仔细一想,问题就来了。首先,在区块链上如何证明你真的达到了30%业绩提升?即便真的达到老板耍赖如何执行? 也就是说,如果区块链真这么厉害,要法院和仲裁干什么。 人类社会真正的符合成本效益原则的是代理制度。之前有人说要用区块链改造注册会计师行业,我不知道他准备怎么设计,我猜想他思路大概是这样的,首先肯定搞去中心化,让所有会计师到链上来,然后一个新人要成为注册会计师就要所有会计师同意并记录在链上。 那我就请问了,我每天上班累死累活,为什么还要花时间去验证一个跟我无关的的人的专业能力?最优做法当然是组织一个委员会,让专门的人来负责,这不就是现在注册会师协会干的事儿吗?区块链的逻辑相当于什么事情都要拿出来公投,这个绝对是扯淡的。 当然这么说都有点抬举区块链了,区块链技术本身根本没有判断是非能力,如果这么高级的人工智能,靠一个无脑分布式记账就能实现的话,我们早就进入共产主义社会了。 虽然EOS等数字货币采用了超级节点,通过再中心化的方式提高效率,有点行业协会的意思,是对区块链原教旨主义的一种修正,但是依然无法突破区块链技术最本质的局限性。有人说,私有链和联盟链是区块链技术的未来,也是扯淡,因为区块链技术没有未来。如果有,说明他是包装成区块链的伪区块链技术。 区块链所涉及的所有底层技术,不管是分布式数据库技术,加密技术,还是点对点传输技术等,基本都是早已存在没什么秘密可言的技术。 比特币系统最重要的特性是封闭性和自洽性,他验证不了任何系统自身以外产生的信息的真实性。 所谓系统自身产生的信息,就是数据库数据的变动信息,有价值的基本上有且只有交易信息。所以说比特币最初不过是中本聪一种炫技的产物,来证明自己对几种技术的掌握,你看我多牛逼,设计出了一个像三体一样的系统。因此,数字货币很有可能是区块链从始至终唯一的杀手应用。 比特币和区块链概念从诞生到今天已经快10年了,很多人说区块链技术在爆发的前夜,但这个前夜好像是不是有点过长了啊朋友,跟三体里的长夜有一拼啊。都说区块链技术像是90年代初的互联网,可是90年代初的互联网在十年发展后,已经出现了一大批伟大的公司,阿里巴巴在99年都成立了,区块链怎么除了币还是币呢? 正规的数字货币未来发展的形式无外乎几种,要么就是论坛币形式,或者类似股票的权益凭证等。问题是论坛币和股票之前,本来也都电子化了,区块链来了到底改变了什么呢? 所有想把TOKEN和应用场景结合起来的人最后都很痛苦,最后他们会发现区块链技术就是脱裤子放屁,自己辛苦搞半天,干嘛不自己作为中心关心门来收钱?最后这些人都产生了价值的虚无感,最终精神崩溃,只能发币疯狂收割韭菜,一边嘴里还说着我是个好人之类的奇怪的话。 因此,之前币圈链圈还泾渭分明,互相瞧不起,但这两年链圈逐渐坐不住了,想着是不是趁着泡沫没彻底破灭之前赶快收割一波,不然可能什么都捞不着了。 前段时间和一个名校毕业的链圈朋友瞎聊天,他说他们“致力于用区块链技术解决数字版权保护问题”,我就问他一个问题,你们如何保证你链的版权所有权声明是真实的,万一盗版者抢先一步把数据放在链上怎么办。他说他们的解决方案是连入国家数字版权保护中心的数据库进行验证…… 所以说区块链技术就是个鸡肋,研究到最后都会落入效率与真实性的黑洞,很多人一头扎进链圈后才发现,真正意义上的区块链技术,其实什么都干不了。 -02- 不是蠢就是坏的区块链媒体 空气币和区块链的造富神话,让区块链自媒体也开始迎风乱扭。一群群根本不知道区块链为何物的妖魔鬼怪纷纷进驻区块链自媒体战场,开始大放厥词胡编乱造。 任何东西,但凡只要和区块,链,分,分布式,记账,加密,验证,可追溯等等这些个关键词沾到哪怕一点点,这些所谓的区块链媒体人就会像狗闻到了屎了一样疯狂地把区块链概念往上套。 这让我想起曾经一度也是热闹非凡的物联网,我曾经去看过江苏一家号称要改变世界的“物联网”企业,过去一看是生产路由器的,我黑人问号脸,对方解释说没有路由器万物怎么互联,我觉得他说得好有道理,竟无言以对。 好,下面让我们进入奇葩共赏析时间,来看看区城链媒体经常有哪些危言耸听的奇谈怪论 区块链(分布式记账)的典型应用是*?? 正如前面所说,真正意义上的区块链分布式记账,不光包括“记”这个动作,还包括分布式存储和共识机制等。而*诞生远远早于区块链这个词的出现,勉强算是“分布式编辑”吧,就被很多区块链媒体拿来强行充当区块链技术应用的典范。 其实事实恰恰相反,*恰恰是去中心化失败的典范,现在如果没有精英和专业人士的编辑和维护,*早就没法看了。 区块链会促进社会分工?? 罗振宇好像就说过类似的话,虽然罗振宇说过很多没有逻辑的话,但这句话绝对是最没逻辑思维的。很多区块链自媒体也常常用这句话来忽悠老百姓,说分工代表效率提高社会进步,而区块链“无疑”会促进分工,他们的理由仅仅是分工和分布式记账都共用一个“分”字,就强行把他们扯到一起。 实际情况恰恰相反,区块链是逆分工的,区块链精神是号召所有人积极地参与到他不擅长也不想掺合的事情里面去。 区块链不能像上帝一样许诺他的子民死后上天国,只能给他们许诺你们是六度人脉中的第一级,我可以赚后面五级人的钱,你处于金字塔的顶端。
-
数据驱动的用户界面迭代,如何设计简单高效的前端 AB 实验程序?
-
金融科技的高效省力秘籍:打造全面连接、全景覆盖、智能化的数字化运营体系" - 当下金融科技运营:挑战与机遇共存的时代解读 在快速发展的数字技术和企业数字化转型的大背景下,中国金融科技产业步入了提质增效的新阶段。面对市场的起伏变革与不确定性,金融机构需积极拥抱创新,灵活运用新技术,确保在竞争激烈的市场环境中稳固立足。 - 面临的双重考验: 1. 技术迭代压力:持续跟进行业内的科技革新,掌握新兴工具和平台,时刻应对瞬息万变的市场需求是金融科技运营的一大挑战。 2. 安全与隐私挑战:伴随着网络安全风险加剧和数据泄漏频发,如何强化信息安全体系、防范攻击、维护客户资金及隐私安全显得尤为重要。同时,伴随金融科技公司崛起,个人隐私权保障愈发关键。 - 喜人的发展空间: 1. 提升运营效益与降低成本:借助数字化技术,实现流程自动化、信息整合以及数据分析等,有效提升工作效能并缩减运营成本。 2. 扩大市场份额与增收途径:利用数字化手段拓宽销售渠道,优化用户体验,吸引更多用户并带动收入增长。 3. 加强客户联系与提升满意度:通过数字化科技运营,企业能更好地与客户互动沟通,增强客户信任感与忠诚度。 - 构建金融科技降本增效的核心驱动力:实施“全感知、全链接、全场景、智能”的科技运营体系升级路径
-
原题简化版: 1. 赚6万每月的大咖秘籍:不能透漏细节的职业智慧,只有在未设防的领域不断探索、积累,到某天突然亮剑,旁人惊讶之余难以轻易赶超,这时候你就筑起了自我优势的"护城河"。 2. 成功达人秘诀揭秘:广泛交往、善言推销或直接跑业务的人总能在短时间内发现商机,关键在于抓住每一次客户互动中的机遇。 3. 编程族别再低头苦干:要学会抬头看看,发掘自身还能挖掘哪些潜力技能,尝试将其转化为创新商业模式,这才是值得我们在闲暇时光深思的问题。 4. "望洋兴叹"不如实际行动:尽管无法复制他人的整套成功路径,但我们能学习他们的思维方式和财富增长策略。看到马云早期互联网的成功,固然令人艳羡,但别沉溺于羡慕嫉妒恨,而要思考如何突破自我局限。 5. 对待心灵鸡汤和焦虑营销需理性:别被鸡汤和焦虑文章牵着鼻子走,它们只会制造紧张情绪,实际对你的成长帮助有限。与其慌乱不安,不如冷静分析,找出真正适合自己的改变之道。
-
程序员如何运用编程思维找到真爱?
-
搞定 Lua 迭代器,让你的编程更加高效!