项目管理规范

从鼬加入的那一周开始,四代就开始着手准备起草代码规范了。
 
代码规范不可少

 
很多人理直气壮的认为,创业团队,或者说人数少的团队根本不需要代码规范。
 
他们的口头禅经常是:“没办法啊!我们需要快速的完成客户的需求啊!客户最重要啊!实行代码规范只会拖慢项目的进度!而且时间太紧,我们也不能搞那么多的学习啊!”。
 
 
对于四代来讲,不采用规范的做法其实无异于是“饮鸩止渴”,暂时的无限制的代码提交确实很爽,在项目初期确实可能有助于快速完成需求的功能,但是这种鼠目寸光的做法,如果不尽早改正过来,一旦形成惯性,积重难返,对于只是玩玩的项目来说还没什么太大的副作用,不过对于想要长期发展的项目来说,这几乎就百分百会造成深远的影响,甚至严重一点就是灭顶之灾。
 
随意提交的代码导致的代码随意的堆砌,最后很可能是造成代码修改起来无比的困难,越往后越难以维护,最后只能是在团队一片哭爹喊娘的叫喊声中,项目迎来寿终正寝。四代真的不知道这种不负责任的结论还会影响多少人,还会终结多少项目啊!
 
对于“没时间,项目紧”这一点,四代觉的完全是扯淡,完全是借口,从四代的经历来看,任何的团队都需要代码规范,而且团队熟练掌握代码规范后,写代码并不会增加多少时间成本!对四代来说,许多的“清规戒律”之所以在很多的团队执行不下去,完全是团队管理者造成的,管理者的懒惰和不作为导致了团队的低效。
 
代码的作用

 
说到代码规范,就必须要首先理解代码的作用。扯淡!谁不懂代码啊?这还用讨论吗!答案是:用!
 
在四代看来,代码存在两个方面的作用,第一个作用是与机器对话,第二个作用是与团队对话。第一个是从个人和技术角度讲,第二个是从团队和沟通上讲。
 
 
对于四代来说,写代码存在有两个层次,也就是说,在四代的眼中,软件工程师至少存在两个等级,一个是初级,一个是高级,初级软件工程师能写出机器能懂的代码,也就是说编译没问题,运行很正确,但是高级软件工程师能写出人能懂的代码,也就是不仅编译没问题,运行很正确,关键是团队其他人还能读懂,这就是优秀的软件工程师最牛逼的地方,没有“之一”。
 
对于一个团队来说,有什么会比代码的传承性更重要吗?没有!即使是只有一个人的团队也是如此,谁能牛逼到面对自己一段杂乱不堪的代码,在几个月以后还了如指掌!时至今日,代码在沟通上的容易与否,也就是代码的沟通成本,或者说维护成本,是衡量代码好坏的最重要的特征了,这里同样没有“之一”。
 
为了让代码便于沟通,为了让团队合作更加高效,确实应该制定团队基本的代码规范!
 
代码规范那些事

 

 
代码规范这个事,毋庸置疑,大家绝对是赞同的,尽管很多人目前不会执行,反正大家认为这个玩意儿应该有。但是这个东东严格来说是没有标准的,不同的人有不同的看法。四代认为:对于一个团队来说,不管采用何种规范,只要做好三件事就可以了:第一件事是尽快执行下去,第二件事是坚决执行下去,第三件事是坚持执行下去
 
 
 
首先得具有这个坚决的态度,这是做这件事的前提条件,否则说什么都是白扯,四代见过太多在团队中扯淡的人和事了!说的很好听,可实际上一旦谈到落实,就闭口不言!
 
其次,四代觉得对于代码规范本身,有几点还是需要注意的。
 
第一点,代码规范最好是明确的规范。
 
比如下面这些就是比较模糊的规范:
 
1. 变量应该不要太长。
2. 变量名应该清晰易懂。
3. 函数体不要太啰嗦。
4. 类不要太大。
 
如果把这些规范改成下面这样,或许更能容易执行一点:
 
1. 变量不超过5个单词。
2. 变量名要表达出变量的用途。
3. 函数体不要超过50行,函数复杂度不要超过10。
4. 类的公开成员不要超过20。
 
第二点,规范应该具有实用性。
 
至于实用性上,四代认同代码规范不易太长,可以采用很多人建议的那样,就搞个”程序员节操15条“,选取你认为团队中最需要实行的15条放到里面就可以了。比如四代就会选择如下一些简单易行的一些规则:
 
元素类型
命名规范
实现规范
通用命名
使用英文单词
表达出变量用途
不加变量类型
不使用缩写
本地变量采用小驼峰命名
函数和类型采用大驼峰命名
 
表达式
 
语句体即使只有一句也不省略{}
if语句中的条件表达式的逻辑运算不要超过3个
函数
以“动词”或者“动词+名词”组合
参数不多于5个
函数体不超过30行 (不含空行)
函数复杂度不超过7
类和属性以“名词”或者“形容词+名词”的方式命名
类实例变量以“m_”开头,静态变量以“s_”开头,后面部分使用小驼峰命名
交互型控件变量结尾需加控件类型全称
类常量/只读变量不加前缀且使用大驼峰命名
类的成员函数(包括普通函数,索引,属性)全部参照函数的规范
类不允许有非常量的公开字段,如果确实需要则用属性代替
类公开成员不超过15个
类不超过800行 (所有行)
接口
以“I”开头,以“形容词”或“名词”命名
接口的成员不超过5个
 
 
就这些,不管是重构还是正常写代码都用得上,姑且也把这些规则称为”程序员的节操“吧,呵呵,这可是程序员的底线啊。
 
第三点,规范应该具有时效性。
 
随着时间的不断推进,随着团队成员水平的不断提高,大家可以不断的修订这个规范的内容,比如每年一次,与时俱进嘛!
 
四代初步的规划是每年年初修订一次,不求完美,但求符合团队的实际情况。这个不需要多说了,一潭死水最容易臭掉,一切缺少发展特征的事物最终都会死掉,被淘汰,这是伟大的自然辩证法告诉我们的!在大学几年中,自然辩证法和哲学是四代认为最重要的课了,也同样没有“之一”!
 
第四点,规范应该是大家一致认同的。
 
规范是整个团队代码提交的准则,所以只有大家一致从心里认同了,大家才会始终贯彻它们。
 
四代非常重视这一点,当后来规范建立起来以后,四代先是让团队中的所有人试着执行了几个月,然后才正式的和所有的成员讨论了规范中的所有细节,解答大家的疑惑,征求大家的意见,最终形成了当年执行的版本。
 
代码审查那些事

 
有了代码规范了,大部分人可能会认为,这下代码审查的时候终于可以有话说了。不过四代个人觉得代码规范更多的是大家自检的项目,除了团队新人需要提醒一下外,基本上不需要别人太操心。
 
 
代码审查,这个大家同样都是点赞的,姑且不管效果有多明显,反正大家都觉得这个玩意儿有用,大概原因有如下一些:
 
1. 代码审查能避免一些低级的错误,比如拼写错误,比如简单的逻辑错误等。
2. 代码审查能使得大家互相学习一些新的知识。
3. 代码审查能多熟悉一些代码。
4. 代码审查能避免一些对方代码的失误而影响到自己的功能。
5. 代码审查能寻找到更加优化的方案。
 
 
但是一到实际的项目中,就会有各种问题导致不能贯彻执行下去,比如下面这些理由:
 
1. 时间不够
“哥啊,软件开发任务多的做不过来,那还有时间做代码审查?这不是代码审查好不好的问题,而是我没时间做啊!”
2. 需求变化
“需求变得太快,代码的生存周期比较短,不需要好的代码,反正过两天这些代码就可能会被废弃了!”
3. 态度问题
“别人的代码,我又不懂,怎么审查啊!而且就算是自己写的,写好就行啦,干嘛精益求精啊!”
4. 结果最重要
“大佬们都说了,能运行的代码最重要了,要那么漂亮干什么!”
5. 能力不足
“不好意思啊,我们都不知道怎么做代码审查啊!”
 
乖乖,总结一下都能写一篇论文。但是不管怎么样,四代根据团队实施代码审查的过程,觉得有几点是值得大家深入思考的:
 
第一点,任何提交到代码库的代码必须是经过代码审查的。
 
这个不用多说了吧,既然代码审查那么的重要,无论时间多么的紧迫,谨慎一点都是必要的,尤其是对一些发布流程比较长,发布成本比较高的产品,如PC团队研发的桌面版软件。
 
第二点,代码审查不仅仅检查那些代码规范,还要检查代码的逻辑是否合理。
 
虽然很多时候,代码审查并不能如想象的那样,发现代码的很多问题,但是代码审查会提升程序员的编程态度。试想如果一个人知道将会有同事检查他的代码,他编程态度就绝对会不一样的。他写出的代码将更加整洁,有更好的注释,更好的程序结构,因为他知道,大家将会查看他的程序。
 
在代码审查中最常犯的错误几乎每个新手都会犯的错误是,审查者根据自己的编程习惯来评判别人的代码(当然,基本的代码规范是需要大家共同遵守的,哈哈)。
 
对于一个问题,通常大家能找出十几种方法去解决。对于一种解决方案,大家能有百万种编码方案来实现它。做代码审查的时候,审查者的任务不是来确保被审查的代码都采用的是自己习惯的编码方式,因为大部分情况下,它不可能跟你自己写的一样。作为一段代码的审查者的任务是确保由作者自己写出的代码是正确的。
 
第三点,代码审查不一定非要说些什么。
 
代码审查经常易犯的毛病是,人们觉得有压力,感觉非要说点什么才好。当审查者知道作者用了大量的时间和精力来实现这些程序,不该说点什么吗?不,大部分时候并不需要。大部分时候,只说一句:“哇,不错呀”,会非常合适。
 
第四点,代码审查要坚持执行,一定不要敷衍。
 
没有什么事情能简单的做下来的。依四代的经验,在团队能正确的进行代码审查前,大家是需要花时间学习和实践的。人们在代码审查时经常会犯一些错误,导致不少麻烦,尤其在一些缺乏经验的审查者中经常的出现。他们给了人们一个很遭的代码审查的体验,成为了人们接受代码审查制度的一个障碍。
 
代码规范和代码审查是PC团队最重要的几件事之一,从规范讨论的那天起,四代就征求了鼬关于这件事的意见,他们经历过入职后修改部分代码的痛苦的经历后,一致认为这么做非常有必要,于是,就在某个月黑风高的夜晚,它终于被正式实施了。
原文地址:http://www.cnblogs.com/dxy1982/p/8427805.html?utm_source=gold_browser_extension

转载于:https://www.cnblogs.com/wzlbigdata/p/8428378.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——王道考研2.2.4.1

1 题目 从顺序表中删除具有最小值的元素(假设唯一),并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。 ——出自王道书2023版2.2.4的第二大题第一小题 2 思路 既然…

批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务...

windows(win10)批处理脚本 打开vm虚拟机的服务,并且开启无界面虚拟机 echo off net start "vds" net start "VMAuthdService" net start "VMnetDHCP" net start "VMware NAT Service" net start "VMUSBArbService" net star…

机器学习的练功心法(二)——概述

2 概述 文章目录2 概述2.1 模型概述2.1.1 预测房价问题2.1.2 符号2.2 代价函数2.3 代价函数的用处2.4 回到问题2.5 梯度下降2.6 梯度下降知识点总结2.7 线性回归模型的梯度下降2.1 模型概述 2.1.1 预测房价问题 在我们要开始下面的问题前,我们先来看一些关于房价预…

Jquery对象和DOM对象---Jquery API (1)

文/饥人谷_韩宝亿(简书作者)原文链接:http://www.jianshu.com/p/98a0c82c47e4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。一、为什么要用Jquery? DOM API 1.难用 要想拿到一个对象&…

机器学习的练功心法(三)——特征工程

文章目录致谢3 特征工程3.1 Sklearn工具及数据集3.2 数据集3.3 数据集的划分3.4 特征工程介绍3.4.1 为什么需要特征工程3.4.2 什么是特征工程3.4.3 特征提取3.4.3.1 字典特征提取3.4.3.2 文本特征提取3.4.3.3 中文文本特征提取3.4.3.4 TF-IDF算法3.5 特征预处理3.5.1 特征预处理…

数据库杂谈(六)——数据库管理系统

文章目录6 数据库管理系统6.1 数据库管理系统结构简介6.2 进程结构6.2.1 进程的分类6.2.2 线程的由来6.2.3 建立进程的过程6.3 数据目录6 数据库管理系统 6.1 数据库管理系统结构简介 数据库管理系统DBMS是数据库系统的核心。而目前市场上我们接触到的商品化DBMS大多数是关系…

booth算法实现乘法器

booth算法充分的利用到了补码的重要性,使得我们在利用补码进行计算时减少了很多时序。下面的表格是我们假设2 作为乘数所进行的分析。接下来,我将用代码向大家阐述。 1、开始的时候在乘数2的‘负一位’加上一个默认0值00100 2、先判断[0:-1],结果是2‘b0…

OS实验一实验报告

实验一、命令解释程序的编写实验 专业:商业软件工程 姓名:王泽锴 学号:201406114113 一、实验目的 (1)掌握命令解释程序的原理; (2)*掌握简单的DOS调用方法; &#xf…

机器学习的练功方式(四)——KNN算法

文章目录致谢致歉4 KNN算法4.1 sklearn转换器和估计器4.1.1 转换器4.1.2 估计器4.2 KNN算法4.2.1 概述4.2.2 电影类型分析4.2.3 算法实现致谢 闵氏距离_百度百科 (baidu.com) 机器学习之KNN(k近邻)算法详解_平原的博客-CSDN博客_knn 鸢尾花(Iris)数据集_…

数据库杂谈(七)——数据库的存储结构

文章目录7 数据库的存储结构7.1 数据库访问管理-文件组织7.2 数据库访问管理——索引技术7 数据库的存储结构 让我们重新温习第六讲的所学知识。 这个图实际上我们要关注的是蓝色箭头指向的那一层。在这一层之上,我们都是对SQL语句动手,而在这一层之下&…

JSP中直接在输入框中校验

jsp: <label class"control-label col-sm-2" for"codeAdd">险种代码<span style"color: red;">*</span></label> <div classcontrols col-sm-4> <input class"form-control remote-validate" data-r…

【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验

实验指导书及代码包下载&#xff1a; 链接&#xff1a;http://pan.baidu.com/s/1hs4zNFY 密码&#xff1a;5z62 iCore3 购买链接&#xff1a; https://item.taobao.com/item.htm?id524229438677

机器学习的练功方式(五)——模型选择及调优

文章目录5 模型选择及调优5.1 数据增强5.2 过拟合5.3 交叉验证5.4 超参数搜索——网格搜索5 模型选择及调优 5.1 数据增强 有时候&#xff0c;你和你的老板说你数据不够&#xff0c;它是不会理你的。老板会发问&#xff1a;为什么你是做机器学习的要那么多数据干嘛&#xff0…

关于内存的一些基础知识

1、free&#xff1a;Display amount of free and used memory in the system. free显示的数值来自/proc/meminfo&#xff08;默认单位是KB&#xff09;。各个项的含义分别是&#xff1a; 1&#xff09;Mem这一行&#xff0c;shared&#xff1a;已废弃&#xff1b;buffers&#…

Flask 单例模式 session

一、单例模式 单例模式分为四种&#xff1a;基于文件的单例模式&#xff0c;基于类方法的单例模式&#xff0c;基于__new__的单例模式&#xff0c;基于metaclass的单例模式 1. 基于类方法的单例模式 - 不支持多线程模式 import threadingclass Singleton(object):def __init__(…

数据处理工具(一)——Matplotlib

文章目录致谢1 Matplotlib1.1 什么是Matplotlib1.2 实现一个简单的图1.3 Matplotlib三层结构1.3.1 容器层1.3.2 辅助显示层1.3.3 图像层1.3 使用模块1.3.1 画布的设置1.3.2 添加网格辅助背景1.3.3 附加属性1.3.4 标签1.3.5 刻度1.3.6 一个图上多条线1.3.7 子区域1.4 基础图表1.…

Java解析Rss(三)

2019独角兽企业重金招聘Python工程师标准>>> package com.ninemax.application.rss;import java.net.URL; import java.text.SimpleDateFormat; import java.util.List;import com.sun.syndication.feed.synd.SyndCategory; import com.sun.syndication.feed.synd.S…

Redis服务器启动之后3个警告信息的解决方案

今天是年前最后一篇文章了&#xff0c;不想写太多的东西&#xff0c;就写一些有关Redis相关问题的解决方案。当我们启动了Redis服务器之后&#xff0c;会看到3个警告&#xff0c;如果没看到&#xff0c;那是很好的&#xff0c;但是我看到了。看到了就不能不管&#xff0c;所以就…

ASP .NET MVC 之Entity Framework入门教程及源码

本文主要的目的是 1. 说明Entity Framework Power Tools如何使用。 2. Entity Framework 快速门 实验环境&#xff1a; OS: Windows Server 2012, Windows 7 DE: VS2013 MVC 6.0Entity Framework SQL Server 2012 准备工作 基于现有数据库生成POCO数据类和数据库上下文需要借…

机器学习的练功方式(六)——朴素贝叶斯

文章目录致谢6 朴素贝叶斯6.1 概述6.2 概率论6.2.1 大数定律6.2.2 基本概念6.2.3 极大似然估计6.2.4 多项式分布6.2.4.1 伯努利分布6.2.4.2 二项分布6.2.5 朴素贝叶斯6.3 朴素贝叶斯文本分类6.3.1 一个例子6.3.2 拉普拉斯平滑系数6.3.3 算法实现6.4 贝叶斯分类器6.4.1 多项式贝…