抱怨项目里的坑是个再常见不过的事情了:

  • kissy 版本过低 (<1.3.x)
  • 项目没有 README
  • 代码很糟糕:没有注释?耦合度高?线上小 bug 不断?whatever.
  • ...

如此种种,然后说说我碰到过最糟的情况吧:

  • 新接手的业务,没有交接的过程,我只能从 git commit 里依稀分辨出谁曾经维护过...
  • 项目里混用了 stylus 和 less, 并且 Gruntfile.js 里没有任何跟编译 less 和 stylus 相关的配置,现在想想也觉得异常吊诡
  • 不出意外,README.md 的内容字节数为 0

这大概也没有什么......吧,不过另一个重点是,在我接手半年之后,这个项目除了多了一份还算 OK 的 README 以外,一切照旧!大概会让你很失望,这明明应该是个满是鸡汤味的励志故事才对啊。

其实,我内心曾经呐喊过很多次:「我要填了这万恶的坑」。而最终却只是多了那一份字节长度大概在 200 左右的 readme, 所以,我为什么没有填起这些坑?

为什么我不愿意填坑

需要承担风险

在对业务不够熟悉的情况下,重构是有风险的,所以我需要申请测试资源,测试同学又不傻。

没有时间

无论是从业务方,还是 TL 的角度,大概都不希望把时间放在重构上,除非说,这个项目的代码再不重构就要挂了。

业务需求太少

上面提到的那个业务,半年来做过一次不大不小的需求,然后就是最近的 https 升级,填完坑也不见得能对我或者对业务产生什么价值。

归根结底一句话「投入产出比太低」,所以多数情况下没有人愿意去填别人的坑。既然如此,那我们进入本文的正题少挖坑。自己负责的业务,争取不留或者少留坑更加有意义,同时只要愿意更容易实现。接下来就结合自己的一些实践,从 readme, git, code, lint... 等方面提出一些建议,欢迎补充纠正:)

如何做到不挖坑

一份可读的 README

任何一个项目都应该起于一份 README.md, 接到一个新的需求:创建 git 分支 -> 编辑 README -> 编码 -> 测试 -> 发布,如此多好。

同时一份可读的 README 应该至少包括一下内容:

# 某某业务## 介绍:- kissy 版本:kissy 1.4.x
- 打包工具:xcake
- 业务:xx 业务,可以罗列下线上地址
- 开发者:@xx## 升级日志:### v1.0.0https 升级###  v0.1.0增加 xx 需求## 目录:罗列大体的项目目录结构(在根目录下运行 tree -L n 即可生成目录结构图,n 指层级深度)## 其他:- 注意的地方,坑?
- and whatever

另外,如果在项目里使用了新的技术,如 Angular, React... 那应该有更详细的沉淀文档。

及时剔除无用代码

从来只见业务在不断新增需求,却不见将老的需求/页面下掉,但凡是有那么一点点 PV, 美其名曰「为用户着想」,时间长了,任谁也想不起那一坨页面是什么玩意,直到有一天...https 改造了!

于此对应,我们多数时候只会新增代码,而不愿意删除代码,即时这个需求已经下掉了,或许心里想的是「哪天也许会再次使用这个功能呢」。久而久之,一个本身并不复杂的业务代码越积越多,冗余度越来越高。And then, 骚年,这个业务你来接手吧。

上面两种情况,其实原因只有一个「删除是有风险的,而新增是安全的」,多数时候,我们更喜欢安稳点的方案。

从明天起,做一个熟悉代码并敢删除代码的人。

良好的 git 操作习惯

1) 正确管理版本号

很多人没有理解 x.y.z 版本管理的理念,而只是一味的在某一位上不断增加,或者说大多数人在接到一个需求时,根本不会考虑应该是升级 majorminor, 或者 patch 的版本号,这是万万不对的。

x.y.z 是一套语义化版本控制规范(SemVer), 各版本号递增规则如下:

主版本号:当你做了不兼容的API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订号:当你做了向下兼容的问题修正。

具体的文档可以阅读 语义化版本2.0.0。

2) 有意义的 commit 信息

  • git commit -am 'debug'
  • git commit -am 'fixed bug'
  • git commit -am 'modify'

诸如此类毫无意义的 commit 信息,在 gitlab 的 timeline 上随处肆虐。对于 commit 遵守以下两个原则即可:

  • 每个提交应当只包含一个简单的逻辑改动,不要在一个提交里包含多个逻辑改动。比如,如果一个补丁修复了一个 Bug,又优化了一个特性的性能,就将其拆分。
  • 不要将一个逻辑改动拆分提交。例如一个功能的实现及其对应的测试应当一并提交。

更多请戳 git-style-guide

3) 为 tag 添加注释

常用的发布姿势:

git tag publish/1.0.0
git push origin publish/1.0.0

更好的发布姿势:

// 为 tag 添加信息
git tag -a publish/1.0.0 -m 'https 升级'
git push origin publish/1.0.0

如下面左右两幅图片对比,为 tag 做注释,等于自动生成升级日志,一目了然,何乐而不为。

统一自己的代码规范

我曾经问师兄:「为什么我们没有一份代码规范的文档?」,师兄的回答是:「规范是用来打破的」。

规范是用来打破的,虽说没有太好的说辞去反驳,但事实上我是不认同这句话的,我倒是觉得规范一来能在一定程度上保证代码的质量,二来对于多数人可以提供一个参考。那这时候我又要推荐 Airbnb 整理的 Airbnb JavaScript Style Guide() { 以及 对应的 es6 style, 认真阅读一遍,一定会有收获。

当然,对于喜欢打破规范的同学来说,打破规范自然没有任何问题,只需做到一点:坚持一套自己统一的风格:)

用 editorconfig 统一编码规范

同一个项目,可能会有 N 个开发者,tab or space? 2个空格 or 4个空格?gbk or utf-8? 不要吵,让 editorconfig 来。

通过项目根目录下的 .editorconfig 来配置这些规则,配合编辑器的 editorconfig 插件,使用之后,自定义的规则会覆盖掉编辑器设置,保持整个项目的一致性。

例如 xcake 默认生成的:

root = true[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true[*.md]
trim_trailing_whitespace = false

用 eslint 保持代码风格一致性

同一个项目,可能会有 N 个开发者,单引号 or 双引号?要不要分号?== or ===? 试试eslint 吧,比 jslint 更加容易自定义规则。

话说,还没来得及细细对比 eslint 和 jslint, 又来了一个 JSCS, 有时间可以了解下。


如果愿意,以上皆可定义为规范,很多时候我也不见得会全部遵循,但挑中自己认同的,在项目中实践一二也是极好的。

以上。

其他文章

Node.js 单元测试:workflow

Node.js 单元测试:我要写测试

本文转载自:http://sobear.me/2015/04/talk-about-keng.html

作者:大果

不挖坑比努力填坑更值得相关推荐

  1. 【微访谈】挖坑的热情似火,填坑的想方设法——对话中讯网联•孙浩

    小e的话: eSDK微访谈终于在万众期待下上线啦!在这里,你可以倾听IT人分享经验.职场心得,在这里,你也可以了解华为更丰富的产品.eSDK更广泛的应用:在我们的访谈中,"加班". ...

  2. 传统行业转型微服务的挖坑与填坑

    原文:传统行业转型微服务的挖坑与填坑 一.微服务落地是一个复杂问题,牵扯到IT架构,应用架构,组织架构多个方面 在多家传统行业的企业走访和落地了微服务之后,发现落地微服务是一个非常复杂的问题,甚至都不 ...

  3. 作为程序员,你是填坑的还是挖坑的?

    你是否经常遇到这样的情景:负责开发的项目遇到线上bug,心想这不是我的锅,先不管了,放着吧:代码写完后,隐隐感觉有问题,可程序跑得通,先用着吧:接手一个老系统,这什么破代码,算了,改吧改吧将就用吧-- ...

  4. WebBrowser,挖坑,跳坑,填坑

    最近在 C# Asp.net 平台上的一个项目中用到了 WebBrowser 控件.自然而然就进入了 一连串的坑了.用网络上一同行的话"用WebBrowse,就是在给自己挖坑". ...

  5. DIY M328晶体管测试仪 挖坑 填坑

    网上挺火的晶体管测试仪看着很不错,买成品感觉不个性.!嘿嘿.没事网上爬了几天感觉也不是很复杂,所以就有了以下的坎坷.其实这东西是个老外开发的.咱们今天只聊硬件不聊软件.第一编程环境为GCC AVR俺不 ...

  6. Android 开发总结分享(一)挖坑与填坑

    做了快一年的Android开发,近期想总结一下这一年工作感受,分享一点我工作中遇到的BUG,然后分析并解决问题的思路吧,我尽量把过程写得详细些,这个系列共三篇文章.如有写的不对的地方,欢迎各位开发者指 ...

  7. 开源android项目到jcenter,手把手教你将Android项目开源到JCenter两种方式以及挖坑和填坑(一)...

    - 前言 开发中,或多或少都会用到无私的程序猿分享的开源项目,Androidstudio中使用开源也很方便 例如家喻户晓的Rxjava,只需要一句话compile 'io.reactivex:rxja ...

  8. 详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 一.pyqt5的UI中嵌入matplotlib的方法 1.导入模块 导入模块比较简单,首先声明使用pyqt5,通过Figu ...

  9. 一个机械研究生在计算机与机械之间的徘徊与思考-(下)之填坑

    现已研三(上 ),自问自答一下当初问机械研究生(智能制造方向)到底该学什么,主力该放在学术研究上还是系统开发上?先说现状,已签工作(华为IE工程师),也拿了国奖.研一上发一篇小论文,研一下一篇,研二上 ...

  10. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...

最新文章

  1. Python入门学习---第三天
  2. mysql各个组件的作用
  3. 《R语言数据挖掘》----1.15 结果可视化
  4. 【HDU - 1266 】Reverse Number(模拟,数字分位数处理)
  5. JavaScript-Tool:jquery.qrcode.js
  6. 在docker for win中使用portainer管理容器
  7. Express框架是什么
  8. 如何交付机器学习项目:一份机器学习工程开发流程指南 1
  9. Log4J发日志邮件给多个接收者及标题、正文乱码问题
  10. open函数返回-1_Linux驱动开发 / 字符设备驱动内幕 (1)
  11. 2.5D 组态案例合集 | 智慧园区、数据中心、SMT 生产线、汽车制造
  12. python单位根检验看结果_时间序列的ADF检验(单位根检验)
  13. 创新工场和海豚浏览器宣讲会启示
  14. echarts 乡镇级地图制作办法
  15. zip压缩包解压中文乱码问题
  16. 王者荣耀服务器维护七月,《王者荣耀》7.28不停服维护更新攻略教程 7月28日更新公告...
  17. 荣耀年度旗舰曝光!麒麟990+LCD屏下指纹+40w快充,或将11月发布
  18. 安卓街机模拟器对战源码修改详解(1)
  19. Ubuntu更新-换源问题
  20. [DevExpress]DateEdit年月

热门文章

  1. python函数 range()和arange()
  2. ajax 单击事件删除,AJAX删除事件与加载数据方法介绍
  3. postman支持socket吗_如何使用postman测试接口webservice?
  4. 网络拓扑图自动生成_SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer
  5. 《How to Write and publish a scientific paper》 Chapter 2
  6. 关于线性模型你可能还不知道的二三事
  7. 计算机组成原理完整学习笔记(八):控制器设计
  8. POJ 2393 Yogurt factory
  9. 清除localstorage
  10. 设计模式-12-命令模式