静默的海

@yuxiao

  • system Post #1

    主要分享学习资料,以及转载 https://github.com/cantjie/XJTU-Share 到本站(剔除了有版权问题的文件,如教材和课件 pdf),欢迎在此类别分享添加新内容,以及修改订正现有内容

    暂定小文件资料以 PDF 内嵌在网页(打开网页时自动加载,可能比较消耗流量),大文件附件链接到 GitHub / 本站文件上传区。目前正在考虑以什么样的形式呈现能实现最好的用户体验。 欢迎对呈现方式提出新建议。

    请务必遵守 社区守则 和各类法律法规,尤其是版权方面。

    初心:考虑到学校里面会用 git 的人不多,国内到 Github 的网络经常抽风,搬到这个网站来,内容可以在线编辑,普通用户可以通过回复便捷地添加内容,即使后面想要把内容整理到其他平台,可以调用 API 或者 PG 数据库导出。

    不知道为什么学校不自信,不敢把课件啥的传到 Internet 上。很久之前有个内网的http://cc.xjtu.edu.cn ,后来被需要登录的 Blackboard Learn https://bb.xjtu.edu.cn 取代了。相比之下,国外大学就很自信:

    网站界面简洁但功能丰富,代码托管在 GitHub,有些教学视频还公开在 YouTube 上。

  • m0rsun m0rsun Post #1

    计算机组成与设计 10r
    算法设计与分析 10r
    复杂网络动力学基础 (内部讲义) 0
    c++ primer plus 英文版上下 30r
    军事理论教程 0
    编译原理 (第三版) 15r
    自动机理论、语言和计算导论 10r
    大学物理实验 (第二版) 10r
    数据结构与算法 10r
    电路 学习指导与习题分析 5r
    大学物理上下 20r 送大学物理学习指导
    毛概 2021 0
    近代史 2021 0
    思修 2021 0
    四级词汇 5r
    六级词汇 5r
    (四六级捆绑收送收音机)

    计算机图形学基础教程 10r
    鸟哥 Linux 私房菜 15r
    概率统计与随机过程 0
    概率论基础教程 0
    离散数学及其应用 0(不是教材!)
    数字信号处理简明教程 10r

    0 元专业书籍需证明将来 (或当前) 有相应课程

    四六级收音机单卖 5r

  • upload_bot Post #1

    如何成为一个计算机知识体系完整的毕业生

    作者:冯昱尧 (知乎)

    转自:回答链接


    一般来说我喜欢把计算机或者直白一点讲“写代码”的知识分为三大类别:基础知识、领域知识和碎片知识。

    基础知识指的是你要吃写代码这碗饭必须掌握的通识性质的内容。即数学 + 计算机五大件。

    领域知识指的是你要精研某个方向时所要掌握的知识。写代码不同的方向之间差别还是很大的,很难多方面兼顾。

    碎片知识指的是一些实践中经常用的技巧或者一些不成体系,但又很有用的“常识”。这些知识虽然很琐碎,但是对于项目实践来说是必不可少的。

    1. 基础知识

    数学

    先说数学,我知道很多有经验的前辈都会告诉你数学其实没有什么用处,基本上平时做业务之类的根本用不上。这话没有问题,毕竟你做做 GUI 什么的是不需要微积分的。而且工作中大量的内容也是业务相关的,但是作为你选择某一方面精研之前的通识知识还是非常有必要掌握它的。不然你的路只会越走越窄。

    有相当一部分领域知识其实是需要数学基础的,比如图形学、机器学习、游戏里的物理模拟等等。主要内容就是三门课 微积分线代概率。个人感觉常用程度上来说应该是 线代 > 概率 > 微积分的。

    接下来是计算机五大件《数据结构》、《计算机组成原理》、《操作系统》、《计算机网络》和《编译原理》。这五门课是你以后做任何方向的基础。

    有的同学可能觉得这几门课中的某几门没有什么卵用。然而事实上在任何一个方向中深入以后都会和这几门课的内容纠缠在一起(计算机网络可能特殊一点,毕竟有单机的程序)。而且这几门课中所表述的思想以及解决问题所使用的模式和方法论可以说涵盖了整个计算机知识体系的精华。有时候虽然是完全不相干的领域,但是解决问题的思路却和某几门课中的方法惊人的相似。

    数据结构

    《数据结构》是所有课程的基础,重要性就不用提了,没有数据结构基本上没法写代码。

    计算机组成原理

    《计算机组成原理》这个可以薄弱一些,毕竟写代码其实和硬件打交道的机会不多。但是整个计算机运行的流程一定要搞清楚,例如缓存、内存、寄存器、CPU 是如何执行指令的,IO 设备是怎么输出的。一般汇编语言也会在这门课程中教一部分。有部分对于性能要求很高的程序会需要这方面的知识,比如高性能的服务器、游戏等等。

    操作系统

    《操作系统》理论上来讲你所有写到的程序都是运行在操作系统上的。文件系统
    、内存管理、进程管理、I/O 这都是写一个程序必不可少的内容。缺了这一门你可能就会出现写多线程程序却不知道怎么加锁之类的低级错误。如何进行进程间的通信?如何使用系统调用?如何处理文件?等等等等

    计算机网络

    《计算机网络》这一部分其实和《操作系统》有一小部分重叠。作为一个合格的程序员,至少要能闭着眼睛说出来 TCP/IP 五层协议栈是什么每层的主要功能是什么。不过在实践中一般重点把握传输层,自上而下掌握到 IP 层就可以了。对于编写网络程序来说是必不可少的内容。

    编译原理

    《编译原理》很多人觉得我又不发明编程语言,《编译原理》没什么卵用。其实不然,你看 web 里常用的模板引擎不就是用编译原理的知识写的么。那帮搞前端的程序员搞到最后哪个不是在搞编译(笑)。掌握这门课一来可以让你在处理程序错误的时候更加的熟练,另一方面可以利用编译的知识写一些小工具,能够大大提高工作效率。在这里推荐一本书《编程语言实现模式》代替大部头学院派的《编译原理》来看真的是非常棒,作为基础知识肯定够用了。

    其他

    此外就是掌握若干门编程语言。一定是若干门而不是一门,一方面可以改变你用程序定位自己职位的想法,另一方面可以开阔视野让你在解决问题时找到最适合的工具。个人觉得静态/动态、面向过程/面向对象、编译/解释。总共凑个三门能够把这几个都覆盖了应该够用了。比如 C++、C#、Lua(写游戏),Java、Js、Python/PHP(偏 web 一点),C++、Python、Matlab(科学计算)之类的组合都是不错的。

    最后就是软件工程的内容,大部头的东西可能大家没有兴趣看,但是一些软工的常识还是要知道的比如 bug 只和行数相关啊,往项目中不断加人并不会加速之类的。设计模式什么的还是要知道的,最起码常用的单例、工厂、装饰器等等都要清楚。我不是提倡过度设计,但是如果不知道你看别人的代码很可能会一脸懵逼。

    2. 领域知识

    对于不同的细分方向所需要掌握的领域知识是不同的,在你打好基础以后,如果想要成为一个“有用”的程序员,必然还需要掌握至少一个方面的领域知识。

    比如说做 web 的 HTTP 协议要搞清楚吧,前端的同学浏览器相关的东西什么响应式啦、什么 Restful、什么兼容性、什么跨域、什么 XSS 什么浏览器渲染网页的要搞清楚吧。

    我本职工作是做游戏的其他的就不乱说了。拿游戏来举例子吧。首先要熟悉一款游戏引擎吧,其次游戏中常用的编程模式要知道吧,像什么游戏循环、双缓冲、更新方法、对象池。AI 方面行为树和状态机要清楚。渲染方面基本的一个渲染流程要明白,能写 shader 最好等等。只是举个简单的例子,意思就是再掌握基础以后你需要将这些基础应用到一个特定的领域上去,你的体系才算是完整,不然就算是一个毛胚生。

    3. 碎片知识

    为什么叫做碎片知识呢,因为这部分内容其实还蛮难划分的,甚至你很难叫他“知识”,也许只是一些小技巧,常识之类的东西,但是却在工作中有很重要的地位。

    这里推荐一本书《程序员修炼之道:从小工到专家》虽然名字很山寨但是确实是一本好书。因为不存在体系我想到哪里就写到哪里了,可能会有遗漏,不过大家领会这个意思就好:

    调试

    调试其实是一门学问,但是很少有人会把调试作为一个单独的课程或者知识体系来说。但是他对于你写代码来说又是必不可少的。至少要会二分调试法吧,单步调试/日志输出调试,小黄鸭调试法等等。再复杂一点,如何利用操作系统提供的工具去 Attach 进程,监控他们的工作状态。调试网络程序时如何抓包等等。都是需要花时间来学习的。

    版本管理

    什么分支合并、如何解决冲突、如何合作、如何回滚等等。

    工具

    各种 IDE 啦,编辑器啦,包管理,Diff 工具,工作流管理等等等等。需要花费一定的时间去学习。

    检索信息

    如何查找一手资料,查找官方文档、如何快速切入一个新的库或者项目等等,无数次有人私信里边问我文档里写的清清楚楚的东西,让我觉得这实在是一种需要学习的能力。

    开源文化

    什么是开源、如何加入一个社区、如果为开源项目做贡献、如何编写文档等等

  • ❤️ Liked post in 定期搬点 T 大优质树洞
    深入交流
    Lrving 夕阳 Post #6

    《美国 AI 方向 PhD 的申请》
    本来我早就想写这么一个来造福有意向出国读研的学弟学妹,但是要么我太忙没时间,要么有时间但因为喜欢冲塔被树洞小管家禁言。正巧前两天看见那个答疑洞吸引了很多关注,而且我最近就差 nips 写作了,正好借此机会练习一下文笔写点东西。请注意,本文由于追求完备,力争覆盖申请的每一个细节,所以可能会很长,毕竟我想写这个的目的就是看不惯中介靠信息差卖高价,我就是来砸他们的饭碗的,所以自然要事无巨细地全写出来。这样即便大家要报世毕盟,也只需要报半价的那个套餐就好了。不过我其实有很多地方十分主观,比如涉及评价学校的部分,所以不认同的人可能觉得我在夹带私货。如果你不认同本人的部分观点,就请当做我的一家之言,仅做参考就完了。
    当然,这个洞是专门给 AI 方向的 PhD 申请开的,主要针对的群体是 ai/ml/cv/nlp/dm/robotics 方向的申请者。cs 其他方向比如 system 也可以参考,甚至不是 cs 的申请者读完可能也会觉得有所收获,所以各位敬请各取所需。我在最后也会讲讲关于 mscs 的申请。
    所以为什么要去美国读 AI 的 PhD 呢?这似乎在当下有点政治不正确,显得清华好像留美预备学校一样。按理说,看 csranking 上清华北大反超 cmu 登顶世界第一不过是时间问题,为什么要跑到“注定失败”的美国去再上演一出 49 年入国军呢?很多人有从各个面向给出了很多不同的解答。我只根据纯粹的 research 原因给大家一个我的想法。其实,清华 cs 和北美 top 校最大的差距就是工作偏 follow-up。不服气的小伙伴可以先想一想,ai 顶会国内没少产出,但 dl 时代真正有 high impact 的可能只有当年 kaiming he 在 msra 的那一系列工作,而 kaiming 现在也已经在 FAIR 了。换言之,国外的顶级 cs phd program 更喜欢学生能够去开坑,而清华的 phd 更倾向去填坑。
    什么样的工作算开坑呢?一个类型是定义新的问题,比如 fei-fei 组的工作。很多人诟病飞飞标了个数据集,或者搞了个新的 benchmark 就不管了,但在她看来刷 benchmark 是工业界的事,学术界本来就应该告诉大家我们应该往哪里 move on,无论是定义新问题,还是标新的数据集,都是在告诉大家整个 community 下一步的前进方向。而不单纯是今天我有一个 task,有一个 benchmark,还有一个 SOTA 的模型,我在上面加加减减然后提几个点,讲一个故事就是一篇论文。值得关心的不是在 ImageNet 上有提了几个点,而是我们究竟离 AI 还有多远这样一个 big picture。所以很多做 object detection 或者 segmentation 的同学不妨想想,为什么要从 bounding box 和 pixel-wise 两个角度来做 understanding。另一类开坑的工作,是创造性的提出一套前所未有的解决问题的范式。很多人用 lstm 做 nlp 的时候,google 第一个说 attention is all u need,cv 都是 cnn 的时候也是 google 告诉大家 transformer 可以代替 cnn。很多人现在做点云,但是第一个提出可以直接用 deep model on point cloud 的是 guibas 组。类似的还有首先用 deep model 结合 SDF 表达 3D 物体的 DeepSDF(UW+FB),以及去年大火的 nerf(Berkeley+google) 第一个把 deep model 引进到 rendering 中取得了很好的结果。总之,说穿了就两个问题,我可以怎么创造新的问题来继续提升 deep learning?deep learning 可以用来提升哪些现有的问题?很多时候回答这两个问题需要的是对于潮流发展有敏锐的 sense,我认为这才是中美 AI 学界差距最大的地方。song han 能拿到 mit 的教职是因为在 stanford 开了 model compression 的大坑,jun-yan zhu 和 tianqi chen 拿到 cmu 的 offer 也是因为分别在 Berkeley 和 UW 开了 image2image 以及 tvm 的大坑。我觉得清华要摆脱留美预备学校的帽子,需要先清华能让美国人做我们定义的问题。

    好像扯得有点远,不过我觉得先让大家厘清为何要去美国读 AI PhD 是一件很重要的事情。下面我把申请中的各要素分门别类地和大家详细讲一讲。

    GPA:我首先就要讲 gpa。很多人说 gpa 对 phd 不重要,也有很多人说 gpa 重要,到底重不重要呢?It depends。如果你本科毕业发了 10 篇顶会一作,gpa 可有可无,如果没有 paper,gpa 可能就是你的救命稻草。申请的结果是各个方面加权的结果,但不同人的加权系数是不一样的。与高考关注有没有短板不同,美国学校更关注的是你的长板,一般来说你出彩的那一部分越出彩作用越大,加权越高。所以 3.95gpa 很可能让缺少过硬科研经历的你进入 Princ

    选方向:
    我大致谈谈 AI 的几大方向以及顶会,我把他分成了六大方向。
    传统 AI:现在做的人很少了,一般包括 search、planning,其实 bayes 那些我觉得也可以算进来。顶会自然是 aaai、ijcai,虽然这俩在 cv 领域不咋样。此外 UAI 也不错。
    计算机视觉(cv):顶会自然是 cvpr、iccv、eccv。很多人说 cv 不行了,但是国外申请的人还是多的一笔。有一些小会议,比如 WACV、BMVC 或者 3dv,感觉 3dv 其实还不错,就是 topic 比较窄,只局限在 3d vision。BMVC 因为牛津的人力捧,所以感觉比 wacv 强一点。
    自然语言处理(nlp):可能比 cv 申请更卷的方向,因为美本喜欢做,而且因为 short、finding 这些,paper 数量大家都很多。请见 acl、emnlp、naacl,而且一般以长文为主。short 要弱一些,finding 就更弱了。至于其他的像 coling 这种会其实都差一档。
    机器学习(ml):因为理论,所以自动筛掉了很多竞争者。也因为这样,相比其他方向,ICML/NIPS/ICLR 的论文数量是最能体现四大优势的。其他几项 csranking 就是个笑话。当然 AISTATS 和 COLT 也很好,但更理论。其实 AAAI 的 ml paper 比 cv paper 质量高一些。
    数据挖掘(DM):这个领域基本是走日薄西山了,KDD 已经不比 10 年前了,sigir 更衰,我觉得已经混到 cikm、icdm 差不多的水平了。www 会议还不错。而且这个领域的老师很多也在和 nlp 或者 hci 交叉,会投很多 CHI 或者 acl 这种会议。
    机器人(Robotics):Robotics 感觉相当杂,基本 cs、ee、me 的人都在做,而且侧重点从偏 perception 到偏 control 的,这中间的差异可谓相当之大。一般传统上的三大顶会是 ICRA/IROS/RSS,其中 rss 最好,iros 相对最容易。近年还有做 robot learning 的人搞得 CORL,北美反正是认这个会,可能国内因为 ccf 还没啥人投吧。

    选校:
    然后我要开始得罪人了,开始点评各个学校的 AI 综合实力。当然大家选校基本是靠排名,常见的排名包括 USNEWS 的 cs 专排以及 csranking 网站排名。前者是 peer review 的结果,比较靠谱,但有滞后性。后者是辣鸡,不要相信那个排名,大家看看老师有谁就好了,而且名单还不一定齐全。不过排名很多时候差个两三名但实力其实差不多,所以我把他们分了个档来排,同档的有些微差距但并不十分大。以下这个排名只反映 AI 综合实力,一不代表 cs 总体实力或者其他方向的实力,典型就是 UIUC、UMich,他们 system 很好,但 AI 就一般。二不代表分项的实力,例如 nlp 和 dm 领域的排名就与之有很大出入。至于大家选校,还可以看看 faculty 跳槽的去向,毕竟 faculty 判断谁靠谱那是真的靠谱。
    Tier 1:
    四大 yyds。不过 CMU 方差比较大,里面是真有些比较菜的老师的存在的。相对来说,斯坦福的 cs 基本坑货比较少,而且各个方向都十分强。MIT 和 Berkeley 没有做 data mining 的,nlp 的也很少,但 Berkeley 的 cv 和 mit 的 robotics 都逆天强。四大的共同特点就是 ml 都巨强,是直接拉出第五一档的强,而且人也特别多。
    Tier1.5:
    UW&Cornell: 两所基本在 AI 所有方向都很强的学校,但是加总起来从规模到质量都比四大稍差一点点的学校。UW 主要是得益于西雅图的地理位置,msft 和 amazon 钱给的多,而且像 fb 和 google 这些硅谷公司已经把西雅图变成了最大的分部,近十年来不知道从 CMU 挖了多少学术新星;cornell 虽然在偏僻的伊萨卡,但是他在同处纽约州的纽约市建了康泰克校区,尽管坐公交要 5 个多小时吧。罗斯福岛地理位置很好,紧挨着 google 的 office。虽然校园很小,但环境真的美如画。基本上,在工业界学术界联手搞事情的今天,地理位置的作用还是很大的。
    Princeton:普林整体实力其实不如上面两所,主要是因为规模太小。不过要是你碰巧是普林的强势方向,也就是偏重理论的方向,特别是 ml,普林真的是很好的选择,但越应用就相对越差一些。不过普林这种基本一个方向坑位很少,可选的老师很少,录取的人也很少,很可能你找不到你感兴趣的方向。
    Caltech:更极端的例子,普林是你可能找不到对应的老师,caltech 是除了极个别方向,比如 rl 啥的,你都找不到对应的导师。不过一旦有,还都是很好的!而且地处帕萨迪那,周围就是全美最好的中餐。
    tier1 和 tier1.5 的学校基本都不是 rolling-based,就发一轮 offer,然后没有拿到的发 reject,因为他们有足够的信心会有达到预期数量的学生会 take offer。当然一般也没有 wl,因为他们第一轮发的数量就多于预期录取的数量了。mit 是个例外,可能会有一些 wl,但很难转正,因为锯掉 mit 的太

    选老师:
    其实老师比学校重要。老师主要是要看让你做什么,你做的 topic 直接影响你未来的出路。建议提前查看组里的同学都在做什么,以及他们毕业后的去向。基本这就是你未来的模板。然后还要关注和这个老师合作的舒适度,如果是个 push 或者放羊的主,你就要掂量掂量自己的个性了,毕竟五年快乐过下来比你做出多大成绩要重要。我见过很多北美 phd 读的很快乐的,也见过很多痛苦到 quit 的,主要的区别就是选了个什么样的老板。所以怎么能够掌握自己的方向都有哪些活跃的 faculty,又怎么能够判断他们工作 solid 与否或者是否是 rising star 呢?除了 csranking 和官网,我还有一个建议是好好利用 twitter。基本年轻的老师都会在上面推销自己的工作。而且有一些营销号,像 AK,会转推好的 arxiv new submission,比看 arxiv daily 高效多了,也比微信公众号那些花钱 pr 的 paper 质量好多了。

    套磁:
    我觉得其实对多数人没啥用,多数都是模板回复,毕竟多数人没到非你不可的地步。但我还是建议大家就像表白一样,宁可被拒也不要错过。就给自己选的 professor of interest 发一封邮件,说说自己对他的 paper 是多么的感兴趣。可能全是模板回复或者石沉大海,说欢迎申请或者你录取了我们详谈,但没准就有一个愿意和你面试呢。而且有些 paper 在投的同学,也可以通过 email 来和 professor 或者负责 admission 的 staff 来 update 你 paper 的情况

    面试:
    基本所有学校都要有面试,第一轮基本在一月份,一般拿到面试就离 offer 很近了。多数学校的面试就是聊聊你 cv 上的 paper,你想做的方向以及瞎扯淡。最重要的是放松,不要紧张,就正常的和老师交流,把你 paper 的细节清晰地说出来,从 motivation 到 method 再到取得的结果。然后要对面试老师近期的 paper 有所了解,建议仔细阅读他的 homepage 以及 google scholar。我相信大家经过和暑研老师的 meeting 肯定对这个驾轻就熟了。

    等结果:
    一般会在一月底二月初开始出结果,tier2 的学校到三月份也会接着发,毕竟要等第一轮录取的学生是否接前面学校的 offer。大家也可以利用这个时间和学校更新自己 cv 上在投 paper 的情况,个别老师也会在三月份再安排面试。总之,耐心等待吧,这个过程很煎熬的。

    非 cs 院系的 ai:
    其实除了 cs 系,ee/me 这些院系也有做 ai 的,比如 stanford 的 ee、Berkeley 的 me 和 mit 的 aeroastro。只不过他们光谱比较窄。ee 基本偏 signal processing,me 基本只有 robotics,这样到时候找工作的时候也会受限。比如 me 做 robotics 也基本都是去自动驾驶公司,相比之下 cs 做 robotics 的选择会宽的多。教职的话就更不用说了,cs 做 ai 的可以找 ee 的教职,但 ee 做 ai 的找 cs 教职难度层级大大提高。所以即便差一层级的学校,建议大家还是优选 cs,如果你想做 ai 的话。

    所以总结一下 timeline 就是:认真刷 gpa->srt 或者联系老师去搬砖->考托福和 GRE->联系暑研->拿到重要的海外推荐信->整理 ps&cv->在申请网站上填申请->套磁->面试->等 offer->决定去哪里->办签证买机票。