什么是软件工程?(转到并进行版本控制)

2020-07-06 04:53:13

围棋几乎所有与众不同的设计决策都是为了让软件工程变得更简单、更容易。我们经常说这句话。典型的参考是罗布·派克(Rob Pike)2012年的文章“去谷歌:软件工程服务中的语言设计”。但什么是软件工程呢?编程意味着让程序工作。你有一个问题要解决,你写一些GO代码,你运行它,你得到答案,你就完成了。这就是编程,这就是。这本身就已经够难的了。但是如果代码必须日复一日地继续工作呢?如果其他五个程序员也需要处理代码呢?然后你开始考虑版本控制系统,跟踪代码如何随着时间的推移变化,并与其他程序员协调。你添加单元测试,以确保随着时间的推移,你修复的错误不会重新引入,不会由你自己引入,也不会由不熟悉代码的新团队成员引入。你会考虑模块性和设计模式,要将程序分成几个部分,团队成员可以大部分独立地工作。你可以使用工具帮助你更早地发现错误。你会想办法让程序尽可能清晰,这样就不太可能出现错误。你要确保即使是在大型程序中,小的改动也能被快速测试。你可以使用工具帮助你更早地发现错误。你会想办法让程序尽可能清晰,这样就不太可能出现错误。你要确保即使是在大型程序中,小的改动也可以快速测试。你之所以这么做,是因为你的编程已经变成了软件工程。(这个软件工程的定义和解释是我在谷歌(Google)同事蒂特斯·温特斯(Ttus Winters)原创主题上的即兴小品,他更喜欢的措辞是“软件工程就是随着时间的推移集成编程。”视频中8:17至15:00他在CppCon 2017上展示了这一理念,值得大家花7分钟时间来看。)。正如我前面所说的,几乎所有围棋独特的设计决策都是出于对软件工程的担忧,试图让时间和其他程序员适应日常的编程实践。例如,大多数人认为我们用gofmt格式化Go代码是为了让代码看起来更漂亮,或者是为了结束团队成员之间关于程序布局的争论。但gofmt最重要的原因是,如果一种算法定义了Go源代码是如何格式化的,那么像goImports、Gorename或Go Fix这样的程序可以更容易地编辑源代码,而不会在写回代码时引入虚假的格式更改。这有助于您随着时间的推移维护代码。再举一个例子,Go导入路径是URL。如果代码说的是import,您必须询问是哪个UUID包。在godoc.org上搜索UUID会找到几十个包。如果代码说的是import,那么现在我们指的是哪个包就很清楚了。使用URL可以避免歧义,还可以重复使用现有的命名机制,使其更简单。继续这个例子,GO导入路径写在GO源文件中,而不是写在单独的构建配置文件中。这使得GO源文件是独立的,这使得理解、修改和复制它们变得更容易。这些决策以及更多的决策都是为了简化软件工程的目标。在后面的帖子中,我将具体讨论为什么版本对软件工程很重要,以及软件工程方面的考虑如何促使设计从dep到vgo的变更。