如何做卓有成效的程序员 | 右军

简介: 程序员的成效是否是一个重要的话题?谁应该关心?是度量程序员的管理者还是程序员自己?

缘起

话说,程序员的成效是否是一个重要的话题?谁应该关心?是度量程序员的管理者还是程序员自己?

话说,大家在大谈Google如何,回到座位又继续撸测试用例的时候,那些熟悉的数据准备动作、校验动作,然后是断言动作,有没有让人想吐的感觉!

我10年的时候,干了一件现在看来不靠谱的事情,就是把一个模块的代码测试覆盖率撸到了80%,接手的时候是30%的样子。为了撸,我让其中一位研发同学只补测试,补了一周。有人说了,单纯追求覆盖率是不对的,诚然!我在11年还整理过一个内部文档,如何做单元测试,不能为了测试而测试。但在哪个历史时期,我还是做了【正确】的选择,如果是一个拖了整个系统后退的模块owner,有何面目谈质量!!!

我在质量系列文章中不经意有装X嫌疑,高大威猛;其实谁没有不堪回首的过去,那些血淋淋的过往需要回首对视呢?

大话软件质量稳定性

念念不忘,或有回响。

卓有成效的程序员

卓越成效的程序员】是若干程序员系列书籍我比较喜欢的一本,类似的还有卓越程序员密码【The Developer's Code】等。【卓越成效的程序员】高明之处是不仅仅给出原则,还大谈工具和代码,这如同诸多鸡汤文在【布道】的层面之下【实战】干货,可操作性强。这2天,重温了一下这本书给出的诸多原则,有些体会姑妄言之。

四大原则

四大原则是加速原则、专注原则、自动化原则和规范性原则。

  • 加速法则

加速法则,就是能加快我们工作的一切的东西。

  • Launchy 加载器,http://launchy.net/download.php#windows

  • 比如系统启动,最近一位同事做了一个热部署插件,解决容器在自测中启动的成本消耗。

  • 比如记住IDE快捷键

  • 专注法则

工作当中,专注可以很大的提高工作效率。

  • 排除干扰,隔离(带耳机、如设定专注编码时间段)

  • 关掉不必要的提示

  • 搜索优于导航,比如我想找一篇资料

    搜索可以使用本地搜索,比如google桌面搜索。

  • 自动化法则

自动化法则是把能自动化的一切都自动化掉

  • 不要重复发明轮子(轮子太多,乱花迷眼是又一话题;追求新轮子,又是技术人贪嗔痴的表现之一,热爱技术但忘掉了要解决的问题域)

  • 建立本地缓存

  • 使用RSS订阅我们需要的信息

  • 构建工具

  • 用Rake执行常见任务

ps:最近望神搞了一个eclipse插件解决了看起来很简单的一个问题,就是配置环境init。在一个新的space中load 配置,可以拥有你想要的java、maven、junit、checkStyle等一系列设置的内容。当然从频度来说,这属于低频,但仍然可以自动化掉。越高频的行为越应该优先实现自动化。

 关于发明轮子,有另外一个观点,就是基于提升技能的目的。不妨去做一下,对于问题域会有更深入的理解。

  • 规范性法则

规范很重要,这个可以减少不一致

  • 使用版本控制

  • 使用标准的构建服务器

  • 数据迁移,Ruby on rails里的Migration就很赞

  • 关于文档:错误的文档很糟,尽量生成所有的技术文档

  • 数据库结构 SchemaSpy可以生成数据关系图;开源的starUML可以生成类图结构

  • 减少重复,重复是软件开发中最大的阻力

关于文档的问题

关于要不要文档,文档写多少?

张逸老师如是说【文档方面目前个人觉得靠谱的做法是整理成思维树,标注定义,关键描述,关键词,关联词,详细文档link。对新人来讲更容易找到切入点,快速了解项目或系统全貌,已经可能与自己未来工作相关的上下文(内涵,外延)是什么。传统的文档管理方式往往使新人在浩如烟海的文档中迷失

孙老师提出:负责业务层的同学必须同步文档,否则会遭到移动客户端两个组前端用户层,开放商家层,内部管理层的投诉。我们最近就吃过这亏,有一个服务器同学写了一个接口文档,大概是一个参数,他定义的时候说的给的是 bool,但是没给事例,结果 ios 用的 YES 传的,安卓用的是 true,把 ios 的 YES 翻译过来就是 1 在判断的时候 1 和 true 是不相等的,因为类型都不一样,服务器的人和安卓对接完以为就 ok 了,结果上线了才发现有这个问题。

我的浅见:

  • 关于文档,项目研发过程中的关键文档需要保留和管理,比如需求和系分文档。这些是逐步堆积的过程中文档。

  • 一个系统/平台,需要有core文档,比如领域模型、主体架构等,由于这部分文档更新并不频繁,可以定期维护。

  • 用例即文档,验收测试及接口测试等保持稳定,是研究细节和用户场景的入手点。

  • 活文档:接口文档通过接口声明生成,接口声明对于每个参数都会有说明。批量接口,会给出数据量的limit,代码中也会进行防御;采用Swagger,在Swagger Editor中,我们可以基于YAML语法定义我们的RESTful API,然后它会自动生成一篇排版优美的API文档,API修改之后,API文档会随之而修改。

关于YAGNI

YAGNI(“You Ain’t Gonna Need it”)

你不会需要它,如无必要,勿增复杂度。

根据Cunningham & Cunningham的wiki页面所说:

即使你非常确信将来你需要某个特性,也不要现在就去实现它。在很多情况下,你会发现或许最终你不需要它了,或者是你真正所需的特性与你之前预计的有很大的出入。遵循YAGNI实践有两个主要原因:

  • 你节约了时间,因为你避免了编写最终证明不必要的代码。

  • 你的代码质量更高了,因为你使代码不必为你的“推测”所污染,而这些“推测”最终可能或多或少有些错误,但此时这些错误已牢牢地依附在你的代码中了。

Martin Fowler进一步表示,当我们在考虑推定特性时,很有可能我们是错的。在这种情况下,推定特性一个很明显的成本就是整个构建过程的成本,也就是对这个在当下没有用处的特性进行分析、编码以及测试所耗费的精力。他同时表示,假设我们对这个需求的理解恰好是正确的,但即使在这种比较理想的情况下,创建这个推定特性同样会带来两种巨大的成本。第一种成本是软件价值的延误成本,第二种成本是延续这一特性所带来的成本。

from http://www.infoq.com/cn/news/2015/06/yagni

关于YAGNI的思辨

如果对一个问题有2个解决方案,明明第二个解决方案更好【扩展性增强】,而实现成本相差无几,难道我要墨守此原则吗?

以我们团队的2个case来说明这个问题。第一个case是去年接到一个钱包积分的需求,经过分析,我们的设计不仅仅实现钱包积分,而是实现了商户通用积分的生命周期管理。因为后者有扩展性,并从业务嗅觉上依稀感受到未来或许有这样开放的必要。经过评估,实现成本没有增加太多,我们就果断采取了商户通用积分的实现方案。过了1年,果然,类似的需求来了...

第二个case,我们在14年底规划了一个券平台,解决此前各种红包、优惠类业务的烟囱架构的问题。这个平台的提出是基于若干需求背后的核心领域抽象,在8、9年前做红包系统的时候,是万不能想到的。也就是说对于问题域的本质认知,随着业务发展而发展,延迟设计决策是非常重要的,而把握这个度很难,没搞好,新装修的房屋不到2年就能翻新。

结论:YAGNI并非不做预设计,而是在成本、复杂度之间做权衡。光聪奉英杰为师,对于英杰非常崇拜。曾向我表示,英杰师关于YAGNI的观点与我有些近似。如果未来一个预期中的变化发生,而要付出的成本可能很大,我们眼前需要建立一些机制(比如抽象、约束)应对它。注意,只是建立机制,实现层面仍然按当前刚刚好的功能实现,除非你找到额外复杂度非常小的方案能把预期的变化也覆盖了,那么just do it!

定期检查阻碍,运用四大法则

如果说技术债是背在身上的猴子,总有一天会压得你喘不过气来;那么自发的提升研发过程的效能就是更好的追求。发挥程序员的三大美德,轻装上阵,让工作变得不一样。我们采取的是团队自发定期组织各种小沙龙,发现行径中的阻碍的模式,最近的一次沙龙收到10余条issue。比如下面这一条



分享者简介:

于君泽,花名右军,蚂蚁金服成都研发中心技术团队创建者之一,先后负责或参与过转账业务、账单类业务、社区支付、开发平台、支付平台、资金核算平台、类营销类支付工具的建设;之前有数年电信业务研发经验,设计BSS | OSS | 针对性营销等平台。

本文转载自微信公众号 中生代技术 freshmanTechnology
目录
相关文章
|
10月前
|
SQL 运维 关系型数据库
云数据库 Clouder 认证:SQL 基础开发与应用题型分析
阿里云Clouder认证(数据库方向)考察SQL基础开发与应用能力,涵盖DDL/DML操作、多表查询、聚合统计、子查询等高频题型。考试以MySQL实操为主,注重语法准确性与逻辑严谨性,适合开发者、运维及数据工程师备考。
781 162
|
消息中间件 安全 Android开发
抖音私信脚本怎么制作,用autojs?
AutoJS通过Android无障碍服务模拟用户操作,其抖音私信脚本主要依赖三大技术模块: 控件定位层
|
7月前
|
机器学习/深度学习 人工智能 算法
自进化≠自我刷题,Agent 真正的突破口是「自己造环境」?——6 位领域学者 · 7 大议题 · 2 万字圆桌观点实录
AI AMA首期聚焦“Agent自进化”,由魔搭等联合发起,邀请翟云鹏主持及5位顶会作者深度对谈。围绕定义、泛化能力、反馈信号、评估体系等7大议题,探讨Agent如何突破“从零开始”瓶颈,实现类人经验积累与策略优化。(239字)
660 6
|
JSON 机器人 API
gewe微信机器人搭建教程
GeWe开放平台是基于 微信开放平台的二次封装API服务,开发者可以使用本服务来处理微信中的各种事件,并可以通过后台调用对应的 API 来驱动微信自动执行任务,如自动收发消息、自动化应答、自动群邀请、群管理等,封装了 RPA技术流程,简化开发者二次开发难度,提供了开发者与微信对接的能力,使用简单,操作快捷,支持多种语言接入。
1183 17
|
9月前
|
运维 监控 安全
区块链应用上云实践
本文介绍基于阿里云BaaS平台的区块链应用上云全流程实践,涵盖联盟链搭建、智能合约开发、应用集成、监控运维与安全管控,并以供应链金融场景为例,详解多组织协同、数据上链、权限管理及可视化运维的落地步骤,助力企业高效构建安全可控的区块链应用,推动业务数字化转型。(239字)
501 0
|
10月前
|
数据采集 监控 NoSQL
Airflow调度爬虫任务:从零搭建高效定时采集系统
Airflow以DAG实现爬虫任务依赖管理,支持分钟级调度与Web监控,解决crontab无依赖控制、Jenkins不灵活等问题。结合PythonOperator、动态参数传递与分布式架构,可构建高可用、易扩展的自动化采集系统,适用于电商价格监控等场景。
494 0
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1498 12
Scikit-learn:Python机器学习的瑞士军刀
|
存储 NoSQL MongoDB
从 MongoDB 到 时序数据库 TDengine,沃太能源实现 18 倍写入性能提升
沃太能源是国内领先储能设备生产厂商,数十万储能终端遍布世界各地。此前使用 MongoDB 存储时序数据,但随着设备测点增加,MongoDB 在存储效率、写入性能、查询性能等方面暴露出短板。经过对比,沃太能源选择了专业时序数据库 TDengine,生产效能显著提升:整体上,数据压缩率超 10 倍、写入性能提升 18 倍,查询在特定场景上也实现了数倍的提升。同时减少了技术架构复杂度,实现了零代码数据接入。本文将对 TDengine 在沃太能源的应用情况进行详解。
812 0
数学符号ln
ln在数学里表示的是以常数e(无理数,约等于2.71828...)为底的自然对数符号。即lnm=loge(m)其中,log (英语名词:logarithms)表示的是对数运算。当a^b=n时,也可表示为log(a)(n)=b。
5399 0
|
SQL JavaScript Java
mybatis-flex入门体验(一)
`shigen`,一个专注于Java、Python、Vue和Shell的博主,分享成长和认知。近期探索了`mybatis-flex`,通过官网学习了代码生成和编码体验。配置数据源和依赖后,利用示例代码生成了符合Lombok+MyBatis Plus规范的实体和Mapper。此外,展示了如何配置SQL打印,并用测试代码演示了查询、多条件查询和更新操作。`mybatis-flex`的亮点在于流畅的查询语法和连表查询功能。后续将分享更多关于连表查询的实践。一起学习,每天进步!
602 0
mybatis-flex入门体验(一)