# 程序开发的思考方法与好习惯

记录程序开发中的思考方法与好习惯。不仅仅适合程序开发，也适合其它需要逻辑思考的地方。

### 第一性原理思维

第一性原理思维（First Principle Thinking）是一种回归事物本质、从最基本的公理或原则出发，通过演绎推理来构建对问题理解的方法。这种方法在物理学、工程学以及商业策略等领域都有广泛的应用。以下是第一性原理思维的主要优点与缺点，以及其基本的流程和策略：

**优点：**
1. **创新性**：通过摆脱传统经验和他人的观点束缚，能够产生全新的解决方案和产品设计。
2. **深度理解**：有助于深入理解和把握事物的本质，不受表象和常规认知的限制。
3. **竞争优势**：基于第一性原理重构的产品和服务往往具有更强的核心竞争力，难以被复制和超越。
4. **准确性**：减少对间接信息和假设的依赖，从而提高决策和预测的准确度。

**缺点/局限性：**
1. **复杂性**：将问题分解到最基本的原则层面可能非常复杂，需要深厚的领域知识和专业技能。
2. **时间成本**：重新分析和推导基础原理会消耗更多的时间和资源。
3. **易出错**：如果对基本原理的理解有误，那么后续的所有推论和行动都将建立在错误的基础上。
4. **忽略经验价值**：过于强调第一性原理可能导致忽视前人积累的经验教训和现有的有效实践。

**流程和策略：**
1. **识别现有假设**：首先明确并记录当前对于问题或者领域的既有认识和假设。
2. **拆解至基本要素**：将问题层层剥离，分解成最基本的组成部分或原则，例如物理现象的基本定律、商业模型的基础元素等。
3. **独立思考**：基于这些基本原理进行独立思考，不预设任何附加条件或外界影响。
4. **重构和创新**：从这些基本原理出发，重新构建解决方案或模型，探索新的可能性。
5. **验证和迭代**：将新的想法或方案与实际情况对比验证，并根据反馈不断调整优化。

例如，在商业场景中，埃隆·马斯克曾运用第一性原理思维去重新审视电动车电池的成本结构，而不是接受市场上的既定价格，最终找到了降低成本的可能性。

### 概念完整性
软件系统中重要的一点。若对项目问题了解的不够详细进行开发，会导致不断去改代码，期望通过改代码来达到解决问题的目的。

概念不完整，即没有搞明白问题中有哪些对象，对象之间的联系。没有真正搞清楚对象及对象之间的联系。从而没有办法了解问题。在没有真正了解问题的时候，只能被动地等待问题的出现，然后去改代码，以头痛医头，脚痛医脚的方式去解决问题。

其结果就是，花费大量时间做着重复的事情，改着冗余复杂的代码。最终导致大多数项目失败或延期。

如果一个特别的需求特性影响到概念完整性，就需要果断舍弃。不要迁就所有人的要求。hold不住的。

### 结构化思维
整体观念全方位的去看待问题，不仅只看表象。以自问自答的方式思考：

      1. "如果....会怎样？否则....会怎样？"
      2. "最好情况是什么？ 最坏情况是什么？怎么办？"
      3. "导致问题产生的根本原因是什么？ 去解决根本原因，找对方最终想要的。"

**举例**: 男友加班。女友经常抱怨，生气，耍小脾气。

男生看到的表面现象：女友性格不好，不够体贴，不通情达理。

**根本原因**：双方缺少交流，互动。女友希望得到更多的关注。

**错误的示范**：你为啥不理解我呢？ 没看我忙着的么？

**正确的姿势**：

### 解决问题的两类方式：
1. 一种问题是自己经验中已有的，从中找出一个解决方案即可，这种是最容易的。
2. 更多的问题是在经验之外的，这时候需要知道哪里有解决问题的方法，活用搜索引擎。

### 学习技术的方法论
-  学习技术的方法论主要是建立自己的思维框架，用这个思维框架去强吃原理，才能以生有涯应对知无涯。强吃通过已有知识通过迁移学习等方式快速掌握原理类似的新知识，前期需要积累。学技术切勿背说明书，代码机制弄明白了用着就熟了。 by: Aoik-馋师

- 学通超过一种编程语言，了解尽可能多的编程语言及其优劣，知道解决某个问题的可能的最佳路径。注意学通和学会是两个概念。学会意味着你能够使用这门语言，会写程序，而学通则意味着更多。很多在简历中号称精通C的人不知道malloc背后都发生了什么，精通Python的人却无法用meta programming写出干净漂亮的代码。这样的精通其实也就是勉强学会。 by: 陈天

      学会：
      了解语言被创建之出的动机，深刻理解语言背后的思想。
      掌握如何在线调试（online debugging）和事后分析（coredump analysis）。
      掌握语言外延/周边的技术。如JVM之于java，OS/CPU EABI之于C。
      掌握如何提升关键代码的效率，如何能够扩充语言的能力。如NIF之于Erlang。


-  不断地给自己增加挑战，让自己脱离舒适区域。具体方法是：用那些刚好超过自己能力的任务挑战自己，build（尝试） - measure（分析） - learn（学习总结）。然后不断重复。这是lean startup一书中建议的精益创业模式 by: 陈天

    （也是leetcode刷题的套路啊！）

### 编程的好习惯
-  代码不妥协，不屈服于release的压力或人情世故。code review时不仅逻辑正确，格式，算法效率也要合理。真心喜爱你所做的事情。 by: 陈天

    (能做到这点真的很难啊)


-  不要做一只将头埋在沙子中的鸵鸟：计算机异常处理，把可能发生的问题都要考虑到。而不是视而不见。某些事情发生的几率太小了，小到不值得我们花心思去处理；或者，某些事情发生后的后果太严重了，严重到我们只能祈祷上帝它不会发生。by: 陈天

    （我身边有很多优秀的人，总会把有很小可能性发生的事也考虑到，值得学习这种精神！）

