科学
言论
- 不要在疲劳的时候写代码。敬业和专业精神,更多地体现在你的纪律性,而不是体现在投入的时间。 – 《Clean Coder》的作者Robert C. Martin
- 亚马逊的老板贝佐斯认为,不可逆决定如果有70%的把握能确定结果,就是采取行动的时候。如果不那么有把握,那就不妨再观察一下。
- 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·切斯特顿
观点
敏捷开发
敏捷只是一种价值观,不是具体的方法。 它包含一些原则,实现这些原则有很多不同方法,下面是主要的几种:
- 极限编程(XP)
- Scrum 开发
- 看板开发(kanban)
- 精益开发(lean)
“精益开发”指的是创建一个最小的产品原型,交付给客户,观察他们如何使用它,再快速推出小幅改进的下一代产品。这样就能迎合快速变化的需求,不会引入无用功能。作为比较,福特方法则是详细计划所有功能,全部开发出来,然后一次性交付。
Harry Browne’s 17 Golden Rules of Financial Safety
- Your career provides your wealth.
- Don’t assume you can replace your wealth.
- Recognize the difference between investing and speculating.
- No one can predict the future.
- No one can move you in and out of investments consistently with precise and profitable timing.
- No trading system will work as well in the future as it did in the past.
- Don’t use leverage.
- Don’t let anyone make your decisions.
- Don’t ever do anything you don’t understand.
- Don’t depend on any one investment, institution, or person for your safety.
- Create a bulletproof portfolio for protection.
- Speculate only with money you can afford to lose.
- Keep some assets outside the country in which you live.
- Beware of tax-avoidance schemes.
- Ask the right questions.
- Enjoy yourself with a budget for pleasure.
- 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万+行代码项目的开发便利性、可维护性、可测试性、运营质量的资深研发群体。 厉害的技术人,主要可以分为下面几个方向:
- 奇技淫巧:掌握很多技巧,以及发现技巧一系列思路的人。很多编程大赛比的就是这个。
- 领域奠基:比如约翰·卡马克,他创造出了现代计算机图形高效渲染的方法论。先不提假设没有他,之后会不会有人发明该方法,从结果上看他就是第一个发明者。
- 理论研究:八十年代李开复博士坚持采用隐含马尔可夫模型的框架,成功地开发了世界上第一个大词汇量连续语音识别系统 Sphinx。我辈工程师,好像擅长这个的很少。
- 产品成功:小龙哥是标杆。
- 最佳实践:按照上面架构师的定义,这个是大家都可以做到的。在这条路上走得好,就能为任何公司构建技术团队,组织建设高质量的系统。 从上面的讨论中可以看出,我们普通工程师的进化之路,就是不断打磨最佳实践方法论、落地细节。
同学们常常听演讲、公开课,就喜欢听一些细枝末节的“干货”。这没有问题。但是你干了几年活,学习了多少干货知识点?构建起自己的技术思考“面”,进入立体的“工程思维”,把技术细节和系统要满足的需求在思考上连接起来了么?当听到一个需求的时候,你能思考到自己的 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 时大家判定代码质量的准绳。
荐书
《纳瓦尔宝典:财富与幸福指南》
- 既懂得制造,又懂得销售,你就是无敌的。
- 小心,尝到自由的滋味,可能会让你失业。
- 致富关键是找到”个人-市场-产品”这三者交叉的那个点。
- 做你喜欢的事,直到你喜欢去做。
- 如果你有原创性,就可以避开竞争。基本上,如果你与别人发生竞争,那是因为你们在做同样的事情。
“新人企业家的常见错误,就是认为结果是可预测的。如果我长期努力工作,就应该会得到某种成果。实际上,你的成果是不可预测的。你工作多么努力并不重要,重要的是你在做什么、与谁一起工作、以及在哪里工作。 “
他的意思是,很多人有一个思维误区:他们认为”努力”与”成果”是正比例关系,工作越努力,越可能获得好成果。实际上根本不是这样,努力与成果之间,没有必然关系。”你每天都会看到,那些赚最多钱的人,工作时间根本不长。而淘金者和商铺老板,努力工作一天,赚不到什么钱。”原因在于,现实世界是非线性的、非因果的,而人的思维是线性的、因果关系的,会不知不觉从单一的线性因素,去解读非线性关系。举例来说,银行存款是线性的,存款越多,利息越多;股票是非线性的,投资多,可能回报多,也可能亏得多。我们不应该把存款的逻辑,用在股票市场这样的非线性系统。你不断加大努力的程度,长时间工作、长期加班、没有个人生活,会带来成功吗?很可能不会,因为两者之间没有因果关系。纳瓦尔的建议是:”重要的不在于你的努力程度,而在于仔细选择工作、人员和项目。”“真正有效的工作方式,不是铁人三项或马拉松,比拼谁坚持的时间长,而是短跑,当机会来临的时候冲刺,平时注意健康和休息。”“你要像狮子一样,看到猎物一跃而起,而不要牛一样,从早到晚劳作。”
杂谈
手机版“神探玺洛克”请扫码