2023-每周补脑10th

Posted by XiLock on September 23, 2023

科学

言论

  1. 不要在疲劳的时候写代码。敬业和专业精神,更多地体现在你的纪律性,而不是体现在投入的时间。 – 《Clean Coder》的作者Robert C. Martin
  2. 亚马逊的老板贝佐斯认为,不可逆决定如果有70%的把握能确定结果,就是采取行动的时候。如果不那么有把握,那就不妨再观察一下。
  3. In truth, there are only two kinds of people; those who accept dogma and know it, and those who accept dogma and don’t know it. – 英国小说家GK·切斯特顿

观点

敏捷开发

敏捷只是一种价值观,不是具体的方法。 它包含一些原则,实现这些原则有很多不同方法,下面是主要的几种:

  1. 极限编程(XP)
  2. Scrum 开发
  3. 看板开发(kanban)
  4. 精益开发(lean)

“精益开发”指的是创建一个最小的产品原型,交付给客户,观察他们如何使用它,再快速推出小幅改进的下一代产品。这样就能迎合快速变化的需求,不会引入无用功能。作为比较,福特方法则是详细计划所有功能,全部开发出来,然后一次性交付。

Harry Browne’s 17 Golden Rules of Financial Safety
  1. Your career provides your wealth.
  2. Don’t assume you can replace your wealth.
  3. Recognize the difference between investing and speculating.
  4. No one can predict the future.
  5. No one can move you in and out of investments consistently with precise and profitable timing.
  6. No trading system will work as well in the future as it did in the past.
  7. Don’t use leverage.
  8. Don’t let anyone make your decisions.
  9. Don’t ever do anything you don’t understand.
  10. Don’t depend on any one investment, institution, or person for your safety.
  11. Create a bulletproof portfolio for protection.
  12. Speculate only with money you can afford to lose.
  13. Keep some assets outside the country in which you live.
  14. Beware of tax-avoidance schemes.
  15. Ask the right questions.
  16. Enjoy yourself with a budget for pleasure.
  17. Whenever you’re in doubt about a course of action, it is always better to err on the side of safety.
林强:Code Review 我都 CR 些什么

谓架构师,就是掌握大量设计理念和原则、落地到各种语言及附带工具链(生态)下的实践方法、垂直行业模型理解,定制系统模型设计和工程实践规范细则,进而控制30万+行代码项目的开发便利性、可维护性、可测试性、运营质量的资深研发群体。 厉害的技术人,主要可以分为下面几个方向:

  1. 奇技淫巧:掌握很多技巧,以及发现技巧一系列思路的人。很多编程大赛比的就是这个。
  2. 领域奠基:比如约翰·卡马克,他创造出了现代计算机图形高效渲染的方法论。先不提假设没有他,之后会不会有人发明该方法,从结果上看他就是第一个发明者。
  3. 理论研究:八十年代李开复博士坚持采用隐含马尔可夫模型的框架,成功地开发了世界上第一个大词汇量连续语音识别系统 Sphinx。我辈工程师,好像擅长这个的很少。
  4. 产品成功:小龙哥是标杆。
  5. 最佳实践:按照上面架构师的定义,这个是大家都可以做到的。在这条路上走得好,就能为任何公司构建技术团队,组织建设高质量的系统。 从上面的讨论中可以看出,我们普通工程师的进化之路,就是不断打磨最佳实践方法论、落地细节。

同学们常常听演讲、公开课,就喜欢听一些细枝末节的“干货”。这没有问题。但是你干了几年活,学习了多少干货知识点?构建起自己的技术思考“面”,进入立体的“工程思维”,把技术细节和系统要满足的需求在思考上连接起来了么?当听到一个需求的时候,你能思考到自己的 code package 该怎么组织,函数该怎么组织了么? 技术点要怎么和需求连接起来呢?答案很简单,你需要在时间里总结,总结出一些明确的原则、思维过程。思考怎么去总结,特别像是在思考哲学问题。从一些琐碎的细节中,由具体情况上升到一些原则、公理。同时,大家在接受原则时,不应该是接受和记住原则本身,而应该是解构原则,让这个原则在自己这里重新推理一遍,自己完全掌握这个原则的适用范围。 再进一步具体地说,对于工程最佳实践的形而上的思考过程,就是:把工程实践中遇到的问题,从问题类型和解法类型两个角度去归类,总结出一些有限适用的原则,就从点到了面。把诸多总结出的原则,组合应用到自己的项目代码中,就是把多个面结合起来构建了一套立体的最佳实践的方案。当你这套方案能适应 30w+行代码的项目,超过 30 人的项目,你就入门架构师了!当你这个项目是多端、多语言,代码量超过 300w 行,参与人数超过 300 人,代码质量依然很高,代码依然在高效地自我迭代,每天消除掉过时的代码,填充高质量的替换旧代码和新生的代码。恭喜你,你已经是一个很高级的架构师了!再进一步,你对某个业务模型有独到或者全面的理解,构建了一套行业第一的解决方案,结合刚才高质量实现的能力,实现了这么一个项目,恭喜你,你已经成为专家工程师了!

2012 年我刚毕业,和一个去了广州联通公司的华南理工毕业生聊天。当时他说他工作很不开心,因为工作里不经常写代码,而且认为自己有 ACM 竞赛金牌级的算法熟练度+对 CPP 代码的熟悉,写下一个个指针操作内存,还有什么程序写不出来,什么事情做不好。当时我觉得,挺有道理,编程工具在手,我什么事情做不了?现在我会告诉他,复杂如 Linux 操作系统、Chromium 引擎、Windows Office,你做不了。原因是他根本没进入软件工程的工程世界,不是会搬砖就能修出港珠澳大桥。但是这么回答并不好,举证用的论据离我们太遥远了。我现在会回答,你做不了,简单如一个权限系统,你知道怎么做么?堆积一堆逻辑层次一维展开的 if else?简单如一个共享文件管理,你知道怎么做么?堆积一堆逻辑层次一维展开的 if else?你公司有上万台服务器,你要怎么写一个管理平台?堆积一堆逻辑层次一维展开的 if else? 上来就是干,能实现上面提到的三个看似简单的需求么?想一想,亚马逊、腾讯云们折腾了多少年,最后才找到了容器+Kubernetes 的大杀器。这里需要谷歌多少年在 BORG 系统上的实践,提出了优秀的服务编排领域模型。权限领域,有 RBAC、DAC、MAC 等等模型,到了业务,又会有细节的不同。如 Domain Driven Design 说的,没有良好的领域思考和模型抽象,逻辑复杂度就是 n^2 指数级的,你得写多少 if else,得思考多少可能的 if 路径,来 cover 所有的不合符预期的情况。你必须要有 Domain 思考探索、model 拆解/抽象/构建的能力。有人问过我,要怎么有效地获得这个能力?这个问题我没能回答,就像是在问我,怎么才能获得 MIT 博士的学术能力?我无法回答。唯一回答就是,进入某个领域,就是首先去看前人的思考,站在前人的肩膀上,再用上自己的通识能力,去进一步思考。至于怎么建立好的通识思考能力,可能得去常青藤读个书吧 :),或者就在工程实践中思考和锻炼自己的这个能力! 那么,我们要从头开始积累思考和总结吗?不,有一本书叫做《 Unix 编程艺术》,我在不同的时期分别读了 3 遍,文中的很多原则,正好就能作为 code review 时大家判定代码质量的准绳。

荐书

《纳瓦尔宝典:财富与幸福指南》
  1. 既懂得制造,又懂得销售,你就是无敌的。
  2. 小心,尝到自由的滋味,可能会让你失业。
  3. 致富关键是找到”个人-市场-产品”这三者交叉的那个点。
  4. 做你喜欢的事,直到你喜欢去做。
  5. 如果你有原创性,就可以避开竞争。基本上,如果你与别人发生竞争,那是因为你们在做同样的事情。

“新人企业家的常见错误,就是认为结果是可预测的。如果我长期努力工作,就应该会得到某种成果。实际上,你的成果是不可预测的。你工作多么努力并不重要,重要的是你在做什么、与谁一起工作、以及在哪里工作。 “

他的意思是,很多人有一个思维误区:他们认为”努力”与”成果”是正比例关系,工作越努力,越可能获得好成果。实际上根本不是这样,努力与成果之间,没有必然关系。”你每天都会看到,那些赚最多钱的人,工作时间根本不长。而淘金者和商铺老板,努力工作一天,赚不到什么钱。”原因在于,现实世界是非线性的、非因果的,而人的思维是线性的、因果关系的,会不知不觉从单一的线性因素,去解读非线性关系。举例来说,银行存款是线性的,存款越多,利息越多;股票是非线性的,投资多,可能回报多,也可能亏得多。我们不应该把存款的逻辑,用在股票市场这样的非线性系统。你不断加大努力的程度,长时间工作、长期加班、没有个人生活,会带来成功吗?很可能不会,因为两者之间没有因果关系。纳瓦尔的建议是:”重要的不在于你的努力程度,而在于仔细选择工作、人员和项目。”“真正有效的工作方式,不是铁人三项或马拉松,比拼谁坚持的时间长,而是短跑,当机会来临的时候冲刺,平时注意健康和休息。”“你要像狮子一样,看到猎物一跃而起,而不要牛一样,从早到晚劳作。”

杂谈

  1. 在职程序员第一次编程入门的是怎样的?


手机版“神探玺洛克”请扫码