热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1年经验与10年经验一样的代码!程序员该如何回归简单?

一个1年编程经验、一个2年编程经验、一个3年编程经验、一个5年编程经验和一个10年编程经验的不同写法。这些写法中,让人啼笑皆非的是5年工作经验的程序员编写的代码看起来如此的复杂

昨天看到博客园的一篇新闻《程序员的回归式进化》,该新闻非常有意思,展示了同一段“Hello World”代码,一个1年编程经验、一个2年编程经验、一个3年编程经验、一个5年编程经验和一个10年编程经验的不同写法。这些写法中,让人啼笑皆非的是5年工作经验的程序员编写的代码看起来如此的复杂、如此的有技术含量,而10年工作经验的程序员编写的代码竟然和1年工作经验的程序员是一样的(除了注释,这是升华),真是有点讽刺,呵呵~~。

 

不过,笑过之后,还是让我忍不住陷入沉思。本人已经写了11年的C#代码,写了3年的Java代码,还使用过汇编语言、C语言、Delphi、PowerBuilder、C++、ASP、PHP、C++ Builder等写过不少代码,经历的项目和产品也不算少了。我一直在追求如何使软件开发变得更为简单,这种简单不仅仅是对于我自己,更是对于整个团队。

 

企业级软件天生就是复杂的,为什么呢?如果一个软件市场不错的话,那么这个软件总是会不断的进行演化,代码数量总是在不停的增加。以Spring为例,0.91版本发布时只有1万多点代码,1.0发布时有2万多代码,1.2发布时有4万多,2.0发布时有6万多,2.5发布时有7万行代码(以上数据参考《Java应用架构设计》),代码越多意味着越复杂。如果这些代码中,还存在技术债、设计腐化、循环依赖等各种内在的问题,那你想想看,如何使其回归简单?如果你加入一家公司,不幸的要去维护一个现有的系统,你如何回归简单?千万别告诉我,你要重新编写一套,这只是简单的技术思维而已!

 

回过头来,我们再看看那个5年经验的代码。其实该程序员的写法没有错,他已经学会了如何使用DI进行解耦合了,猜得不错的话,他也是学会了设计模式,甚至掌握了一些OOP的设计原则。但是如果整个应用系统都充斥了这样的代码,那我估计谁看谁发疯!

 

那么这个懂DI、懂设计模式、懂OOP设计原则的有经验的程序员犯啥错了?很简单,我觉得他什么错也没有犯,他只是依然缺乏经验而已。

 

抛开团队管理和协作层面,我们单从技术层面来考虑,想要使应用系统的开发变得简单,有效的方法就是化整为零,将复杂大系统拆分成小的、简单的、能够组合的“代码块”,简化系统开发并间接提高软件系统的可维护性和可扩展性。那问题是,这个“代码块”应该是怎样的粒度?下图是软件系统“自上而下”架构图(该图参照《Java应用架构设计》),服务/子系统的粒度大,类的粒度小,系统的展现层粒度一般比较大,而数据访问层粒度小。粒度越小,系统越抽象,越灵活;粒度越大,系统越简单,可复用性越低,扩展性越差。

 

 

想要使系统开发变得简单,选择“模块”作为开发、复用粒度较为合适,模块符合高内聚、低耦合,在模块内部,我们倾向于使用1年工作经验或者10年工作经验的代码,模块内部依赖关系较少,较为清晰,不宜在内部搞太多的抽象。在我们的实践过程中,模块内部不会使用IoC,也不太提倡使用太多抽象,会使用非常直接、简单的编码规则,使1年经验的开发人员能够编写模块业务逻辑。那么5年工作经验的那些代码适合在哪使用呢?

 

我的答案就是“模块间的边界”。通过对模块间的边界使用OOP的SOLID原则,能够更大提高模块的复用性和扩展性,同时还能够保持模块内部的简单,这或许就是在技术层面回归简单的一种较好的方法了!

 

企业级软件系统的复杂,不仅仅是技术层面,相反,管理与团队协作更容易影响系统的成败。一个复杂软件系统通常都是由团队协作来实现的,一个完整的团队通常有高级工程师、中级工程师和初级工程师,高级工程师负责架构和设计、中级工程师负责编码、初级工程师仅是入门。有效的解决三种层次工程师的协作,尽量减少交互、协作、学习的成本,能影响后续的维护成本。在我看来,良好的协作模型应该促使三者的工作更加的Focus,专注于自己开发的业务逻辑。同样的,模块化也能够很好解决三者的协作。一方面,通过模块化,我们可以消除软件架构(或者成为统一架构);另一方面,高级工程师负责框架类模块、中级工程师负责业务类模块、初级工程师快速入门协助开发,三者可以进行并行开发,而且代码互相隔离,互不影响。从这个角度看,初级工程师的入门速度也将极大提高。

 

因此,回归简单的一个好方法就是:(1)化整为零,将系统进行模块化划分;(2)在模块内部保持简单,使用1年或者10年经验代码,在模块间交互部分的代码使用5年经验的编码更是,应用OOP的SOLID、设计模式、SOA等抽象技术,提升模块的可复用行和可扩展性。



推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
author-avatar
贤闲咸大_552
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有