技术基础
02 程序员如何用技术变现(下)
在学习技术的过程一定要多问自己两个问题:“一,这个技术解决什么问题?为什么别的同类技术做不到?二,为什么是这样解决的?有没有更好的方式?”
1、从一个一个小成功做起
2、关注有价值的东西
关注市场需求
关注技术趋势
3、找到能体现价值的地方
4、动手能力很重要
多动手,敲代码,写文档
5、关注技术付费点
帮人挣钱或者帮人省钱
6、提升自己的能力和经历
7、找到有价值的信息源
8、输出观点和价值观
表达自己的想法
9、优质朋友圈
会挣钱的人一定是会投资的人。我一直认为,最宝贵的财富并不是钱,而是你的时间,时间比钱更宝贵,因为钱你不用还在那里,而时间你不用就浪费掉了。你把你的时间投资在哪些地方,就意味着你未来会走什么样的路。所以,利用好你的时间,投到一些有意义的地方吧。
04 从Equifax信息泄露看数据安全
密码散列:公认安全的算法(如SHA-2 256) + 安全随机数
MD5能够人为找到碰撞,安全性不如SHA-2 256
05 何为技术领导力
技术领导力
- 尊重技术,追求核心基础技术
- 追逐自动化的高效率的工具和技术,同时避免无效率的组织架构和管理
- 解放生产力,追逐人效的提高
- 开发抽象和高质量的可以重用的技术组件
- 坚持高于社会主流的技术标准的要求
作为一个软件工程师,怎么才算拥有“技术领导力”呢?
- 能够发现问题。能够发现现有方案的问题。
- 能够提供解决问题的思路和方案,并能够比较这些方案的优缺点。
- 能够做出正确的技术决定。用什么样的技术、什么解决方案、怎样实现来完成一个项目。
- 能够用更优雅、更简单、更容易的方式来解决问题。
- 能够提高代码或软件的扩展性、重用性和可维护性。
- 能够用正确的方式管理团队。所谓正确的方式,一方面是,让正确的人做正确的事,并发挥每个人的潜力;另一方面是,可以提高团队的生产力和人效,找到最有价值的需求,用最少的成本实现之。并且,可以不断地提高自身和团队的标准。
- 创新能力。能够使用新的方法新的方式解决问题,追逐新的工具和技术。
如何拥有技术领导力?
- 扎实的基础技术
- 非同一般的学习能力
- 坚持做正确的事
- 不断提高对自己的要求标准
07 推荐阅读:每个程序员都应该知道的知识
推荐的书
- 《代码大全》 虽然这本书有点过时了,而且厚到可以垫显示器,但是这绝对是一本经典的书。
- 《程序员修练之道》 这本书也是相当经典,我觉得就是你的指路明灯。
- 《计算机的构造和解释》 经典中的经典,必读。
- 《算法导论》 美国的本科生教材,这本书应该也是中国计算机学生的教材。
- 《设计模式》 这本书是面向对象设计的经典书籍。
- 《重构》 代码坏味道和相应代码的最佳实践。
- 《人月神话》 这本书可能也有点过时了,但还是经典书。
- 《代码整洁之道》 细节之处的效率,完美和简单。
- 《Effective C++》/《More Effective C++》 C++ 中两本经典得不能再经典的书。也许你觉得 C++ 复杂,但这两本书中带来对代码稳定性的探索方式让人受益,因为这种思维方式同样可以用在其它地方。以至于各种模仿者,比如《Effective Java》也是一本经典书。
- 《Unix 编程艺术》《Unix 高级环境编程》也是相关的经典。
每个搞计算机专业的学生应有的知识
《What every computer science major should know》,每个搞计算机专业的学生应有的知识。中文版:每个计算机专业学生应有的知识(翻译自:What every computer science major should know?) - 刮杂笔记
Linkedln高效的代码复查技巧
《LinkedIn’s Tips for Highly Effective Code Review》,LinkedIn 的高效代码复查技巧
《从Code Review谈如何做技术》左大哥自己写的
08 Go语言,Docker和新技术
如何看一个新技术能不能发展起来
- 有没有一个比较好的社区
- 有没有一个工业化的标准
- 有没有一个或多个杀手级应用
- 学习难度是否低,上手是否快
- 有没有一个不错的提高开发效率的开发框架
- 有没有一个或多个巨型的技术公司作为后盾
- 有没有解决软件开发中的痛点
10 如何成为一个大家愿意追随的Leader?
Leader和Boss的不同
如何成为众人愿意追随的Leader
- 具备技术领导力
- 赢得他人的信任
对于信任来说,并不完全是别人相信你能做到某个事,还有别人愿意向你打开心扉,和你说他心里面最柔软的东西。而后者才是真正的信任
- 开放的心态+倾向性的价值观
- Lead by Example
要做一个有人愿意跟随的技术 Leader,你需要终身写代码,也就是所谓的 ABC – Always Be Coding。这样,你会得到更多的实际经验,能够非常明白一个技术方案的优缺点,实现复杂度,知道什么是 Best Practice,你的方案才会更具执行力和实践性。当有了执行力,你就会获得更多的成就,而这些成就反过来会让更多的人来跟随你。
- 保持热情和冲劲
真正的热情和冲劲是,正视问题,正视不足,正视错误,从中进行反思和总结得到更好的解决方案,不怕困难,迎难而上
- 能够抓住重点,看透事物的本质
- 描绘令人激动的方向,提供令人向往的环境
- 甘当铺路石,为他人创造机会
11 程序中的错误处理:错误返回码和异常捕捉
资源清理
程序出错时需要对已分配的一些资源做清理
- go语言中的defer关键字可用做此处理
func Close(c io.Closer) {err := c.Close()if err != nil {log.Fatal(err)}
}func main() {r, err := Open("a")if err != nil {log.Fatalf("error opening 'a'\n")}defer Close(r) // 使用defer关键字在函数退出时关闭文件。r, err = Open("b")if err != nil {log.Fatalf("error opening 'b'\n")}defer Close(r) // 使用defer关键字在函数退出时关闭文件。
}
- C++ 的RALL机制
//首先,先声明一个RAII类,注意其中的构造函数和析构函数
class LockGuard {
public:LockGuard(std::mutex &m):_m(m) { m.lock(); }~LockGuard() { m. unlock(); }
private:std::mutex& _m;
}//然后,我们来看一下,怎样使用的
void good()
{LockGuard lg(m); // RAII类:构造时,互斥量请求加锁f(); // 若f()抛异常,则释放互斥if(!everything_ok()) return; // 提早返回,LockGuard析构时,互斥量被释放
} // 若good()正常返回,则释放互斥
异常捕捉处理
try - catch - finally编程模式
try {... // 正常的业务代码
} catch (Exception1 e) {... // 处理异常 Exception1 的代码
} catch (Exception2 e) {... // 处理异常 Exception2 的代码
} finally {... // 资源清理的代码
}
12 程序中的错误处理:异步编程以及我的最佳实践
异步编程时,因为被调用的函数被放到了另外一个线程里运行,将导致:无法使用返回码、无法使用抛异常的方式,所以异步编程中常用callback方式来处理错误。
JavaScript异步编程的错误处理
1)Promise模式
doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doThirdThing(newResult))
.then(finalResult => {console.log(`Got the final result: ${finalResult}`);
}).catch(failureCallback);
上面代码中的 then() 和 catch() 方法就是 Promise 对象的方法,then()方法可以把各个异步的函数给串联起来,而catch() 方法则是出错的处理。
2)使用async/await这两个关键字来取代 Promise 对象
async function foo() {try {let result = await doSomething();let newResult = await doSomethingElse(result);let finalResult = await doThirdThing(newResult);console.log(`Got the final result: ${finalResult}`);} catch(error) {failureCallback(error);}
}
如果在函数定义之前使用了 async 关键字,就可以在函数内使用 await。 当在 await 某个 Promise 时,函数暂停执行,直至该 Promise 产生结果,并且暂停不会阻塞主线程。 如果 Promise resolve,则会返回值。 如果 Promise reject,则会抛出拒绝的值。
Java 异步编程的 Promise 模式
在Java中,在JDK1.8中引入了类似JS的玩法 - CompletableFuture,这个类提供了大量的异步编程中Promise的各种方式。
CompletableFuture.supplyAsync(Integer::parseInt) //输入: "ILLEGAL".thenApply(r -> r * 2 * Math.PI).thenApply(s -> "apply>> " + s).thenAccept(this::notify).exceptionally(ex -> "Error: " + ex.getMessage());
supplyAsync()表示执行一个异步方法,而thenApply()表示执行成功后再串联另外一个异步方法,thenAccept()可以处理最终结果,exceptionally()可以捕捉异常。
CompletableFuture.supplyAsync(Integer::parseInt) // 输入: "ILLEGAL".thenApply(r -> r * 2 * Math.PI).thenApply(s -> "apply>> " + s).handle((result, ex) -> {if (result != null) {return result;} else {return "Error handling: " + ex.getMessage();}});
handle()方法可以用来处理最终的结果,其中包含了异步函数中的错误处理。
Go语言的Promise
Github上搜Go语言的Promise的相关代码库
错误处理的最佳实践
- 统一分类的错误字典
- 同类错误的定义最好是可以拓展的
- 定义错误的严重程度(fatal、error、waring、info、debug)
- 错误日志的输出最好使用错误码,而不是错误信息
- 忽略错误的时候也要有日志
- 对于同一个地方不停地报错,可以打印错误信息+次数
- 不要用错误处理逻辑来处理业务逻辑(异常捕捉代码就用来处理异常)
- 对于同类的错误处理,用一样的模式
- 尽可能在错误发生的地方处理错误
- 向上尽可能地返回原始的错误
- 处理错误时,总是要清理已分配的资源(使用 RAII 技术,或是try-catch-finally,或是 Go 的 defer 都可以容易地做到)
- 不推荐在循环体里处理错误(最好把循环体放在try语句块内)
- 不要把大量的代码都放在一个try语句块内
- 为你的错误定义提供清楚的文档以及每种错误的代码示例
- 对于异步的方式,推荐使用 Promise 模式处理错误
- 对于分布式的系统,推荐使用 APM 相关的软件。尤其是使用 Zipkin 这样的服务调用跟踪的分析来关联错误
15 时间管理:同扭曲时间的事儿抗争
面对做不到或时间不够的需求时,给回三个选择:
1)可以加班完成,但是不保证质量,有BUG得认;
2)可以加班完成,还能保证质量,但是没办法完成这么多需求,是否可以减少些需求?
3)可以保质保量地完成所有需求,但需要多2周时间
16 时间管理:如何利用好自己的时间?
投资自己的时间
1)花时间学习基础知识,花时间读文档。学好基础知识。
2)花时间在解放自己生产力的事上。
在自动化、可配置、可重用、可扩展上要多花时间。对于软件开发来说,能自动化的事,就算多花点时间也要自动化,因为下次就不用花时间了。让自己的软件模块可以更灵活地配置和扩展。
3)花时间在让自己成长的事上。
能让自己有更大的视野,能让自己有更多可能性的事情上
4)花时间在建立高效的环境上。
规划自己的时间
- 定好优先级
- 最短作业优先
- 想清楚再做
- 关注长期利益规划
用好自己的时间
- 做事要专注
- 形成习惯
- 形成正反馈
- 反思和举一反三
17 故障处理最佳实践:应对故障
发生故障时,通常会有以下几种手段来恢复系统:
回滚、重启和限流、降级、紧急更新
出故障时最重要的不是debug故障,而是尽可能地减少故障的影响范围,并尽可能快地修复问题。
应对故障的准备工作
1) 建立以用户功能为索引的服务和资源的全视图。用一个系统来记录前端用户操作界面和后端服务,以及服务使用到的硬件资源之间的关联关系。以用户端的功能来做索引,然后,把后端服务、服务的调用关系,以及服务使用到资源都关联起来做成一个视图。
2)为地图中的各个服务指定关键指标,以及一套运维流程和工具,包括应急方案。以用户的功能为索引,为每个用户服务都指定一个故障的检测、处理和恢复手册,以及相关的检测、查错或是恢复的运维工具。
3)设定故障的等级。还要设定不同故障等级的处理方式。
4)故障演练。
5) 使用灰度发布系统。灰度发布可减少线上故障影响的范围。
自动地图生成
耗子哥推荐,自动地图生成一般用APM式的系统。开源的可以看看zipkin。APM对于微服务架构生成的图元素会比较复杂。
另外,开源skywalking 国人做的Apache的顶级项目,特点无侵入 还有pinpont ,韩国人开发的。
高效学习
96 高效学习:端正学习态度
学习3个步骤
- 知识采集
- 知识缝合
- 技能转换
学习的观点
- 学习不仅仅是为了找到答案,而更是为了找到方法
- 学习不仅仅是为了知道,而更是为了思考和理解
所有的技术都是为了解决某个问题而出现,因此在学习技术的时候,需要思考几个问题: 1. 问题的背景是什么?这个技术是为了解决什么问题而出现的 2. 这个技术是如何解决问题的?还有什么其他技术可以解决这个问题?为什么这里用这个技术?
- 学习不仅仅是为了开拓眼界,而更是为了找到自己的未知,为了了解自己
- 学习不仅仅是为了成长,而更是为了改变自己,改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法