66岁还在写代码,这个程序员想把bug扼杀在“摇篮”里

2020 年 11 月 24 日

66岁还在写代码,这个程序员想把bug扼杀在“摇篮”里

在刘新铭长达 36 年的职业生涯中,他有一半的时间都在写代码。据刘新铭估计,他写的代码有百万行到 150 万行了。


如今,作为鉴释联合创始人兼首席架构师,66 岁的他依然会写代码,不过主要专注在核心算法层面。在国内,这个年纪仍坚持编写代码的情况非常少见。


刘新铭的程序员生涯源自 1984 年。这一年,他从美国犹他州立大学毕业,并获得了计算机科学硕士学位。毕业后,他在 Daisy Systems 公司找到一份工作,并由此正式进入软件开发行业。此后十年,他都在从事编译器相关的工作。从 2000 年开始,他先后在惠普和英特尔工作,一直与编译器和性能分析打交道。


2016 年,刘新铭进入华为美国子公司 Futurewei,担任研发副总裁。他说:“我在 Futurewei 工作过两年,主要在数字化转型上提供帮助,因为华为的软件之前都是用 Java 写的,我们把它变成更现代的、更适合在云端架构上运行。”正是在 Futurewei 的工作,让他结识了后来的创业合伙人,“这也是因缘巧合,我们几个创始人都曾在华为做过资深管理或架构方面的工作”。


2018 年上半年,刘新铭回国参与创立鉴释。这一年,他已经 64 岁了。


嗅到了 IT 产业的新机会


长期软件行业的从业经历和丰富的学识,让刘新铭敏锐地捕捉到 IT 行业变革中蕴藏的机会。他表示,“如果从系统架构的演变角度看,摩尔定律在未来十年可能会失效。我们看到前 25 年软件行业的飞速成长,后来云架构诞生,再一直到最近两三年,(软件行业)整个性能的提升期结束了。”


前任斯坦福大学校长、图灵奖得主 John Hennessy 曾指出:未来十年,IT 产业的变革将从通用的 CPU“蜕变” 成以各种应用为主的架构,即特定领域架构 DSA(Domain Specific Architecture)


当许多特殊架构出现后,整个软件系统会变得非常复杂,“这给我们做编译器和系统软件的人提供了一个全新的机会。因为在当前环境下,你很难搭建起各种复杂的环境,然后让硬件性能凸显出来。这是一个相当复杂的操作。” 刘新铭说。


在复杂度提升的同时,软件质量的重要性就凸显出来了,并且安全漏洞也会不断出现。最近十年,安全漏洞的快速增加,软件问题也大量涌现,这都已经成为笼罩在软件行业头上的阴影。如何管控好急剧增加的安全问题和软件质量问题已经成为了全世界面临的共同难题。



统计显示,有 82% 的漏洞存在于应用程序代码中。并且,作为软件世界中的重要组成部分,开源软件的安全令人堪忧:每 1000 行开源软件代码中就有 14 个安全缺陷,每 1400 行开源软件代码中就有 1 个高危安全缺陷。此外,蓬勃发展的开源软件进一步放大了安全问题。换句话说,一个开源软件出现漏洞,会导致依赖它的其他开源软件受到影响,而且层层关联依赖,这就导致了非常隐蔽和复杂的攻击面。


而在中国,软件相关的安全问题和质量问题异常突出。


拿来主义——猴子、香蕉和丛林


过去 20 年,随着互联网在中国的流行,“拿来主义”变得很常见,比如人们看到一款好的开源产品或工具,直接拿来就用。但刘新铭认为,这样的“拿来主义”是存在问题的。西方有一个流传甚广的比喻:猴子、香蕉、丛林(Monkey、Banana、Jungle)。一只猴子想吃香蕉,于是便去寻找香蕉,到最后却搬回来一整个丛林。它的含义在于,猴子真正想要的是香蕉,从香蕉树上摘到香蕉,但香蕉树却跟整个丛林缠在一起,猴子没法把香蕉树从那片丛林里单独剥离出来,最终只能把整片丛林搬回来。


中国软件行业里或多或少存在着“大丛林”的问题,“中国软件产业面临的普遍现状是:很少有软件能做到想吃香蕉就只拿香蕉而不拿别的”。事实上,全世界的软件都存在这样的问题。“我们能否把那些没用的东西剥离开来,其实是很难的,因为全部东西都绑在一起,尤其是 Java 这类语言,是很难剥离的。所以在这种情况下,软件质量问题就会显得比较严峻。”刘新铭表示。


不过,这种挑战也是机遇,更是创业的机会。在刘新铭看来,“真正解决软件质量问题并运营良好的公司在国内是凤毛麟角,很少有竞争者”。更好的信号则是中国的软件市场巨大无比。有数据显示,2019 年,中国软件业务收入达 7.2 万亿元,同比增长 15.4%。


举个例子,一个人在月收入只有 1000 元时,他关注的事情与月收入 1 万元或 10 万元时是不一样的。当月收入只有 1000 元时,他在乎温饱;而月收入达到 10 万元时,他会关注生活品质。刘新铭认为,“中国的软件正在经历从 1 万元到 10 万元的过程,这个速度还会加快。比如欧美的安全扫描工具在针对小程序上的应用就存在不足。


将软件 bug 扼杀在“摇篮”里


为了解决软件质量和安全问题,鉴释想要打造好的工具,找出软件中的问题,同时还能教用户怎样解决问题,比如爱科识,通过使用深层的编译器级别技术来检查数据流,分析软件应用程序,识别代码缺陷。其次,从管理入手,用更科学的方法去管理软件开发项目。


作为软件的基石,源代码的安全性至关重要。2014 年,Heartbleed(心脏出血)漏洞席卷全球,不仅让整个中国互联网为之一颤,而且导致全球超过三分之二的网站“心脏出血”,可谓影响深远。它导致全球互联网大量私钥和其他加密信息处于暴露危险下,受影响严重的系统甚至可以从服务器中直接获取用户密码。而这个漏洞正是来自开源软件 OpenSSL 中的一个 bug。



美国国家安全局 NSA 则利用这个漏洞窃取全球各地的信息。“开源软件中有很多漏洞,如果是厉害的人或机构发现漏洞,假设其有足够的权力和财力,就会做一些不该做的事。如果有坏人知道了,他就会做一些坏事,盗窃数据,让你花钱消灾。”刘新铭这样说。


然而这种情况在中国更严重,他补充道,“想吃一个香蕉,结果搬回来一片丛林,却不知道那片丛林里有什么虫子、蛇和猛兽。只有当我们真正被吞掉后,知道就太迟了”。


随着软件的不断发展,影响源代码安全的因素也更复杂。比如,一个程序员应客户需求写了一个专门摘香蕉的软件。后来,又有个客户来了,看到这个软件挺好,却想用它摘桔子,而再下一个客户想用它来摘苹果,这个软件就这样越长越大。当第三个客户要求摘苹果时,这个程序员就有两种选择:一种情况是重构软件,简化功能,把它写得干净、漂亮。但最普遍的情况是,明天就要交付软件,程序员只好赶工,偷工减料的工作写不出好的代码,软件质量就这样越做越差。


漏洞猎人——静态代码分析工具


那如何解决源代码安全?静态代码分析工具可以派上用场。


据了解,静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,并找出代码隐藏的错误和缺陷,比如参数不匹配、错误的递归和可能出现的空指针引用等。


统计表明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。对此,刘新铭表示,“我们使用深层的编译器级别技术,可以掌握程序中的所有语义,这样在数据流和控制流上就能精确地掌握所有程序里的内容。比如一个变量,在哪宣称的变量?到哪用上了?中间经过哪些控制流?用编译器可以查得很清楚。”


有一次,他们分析国内一家知名公司的开源项目,最后找出来 2000 多个代码漏洞。事实上,静态代码分析工具在查找代码漏洞上也分为两个层次:一是找什么漏洞,二是查找某一类的漏洞。他表示,“如果是查找某一类的漏洞,我们可以保证把特定类型的漏洞全部找出来。这是算法的优势。”


不过,刘新铭也坦承,“我们把所有已知的漏洞都做完了吗?没有,我们公司只有两年,不可能把所有已经看过的漏洞都找出来。”目前,大多数软件开发团队依赖动态测试方法,检测软件中的缺陷和运行时错误。动态测试需要工程师编写和执行大量测试用例,“动态测试就是把测试用例灌进去,然后让可能出现的错误在软件发布前报出来”。但是由于动态测试不能穷尽所有情形,单靠它还不足以确保软件安全可靠。



静态代码分析工具不仅能快速地进行错误检测,验证代码是否合规,而且成本低。


在软件开发过程中,假设在开发过程中找到 bug 并修复,成本为 1 元。到了软件测试阶段再发现并修复,成本就来到 10 元。而当软件交付给客户并应用到其业务场景中,出了问题,那成本直接飙升到 160 元。因此,静态代码分析工具的价值显而易见。


刘新铭认为,一款好的静态代码分析工具应具备四个要素:


  • 第一,找出来的软件错误要靠谱

  • 第二,速度快,效率高

  • 第三,价格便宜

  • 第四,门槛低,易上手,容易使用


目前,市面上的静态代码分析工具很多,各有千秋。对技术团队或企业来说,关键是怎样去选择一款适合自己的工具。这里一般会存在两个极端:有些企业可能会选择最便宜的工具,而另一些企业就会选择最贵的工具。刘新铭认为,为了产品质量可以根据业务需求来定制的代码规范是值得追求的目标。最合适的工具应该既不是最便宜,也不是最贵的,而是用能付出的价值获得最好的回报的。


“但真正的困难是卖给谁”。


举个例子,有个开明的软件开发经理,管理 20 人的团队,让团队成员用静态代码分析工具对代码扫描一遍。“我负责应用开发,跟老板要了大价钱买的工具,结果不买不知道,一买才知道软件居然有那么多漏洞,找出来这么多错误。那你觉得,这个开发经理应该买找出来错误最少的,还是最多的呢?还是说让老板来决定一切?不同角色想的角度是不一样的。当用户尚未尝到切身之痛时,他们的选择可能就会随机一些。一旦遇到真正痛点,他们就会选择那个能找出最多错误的工具。”刘新铭这样解释道。


在这个方面,美国大型互联网公司的经验值得借鉴。今年 6 月份,在 SOAP 2020 和 PLDI 2020 大会上,谷歌和 Facebook 内部静态代码分析的负责人发表了主题演讲。2012 年,它们在内部开始使用静态代码分析工具,但没有效果。根据统计,修改软件中错误的比例是 0。既然收获不到响应,它们随后使出“一招杀手锏”,不约而同地将所有人的代码提交到公司的代码仓库里。代码仓库则会进行自动分析,出具一份 bug 报告,放到公司内部的一个公告栏上。在启动这项举措后,代码错误的修复率从 0 跃升至 70%。


“当全公司都在看你时,你就会去修正错误,后来,软件中的错误越来越少。因为每个人在提交前,都会自己先检查一遍”。


他眼中的中美软件产业


写了 36 年的代码,刘新铭对于中外软件产业的差别有着自己的了解。在他看来,中外软件产业最大的不同是,“我这个年纪还在写代码,在中国大概只有我和我的合伙人了”。中国的程序员普遍面临“35 岁这道坎”,而大龄程序员在美国却非常多。据悉,C 语言之父丹尼斯·里奇在去世前都在写代码。


第二个不同点是美国的软件开发人员写代码时,会从应用一直到系统硬件,“一路看到底,看穿、看透”。因此,美国能搞出 DNN、CNN,“虽然加拿大人搞出来深度学习算法,但如果没有英伟达的 CUDA 算法平台环境,软件发展起来也有难度”。


刘新铭表示,“美国的软件开发人员是在硬件与软件之间来回反复地应用、学习。即使是普通的程序员,他都会努力去了解,这个软件到底要解决什么问题。但是在中国,大家习惯了单纯为了完成任务,到现在都还是这个心态。”


不要“做一天和尚撞一天钟”


或许正是这种“做一天和尚撞一天钟”的心态,让一些程序员无法精进,提高自己的能力。到了 35 岁,自己的知识跟不上技术的发展速度,体力比不上年轻人,并且“脑子还没年轻人转得快”,最后只能被淘汰。


大家要有危机意识,不是说 35 岁,我就要被淘汰了。你要今年比去年好,今年比去年提升 30% 就行。如果能给自己定小目标,本周比上周好,今年比去年好,就能不断精进“。


并且,开发者每年还要对自己有整体的评估。刘新铭说:“我去年毕业,一定要胜过今年毕业的人。如果我做一件事不能比他好,那自己就对不起自己。”


做了几十年的软件开发的他也给国内的开发者提了一些建议:


  • 第一,开发者应该要有对自律的要求。“我给自己定的目标有一定的精确度。”从业多年,刘新铭写代码有个原则:当天写的代码,当天测试完毕,自己写测试结果。“明天来了,我就知道那个活干完了。我从来不担心昨天干的活有 bug”。

  • 第二,开发者不能有“撞钟”的心态。“很多人认为:我拿一份薪水,时间到了,我上班,时间到了,我就下班,无所谓做的好不好,只觉得那是老板的事。”刘新铭认为,开发者必须要自我要求,“假设公司是自己开的,要做到什么程度,自己才会满意。”

  • 第三,要自我突破,每个阶段都有每个阶段自己的进步,通过坚持严格的自我突然,不论是开发者或者其他行业的人员都可以不断地向上走,这样的进步事实上是无限的。

2020 年 11 月 24 日 12:362216
用户头像
万佳 InfoQ编辑

发布了 446 篇内容, 共 160.7 次阅读, 收获喜欢 898 次。

关注

评论 6 条评论

发布
用户头像
刚开始就做编译器相关工作,和我们这种低端码农本来就不一样
2020 年 12 月 07 日 11:00
回复
用户头像
看着還很有動力,發給我的小弟們也看一下
2020 年 12 月 02 日 11:16
回复
手动狗头
2020 年 12 月 02 日 11:23
回复
用户头像
看这个文章的人,一般都是大龄程序员了吧,恐慌中
2020 年 11 月 30 日 09:58
回复
作为还在入门边缘的我,还是挺受激励的,冲冲冲,哈哈。
2020 年 12 月 01 日 09:09
回复
用户头像
活到老,学到老
2020 年 11 月 25 日 09:53
回复
没有更多评论了
发现更多内容

笔记:《如何系统思考》之如何做到系统思考

wiflish

思维方式

《TCP/IP详解》概述

网瘾少年SEC

TCP 网络协议 IP

瞎琢磨先生の好物推荐(软件/网站)

瞎琢磨先生

瞎琢磨先生の常用的 linux 命令

瞎琢磨先生

Linux Shell

婚姻就是合伙开公司,各自做好自己的工作很重要

鼎玉谷

管理 婚姻 公司 付出 人情

写作的意义到底是什么

七镜花园-董一凡

写作

翻译和产品本地化的区别是什么?

葛仲君

翻译 本地化 全球化 产品开发

Redis学习笔记(基础命令)

编程随想曲

redis

DDD 实践手册(4. Aggregate — 聚合)

Joshua

设计模式 领域驱动设计 架构模式

开始每周写作计划

M1racle

JAVA小抄-000-初始

NoNoGirl

Java

C++定时器的实现

程序喵大人

c c++ C#

当我们谈到ThreadLocal的时候,我们在谈什么?

Jason

Java 多线程 ThreadLocal

各大公司面试题分类整理

吕小毛

后端 面试题

习惯与惯性

伯薇

个人成长 习惯 习惯养成 提升能力

读懂才会用 : Redis的多线程

小眼睛聊技术

Java redis 学习 程序员 编程语言 后端

浅谈SpringCloud之服务注册中心Eureka

北漂码农有话说

面试指南 | 终于要跟大家见面了,我有点紧张。

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

centos7 maven私服自动启动

kcnf

内存对齐

程序喵大人

c c++ C#

对你来说,阅读是另一种生活的方式吗?

叶小鍵

如何对Code Review的评论进行分级

宝玉

代码审查 Code Review

重新认识Go语言中的slice

麻瓜镇

golang

如何利用数据异构实现多级缓存或者数据迁移

松花皮蛋me

缓存 分布式 分库分表

金融「中台」十宗罪

fino星君

中台 企业中台 业务中台

关于GDB你需要知道的技巧

程序喵大人

c c++ C#

基于vue(element ui) + ssm + shiro 的权限框架

吴邪

准备重读测试驱动开发

escray

学习 CSD 认证实战营

机会是留给不停寻找他们的人,而不是原地等待的人

非著名程序员

程序员 提升认知 机会 行动派

Clickhouse 性能测试

久吾尔岂

C++线程池的实现

程序喵大人

c++ C# 线程池

66岁还在写代码,这个程序员想把bug扼杀在“摇篮”里-InfoQ