How to Be a Better Cs Phd

1
2
3
4
`24/10/2024`现在我是大四上学期,已经保研直博啦!时常对未来感到焦虑,经常思考自己做的对不对,知乎/B站一些优秀前辈的回答受益匪浅。这里就记录自己阅读的感受以及一些规划!想了想,不可能面面俱到,就采用QA的形式啦!常看常新,会保持更新的!
`24/10/28`更新了如何提高代码能力的思考
`24/10/29`更新了leetcode刷题的思考
`25/3/6`整合了一些学习的文章

QA

一篇论文的阅读时间?做笔记如何做?

亚鹏学长:一周3-4篇,精读,笔记可以用PDF标记,4-5小时读完,找师兄讨论不懂的问题

有必要看课程学习一些知识吗?如果要,推荐哪些

亚鹏学长:按需

除了Google搜索其他找论文的方法?

亚鹏学长:精读论文中提到的感兴趣的论文;

  • Scholar - and or检索
  • acm digital library

读博士期间如何提高代码能力?

  1. 避免写代码时复制粘贴:这点我觉得说的很对,复制粘贴的一会就忘了,就算认真看了逻辑,也大概只有一个浅显印象,就算知道要怎么做,下次类似的事情还是得gpt搜代码。所以就算是生成的代码,也应该自己上手敲进去。

  2. 先规划后动手:写代码最重要的不是手速,而是清晰的思路。当你能习惯性地用编程的思想分析一个工程问题,你写代码的能力自然会很高。这种能力当然是能训练的,写代码之前就要把完整的思路写下来,可以做得细致一点,分几个流程/每个流程怎么实现/什么数据结构/设计模式(类的依赖关系等),这样做之后,可以提高你实现的速度和质量,而且有些问题可以在设计的阶段就避免掉。我觉得说的很对!

  3. 学会总结经验:记录代码中遇到的各种问题,怎么解决的,这样下次遇到同样或类似问题就可以迅速解决。同样的问题要尽量避免犯两次。这一点我现在已经在做了。可以补充的是,对于优秀的别人的代码,,也可以参考第二点,总结出别人的设计思路代码结构组织

  4. 在编写代码的过程中,可以不断思考自己的代码实现细节有没有可以优化的地方/有没有更适用的方法/类似的思想在其他的领域有哪些应用(google or ai search)

计算机专业想好好搞科研,建议平时刷leetcode吗,会不会浪费时间?

总结:有益处,可以刷,但刷太多浪费时间

好处:

  • 至少不会让大厂因为你不会算法题刷掉你
  • 对冲掉博士期间研究不顺利带来的挫败感。这种挫败可能是反复的持续很久的。在此期间刷题至少会有日益精进的小成就感,不至于全盘否定自己能力。而且也开阔自己研究思路。
  • 训练短时间完成编码(编程思维敏捷性),编程trick,熟练度,可以有助于科研idea的实现。

权衡:

  • 不要把刷题当做你最强的能力:去企业要看你心目中的企业要什么岗位的人,以及你希望去企业里做什么事情。个人觉得,如果读完博士还是跟本科生一样要刷题背八股才能进入企业,那这个博士是白读了
  • 应该意识到的是计算机科学不是编程的科学,编程很重要,但是仅仅只是能力的一小部分体现。
  • 刷太多:比不过acmer,都读到博士了,已经错过了搞算法的最佳年龄。有这时间,不如多做做科研。

如何刷:

  • 语言一致
  • 不要对于很难的算法花很多时间
  • 刷题计时,可以周赛

科研论文如何想到不错的 idea?

看arxiv呀,把自己的的subdomain的都看一下,如果比较小就把临近的也看下,保证平均下来每天看20篇标题,10篇摘要,3篇略读,0.5篇精读。看个半年到1年就开始有很多想法了。

这个说的挺好的,但是实现起来感觉还是有难度。

对PhD一年级新生有什么建议?

  1. 多读
  • 多读最新论文,多记几个学术名词,读多了,发现了故事之间的关系,就学会提新idea了。
  • 多读经典论文、读经典教材〔如机器学习中的MLAPP),读综述、tutorial,建立自己的学科认知体系,打牢基础。对学科的认知条分缕析,后面学多了就不会越学越迷糊。
  1. 多写
  • 多写论文笔记。读过的论文都要记,略读的记一旬话,精读的写一篇笔记。要让读过的论文充地转化为自己的财富。我觉得这里说的很好,重要的paper就写一篇较长的阅读体会,精度过的就写一段简单的总结,这样记得会更牢,同时理解也更深入
  • 多写论文。抓住每一个写、修改论文的机会。
  • 多写科研笔记。一些拍脑袋的想法,和导师的讨论记录,和同学的聊天感悟。事后再看经会有新发现。这个我倒是还没考虑过,挺好的,每隔一段时间可以头脑风暴一次,将最近阅读的论文,与接触过的想法得到一些idea
  • 多写实验日志。实验怎么想的,代码都参考过啥,整理设置对应的实验结果。甚至每天实验的阶段结论也都记一下。有很多阶段性结论之后,写论文时取舍就很方便了。这个挺好的,除了和他人讨论的实验结果等,也可以记录自己的思路等与他人讨论
  1. 多做
  • 多做报告。学习如何沟通、介绍自己的想法,同时收获他人的建议。学习如何合理提出建议。这个最近有在和君逸师兄讨论的时候做过
  • 多做社交。参加各种学术交流,认识更多的人,拓展人脉,交流。为之后学术发展路。

How To Read Paper

李沐分享如何读文论心得

key:三遍读论文

  • 第一遍

读标题&摘要,跳到结论,关注图和表—>判断是否适合自己

  • 第二遍

从头到尾,不需要太关注细节,对图和表了解 可以关注提出的以前的论文

  • 第三遍

知道每一段话在干什么,脑补过程,想想自己会怎么做

How to Read Source Code

  1. learn from earlier unoptimized verion

一个技巧(learned from reading the source code of lamma.cpp):阅读高度优化的代码以掌握底层概念是一种相当不理想的学习方法。建议通过在GitHub的karpathy/llama2.c/run.c的master分支中进行调试来代替。它是故意完全未优化的(即使是矩阵乘法也是最基本的“原始”实现。

同理,对于一个复杂的代码,我们可以找有没有人写出它的一个简要版本代码,或是从该库的早期版本学习。

  1. using the working exp and debugger to step into

In general, the starting point would be to get a working example and then use a debugger to step through the code.

This is absolutely what I would recommend. We don’t have to try and understand libraries from their source code alone, we can use the running state, set breakpoints, and explore explore explore. I highly recommend using a debugger to see how llama.cpp or any open source code works!深深赞同,阅读llama.cpp有感

  1. start from other’s tutorials

对于复杂的项目以及自己不熟悉的领域,可以通过他人的优秀的解析blog以及video,来快速在high level掌控整个项目,以及该项目最重要的概念/函数/类。

参考

CC BY-NC-SA 4.0
Built with Hugo