代码复用真的可以节省开发时间加快项目研发速

作者:365滚球 发布时间:2020-12-07 17:23

  (Modularization)是一个海市蜃楼、是一个书面词汇、是一个过气的时尚——模块化似乎从未真正的实现过。吹牛时人们常不屑的说:没吃过猪肉,但还没看过猪跑么?事实上,如果讨论的对象是嵌入式软件,很多人可能真的没有看过猪跑。在话题变得更像都市传说的之前,我想问一个问题:

  你这不是抬杠吗?明摆着的,代码做成了模块,那么别的项目就可以直接使用了,模块里的这部分代码就得到了复用。

  更进一步——“代码复用又是为了什么呢?”听到这里项目经理们深吸了最后一口烟屁股,顺手丢到脚边、踩灭、起身准备离开:

  实际项目开发中,用模块的时候,项目的进度真的加快了么?时间真的节省了么?

  项目经理们不动了,抬起到半空中的屁股慢慢的坐了下来。这次,他们的语气是认真的:

  不,使用模块通常并不一定能加快项目进度。老实说,用别人的模块,程序员常常要认真理解模块的功能和代码才能在调试的时候确认问题的范围。你知道,很多时候看懂他人代码所用的时间比自己重新设计一个更长。

  周围不少程序员都投来赞同的眼光,有的甚至很认真的点了点头。实际上,这里我们已经发现,在实践中,抛开用于模块化的技术不谈,使用模块实现代码复用本身往往并不能加快一个团队的开发速度——那么我们要模块化做什么?

  实际执行中,程序员因为种种原因,在使用模块时总是要花费大量时间读懂了代码才能“放心地”去使用它。

  程序(软件)是“程序员尝试去固化的自己的思维”;而模块(硬件)则是“业已固化的逻辑”,读懂一段程序,实际上就是要通过死的代码逻辑去反推模块构作者的思维,这是一个逆向过程,这是一个人与人之间用代码进行间接交流的过程,当逻辑本身较为复杂时,显然比将自己的思维直接翻译成程序(重新开发一个)更为困难。

  通过上面的分析,很容易看出,模块化就是为了通过复用代码来加快开发速度,而正是程序员阅读要复用的代码让这一努力付之东流。由此,我们可以非常直接的得出结论:

  使用模块时,必须专注于模块的使用,而必须有意忽视模块的实现逻辑,必须要在心理上信任模块。简而言之,必须把模块视作黑盒子!

  很容易发现,上面的结论是站在项目经理的视角得出的,因为项目经理关注的是项目本身,是各类资源的合理利用,是项目的进度——项目经理唯一不需要也不应该关注的是具体的技术实现细节。那么从第一线程序员的视角来看这个问题:

  笔者问过不同从业时间/经验的程序员,从过来的的角度来看,无非是以下几个原因:

  学习目的——想知道别人是怎么实现的。很多程序员认为通过阅读别人的代码能够快速的学习他人的经验从而提升自己。   然而,从项目管理的角度来看这个问题,程序员利用业余时间阅读他人的代码来提升自己无可厚非,或者说是值得提倡的,但牺牲宝贵的项目时间来阅读模块的实现代码而不是专注于模块的使用(使用模块快速的实现项目所需的功能),这对项目本身是弊远大于利的——阅读代码带来的是程序员的能力提升,这是对团队来说的远期利好,但这一利好对项目本身的时效性却微乎其微——俗话说远水不解近渴就是这个意思。

  实际上,项目经理通常要根据程序员的已有能力来分配任务,而不会寄希望于程序员通过阅读模块代码获得提升以后再来回报眼前这个火烧眉毛的项目——如果真有项目经理这么做了,那只能说,进度慢了完全不是程序员阅读模块代码的错,而是他最直接的用人问题——我也只能相信,也许他真的无人可用了。  所以结论就是:严禁工作时间以学习为目的阅读模块源代码。

  调试目的——也许并非所有的程序员都对自己的代码质量天然的自信,但几乎所有的程序员都对别人写的代码(模块)天然的不放心——就像孔乙己一样,必须亲眼看了酒保从黄酒坛子里舀出酒来而没有掺水才放心——所以程序出了问题,必然要怀疑模块,而且甚至有很多不负责任的程序员天然的会首先怀疑模块——不是自己写的,怎么能放心——所以调试的时候必然:

  必然要读懂模块的代码,否则怎么能体“自己的程序出错完全是模块的代码写的不好”。

  对于这种情况,就我个人来说,只有一条准则——不提供源代码!只提供库文件——相信我,通常面对汇编代码熟手无策的程序员会在调试的时候自动忽视模块的实现细节,专注于模块接口的输入输出行为——给什么输入,期望什么输出,实际获得什么输出——一目了然,简单直接。如果真的期望输出和观察到的实际输出不同,问题也就找到了:要么是文档没有读好,对输入输出的理解有误;要么是输入就有错;要么就是模块有问题。这绝对比读懂源代码以后再来调试要快得多!——除非这个别人写的模块需要你来维护……所以说,调试的时候   根!本!不!需!要!读!模!块!的!源!代!码! 根!本!不!需!要!读!模!块!的!源!代!码! 根!本!不!需!要!读!模!块!的!源!代!码!以调试作为阅读模块的源代码的理由,根本就站不住脚!

  仿制目的——这个目的没啥好说,别人把源代码给你就是个错误。请大家自觉抵制无视他人知识产权的行为。从技术上来说,因为要实现自己的版本而需要阅读他人的实现,理解他人的思维,这是一种白盒子行为,因而并不属于正常使用模块的范畴,属于普通的开发范畴。

  既然在模块的使用过程中,无论是学习目的还是调试目的都不需要阅模块的源代码,那么可以明确的得出结论:程序员在使用模块的过程中完全不需要,也不应该浪费项目的时间来阅读源代码。一个团队只有做到了这一点,才能借助代码复用加快项目开发的速度。   当一个团队的项目经理理解了“阅读模块代码”对项目的巨大危害,并以制度的形式对程序员的这一行为予以了制止——移除了模块化实践的绊脚石;那么技术经理应该如何理解、设计和实践适合于当前团队和项目需求的模块化架构呢?

  文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

  文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

  Daemon 进程生命周期长且在后台运行。编写daemon进程需要遵循哪些规则呢? 1、执行fork....

  物联网(IoT)系统在空中运行的方式发生了戏剧性的变化。在这里,Percepio的首席执行官兼创始人....

  在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着。现归纳出单片机开发中应....

  1、嵌入式设计,尺寸结构完全符合配电自动化国标。 满足电力行业DL/T 721-2000配网自动化远控终端标准。产品的结构尺...

  西门子S7-200PLC的符号表就是做变量命名工作的,毫不夸张的说,每一个使用S7-200的人都应该熟练掌握它,如果你对它不屑...

  Java 诞生距今已有 25 年,但它仍然长期占据着“天下第一”编程语言的宝座。只是其统治地位并非坚....

  Python已经成为全球最受欢迎的编程语言之一。原因当然是Python简明易用的脚本语法,只需把一段....

  最初的MRAM都是用微电磁线圈产生电磁场,使自由层的磁矩方向反转来进行0、1数据的读写。这种复杂的结....

  鉴于 UEFI SecureBoot 诞生初期种种令人头疼和担忧的问题,对于资深的 Linux 用户....

  华为云发布云原生产业白皮书、云原生2.0全景图和行动计划,并分享了华为自身基于云原生进行的数字化转型....

  设计高速系统并不仅仅需要高速元件,更需要天才和仔细的设计方案。设备模拟方面的重要性与数字方面是一样的。在高速系统中,...

  嵌入式、单片机里面C++非常好使;C with class用来作大部分开发是完全可以胜任,如果用的好....

  出于降低成本和节省空间之需,单片式 DC-DC 转换器成为许多大规模应用的绝佳之选,但它们不能用于要....

  最近的协议中遇到字节高低位转换的问题,于是偷懒上网查看,遇到类似的问题,也认识一个新的名字,叫做蝶式....

  1. 前言 使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. 2. 一般用法 3. 注意....

  本文介绍一种简单易用的编程工具一LabVIEW中的数据采集助手快速VI。 LabVIEW提供了一系列....

  首先了解手动与自动的区别,所谓的手动通常是单个动作的点动运行,自动则是按照生产要求一系列连续的动作。....

  1.指向函数的指针 指针不光能指向变量、字符串、数组,还能够指向函数。在C语言中允许将函数的入口地址....

  系统涉及到射频识别技术、无线通信技术、嵌入式技术、网络通信技术、数据库技术和计算机技术等方面。系统以....

  1、基本概念 我们生活在一个物质的世界中。世间所有的物质都包含了化学和物理特性,我们是通过对物质的表观性质来了解和...

  什么是嵌入式工控主板,嵌入式工控主板的分类和应用有哪些这样的问题,相信对于很多不懂行的人或者是初学者....

  日前,德州仪器CEO Rich Templeton参加了由瑞银举办的一场活动。在会上,当他被问到,在....

  什么是x86嵌入式工控主板?x86嵌入式主板就是嵌入式工控机内常用到的主板,它跟嵌入式工控机一样,体....

  英特尔今天推出了机器编程研究系统ControlFlag,它可以自主检测代码中的错误。虽然仍处于早期阶....

  城市轨道交通站台屏蔽门是安装于地铁、轻轨等轨道交通车站站台边缘,将轨道与站台候车区隔离,设有与列车门....

  今天,GitHub一年一度的Octoverse报告发布啦,大家最关心的编程语言排行榜也一并出炉。

  对于大多数人来说,几乎还没接触过 Linux及 Linux下的用户层编程,就开始学习《 Linux内....

  上周,微软支持的 Direct3D 12 Gallium3D 驱动已经合并到 Mesa 21.0 中....

  ARM、单片机、stm32、51单片机、和开发板的概念、区别及包含关系

  在学校里学了这些知识,并没有时间思考这些之间概念之间的区别,一直注重渴望技术的提升,却忘了这些基础才是根本。蹭着在家的...

  1. 中国古老的阴阳八卦 首先我们看看《易传系辞上传》,易有太极,是生两仪,两仪生四象,四象生八卦。....

  10 年前的今天,你在干什么? 你可能在吃饭、在睡觉、在 QQ 上聊天,但你绝对不可能是在刷微信朋友....

  向往深度学习技术,可是深度学习框架太难学怎么办?百度倾心打造飞桨框架高层 API,零基础也能轻松上手....

  读完本文,可以去力扣解决如下题目: 215.数组中的第 K 个最大元素(Medium) 快速选择算法....

  在各种好莱坞大片里头,但凡需要技术小子表现一下如何用几分钟时间黑掉一个庞大IT系统的时候,里面的电脑....

  家庭智能小管家机器人功能概述: 该项目是基于嵌入式开发平台的机器人,这个机器人主要使用树莓派和ard....

  不只女人要保养,代码也是如此。面向对象编程,就是把面对的代码当作对象一样,定期对其进行保养。 目录 ....

  由于本课题开发的人机界面是利用GTK+图形库,因此系统中采用的基于MySQL数据库应用开发,需要解决....

  在单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发...

  12月1日,酷派宣布,为表彰员工虎跃同学向Linux社区提交的数条高质量补丁,公司决定授予其十万股期....

  “形式代码” 的功能在它被执行后会继续维持,而 “一般代码” 仅仅在收到该命令时起作用。定义移动的....

  但是不知道从哪天开始,画面变了:早上收拾妥当准备坐公交车上班,出门前先掏出手机打开出行APP,看看公....

  实验 01 内核开发基础-基于迅为4412开发板 1.1 本章导读 本实验将带您学习一遍 Linux 的框架和源码目录结构。 从任何地方拿到...

  Khronos Group公司正在定义针对嵌入式领域的各种媒体API,目前已经发布了一种图形API,....

  本书是极负盛名的C语言入门经典教材,其第一版发行至今已有20年的历史。本书内容详实全面,由浅入深,示....

  据腾讯云微信公众号消息,腾讯云的小程序云开发已经成为国内最大的 Serverless 开发平台。同时....

  嵌入式系统的出现至今已有30多年的历史,嵌入式技术也经历了三个发展阶段。早期的嵌入式系统因资源极其有....

  ARM主板RK3288/RK3399主板中安卓系统与LINUX系统的相同点与不同点

  安卓,是一个系统,用于移动终端,智能手机、平板之类,如今也可以用于桌面工作站或电视机顶盒、智能电视等。它的内核基于linux内...

  对计时精度要求比较高的地方适合定时器,像本章节说的周期性采集传感器数据,要求不适合很高,那么就引入本....

  圆周率 π 是个无理数,既小数位无限且不循环。因此,在使用圆周率进行计算时,人和计算机都必须根据精度....

  请教各位大神,我用的板子是dspF28335,epwm模块1和6配好输出想要的波形了,相同代码复制一遍改成其他四个模块(epwm),直接输出...

  STM32简介 STM32是意法半导体生产的基于ARM公司Cortex-M3内核的32位高性能MCU....

  近日,TIOBE公布了 11 月编程指数信息。该榜出现近 20 年来,每月的前两位一直是 C 和 J....

  什么人适合学习大数据开发?学大数据难吗?有不少应届大学毕业生和0基础人群选择学大数据,但是要选择零基....

  嵌入式系统把计算机直接嵌入到应用系统中,融合了计算机软件、硬件、通信和半导体技术,是信息技术的终端产....

  嵌入式系统的应用范围可以大概分为两大类:电子系统的智能化(工业控制、现代农业、家用电器、汽车电子、测....

  面对人工智能时代的到来,到底学生应该学什么才能不被淘汰?11月15日,第十八届全国中小学信息技术创新....

  你了解什么是Arduino吗?你知道Arduino能做些什么吗?今天就让我们来认识一下Arduino....


365滚球
© 2013 北京格林吉能源科技有限公司.版权所有