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

缘起

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

话说,大家在大谈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

时间: 2024-12-29 02:47:24

如何做卓有成效的程序员 | 右军的相关文章

做一个优秀程序员应该知道的15件事_其它综合

1. 懂得分享.尽可能使用开源,并且当你有能力的时候,要对其有所贡献.聚全社会之智慧,胜过某些"大"公司之短视. 2. 公平竞争.尝试其他技术.框架.方法和观点.不要总以为只有你的选择才是可行的.别的选择也有可能比你的要强得多.要以开放的心态,来检验其他人的选择. 3. 不要攻击他人.像第2条所说的,不要仅仅因为别人恰巧使用.Net.Java或PHP就去攻击他们(我在这方面有一次教训).有时,它们或许要比你所认为的更有效.只要别人不是一无是处,你就可以从他们那里学到很多东西. 4. 自

不想做管理的程序员三十多岁以后怎么办?

问题描述 我喜欢写代码.比较热衷技术的东西.不喜欢做管理,自己也不适合. 在咱国家过了三十多岁能做什么? 只有架构师和创业么? 在国外几十岁还在写代码的大牛那么多. 解决方案 继续写代码!资深高级工程师嚒 公司除了CEO还是有CTO的解决方案二:去外资,外资有蛮多30多的程序员解决方案三:那你就继续写代码呗,只不过工资和以前差不多.没人逼你搞管理解决方案四:做个自由职业者呗

技术主管一直做微服务 程序员不干了

微服务的概念出现不是一天两天了,但是要追溯它的源头还要看SOA,毕竟微服务只是一种比较现代化的细粒度的SOA实现方式,并非从天而降突然出现的.但不得不承认,IT架构实现了从all in one到微服务架构转变,微服务架构模式(Microservice Architect Pattern)开始被越来越多的企业所接受. 根据ThoughtWorks的首席科学家,马丁·福勒先生的定义:"微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每

《卓有成效的程序员》读书笔记

在今年的的ThoughtWorks China away day上,我见到了这本书的作者neal ford, 我们还有过简单的交流,并一起去爬了长城.惭愧的是当时我并没有读过他写的这本书.直到今天我拿到了这本书,并花了大半天的时间通读了一遍.看完以后,我觉得这本书真是太好了,非常值得一读. 但是,我想读这本书的读者,大体会分为两个反应.一种是看了一下前面,觉得没有意思,大概翻了翻,发现作者真是太罗嗦了,就丢到了一边.另一种是爱不释手的从头看到尾,看到有些段落会会心一笑,有些段落则加上重重的标记,

做程序员工资高福利好?其实是压力山大 很多人都快疯了

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 软件程序员在如今看来是一个既能挣钱又有工作保障的职业,但是,这种职业对你的精神健康却会造成巨大的伤害. 有两种事情几乎能让程序员疯掉. 一个是被人们称作"骗子综合征(imposter syndrome)"的东西.患这种症状的人通常是发现一起共事的所有程序员都比自己聪明.比自己有天份.比自己有才能.你生活中一直恐惧中,担心其他人会最终发现你是个冒牌货.你的技术和能力是装出来的. 经常会有女性程序员坦白说遭受"骗子综合征(i

做程序员压力山大,很多人都快疯了

软件程序员在如今看来是一个既能挣钱又有工作保障的职业,但是,这种职业对你的精神健康却会造成巨大的伤害. 有两种事情几乎能让程序员疯掉. 一个是被人们称作"骗子综合征(imposter syndrome)"的东西.患这种症状的人通常是发现一起共事的所有程序员都比自己聪明.比自己有天份.比自己有才能.你生活中一直恐惧中,担心其他人会最终发现你是个冒牌货.你的技术和能力是装出来的. 经常会有女性程序员坦白说遭受"骗子综合征(imposter syndrome)"的折磨,这

“你不适合做程序员”

我的一位同事,他带他读小学的孩子去学钢琴,通过关系找了一位有点名气的退休的老教师,学费不菲.他说其实他并不知道为什么要学,但是看到那么多孩子都在学 钢琴,他想,他的孩子不能落后.一个月之后,他去问钢琴老师,对孩子的学习有什么建议没有.钢琴老师用尽了委婉的表达,最后说: "对于你的孩子在学音乐方面,我最大的建议,就是你的孩子最好别学音乐". 什么?! 这位同事听了当然恼怒,但是转念一想,老师未尝不是负责任的.通常这样的老师,赚钱之心,都会忽悠家长,或者好话歹说,很少有说"不&q

程序员必读书单(转)

  原文链接:http://lucida.me/blog/developer-reading-list/ 关于 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读.旨在成为最好最全面的程序员必读书单. 前言 Reading makes a full man; conference a ready man; and writing an exact man. Francis Bacon 优秀的程序员应该具备两方面能力: 良好的

程序员必读书单

关于 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读.旨在成为最好最全面的程序员必读书单. 前言 Reading makes a full man; conference a ready man; and writing an exact man. Francis Bacon 优秀的程序员应该具备两方面能力: 良好的程序设计能力: 掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列): 理解计算机科学的核心概念