# 代码大全第二版（Steve McConnel）

这本书是我大学的一个大神同学推荐给我的，当然这个大神同学是不是写博客那个。起初听到这个书名的时候我是拒绝的，因为在我初中的时候经常看故事大全，笑话大全，在我高中的时候听郭德纲吐槽相声大全，为什么代码还会有一本大全呢？里面放着什么代码呢？然后正如书名所明示的，这本代码大全，居然几乎没有代码。。。

代码大全这本书教你如何写代码，听上去像是一本关于软件工程的书。但不同于一般的着重于需求或者架构的软件工程的书，这本书着重讲解了写的过程，也就是书中提到的“构建”。这本书事无巨细的讲解了代码风格，命名的种种，类的设计，如何和别人合作，**工作环境应该是怎么样的**。

如果你像我大学的时候那样，会觉得这些有什么好看的，我要写出最快的代码，我要写出最炫酷的代码。但随着时间的推移，我渐渐明白，~~鸽子那大是因为它离着镜头近~~，速度快的代码一定来自于易于修改的代码。因为在真正进行profiling之前，我们对性能所作的一切一切的假设都是错的（墨菲，某一年）。所以如何写出高性能的代码，那必然是写出模块化的，能一块块profile并改进的代码，而不是利用狂拽炫酷吊炸天的命令来自我安慰并祈求高性能。我仍然能记得我在大学的时候，用C++的bit操作写了一个奥赛罗的程序，最后还没有别人拿JS写的快。。。

前几天和别人讨论，大家都觉得自己写的代码太“学生气”。我认为这里的学生气其实是“学院派”的意思，真正生产的代码并不一定要多么规范，多么的严谨。但是他一定要能被其他的人读懂，一定要能被别人接手，一定要能有完整的测试来保证正确性。代码就像是皮卡车：便宜，结实，耐用，好修，好改装的就是好玩意儿。你说你有个W16的发动机，跑上三百公里就得换轮胎，那么也不见得就是好。

另外呢，这本书讲了人的品德。。。你没看错，一本技术书探讨了什么样的品德是适合写代码。如果真的要想出一个适合写代码的品德，我们会想出什么呢？是认真严谨？还是吃苦耐劳？然而在这本书里，强调了善于沟通和诚实的重要性。对于大的项目，那么不需要说，需要一个大的团队的群策群力才能完成，单丝不成线，独木不成林，浑身是铁打几根钉子。尤其是这种以智力成果为产出的项目，如果大家不能做好良好的沟通，势必会出问题。即使是对于小项目，是由一两个人完成的，那么我们也需要沟通。因为我们写代码是为了让别人用，如果不能让别人会使用我们的代码，我们就只是做了个玩具。你可能会argue说只有自己会用这段代码，但是你可以认为明天的自己就是别人，因为你根本不记得昨天写了什么东西。

这本书还介绍了好的工作环境的作用，毕竟当员工坐在公司的电脑桌前敲打着什么的时候，没有人能确定他是在贡献代码。有可能他就是像我一样在办公室工作一下午，让代码的速度整体慢了30%。。。一个好的工作环境能真实提高程序员的**真实**代码贡献率。所以我在这里向各位大佬推荐一个网站，叫chiphell，里面介绍了很多能提高生产力的东西，值得常逛。。。

最后，以书里令我感触最深的一句话结尾“ *Programs must be written for people to read, and only incidentally for machines to execute.*”。

下期预告：Effective C++ 第三版。。。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jizhuoran.gitbook.io/mali-gpu/fan-wai/dai-ma-da-quan-di-er-ban-steve-mcconnel.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
