每个人都有自己的工作习性,工程师也是如此,他们容易看别人的程式「不顺眼」,想要全部重写。这个习惯如果发生在小团队还好,但大型协作案禁得起这样「砍掉重练」的资源浪费吗?
群晖科技(Synology)网路储存装置(NAS,network attached storage)的核心作业系统(DSM,DiskStation Manager),就是规模最大、复杂度最高的大型专案。以最近的2 个版本来看,相差的程式码将近千万行。群晖动用超过200 名工程师、700 多个专案共同协作。
在群晖,产品开发流程主要包含3 个阶段:产品设计、研发及验收测试。设计阶段需要工程师、专案经理(PM,project manager)、品质管制(QC,quality control)等相关部门,共同确认产品规格;研发阶段则需要工程师彼此检视程式码的品质与盲点;最后则是针对系统做不同的效能与压力测试。
群晖科技基础架构与网路部门资深开发研究员林宏昱表示,软体开发每个阶段会产生的失误都不一样,尤其是写程式,错误无可避免,「小团队转个头就可以沟通,但大团队会需要规范,透过制度解决、预防问题。」
自动化系统协助,降低编译失败率
一般来说,工程师会先在自己的电脑里撰写程式码,等到完成一个段落后,把程式码转成机器码(编译),再把程式「丢」进服务主机。这个过程中,如果一开始写的程式码有错,称为语法错误;如果无法正确转换成机器码,就称为编译错误。
群晖透过程式审码(code review),要求工程师程式写到一个段落,须交由另一位同事看是否有语法、逻辑上的错误。如果没有问题就在程式上刻上名字,以示完成审核。
另外,由于每个工程师有自己的编码风格,选用的开放原始码或资料库也都不同,由多位工程师协作开发作业系统,大大提升编译失败的可能性。
林宏昱解释,就像盖房子要选用自己顺手的工具,软体开发也要选择工具,但困难点是,编码就像树枝向上发展,而树根就是工具,一旦选错或是选到不好的工具,很难替换。
为了避免编译失败,群晖2015 年开发一款名为「甘道夫」(Gandolf)的系统,在不同专案签入时,会自动执行编译与单元测试。当编码不符合需求或有任何问题时,系统会拒绝存取,把不符合的内容挡在系统外,也能在早期发现问题。
研发设「专案拥有者」,建立当责文化
他们平均每天执行甘道夫系统31 次,在2020~2021 年间编译失败率降低了6.73 个百分点。假设每次编译失败平均得花费4.5 小时修复,自动化系统的协助,为他们省下超过1 万小时的开发时间。
林宏昱表示,专案的分工明确能让负责人有当责观念,不只是PM,研发单位也会有专案拥有者(project owner),他必须针对产品的每个面向做维护,不只是产品本身,也会想到使用者体验面,「让那个人负责,就会有更大的动机、积极度关注产品的各种问题,进而提升品质。」目前研发部门的重修率(redo rate)维持在2% 以下。
不同于许多科技公司指名道姓的文化,群晖利用流程检视产品,让每个人都可以点出问题,「在流程上可以确保问题后续会有人帮我验证,人对人的意味就没那么强,也不会有隐瞒失误而让雪球愈滚愈大。」
评论0