任务分解与函数拆分以及面向未来编程的思想分享-阿里云开发者社区

开发者社区> 明明如月> 正文

任务分解与函数拆分以及面向未来编程的思想分享

简介: 任务分解与函数拆分以及面向未来编程的思想分享
+关注继续查看

一、背景

本文可能和很多人想的不一样,没有那么高深莫测,但是可能很实用,可能更容易避免出错。


业务开发中很多人可能面临这种情况:


1、任务每次都延期,任务时间并没有通过拆分后单个评估,而是全凭拍脑袋


2、很多函数超过80行,大的意群没空行,没拆分出子函数,导致别人阅读你的代码非常痛苦


3、写代码没有灵活性,比如加了缓存的功能,后面需要拿掉,还得重新修改代码发布等。


4、到上线了发现经常担心遗漏一些配置啥的



本文先介绍任务分解和函数拆分的概念和联系,然后简单介绍一下面向未来编程的习惯。


我这里指的 “面向未来编程”是指写代码的时候要适当考虑未来的修改。


二、探讨

2.1 任务分解

极客时间《10x程序员工作法》


大多数人对于可执行的粒度认识是不足的,低估了任务分解的程度,做到好的分解你需要达到“微操作”的程度。有了分解得很小的任务,我们就可以很容易完成一个开发循环,也就让计划调整成为了可能。软件行业在倡导拥抱变化,而任务分解是拥抱变化的前提。


动手做一个工作之前,请先对它进行任务分解


有些公司提供一套完整的效率平台,包括任务的状态,项目中每个人的拆分,项目涉及的文档等等。


开发前需要对任务进行分解并且估时。

1.png

任务拆分的合理,预估的时间相对就准确,对风险的把控能力就强,如果额外加入了几个小时的紧急事情,那么比预计晚多久就相对容易评估出来。


任务分解使任务变得更容易执行,并且时间更容易评估,可以非常清晰的了解当前任务的执行进度,剩余时间。


建议大家可以借鉴类似的思想来做项目。


另外估时可以适当预留单测的时间,预留应对突然事件的时间,极少数情况会开发的这段时间不需要处理任何紧急插入的其他事务。



如果公司没有提供工具的话,可以考虑trello


2.png

或者teambition

3.png

甚至也可以在有道云笔记里,创建待办来实现。



2.2 函数拆分

很多人喜欢把所有代码写到一起,导致一个函数可能好几百行,如果其他人修改你的代码,极其痛苦。


而且自己时间久了需要修改的时候,如果注释还不够完善,自己也会浪费很多时间,而且也极容易理解错误。



《阿里巴巴Java开发手册》中建议一个函数的代码长度不要超过80行。


为了更好的编写业务函数,我们应该把业务函数拆分成几个逻辑单元,比如参数检查,查询,数据组装等。




不同逻辑边界加上空格,部分大块功能建议抽取到私有的子函数中。这样代码的可读性更高。


比如我们对concurrentGet代码重构,其参数和返回值明确,逻辑清晰,极容易重构,也极容易测试。



2.3 面向未来编程

即编程时要有灵活性,要面向未来可能出现的一些(不是所有)情况。


2.3.1 比如开发一个缓存功能

为了避免上线后缓存出问题可以及时拿掉,为了测试环境测试不走缓存,可以设置缓存开关。


通过apollo配置,这样不需要代码修改和上线可以实现某个功能(不只是缓存)的开关。


2.3.3 比如某个模块本来应该独立成子函数

未来注定要通过其他方式替换掉的,建议独立写一个子函数,未来只需要替换这个函数就好了。


如果写到一个大的业务代码中,需要理解上下文,这样修改的难度就很大了。




比如这里 我们替换了第三部分,参数返回值可以不变,只修改逻辑就好了。



2.3.3 比如调用二方接口

返回值类型是Map<String,Object> 那么,即使某个key的值"肯定"是Long,尽量用fastJson的Map转我们的DTO对象,不要get后单个属性强转。




假如二方接口对数据使用使用JSON序列化到Redis里,然后取出来Long被转成Integer,如果我们通过get获取Object进行强转,如图所示,含Long类型的数据的map,第二次请求走缓存,会出错。


但是如果我们也缓存了我们的最终结果,那么这个反序列化错误可能一直被隐藏着。


《JSON序列化导致Long类型被搞成Integer经典巨坑》https://blog.csdn.net/w605283073/article/details/90941038


面向未来编程,决定了我们要意识到虽然测试环境数据正确,不代表未来不会变化,怎样更好的应对变化是关键。


2.3.4 面向未来记笔记,很重要!

比如你新开发一个功能,涉及到某个配置的改动,涉及到SQL的修改,需要依赖的其他服务先上线,上线后需要配置XXX等等情况。


都可以在开发的时候记录到云笔记的“上线” 文件夹的“注意事项”等笔记中。


这样极大避免了上线前抓耳挠腮的去检查思考自己的变动,需要的配置,依赖的服务等等。


当然上线前还是要重新思考的,但是极大减轻了工作量,极大避免了遗漏出错。


开发阶段可以记录未来测试阶段需要注意的事项。


甚至需求评审阶段,就可以用笔记整理思路,甚至预先设想技术方案等。


功能测试阶段可以在云笔记的“测试”文件夹,记录测试所需的账户,SQL语句,URL等方便测试的工具,每个测试步骤最好带上截图。


这样后面如果需要再次手动测试,直接copy搞搞就好了。


如果测试想你咨询某个环节的问题,直接对着笔记看截图就好了。


我如果得知下午要把提测的内容和测试过一遍,会尽可能的把分支名、改动内容、涉及的函数名、可能帮助测试的日志、测试注意事项提前整理好,到时候就非常轻松。不需要现场组织语言,现场找各种需要的东西,避免了浪费时间。


等等。


2.3.5 面向未来总结经验

很多人不重视方法,不去学习好的排错方法(参见《代码排错和避免错误的正确姿势》),不去主动夯实基础,不喜欢总结。


导致失去了快速成长的机会。


拿排错来说,错误排查的方法主要就那么几种,通过扎实的基础结合逻辑的思考,谨慎的印证绝大多数都可以找到错误原因。


我们可以积累排错经验,包括F12大法(抓包大法)、Code Review大法,调试大法、日志大法、搜索引擎大法、控制变量法、换环境大法等。



另外避免上线时遗漏一些事项,我们可以积累上线需要注意的事项,然后每个功能上线前都排查一遍。


比如SQL变更有没有提交并生效?有没有修改配置项,是否已经提交并生效?上线顺序是怎样的?上线后怎么验证功能有效性?等等。


这些在上线前都要认真检查的,并且开发阶段如果有结论可以提前写到笔记里,上线前重新核实。



三、总结

任务分解和函数拆分有极其相似的地方,都是将大的任务拆分成小的更容易执行和评估的单元。


而面向未来编程,则是在其中未来注定要替换的部分,可以提取到某个子函数,未来直接重构子函数即可。


面向未来编程则是考虑更多未来的变化,提供一些方便的开关等功能。


最后也是最重要的一点是,多读有助于提高代码健壮性,可维护性的图书,在本人的另外一篇博客上有超多推荐,欢迎参考。https://blog.csdn.net/w605283073/article/details/89893440


当然过度设计也不太好,但是尽可能的“”,思考各种意外的情况,面向未来总结经验,面向未来做一些准备等。



如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。


另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。


https://t.zsxq.com/Z3bAiea  申请时标注来自CSDN。

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/91057040

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9215 0
福利篇:分享些收藏已久的Java架构资源,七天后失效~
有段时间没跟各位老铁分享一些编程资源福利了,看了下自己的百度网盘,就剩下这个我认为是比较好的Java架构师学习资料了 。相信我,这套资料,绝对可以对你进阶高级工程师有帮助! Java架构技术进阶路线图     ...
1058 0
分享15套精美的 PSD 网页设计素材
  设计师经常会去网上搜罗各种各样的素材,这些免费素材不仅能帮助他们节省大量的时间,而且能有很好的效果。今天这篇文章收集了15套非常精美的 PSD 网页设计素材,你可以免费下载使用。非常感谢那些很有才华的设计师分享它们的劳动成果,让更多的人可以使用他们的创意设计。
644 0
函数计算自动化运维实战1 -- 定时任务
阿里云函数计算是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码,并提供日志查询,性能监控,报警等功能。借助于函数计算,您可以快速构建任何类型的应用和服务,无需管理和运维。更棒的是,您只需要为代码实际运行消耗的资源付费,而代码未运行则不产生费用。
531 0
C++编程思想1
学了好久的 C++了 发现自己对于C/C++还是没有深入的了解 于是 咬咬牙啃起了 C++编程思想 希望能有所感悟 。。 我以前是直接学C++的对于C不是很了解,然而又是在VC下 学习 所以 没有好好的 去学习 标准C++,直到我 看起C++编程思想  我发现真应该从头再学一遍了  。
650 0
第10周-任务0-构造和析构函数的执行过程实例解析
【题目】阅读程序,先分析程序的执行结果,在上机时运行程序进行对照,再通过单步执行跟踪程序的运行,达到理解基类、派生类中构造函数、析构函数执行过程的目的。 程序如下: #include &lt;iostream&gt; using namespace std; class Part  //部件类 { public:     Part();     Part(int i);     ~
933 0
c++编程思想2 --友元存储控制
 友元friend在c++中的应用  我们知道在c++的类访问权限中,private和 protected在类外面进行访问的时候 会因为权限而不能访问 ,友元就解决了这个问题 。 可以这样理解,他为外部的 函数 或者类 进行了 访问授权,其实这已经超出OOP的范畴,但是对于C++而言是以实用为主,所以说C++并不是完全面向对象的语言 C++这一特性就破坏的C++的安全性 。
705 0
+关注
明明如月
阿里巴巴 资深Java开发工程师
342
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载