首先,我希望所有程序员都要记住一点,最好的技能库,是我们大脑,不要沦为工具党。说实话,写代码是一种内化的技能,主要的知识脉络,不内化在脑子里,甚至形成肌肉记忆,那就等于没有学会。学以致用,才是掌握技能的方法。Github上密密麻麻的提交记录,可能能比你在笔记本上写下来的更有价值。
当然,并不是提交到github才算写了代码,有的公司还用svn呢。只是github的图好看而已,我愿意称之为「最美马赛克」。
不过我们必须承认的是,有一些知识点,我们当下可能用不了,但我们会感觉未来有机会用上,所以我们需要记录下来,并且定期整理,偶尔翻翻,能从中得到新发现。
代码
程序员首要收集的,就是代码,毕竟talk is cheap, show me the code
有的人可能不同意了,毕竟写代码是要看应用场景的,换个地方业务不一样,可能做法就不一样了,收集代码有啥意义?其实只要你在一个领域深耕,会发现,很多业务是有共性的。积累代码并不是让你把所有代码都存下来,而是让你根据业务提取共性,然后积累一套框架代码,以便你日后遇到类似问题时可以快速搭建解决框架。况且你如果把公司的代码拷贝到你的硬盘,有违反法律风险,我是非常不推荐从公司拷贝代码回家的。我可以讲讲我是怎么「积累代码」的。
我之前做游戏时,我会积累一套属于我的框架代码,这套框架代码和公司代码不一样,是在工作之外写的。我根据在公司工作的经验,提取出一些业务的共性,写了一套框架代码,适用于更广的应用范围(况且公司的代码有时候不敢直接用,技术债务太多)。例如做游戏的都经常要写资源管理,网络管理等等相似但重复的代码,虽然游戏引擎也会提供api,但毕竟引擎提供的算是较底层的封装,而在游戏开发中,我发现还可以把封装等级再提高些。于是我在工作之外写了一套游戏资源管理、网络连接管理的框架。一年多后跳槽去了另一个公司当主程,接手了一个开发了两个月但bug频出的项目,这个项目的问题包括:资源管理不当导致资源该销毁时没销毁;或者资源虽然看似销毁了但内存占用没降下来等等。这时候这套框架在就发挥了极大的作用,把分散在业务里的零零散散的资源加载统一换成我自己写的这套框架代码,并根据业务做了少量修改,仅用了两周,之前那些困扰大家的问题就没再出现了。
除此之外,你也可以通过在github上积累代码。例如提交代码来积累自己的代码,或者star别人的项目,下次遇到问题时方便找到相对应的解决方案。
解决问题过程
除了解决一些共性问题的代码要积累,我也会积累自己解决问题的思路。
我现在在我笔记软件里还存着很多当年遇到问题时的解决经验。甚至我2013年春季实习期间的解决问题记录都还在我的笔记软件里。
工作记录
最好的记录是周记,毕竟日记太繁琐,月记会忘记细节。工作周记主要记录你周一计划完成什么,到周五了完成了什么,遇到了什么困难,解决思路等等。
别以为这种记录很冗余,可能日后不会看。没错,90%都不会看,但如果你在某个公司呆了很久了,准备跳槽了,你肯定要面试吧?你面试时得说说你在上一家做了什么吧?如果你想总结你做出什么贡献,这时候回顾周记就很重要了。下图为我在2016年做游戏主程时的工作记录方式。
就算你是学生,还没参与工作,你也可以写写周记,把学业当成事业一样看待,养成这个好习惯,会让你日后在职场进步比别人更快。
cheatsheet
所谓cheatsheet,也就是「小抄」,是关于某个技术的简单总结。例如python的cheatsheet可以参考这个
又例如linux命令行,也许你平时不怎么用linux,偶尔用到时,网上就有linux command cheatsheet。不过我一般直接google一下更方便。gto76/python-cheatsheet例如linux命令行,也许你平时不怎么用linux,偶尔用到时,网上就有linux command cheatsheet。不过我一般直接google一下更方便。
对于新手来说,可能暂时未掌握问题搜索技巧,可能cheatsheet还能方便他们复习一下,但对于老手来说,其实cheatsheet也不必须要保存,搜一下更快。
面试题
毕竟题目是有限的。你面试多了,会发现很多公司出的题目挺类似,甚至一模一样。如果你每次面试能即使把题目记下来,回去后再做一遍,那么你下次面试时,心里会更有底气。
GitHub
代码的话,你如果是不便公开的代码,那就在github上开个private repo。如果你愿意开源,那就public repo吧。
个人笔记
个人的话,我觉得用印象笔记,有道云笔记都是很不错的笔记软件。我平时看到有啥有趣的观点,文章什么链接都剪到印象笔记来,因为公众号的文章可以直接保存到印象笔记。
不过最近一年用印象笔记的频率变低了,主要是我一个以情怀入坑的印象笔记老用户再也受不了软件里广告弹窗的骚扰(而且我本来就是付费用户),然后尝试了Notion。
Notion
Notion要比印象笔记强大不少,当然也入门门槛高些。但我很快就适应了。不过我用notion主要是做日志,我还是偶尔用回印象笔记,毕竟notion结构性毕竟强一点,我有时候有灵感,打开印象笔记什么标题都没起就写上几句,而在notion还得想归类到哪里。
如果你对我用notion做日志的做法感兴趣,可以看看我之前写的一个回答
但毕竟链接的内容和程序员积累知识库关系不大,这里就不展开讲了。
虽然我个人用notion感觉有点负担,但我还是比较推荐团队用notion的,notion的协作功能可以让团队间共享知识,你甚至可以拿notion做项目管理。
wiki页面
适合团队共享,当然自己用也行,不过就是「重」了点。推荐的工具有atlassian confluence,github wiki等,如果你想搭建自己的wiki,可以用MediaWiki,DokuWiki,minDoc,Gitbook,Docsify,Hexo,MkDocs。
不过我个人认为,wiki比较适合用来写文档,notion也是,不太适合用来收集资料。零零散散的知识点记录,从网页上复制一段话保存下来,还是用印象笔记方便。
Roam Research
Roam Research功能非常强大, 但入门也不容易。RoamResearch具有双向链接功能,将你零散的笔记,串成一个知识网络。Roam Research 侧重的是知识的生产与利用,而不是信息的搜集与保存。
很多人推荐Roam Research,但15美元一个月把我劝退了。
注:以上讲了不少工具,但请注意,不要全都用,不然会沦为工具党。你可以试用一下,然后选择最适合自己的一款工具,最多两款。再多的话,就给大脑增加负担了,生产力工具反而会影响你生产力了。
有时候你收集多了,会发现,某些笔记竟然有某种神奇的关系。我之所以没有完全放弃印象笔记(尽管它广告特别烦人),是因为我充了会员,有上下文推荐功能。例如我某个笔记讲到某个知识点,会推荐有我收集内容里有相同知识点的笔记。
如果你笔记软件记录太久,你会发现你的笔记实在太多,这时候你就需要把一些内容整理下,包括:
至于多久整理一次笔记呢?其实没标准答案,如果你最近疯狂研究某个课题,例如你每天固定时间学习吴恩达的机器学习课程,你可以每周整理一次;如果你就是写周记时用用,半年整理一次都可以。我自己的做法是,当笔记数超过600,整理一次大的,把笔记数降到500。所以我的笔记总数一般维持在500多。当然,这个数字可以根据个人情况调整。我用了十年,很难再压缩笔记数量了。如果你只用了一年,那么你可以把数量限制在100。
整理完,还要把最近修改过的笔记回顾一遍,加深记忆。
输出包括写代码和写技术博客。两者都是输出方式,当然写代码是最重要的输出形式,但写博客,可以培养自己的表达能力,毕竟程序员的工作要产生价值,清晰的表达也是必不可少的的;
同时在写文章的过程中,你会发现,你以为你懂的东西,其实你未知其全貌,你会在写文章的过程中,去研究那些你缺少了解的部分。
很多人害怕分享,是担心自己理解有错,被人怼。但说出来,是快速发现自己理解是否有偏差的最好途径。
而我在知乎写作的过程,就是我把某些知识点串成链然后内化的过程。我觉得我写的好的文章和回答,就收录到自己的专栏里。
但毕竟我知乎有时候并不完全答技术相关的题目。于是我专门开个专栏来收录我的技术相关回答,从我输出的五百多篇内容里,收录了百来篇我自己比较满意的内容。
当然,我并不认为一定要在知乎写东西才算有「输出」,你也可以在自己的独立博客或者其他博客网站写文章。我其实以前开过独立博客,但输出了十几篇后就坚持不下去了,一方面是阅读量少,没有什么人夸我写得好或者指出我的错误;另一方面,是维护网站需要时间精力金钱。在知乎,我不仅能收到及时的反馈,也能看到我回答的相关统计,还能被别人follow,这种反馈机制让我持续有动力输出。(小管家,广告费打来!)
啰啰嗦嗦讲了这么久,竟然已经4000字了,最后再说一句吧。
所谓「建立知识/技能库」,就是「输入->整理->输出->内化」的过程。我前面列举的,仅仅是我个人的实践方法,并非标准,大家可以参考,但无需生搬硬套。希望大家能摸索出适合自己的方式,