【技术思路】极客时间-左耳听风-开篇词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的手法。
  • GitHub
在 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

猜你喜欢

转载自www.cnblogs.com/17bdw/p/10183216.html
今日推荐