0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

编程与软件工程

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2022-09-22 10:56 次阅读

在软件工程的概念被提出之前,IT行业经历了软件危机[1]。当时IT行业开发的软件正在经历从小规模到大规模的过程,而没有系统化的方法论指导大规模软件的开发过程,导致软件工程师之间的协作非常的低效且质量难以得到保证。

直到IT行业意识到软件需要一种工程化的方法论来指导开发过程。

软件工程是将系统化的、规范的、可度量的方法用于软件的开发、运行和维护的过程,即将工程化应用于软件开发中(IEEE,1993)。

编程与软件工程

编程是利用某个编程语言实现某个算法或技术方案从而来解决某类问题,但这类问题规模一般很小,也不太会随着时间产生变化,或者其生命周期也很短,不需要考虑长期维护的问题。但软件工程与编程的区别在于前者需考虑时间与规模带来变化的影响。

时间的因素使软件工程需要考虑质量的问题,糟糕的质量会产生很多认知负荷,最终难以长期维护。规模的因素使软件工程需要考虑协作的问题,低效的协作可能与沟通方式有关,最终拖垮交付进度。

软件工程发展史

早期的软件工程借鉴了项目管理的流程,而传统的项目管理关注生产过程大过于人。

15784476-3a11-11ed-9e49-dac502259ad0.jpg

以过程为中心的软件工程过程方法论主要有瀑布式与统一软件开发过程。这种软件开发过程需要产生大量的正式文档,通过严格的流程管理控制软件的开发过程。但软件开发过程却是一个知识密集型的生产过程,过于关注流程而忽略人的因素导致这类方法论很难适应需求变化,花费很多时间开发出的产品很难满足变化迅速的市场,最终逐渐被淘汰。

以人为中心的软件开发过程是为适应需求变化的代码编写和团队组织方法论。这类逐渐产生以极限编程与敏捷过程两种方法论。

15cb36fe-3a11-11ed-9e49-dac502259ad0.jpg

这里以敏捷过程为例,敏捷开发至今已经成为很主流的软件开发过程。

15ec27d8-3a11-11ed-9e49-dac502259ad0.jpg

敏捷开发倡导信任人而非死板的流程与计划管理,通过一系列如上所示的实践来营造一个信任为主的文化土壤,从而打造一个高效的研发团队,最终开发出高质量的软件成品。

当然本文不是介绍敏捷开发过程的,而是介绍Google公司的软件工程实践。

Google是一家伟大的互联网公司,同时研发出来了大量知名的软件产品。Google是怎么做到的?在2020年Google的三位工程师@TitusWinters[2]@manshreck[3]@hyrumwright[4]出版了《Software Engineering at Google[5]》这本书来介绍Google的软件工程实践,这给了我们一个机会一窥究竟。

本文是Google软件工程系列的上篇之文化篇,来介绍软件工程最重要的一个基石:文化要素。

Google软件工程文化

以下是《Software Engineering at Google》一书第二部分文化篇的思维导图,由于此部分占全书近20%,所以本文不会详细的介绍其中的概念,想详细了解的读者建议阅读原书。本文会结合此书这部分内容分享作者的个人理解及相关经验。

1615c5b6-3a11-11ed-9e49-dac502259ad0.jpg

文化为何是软件工程很重要的一个要素?我在刚入IT行业时对软件开发的理解只是学习某个编程语言来写代码。之后经过多年多个项目的历练,我逐渐对整个软件开发的全貌有了一定的理解。但还是停留在对软件开发过程的了解及相关工具的使用,直到读完这本书的文化篇后才意识到了文化的重要性。

文化虽然是和技术没有直接关系的一些软性的东西,但文化就像水一样,利用好它的力量,可以让软件开发变得更高效、高质。

团队协作的基石

软件开发早已不是单兵作战的时代了,虽然人们喜欢听黑客奇迹般的故事,但现在的中大型软件都是团队的集体智慧产出。

16db1fdc-3a11-11ed-9e49-dac502259ad0.jpg

17068834-3a11-11ed-9e49-dac502259ad0.jpg

如上是两大顶级开源基金会@TheASF[6]与@linuxfoundation[7]的知名项目,成千上万的软件工程师的集体协作开发了达上亿的代码行数最终才诞生了这些伟大的项目。

而团队协作最重要的是成员间的谦虚、尊重与信任。如果没有这些最基本的条件,集体协作将会困难重重,团队成员无法形成稳固的合作关系,时间和精力很容易被内耗完。

打造知识共享文化

软件工程与传统工程的区别在于其是一项知识密集型的活动,其中涉及到了大量的知识管理工作。知识管理[8]很容易做差,最终产生了以下的一些问题:

•缺乏心理安全:当一个新成员进入组织的时候,会因为缺乏心理安全感而不敢暴露自己不懂的知识,这会阻碍该成员的个人成长,最终也会传导到团队的开发效率上来。•知识孤岛:知识没有分享的文化土壤,每个团队都闷头搞自己的项目,会逐渐产生很多重复造轮子的现象。•知识单点故障:团队内的重要信息只有一个人知道,而这个人又没有分享给其他人,一旦这个人不在场,团队将无法正常运转。•团队知识断层:团队内的技术专家并没有意愿将个人的经验传授给团队其它成员,导致团队的运转离不开一小部分技术专家,一旦这些人离开,整个团队将无法正常运转。•鹦鹉行为:这种很容易出现在团队新成员,由于经验限制或背景上下文了解有限,而在不了解其原理的情况下复制一些代码。虽然系统可以运行,但潜在的埋下了一些问题。•知识禁区:团队成员由于经验限制或不了解背景上下文,而不敢修改代码库的某些遗留代码。

这些都是组织学习文化中会遇到的一些挑战。Google在打造知识共享文化上做了很多尝试,比如营造安全的学习环境,鼓励新人通过提问与分享来提高个人的技术。这些实践在敏捷过程中也可以看到,比如:

•鼓励个人反馈的文化(Feedback)。对事不对人,根据事实对成员提供建设性的反馈,帮助成员变的更好。•鼓励团队成员定期做分享(Session)。比如每周某个成员可以做某个主题的Session,这种实践能让分享者对分享的主题有更深的了解。•每日站会同步工作进度。不仅可以让其它成员了解你所工作的范围,还能告知其它成员潜在的交付风险。•定期回顾(Retro)。团队定期举行迭代回顾的会议,回顾最近工作中好的、不好的的方面及相关建议,最终制定出一些行动来提升团队的工作效率、质量与幸福感。•团队Wiki工作区。团队知识沉淀的体现,新人可以通过查阅这些资料迅速了解项目背景上下文。•代码评审(Code Diff)。代码评审在Google的软件工程中是一项全员必须执行的实践。代码评审可以提高团队成员的编码水平,发掘代码潜在Bug,识别代码坏味道,形成统一的编码风格,共享业务与技术知识,消减团队知识断层的影响,甚至可以解决鹦鹉行为与知识禁区的问题。比如我所在的项目上团队所有开发成员每天会拿出一小时做集体的Code Diff,虽然成本不低,但其收益也很高。•结对编程(Pair Programming)。结对编程看起来是两个人在做一个人的活,但一般也有两种模式:乒乓模式(Ping-Pong)与领航员观察者模式(Navigator-Observer),前者适合以TDD的方式开发,后者适合老带新。结对编程是成本高但非常高效的知识共享的实践,需结合项目实际的带宽决定当前是否采用此模式开发。比如我们项目会在交付时间不紧张时采用此开发模式。

以上的一些实践需结合组织或项目的实际带宽来决定是否使用,比如Code Diff一般是建议或者强制的,而结对编程是可选的,分享(Session)和回顾可能是定期或不定期的。

领导团队(Tech Lead

当做了一段时间独立贡献者(Individual Contributor)后,可能有机会做Tech Lead了。Tech Lead是一个团队必备的角色,具有一定的职权影响力,当然更多的是采用非职权影响力去带领团队。

如何领导团队是个复杂的工作,对技术人员来说,从技术到管理是很难的事情。

175839d6-3a11-11ed-9e49-dac502259ad0.jpg

对于此我的个人经验也不是很丰富,所以想了解此部分的推荐阅读此书原文。当然下面这些文章也不错:

•The Definition of a Tech Lead[9]•What Does a Software Tech Lead Do?[10]•Tech Lead[11]

工程效率测量

没有测量就没有优化。只有测量到团队的工程效率后,我们才有可能制定提升效率的行动。Google设计出了GSM框架来测量工程效率。

1815a4a8-3a11-11ed-9e49-dac502259ad0.jpg

工程效率的测量一般发生在大规模团队或组织级别,我所经历的项目上并没有此实践。对小型团队来说,可以通过简单的一些问卷调查这类定性的方式来收集团队成员的反馈,当然也可以通过一些量化的指标如流水线构建速度、迭代开发速率、代码静态分析结果、测试覆盖率等指标测量团队的工程效率。

总结

软件工程是一项复杂的知识工程,这让其区别于传统的项目管理。Google的软件工程文化与以人为中心的敏捷过程所倡导的理念有很多相似之处。

但反观国内很多软件公司虽然也用上了敏捷过程的方法论,但底层的文化土壤还是以过程为中心的方法论,对团队成员的不信任,没有分享文化,团队领导一言堂还是存在的。希望这种现象能随着国内IT行业的逐渐成熟越来越少吧。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3591

    浏览量

    93592
  • 编程语言
    +关注

    关注

    10

    文章

    1938

    浏览量

    34593
  • 软件工程
    +关注

    关注

    1

    文章

    31

    浏览量

    11070

原文标题:Google软件工程之文化篇

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    欧姆龙的PLC编程软件有哪些?

    欧姆龙(OMRON)是全球领先的自动化解决方案提供商,其可编程逻辑控制器(PLC)编程软件在工业自动化领域具有广泛的应用。欧姆龙PLC编程软件
    的头像 发表于 10-18 15:48 520次阅读

    浅谈PLC编程软件的特征

    优秀的PLC编程软件通常具备以下特征。
    的头像 发表于 09-20 14:59 247次阅读

    esp32用什么软件编程

    ESP32是一款由乐鑫(Espressif)推出的低功耗、高性能的Wi-Fi和蓝牙双模微控制器,广泛应用于物联网、智能家居、智能穿戴等领域。要对ESP32进行编程,需要选择合适的编程软件和开发环境
    的头像 发表于 08-19 17:24 2800次阅读

    嵌入式软件工程师如何提升自己?

    的基础 嵌入式软件工程师需要具备扎实的计算机科学和工程知识。因此,在职业生涯的起步阶段,建议将重点放在学习基础知识上,包括数据结构、算法、操作系统、编程语言等。通过深入学习这些基础知识,打下坚实的理论基础,为将来
    发表于 06-12 11:20

    这个工程是用什么上位机软件编程

    这个工程是用什么上位机软件编程的*附件:22041701ES-X86-R-Flank8 10 12组.rar
    发表于 06-03 18:30

    索尼诚邀软件工程师参与PS免费手游平台设计

    据悉,近日,澳大利亚知名媒体TweakTown发现,索尼互动娱乐正在为其旗下的PlayStation Studios Mobile招募一名资深的软件工程师,负责设计PlayStation的免费手机游戏平台。
    的头像 发表于 05-23 17:08 693次阅读

    嵌入式软件工程师和硬件工程师的区别?

    和通信协议,以及熟练掌握一种或多种编程语言和开发工具。 主要负责的任务和领域 嵌入式软件工程师的工作涉及到各种任务,主要包括: * 系统设计:包括确定系统功能、分配资源、优化性能等。 * 软件
    发表于 05-16 11:00

    AI代码助手,企业软件工程未来主流工具

    AI代码助手不仅能自动生成和完善代码,更是一位高效的协作伙伴,通过激发创新思维和提升代码质量,助力开发者提升效率,进一步提升其技术水平和对各类编程框架的掌握能力。
    的头像 发表于 04-12 15:58 386次阅读

    Cognition发布首款AI软件工程师Devin

    据报道,Cognition公司今日公布了其首款人工智能软件工程师——Devin,掀起了打造软件模式变革的序幕。该产品在SWE-bench代码测验中展现出卓越表现,甚至超过了部分顶级人类工程师的水准。
    的头像 发表于 03-13 10:57 589次阅读

    ABB收购Meshmind增强人工智能及软件驱动自动化

    ABB的最新投资将加速提升软件工程和基于人工智能的应用程序(包括机器学习和视觉)的研发能力。
    的头像 发表于 01-19 14:24 1004次阅读

    “百模大战”诞生各种编程工具 GPT-4依然是天花板

    20 世纪 60 年代末出现的“软件危机”揭示了软件开发中的诸多问题,也是在此时,软件工程概念正式诞生。
    的头像 发表于 01-08 10:57 753次阅读

    如何构建linux开发环境和编译软件工程、应用程序

    前文介绍了如何使用官方提供的镜像文件启动开发板,本文将说明如何构建linux开发环境和编译软件工程、应用程序。
    的头像 发表于 01-03 12:31 1936次阅读
    如何构建linux开发环境和编译<b class='flag-5'>软件工程</b>、应用程序

    嵌入式软件工程师常用的

    最近我换工作了,看见不同嵌入式软件工程师用的平台都不一样,所以我整理了一下。PlatformIO:多平台支持:PlatformIO支持多种嵌入式平台,包括Arduino、ESP8266、ESP32
    的头像 发表于 12-24 08:00 630次阅读
    嵌入式<b class='flag-5'>软件工程</b>师常用的

    嵌入式硬件和软件哪个好?

    ,如复位电路、常用滤波器电路、功放电路、高速信号传输线的匹配电路等;故障定位、解决问题的能力;设计文档的组织编写技能! 那对于嵌入式软件工程师来说: 嵌入式软件工程师领域较新,他的发展也是很快的,像
    发表于 12-05 15:17