学习能力 学习力强的程序员敢大胆地体验尝试新技术,他们的技术栈始终在保持不断地更新。他们能快速把握事物的本质,并判断出它能用来做什么,不能用来做什么。他们拥抱技术升级和革命,因为他们学习并掌握新技术的速度比其他人更快,所以他们永远不用担心失业。 而学习力差的程序员呢?为了继续停留在旧技术的舒适区,他们往往会抵制新技术的推广,甚至百般阻挠。因为那会使他们过去的经验统统无效,只能和后来者站在同一起跑线上。抱死一个框架好几年,脱离了框架啥都干不了的程序员实在太多了。事实上,这样的人不能驾驭技术,反而是被技术给奴役了。 学习技术最有效的方式是阅读、实践和交流。公司没给你安排这方面的工作,那你自己都做了些什么呢?八小时之外的时间都用在哪了?有没有读源码?有没有看原版书?有没有泡技术社区?有没有尝试最新流行的技术?有没有尝试把它们用在公司的项目上?有没有主动去接触行业里使用这些技术的团队和大牛? 「看文档」其实是最快的学习方法。对于自己工作中常用到的技术,抽时间把官方文档通读一遍(其实篇幅都不大),绝对收获满满。没事的时候多翻翻自己使用的框架/系统/平台的API,看看有哪些自己不知道或者没用过的功能,想想这个功能可以用来做什么,能不能解决现存的问题,或者优化当下的解决方案。 「读源码」是深入学习开源技术的唯一途径。只有理解了某个功能在底层是如何实现的,你才能真正把握它更适合用来做什么,不能用来做什么。正如不明显汽车的构造和原理,我们也能把车开好。而如果多少知道一点,开起来就会更得心应手。当车出现问题时,也不至于完全束手无策,只能蹲在路边等待救援。 学习力的源泉就是好奇心,也就是对新知识的渴求,以及对探索未知的冲动。学不到技术最核心的原因只有一个:动机不足。
学编程最重要的是实践,就是写代码、看别人写的代码、再写代码,你看再多的书,不写代码,你还是不会编程。但是写代码也要讲究方法循序渐进,不能刚学了几天语法,就想写个操作系统什么的,树立这种不切实际的目标只会让你的自信受到严重打击迷失自我。 为了数据科学类问题研究新领域的发展尽量亲自动手去完成事情。你将会有一种直觉,知道如何去处理该事物。积累案例,从数据表中标注着你已获得的数据开始。这不仅适用于数据科学,也适用于解决任何数值问题。用一个电子表格(或一个R/Python Notebook)来实现算法并获得一些结果,在过去帮助我真正理解了问题,避免走死胡同。例如,在建立一个外汇定价系统时,我能够使用电子表格来描述定价算法是如何工作的,并向交易者解释它。在执行和部署算法之前,我们可以调整计算并确保一切都清楚。 在找到通用办法之前,先找到一种能解决当前问题的办法。让算法本身输出调试信息。你应该能够转储每一步的中间结果,并用文本编辑器或是 Web 浏览器手动检查它们。不要为单元测试操心,定义出正确行为才是首要的。
维护大的、不熟悉的代码库程序检查文件的大小。最大的文件总是包含了程序的实体部分,至少是指向程序实体内容的分派程序。 main.cc 通常很小,并且对寻找代码结构毫无用处。从主循环调度开始单步调试程序。可以学到很多关于控制流的东西。寻找数据结构,特别是做为参数传递到许多函数中的那些。大多数程序具有一个小的关键数据结构集合,找到它们,理解代码的其余部分会变得容易的多。写单元测试。这是确认你所理解的代码与真实代码工作方式无误的最好方法。 性能工作1.在开始所有工作之前,甚至是在剖析(profile)之前,建立一套代表典型现实世界的使用基准。别让性能倒退,除非你确信已经登峰造极,高处不胜寒,并且更好的解决方法还藏在世界的某个角落里无人发现(如果出现了那种情况,在版本控制系统(VCS)中标记你的分支,以便在发现错误之后回来更改。)。 2.许多性能瓶颈都出现在系统的交叉处。在所有 RPC 框架中搜集时间统计数据,并且有一些方式来传播和可视化每个服务器的请求时间,以及哪些部分的请求是并行的,哪里是关键路径。 3.剖析(Profile)。 4.通常,避免不必要的工作可使你赢在起跑线上。缓存最大的计算结果,粗略评估不常用的东西。 5.不要忽视常量因素。有时候一个渐进性更差的算法在实践中执行的很好,原因是其具有更好的缓存局部性。为此,你可以在多次调用的函数中识别出威胁。 6.当你获得了程序大致剖析之后,更改数据结构往往会获得更多收益。注意内存的使用,时常缩小内存需求来减小缓存压力,可显著地提高系统的速度。注意局部性,将常用数据放到一起。如果你的编程语言允许(为 Java 感到遗憾 ),可以消除指针雕镂(pointer-chasing)来支持值控制。
总结技术世界就如同一片汪洋大海,细分领域真是多如牛毛。我们只是站在其中一个小岛上,怎么确定自己该朝哪个方向进发呢?学习是一辈子的事,作为程序员你不去挖掘更先进的技术那么你早晚会被这个行业淘汰掉。
|