新智元对软件开发中的关键步骤:编程语言
发表时间:2023-11-13 09:03:13
文章来源:炫佑科技
浏览次数:171
菏泽炫佑科技
新智元对软件开发中的关键步骤:编程语言
1 新智元编译
本文对软件开发的关键步骤进行了梳理和介绍。
作者简介: 作为一名软件工程师,我已经工作了10多年。 1979年,他从小就开始编程,随后逐渐走上了编程语言设计和实现的学术道路。 他和他的博士生导师在墨尔本大学共同创立了一个研究小组,开发了编程语言 。 他是8个国际会议的程序委员会成员,发表了超过50万行开源代码。 他是新闻组 comp.std.c++ 的前主席,也是 ISO C 和 C++ 委员会官方认可的“技术专家”。 他在商业软件行业拥有超过 15 年的经验。 如今,他是 Blaze(目前在互联网上使用的一种构建工具)的原始开发人员之一,致力于开发用于语音识别、操作和合成的服务器端软件(在 Siri 之前!)。 他目前是文本转语音工程小组的负责人,但仍然编写和审查了大量代码。 他编写的软件安装在超过十亿台设备上,每天使用超过十亿次。
以下为新智元对整个报告的重点翻译。
目录
概括
关于作者
1 概述
2.软件开发
2.1. 源代码库
2.2. 编译系统
2.3. 代码审查 2.4。 测试
2.5.Bug追踪
2.6。 编程语言
2.7. 调试和分析工具
2.8. 项目发布( )
2.9.验收
2.10. 审查
2.11. 频繁修改
3.项目管理
3.1.20%时间
3.2. 目标和主要结果
3.3.项目验收
3.4.团队重组
4、人事管理
4.1. 角色
4.2. 设施
4.3.培训
4.4. 人事变动
4.5. 绩效考核与奖励
5 结论
致谢
参考书目
1 概述
已经是一家非常成功的公司了。 除了搜索之外,它还贡献了许多其他优秀产品,包括地图、新闻、翻译、语音识别等。 还显着增强和扩展了许多通过从等小公司购买获得的产品,并对各种开源项目做出了重大贡献。 它还展示了一些尚未推出的令人惊叹的产品,例如自动驾驶汽车。
我们成功的原因有很多新智元对软件开发中的关键步骤:编程语言,包括开明的领导、优秀的人才、严格的招聘标准以及利用快速增长的市场积累的财务实力。 原因之一是优秀的软件开发流程的形成。 。 这些实践源于地球上*有才华的软件工程师的大脑,随着时间的推移而不断发展。 我们希望与世界分享,包括从我们的错误中吸取的教训。
本文的目的是对软件开发的核心流程进行梳理和简单介绍。 其他组织和个人可以将它们与自己的软件开发流程进行比较,并考虑向它们学习是否有任何价值。
许多作者(例如[9]、[10]、[11])撰写了有关分析的成功和历史的书籍或文章。 但大多数主要涉及商业、管理和文化; 只有少数作者(例如[1,2,3,4,5,6,7,13,14,16,21])探索软件开发方面的事物,并且大多数只涵盖一个方面; 目前还没有任何文章像本文的目的那样提供总体软件开发实践的简要概述。
2、软件开发
2.1. 源代码库
我们的大部分代码都存储在统一的源代码存储库中,所有软件工程师都可以访问。 有一些值得注意的例外,特别是两个大型开源项目 和 ,它们使用单独的开源存储库,以及一些高价值或核心安全相关代码,其读取访问权限被更严格地锁定。 但大多数项目共享相同的存储库。 截至2015年1月,这个86TB的存储库包含10亿个文件,其中包括超过900万个源代码文件(总共包含20亿行源代码),拥有3500万次提交的历史记录和每个工作日40,000次提交的更改率[18]。 对存储库的写访问受到控制:只有存储库每个子树的所有者才能批准对该子树的更改。 但一般来说,任何工程师都可以访问任何代码,可以检查它、构建它、可以进行本地修改、可以测试它,并且可以发送更改以供代码所有者审核。 如果所有者批准,则可以写入这些更改。 作为一种公司文化,我们鼓励工程师修复他们看到的任何东西并学习如何修复它,无论项目边界如何。 这增强了工程师的能力,并带来更高质量的基础设施,更好地满足使用者的需求。
几乎所有软件开发都发生在存储库的“头部”,而不是分支上。 这有助于及早发现集成问题并*大限度地减少所需的合并工作量,同时还有助于更快地推出安全修复程序。
尽管不可能每次都如此,但一旦具有传递依赖关系的文件发生变化,系统就会频繁地自动运行测试。 通常在几分钟内,这些系统会自动通知作者和审阅者任何未通过测试的更改。 大多数团队通过显示标记甚至具有特定含义的指示灯来指示其项目的状态(绿色表示构建成功并且所有测试通过;红色表示某些测试失败;黑色表示整个构建已崩溃)。 这有助于让工程师了解情况。 重点是保持绿色。 大多数较大的团队还有一个“构建警察”,他通过与变更作者合作来确保测试继续通过,以快速解决任何问题或消除令人不安的变更(这个警察角色通常由所有团队成员或经验丰富的成员担任)轮换的基础上)。 即使对于非常大的团队,这种对变革的关注也有助于保持整个构建的绿色,保持整个开发的可行性。
代码所有权。 存储库的每个子树都有一个文件,列出该子树“所有者”的用户 ID。 子目录继承父目录的所有者,但可以选择禁用。 每个子树的所有者控制对该子树的写入访问,如下面的代码审查部分所述。 每个子树至少需要两个所有者,尽管通常有更多,特别是在不在同一地理位置的团队中。 将整个团队列在所有者文件中也很常见。 任何人都可以对子树进行更改,而不仅仅是所有者,但必须获得所有者的批准。 这确保了每项更改都由了解整个软件修改情况的工程师进行审查。
有关源代码存储库的更多信息,请参阅[17,18,21]; 关于另一家大公司如何应对同样的挑战,请参阅[19]。
2.3 代码审查(Code)
有一些完善的基于网络的代码审查工具与电子邮件集成,让代码作者发起审查,并允许审查者并排查看差异(使用漂亮的颜色编码)并对其进行评论。 当变更作者发起代码审查时,审查者会收到电子邮件通知,并提供指向 Web 查看器页面的变更的链接。 当审稿人提交审稿意见时,系统会发送电子邮件通知。 此外,自动化工具可以发送包含自动化测试结果或静态分析工具结果的通知。
对主源代码存储库的所有更改都必须经过至少一名其他工程师的审核。 此外,如果进行更改的人不是所修改文件的所有者,则至少有一名所有者必须审核并批准该更改。
2.4 测试()
我们强烈鼓励并广泛采用单元测试。 所有生产中使用的代码都需要进行单元测试,如果添加了源文件而没有进行相应的测试,代码审查工具将会突出显示。 代码审查者通常要求对于添加新功能的任何更改,应添加新测试以覆盖新功能。 模拟框架(即使对于具有重量级库依赖项的代码,也允许构建轻量级单元测试)相当常见。
集成测试和回归测试也被广泛使用。
正如上面“预提交检查”中提到的,测试可以作为代码审查和提交过程的一部分自动化。
还提供了用于测量测试覆盖率的自动化工具。 结果也集成到源代码浏览中。
还强调部署前的负载测试。 团队需要生成一个表格或图表,显示关键指标(特别是延迟和错误率)如何随传入请求变化。
2.5. 错误跟踪(错误)
使用错误跟踪系统来跟踪各种问题:错误、功能请求、客户问题和流程(例如发布或清理工作)。 Bug被分为分层组件,每个组件都有一个默认的负责人和默认的抄送电子邮件列表。 当发送源代码更改以供审核时,系统将提示工程师提供问题的关联号码。
团队通常(但并非普遍)定期扫描其组件中是否存在未解决的问题,确定其优先级,并在适当的时候将其分配给特定的工程师。 有些团队有专人负责错误分类,其他团队则在定期团队会议期间进行错误分类。 许多团队使用错误标签来指示错误是否已分类以及每个错误针对哪个版本。
2.6。 编程语言 ( )
强烈鼓励软件工程师使用四种官方认可的编程语言之一进行编程:C++、Java 或 Go。 尽可能少地使用不同的编程可以减少代码重用和程序员协作的障碍。
每种语言都有相应的风格指南,以确保整个公司的代码具有相似的风格、布局、命名约定等。此外,还有全公司范围的可读性培训流程,由关心代码可读性的经验丰富的工程师培训其他工程师如何编写特定语言的可读、惯用代码。 他们检查每个连续的修改或一系列更改,直到审阅者确信作者知道如何用该语言编写可读的代码。 每次在某种语言中添加重要的新代码时,都必须得到经过该语言“可读性”培训过程的人员的批准。
除了这四种语言之外,还有许多用于特定目的的专门领域特定语言(例如用于构建目标及其依赖项的构建语言)。
这些不同编程语言之间的互操作主要使用“协议缓冲区”(.)。 协议缓冲区是一种高效且可扩展的结构化数据编码方式。 它包括用于结构化数据的特定于领域的语言以及编译器。 编译器可以接受此描述并生成 C++、Java 和 Java 代码来构造、访问、序列化和反序列化这些对象。 该版本与RPC库集成,支持简单的跨语言RPC,并序列化和反序列化由RPC框架自动处理的请求和响应。
该过程的多功能性是使开发变得容易的关键因素,即使有庞大的代码库和多种语言:有一组命令可以执行所有常见的软件工程任务(例如签出、编辑、构建、测试、、、文件错误等),并且无论项目或语言如何,都可以使用相同的命令。 开发人员不需要学习新的开发流程,因为他们使用的代码是不同项目的一部分或用不同语言编写的。
2.7. 调试和分析工具(和工具)
服务器与提供许多用于调试正在运行的服务器的工具的库链接。 如果服务器崩溃,信号处理程序将自动将堆栈跟踪转储到日志文件并保存核心文件。 如果崩溃是由于堆内存泄漏造成的,则将转储堆对象示例子集的分配点的堆栈跟踪。 还有一个用于调试的网络接口,它允许检查传入和传出的 RPC(包括计时、错误率、速率限制等)、更改命令行标志值(例如,增加特定模块的日志详细程度),资源消耗、性能分析等。 这些工具极大地增加了整个调试过程的便利性,以至于很少需要启动传统的调试器(例如gdb)。
2.8. 发布项目 ( )
少数小组有专门的发布工程师,但对于大多数小组来说,发布工程工作是由常规软件工程师完成的。
大多数软件发布都比较频繁; 共同的目标是每周或每两周发布一次,有些团队甚至每天发布一次。 这是通过自动化大多数正常的发布工程任务来实现的。 频繁的发布有助于保持工程师的积极性(如果距离发布还有几个月甚至几年的话就很难激励),并通过更多的迭代来提高整体速度,从在一定时间内获得更多反馈的机会和更多响应反馈的机会。
*后,该版本可以推广到所有数据中心的所有服务器。 对于非常高流量、高可靠性的服务,将在几天内逐步推出,以帮助减少新引入的错误未被发现的影响。
有关发布工程的更多信息,请参阅 SRE 手册 [7] 第 8 章。 另见[15]。
2.9. 批准发布( )
任何用户可见的变更或重大设计变更都需要获得实施变更的核心工程团队之外的许多人的批准。 在某些特殊批准下(通常需要详细审查),确保代码满足法律要求、隐私要求、安全要求、可靠性要求(例如,具有自动监控功能以检测服务器中断并自动通知相应的工程师)、业务要求、等等。
2.10. 事故分析(事后)
2.11. 经常重写 ( )
大多数软件每隔几年就需要重写一次。
这看起来非常昂贵。 事实上,它消耗了很大一部分资源。 然而,它还带来了一些重要的好处,这些好处对于 的敏捷性和长期成功至关重要。 在几年的时间里,随着软件环境和其他周边技术的变化,以及随着技术或市场的变化影响用户的需求、愿望和期望,产品的需求通常会发生显着变化。
几年前的软件是围绕一组旧的需求设计的自动化软件开发,通常不是满足当前需求的*佳方式。 此外,它常常会积累很多复杂性。 重写代码消除了所有不必要的累积复杂性,从而简单地解决不再那么重要的需求。 此外,重写代码可以将知识和主人翁意识传递给新的团队成员。 这种主人翁意识对于生产力至关重要:工程师自然会更加努力地开发功能并解决“他们的”代码中的问题。 频繁的重写还鼓励工程师在项目之间移动,有助于鼓励想法的交叉培育。 频繁重写还有助于确保代码是使用现代技术和方法编写的。
3.项目管理
3.1. 20%的时间
工程师可以花费*多 20% 的时间从事他们选择的任何项目,而无需得到老板或其他任何人的批准。
3.2. 目标和主要结果(和关键 OKR)
个人和团队需要清楚地记录他们的目标并评估他们实现这些目标的进展。
3.3. 立项项目 ( )
尽管有明确的启动审批流程,但没有明确的项目审批或取消流程。 尽管我已经工作近10年,现在是一名经理,但我仍然不完全理解这样的决定是如何做出的。 部分原因是整个公司的方法并不统一。 各级经理对其团队的项目负责,并根据自己的需要行使酌处权。 在某些情况下,这意味着此类决策是以自下而上的方式做出的,工程师可以自由选择在团队的职能范围内开展哪些项目。 在其他情况下,此类决策是以自上而下的方式做出的,由经理或高管决定哪些项目将继续进行,哪些项目将获得额外资源,以及哪些项目将被取消。
3.4. 公司改制 ( )
在极少数情况下,高管决定取消一个大型项目,该项目的工程师可能需要在新团队中寻找新工作。
4、人事管理
轻微地
5 结论
我们简要介绍了正在使用的大多数重要的软件工程实践。 当然,现在这是一个庞大且多元化的组织,其中某些部分有不同的做法。 但大多数团队通常都会遵循这里描述的做法。
由于涉及如此多不同的软件工程实践,以及成功的许多其他方面,很难提供任何定量或客观的证据将个别实践与改进的结果联系起来。 然而,这些做法在谷歌经受住了时间的考验,数千名才华横溢的软件工程师共同遵守。
其他组织提倡的做法以及本文中恰好描述的做法可能有助于说明“这对您来说已经足够好了”。
【寻找AI独角兽】新智元联手10大资本
2017年创业大赛启动
本次AI创业大赛由新智元联合10家主流AI创投机构:蓝驰创投、红杉资本中国基金、高瓴智能基金、蓝湖资本、蓝象资本、IDG资本、高榕资本、中信建投联合发起由新智元证券、明石资本、松鹤远望基金主办,北京中关村科技园区管委会、中关村科技园区海淀园管委会支持,一场汇聚AI技术领袖与投资领袖的盛会。 新智元为雄心勃勃的未来AI独角兽提供强大的创投资源对接机会。 顶级风投TS等你来。
点击文章下方阅读原文并在线填写报名申请表。 此注册表是参与评选所需的信息。
如果你有更多的介绍材料(比如BP等),可以发给。 请在邮件标题中注明公司名称。 如果您有任何疑问,欢迎您发送电子邮件至此邮箱地址。
炫佑科技专注互联网开发小程序开发-app开发-软件开发-网站制作等