代码精进之路:从码农到工匠-学习笔记

一、技艺

代码命名

总结而言,代码的命名应该遵循以下的命名原则。

解释性

无论是代码中的变量名还是函数名,都必须可以自解释变量或函数的作用。在必要的情况下,还可以为变量或函数添加注释,做一些业务层面上的解释。

一致性

代码中一些变量或函数的命名,如果使用了前缀或后缀应该保证整个项目上保持一致。比如前缀中,查询query、写入add等;后缀中,总和sum,平均数avg等。

代码规范

代码格式

  • 每个项目最好遵从统一的代码格式,有助于提升代码可读性,代码格式包括缩进、对齐、命名风格、注释等。
  • 一个所有开发人员共识的代码原则是:相关性越强的代码,距离越近。不是做同一件事的代码建议空一行。

日志级别

对于不可预知的错误,打印ERROR日志;对于可预知的错误,可打印WARN日志;记录运行过程和状态,打印INFO日志。

函数

  • 尽量使用不超过三个的函数参数,如果函数参数大于等于3个,需要考虑是否封装成类对象传参。
  • 尽量遵循单一职责的原则设计函数。
  • 推荐使用组合函数的方式实现方法体,有助于提高代码可读性。

设计原则

SOLID原则

1、单一职责原则(Single Responsibility Principle,SRP)

每个类只负责一件事,所以只会有一个发生修改的原因。单一职责原则同样适用于函数,代码块等。

解释:

  • 单一职责有利于降低系统复杂度,提高代码可读性;
  • 单一职责有利于代码复用;
  • 单一职责降低变更带来的风险,提升系统的可维护性;

2、开闭原则(Open Closed Principle,OCP)

像类、接口、函数等软件实体应该对扩展开放,对修改关闭。

解释:

  • 它提出了一种优秀的变更实现方式,有利于降低变更带来的风险,风险即对系统原有功能造成的影响;

3、里式替换原则(Liskov Substitution Principle,LSP)

任何使用基类的地方都可以透明地使用子类对象替换,而不改变原有程序逻辑和正确性。

解释:

  • 它是实现开闭原则的重要方式之一;
  • 它是继承动作正确性的保证。即类的扩展不会对原有系统造成影响
  • 它解决了继承时重写父类逻辑破坏可复用性的问题;
  • 它提供了一种良好的继承实现方式,指导我们应该如何设计子类;

4、接口隔离原则(Interface Segregation Principle,ISP)

客户端不应该依赖它不需要的接口,并且类之间的依赖关系应该建立在最小的接口上。

解释:

  • 它提倡对抽象的事物进行职责划分,抽象的事物包括接口、抽象类等;
  • 它是实现单一职责原则的方式之一;

5、依赖倒置原则(Dependence Inversion Principle,DIP)

上层模块不应该依赖底层模块,或者说抽象不应该依赖细节,抽象都应该依赖抽象。

解释:

  • 它提倡面向接口编程,因为细节具有多变性,而抽象是相对稳定的,依赖抽象编程有利于未来的功能扩展;
  • 它是实现开闭原则的重要方式之一;

KISS原则

Keep It Simple and Stupid,如果完成一件事情可以做的很简单,那么就不要选择复杂的方法,简单的实现过程意味着简洁,良好的可读性和可维护性。

DRY原则

Don't Repeat Yourself,即程序中要避免重复代码。如果你发现存在重复实现的逻辑,需要考虑将其进行抽象封装到一处,避免以后变更时要修改多处,提升代码灵活和简洁性。不过,并不是任何情况下遇到重复代码都要进行抽象封装,需要看具体情况和参考Rule of Three原则。

Rule of Three原则

三次原则,如果程序中出现了三次相同的功能,那么你就需要考虑对其进行抽象封装。这个原则指导我们代码冗余和开发成本的平衡点。

设计模式

  • 拦截器模式
  • 插件模式
  • 管道模式

二、思想

抽象具体思维

抽象是一个自下而上的总结归纳过程,而具体是自上而下的拆分细化过程。就像金字塔一样,每一层都比下一层简洁抽象,每一层都比上一层详细具体。

不教条

运用书本知识时,不能生搬硬套,在理解的基础之上,甚至还要因地制宜,进行必要的修改调整。

批判型思维

对于任何知识和观点,保持思考的自主性,不要一味地接受认同,而应该运用自己所学知识对其正确性做出判断。

成长型思维

相信学习和成长的力量,可以改变智力和能力。

结构化思维

无论是思考还是表达,都要用一个结构化的思维来辅助完成。

  • 提出问题、定义问题、分析问题、解决问题和展望未来;
  • STAR原则,就是一个很好地结构化思维方式:Situation背景,Task任务,Action行动,Result结果。
  • 金字塔原则。结论先行,再说细节。

有目标

学习成长的道路上踏出的第一步应该是确定目标,然后再是根据目标制定相应的学习计划,最后向着目标努力前行。没有一个最初的目标,就像在大海上失去方向的一叶孤舟,终将迷失自我,事倍功半。

目标管理

OKR是一种目标管理的方式。O(Objective)是一个相对宽泛的,模糊的,有野心的目标。KR(Key,Result)则是对O的细化,是可量化的指标。

三、实践

典型应用架构

分层架构

顾名思义,就是整个项目结构按职责分层的,比如展现层、应用层、模型层等。

CQRS架构

Command Query Responsibility Segregation,命令查询职责分离架构。将命令(增删改)和查询两个行为分开实现,即分离读写期望进一步凸显单一职责,降低系统复杂度。

六边形架构

也叫端口-适配器架构,六边形架构项目对于外部发起的应用操作请求,会将业务实现注入到主动适配器中进行处理。对于后端的工具链接,通过实现抽象接口和工具实现关联,并将工具具体实现的适配器注入到应用内部来使用工具,降低对基础设施的关注,降低技术和业务逻辑之间的关联。

洋葱架构

外部调用和基础设施的接入与六边形架构思想类似,不同之处主要在于它以领域模型为核心,定义了自内向外的依赖方向,外层可以依赖内内层提供的服务,内层对外层无感知。

整洁面向对象分层架构

该架构则整合了分层(项目按职责分层),CQRS(命令和查询分离)、六边形(降低对基础设施的关注)、洋葱(自内向外的依赖方向,以领域模型为核心)四个架构的特性。

Github仓库地址:https://github.com/alibaba/COLA

先进行领域顶层划分,再进行功能划分:

img

防腐层(Anti-Corruption)

防腐层的概念,是来源于领域驱动设计(Domain Driven Design,DDD)。它指导我们在调用外部依赖的地方建立一层防腐层,将外部依赖传入的上下文转换为本项目中有共识的上下文。这样,不仅一定程度上避免了当外部依赖发生变更时本项目需要同步变更的风险,而且通过防腐层的上下文转换,降低了开发人员对外部依赖信息的认知成本。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我是一位20多年的老码农,我的IT学习之路从大学时期开始,我就立志要成为一名优秀的程序员。那时,我的专业是计算机科学与技术。我通过自学和老师的讲解,掌握了基本的编程语言,如C、C++、Java等。 后来,我开始应聘IT公司的工作。工作中,我更深入地了解了软件开发的流程,了解了各种软件开发工具和框架。我也去了解了计算机硬件的结构,学会了如何优化代码以及如何调试代码。 我还参加了很多培训课程和研讨会。这些课程和研讨会涵盖了各种主题,包括算法、数据库、网络、安全、人工智能等。我也参加了各种技术社区和论坛,了解了最新的技术趋势和应用。 除此之外,我还逐渐形成了自己的学习方法和习惯。我会在业余时间阅读相关的书籍和论文,并进行实践和探索。我还会与其他IT从业者交流,分享经验和发现。 今天,我已成为一名有经验的开发者和技术专家。通过积累多年的实践经验和持续的学习,我对计算机技术的理解和掌握越来越深入。我相信,在未来的IT学习之路上,我将继续保持热情和学习,迎接新的挑战和机遇。 ### 回答2: 作为20多年老码农,我一直认为学习是一个持续不断的过程。我第一次接触计算机是在1990年,那时我还是一名高中生。那时的计算机技术还很落后,我用的是DOS操作系统,还有些简单的软件和一些基本的编程语言。但是,我对计算机技术的兴趣与日俱增,并在大学里学习了计算机科学专业。在大学里,我学到了关于计算机体系结构、编程语言、数据结构和算法等基础知识。 毕业后,我开始在一家软件公司工作,并继续学习新的技术知识。在那里,我学会了C++和Java等高级编程语言,并开始做一些大型软件的开发工作,在这个过程中,我还深入研究了数据结构和算法等领域的知识,这些知识对于设计高效的程序非常重要。 随着互联网的发展,我开始学习一些Web技术,如HTML、CSS、JavaScript和PHP等。我还学习了数据库编程和网络编程等知识,这些技能对于Web应用程序的开发非常重要。 尽管我一直在学习新的技术和编程语言,但我也认为,编程不仅仅是掌握语言和技术知识,还需要不断地学习软件工程、代码设计、测试和维护等方面的知识。事实上,我认为软件工程实践是我职业生涯中最重要的经验之一。通过反复的代码测试、优化和维护,我发现自己的代码质量有了很大的提高,这使我更能够理解代码设计和开发有效的软件系统的重要性。 总的来说,我认为,编程是一个持续不断的学习过程,需要不断地学习新的技术和知识,以保持自己的竞争力。但是,对于一个成功的程序员,仅仅掌握技术知识是不够的。在实践中,我们还需要学习如何设计高效的程序和系统、如何测试和维护代码,并与其他开发人员进行协作和沟通。在每个开发项目的过程中,我们都有机会从错误中学习,以及提高自己的技能和知识。 ### 回答3: 作为一个20多年的老码农,我的IT学习之路可谓是经历了许多风雨,对我来说其中所经历的各种挫折与成长都是不可或缺的。 我的IT学习之路从初中开始,那时我对计算机十分感兴趣,每天放学后都会去学校的计算机教室玩电脑。那时候的电脑是286的机器,比较简陋,但我激动的心情却一直没有减退。初中之后我考入了一所职业高中的计算机专业,那时候,我们上课基本都是在实验室里进行,许多同学开始学习C++语言,我也跟着学习了一段时间,但是很快发现自己还需要更多的基础知识,于是我花了许多时间学习了计算机原理、数据结构、算法等基础知识。 高中毕业后,我考入了一所大学,在那里我又接触了更多的知识领域,例如数据库、网络、操作系统等等。这个阶段的学习是比较理论性的,但它为我后来的职业发展打下了很坚实的基础。 大学毕业后,我开始在一家小公司工作,那时候我在实际的工作中学习到了更多的技能,例如如何使用版本控制系统、如何与团队协作、面向对象编程等等。这个阶段的学习很实用,它让我能够真正地将我的理论知识用于实际的工作中。 随着我逐渐成长为一个有经验的工程师,我也学会了如何不断地更新自己的技能。我通过参加各种培训、阅读技术书籍、参与技术社区和开源项目,不断地学习新的技术和知识,并将它们应用于我的工作中,这使我的职业生涯不断上升。 总的来说,我的IT学习之路是一个持续不断的过程,从初中到现在,我始终在不断地学习和成长。在过程中,我体验了挫折,但同时也获得了成就感和满足感。通过持续地学习和更新自己的技能,我们可以不断发掘自己的潜力,实现自己的目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值