老样子一样放在 gist,这篇是我一直很想写但写不好的。
原文网址:
https://goo.gl/mizaKs
以下正文
# 分析问题
## 前言
如果你有在网络找过如何问问题的话,你应该会找到泛用的回答。
而这边要讨论的是如何对 Google 问问题。
会写这篇是因为我发现很奇妙的有些工程师比我还老,
但却不太用 google,常常问一些 google 就有答案的问题。
## 问问题的技巧
有几个原则 :
1. 用英文
虽然是老生常谈,不过你都用英文写 code 了,资源当然是国外比较多
2. 专有名词
基本上问题会随着你的语言、框架而有微妙的差异。
比如 php & java 就不太一样,虽然都是 programming language
3. 不要用句子
用句子会导致你失去一些答案,因为每个人问问题的语句都不一样。
(Can I take out? Can I take away?)
除非你想要找的就是那种topic的标题。
4. 分解到不能再分解为止
一般而言问题常常是有点笼统的,这时你必须把问题拆成几个单字内
(一般来说我倾向五个单字内)是最好的。
这样可以把问题简化,也可以直捣问题核心。
## 简单例子 : == 跟 === 的 异同之处
首先先转换成英文
1. 等于 为 equal
2. 运算子 为 operator
专有名词这边是 php
然后不能在分解下去了
所以大概要喂 :
```
equal operator php
```
## 复杂例子 : 网站产品页读取缓慢
首先先拆分,一般来说这问题可以先拆成四部分。
1. 前端
2. 系统
3. 后端
4. 数据库
从前端开始看起
1. 使用者使用的是桌面还是行动版
2. 使用者网络稳不稳定
3. 使用者的浏览器版本
4. js 过于肥大
5. 图片是否为第一次读取
6. etc...
好的让我们稍微等等,你应该意识到这个问题过于复杂,问题有很多个,应该要每个都问吗?
## 问问题的成本
我很喜欢钢之炼金术师的一个真理:等价交换原则。
任何事情皆有代价,问题只是在于这个代价由谁支付而已。
那要如何评估问问题的成本?这里我们可以从几方面来看
1. 时间方面
有没有听过一句话:什么都急,就付你钱的时候不急
如果你有时间上的限制的话,你应该选择那些时间成本很低的问题。
一般而言你越熟悉的领域,你问的问题会越精准,矫正时间成本会越低。
2. 金钱方面
有钱不是万能,没钱却万万不能。
所以你公司没钱的话,还是不用问 load balancer 这种东西了
3. 困难程度
即使是你熟悉的领域也有分困难程度的,比如把 mysql 转换成 mssql 远比优化 sql 来得难多了
你应该优先选择那些困难程度低问题。
困难程度有时不是只考虑技术方面,人的部分也要考虑。
## 最后的抉择 - 经验法则
往往在估算完这些以后,还会剩下几个选项,从哪个开始问才是最好的?
答案是有规则的猜他,而这个就依赖你以前的经验了。
如果你有空可以多看看 reddit 、 hack news 之类的,看国外是怎么问问题的。
看书也有助你有规则的猜测,对于问题发生的环境了不了解也很重要。
## 回到复杂例子
首先假设这个问题是你家的 PM 丢给你的话,则环境在台湾,由于台湾盛行吃到饱跟一年换一次手机,可以先排除纯行动端问题。
如果是网络不稳的话则无解,所以这个问题也可以排除。
系统硬件部分公司有钱的话可以考虑,排在顺位低的列表。
系统软件的话考虑困难程度,排在顺位低的列表。
后端部分,因为更换后端语言各方面成本太高,所以列在顺位低。
优化语法成本比较低,排在顺位高。
数据库部分,笔数高低直接影响效能,且语法查询也影响效能,排在顺位高。
图片往往也直接影响速度快慢,排在顺位高。
所以我们可以直接得到一个顺位:
1. 图片快取
2. 后端语法优化
3. sql 语法优化
然后就依照你对架构的暸解开始猜测哪个问题是正确的。
## 总结
依台湾的情形而言,大概有90%的问题可以在网络上找到一样的,
所以问题在于你要怎样去找到这些已经问过的问题,
以及在于你要花多少时间成本下去找。