技术的发展离不开科研的创新和工程的落地,本文作者刘杨教授的程序人生起于兴趣,成于夜以继日地编程和科研,而后他将工程与科研相结合,对软件工程数字化进行深入的研究与实践。本文中,他分享了在开源吞噬软件的今天,对软件工程数字化的一路探索心得。
文 | 刘杨
出品 |《新程序员》编辑部
过去二十多年,世界经历了信息化到数字化的转变。我们看到企业应对技术的挑战,也清晰地看到如今整个行业对软件管理和信息安全的更高需求及标准。我们在学校里做科研,用专业的论文和报告发表研究成果,同时也聚焦于帮助企业解决关键问题,提供一些更有效的技术支持和赋能方法,持续让科技提升业务价值。
作为一名软件工程领域的科研工作者,我将十多年来的思考和体会整理出来供大家参考。关于代码、程序、软件与应用,希望能通过本文的叙述,与大家共同探讨和践行。
我的编程之路
记得小学六年级时,一个非常偶然的机会,我报了一个输入法培训班,由此对计算机产生了浓厚的兴趣。后来阴差阳错地靠着会打字,竟然成为特长生进入了一个重点初中。从此就立志要学习计算机,它也成为了我的理想信念。但无奈高考成绩并不太理想,分数未能达到浙江大学计算机专业的录取线,就顺势选择了电气信息自动化专业。虽然电气信息听着跟计算机有点联系,但课程却完全不一样。恰逢CSDN的《程序员》杂志(《新程序员》前身)在2000年初开始发行,看着里面程序员的故事和前沿技术介绍,更加激发了我对计算机学习的渴望。
人生有时候就是充满转折,大学入学三个月后,我非常幸运地得到了去新加坡的留学机会,顺利进入了新加坡国立大学计算机科学专业读本科,终于实现了儿时的梦想。本科四年,从一开始学程序、写程序,到组队写程序,每天都乐在其中。大学期间令我印象特别深刻的是,因为《程序员》是技术性的刊物,不太容易买到,每次回国我都在满大街的报刊亭找着买,每次读完都收获满满。到毕业时,我的代码量算起来已经有了五万行,感觉自己终于成为了一名程序员,自豪感油然而生。
本科毕业时,计算机行业正处在Dot-com泡沫(互联网泡沫,又称科网泡沫)后的低潮期,于是我决定留校继续读博(直博),主要从事程序验证的研究。当时也不是很清楚哪些研究方向有意思,只是觉得跟“程序”相关就挺好。起初给师兄做助手,写算法,没想到实验效果还不错,靠着大学实习积累的开发经验逐渐将算法做成了几个小工具,最后逐渐演变成一个软件验证平台。博士期间从写程序、设计程序,到最后逐渐转变成分析程序。四年时光,总共写了近百万行代码,那时感觉自己终于开始理解程序了,它也不断拓展了我对技术的认识。
靠着读博期间所做的软件验证平台,我非常幸运地拿到了新加坡南洋理工大学的教职,成立了网络安全实验室(见图1),到这里我才真正开始软件工程的科研之路。
图1 南洋理工大学网络安全实验室科研团队合影在过去十年间,我们的科研范围基本涵盖软件开发过程中的各个步骤(需求分析、架构设计、开发、测试、运维等),软件的各种质量属性(正确性、安全性、可靠性、性能等),各种类型的软件和系统(手机应用、人工智能模型、物联网、自动驾驶系统、智能合约等)。
新时代软件开发的现状和挑战
随着软件行业的不断发展,软件系统本身日趋复杂,对应的软件开发过程亦逐渐成为一门系统、全面的工程科学。任何一个功能精良、复杂的软件系统背后,都离不开庞大的研发与管理团队。然而,当软件系统复杂度爆炸式增长,以往重复堆叠劳动力、一拥而上以扩充产能的工程手段在软件开发中逐渐失效,各式各样的软件开发过程模型、管理手段则不断涌现。
从瀑布、增量、螺旋等早期模型,到21世纪的敏捷开发、DevOps等,一代又一代的软件开发模型层出不穷。软件开发支撑体系也日益完善与系统化,如交互式团队协作、模型驱动开发、微服务、低代码、无代码开发等概念、技术、工具已经走进了我们的世界。然而,这些技术手段在不断改变软件开发方法的过程中,也在逐渐增加过程的复杂性,这就对软件工程的过程管理提出了更高的要求。
此外,与商业公司大型复杂系统自上而下的“大教堂”式的软件开发完全不同,另一种注重用户、提倡尽早发布的如“集市”般的自由软件开发模式经受住了时间的检验。其中,最典型的案例就是Linux系统的成功。正如《大教堂与集市》中所说,Linus Torvalds所奉行的“尽早尽多地发布,委托所有可以委托的事,对所有的改动和融合开放”的软件开发理念,将散布在全球的开发者,仅仅是通过互联网这种松散的合作,就鬼斧神工般地造就了一个世界级的操作系统。而这种自由环境中造就的开源软件由于其自由、开放的特性,逐渐被纳入到主流软件的开发过程中,其中不乏优秀的开源项目被广泛集成、使用到主流软件厂商的项目中,从而避免了“重复造轮子”,极大地提升了软件开发的效率。
回顾我们软件工程方向的研究经历,也是围绕软件开发一步一步成长的。从软件的质量出发,最初使用了形式化方法来对软件进行建模,并验证软件的正确性。我们开发了一系列完整的软件形式化建模语言和验证算法来分析并发系统、实时系统和概率系统,同时把这些方法应用于分布式系统、安全协议、物联网等。最终这些能力集成到了一个名叫PAT(Process Analysis Toolkit)的形式化验证平台(见图2)。
图2 PAT形式化验证平台架构但当软件的复杂性增加或规模变大时,形式化方法就面临着可扩展性挑战。同时,对开发人员也有非常高的数学建模能力要求。于是,我们就将科研的方法逐渐转变为程序分析的技术:静态分析和动态测试。这两种方法虽然无法像形式化方法一样提供完美的结果保证,但就实用性而言,带来了大幅提升。
我们使用程序分析的技术做了各种应用,包括缺陷和漏洞检测、软件性能评估、软件架构逆向、软件演化和开发效能分析等。尤其在软件漏洞方面,开发了一系列动态测试技术,找到了大量的商业软件和网站的未知漏洞,由此提升了软件的安全性。到现在,我们已经开始使用动静结合的方法,用静态程序分析定位可能出现的缺陷和漏洞,然后制导测试算法来快速触发漏洞(见图3)。
图3 漏洞检测平台随着代码量的增加和开源代码的广泛使用,我们可以接触到大量的代码数据,很自然地就又开始考虑如何用代码大数据和人工智能算法来赋能软件开发。我们将人工智能的算法应用到了需求理解、克隆检测、代码搜索、代码补全、漏洞检测和软件测试。这些尝试让我们真正去思考程序语义的重要性,以及如何把程序语义表征和深度神经网络做合理的集成。于是,我们通过迁移学习从强类型语言中学习弱类型语言的变量类型,其中涉及程序语义理解和深度学习的可解释性。尽管这些工作取得了一些有价值的进展,但人工智能在软件工程的应用中仍然处于早期阶段,还有很多挑战亟须解决。
立足开源,软件工程数字化的探索之路
由于软件开发日趋复杂,为了有效缓解软件开发过程的紧耦合以提升开发效率,业界对面向软件开发过程中制品的输出、验证及端到端的追溯提出了更高的要求,比如正向开发过程中需求文档的表达、软件架构模型的设计与验证、需求文档的反向追溯、架构设计模型在代码层面具体实现的验证、代码实现到设计模型及需求的反向追溯等。随着开源软件的大规模使用,由于其自由、开放、不可控,进一步加剧了对软件工程端到端验证的迫切需求,这最终促使我们逐渐明确并走上了探索面向开源软件工程数字化的道路。
据Gartner数据,99%的组织在其信息系统中使用了开源软件。Sonatype公司也对3000家企业的开源软件使用情况展开过调查,结果表明每年每家企业平均下载5000多个开源软件。现代软件业高度依赖于开源体系存在的趋势已不可更改,但开源软件在为企业提供便利的同时,也有一些风险问题不容忽视,包括知识产权、开源协议组件冲突、安全漏洞、数据泄露等。如近半年来接连出现的Log4Shell及Spring4Shell“核弹级”漏洞事件、开发者Marak Squires“删库跑路”事件、Elasticsearch许可证变更事件、node-ipc反战“投毒”事件,以及高频出现的npm恶意组件攻击等,这些无一不在撕扯着脆弱的开源供应链。
在这种情况下,想要同时做好软件质量和安全管理,已经变成了非常有挑战的事情。这也更坚定了我们接下来的研究方向:探索更好的方法来开发程序,开发更多的标准化工具来分析,理解和管理软件及其开发过程,并完善整个开源的管理机制。尤其是在开源代码大量被使用的情况下,开源治理和软件供应链治理变成一个重点的科研课题。
基于此,我们在2017年孵化了面向开源组件检测的软件安全公司Scantist。以软件安全为切入点,软件成分分析为基础,从开源软件本身的开发、维护、发布、被依赖使用的过程中,寻求对开源软件的有效维护及管理策略,并通过深入理解各个编程语言、包管理器等开源核心模块的工作模式,探索开源供应链的形成、传递及演变,形成一套面向开源供应链治理的解决方案。
除了当前业界较为关注的安全漏洞及许可证相关的诉求,我们也开展了大量针对开源软件质量评估的相关研究工作。基于团队在软件工程、程序分析等领域多年科研工作的沉淀,逐渐凝练出一套面向开源软件的多维度软件画像的框架,围绕开源软件代码、开发过程、开发团队数字化,从质量、安全、开源成分、可维护性、成熟度、活跃度及商业风险等多个维度,度量开源软件本身的健康程度,并从团队组成、开发风险等不同角度理解开源项目核心开发团队的健康状态。从而实现软件开发过程中对开源软件的精准使用(如技术选型推荐、风险分析等),识别开源环境中的关键基础组件,监控其开源项目及开发团队的健康状态,并引导相关商企、社区积极参与以提升开源基础组件的质量,从而妥善治理整个开源生态。
在开源软件画像的基础上,我们同时提出了软件工程数字化平台的设想,把软件开发的整个过程做数字化的分解和记录,通过把软件架构和开源组件作为软件骨架串联起软件开发的全过程,让软件开发过程透明化、可视化和可追溯化,做到定量地理解开发过程、开发质量、人员效能和开发瓶颈。当然这个平台的开发和投入是非常庞大的,希望能和更多的合作伙伴一起来推动。
几乎每个商业项目都使用开源软件来节省开发时间、降低公司成本、避免重复造车轮,但软件公司对这些代码的品质和来源却未必都给予了足够的关注和重视。所以我想提几点关于开源软件行业的想法和建议:
做一名坚定的长期主义者。开源软件的正确和安全使用需要社区的力量,我们要共同维护开源市场和生态,为开源软件行业带来更加蓬勃的生机,要在规则和自由的平衡中修行。
开源软件已经成为网络空间的重要基础设施。现在许多企业都已拥抱开源软件,各方也都应积极开展开源软件源代码检测工程,推动内部建设开源软件治理体系,形成开源软件管理的长效机制。政府、企业、开发者、软件从业者和使用者等各方应针对开源软件建立完善的法律规范,引入审批、技术评估、合规使用、漏洞检测、更新维护、应急处置、停用退出等制度。
星辰和大海。无论技术还是科研出身,都要积极参与并开展前瞻性的技术探索和产品研发,努力推进开源事业的发展,加强关于开源的规范引导和教育,从技术、应用和法律层面做出相应的贡献。开源社区(包括代码托管平台、软件协会、行业联盟)、开源基金会等开源组织需要充分利用自身和协作优势,号召更多的贡献者,在发展壮大开源项目影响力的同时,肩负起开源安全责任与使命持续前行。
结语
软件工程作为一个复杂而重要的工程活动,其应用促进了我们的工作和生活更加高效、便利。我从一个学习编程的学生,到研究软件的科研人员,再到一家初创公司的创始人带领团队为软件开发提供自动化工具,身份的转换也不断驱使着我进行自我迭代。
这二十年,我深刻地感受到了技术和软件的重要性,并努力把它们延伸到产品服务和应用场景中以发挥更大的价值,希望通过理论和实践积累,培养富有社会责任感的复合型人才,为行业发展积蓄力量。我也希望可以陪伴程序员们一路成长,帮助他们找到“自己的事业”。在未来的五到十年中,我会继续推进软件工程数字化的研究和转化,并为更可靠、更安全的数字化世界做出力所能及的贡献。
作者简介
刘杨博士,新加坡南洋理工大学(NTU)计算机学院教授,NTU网络安全实验室主任、HP-NTU实验室主任,新加坡国家卓越卫星中心副主任,网络安全公司Scantist 联合创始人。科研方面,刘杨教授一直从事网络安全、软件工程、人工智能等方面的研究工作。