improve wording/add missing content

This commit is contained in:
Jerry Lee
2019-01-10 12:18:59 +08:00
parent 0a61abcae1
commit 612d1a592e

View File

@@ -1,28 +1,28 @@
原文链接:[A Look Into NASAs Coding Philosophy](https://mystudentvoices.com/a-look-into-nasas-coding-philosophy-b747957c7f8a)
基于译文稿:[看NASA的编码哲学](http://www.10tiao.com/html/262/201708/2651375489/1.html)
# `NASA`编码哲学
# `NASA`编码哲学浅析
在肯尼迪工作过并不意味着我是`NASA`的代言。本文仅代表了我的个人身观点,来自于在`Twitch`做的[现场演讲](https://www.twitch.tv/videos/159126334)。
<div align="center">
<img src="nasa.jpeg"/>
<p>肯尼迪航天中心</p>
</div>
为肯尼迪工作过并不意味着我为`NASA`代言。这个写作是以个人身份进行的,来自于我在`Twitch`上的现场演讲。
-----------------------------
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [在我们说出真相?](#%E8%B0%81%E5%9C%A8%E6%88%91%E4%BB%AC%E4%B8%AD%E8%AF%B4%E5%87%BA%E7%9C%9F%E7%9B%B8)
- [现代软件世界](#%E7%8E%B0%E4%BB%A3%E8%BD%AF%E4%BB%B6%E4%B8%96%E7%95%8C)
- [在我们所有人之中,谁会说出真相?](#%E5%9C%A8%E6%88%91%E4%BB%AC%E6%89%80%E6%9C%89%E4%BA%BA%E4%B9%8B%E4%B8%AD%E8%B0%81%E4%BC%9A%E8%AF%B4%E5%87%BA%E7%9C%9F%E7%9B%B8)
- [这是一个现代软件世界](#%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E7%8E%B0%E4%BB%A3%E8%BD%AF%E4%BB%B6%E7%9A%84%E4%B8%96%E7%95%8C)
- [`NASA`的四个假设](#nasa%E7%9A%84%E5%9B%9B%E4%B8%AA%E5%81%87%E8%AE%BE)
- [你可以问导师](#%E4%BD%A0%E5%8F%AF%E4%BB%A5%E9%97%AE%E5%AF%BC%E5%B8%88)
- [我们相信彼此的潜力](#%E6%88%91%E4%BB%AC%E7%9B%B8%E4%BF%A1%E5%BD%BC%E6%AD%A4%E7%9A%84%E6%BD%9C%E5%8A%9B)
- [你会说『我不明白』](#%E4%BD%A0%E4%BC%9A%E8%AF%B4%E3%80%8E%E6%88%91%E4%B8%8D%E6%98%8E%E7%99%BD%E3%80%8F)
- [我们深入了解计算机系统如何运作](#%E6%88%91%E4%BB%AC%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E5%A6%82%E4%BD%95%E8%BF%90%E4%BD%9C)
- [我们看重对计算机系统如何运作的深入理解](#%E6%88%91%E4%BB%AC%E7%9C%8B%E9%87%8D%E5%AF%B9%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E5%A6%82%E4%BD%95%E8%BF%90%E4%BD%9C%E7%9A%84%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3)
- [避免不可靠的知识来源](#%E9%81%BF%E5%85%8D%E4%B8%8D%E5%8F%AF%E9%9D%A0%E7%9A%84%E7%9F%A5%E8%AF%86%E6%9D%A5%E6%BA%90)
- [信仰](#%E4%BF%A1%E4%BB%B0)
- [启发](#%E5%90%AF%E5%8F%91)
@@ -38,17 +38,17 @@
-----------------------------
## 在我们说出真相?
## 在我们所有人之中,谁会说出真相?
### 现代软件世界
### 这是一个现代软件世界
在编程社区中有一个反复出现的话题,与寻找『更好的方式』来编写『现代软件』有关。无论术语『现代』是否真的有用 —— 计算机编程存在的时间本来就不长人们总是对这个话题『新』或者『更好』,这着实令我印象深刻。并且如果我们关注当今软件开发领域的话题,我们会很快意识到明辨是非的重要性:一定要区分清楚什么是有用的,什么是。
在编程社区中有一个反复出现的话题:通过寻找『更好的方式』来编写『现代软件』`modern software`)。不管『现代』这个说辞是否真的有用 —— 因为计算机编程本身出现的时间就不长 —— 不过人们总是对这个话题『新』或者『更好的』的内容要说,这点倒着实令我印象深刻。所以,如果关注了关于当今软件开发的讨论,我们会很快意识到明辨良莠的重要性:什么是有用的,什么是无用的
**NASA必须砍掉废话**
**_`NASA`必须去除废话_**
<div align="center">
<img src="mission.jpeg"/>
<p>编写与安全相关的软件时,赌注很高图片来自David McNew/Getty Images</p>
<p>编写与安全相关的软件时,风险是很高图片来自David McNew/Getty Images</p>
</div>
鉴于所有关于现代软件的评论,我看到初学者程序员问我他们职业生涯中最重要的问题:『我们应该注意哪些事情?』,而且老实说,如果接下来我就给他们讲解下面这些问题那就太说不过去了:
@@ -75,17 +75,32 @@
这句话在机构中随处可见,你会见到知识渊博的高级开发人员问实习生『我不明白这部分代码库。这是一个我不了解的语言功能吗?『或管理层问工程师』我不知道你今天工作的影响是什么。我们可以再多看几遍,直到我把握了,好吗?『这些问题是日常工作的核心。
### 我们深入了解计算机系统如何运作
### 我们看重对计算机系统如何运作的深入理解
`NASA`深度地需要研究关于计算机如何工作的知识,他们发现了发现基本系统限制的价值,以防止支持坏的软件开发决策。
想想 _Gene Amdahl_,他是一个早期的计算机先驱,他做过一个有趣的调查:改进系统的一个组件会带来多大的效用?就是说你的程序运行时间的百分之五十提高了四倍,现在我们想知道整个应用程序的速度提高情况。换句话说,某个程序需要时间T1运行到完成,现在其中的一部分(从`T1`中获取一个分数`f`)改进为了原先的`k`倍快。尽管很简单,我还是会用数学的方式分析它,使用`T1``f``k`定义新的时间`T2`,并且以`T1``T2`的比率表示相对的性能提升。你会得到以下公式:
想想 _Gene Amdahl_,他是一个早期的计算机先驱,他做过一个有趣的调查:改进系统的一个组件会带来多大的效用?就是说你的程序运行时间的百分之五十提高了四倍,现在我们想知道整个应用程序的速度提高情况。换句话说,某个程序需要时间`T1`运行到完成,现在其中的一部分(从`T1`中获取一个分数`f`)改进为了原先的`k`倍快。尽管很简单,我还是会用数学的方式分析它,使用`T1``f``k`定义新的时间`T2`,并且以`T1``T2`的比率表示相对的性能提升。你会得到以下公式:
<div align="center">
<img src="http://chart.googleapis.com/chart?cht=tx&chf=bg,s,00000000&chl=%5Cfrac%7B1%7D%7B(%201%20-%20f%20)%20%2B%20%5Cfrac%7Bf%7D%7Bk%7D" style="border:none;" alt="\frac{1}{( 1 - f ) + \frac{f}{k}" />
<p>图1<code>Amdahl</code>定律</p>
</div>
套入`Amdahl`的公式,与前面的例子一起,要知道你的应用程序只需应用公式:
最终得出 1.6,虽然你将整个程序的一半速度提高了四倍,但整个系统的速度只提高了 1.6倍。让我们进一步来看下,假设你又采取了一切其他的优化手段,运行它所需的时间现在为零(`k`趋于无穷大)。你得到一个特殊情况即`Amdahl`定律:
<div align="center">
<img src="http://chart.googleapis.com/chart?cht=tx&chf=bg,s,00000000&chl=%5Cfrac%7B1%7D%7B(%201%20-%200.5%20)%20%2B%20%5Cfrac%7B0.5%7D%7B4%7D" style="border:none;" alt="\frac{1}{( 1 - 0.5 ) + \frac{0.5}{4}" />
<p>图1应用<code>Amdahl</code>定律</p>
</div>
假设组件占程序运行时间的 60%,现在无需运行它,理论上的最大加速是 2.5 ... `Amdahl`定律告诉我们,为了显着提高系统的速度,我们必须提高其很大一部分的性能。这个定律经常用于并行计算,以预测使用多核处理器的加速,而 _Julian Browne_ 在这种情况下对其进行了重新设计:『本质上,虽然过程可以分解成并行运行的步骤,但整个过程将受到保持序列化部分的严重限制。
最终得出 1.6,虽然你将整个程序的一半速度提高了四倍,但整个系统的速度只提高了 1.6倍。让我们进一步来看下,假设你又采取了一切其他的优化手段,运行它所需的时间现在为零(`k`趋于无穷大)。你得到`Amdahl`定律的一个特例:
<div align="center">
<img src="http://chart.googleapis.com/chart?cht=tx&chf=bg,s,00000000&chl=%5Cfrac%7B1%7D%7B%201%20-%20f%20%7D" style="border:none;" alt="\frac{1}{ 1 - f }" />
<p>图3<code>Amdahl</code>定律的特例</p>
</div>
假设组件占程序运行时间的 60%,现在无需运行它,理论上的最大加速是 2.5 ... `Amdahl`定律告诉我们,为了显着提高系统的速度,我们必须提高其很大一部分的性能。[这个定律](https://en.wikipedia.org/wiki/Amdahl%27s_law)经常用于并行计算,以预测使用多核处理器的加速,而[_Julian Browne_](http://www.julianbrowne.com/article/viewer/about)在这种情况下对其进行了重新设计:『本质上,虽然过程可以分解成并行运行的步骤,但整个过程将受到保持序列化部分的严重限制。』([来源](http://www.julianbrowne.com/article/viewer/amdahls-law)
在脑子中记住这些假设,本文的其余部分将谈谈一些更加个人化的观点:从这些假设中我们可以学到什么?
@@ -97,11 +112,11 @@
我不是指那种类似希望那样的信仰。当我们想相信一些没有理由相信的东西时,也会使用信仰:
- 领导:我喜欢我们应用程序中为客户写的新功能,你说你下载了一个库来写?
- 小辈:是啊 到目前为止,它工作正常。
- 领导:是开源吗?否则谁是供应商,他们在支持上有多好?你有没有证明它是稳健的,并在我们的参数空间进行测试?
- 小辈:不,我已经用它一段时间,没有造成任何问题。
- 领导:*PLONK*
- 组长:我喜欢我们应用程序中为客户写的新功能,你说你下载了一个库来写?
- 菜鸟:是啊到目前为止,它工作正常。
- 组长:是开源吗?否则谁是供应商,他们在支持上有多好?你有没有证明它是稳健的,并在我们的参数空间进行测试?
- 菜鸟:不,我已经用它一段时间,没有造成任何问题。
- 组长:\*捂胸吐血\*
这不仅发生在随机下载软件的情况中,还有的时候你的代码一直调试不好,但是某个语句神奇地解决了问题,虽然你不知道为什么,但是接下来一天你就在各个位置到处使用这个语句。事实上很难发现一个人多大程度上是依据信仰判断一个软件好坏的,但是如果任由这种信仰支撑的代码存在足够长的时间的话,将会导致软件到处都是奇怪的错误。
@@ -111,7 +126,7 @@
### 魅力
会议充满了欣欣向荣的气氛;为下一个框架的到来而兴奋。一个充满激情的作家以歌唱的声音来到舞台上,会议和幻灯片讨论了承诺防弹编程实践的最新原则 —— 将使您成为10x程序员就是现在。在热情的人群中以及作者谈话的官方环境中很难认识到作者的说法是否是真的当然最重要的是买书。
会议充满了欣欣向荣的气氛;为下一个框架的到来而兴奋。一个充满激情的作家以歌唱的声音来到舞台上,会议和幻灯片讨论了承诺防弹编程实践的最新原则 —— 将使您成为 10x 程序员(就是现在!)。在热情的人群中,以及作者谈话的官方环境中,很难认识到作者的说法是否是真的,当然最重要的是买书。
### 光辉
@@ -130,21 +145,33 @@
### 计算机系统:程序员的视角
<div align="center">
<img src="csapp.jpeg"/>
<p>人称 CS:APP</p>
<a href="http://csapp.cs.cmu.edu/">
<img src="csapp.jpeg"/>
</a>
<p>人送代号 CS:APP</p>
</div>
《计算机系统程序员的观点》在我的职业生涯中非常重要是我最喜欢的编程书。这里涵盖的主题是我认为每个人都应该拥有的基础。至少对1-3章内存层次和系统`I/O`的深入研究是有益的。如果你正在开展任何与网络有关的任务,那么网络编程一章是值得注意的。
[《计算机系统:程序员的观点》](https://book.douban.com/subject/26912767/)在我的职业生涯中非常重要是我最喜欢的编程书。这里涵盖的主题是我认为每个人都应该拥有的基础。至少对13章内存层次和系统`I/O`的深入研究是有益的。如果你正在开展任何与网络有关的任务,那么网络编程一章是值得注意的。
### 寻找志同道合的人
有一个叫做`Handmake Network`的小社区,一个令人难以置信的团队(我是团队的一部分),因为我们试图建立一个我们可以摆脱现代软件对话的地方,而是谈论我所铺的东西。我们与其他社区一样脆弱,但我们试图认识到这一点。
社区还与知名程序员讨论事态的状况,不管他们是否同意我们的结论。
有一个叫做[`Handmake Network`](https://handmade.network/)的小社区,一个[令人难以置信的团队](https://handmade.network/about)(我是团队的一部分),因为我们试图建立一个我们可以摆脱现代软件对话的地方,而是谈论我所铺的东西。我们与其他社区一样脆弱,但我们试图认识到这一点。
<img src="abner.png" align="right" width="33%" />
社区还与知名程序员讨论事态的状况,不管他们是否同意我们的结论。之前的内容在[这儿](https://handmadedev.show/)。
**相关内容**
- [Reddit](https://www.reddit.com/r/programming/comments/66vdor/handmade_software_manifesto/) (2017)
- [KillScreen Op-ed](https://killscreen.com/articles/people-trying-save-programming/) (2016)
- [Hacker News](https://news.ycombinator.com/item?id=10095104) (2015)
- [Reddit](https://www.reddit.com/r/programming/comments/3hufkw/the_handmade_manifesto/) (2015)
- [JAXenter](https://twitter.com/JAXenter/status/635755784916234241) (German) (2015)
<img src="abner.png" align="right" width="30%" />
## 关于作者
2017年在肯尼迪航天中心工作三年编写和维护发射控制系统软件。我在2015年之前被授予了肯尼迪的年度实习生导致我到美国航空航天局的『Pathways』计划在那里我负责研究如何简化飞行空间机器人的调试等待。这项工作的成果让我登上了肯尼迪2016年『十佳创新者』榜单 —— 尽管只是勉强!
2017年在肯尼迪航天中心工作三年编写和维护发射控制系统软件。我在2015年之前被授予了肯尼迪的年度实习生导致我到美国航空航天局的『Pathways』计划在那里我负责研究如何简化飞行空间机器人的调试等待。这项工作的成果让我登上了肯尼迪2016年『十佳创新者』[榜单](https://blogs.nasa.gov/kennedy/2016/07/26/kickstart-showcase-celebrates-innovators-technologies/) —— 尽管只是勉强!
我的大部分工作是`SBU`所以它可能不会在线披露但是在技术上却是可以的。你可以通过TwitterTwitch或者电子邮件找到我。
我的大部分工作是`SBU`,所以它可能不会在线披露,但是在技术上却是可以的。你可以通过[`Twitter`](https://twitter.com/abnercoimbre)、[`Twitch`](https://twitch.tv/abnercoimbre)或者[电子邮件](mailto:abner@handmadedev.show)找到我。