左耳听风笔记
摘录&知识关联&内化
程序员如何利用技术变现
- 先有小成功,先做出一点小成就,慢慢转化为自己的优势,不断通过正反馈 push 你变得更好,获得持续性成长和声望。
- 关注有价值的东西,关注技术的本质,了解哪些技术是未来的发展方向,先学习,先攻克。因此就会有市场供需,技术趋势上的差异来提高你的价值。
- 学习技术的时候一定要多问自己两个问题,这个技术解决什么问题,为什么别人做不到,为什么是这么解决的,有没有更好的方式。即 what why how who。
- 有大公司关注的技术更加值得关注。
- 找到能体现价值的地方,大公司多数时候只能让你当螺丝钉,但是却有规范的流程。所以先去大公司,然后再去快速发展的公司,最能体现你的价值。
- 动手能力非常重要,你能全面的 cover 细节,你才能提出更好的,更加靠谱可落地的解决方案。
- 关注付费技术点,一个是帮别人挣钱的技术,一个是帮别人省钱的技术。
- 提升自己的能力和经历,别人对你的信任取决你获得的成就。
- 找到有价值的信息来源,使用谷歌,使用英语搜索。
- 输出观点和价值观,需要一个持续的过程来输出自己的价值观,继而获得影响力,需要有一个复利增长的过程。
- 优质的朋友圈,努力让自己变得更优秀,进而进入更加优秀的朋友圈。
从信息泄露看信息安全
数据泄露攻击
- 利用程序框架或库的已知漏洞
- 暴力破解密码,利用密码字典库或是已经泄露的密码来“撞库”
- 代码注入,如 SQL 注入、XSS 攻击、CSRF 攻击等取得用户的权限。
- 利用程序日志不小心泄露的信息
- 社会工程学
数据管理
- 不能只有一层安全防护
- 弱密码
- 向公网暴露了内部系统
- 对系统及时打安全补丁
- 安全日志被暴露
- 保存了不必要保存的用户数据
- 密码没有被合理地散列
最佳实践
- 理解你的软件产品中使用哪些框架和库,时刻跟踪影响这些产品和版本的最新安全性声明
- 建立一个流程,来快速地部署带有安全补丁的软件产品发布版
- 所有复杂的软件都有漏洞,不要假设其他的依赖都是安全的来建立安全策略
- 建立多个安全层
- 针对公网资源,建立对异常访问模式的监控机制
如何践行最佳实践
- 自动化测试,API 测试,UI测试,集成测试,单元测试
- 人工测试,覆盖主要和重要的路径
虽然有非常多的技术手段,但是也不能保证 100% 防止。
- 技术手段只能说尽量的提高黑客入侵的门槛,当黑客的投入和收益大大不相符时,黑客也就失去了攻击的意义
- 安全的另一方面是风控,通过技术手段控制数据泄露的范围。
技术领导力
何为技术领导力
国内和国外的技术环境差异
- 中国的基础技术还在发展中,所以简单的业务增长方式显得有效
- 国外的技术已经比较成熟,更加关注精细化的技术深度带来的收益
人类社会的发展阶段可以概括为: 野蛮开采, 资源整合,精耕细作,发明创造。
外国的大公司FAANG,最终都会去发展自己的核心技术,提高自己的技术领导力,从早期的业务型公司转变成为技术型公司的原因。
那些本来技术很好的公司,比如雅虎、百度,在发展到一定程度时,将自己定位成了一个广告公司,然后开始变味、走下坡路。
尊重技术的公司和不尊重技术的公司在初期可能还不能显现,而长期来看,差距就很明显了。
技术领导力不仅仅是呈现出来的技术,而是一种可以获得绝对优势的技术能力。
我们可以看到的技术领导力是:
- 尊重技术,追求核心基础技术。
- 追逐自动化的高效率的工具和技术,同时避免无效率的组织架构和管理。
- 解放生产力,追逐人效的提高。
- 开发抽象和高质量的可以重用的技术组件。
- 坚持高于社会主流的技术标准和要求。
如何拥有技术领导力
我认为,这世界的技术有两种,关键技术,工程技术,对于后者,所有的工程师都有机会。
以下这些特质可以体现技术领导力
- 能够发现问题。能够发现现有方案的问题。
- 能够提供解决问题的思路和方案,并能比较这些方案的优缺点。
- 能够做出正确的技术决定。用什么样的技术、什么解决方案、怎样实现来完成一个项目。
- 能够用更优雅,更简单,更容易的方式来解决问题。
- 能够提高代码或软件的扩展性、重用性和可维护性。
- 能够用正确的方式管理团队。所谓正确的方式,一方面是,让正确的人做正确的事,并发挥每个人的潜力;另一方面是,可以提高团队的生产力和人效,找到最有价值的需求,用最少的成本实现之。并且,可以不断地提高自身和团队的标准。
- 能够使用新的方法新的方式解决问题,追逐新的工具和技术。
培养自己的技术领导力
- 扎实的基础技术;
- 非同一般的学习能力;
- 坚持做正确的事;
- 不断提高对自己的要求标准;
技术领导力-下篇
“扎实的技术基础对应,吃透基础技术,基础技术是各种上层技术共同的基础。”
基础技术分为编程和系统
- 编程部分
即 C 语言(底层)、编程范式、算法和数据结构。
- 系统部分
分为计算机系统原理,操作系统原理和基础,网络基础,数据库原理,分布式技术架构
以上的基础知识都不是可以速成的,需要用一生的时间来学习,所以说做好自己的职业生涯规划很关键,做好长期持续学习的准备,并且随着自己的阅历和经验的增加,你会对这些只是有不同的理解和感悟,逐步内化成自己的思想体系。
“提高学习能力,能够很快低”
- 学习的信息源
- 与高手交流
- 举一反三的思考
- 不怕苦难的态度
- 开放的心态
“坚持做正确的事情”
- 提高效率的事
- 自动化的事
- 掌握前沿技术的事
- zhi's
- 技术驱动的事
“高标准要求自己,不断地提高标准,你才可能越走越高”
- 谷歌自我评分卡
- 敏锐的技术嗅觉
- 强化实践
- lead by example 永远在编程,保持对代码细节的敏感
附 Google 评分卡
0 - you are unfamiliar with the subject area.
1 - you can read / understand the most fundamental aspects of the subject area.
2 - ability to implement small changes, understand basic principles and able to figure out additional details with minimal help.
3 - basic proficiency in a subject area without relying on help.
4 - you are comfortable with the subject area and all routine work on it: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.
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.
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
每个程序员都该知道的知识
每个程序员都应该要读的书
- 代码大全
- 程序员修炼知道
- 计算机的构造和解释
- 算法导论
- 设计模式
- 重构
- 人月神话
- 代码整洁之道
- Effective C++
- Unix 编程艺术
每个搞计算机专业的学生应有的知识
首先,对于我们每个人来说,作品集(Portfolio)会比简历(Resume)更有参考意义。所以,在自己的简历中应该放上自己的一些项目经历,或是一些开源软件的贡献,或是你完成的软件的网址等。最好有一个自己的个人网址,上面有一些你做的事、自己的技能、经历,以及你的一些文章和思考会比简历更好。
其次,计算机专业工作者也要学会与人交流的技巧,包括如何写演示文稿,以及面对质疑时如何与人辩论的能力。
最后,他就各个方面展开计算机专业人士所需要的硬技能:工程类数学、Unix 哲学和实践、系统管理、程序设计语言、离散数学、数据结构与算法、计算机体系结构、操作系统、网络、安全、密码学、软件测试、用户体验、可视化、并行计算、软件工程、形式化方法、图形学、机器人、人工智能、机器学习、数据库等等。详读本文可以了解计算机专业知识的全貌。
高效的 Code Review 技巧
LinkedIn’s Tips for Highly Effective Code Review,LinkedIn 的高效代码复查技巧。
https://thenewstack.io/linkedin-code-review/
编程语言和代码质量的研究报告
A Large-Scale Study of Programming Languages and Code Quality in GitHub,编程语言和代码质量的研究报告。
答疑解惑
为什么你能够写出这么多东西
几个阶段
- 学习的阶段
- 利益驱动的阶段
- 记录自己观点打自己脸的阶段
- 与他人交互的阶段
怎样选择自己的人生和职业发展
人生分为两个阶段
- 20 - 30 岁,打基础的阶段
- 30 - 40 岁,人生发展的阶段
其他角度的建议
- 客观的审视自己。找到自己的长处,隔三差五出去面试一把感受下自己的市场定位
- 确定自己想要什么。不受别人的情况所影响你决定的那种渴望,就可以理解为是你真的想要的东西
- 注重长期的可能性,而不是短期的功利。趁着年轻多去做哪些有挑战的事情,能给自己带来更多可能性的事情。开阔眼界最重要
- 尽量关注自己会得到的东西, 而不是自己会失去的东西。
- 不要和大众的思维方式一样。 因为绝大多数人是平庸的,所以如果你的思维方式和大众一样,你的选择就与大众一样(最后成为平庸)
编码能力很重要,但是技术视野、技术洞察力,以及我们如何用技术解决问题的能力更为重要。
如何成为一个大家愿意追随的 leader
boss 和 leader 的差别

如何成为愿意追随的leader
- 帮人解决问题
- 被人依赖
- 有技术领导力
技术领导力之外的素质
- 赢得他人的信任
- 开放的心态 + 倾向性的价值观(对新技术开放的心态 + 在一些事情上有自身的倾向)
- Lead by example 言传身教、终身写代码、用更多的实际经验来 明白一个技术的优缺点、复杂度、best practice
- 保持热情和冲劲(正视错误,从中进行反思和总结得到更好的解决方案)
- 能够抓住重点,看透事物的本质
- 描绘令人激动的方向,提供令人向住的环境
- 甘当铺路石,为他人创造机会
也许,你不必做一个 Leader,但是如果你有想跟随的人,你应该去跟随这样的 Leader!
错误处理的最佳实践
- 统一分类的错误字典
- 同类错误的定义最好是可以扩展的
- 定义错误的严重程度
- 错误日志的输出最好使用错误码,而不是错误信息
- 忽略错误最好有日志
- 对于同一个地方不停的报错,最好不要都打到日志里
- 不要用错误处理逻辑来处理业务逻辑
- 对于同类的错误处理,用一样的模式
- 尽可能在错误发生的地方处理错误
- 向上尽可能地返回原始的错误
- 处理错误时,总是要清理已分配的资源
- 不推荐在循环体内处理错误
- 不要把大量的代码都放在一个 try 语句块内
- 为你的错误定义提供清楚的文档以及每种错误的代码示例
- 对于异步的方式,推荐使用 promise 模式处理错误
- 对于分布式的系统,推荐使用 apm 相关的软件
时间管理
主动管理
- 说明自己不想被打扰、在家办公、找别的地方工作
- 公开自己的工作日程
- 邮件标题聚合和自动化分类邮件
你要主动管理的不是你的时间,而是管理你的同事,管理你的信息。
学会说不
- 面对你做不到的需求时,不要说做不到,而是要先想一想,并且给出另外一个你可以做到的方案,而不是回绝掉对方的方案
- 面对复杂的需求的时候,要反问一下,为什么,目的是,然后给出自己的方案,或者性价比更好的方案,提供部分的满足
- 当时间完全不够的时候,你要把压力还回去,或者让对方与你一同分担这个压力。
我惯用的方式是给回三个选择:
a. 我可以加班加点完成,但是我不保证好的质量,有 bug 你得认,而且事后你要给我 1 个月的时间还债。
b. 我可以加班加点,还能保证质量,但我没办法完成这么多需求,能不能减少一些?
c. 我可以保质保量地完成所有的需求,但是,能不能多给我 2 周时间?
加班和开会
在国内的公司,老板们看到团队在拼命加班,会很高兴。
在国外的公司,老板看到团队在拼命加班,会觉得这个团队一定是哪里出了问题,老板会比较焦虑。
加班和质量的权衡。如果怎么做都要受伤害,那么两害相权取其轻。
开会,不是讨论问题,而是讨论方案,开会不是要有议题,而是要有议案。
如何利用好自己的时间
投资自己的时间
- 花时间学习基础知识,读文档
- 花时间在解放生产力的事情上面,在自动化、可配置、可重用、可扩展上要多花时间
- 花时间在成长的事情上,在整个行业内的成长才算是成长
- 花时间在建立高效的环境上,将自己的工作环境变成最高效的,去影响你的同事配合实现更好的流程和管理方法
规划好自己的时间
- 定义优先级
- 最短作业优先
- 想清楚再做
- 关注长期利益规划
你要学会规划自己的行动计划,不是短期的,而是一个中长期的。我个人建议是按季度来规划,这个季度做什么,达到什么目标,一年往前走四步,而不是只考虑眼下。
用好自己的时间
- 确定自己的目标,专注达到这个目标,而不是分心。多花时间在有产出的事上,少花时间在说服别人的事上。
- 形成习惯
- 形成正反馈
- 反思和举一反三。可以尝试每周末花上点时间思考一下,本周做了哪些事儿?时间安排是否合理?还有哪些可以优化提高的地方?