【技术思路】极客时间-左耳听风-开篇词1

开篇词 | 洞悉技术的本质,享受科技的乐趣

01 | 程序员如何用技术变现(上)

  • 独立:没有必要通过打工听人安排而活着,而是反过来通过在公司工作提高自己的技能,让自己可以更为独立和自由地生活。

  • 思考:留出更多的时间,去研究公司里外那些更为核心更有技术含量的技术。

02 | 程序员如何用技术变现(下)

  • 学习力:能够掌握大多数人不能掌握的技能或技术,学习更多别人没有的经验和经历。

  • 洞察力:能够分辨出什么是主流技术,什么是过渡式的技术。

    • 关注市场需求:看看各个公司都在做什么,他们的难题是什么。
    • 关注技术趋势:要看清技术趋势,你需要了解历史。要看一个新的技术是否顺应技术发展趋势,就需要将一些老技术的本质吃得很透。
    • 学习技术过程中一定要多问自己两个问题:“一、这个技术解决什么问题,为什么同类的技术做不到?二、为什么是这样解决的,有没有更好的方式?”
    • 一个新技术出现时,后面一定会有大型的商业公司支持,这类公司支持得越多,就说明越需要关注。
  • 寻找环境:找到能体现自身价值的高速发展公司,大公司技术架构和业务已经定性,高级技术人员很多,无法体现出价值。刚起步的公司,精力放在业务扩展上,不需要高精尖的技术。并不排除大公司中找到高速发展的业务。

  • 动手能力:动手能力很重要,代码里全是细节。只有了解了细节,才能提出更好更靠谱、可以落地的解决方案。而不是一些笼统和模糊的东西。

  • 付费点:关注技术付费点。一个是能帮别人“挣钱”的地方;一个是能帮别人“省钱”的地方。

  • 提升经验:提升自己的能力和经历,比如你是一个很知名的开源软件的核心开发人员,或者是某知名公司核心项目的核心开发人员。

  • 信息收集:用好Google获取有价值的信息源

  • 价值观:输出观点和价值观,输出了更先进的价值观,才能获得真正的影响力。

  • 朋友圈:朋友圈很重要,一个人在什么样的朋友圈,就会被什么样的朋友所影响。优质朋友圈特性:

- 这些人比较有想法、有观点,经验也比较丰富。
- 涉猎面比较广
- 有或多或少的成功
- 喜欢折腾喜欢搞事的人
- 对现状不满,并想做一些改变
- 有一定的影响力

会挣钱的人一定是会投资的人。最宝贵的财富并不是钱,而是你的时间,时间比钱更宝贵,因为钱不用还在那里,而时间不用就浪费掉了。把你的时间投资在哪些地方,就意味着你未来会走什么样的路。所以投到一些有意义的地方。

03| Equifax信息泄露始末

作为美国三大信用报告公司中历史最悠久的一家,Equifax 的主营业务是为客户提供美国、加拿大和其他多个国家的公民信用信息。保险公司就是其服务的主要客户之一,涉及生命、汽车、火灾、医疗保险等多个方面。

此外,Equifax 还提供入职背景调查、保险理赔调查,以及针对企业的信用调查等服务。由于 Equifax 掌握了多个国家公民的信用档案,包括公民的学前、学校经历、婚姻、工作、健康、政治参与等大量隐私信息,所以这次的信息泄露,影响面积很大,而且性质特别恶劣。

受这次信息泄露影响的美国消费者有 1.43 亿左右,另估计约有 4400 万的英国客户和大量加拿大客户受到影响。事件导致 Equifax 市值瞬间蒸发掉逾 30 亿美元。

  • 利用了其系统中未修复的 Apache Struts 漏洞(CVE-2017-5638,2017 年 3 月 6 日曝光)来发起攻击。
  • Shodan搜索引擎搜索管理面板,用户名和密码都是"admin"。
  • 绕过WAF的手法。
  • struts漏洞
在 GitHub 上有相关的代码,链接为:
https://github.com/mazen160/struts-pwn
https://github.com/xsscx/cve-2017-5638

04 从Equifax信息泄露看数据安全

回顾互联网时代的其他几次大规模数据泄露事件,分析背后的原因,给出解决这类安全问题的技术手段和方法。

数据泄露历史

  • 2012:LinkedIn 在 2012 年也泄露了 6500 万用户名和密码。事件发生后,LinkedIn 为了亡羊补牢,及时阻止被黑账户的登录,强制被黑用户修改密码,并改进了登录措施,从单步认证增强为带短信验证的两步认证。

  • 2013~2014: 继 2013 年大规模数据泄露之后,雅虎在 2014 年又遭遇攻击,泄露出 5 亿用户的密码,直到 2016 年有人在黑市公开交易这些数据时才为大众所知。雅虎股价在事件爆出的第二天就下跌了 2.4%。

  • 国内也有类似的事件。2014 年携程网安全支付日志存在漏洞,导致大量用户信息如姓名、身份证号、银行卡类别、银行卡号、银行卡 CVV 码等信息泄露。这意味着,一旦这些信息被黑客窃取,在网络上盗刷银行卡消费将易如反掌。

数据泄露攻击

  • 1、利用程序框架或库的已知漏洞。比如这次 Equifax 被攻击,就是通过 Apache Struts 的已知漏洞。
  • 2、暴力破解密码。利用密码字典库或是已经泄露的密码来“撞库”。
  • 3、代码注入。通过程序员代码的安全性问题,如 SQL 注入、XSS 攻击、CSRF 攻击等取得用户的权限。
  • 4、利用程序日志不小心泄露的信息。携程的信息泄露就是本不应该能被读取的日志没有权限保护被读到了。
  • 5、社会工程学。第一道防线是人——员工。只有员工的安全意识增强了,才能抵御此类攻击。其它的如钓鱼攻击也属于此类。

数据管理问题:

  • 1、Equifax 只是被黑客攻破了管理面板和数据库,就造成了数据泄露。显然这样只有一层安全防护是不够的。
  • 2、弱密码。Equifax 数据泄露事件绝对是管理问题。至少,密码系统应该不能让用户设置如此简单的密码,而且还要定期更换。最好的方式是通过数据证书、VPN、双因子验证的方式来登录。
  • 3、向公网暴露了内部系统。在公司网络管理上出现了非常严重的问题。
  • 4、对系统及时打安全补丁。监控业内的安全漏洞事件,及时做出响应,这是任何一个有高价值数据的公司都需要干的事。
  • 5、安全日志被暴露。安全日志往往包含大量信息,被暴露是非常危险的。携程的 CVV 泄露就是从日志中被读到的。
  • 6、保存了不必要保存的用户数据。携程保存了用户的信用卡号、有效期、姓名和 CVV 码,这些信息足以让人在网上盗刷信用卡。其实对于临时支付来说,这些信息完全可以不保存在磁盘上,临时在内存中处理完毕立即销毁,是最安全的做法。即便是快捷支付,也没有必要保存 CVV 码。安全日志也没有必要将所有信息都保存下来,比如可以只保存卡号后四位,也同样可以用于处理程序故障。
  • 7、密码没有被合理地散列。以现代的安全观念来说,以明文方式保存密码是很不专业的做法。进一步的是只保存密码的散列值(用安全散列算法),LinkedIn 就是这样做的。但是,散列一则需要用目前公认安全的算法(比如 SHA-2 256),而已知被攻破的算法则最好不要使用(如 MD5,能人为找到碰撞,对密码验证来说问题不大),二则要加一个安全随机数作为盐(salt)。LinkedIn 的问题正在于没有加盐,导致密码可以通过预先计算的彩虹表(rainbow table)反查出明文。

专家建议

Contrast Security 是一家安全公司,其 CTO 杰夫·威廉姆斯( Jeff Williams)在博客中表示,虽说最佳实践是确保不使用有漏洞的程序库,但是在现实中并不容易做到这一点,因为安全更新来得比较频繁。

  • 1、理解你的软件产品中使用了哪些支持性框架和库,它们的版本号分别是多少。时刻跟踪影响这些产品和版本的最新安全性声明。
  • 2、建立一个流程,来快速地部署带有安全补丁的软件产品发布版,这样一旦需要因为安全方面的原因而更新支持性框架或库,就可以快速地发布。最好能在几个小时或几天内完成,而不是几周或几个月。我们发现,绝大多数被攻破的情况是因为几个月或几年都没有更新有漏洞的软件组件而引起的。
  • 3、所有复杂的软件都有漏洞。不要基于“支持性软件产品没有安全性漏洞”这样的假设来建立安全策略。
  • 4、建立多个安全层。在一个面向公网的表示层(比如 Apache Struts 框架)后面建立多级有安全防护的层次,是一种良好的软件工程实践。就算表示层被攻破,也不会直接提供出重要(或所有)后台信息资源的访问权。
  • 5、针对公网资源,建立对异常访问模式的监控机制。现在有很多侦测这些行为模式的开源和商业化产品,一旦发现异常访问就能发出警报。作为一种良好的运维实践,我们建议针对关键业务的网页服务应用一定要有这些监控机制。

安全在今天是一个非常严肃的事,能做到绝对的安全基本上是不可能的,我们只能不断提高黑客入侵的门槛。当黑客的投入和收益大大不相符时,黑客也就失去了入侵的意义。

安全还在于“风控”,任何系统就算你做得再完美,也会出现数据泄露的情况,只是我们可以把数据泄露的范围控制在一个什么样的比例,而这个比例就是我们的“风控”。

所谓的安全方案基本上来说就是能够把这个风险控制在一个很小的范围。对于在这个很小范围出现的一些数据安全的泄露,我们可以通过“风控基金”来做业务上的补偿,比如赔偿用户损失等等。因为从经济利益上来说,如果风险可以控制在一个——我防范它的成本远高于我赔偿它的成本,那么,还不如赔偿了。

05 | 何为技术领导力?

技术重要吗?

  • 亚马逊、Facebook 这样的公司,最终都会去发展自己的核心技术,提高自己的技术领导力,从早期的业务型公司转变成为技术型公司。

  • 谷歌当年举公司之力不做技术做社交。拉里·佩奇(Larry Page)看到苗头不对,重新掌权,把产品经理全部移到一边,让工程师重新掌权,于是才有了无人车和 AlphaGo 这样真正能够影响人类未来的惊世之作。

  • 尊重技术的公司和不尊重技术的公司在初期可能还不能显现,而长期来看,差距明显。

什么是技术领导力?

技术领导力不仅仅是呈现出来的技术,而是一种可以获得绝对优势的技术能力。所以,技术领导力也有一些特征,为了说清楚这些特征,先让我们来看一下人类历史上的几次工业革命。

  • 第一次工业革命:人类生产逐渐转向新的制造过程,出现了以机器取代人力、兽力的趋势。世界被推向了一个崭新的“蒸汽时代”。
  • 第二次工业革命:第二次工业革命以电力的大规模应用为代表,以电灯、电报以及无线电通信的发明为标志。这些发明把人类推向了“电力”时代。
  • 第三次工业革命:第三次工业革命又名信息技术革命或者数字化革命,指第二次世界大战后,因计算机和电子数据的普及和推广而在各行各业发生的从机械和模拟电路再到数字电路的变革。

近代这几百年的人类发展史,从蒸汽机时代,到电力时代,再到信息时代,我们可以看到这样的一些信息。

  • 关键技术:蒸汽机、电、化工、原子能、炼钢、计算机,如果只看这些东西的话,似乎没什么用。但这些核心技术的突破,可以让我们建造很多更牛的工具,而这些工具能让人类干出以前干不出来的事。
  • 自动化:其中最重要的事就是自动化。三次革命中最重要的事就是用机器来自动化。通信、交通、军事、教育、金融等各个领域都是在拼命地自动化,以提高效率——用更低的成本来完成更多的事。
  • 解放生产力:把人从劳动密集型的工作中解放出来,去做更高层次的知识密集型的工作。说得难听一点,就是取代人类,让人失业。值得注意的是,今天的 AI 在开始取代人类的知识密集型的工作……

因此,我们可以看到的技术领导力是:

- 尊重技术,追求核心基础技术。
- 追逐自动化的高效率的工具和技术,同时避免无效率的组织架构和管理。
- 解放生产力,追逐人效的提高。
- 开发抽象和高质量的可以重用的技术组件。
- 坚持高于社会主流的技术标准和要求。

如何拥有技术领导力?

  • 能够发现问题:发现有方案的问题。

  • 能够提供解决问题的思路和方案,并能比较这些方案的优缺点。

  • 能够做出正确的技术决定:用什么技术、什么解决方案、怎样实现来完成一个项目。

  • 能够用更优雅、更简单、更容易的方式来解决问题。

  • 能够提高代码或软件的扩展性、重用性和可维护性。

  • 能够用正确的方式管理团队:一、正确的人做正确的事,发挥每个人的潜力。二、提升团队的生产力和人效,找到最有价值的需求,用最少的成本实现。三、不断提高自身和团队的标准。

  • 创新能力:能够使用新的方法、新的方式解决问题,追逐新的工具和技术。

作为一个软件工程师,要四个方面让自己拥有技术领导力:

  • 扎实的基础技术
  • 非同一般的学习能力
  • 坚持做正确的事
  • 不断得高对自己的要求标准

06 | 如何才能拥有技术领导力?

一、基础技术

第一、吃透基础技术。基础技术是各种上层技术共同的基础。更好地理解程序的运行原理,并基于这些基础技术进化出更优化的产品。具体分为两个部分:编程和系统。

编程部分

  • C语言:相对于很多其他高级语言来说,C 语言更接近底层。在具备跨平台能力的前提下,它可以比较容易地被人工翻译成相应的汇编代码。
1、程序是怎么精细控制底层资源的,比如内存管理、文件操作、网络通信……
2、需要学习汇编语言,写一些如 lock free 之类高并发的东西。那么了解汇编语言,就能有助于更好地理解和思考。
  • 编程范式:各种编程语言都有它们各自的编程范式,用于解决各种问题。比如面向对象编程(C++、Java)、泛型编程(C++、Go、C#)、函数式编程(JavaScript、 Python、Lisp、Haskell、Erlang)等。
了解各种程序设计语言的功能特性
  • 算法和数据结构:任何有技术含量的软件中一定有高级的算法和数据结构。比如 epoll 中使用了红黑树,数据库索引使用了 B+ 树……而就算是你的业务系统中,也一定使用各种排序、过滤和查找算法。学习算法不仅是为了写出运转更为高效的代码,而且更是为了能够写出可以覆盖更多场景的正确代码。

系统部分

  • 计算机系统原理:CPU 的体系结构(指令集 [CISC/RISC]、分支预测、缓存结构、总线、DMA、中断、陷阱、多任务、虚拟内存、虚拟化等),内存的原理与性能特点(SRAM、DRAM、DDR-SDRAM 等),磁盘的原理(机械硬盘 [盘面、磁头臂、磁头、启停区、寻道等]、固态硬盘 [页映射、块的合并与回收算法、TRIM 指令等]),GPU 的原理等。

  • 操作系统原理和基础:进程、进程管理、线程、线程调度、多核的缓存一致性、信号量、物理内存管理、虚拟内存管理、内存分配、文件系统、磁盘管理等。

学习操作系统知识:
一是要仔细观察和探索当前使用的操作系统
二是要阅读操作系统原理相关的图书
三是要阅读 API 文档(如 man pages 和 MSDN Library),并编写调用操作系统功能的程序。
这里推荐三本书《UNIX 环境高级编程》、《UNIX 网络编程》和《Windows 核心编程》。
  • 网络基础:需要了解基本的网络层次结构(ISO/OSI 模型、TCP/IP 协议栈),包括物理层、数据链路层(包含错误重发机制)、网络层(包含路由机制)、传输层(包含连接保持机制)、会话层、表示层、应用层(在 TCP/IP 协议栈里,这三层可以并为一层)。
底层的 ARP 协议
中间的 TCP/UDP 协议
高层的 HTTP 协议。

《TCP/IP 详解》,学习这些基础的网络协议,可以为高维分布式架构中的一些技术问题提供很多的技术方案。
比如 TCP 的滑动窗口限流,完全可以用于分布式服务中的限流方案。
  • 数据库原理:现代流行的数据库管理系统有两大类:SQL(基于 B+ 树,强一致性)和 NoSQL(较弱的一致性,较高的存取效率,基于哈希表或其他技术)。
阅读各类数据库图书,并多做数据库操作以及数据库编程,多观察分析数据库在运行时的性能。
  • 分布式技术架构:学习分布式技术架构,包括负载均衡、DNS 解析、多子域名、无状态应用层、缓存层、数据库分片、容错和恢复机制、Paxos、Map/Reduce 操作、分布式 SQL 数据库一致性(以 Google Cloud Spanner 为代表)等知识点。

二、学习能力

提高学习能力。所谓学习能力,就是能够很快地学习新技术,又能在关键技术上深入的能力。

  • 学习的信息源:常见的信息源有 Google 等搜索引擎,Stack Overflow、Quora 等社区,图书,API 文档,论文和博客等。

  • 与高手交流:通过技术社区以及参加技术会议与高手交流,也可以通过参加开源项目来和高手切磋。

  • 举一反三的思考:了解了操作系统的缓存和网页缓存以后,你要思考其相同点和不同点。了解了 C++ 语言的面向对象特性以后,思考 Java 面向对象的相同点和不同点。遇到故障的时候,举一反三,把同类问题一次性地处理掉。

  • 不怕困难的态度:多思考,多下功夫,能够不怕困难,并可以找到解决困难的方法和路径,时间一长,你就能拥有别人所不能拥有的能力。

  • 开放的心态:实现一个目的通常有多种办法。带有开放的心态,不拘泥于一个平台、一种语言,往往能带来更多思考,也能得到更好的结果。而且,能在不同的方法和方案间做比较,比较它们的优缺点,那么你会知道在什么样的场景下用什么样的方案,你就会比一般人能够有更全面和更完整的思路。

三、坚持正确的事

坚持做正确的事。做正确的事,比用正确的方式做事更重要,因为这样才始终会向目的地靠拢。

  • 提高效率的事:学习和掌握良好的时间管理方式,管理好自己的时间,能显著提高自己的效率。
  • 自动化的事:程序员要充分利用自己的职业特质,当看见有可以自动化的步骤时,编写程序来自动化操作,可以显著提高效率。
  • 掌握前沿技术的事:掌握前沿的技术,有利于拓展自己的眼界,也有利于找到更好的工作。需要注意的是,有些技术虽然当下很火,但未必前沿,而是因为它比较易学易用,或者性价比高。由于学习一门技术需要花费不少时间,你应该选择自己最感兴趣的,有的放矢地去学习。
  • 知识密集型的事:知识密集型是相对于劳动密集型来说的。基本上劳动密集型的事都能通过程序和机器来完成,而知识密集型的事却仍需要人来完成,所以人的价值此时就显现出来了。
  • 技术驱动的事:用程序驱动的事,而且还包括一切技术改变生活的事。比如自动驾驶、火星登陆等。就算自己一时用不着,你也要了解这些,以便将来这些技术来临时能适应它们。

四、高标准要求自己

  • Google的自我评分卡:可以参考 Google 的这个评分卡来给自己做评估,并通过它来不断地提高对自己的要求。(该评分卡见文末附录)。

  • 敏锐的技术嗅觉:充分利用信息源,GET 到新的技术动态,并通过参与技术社区的讨论,丰富自己了解技术的角度。思考一下是否是自己感兴趣的,能解决哪些实际问题,以及其背后的原因,新技术也好,旧技术的重大版本变化也罢。

  • 强调实践,学以致用:学习知识,一定要实际用一用,可以是工作中的项目,也可以是自己的项目,不仅有利于吸收理解,更有利于深入到技术的本质。并可以与现有技术对比一下,同样的问题,用新技术解决有什么不同,带来了哪些优势,还有哪些有待改进的地方。

  • Lead by Example:永远在编程。不写代码,你就对技术细节不敏感,你无法做出可以实践的技术决策和方案。

  • 软技能:良好的沟通能力、组织能力、驱动力、团队协作能力等等。《技术领导之路》、《卓有成效的管理者》等多本经典图书中均有细致的讲解。

附 Google 评分卡

0 - you are unfamiliar with the subject area.
0 - 你不熟悉这个学科领域。

1 - you can read / understand the most fundamental aspects of the subject area.

1 - 您可以阅读/理解主题领域的最基本问题。


2 - ability to implement small changes, understand basic principles and able to figure out additional details with minimal help.

2 - 能够实现小的改变,理解基本原理,并能够在最少的帮助下找出额外的细节。

3 - basic proficiency in a subject area without relying on help.

3 - 在不依赖帮助的情况下对某一学科领域的基本熟练程度。

4 - you are comfortable with the subject area and all routine work on it:

4 - 你对主题领域和所有常规工作感觉很轻松:

For software areas - ability to develop medium programs using all basic language features w/o book, awareness of more esoteric features (with book).

对于软件领域 - 有能力使用所有基础语言的功能(无书)开发出中等程序,有更深奥的理解(带书)。

For systems areas - understanding of many fundamentals of networking and systems administration, ability to run a small network of systems including recovery, debugging and nontrivial troubleshooting that relies on the knowledge of internals.

对于系统领域 - 了解网络和系统管理的许多基础知识,运行小型系统网络的能力,包括依赖于内部知识的恢复,调试和重要故障排除。

5 - an even lower degree of reliance on reference materials. Deeper skills in a field or specific technology in the subject area.

5 - 对参考材料的依赖程度更低。 更深入的领域技能或主题领域的特定技术。

6 - ability to develop large programs and systems from scratch. Understanding of low level details and internals. Ability to design / deploy most large, distributed systems from scratch.

6 - 

7 - you understand and make use of most lesser known language features, technologies, and associated internals. Ability to automate significant amounts of systems administration.

8 - deep understanding of corner cases, esoteric features, protocols and systems including “theory of operation”. Demonstrated ability to design, deploy and own very critical or large infrastructure, build accompanying automation.

9 - could have written the book about the subject area but didn’t; works with standards committees on defining new standards and methodologies.

10 - wrote the book on the subject area (there actually has to be a book). Recognized industry expert in the field, might have invented it.

Subject Areas:

TCP/IP Networking (OSI stack, DNS etc)
Unix/Linux internals
Unix/Linux Systems administration
Algorithms and Data Structures
C
C++
Python
Java
Perl
Go
Shell Scripting (sh, Bash, ksh, csh)
SQL and/or Database Admin
Scripting language of your choice (not already mentioned)
People Management
Project Management

07 | 推荐阅读:每个程序员都该知道的知识

每个程序员都应该要读的书

https://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read

  • 《代码大全》
  • 《程序员修练之道》
  • 《计算机的构造和解释》
  • 《算法导论》
  • 《设计模式》
  • 《重构》
  • 《人月神话》
  • 《代码整洁之道》
  • 《Effective C++》/《More Effective C++》
  • 《Unix 编程艺术》、《Unix 高级环境编程》

每个搞计算机专业的学生应有的知识

http://matt.might.net/articles/what-cs-majors-should-know/

  • 要获得一份好工作,学生需要知道什么?
  • 为了一辈子都有工作干,学生需要知道什么?
  • 学生需要知道什么,才能进入研究生院?
  • 学生需要知道什么,才能对社会有益?

首先,作品集(Portfolio)会比简历(Resume)更有参考意义。简历中应该放上自己的一些项目经历,或是一些开源软件的贡献,或是你完成的软件的网址等。个人网址写自己的技能、经历、文章。

其次,计算机专业工作者也要学会与人交流的技巧,包括如何写演示文稿,以及面对质疑时如何与人辩论的能力。

最后,硬技能方面工程类数学、Unix 哲学和实践、系统管理、程序设计语言、离散数学、数据结构与算法、计算机体系结构、操作系统、网络、安全、密码学、软件测试、用户体验、可视化、并行计算、软件工程、形式化方法、图形学、机器人、人工智能、机器学习、数据库等等。

LinkedIn 高效的代码复查技巧

LinkedIn 的高效代码复查技巧

LinkedIn’s Tips for Highly Effective Code Review

从CODE REVIEW 谈如何做技术

LinkedIn 内部实践的 Code Review 形式复查有以下几个特点。

  • 强制要求在团队成员之间做代码复查。Code Review 带来的反馈意见让团队成员能够迅速提升自己的技能水平,这解决了 LinkedIn 各个团队近年来因迅速扩张带来的技能不足的问题。
  • 通过建立公司范围的 Code Review 工具,这就可以做跨团队的 Code Review。既有利于消除 bug,提升质量,也有利于不同团队之间经验互通。
  • Code Review 的经验作为员工晋升的参考因素之一。
  • Code Review 的一个难点是,Reviewer 可能不了解某块代码修改的背景和目的。所以 LinkedIn 要求代码签入版本管理系统前,就对其做清晰的说明,以便复查者了解其目的,促进 Review 的进行。

LinkedIn 对提交代码写说明文档这个思路是一个非常不错的方法,因为代码提交人写文档的过程其实也是重新梳理的过程。写文档的时候通常会发现自己把事儿干复杂了,应该把代码再简化一下,于是就会回头去改代码。

  • 有些 Code Review 工具所允许给出的反馈只是代码怎样修改以变得更好,但长此以往会让人觉得复查提出的意见都表示原先的代码不够好。为了提高员工积极性,LinkedIn 的代码复查工具允许提出“这段代码很棒”之类的话语,以便让好代码的作者得到鼓励。
  • 为 Code Review 的结果写出有目的性的注释。比如“消除重复代码”,“增加了测试覆盖率”,等等。
  • Code Review 中,不但要 Review 提交者的代码,还要 Reivew 提交者做过的测试。除了一些单元测试,还有一些可能是手动的测试。提交者最好列出所有测试过的案例。这样可以让 Reviewer 可以做出更多的测试建议,从而提高质量。
  • 对 Code Review 有明确的期望,不过分关注细枝末节,也不要炫技,而是对要 Review 的代码有一个明确的目标。

编程语言和代码质量的研究报告

编程语言和代码质量的研究报告

A Large-Scale Study of Programming Languages and Code Quality in GitHub

结论1: 从查看 bug fix 的 commits 的次数情况来看,C、C++、Objective-C、PHP 和 Python 中有很多很多的 commits 都是和 bug fix 相关的,而 Clojure、Haskell、Ruby、Scala 在 bug fix 的 commits 的数上明显要少很多。

结论2:函数式编程语言的 bug 明显比大多数其它语言要好很多。有隐式类型转换的语言明显产生的 bug 数要比强类型的语言要少很多。函数式的静态类型的语言要比函数式的动态类型语言的程序出 bug 的可能性要小很多。

结论3:研究者想搞清是否 bug 数会和软件的领域相关。比如,业务型、中间件型、框架、lib,或是数据库。研究表明,并没有什么相关性。

结论4:研究人员想搞清楚 bug 的类型是否会和语言有关系。的确如此,bug 的类型和语言是强相关性的。

这份报告可以在评估编程语言时有一定的借鉴作用。

电子书:《C++ 软件性能优化》

Optimizing Software in C++ - Agner Fog

这本书是所有 C++ 程序员都应该要读的一本书,它从事无巨细地从语言层面、编译器层面、内存访问层面、多线程层面、CPU 层面讲述了如何对软件性能调优。实在是一本经典的电子书。

Agner Fog 还写了其它几本和性能调优相关的书,可以到这个网址http://www.agner.org/optimize/下载

- Optimizing subroutines in assembly language: An optimization guide for x86 platforms
- The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers
- Instruction tables: Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD and VIA CPUs
- Calling conventions for different C++ compilers and operating systems

08 | Go语言,Docker和新技术

一个技术能不能发展起来,关注三点:

  • 有没有一个好的社区(商业机构参与的社区)
  • 有没有一个工业化的标准(企业级标准)
  • 有没有一个或多个杀手级应用(解决方案)

影响因素:

  • 学习难度是否低,上手是否快
  • 有没有一个不错的提高开发效率的开发框架
  • 是否有一个或多个巨型的技术公司作为后盾
  • 有没有解决软件开发中的痛点

衡量Go:

  • Go 语言容易上手;
  • Go 语言解决了并发编程和底层应用开发效率的痛点;
  • Go 语言有 Google 这个世界一流的技术公司在后面;
  • Go 语言的杀手级应用是 Docker 容器,而容器的生态圈这几年可谓是发展繁荣,也是热点领域;

也就是说,Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到上层如 Java 业务层的项目。Go 语言能吞食的一定是 PaaS 上的项目,比如一些消息缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,他们没有复杂的业务场景,也到不了特别底层(如操作系统)的软件项目或工具。而 C 和 C++ 会被打到更底层,Java 会被打到更上层的业务层。

衡量一下 Go语言的杀手级应用 Docker:

  • Docker 容易上手。
  • Docker 解决了运维中的环境问题以及服务调度的痛点。
  • Docker 的生态圈中有大公司在后面助力,比如 Google。
  • Docker 产出了工业界标准 OCI。
  • Docker 的社区和生态圈已经出现像 Java 和 Linux 那样的态势。

Docker解决了PaaS层的问题,PaaS层能解决以下问题:

  • 软件生产线的问题
  • 分布式服务化的问题
  • 提高服务的可用性 SLA
  • 软件能力的复用

新技术的入场,而不是等待技术成熟了再进入:

  • 技术的发展过程非常重要
  • 关键新技术,可以让你提前抢占技术的先机

09 | 答疑解惑:渴望、热情和选择

加班太严重完全没有时间学习,怎么办?

时间一定是能找得到的,就看你对你要干的事有多大的渴望程度和多大的热情。 只要你真的想做,你就一定能想出各种各样的招儿来为自己挤出时间。

为什么你能够写出这么多东西?

  • 第一个阶段,是学习的阶段:把学习到的东西都以笔记的方式记录下来,方便可以翻出来看看。所以这个阶段主要还是学习的阶段。
  • 第二个阶段,是有利益驱动的阶段:证明自己能做,不但要做出来,写出来,还要说出来。
  • 第三个阶段,是记录自己观点打自己脸的阶段:写博客,记录一些自己的想法和观点。
  • 第四个阶段,是与他人交互的阶段:写一些观点鲜明,甚至看上去比较极端或是理想的文章了。一旦一件事被真正地讨论起来(而不是点赞和转发),就会有很多知识命中认知盲区。虽然会被别人批评或是指责,但是,能从中收获到更多,因为会从不同的观点,以及别人的批评中,让自己变得更加完善和成熟。

从写作中还能训练自己的表达能力,这让我能够更好更漂亮地与别人交流和沟通。这一点对于我们整天面对电脑的技术人员来说,太重要了。

怎样选择自己的人生和职业发展?

  • 20-30 岁,这是打基础的阶段:开阔眼界,把基础打扎实,努力学习和成长。
  • 30-40 岁,这是人生发展的阶段:明确自己奋斗的方向,需要做有挑战的事儿,需要提升自己的技术领导力

耗子叔给的一些建议:

  • 客观地审视自己:如果你超过了身边的大多数人,你不妨选择得激进一些冒险一些,否则,还是按部就班地来吧
  • 确定自己想要什么:所谓“极端”,就是自己不会受到其它东西或其他人的影响,不会因为这条路上有人退出你会开始怀疑或者迷茫,也不会因为别的路上有人成功了,你就会羡慕。
  • 注重长期的可能性,而不是短期的功利:多去选择能让自己成长的事,尤其是能让自己开阔眼界的事情。人最害怕的不是自己什么都不会,而是自己不知道自己不会。
  • 尽量关注自己会得到的东西,而不是自己会失去的东西:无论怎么选,都会有得有失。
  • 不要和大众的思维方式一样:如果你和大众不一样,那么只有两种情况,一个是你比大多数人聪明,一个是你比大多数人愚蠢。

10 | 如何成为一个大家愿意追随的Leader?

Leader 和 Boss 的不同

两者得不同点如下:

  • Boss 是驱动员工,Leader 是指导员工
  • Boss 制造畏惧,Leader 制造热情
  • Boss 面对错误喜欢使用人事惩罚的手段,而 Leader 面对错误喜欢寻找解决问题的技术或管理方法
  • Boss 只是知道怎么做,而 Leader 则是展示怎么做
  • Boss 是用人,而 Leader 是发展人
  • Boss 从团队收割成绩,而 Leader 则是给予团队成绩
  • Boss 喜欢命令和控制( Command + Control ),而 Leader 喜欢沟通和协作( Communication + Cooperation )
  • Boss 喜欢说“给我上”,而 Leader 喜欢说“跟我上”

从上面这些比较,可以看到 Boss 和 Leader 的不同。了解和认识到什么才是一个真正的 Leader,什么才是一个 Leader 应有的素质和行为。

如何成为众人愿意追随的 Leader

  • 帮人解决问题:总是能站出来告诉大家该怎么办。
  • 被人依赖
- 这个世界很大,一个公司或是一个 Leader 很难做到把人一辈子留下来,因为人总是需要有不同经历的,优秀的人更是如此。既然做不到把人留一辈子,那么不妨把这件事做得漂亮一些,这样会让要离开的员工觉得这个 Leader 或是这个公司的胸怀不一般,可能是他再也碰不到的公司或 Leader,反而会想留下来,或是离开后又想回来。

- 既然做不到不让员工吐槽公司,那么不妨让这件事做得更漂亮一些——可以公开透明地说,而不是在背后说,因为在背后说对公司或是团队的伤害更大。
  • 赢得他人的信任:对于信任来说,并不完全是别人相信你能做到某个事,还有别人愿意向你打开心扉,和你说他心里面最柔软的东西。而后者才是真正的信任。

  • 开放的心态 + 倾向性的价值观:

-  对于各种各样的技术都要持一种比较开放的态度,可以讨论优缺点,但不会争个是非对错,尤其对于新技术来说,更要开放。
  
-  倾向性可以让别人更清楚地知道我是一个什么样的人,而不会对我琢磨不透,一会东一会西只会让人觉得你太油了,反而会产生距离感和厌恶感。我认为,倾向性的价值观是别人是否可以跟随你的一个基础。
  • Lead by Example:要做一个有人愿意跟随的技术 Leader,你需要终身写代码,也就是所谓的 ABC – Always Be Coding。这样,你会得到更多的实际经验,能够非常明白一个技术方案的优缺点,实现复杂度,知道什么是 Best Practice,你的方案才会更具执行力和实践性。当有了执行力,你就会获得更多的成就,而这些成就反过来会让更多的人来跟随你。

  • 保持热情和冲劲:所谓的保持热情和冲劲,并不是自欺欺人,也不是文过饰非,因为掩耳盗铃、掩盖问题、强颜欢笑的方式根本不是热情。真正的热情和冲劲是,正视问题,正视不足,正视错误,从中进行反思和总结得到更好的解决方案,不怕困难,迎难而上。

  • 能够抓住重点,看透事物的本质:能够抓住主要矛盾,看清事物的本质,给出清楚的观点或方向,简化复杂的事情,传道解惑、开启民智,让人豁然开朗、醍醐灌顶,才会让人追随之。

  • 描绘令人激动的方向,提供令人向住的环境:能够抓住主要矛盾,看清事物的本质,给出清楚的观点或方向,简化复杂的事情,传道解惑、开启民智,让人豁然开朗、醍醐灌顶,才会让人追随之。

  • 甘当铺路石,为他人创造机会:帮助别人其实就是帮助自己,成就他人其实也是在成就自己,这就像一个好的足球队一样,球队中的人都互相给队友创造机会,整个团队成功了,球队的每个人也就成功了。

也许,你不必做一个 Leader,但是如果你有想跟随的人,你应该去跟随这样的 Leader!

posted @ 2018-12-27 09:41  17bdw  阅读(562)  评论(0编辑  收藏  举报