技术的极限(7): 处理复杂与分层
上一篇:技术的极限(6): 密码朋克精神(Cypherpunk Spirit)
下一篇:技术的极限(8): 集成与分离
目录:
** 0x01 BigO,以及BugO(n!)和BugO(n)
** 0x02 如何处理特例
** 0x03 富兰克林决策法
** 0x04 那些软件之奇思妙想是如何诞生的?
** 0x05 金字塔原理
** 0x06 越缺乏知识,越反对的厉害
** 0x07 拉波波特法则|Rapoport's Rules
** 0x08 The Tao Of Programming|过时的隐喻
0x01 BigO,以及BugO(n!)和BugO(n)
原文:https://overreacted.io/the-bug-o-notation/
衡量算法复杂度的数学工具是BigO,例如O(n), O(log(n))和O(n!)等。
那么如何衡量代码的Bug复杂度呢?
如果一段代码有n个步骤,这n个步骤在异步代码中可能有n!种组合,例如n=4时,n!=4x3x2x1=24种组合,那么当出现问题的时候就非常难以定位,借用算法复杂度里BigO的做法,可以认为此时的Bug复杂度为BugO(n!)。
通过使用状态机可以让代码的状态变化规约到一个地方,从而只要控制这一个地方,就可以让问题出现时,只需检查上一次状态的代码即可,那么Bug复杂度规约为BugO(n)。
状态机的写法虽然古典,甚至略微显得麻烦,但却往往是让代码保持干净结构,减少Bug复杂度的有效做法。
0x02 如何处理特例
原文:https://blog.conjur.org/special-cases-are-a-code-smell/
编程中充满了特例。当你为特例添加一个个处理分支的时候,代码中的“破窗效应”就出现了。特别是随着需求的变更,一个又一个的特例容易导致代码的结构变形、失控而减低可维护性。
这篇文章举了几个简单的如何处理特例的方法,总结出来就是对特例的处理需要通过“泛化”来解决,通过泛化把特例看成是一个更通用问题的普通情况,这样就不用为特例单独写处理代码。
从这个角度来说,需求变更增加特例的时候,就是一个好的代码重构点。你在编程中对特例有敏感度么?
0x03 富兰克林决策法
原文:https://www.nickols.us/Ben_Franklin_Decision_Making.pdf
如何做决策,Benjamin Franklin的方法是“pro-and-con technique”,也叫做 “Prudential Algebra” 具体做法如下:
- Frame the decision as a Yes/No question:把决策看成是一个Yes/No的问答问题
- List the pros and cons:把一个决策的优缺点都列出来。
- Assess their importance:给每个点标注重要性值。
- Assess their probability:给每个点标注可能值。
- Weight them accordingly:给每个点标注权重。
- Strike out any offsetting pros and cons:计算优缺点列表的各自加权值。
- Review and reflect then decide:对每个点的分值做复审。
复审的内容有:
- How do the Pros and Cons stack up against one another?
- How does the importance of the Pros compare with the importance of the Cons? How does the probability of the Pros compare with the probability of the Cons?
- What is the “mix” of importance and probability?
- What patterns do you see? What do they tell you? What is the overall balance of consequences?
- What are you getting? What are you giving up? Are the trade-offs worth it?
- What are you risking and are you willing to risk it?
- Are there any inconsistencies to be resolved?
- Which factors really matter?
- Are there any overriding factors?
- Who else, if anyone, should you consult?
- When do you have to decide?
0x04 那些软件之奇思妙想是如何诞生的?
原文:https://www.mindk.com/blog/how-software-ideas-are-born/
- Step №1 Test the waters2019,选择最新潮流中的一个领域
- Trend#1 Artificial Intelligence,人工智能
- Trend#2 Focus on Cybersecurity,加密安全
- Trend#3 Low Code Development,低代码量快速开发平台/工具
- Trend#4 Progressive Web Apps,渐进式Web应用,PC平台的electron ui,微信小程序
- Trend#5 On-demand Software,按需开发
- Step №2 Focus on a real problem or need,聚焦实际问题和需求
- Personal problems and needs, 个人需求
- External problems,外部需求,群体需求
- Maslow’s hierarchy of needs,马斯洛需求层次,见下一节
- Step №3 Qualify each problem from the list,限定问题的类别
- Unworkable,不可行,例如在Excel里复杂操作可以完成,但是数据量大不好做,手工操作繁琐类的问题
- Unavoidable,不可避免的,例如ZF要求博客必须有证书,你要么被强制,要么放弃
- Urgent,紧急问题,解决方案不需要最好,能用就可以接受
- Underserved,服务水平差的问题,需要开发更好的软件解决
- Step №4 List out possible solutions,列出可能的解决方案
- Problem Need, 问题/需求列表
- Solutions, 解决方案列表
- Idea, 它们的交集是Idea
- Step №5 Narrow down,缩小范围
- Replication,复制已有的模式,引入新的市场
- re-purpose,复用已有的模式,用在别的领域
- Upgrading,升级模式
- Step №6 Get feedback and dive deeper,获得反馈并深入研究
- 分享你的软件Idea,获得反馈并深入研究
- 但是只有少数人有足够的时间、能力和知识给出靠谱的反馈
- Step №7 Сome to a decision,作出决定
- 删掉那些不想做的
- 留下那个你想做的,思考人们为什么要为它付费
0x05 金字塔原理
在分类学里面,一种常用的手法是金字塔分类,例如下面这些
食物金字塔:
0x06 越缺乏知识,越反对的厉害
原文:People Strongly Against GMOs Had Shakier Understanding Of Food Science, Study Finds
科学知识和消费行为之间有什么相关性么?一项由四个大学发起的在欧洲和美国的超过2000人的调查显示了它们之间存在相关性。
一种现象是越是情绪激动地反对一个新事物,越倾向于不去学习新事物相关的科学知识; 调查也显示出,在学习新事物之前,许多人缺了太多更基础的科学知识,基础科学知识到前沿科学事物之间,存在着需要被弥补的间隙。也许这正说明了好的科普的重要性。
Then it went on to ask a series of true-or-false questions about science, ranging from basic issues like whether the core of the Earth is hot or cold to questions on genetics, like "Does a non-genetically modified tomato have genes?"
The results showed the more strongly people reported being opposed to GMOs, the lower their test score.
"We have to get people to recognize gaps in their knowledge before we try to teach them new things and have a meaningful discussion,"
一个例子是,最近沸沸扬扬的DNA之父关于种族和天生智力之间的言论,人们在网络上争辩,虽然有很多科普文章尝试去说明“种族”是一个社会学概念,不是一个遗传学概念,但是这并不能平息质疑者的看法。我们可以尝试分解下这里面的问题。
第1个问题。为什么基于统计学的方法研究,关于种族和其他行为,比如种族和消费,种族和经济,种族和心理学的研究,是可以研究的,但是一旦涉及种族和智力的研究就会天然招黑?一些人会质疑说这是一个关于政治正确与否的问题。解释者应该不要在这里落入陷阱,简单的做法,做一个正交分解,存在下面四种可能,为了避开辩论的焦点,可以直接针对(3)和(4)去做,这样质疑者就不用浪费情绪在左半部分。
(1)政治正确,结论科学
(2)政治正确,结论不科学
(3)政治不正确,结论科学
(4)政治不正确,结论不科学
第2个问题。“黑人”为什么是一个社会学概念,人们难以理解。学遗传学的会解释肤色只是基因的一个表达方面,在基因的各种表达组合中肤色并不起决定性作用。人们会质疑说:种族是一个社会学概念违背了人们的“常识”。他们当然不会把黑白混血的或者一个亚裔黑人看作是他们心中认为的黑人。这里恰恰体现了学科基本知识在大众中缺乏共识。
(1)需要解释清楚肤色只是众多基因表达中的一个。
(2)需要排除掉那些人们认为你只是在狡辩的地方,针对人们心中认为的“真正的黑人”。
(3)需要解释“肤色基因虽然只是一个方面,但是它是否对其他一堆基因有很强的聚合效应”,也就是说如果从大数据统计的角度来看,是否人们心中“真正的黑人”的基因数据做了聚类之后,肤色基因所在的聚类能明显和种族对应上。
(4)如果存在这种聚合,这种聚合里是否存在和智力相关性。
第3个问题。智力本身是如何定义的。智力是跟先天和后天都有关系的,那些质疑的人会说后天控制变量是没法做的,但是统计的数据却是有的。如何跟人们解释相关性和因果性之间的差别。大数据统计的一个后果就是机器越来越依赖于相关性,但是相关性再怎么样它也不是因果关系。
从非专业的角度,我们只能大概这样分析,可以看到的是在基础科学知识到前沿科学事物之间,存在着需要被弥补的间隙。
0x07 拉波波特法则|Rapoport's Rules
原文:https://rationalwiki.org/wiki/Rapoport's_Rules
供稿:艾列克斯
如何撰写一篇成功的批评性文章:
- 你应该非常清楚、生动、不偏不倚地重述对手的想法,使得你的对手说:“谢谢你,我刚才要是像你这么表达就好了。”
- 你应该把对方观点中你所同意的部分都列出来,尤其是那种并非被人们广泛接受了的观点。
- 你应该提到那些从你对手那里学到东西。
- 只有完成了以上三点,你才能说一句反驳或批评的话。
How to compose a successful critical commentary:
- You should attempt to re-express your target’s position so clearly, vividly, and fairly that your target says, "Thanks, I wish I’d thought of putting it that way."
- You should list any points of agreement (especially if they are not matters of general or widespread agreement).
- You should mention anything you have learned from your target.
- Only then are you permitted to say so much as a word of rebuttal or criticism.
0x08 The Tao Of Programming|过时的隐喻
原文:http://www.textfiles.com/100/taoprogram.pro
编程和软件开发中充满了许多隐喻,这篇大概是比较古老的一篇。从软件工程的角度来看,这篇的内容只能说是玄学,虽然软件开发的许多方面都有提到一些隐喻,但是其实在字里行间体现的只是一种玄学视角,没有从工程角度,从Problem Solving的角度去写。这种上古时代的“程序诗”,只存在形式美和考古价值了。我觉的玄学一般意味着作者也没看清楚问题应该如何可操作性地解决,他只有一种感觉。
- Book 1 -- The Silent Void
- Book 2 -- The Ancient Masters
- Book 3 -- Design
- Book 4 -- Coding
- Book 5 -- Maintenance
- Book 6 -- Management
- Book 7 -- Corporate Wisdom
- Book 8 -- Hardware and Software
- Book 9 -- Epilogue
--end--