程序员肺腑之言:5 大法则成为更出色的开发者 | 原力计划
作者 | 三钻
出品 | CSDN博客
先思考,后设计,再下手
多数拿到新功能需求,大致有思路就直接下手开始写代码,半天下来发现这个需求或者功能越想越复杂。前进的路开始迷茫,内心越来越烦躁(甚至开始埋冤产品,这个需求怎么搞那么复杂,太坑了!),秃头的噩梦开始了。(╯ಠ_ ಠ)╯
其实开始写代码之前,思路就没有整理清楚或者目标不明确,想着想着就偏离了初衷。越深入考虑就越复杂,考虑到解耦代码,封装服务e q = /,c d - t r n ^ !后面的手慌脚乱。
深度思考
投入代码的海洋之前,我们需要先深度思考这个功能需求,整理清楚它的目的,场景,难点。
- 明确目的——明p n R A T b 5 , ]确功能需求的目的,了解清楚它是用来做什么,为了达, = j到什么目的。
好比如现在是要开发一个文章搜索。一听到这个,你会想到什么呢?文章标题搜索?全文搜索?拆词搜i S e索?标签c e R { i化搜索?还能想到更多各式各样的搜索功能可以在这个功能需求中实现。如果不明确目的是什么,可能一开始就想复杂了。最终可能只是o o F需要一个简# K j单的标题搜索而已。而我们花了半天在想一大堆的可能性,系统要承载这个功能需要如何设计~ , } + s $。
- 使用场景——场景M 1 J z } y ] N #因素决定了这个功能的技术架构,也决定它的难度等级。
那场景到底是i [ v ! ^ . 0 K什么?其实就是这个功能规模的影响因素& D q O d,举个例子:后端来说场# n L @ j /景可以是这J 6 @ P ` ^个文章搜索涉及的数据量级,还有使用的用户量级和并发量Z M $ w C级。这些都是会直接关系到后端架构的设计,和代码的编写策略。那如果[ $ K 是前端呢?前端要考虑的因素有:这个搜索是否有重复使用性(是否需要封装成组件),是否需要加强的交互(比如,实时联想历史搜索或者关键词o 5 ;),是否涉及前端需要数据与交互结合处理数据来达到一些特殊交互。这些都是直接和前端的实现方式息息相关的。
- 分析难点——明确目的,锁定场景后,就可以开始解刨功能需求找到技术难点。
注意一个误区,这个思考过程不是决定技术架构和策略,这里只是单纯通过已有的关联性系统功能,技术能V w t u . ,力范围,数据量级,用户量级,开发时效等因素排查出这个功能需求开发的难点。如果在这里就开始考虑到设计和策略,我们就会过多的I [ + T u G *出一些细微的问题和缺陷,通过这个过程,你的逻辑思路R 2 ) _ u N m会得到优化和强化。2、探讨— “集思广益”,集合大家的力量必定比你一个人想强,所d k F以设计出你的架构和逻辑图后,可以与你的伙伴一起探讨和分享。你会发想TA们可以看到你看不多的角度和观点。从而可以更加优化你的设计和逻辑。如果你有看过我写的《] y h p 7 l Y q如果高效学习编程》,应该知道“小黄鸭教学法”,在你讲解你的设计和逻辑思路的过程,从思想转化为语言的过程,你已经在重新整理了一片你的设计思路和逻辑。你可能会在过程中发现一些你预想不到的全新观点。3、ETC原则 i X l L E— “Easy to change” 易于改编原则来源于一本书叫《程序员修炼之道》,意9 j o i _ D * 6思就是代码可以更容易被改遍的才是最好的代码 ~ / — “Good code is easy to change”。设计和编程中最重要的一个= u m T ! . ^ W点就是,保持代码灵活和易n P 5 +于改编重用的架构技术。(这里我先透露g z 3 U一下,近期我也又在准备V ] p O , @ ~ 7写一篇专门讲解有关此原则的文章,感兴趣a t 0 f D M R的童鞋,敬请期待,可先关注本博主哦)。在设计架构的时候如果遇到两个或者多个选择,那就遵循ETC原则,选择扩展性高,易于改编更好的方案。
小结一下:
做好功能S p F t需求整理和; a O %设计模y ) v式的建立{ Q : ? _ u n,对于功能需求的了解已经可以达到一定的深a i G度和理解的相对透彻。这个时候就可以开始一头扎进去代码的海a $ l o 6洋了。你会发现自己的代码会写的很顺畅,一种乘风破浪的感觉,恍惚敲代码都带风。
把功能需求分解成小任务$ n * M p p
接到一个功能需求时R | S [ D :,众多开发者都会觉得,这个b 4 % A x 9 o需求含有多个功能点,感觉无从入手。还会有一种莫名的复杂感。这个是因为一个功能需求里面很多时候对开发来说都是参合了多个小功能。
这个时候最好的解决办法就是尽量的分解需求为多个小任务。在《如果高效学习编程》中也有提到一个观点 — “化繁为简,小步快跑”,把复杂的功能拆分成多个小的点,也能让自己会迅速的开展工作。同时也会更有冲劲,每个任务如果太过复杂,实现时间太过长,会慢慢觉得枯燥无味,效率就会大大下降n g q v。
如何分解需求?
我团队的很多小伙伴一开始自己拆j . n x : X c l I解功能需求的时候,经常会问我,Y N e . 0 N“不知道需求怎么拆解,感觉拆的太细又不实际,但是如果不@ : y Y k拆细,又觉得没有拆的必要”。这里我来给大家一些方法来拆解功能需求:
1、按流程— 每个功能需w 7 g D S求都有一定有一个或多个的业务. Q v k L ? Q } q流,逻辑流,数据流。可以使用这个流程分解。
业务流 — 可以按照业务的流程拆可,比如注册q } S账号,短信通知,推荐联系人。这个系统的注册到通知_ ? ~ ^ X E b到推荐联系人。其实都是注册流程中的,但是我们可以按照流程拆开3个独立任务进行开发。
逻辑流 — 按照不同5 n j q o的业务逻辑拆分你的任务,使用相同注册账号的例子,可以拆分为:检测用户名重复,添加用户的逻辑,推送短信逻辑,建立短信发送服务等等。
数据流 — 也可以理解为按t T ; ! R照查询数据的逻辑来分割你的功能需求。比如建立账户体系仓库,建立短信发送记录查询仓库等等。
2、按功能模块/体系— 如果你接到的是一个大的功能需O [ L求,这个功能可能就含有多个功能模块在其中。比如我们要做一个财h W . w 8 f j D b务模块,我们可以首先根据功能模块或者体系拆分:对账体u T h I 1 y系,提现体系,资金流水,银行账户管理,资金管理等等。
小结一下:
当我们接到的功能需求较大的时候,我们一E z p d m w V定要把需求“化繁为简,小步快跑”的方式进行分解。这个会大大有利于我们提高效率。毕竟在技术开发中长跑是会精疲力尽的,小- : ~步快跑才能让我们高效使用脑力。分解需求还能让我们注意到更细j , `微的功能点,那样我们不会在复杂的功能需求中遗漏一& k d下微小的功能点。
结队开发,代码评审
在开发的过程中,开发者们往往会沈醉于自己的完美代码之中。我一开始也是如此,自己写了一个服务,无论是命名,写法,封装,逻辑设计,架构设计等等,我都觉I | M得是完美无暇了,甚至觉得都被自己的代码美到了。但是越是这个时候,我们就越是无法发现美中不足。我们要接受一个现实就是没有最好,只有更好。
首先要明白,自身的问题大部分人大概率都会是5 Q [看不清自己的。内心的9 E [ W想法是:自己一直都是这么做的,所以不会觉得自己是有可以改W s | t g善的) P D 6 C e X b b发的走的更快更远。所以如果都想让自己和e D I O队员有快速A O ? m 1 ~ p成长,那就更需要( ! ! 1 C I h 我们对彼此的知识成果予以尊重,予以坦诚相待的态度,给予队员代码中不足之处的反馈,也谦虚诚恳的接受别人的意见。这是代码审查重U $ o % C中之重!
在我的团队中提出使用结B g | Z F !队开发,代码审查制的时候,我收到很多反馈:“我们本来就是敏捷迭代开发,时间很紧凑,不够时间去审查”,“每个人的技术能力参差不齐,有些人无法Z w ? b ( . W P读懂彼此的代码”,“功能里面掺合着业务和功能需求的业务流程,对方没有做我的功能业务,看不懂呀”等等等等。一开始大家勇于提出了很多问题。
那我们怎么搞?不用慌让我们来分析一下,提出解决方案:
1、时间问题— 敏捷迭代中,都是小步快跑,迭代周, $ :期根据项目而定,但是a f | g t M大致都是1-4周的范围之内。时间确实是比较紧迫的。但是互相审查代码这个好处实在是很多,所以就算要在敏捷迭代中| ! & M 6 l ^ D o耗费一点时间也是非常值得的。
方案:每个人在每天早上就花1小时,审查前一天小伙伴们提交审核的代码,然后在Gitlab这种代码管理平台中直接在代码中填写反馈意见。这样时间是可控的,也不会让开发者浪费太多时间在审查p 2 G l 3 * 9 X中。
2、能力参差不弃— 这个是审查中的问题,也是为什么更需要审查的原因。不触动互相审查,在团队中给彼此意见让团队的总体能力拉平,能力中的参差不弃的问题就永无法解决。
方案:首先开个群,或H o N Y者开个会议,互相提出自己的优缺点,还有提( R 2 T j : X r z出自己今年想提升的方面。找到团队成员各自的强项其实问题就好解决了。把强项和有这方面想提升的人S 3 R ) 9 8 ~结队开发,这样就可以发挥有强项人的能力,h ( |同时帮助了有这块短板的战S U o x L X b友。而且,别人的强项也可能是你的短板,很x 7 m c z少有开发者是方方面面都很强的。别人身上肯定有你可以学到的东西。所以彼此都有良好的学习文化和心态。
3、业务不熟悉— 其实代码审核不是去测试对方的功能和业务,我们是写代码的开发者,不是测试工程师。代码审$ u o查的主要目的是为了,提高研发质量,把控代码规范,提高编写能& d B X z z ? J /力,提高技术知识。
方案:所P s 4 - X p以我们让开发者互相审m , / b k S / z p查的是,代码质量,实现方式,架构设计,代码规范,编写策略等方面,这种是不需要知道业务的,如果这些有涉及业务的需要才那么实l K N & l I w k B现的,可以询问对方计算难点在哪里:是查询?数据的处理?审查的重点放在技术本事不是业务代码的层面上。
小结一下:
开发者基本上都是抱团工作的,这种环境下都是很适合互补互相学习的环境。如果想彼此有快速的成长,那就需要我们互相去给彼此提出坦诚又宝贵的意见,从中吸取彼此的优点和强项。| b y w o . s 8这样每个人在这个团队中都会得到高速的提升。
如果你所在的公司领导没有推行这种模式,可以提议一下,如果因为公司的情况不合适,可以自己组队互相分享代码探讨,这样还是能达到互相学习和提升的!
在安静的环境中开发
开发者在日常工作中,都# J v ! * P是要高度集中,脑力全开的状态下工作的。所以环境造成的干扰对开发者而言是很影响效率的。一个难题,一段代码的思路,都是需要高e c D Q S度集中,在大脑中1000QPS的输出e l P 0 /速度来思考问A U & : 0 H 6题和逻辑。所以如果在过程中被声音,交谈,或者其它环境的干扰,就会被打断思路,然后陷入一个不停的思路重组的过程,大量的时间都被消耗掉了。
当年我刚刚当上了研发主管,开发于管理并行。发现自己每天都处于高并发状态,同时几件事情在处理,沟通,回答问题,协调工作,分析需求,与产品经理互9 l _ 3 I = ` = H怼,功能设计,功能规划,任务分解,然后就是研发。T r g ~这一堆的事情都是日常必须要做的事情。我发现在研发的过程中,总会有那么一两个人来打断我的思路,Y { } P C n # P当我大脑在全速前进的时候,突然在高速公路上出现了一个x , g“程咬金”。解决了TA的疑问之后,重新投入研发,需要花至少10分钟重新整理思路和投入v G % n D | )状态,大脑回归原来的速度。但是万万没想到,第二个人又来了。当时的我就感叹了c = ~ q F一句,“做一个小小开发真的是x } d i ) - D 5太幸福了”。
其实不只是技术管理岗会遇到这种问题,做一个研发组的开发者也会遇到,会有产品经理,测试,其他同事来请教] x m n ?你,给你指bugH I T L i p g n等等的事情需要和你沟通。所以这种干扰是无法在岗位或者职责上避免的。
那我们怎么才能做一个静静的小开发呀?(ლ ` )ლ,我来告诉你一些小秘诀吧:
1、番茄工作法— 给自己定好20-60分钟的高度集中的工作时间,这个时间内谁都不要过来打扰| # z v @ G A R E你,如果这个时间段有人来找你,你问一句“不好意思,我* r s : h现在有点忙,事情紧急吗?不紧急我过xx分钟过来找你“。如果对方v E X ( v P的事情是不紧急的,你就可以继续投入开发。到了一个25分钟阶段结束的时候J V r Y (,你再起来跟对方沟通。时间是很宝贵的,为了可以让大家高效沟通,E 6 | 2 8 T [ {也高效率开展研发工作。我们* 7 o - n [ 6 K要高效运用时间。2、带上耳机— 如果音乐会打扰你思路的话,就开一点轻音乐,或者一些大自然环境的声音。这样可以帮助你高度集中,不让自己听到一些能打扰你的声音。这种也是有效的管理好自己的耳门,让自己高度^ W _ 0 s [ $集中在研发中。我一般不会告诉别人,别人看到你带着耳机,高度集中的样子,莫名的会给到TA人心理压力M ; z c e和心理负担,会想这一刻过去找你,会不会打扰到你的。3、免打扰模式— 在你高度集中的时候,开启手机的免打扰模式,关闭你电脑里面一些与你现在工作无关的应用和网G x B 6 , t o K d开始只最求速度,你最后的技术债会G w 3严重拖累你的。最后时间都花在插屁股上了。适得其反!
总f t Q n n x结
看完这边文章我们发现做为一个开发者,不只是需要提升自己的技术能力,技术素养也是重中之重。只有技术能力,在职场中会有很多压力,职场中是不会给我们全世界的时间来开发,也不会给我们一个舒适的环境让我们集中。所以作为一个更出色的程序员,我们身上j / - | S x 0 Q必须拥有更多的防身技能,才能在我们面对各式各样的情况和问题出现时,我们能处于泰然,游刃有余。往往也是这些能耐才能让我们与众多的开发者有明显的区别。
希望这5大法则可以助你在技术行业里成为更出色的开发者,在众多的开发者中脱颖而出,升级加薪,走上技术和人生的巅峰。
版权声明:本文} ! s . . u % j )为CSDN博主「三钻L 9 8 | s w d」的原创文章,遵循 CC 4[ r q w x.0 BY-SA 版权协议,转载请附上原文1 D ) / I出处链接及本声明。
原文链接:
httpsL N 9://blog.csdn.net/TriDiamond6/java/article/details/104871K i _ k Q d167