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

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

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

  • 独立:没有必要经过打工听人安排而活着,而是反过来经过在公司工做提升本身的技能,让本身能够更为独立和自由地生活。html

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

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

  • 学习力:可以掌握大多数人不能掌握的技能或技术,学习更多别人没有的经验和经历。
  • 洞察力:可以分辨出什么是主流技术,什么是过渡式的技术。
    • 关注市场需求:看看各个公司都在作什么,他们的难题是什么。
    • 关注技术趋势:要看清技术趋势,你须要了解历史。要看一个新的技术是否顺应技术发展趋势,就须要将一些老技术的本质吃得很透。
    • 学习技术过程当中必定要多问本身两个问题:“1、这个技术解决什么问题,为何同类的技术作不到?2、为何是这样解决的,有没有更好的方式?”
    • 一个新技术出现时,后面必定会有大型的商业公司支持,这类公司支持得越多,就说明越须要关注。
  • 寻找环境:找到能体现自身价值的高速发展公司,大公司技术架构和业务已经定性,高级技术人员不少,没法体现出价值。刚起步的公司,精力放在业务扩展上,不须要高精尖的技术。并不排除大公司中找到高速发展的业务。
  • 动手能力:动手能力很重要,代码里全是细节。只有了解了细节,才能提出更好更靠谱、能够落地的解决方案。而不是一些笼统和模糊的东西。
  • 付费点:关注技术付费点。一个是能帮别人“挣钱”的地方;一个是能帮别人“省钱”的地方。
  • 提高经验:提高本身的能力和经历,好比你是一个很知名的开源软件的核心开发人员,或者是某知名公司核心项目的核心开发人员。程序员

  • 信息收集:用好Google获取有价值的信息源
  • 价值观:输出观点和价值观,输出了更先进的价值观,才能得到真正的影响力。
  • 朋友圈:朋友圈很重要,一我的在什么样的朋友圈,就会被什么样的朋友所影响。优质朋友圈特性:github

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

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

03| Equifax信息泄露始末

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

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

受此次信息泄露影响的美国消费者有 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 码等信息泄露。这意味着,一旦这些信息被黑客窃取,在网络上盗刷银行卡消费将易如反掌。

数据泄露攻击

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

数据管理问题:

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

专家建议

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

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

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

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

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

05 | 何为技术领导力?

技术重要吗?

  • 亚马逊、Facebook 这样的公司,最终都会去发展本身的核心技术,提升本身的技术领导力,从早期的业务型公司转变成为技术型公司。
  • 谷歌当年举公司之力不作技术作社交。拉里·佩奇(Larry Page)看到苗头不对,从新掌权,把产品经理所有移到一边,让工程师从新掌权,因而才有了无人车和 AlphaGo 这样真正可以影响人类将来的惊世之做。

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

什么是技术领导力?

技术领导力不只仅是呈现出来的技术,而是一种能够得到绝对优点的技术能力。因此,技术领导力也有一些特征,为了说清楚这些特征,先让咱们来看一下人类历史上的几回工业革命。

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

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

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

所以,咱们能够看到的技术领导力是:

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

如何拥有技术领导力?

  • 可以发现问题:发现有方案的问题。
  • 可以提供解决问题的思路和方案,并能比较这些方案的优缺点。
  • 可以作出正确的技术决定:用什么技术、什么解决方案、怎样实现来完成一个项目。
  • 可以用更优雅、更简单、更容易的方式来解决问题。
  • 可以提升代码或软件的扩展性、重用性和可维护性。

  • 可以用正确的方式管理团队:1、正确的人作正确的事,发挥每一个人的潜力。2、提高团队的生产力和人效,找到最有价值的需求,用最少的成本实现。3、不断提升自身和团队的标准。
  • 创新能力:可以使用新的方法、新的方式解决问题,追逐新的工具和技术。

做为一个软件工程师,要四个方面让本身拥有技术领导力:

  • 扎实的基础技术
  • 非同通常的学习能力
  • 坚持作正确的事
  • 不断得高对本身的要求标准

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

1、基础技术

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

编程部分

  • C语言:相对于不少其余高级语言来讲,C 语言更接近底层。在具有跨平台能力的前提下,它能够比较容易地被人工翻译成相应的汇编代码。
一、程序是怎么精细控制底层资源的,好比内存管理、文件操做、网络通讯……
二、须要学习汇编语言,写一些如 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 为表明)等知识点。

2、学习能力

提升学习能力。所谓学习能力,就是可以很快地学习新技术,又能在关键技术上深刻的能力。

  • 学习的信息源:常见的信息源有 Google 等搜索引擎,Stack Overflow、Quora 等社区,图书,API 文档,论文和博客等。
  • 与高手交流:经过技术社区以及参加技术会议与高手交流,也能够经过参加开源项目来和高手切磋。

  • 触类旁通的思考:了解了操做系统的缓存和网页缓存之后,你要思考其相同点和不一样点。了解了 C++ 语言的面向对象特性之后,思考 Java 面向对象的相同点和不一样点。遇到故障的时候,触类旁通,把同类问题一次性地处理掉。
  • 不怕困难的态度:多思考,多下功夫,可以不怕困难,并能够找到解决困难的方法和路径,时间一长,你就能拥有别人所不能拥有的能力。
  • 开放的心态:实现一个目的一般有多种办法。带有开放的心态,不拘泥于一个平台、一种语言,每每能带来更多思考,也能获得更好的结果。并且,能在不一样的方法和方案间作比较,比较它们的优缺点,那么你会知道在什么样的场景下用什么样的方案,你就会比通常人可以有更全面和更完整的思路。

3、坚持正确的事

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

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

4、高标准要求本身

  • 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!