├── .github └── workflows │ └── main.yml ├── .gitignore ├── README.md ├── docs ├── 保研 │ ├── README.md │ ├── image │ │ ├── quxiang.png │ │ ├── quxiang2.png │ │ ├── quxiang3.png │ │ ├── quxiang4.png │ │ └── school.jpg │ ├── 保研准备.md │ ├── 历年去向.md │ ├── 是否读博.md │ ├── 相关资源 │ │ ├── 保研经验分享-2.pdf │ │ ├── 保研经验分享.pdf │ │ ├── 相关资源.md │ │ └── 经验贴收集.md │ ├── 经验贴 │ │ ├── 2019级-Jing-北京大学.md │ │ ├── 2019级-卢军汀-北京大学.md │ │ ├── 2019级-杨一帆-中国科学技术大学.md │ │ ├── 2019级-杨凯裕-北京大学.md │ │ ├── 2019级-魏天昊-北京大学.md │ │ └── 20XX级-XXX(姓名)-XXX(最终去向).md │ └── 院校选择.md ├── 学业 │ ├── README.md │ └── 学业指南.md ├── 杂文 │ ├── README.md │ ├── duk's_cs-intro.md │ └── image │ │ └── intro │ │ ├── 1659713570094.png │ │ ├── 1659713643857.png │ │ ├── 1659755774245.png │ │ ├── 1659755982620.png │ │ ├── 1659844486095.png │ │ └── 1659844518755.png └── 留学 │ └── README.md ├── mkdocs.yml └── update.py /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI 4 | 5 | # Controls when the action will run. Triggers the workflow on push or pull request 6 | # events but only for the master branch 7 | on: 8 | push: 9 | branches: [ master ] 10 | 11 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 12 | jobs: 13 | # This workflow contains a single job called "build" 14 | build: 15 | # The type of runner that the job will run on 16 | runs-on: ubuntu-latest 17 | 18 | # Steps represent a sequence of tasks that will be executed as part of the job 19 | steps: 20 | 21 | - name: Checkout master 22 | uses: actions/checkout@v2 23 | 24 | - name: Update dir 25 | run: ./update.py 26 | 27 | - name: Deploy docs 28 | uses: mhausenblas/mkdocs-deploy-gh-pages@master 29 | env: 30 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 31 | CONFIG_FILE: mkdocs.yml 32 | EXTRA_PACKAGES: build-base 33 | 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | site 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NWPU计算机生存指南 2 | 3 | ## 前言 4 | 5 | 为了更好的阅读体验,请访问本项目Web Page: [Survive NWPU-CS Manual](https://npu-cs.github.io/SurviveNWPU-CSManual) 6 | 7 | 各类计算机专业课程资料,请访问子项目下载: [npu-cs Course-Material](https://github.com/npu-cs/Course-Material) 8 | 9 | 受 [上海交通大学](https://github.com/SurviveSJTU/SurviveSJTUManual)、[浙江大学](https://github.com/QSCTech/zju-icicles)、[清华大学](https://github.com/PKUanonym/REKCARC-TSC-UHT)、[哈尔滨工业大学-深圳](https://github.com/hewei2001/HITSZ-OpenCS)、[四川大学](https://github.com/SCU-CS-Runner/SurviveSCUManual)、[北京航空航天大学](https://github.com/TheBloodthirster/BUAA_Course_Sharing)、[电子科技大学](https://github.com/Xovee/uestc-course) 等相关项目启发,创立了本项目。 10 | 11 | 本项目创建于2022年,由2019级CS本科生自发组织,目前处于民间运营状态。 12 | 13 | 谨在此感谢所有对本项目做出贡献的同学,以及屏幕前的你! 14 | 15 | ## 愿景 16 | 17 | 1. 打破信息壁垒,让每位同学有平等的学习机会; 18 | 19 | 2. 为处于迷茫期、焦虑期的同学指引前行的方向; 20 | 3. 提高我校计算机及其相关专业学生的综合素质。 21 | 22 | ## 目录 23 | 24 | 本项目将会收录以下内容: 25 | 26 | | 保研 | 学业 | 27 | | :--------: | :--------: | 28 | | 留学 | 考研(TODO) | 29 | | 竞赛 | 科研(TODO) | 30 | | 生活(TODO) | 实习(TODO) | 31 | | 杂文 | …… | 32 | 33 | ## 贡献 34 | 35 | **欢迎贡献!欢迎贡献!欢迎贡献!** 36 | 37 | “众人拾柴火焰高”,大家的关注、维护和贡献才是这个项目得以延续的基础。 38 | 39 | 仓库地址:[https://github.com/npu-cs/SurviveNWPU-CSManual](https://github.com/npu-cs/SurviveNWPU-CSManual); 40 | 41 | 贡献方法主要有以下三种:`Issue`、`Pull Request`以及邮箱: 42 | 43 | 方法一、`Issue`: 44 | 45 | 请您在[此处](https://github.com/npu-cs/SurviveNWPU-CSManual/issues/new)提交您的`Issue`,并附带您的文件,将由维护者负责添加。 46 | 47 | 方法二、`Pull Request`: 48 | 49 | 首先`Fork`本仓库,然后上传文件到文件夹(或自己新建文件夹),点击提交`Pull Request`。 50 | 51 | 方法三、邮箱: 52 | 53 | 请您将补充/纠错的内容及文件发送至[此邮箱](mailto:1985871043@qq.com),将由维护者负责维护。 54 | 55 | **注意:** 56 | 57 | 1. 请在使用`Pull Request`时留意一下项目的文件组织; 58 | 59 | 2. 由于本项目暂未启用`git-lfs`,请勿提交单个超过100M的文件,将被视为无效; 60 | 61 | 3. 如果您希望以匿名形式进行贡献,可以采用发送至邮箱的方式。 62 | 63 | ## 许可 64 | 65 | 由贡献者编写部分的许可如下:[CC-BY-NC-SA:署名-非商业性使用-相同方式共享](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh); 66 | 67 | 其他部分的版权归属于其各自的作者,如有侵权,请及时联系[此邮箱](mailto:1985871043@qq.com)。 68 | 69 | 资料仅供参考,请自行判断其适用性。 70 | -------------------------------------------------------------------------------- /docs/保研/README.md: -------------------------------------------------------------------------------- 1 | # 保研篇 2 | 3 | 为了能够对保研有一个大致的认识,请先阅读本页内容。 4 | 5 | (或者查看:相关资源->相关资源->20230305保研经验分享PPT) 6 | 7 | 8 | 9 | 保研是升学的重要途径之一,西工大各学院的保研率在20%-30%之间。 10 | 11 | 对于计算机学院而言,2019级保研率为 84 / 309(27.2%)。 12 | 13 | > 此309人包含了延毕的2017、2018级同学。 14 | 15 | 16 | 17 | ## 1. 获取推免资格的方式 18 | 19 | 1. GPA专业排名前10%的学生,原则上直接获得推免资格; 20 | 2. GPA专业排名10%之后的学生按照**综合测评成绩**从高到低排序的方式依次确定推免资格,其中GPA在综合测评成绩中的占比原则上不低于80%; 21 | 3. 教育实验学院、国际班、飞天班推荐比例按照学校有关政策执行; 22 | 4. 支教团按综合测评成绩排名前50%进行申报,由团委根据国家支教团名额和有关规定进行遴选; 23 | 5. 特殊情况经学院推免工作小组研究同意后,报学校招生工作领导小组审议批准。 24 | 25 | > 以上摘自《关于开展2023年免试研究生推荐工作的通知》,即2019级的保研指导文件。 26 | 27 | 28 | 29 | ## 2. 保研的目标院校如何选定 30 | 31 | 首先,根据往年计算机学院学长学姐的情况来给自己定位。 32 | 33 | 然后,根据自己喜好(title、城市、地域)、是否愿意读博、导师的match程度、该校具体某一方向的强弱来进一步选择。 34 | 35 | 更多内容详见“院校选择”子目录。 36 | 37 | 38 | 39 | ## 3. 保研的目标专业如何选定 40 | 41 | 主要依据自己大学四年的感受、喜好来进行判断,比如: 42 | 43 | 1. 是否喜欢和硬件打交道? 44 | 2. 是否喜欢写代码?编程能力如何? 45 | 3. 是否希望自己的成果能有实际落地的应用? 46 | 4. 是否比较擅长某一方面的研究或者是感兴趣? 47 | 48 | 计算机科学与技术可以细分成三个方向: 49 | 50 | - 计算机体系结构 (081201),适合工程师类型的人(代码能力强、具有系统思维); 51 | 52 | - 计算机软件与理论 (081202),适合数理逻辑、抽象思维好的人(如果是系统软件,更接近计算机体系结构类型); 53 | 54 | - 计算机应用技术 (081203),适合学习能力强、头脑灵活、市场嗅觉好的人。 55 | 56 | 另外,如果考虑**国家需求**的话,可以努力往计算机系统方向(系统软件或者体系结构)发展。 57 | 58 | 从专业代码角度看,以上三者均为学硕/博士,专硕一般为: 59 | 60 | - 电子信息 (085400),与学硕/博士相比,更侧重于实践,名额相对来说更容易获取一些。 61 | 62 | 63 | 64 | ## 4. 研究生导师的选择(获取信息、套磁) 65 | 66 | 到各院校的网站上一个个翻看教师主页: 67 | 68 | 1. 看近几年的paper(aminer、google scholar或者dblp); 69 | 2. 看是否有人品问题(研控yankong.org、知乎); 70 | 3. 如果能找到往年的学长学姐问一下具体情况,那就更好了。 71 | 72 | 套磁的话可以上 **某些仓库*** 找模版,然后发老师邮箱。投得越多,机会越大。 73 | 74 | 75 | 76 | ## 5. 保研的考察形式是怎样的 77 | 78 | 以下是一些可能的形式: 79 | 80 | 1. 机试:① 算法和数据结构 ②计算机专业知识; 81 | 2. 面试:① 计算机专业知识 ② 英语 ③ 做过的项目工程; 82 | 3. 工程:少数大学会在夏令营期间安排学生参与项目工程,来考察动手能力、合作交流能力。 83 | 84 | 每个学校的形式都不一样,例如: 85 | 86 | - 北京大学计算机学院的夏令营只有面试; 87 | - 清华大学计算机系有机试和面试,且机试难度大; 88 | - 浙江大学计算机学院的夏令营只面向直博,会要求完成一些项目; 89 | - 南京大学计算机系的夏令营有笔试(上机做专业课的选择题)和面试; 90 | - 西北工业大学计算机学院夏令营、预推免只有面试。 91 | 92 | 以上为2022年的情况,仅供参考。 93 | 94 | 可以上知乎或者 **某些仓库*** 找找看有没有自己目标院校的经验贴。 95 | 96 | 本仓库“经验贴”子目录,正在征集当中。 97 | 98 | 99 | 100 | ## 6. 保研需要进行哪些方面的准备 101 | 102 | 从大三寒假开始就可以准备了: 103 | 104 | 1. 如果对算法没信心,可以刷leetcode/牛客网/acwing的算法题,熟能生巧; 105 | 2. 制作简历,对于简历上写的项目经历要熟悉一下,不要卡壳; 106 | 3. 计算机专业课可以有针对性地复习(比如想走体系结构就复习计组,想走ai就复习概率论、机器学习等等); 107 | 4. 英文自我介绍,以及一些简单的英语问答。 108 | 109 | 更多内容详见“保研准备”子目录。 110 | 111 | 112 | 113 | ## 7. 保研的几个重要时间节点(流程) 114 | 115 | 套磁阶段:1-5月份(保研没正式开始,试试水,提前联系老师看能不能参与一些项目,和老师保持联系); 116 | 117 | 夏令营阶段:6月报名-7月底(竞争激烈,入营后进行机试面试;可能直接上岸,或者拿到老师的口头offer); 118 | 119 | 预推免阶段:8月中旬-9月底(相当于是第二次夏令营;不能着急,稳住心态,要相信offer一般越晚的越好); 120 | 121 | “九推”阶段:9.28推免系统开放后(如果之前已经上岸,就只要填系统就好了;如果未上岸,系统开放期间还可能有部分名额,不要放弃)。 122 | 123 | 124 | 125 | 126 | **某些仓库*** : 127 | 128 | 1. [https://github.com/Alpha-Yang/CS-BAOYAN-2022](https://github.com/Alpha-Yang/CS-BAOYAN-2022);这里面有很多有用的资料,务必加一下里面的QQ群。 129 | 2. [https://github.com/yuezih/King-of-Pigeon](https://github.com/yuezih/King-of-Pigeon);这里面有一些文书模版。 130 | 131 | -------------------------------------------------------------------------------- /docs/保研/image/quxiang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/保研/image/quxiang.png -------------------------------------------------------------------------------- /docs/保研/image/quxiang2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/保研/image/quxiang2.png -------------------------------------------------------------------------------- /docs/保研/image/quxiang3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/保研/image/quxiang3.png -------------------------------------------------------------------------------- /docs/保研/image/quxiang4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/保研/image/quxiang4.png -------------------------------------------------------------------------------- /docs/保研/image/school.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/保研/image/school.jpg -------------------------------------------------------------------------------- /docs/保研/保研准备.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 保研准备 4 | 5 | ## 1.考核内容准备 6 | 7 | 各所院校每年的考核具体内容是严格保密且每年都在变化的,但是某个特定高校的某个特定学院在不同年份的**考核形式**是大同小异的。 8 | 9 | 一个了解某个院校的推免考核形式的方法,是直接在该学院的官网搜索往年的夏令营/预推免通知文件,部分院校会在文件中说明考核形式。 10 | 11 | 大致的考核形式及考察内容包括: 12 | 13 | - 机试:算法和数据结构; 14 | - 笔试:算法和数据结构、专业基础课; 15 | - 面试:英语口语、英文文献阅读&翻译; 16 | - 面试:专业基础知识问答; 17 | - 面试:项目/竞赛/科研经历提问。 18 | 19 | ### 1.1机试 20 | 21 | - 课程:Acwing算法基础课 22 | - 刷题:LeetCode、牛客网、openjudge百练 23 | - 书:《王道机试指南》、《算法笔记》 24 | 25 | ### 1.2英语 26 | 27 | 几乎所有英语相关考察都会涉及口语,可能是以问答的形式,例如:介绍家乡、兴趣爱好、你的专业等等。 28 | 29 | 可以读一些自己意向方向的英文论文的摘要,熟悉其中出现的高频词汇。 30 | 31 | ### 1.3专业知识 32 | 33 | 对于专业知识的复习,根据自己的意向方向决定复习哪些专业课,例如: 34 | 计算机体系结构 -> 计组、计操; 机器学习 -> 线性代数、概率论、机器学习; ...... 35 | 对于部分专业课的复习(例如数据结构、计组、计操、计网)可以参考一些考研书籍。 36 | 37 | 相关仓库资源: 38 | 39 | 1. https://github.com/xiaolincoder/CS-Base 40 | 2. https://github.com/huihut/interview 41 | 3. https://github.com/xiaolei565/aimto408 42 | 4. https://github.com/CyC2018/CS-Notes 43 | 44 | ### 1.4项目经历 45 | 46 | 对于部分同学来说,并没有特别出色的项目/竞赛/科研经历,往往只有课程大作业等内容可以写在简历上。 47 | 48 | 在这里,提供几个小项目供有需要的同学学习: 49 | 50 | 1. [“八股触发器”--3个比较小的C++项目--知乎](https://zhuanlan.zhihu.com/p/612921777) 51 | 52 | 53 | 54 | ## 2.硬件条件准备 55 | 56 | (已经成为历史了,18级19级属于特殊情况,大部分夏令营和预推免都是线上开展) 57 | 58 | (对于20级及以后的学弟学妹,以下内容仅作了解) 59 | 60 | 对于线上夏令营/预推免,在考核内容的准备之外,建议同学们尽早考虑以下**“硬件条件”**。 61 | 62 | ### 2.1场所 63 | 64 | 大部分院校的线上夏令营会要求,在考核期间,**不允许在受试者所在的房间中有受试者以外的其他人员**,有些院校要求房间是**密闭**的。 65 | 66 | 另外从同学们的角度出发,还需要在考核期间,所在的房间具备**安静**、**网速快速稳定**、**温度适宜**(考虑到夏令营的时间通常在七月份)等条件。 67 | 68 | 建议同学们在参加夏令营/预推免之前尽早考虑此问题。 69 | 70 | ### 2.2双机位 71 | 72 | 在线上夏令营/预推免的各种形式的考核期间,许多院校可能要求使用**双机位**形式来确保考生状态。 73 | 74 | 以面试为例,可能的双机位要求大致如下**下面的描述仅为了说明准备要点,不同院校的双机位要求可能有所不同,具体请根据所参加的院校进行准备**: 75 | 76 | 1. 受试者需要准备两个会议账号; 77 | 2. 受试者使用一台笔记本电脑作为面试的主要设备(部分学校可能允许使用手机或平板电脑为主要设备),我们不妨称之为**设备A**。设备A放置在受试者**正前方**,屏幕面向受试者。在设备A上登录其中一个会议账号,打开设备A自带的或外接的摄像头,使评委老师可通过设备A的摄像头观看到受试者正面(主要为面部),此为**第一机位**; 78 | 3. 受试者另准备一台手机(部分学校可能允许其他设备,如平板电脑),我们不妨称之为**设备B**。设备B通常要求放置在受试者的**斜后方**,在设备B上登录另一个会议账号,打开设备B的摄像头,使评委老师可以通过设备B的摄像头观看到受试者的**手部**和**设备A的屏幕**,此为**第二机位**。 79 | 80 | **建议同学们向所申请的院校的夏令营/预推免负责老师咨询双机位的具体要求**,如果需要双机位,在部署第二机位时,由于第二机位通常需要拍摄到受试者的手部和第一机位的设备屏幕,所以**可能需要将第二机位的设备架高**,建议同学们提前准备相应辅助工具(同学们可以询问经历过保研或考研复试的学长学姐具体使用什么样的工具合适,我个人使用过手机三脚架)。 81 | 82 | ### 2.3其他 83 | 84 | 可能需要考虑的其他因素还包括**通讯**(部分院校会要求准备考核期间的应急通讯手段)、**衣着**等等。 85 | 86 | 对于所申请院校可能提出的、包括场所和双机位等等在内的要求,请同学们**一定要重视**。这既是为了保证夏令营/预推免的**公平性**,也是为自己免除后顾之忧,降低突发状况出现的可能性,以便集中精力更好地充分发挥出自己准备的成果。 -------------------------------------------------------------------------------- /docs/保研/历年去向.md: -------------------------------------------------------------------------------- 1 | # 历年去向 2 | 3 | 计算机学院历年学长学姐的去向,可登陆**西北工业大学-毕业生就业数字化签约平台**查看: 4 | 5 | [https://jobszqy.nwpu.edu.cn](https://jobszqy.nwpu.edu.cn) 6 | 7 | 登录后在左侧导航栏点击本学院历年就业情况即可。 8 | 9 | 以下是2023届计科专业保研去向: 10 | 11 | ![quxiang](./image/quxiang.png) 12 | 13 | 2023届大数据专业保研去向: 14 | 15 | ![quxiang2](./image/quxiang2.png) 16 | 17 | 2023届人工智能专业保研去向: 18 | 19 | ![quxiang3](./image/quxiang3.png) 20 | 21 | 2023届物联网专业保研去向: 22 | 23 | ![quxiang4](./image/quxiang4.png) 24 | 25 | (以上数据截止2023.03.24,此时填写的都是保研的同学,不包括考研) 26 | 27 | (此数据也未包含留学深造的同学,如新国立、港中文等等) 28 | -------------------------------------------------------------------------------- /docs/保研/是否读博.md: -------------------------------------------------------------------------------- 1 | # 是否读博 2 | 3 | 相关链接: 4 | 5 | [shengyp/doing_the_PhD (github.com)](https://github.com/shengyp/doing_the_PhD) -------------------------------------------------------------------------------- /docs/保研/相关资源/保研经验分享-2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/保研/相关资源/保研经验分享-2.pdf -------------------------------------------------------------------------------- /docs/保研/相关资源/保研经验分享.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/保研/相关资源/保研经验分享.pdf -------------------------------------------------------------------------------- /docs/保研/相关资源/相关资源.md: -------------------------------------------------------------------------------- 1 | # 相关资源 2 | 3 | 1. [2023.03.05保研经验分享slides](./保研经验分享.pdf) 4 | 2. [2023.03.05保研经验分享slides-2](./保研经验分享-2.pdf) 5 | -------------------------------------------------------------------------------- /docs/保研/相关资源/经验贴收集.md: -------------------------------------------------------------------------------- 1 | # 经验贴收集 2 | 3 | 这里可以转载/收集一些其他学校的经验贴,供参考。 4 | 5 | 1. [计算机专业保研--北大信科/上交软院(内附机试题目、复习笔记和文书材料)--知乎](https://zhuanlan.zhihu.com/p/51277346) 6 | 1. [清华大学计算机类专业考研/保研--机试经验贴--知乎](https://zhuanlan.zhihu.com/p/614290119) -------------------------------------------------------------------------------- /docs/保研/经验贴/2019级-Jing-北京大学.md: -------------------------------------------------------------------------------- 1 | ### 个人情况: 2 | 3 | 专业:计算机科学与技术 4 | 5 | rank:2/208(GPA) 6 | 7 | 荣誉:曾获得国家奖学金 8 | 9 | 科研:参加过 AI 方面的科研训练,未出具体成果 10 | 11 | 竞赛:主要是一些机器人类竞赛 12 | 13 | 其他:无 14 | 15 | 16 | 17 | ### 前期准备: 18 | 19 | 1、备齐了基本所有线上参营可能需要的硬件设备和其他外在条件,包括多机位面试需要的多个腾讯会议账号、封闭面试空间、手机支架等; 20 | 21 | 2、专业课方面的准备,由于我本人偏向于软件工程有关研究方向,因此专业课主要准备了数据结构、计组、计网、计操,而没有把重心放在数学类、数字逻辑设计、信号与系统等课程; 22 | 23 | 3、自己的科研和竞赛经历方面的准备,尽管我的科研和竞赛经历偏向计算机应用方面,但是也一定程度上涉及了网络通信、调度算法、并行计算等方面的内容,因此我尽可能重新熟悉了自己的项目,保证自己能够回忆起其中的细节(包括技术层面和项目过程的细节); 24 | 25 | 4、制作好自己的简历,对我来说简历的制作主要有两个地方比较耗时:其一是对自己做过的项目的概括(限于简历的篇幅限制很难清晰地说明自己的项目细节,此时需要对其进行尽可能简洁明了的概括);其二是排版,需要使自己希望呈现的信息尽可能突出; 26 | 27 | 5、算法的准备。 28 | 29 | 30 | 31 | ### 夏令营: 32 | 33 | 入营并参加了北京大学夏令营,并获优秀营员 34 | 35 | (由于北京大学的时间相对比较早,在得到优秀营员后就立即放弃了其他夏令营) 36 | 37 | 38 | 39 | ### 预推免: 40 | 41 | 未参加预推免 42 | 43 | 44 | 45 | ### 最终去向: 46 | 47 | 北京大学计算机学院软件方向 48 | 49 | 50 | 51 | ### 个人经验/感悟: 52 | 53 | 在参加夏令营之前,最好首先明确自己有意向的研究方向,在此基础上对院校和专业进行提前的了解,同时对于学硕/专硕/直博的层次选择可以有一个提前的预期,这样在面临夏令营和预推免几乎一定会发生的取舍和抉择时可以相对有准备地做出自己的选择。 54 | 55 | 对于夏令营本身,则需要做好充足的准备,以及需要有一个良好的心态。对于不同的学校、不同的学院专业、不同的研究方向来说,准备都是各不相同的,很多情况下进行针对性的准备可以较好地平衡效率和质量,因此最好通过多渠道了解自己意向的院校、研究方向、实验室、研究团队等,通过交流明确其是否符合自己的心理预期。进行夏令营和预推免的时候心态是一个需要用心经营的方面,心态好往往事半功倍,能够充分发挥出自己积累和准备的内容。最容易出现的负面心态其实就是焦虑,对此我的做法是时刻和父母以及朋友进行密切交流,申请同一院校的同学之间尤其可以多多进行交流,既可以防止遗漏某些重要的信息或时间节点,也可以通过交流使自己的心态处于一个相对稳定的状态。 56 | -------------------------------------------------------------------------------- /docs/保研/经验贴/2019级-卢军汀-北京大学.md: -------------------------------------------------------------------------------- 1 | ## 个人情况 2 | 3 | **专业:** 软件工程 4 | 5 | **排名:** 3/285(GPA),1/285(综测) 6 | 7 | **荣誉:** 国家奖学金、华为智能基座奖学金、学校奖学金 8 | 9 | **科研:** 在[光电](https://iopen.nwpu.edu.cn/index.htm)跟着做了一些项目,无成果 10 | 11 | **竞赛:** 一些机器人比赛的奖、软件开发相关的奖 12 | 13 | **个人定位:** 14 | 15 | - 直博or读硕士? 16 | 17 | - 个人无强烈的科研兴趣,所以不考虑读博士 18 | - 专硕、学硕均可 19 | 20 | - 目标院校层次? 21 | 22 | - 根据个人排名、实力评估,定位是华五学硕 / 清北专硕 23 | 24 | - 实验室? 25 | 26 | - 华五实验室,导师人品好且实验室优秀 27 | - 清北实验室,导师人品好即可 28 | 29 | 30 | 31 | ## 夏令营&预推免 32 | 33 | **夏令营:** (按照先后顺序) 34 | 35 | - 同济cs(优营) 36 | - 北大rw(优营,最终的选择) 37 | - 方向:领域智能软件(NLP) 38 | - 南大cs(入营,机试完收到面试,放弃) 39 | - 华中科技大学cs(入营,放弃) 40 | - 中科大大数据(入营,放弃) 41 | - 上交cs(入营,放弃) 42 | - 哈工深cs(入营,放弃) 43 | - 中科院计算所VIPL(入营,收到课题组面试,放弃) 44 | 45 | **预推免:** 未参加 46 | 47 | 48 | 49 | ## 过程总结 50 | 51 | - 从今年身边的同学情况:rank相对来说只是敲门砖(每年都是),实力足够强(我身边就很多这样的同学)也可以拿到华五顶级实验室offer,多多尝试,**多多陶瓷**,**争取提前先面试实验室**,实验室喜欢你了,就可能会捞你 52 | - 提早(最好大二大三开始)与目标实验室联系,**提前进组实习**,有助于丰富科研经历或预定位置 53 | - 放宽眼界,渠道多多,**避免同质化竞争** 54 | - 保研是一个信息战,建议抱团取暖 55 | 56 | 57 | 58 | ## 联系方式 59 | 60 | - 邮箱:ljt20233023@163.com 61 | - 个人网站:[AL's Blog](http://www.yuguang.zone/) 62 | -------------------------------------------------------------------------------- /docs/保研/经验贴/2019级-杨一帆-中国科学技术大学.md: -------------------------------------------------------------------------------- 1 | ### 个人情况: 2 | 3 | 专业:计算机科学与技术 4 | 5 | rank:8/208 6 | 7 | 荣誉:国奖 8 | 9 | 科研:无 10 | 11 | 竞赛:数模美赛F奖,国赛国二 12 | 13 | 其他: 14 | - 英语一般,六级成绩不高,大家有能力还是刷到550以上 15 | - 跟着康班做过几个编译器、操作系统和网络的项目,面试的时候经常被问到,如果不是自己独立完成的项目尽量别写。 16 | - 没有专门练习过算法,如果备考北航还是得提前刷算法 17 | 18 | 联系方式(可选):1150714183 qq 19 | 20 | ### 前期准备: 21 | 22 | 准备简历,项目材料,奖项,英语面试资料,以及复习之前学习过的知识,和一些基础的算法题。 23 | 24 | 25 | ### 夏令营: 26 | |学校|学院|类型|结果| 27 | |--|--|--|--| 28 | |北京大学|软微|专硕|初审没过| 29 | |北京航空航天大学|计算机|学硕|机试没过(北航喜欢出字符串模拟题,我没有练过)| 30 | |复旦大学|计算机|学硕|初审没过| 31 | |南京大学|计算机|学硕|候补到,没去| 32 | |浙江大学|软件|专硕|夏令营没用,还得参加预推免| 33 | |西安交通大学|计算机|学硕|offer| 34 | |中国人民大学|信息|学硕|初审没过| 35 | |中国科学技术大学|计算机|学硕|offer| 36 | |上海交通大学|软件|专硕|初审没过| 37 | 38 | #### 总论 39 | 保研我其实是没怎么准备的,保研中看重的是成绩,英语成绩,论文和竞赛以及算法能力。有可能的话除了把排名提高,绩点刷进前1/2/5/10%之外,把英语六级刷到550+,算法能力CSP300+,能够应对面试中的大多数初审。 40 | #### 北大软微 41 | 北大软微在夏令营期间对rank的要求很高,我没过审,身边有前2%的同学过审了,后来预推免的时候要求低了很多,所以想去北大软微的话,还是在预推免阶段多尝试。 42 | #### 北航计算机 43 | 北航计算机算是我比较想去的一个地方了,北航的入营bar比较低,分机试和面试两部分,机试有两道题,可以用CSP成绩去抵,一道是一个字符串的模拟题,另一道没仔细看,但是我当时连第一道题都没做出来,有机会还是考考CSP吧。 44 | 面试主要针对简历上的项目提问,然后问一些操作系统,网络等方面的基础知识,如果你简历上是AI项目为主的话,会问一些机器学习,深度学习相关的东西。 45 | #### 南大计算机 46 | 南大计算机分笔试和面试两部分,笔试成绩较高的可以进面试,笔试上的题目大多是一些比较难的计算机基础课程的题目,难度比408要大很多,所以想要考南大还是提前复习基础知识,通过笔试后有面试,面试的英语部分不像大多数学校要求的英文自我介绍,我当时被要求用英语介绍File descriptor(文件描述符),然后也是针对一些基础课程和简历的内容提问。如果是wl,那最后大概率能候补到。 47 | #### 浙大软院 48 | 浙软的夏令营没什么用,可以起到预推免捞你入营的作用,如果background不错没必要参加,我当时参加就是为了玩一玩,会布置任务,有的组还会有一个算法测试。 49 | #### 西交计算机 50 | 只有一个自我介绍,不过背景需要是所在专业是B+或者是985才能入营(大概是这样),做完自我介绍,老师对你评价不错就能得到offer,对于排名不高的同学很容易。 51 | #### 中科大计算机 52 | 只有面试,面试一段英文自我介绍,然后老师会逐个针对你的简历提问题,得到offer前/后就可以找实验室,尽量在出成绩之前就找,以免没有坑位,尤其是几个热门实验室,更是没有面试之前就要找好,总之面试不难,不过想得到offer还是需要实验室的同意。 53 | 54 | ### 预推免: 55 | 56 | 未参加预推免 57 | 58 | ### 最终去向: 59 | 60 | 学校:中国科学技术大学 61 | 学院:计算机科学与技术学院 62 | 方向:云网络和操作系统内核 63 | 类型:学硕 64 | 65 | ### 个人经验/感悟: 66 | 就是趁还没到保研的时候,一定要想明白自己想做什么,到底要不要读博,我都到了给我发offer的时候我还没想明白是不是要读博,最后还是放弃读博了。喜欢AI就多做一些AI相关的项目,把每个公式都推明白。喜欢系统就尽可能去做名校的各个实验,或者去公司实习。 67 | 68 | 还有就是要刷高英语成绩和CSP成绩,到时候可以游刃有余地面对初审和机试。 -------------------------------------------------------------------------------- /docs/保研/经验贴/2019级-杨凯裕-北京大学.md: -------------------------------------------------------------------------------- 1 | ### 个人情况: 2 | 3 | 专业:计算机科学与技术(康班) 4 | 5 | rank:7/208(前5学期GPA专业排名),7/227(前6学期GPA专业排名) 6 | 7 | 荣誉:无国奖(前5学期) 8 | 9 | 科研:无科研成果,大三下跟着计院老师科研打杂,基本划水,复现了几篇论文;一个省级大创。 10 | 11 | 竞赛:2020数学竞赛省一等奖,2021龙芯杯优胜奖(没进决赛) 12 | 13 | 其他: 14 | 15 | 1. 自己做了一些国外的课程lab,如操作系统MIT6.828,计算机网络CS144,计算机视觉CS231N等。 16 | 2. 对我来说,最终录取原因应该是排名还行(当时九推时专业前六名已经确定去向了,所以我算是捡了个漏),另外大创和软微他们打算搞得一个项目比较切合(后来才知道的)。 17 | 3. csp报名语言记得选C++,不然一些学校不认可。 18 | 19 | 联系方式(可选):qq 824141043 20 | 21 | ### 前期准备: 22 | 23 | 排名不算特别突出,也没几个拿得出手的项目,了解到保研比较看重排名、科研、论文、竞赛,排名已经没有大变动了,就大三下临时找了一个科研工作做了一下,复现了几篇论文,没有发论文,然后保研前随便复习了一下数学课和王道408,刷了刷acwing的基础课。基本上从4月底开始给老师发简历套磁。 24 | 25 | ### 夏令营: 26 | 27 | 投了北大计院、北大智院、北大信工、计算所、自动化所、中科大大数据学院、复旦类脑、复旦计院、南大计院、北航计院、北航人工智能研究院、西交计算机学院(放弃)。 28 | 29 | 入营的有:计算所、复旦类脑、北航计院、北航人工智能研究院。建议排名和我类似的报中科大计院,大数据学院不怎么收本科是计院的学生,***想去南大计院的提前开始复习408***。 30 | 31 | 最终:北航计院优营候补,北航人工智能研究院优营,其他全寄 :-( 32 | 33 | ### 预推免: 34 | 35 | 投了北大软微、北大信工、浙大计院、上交密西根、计算所、自动化所、复旦计院、南大计院、北航人工智能研究院(即使夏令营过了也要报名,不然视为放弃)、哈工深。 36 | 37 | 入营:北大软微、浙大计院、计算所、复旦计院、北航人工智能研究院、哈工深。 38 | 39 | 最终:北大软微专硕、浙大计院学硕、计算所学硕(由老师说了算,学院不怎么干预)、复旦计院专硕、北航人工智能研究院、哈工深专硕。 40 | 41 | ### 最终去向: 42 | 43 | 北大软微新兴交叉学科 44 | 45 | ### 个人经验/感悟: 46 | 47 | 1. 先搞清楚自己想要做科研(建议学硕或者直博,导师很重要)还是找工作(学校很重要,对计算机专业而言能实习很重要)或者选调考公(学校很重要); 48 | 2. 一定打听好导师人品; 49 | 3. 加绿群; 50 | 4. 排名不是很靠前的就海投,夏令营很卷,但是九推机会比较多,不一定适用于线下夏令营; 51 | 5. 放平心态。 52 | -------------------------------------------------------------------------------- /docs/保研/经验贴/2019级-魏天昊-北京大学.md: -------------------------------------------------------------------------------- 1 | ### 个人情况: 2 | 3 | 专业:计算机科学与技术(康班) 4 | 5 | rank:5/208(前5学期GPA,专业排名) 6 | 7 | 荣誉:无国奖(前5学期) 8 | 9 | 科研:没有正经科研,只有一个国家级大创 10 | 11 | 竞赛:2021龙芯杯一等奖以及一些机器人比赛的奖 12 | 13 | 其他: 14 | 15 | 1. 参加康班做的试点班项目比较多 16 | 2. CSP认证320分,可以抵一些机试 17 | 3. 个人感觉计算机专业课学得还行 18 | 4. 19级康班班长,算是学生工作方面的 19 | 20 | 联系方式:1985871043 qq 21 | 22 | ### 前期准备: 23 | 24 | 首先从18级学长那里打听了很多关于保研的东西,整体来说GPA的排名比较关键,很大程度上决定了夏令营、预推免能否入营(也就是bar),与最终去向相关性很大。 25 | 26 | 然后自己根据自身情况,大致定位在华五冲清北。因为自己没有国家奖学金(连续两年评都是正好差1名,这运气也是没谁了)和论文,对英语水平也不太自信,所以未考虑港校。 27 | 28 | 因为参加过龙芯杯比赛,对于体系结构方面还算了解,所以在方向选择上打算继续搞体系结构(后来事实上证明这个决定也是对的);或者机器人、分布式、云计算也还能接受(不太想搞AI偏应用的东西)。 29 | 30 | 因为自己没有很强烈的读博意向,所以优先学硕(如果以后想读博的话还是想出国看看哈哈)。 31 | 32 | ### 夏令营: 33 | 34 | 投了清华贵系、北大计算机(以及软微和深研院)、计算所、中科大、复旦工研院、南大、北航、人大(信院和高瓴)。 35 | 36 | 上交夏令营记错时间,错过没报;浙大只有直博“打工”(做项目)的夏令营,没报。 37 | 38 | 入营的有:北大计算机、计算所、中科大、复旦工研院、南大、北航、人大信院。 39 | 40 | 最终优营:北大计算机(剩下的几个在拿到北大offer后都及时拒掉了) 41 | 42 | ### 预推免: 43 | 44 | 和北大老师确认offer后,一个也没报,已经躺平了。 45 | 46 | ### 最终去向: 47 | 48 | 北京大学 - 计算机学院 - 学硕 - 软硬件协同设计 49 | 50 | ### 个人经验/感悟: 51 | 52 | 我参加的夏令营比较少,在当时拿到北京大学的学硕offer后就已经非常满意了,也没有再参加后面的预推免等等。 53 | 54 | 在整个保研的过程中(尤其是6、7月份)免不了会非常焦虑,尤其是听到XXX又套了哪个老师、XXX拿到了口头offer这种消息的时候,但是等真正拿到offer还是很开心的。 55 | 56 | 在保研的过程中,虽然往往要和他人进行比较,但请不要陷入内耗的怪圈。如果觉得自己算法不行、项目太少,那就赶紧行动起来,最怕的是比来比去非常焦虑,但是等到夏令营真正开始了却还在原地踏步。 57 | 58 | 保研如果保到了比自己真正实力要好的学校,不要过于开心,因为往往开始读研究生了会感到痛苦(我目前研0的一些亲身经历哈哈),所以说还是适合自己的才是最好的。 59 | 60 | -------------------------------------------------------------------------------- /docs/保研/经验贴/20XX级-XXX(姓名)-XXX(最终去向).md: -------------------------------------------------------------------------------- 1 | 该模板仅供参考,可以根据自己想法来组织内容。 2 | 3 | 可采取匿名方式。 4 | 5 | 以下同学的经验贴正在紧张整理中:(北京大学计算机学院)、(中科大)、(北京大学软微学院)、(科学院大学)、(科学院大学)、(西北工业大学)、(北京大学软微学院)、(浙江大学),以及部分18级学长学姐。 6 | 7 | ### 个人情况: 8 | 9 | 专业: 10 | 11 | rank: 12 | 13 | 荣誉: 14 | 15 | 科研: 16 | 17 | 竞赛: 18 | 19 | 其他: 20 | 21 | 联系方式(可选): 22 | 23 | ### 前期准备: 24 | 25 | 26 | 27 | ### 夏令营: 28 | 29 | 投了哪些?入营哪些?优营哪些? 30 | 31 | ### 预推免: 32 | 33 | 同上 34 | 35 | ### 最终去向: 36 | 37 | 学校,学院,方向,类型,导师(可选) 38 | 39 | ### 个人经验/感悟: 40 | 41 | -------------------------------------------------------------------------------- /docs/保研/院校选择.md: -------------------------------------------------------------------------------- 1 | # 院校选择 2 | 3 | ## 院校排名 4 | 5 | ![](./image/school.jpg) 6 | 7 | 以上为“网友”总结的大致排名,其中学科评估参考为第四轮。 8 | 9 | 也可以参考[CS Rankings](https://csrankings.org/)上的排名。 10 | 11 | ## 院校情况 12 | 13 | ### 1. 夏令营 14 | | 院校 | 院系 | 入营要求 | 机试 | 笔试 | 面试 | 15 | | -------- | ---------------- | ------------------------------------------------------ | ------------ | --------------- | ----------------------------------------------------- | 16 | | 清华大学 | 计算机系 | | | | | 17 | | 北京大学 | 计算机学院 | | | | | 18 | | 北京大学 | 软件与微电子学院 | 难度不定,随当年报考人数决定 | | | 有 | 19 | | 上海交大 | 计算机学院 | | | | | 20 | | 上海交大 | 软件学院 | rank 10% CET-6 425 | | | | 21 | | 复旦大学 | 计算机学院 | rank 1%(预推免bar大幅降低) | | | | 22 | | 复旦大学 | 工研院 | | | | | 23 | | 复旦大学 | 类脑学院 | | | | | 24 | | 浙江大学 | 计算机学院 | 仅直博 CET-6 460 | | | | 25 | | 浙江大学 | 软件学院 | 优秀营员对西工大学生无效,因为不用这个也可以参加预推免 | 各营情况不同 | 同上 | 同上 | 26 | | 南京大学 | 计算机学院 | rank 10% | 无 | 有,难度大于408 | 有,面试需准备英文介绍专业相关内容 | 27 | | 南京大学 | 软件学院 | | | | | 28 | | 南京大学 | 人工智能学院 | rank 10% | | | | 29 | | 中国科大 | 计算机学院 | rank 10% | 无 | 无 | 有两次,一次确定是否发offer一次确定是否能进心仪实验室 | 30 | | 计算所 | | 需提前联系实验室 | 实验室安排 | 同上 | 有 | 31 | | 自动化 | | 需提前联系实验室 | 实验室安排 | 同上 | 有 | 32 | | 软件所 | | | | | | 33 | | 信工所 | | | | | | 34 | 35 | 36 | ### 2. 预推免 37 | 38 | | 院校 | 院系 | 入营要求 | 机试 | 笔试 | 面试 | 39 | | -------- | ---------------- | -------------------------------------------- | -------------------------------------- | --------------- | ---------------------------------- | 40 | | 清华大学 | 计算机系 | | | | | 41 | | 北京大学 | 计算机学院 | | | | | 42 | | 北京大学 | 软件与微电子学院 | 难度低于夏令营 | | | 有 | 43 | | 上海交大 | 计算机学院 | | | | | 44 | | 上海交大 | 软件学院 | 无预推免 | | | | 45 | | 复旦大学 | 计算机学院 | rank 10% | | | 有 | 46 | | 复旦大学 | 工研院 | | | | | 47 | | 复旦大学 | 类脑学院 | | | | | 48 | | 浙江大学 | 计算机学院 | rank10% 分软件工程和计科,计科难度略高于软工 | | | 有 | 49 | | 浙江大学 | 软件学院 | 较低,没有具体范围 | 分AI和非AI方向,AI方向要求机试分数略高 | 无 | 有 | 50 | | 南京大学 | 计算机学院 | rank 10% | 无 | 有,难度大于408 | 有,面试需准备英文介绍专业相关内容 | 51 | | 南京大学 | 软件学院 | | | | | 52 | | 南京大学 | 人工智能学院 | rank 10% | | | | 53 | | 中国科大 | 无预推免 | | | | | 54 | | 计算所 | | 需提前联系实验室 | 实验室安排 | 同上 | 有 | 55 | | 自动化 | | 需提前联系实验室 | 实验室安排 | 同上 | 有 | 56 | | 软件所 | | | | | | 57 | | 信工所 | | | | | | 58 | 59 | 60 | > 预推免阶段的中科院各所剩下的名额不多,需及时关注各个实验室的招生情况 61 | 62 | -------------------------------------------------------------------------------- /docs/学业/README.md: -------------------------------------------------------------------------------- 1 | # 学业篇 2 | 3 | 本学业篇计划收录以下内容: 4 | 5 | 1. 课程资料(作业、真题、复习资料) 6 | 2. 其他学业指导相关内容 7 | 8 | -------------------------------------------------------------------------------- /docs/学业/学业指南.md: -------------------------------------------------------------------------------- 1 | # 学业指南 2 | 3 | ### 前言 4 | 5 | -- Think twice, live once. 6 | 7 | 人的生命只有一次,绝大多数人只能拥有一次大学本科时光,所以在开始大学的生活前,请谨慎的思考未来的四年你打算如何度过。 8 | 9 | 你可能会有以下打算: 10 | 11 | 1. 如果你想要**本科毕业找计算机相关工作**,那么多去企业实习,多做项目可能是很好的选择,~~上课有时只是一种浪费时间~~。 12 | 2. 可能你**立志学术**,想要继续深造,毕业寻找教职,那么早日进老师的实验室打工板砖,努力发文章,拿大牛推荐信可能才是正确的道路。 13 | 3. 或者你可能**对计算机不感兴趣**,那么请尽早转专业。如果想毕业考选调,考公。那么早日入党,做学生干部,拿奖才是最优解。 14 | 15 | 我想,对于绝大多数人来说,在低年级就坚定地做出未来选择的人并不多,那么可能好好学习,努力刷高gpa,(我知道某种程度上,**某些课的内容无趣并且没用**,但是人在屋檐下,不得不低头,还是好好学吧),在课余时间参加一些竞赛科研,可能是一种通解。 16 | 17 | ### 通解 18 | 19 | 以下内容参考了 [对西北工业大学 2019 新入学的学弟学妹们有哪些建议?](https://www.zhihu.com/question/335528283/answer/822906862?utm_source=qq&utm_medium=social&utm_oi=1168578543415422976) 的一些回答(知乎用户 @zzzzzfyang,@独钓寒江雪,@摩金,@止戈为武,@Aaron gcx)。 20 | 21 | 1. 大一上:适应NPU的生活和氛围,同时认真学习。(如果有时间,请好好学英语) 22 | 大一上的计算机专业课应该只有**计算机系统基础**,这并不是一门很难的课,但是需要你投入足够的时间精力。(特别当你是一个计算机小白时)。 23 | 如果觉得课程的难度不大,同时计算机基础很不错,可以选择加入基地(足球,舞蹈,ACM)或者加入一个靠谱老师的实验室。如果加入基地,转2,如果加入实验室,转3,如果都没有,转4。 24 | 如果觉得课程压力大或者不喜欢,转5。 25 | 26 | 2. 大一下:学习基地的项目及相关知识,参加竞赛。同时不能放松课程学习。在大一结束获得奖学金,国奖,乃至标兵,转6。 27 | 28 | 3. 大一下:开始科研实习,但是请以学业为主。科研出成果的时间可能远大于竞赛,同时科研路上也容易遇上各种不顺心的事。但是这样的经历可以让你判断自己到底适不适合科研。 29 | 如果一个学期后选择继续,转7,如果特别不喜欢科研,可以选择退出,转8。 30 | 31 | 4. 大一下:大一上就能进入基地或是实验室的人毕竟还是少数,更多的人是在大一下或者大二上才能加入基地。关于加入实验室的时间,我想大二上或者大二下都是一个比较合适的时间。 32 | 在准备加入基地或实验室的同时不能放松学业,还是要以课程为主。如果成功加入基地,转6,如果加入实验室,转7,如果都没有,转8。 33 | 34 | 5. 大一下:可能你并不太适合计算机,你可以考虑了解一些别的专业,或者考虑别的出路,如选调考公,转专业等。之后的事情就在笔者知识盲区中了。 35 | 36 | 6. 大二:大二的同学通常是基地比赛的主力,在参加比赛之余,继续好好学习课内知识。 37 | 同时你可能对于未来的方向有了更清晰的认识。在大二选择加入一个靠谱老师的实验室去独立做研究可能也是一个好的选择,进实验室后可以选择退出基地,也可以不退。不退出转9,退出转10。 38 | 39 | 7. 大二:继续实验室搬砖,保持一个较高的gpa。或者去联系一些外校的牛导,做远程实习。或者去申请暑研。转10。 40 | 41 | 8. 大二:在大二上,在保证学业的基础上,可以选择加入基地。如果加入基地,转9,如果不加入基地,那么后续好好学习,准备保研就可。 42 | 43 | 9. 大三:大三上,你可能还需要在基地付出一些工作。大三下,准备保研or出国。方法参考具体文档。 44 | 45 | 10. 大三:你应该对于科研有了一定的认识,更进一步,你的课题也许已经完成度很高。大三上,积极投身科研,利用好寒假时间,看看能不能出成果。大三下,根据自身情况,选择继续科研或者转战准备保研。 46 | 47 | 11. 大四:如果保研或者出国深造,那么大概率你的大四已经被老板安排好了,服从安排即可。如果不深造,好好找工作。 48 | 49 | ### 大一新生面临的五大困难 50 | 1. 离家远没人管,自律差 51 | 2. 没有目标,没人带领 52 | 3. 不会安排,老做一些重复无意义的事情 53 | 4. 做题家思维,认为认真学习课本 考试考高分就一定牛逼 (虽然在一些大学评价体系中,分数高确实就被认为是牛逼) 54 | 5. 不会利用自身资源 和学校平台资源获得更大的进步空间和机会 55 | 56 | ### 如何选择靠谱的老师 57 | 58 | 老师给与学生的帮助大致有4种方式: 59 | 60 | 1. 直接给予技术上的指导,手把手教代码(一般来说这种情况很罕见) 61 | 2. 与学生讨论idea,有细节上的讨论,老师懂你正在做的东西,有时老师可以提出建设性的建议。 62 | 3. 老师通过自己的connection,给你找了个领域的牛人带你,给你找合作机会。 63 | 4. 提供资金物质上的帮助。 64 | 65 | 所以判断一个老师值不值得你跟也大致可以从这四个方面入手: 66 | 67 | 1. 老师是年轻ap(assistant professor)。那么可能会在具体代码上,提供更多的指导。 68 | 2. 老师本身是领域大牛,(**和同行相比**,总引用高,H指数高,代表作出名,有拿过best paper),那么老师的connection可能会很好,会认识很多牛人,给你带来很多机会。 69 | 3. 如果老师组很有钱,那么你在做实验的时候大概率不会担心机器资源不够用。 70 | 4. 最普适的一点,向老师的研究生打听,看老师已经毕业学生的去向如何。 -------------------------------------------------------------------------------- /docs/杂文/README.md: -------------------------------------------------------------------------------- 1 | # 杂文篇 2 | 3 | 杂文篇收录了一些反思、经验、感悟,或者是暂未分类的内容。 4 | 5 | 希望能够帮助到大家。 6 | 7 | 1. duk's cs-intro: [duk的cs入门指南](https://als0-ran.github.io/cs-intro) 8 | 1. CS自学指南: [https://csdiy.wiki/](https://csdiy.wiki/) 9 | 1. [如何看待本科生科研--国内首篇本科生HPCA](https://www.zhihu.com/question/457315333/answer/1871259279) 10 | 11 | 4. [计算机系统能力--CPU,OS,Compiler全家桶](https://www.zhihu.com/question/377489812/answer/2371430840) 12 | 5. [鸡汤--从职高到MIT CS phd](https://zhuanlan.zhihu.com/p/360390223) 13 | -------------------------------------------------------------------------------- /docs/杂文/duk's_cs-intro.md: -------------------------------------------------------------------------------- 1 | # CS 入门指南 2 | 3 | > 转载自[duk的cs入门指南](https://als0-ran.github.io/cs-intro/) 4 | 5 | ## 1. 前言 6 | 7 | 这是一份给“小镇做题家”的CS入门指南。 8 | 9 | 这是我从"小镇做题家"到变成CSer的经验,也是对我本科三年的一个总结,希望能为那些还未进入CS大门的"做题家"指个方向,不过因为每个人的情况不尽相同,这份指南仅作参考。 10 | 11 | 目前规划了以下部分: 12 | 13 | * 从CS入门到放弃:从高中到大学的转变 14 | * CS中的宝刀:必学工具 15 | * 其他推荐 16 | 17 | ### 1.1 启蒙 18 | 19 | 大一刚入学时,我还是个对编程一窍不通的小白。军训的时候,按着从二手书店买了的《c语言从入门到精通》在自己电脑上折腾上古时代的宝贝:VC 6.0 ,对着谭浩强的c程序设计敲着Hello World,每天和OJ上的字符串操作和数列求值打的难舍难分。本来觉得靠着竞赛和高中数学的底子,在大学可以成为一个不错的大学生,但是这一次的浅尝辄止的自学c语言经历给了我当头一棒。等到开课后,用着老师提供的code::blocks,抄着不知所云的程序,仰望着OI爷们和老师争辩。提到编程,脑子里只有打开一堆英文软件,新建一个文件,运行一个从来没见过的黑窗程序。整个课程都在和OJ斗争,到最后只能把流传以久的学长代码CV上去,最后的程序设计大作业,也是从网上东抄抄西凑凑才搞定的。可以说,半个学期的的程设课,磨灭了我对计算机的任何想法,听着周围同学讨论着链表,DFS那些我从未听过的名词,大作业用着Qt,OpenGL以及MFC这些完全没接触过的技术,甚至有想过转专业。后来开设的计算机系统基础,也给了我的信心沉重的打击,时至今日,对于系统基础第一次课ppt所提出的[问题](https://nju-projectn.github.io/ics-pa-gitbook/ics2021/why.html),到大三结束也才勉强搞懂,混着混着一学期就过去了。临近考试,转机似乎来了,抱着临阵磨枪的心态点看了袁春凤老师的慕课,听着听着好像自己对寄存器、堆栈有了点感觉,这也是我第一次主动去寻找,自此似乎打开了一扇大门。 20 | 21 | ### 1.2 摆脱 22 | 23 | 有了大一第一学期的经验后,似乎摆在自己面前的路又多了一条:自己动手丰衣足食。彼时,我还处在高考的思想"荼毒"下,脑子里只有分数,坚信着只要理论搞懂,考试考个不错的分数就挺好的。的确,对于高考,这样的想法没什么问题,但是对于大学,这种思想真的会害你还得很惨,缺少实践的学习如同无本之木,尤其对于像计算机这样的工科来说。从数据结构这门课开始,我似乎对这种"高考化"的想法有了些抗拒,明明理论课上链表、栈、二叉树这些数据结构一看就懂,为什么实验课会举步维艰呢?而当我面对着一个高精度求圆周率值敲了一天还没Accept时,我才真正的认识到代码能力对CSer的重要。当你肯花一整天把某个数据结构手撸一遍时,当你肯一边一边的调试着原因不明的段错误时,当你愿意把自己的想法用代码实现时,才算真正的步入了CS的大门。很重要的一点,去高考化!高中和大学是不同的两个阶段,也许你可以带着高中的思想完成大学的学业,甚至拿到推免资格,但当你步入社会,谁会看得起一个只能考高分的"卷王"呢?不可否认,当今大学的去高考化做的真的不好,甚至说高考化成为一个风向。大家带着高中时被过度强化的训练和扭曲的价值观(部分)来到大学,而大学提供着陈腐乏味的教程(百年不变的培养方案)和稳固的舒适区(祖传的大作业和往年考题),更可怕的是。**而当你想要实现自己的远大抱负,去改变这个世界时,你会发现你好像什么都做不了,你该用什么去改变世界?** 是考试周前做两套往年题还是大作业照搬学长的代码?我想,如果真的想改变世界,不妨从现在开始先摆脱高考化的思想,做大学高考化潮流下的中流砥柱吧。(借用南大JYY老师的一页ppt,[bilibili](https://space.bilibili.com/202224425),强烈推荐jyy的操作系统课程)请务必牢记:**大学四年留给你的是你的人生,在你毕业之时,那一串苍白的分数其实就已经作废了。** 24 | 25 | ![1659713643857](image/intro/1659713643857.png) 26 | 27 | ### 1.3 真正的开始 28 | 29 | 经历了大一的阵痛和迷茫后,我似乎更能理解这个专业了,大类分流靠着大一不算摆烂的GPA压线进了CS。虽然是专业吊车尾,但我似乎对自己的期望不再完全是成绩了,**比成绩重要的东西可太多太多了**,我希望自己能真正的把自己学到的东西用起来,转化为生产力,或者是希望能学到真正有用的东西。靠着兴趣,暑假自学了python和C++的面向对象,期望着能靠着这些做出一些东西来。巧合的是,开学两周的信息技术实践课实践的就是爬虫,靠着两个月的自学很轻松的完成了项目(甚至还帮几个同学写了大作业),我才第一次认识到原来靠自学就可以完成"这么大"的项目,也才开始摒弃被动接受的思维,转为主动寻找。就这样,抱着玩一玩加培养自己的能力的心态,我加入了软件基地和智能车基地,可以说大学里对我影响最大就是加入基地:见识到了很多大佬学长,通过在基地的实践掌握了如何快速学习一个新东西的能力,也真真实实的把自己的能力用到了项目上。从第一次看自己智能车动起来到校赛前折戟,再到被WYL学长拉去队友,再到住在基地调PID和陀螺仪滤波,再到去重大参加西部赛。这一路走来,感觉自己真的成长了不少,对自己的去高考化也越来越彻底,暑期报名了ASLP的实习,亲手调教人工智能,让它可以想正常人一样说话,和队友一起体验了"科研"的感觉,面对曾经望而却步的试点班也可以鼓起勇气去参加... 从某种意义上来说,我的大学是从大二开始的,从那时开始,我一直在告诉自己,**就算你把课本上的内容搞得再烂熟,绝不代表你真正对这门课能有什么理解,相反,那些真正理解的人,却不一定能针对考点答出高分**,不要为了那些微不足道的分数而放弃自己的未来(但这也不是摆烂的借口)。 30 | 31 | ### 1.4 To Be Continued 32 | 33 | "往者不可谏,来者犹可追。"我们当中太多人已经习惯于沿着那一成不变的“典型成功道路”前进,彷佛所有人的终点都是一样,前往终点的道路也只有一条。我们走上了某条道路便只顾着赶路,甚至都没有空停下来看看是否终点不只有一个,道路不仅有一条。我们只看到有人走了捷径,却没有发现正是这些人中间停下了脚步,花了更多的时间来选目标和选路,然后更快地完成罢了。他们的方式更有效率。一位伟人说过:“**一个人的命运,既要考虑个人的奋斗,也要考虑历史的进程。**”只顾个人奋斗却不顾历史进程也会使你在错误的道路上朝着错误的目标越走越近。在前行的道路上,我们随时都可以停下思考和观察,修正自己的目标或是看看有没有新出现的路。有时候你看不到路,不是因为路不存在,只是你不知道。回首三年大学时光,我一直保有一种强烈的对知识和技术的虔诚。这份虔诚迫使我重新思考每天那本应"司空见惯"的生活;也是这份虔诚让我以我认为正确的方式贯彻自己的追求。在大三升大四的这个暑期,在公司实习的时候,回想自己三年的大学经历,略有不舍,便想着将他记录下来(也是为了工作摸鱼)。一方面,我希望我能为那些像我一样压抑中的灵魂尽一点义务。另一方面,也希望这能成为推动各种不合理制度进步的一种动力。**我们每个人心中总要有些英雄主义**,**不是吗?** 34 | 35 | ## 2. 从入门到放弃 36 | 37 | ### 2.1 放弃高考思维 38 | 39 | 我们的体制总倾向于用一个量化的分数来概括衡量一个人。这一体制在高考中登峰造极。在大学里,我们也会面临无数定量的评分机制:从各科考试、综合测评、到毕业出国、读研、工作. . . 都少不了和分数打交道。面对这些分数,我们必须保持头脑清醒:**如果一个人把政策评分作为自己的至高追求,那么他就是这个政策的牺牲品。** 但是你要知道,分数并不能说明什么,它完全不能说明你对于这门课内容的掌握情况,这是因为信息不对称导致,你所掌握的能力是为了在考试中获得更高的成绩而不是掌握这门课内容本身,相反,许多在这门课上造诣很深的人反而拿不到很高的分数。你需要时刻牢记,你的分数在你毕业之后都已作废,分数的确是通往更高平台的通行证,但是**与你本身的能力却是无关的** 。 40 | 41 | ### 2.2 放弃被动思维 42 | 43 | 进入大学后,没有人会再为我们自己的行为负责,所以不管做什么都要想清楚自己为什么而做。每天迫于各种压力,毫无主见地忙碌着,可称得上人生一大悲哀。但是很多时候我们并不能,我们无法回答出自己为什么每天都要去上课,如果去上课仅仅是为了回答老师的点名的话,正如我之前所说,分数的意义在毕业后就不复存在,那么,如果存在一些可以不去上课而获得一个相对满意的分数,如果不去上课可以做一些更有意义的事情,如果我们所感兴趣的知识并没有课程能够涉猎,这时候我们还需要去上课吗?**如今大学所谓的自由,只是选择上的自由,在大学现行的宽松制度下,你可以自由选择自己想做的事去做。正确的浪费剩余的时间!** 44 | 45 | ### 2.3 放弃"连续"的思维 46 | 47 | 扯了这长篇幅废话,终于要来点"学术"上的东西了。 思考一个问题,已知 48 | 49 | $$ 50 | a_n=2a_{n-1}, a_0 = 1, 51 | $$ 52 | 53 | 求$a_5$的值,很简单吧,看一眼就能得出答案,但如果假设你是一个计算机,你该怎样计算呢?计算机可没办法一眼看出通项公式是 54 | 55 | $$ 56 | a_n = 2^n 57 | $$ 58 | 59 | ,他能做的就是一次次迭代(不考虑优化): 60 | 61 | ``` 62 | a_pre,a_next = 1,0 63 | for i=0:5 64 | a_next = a_pre*2 65 | a_pre = a_next 66 | 67 | ``` 68 | 69 | 计算机并不是连续的,而我们高中时的思维是连续,这也是很多人最开始程设觉得难的原因。往深的说,程序乃至整个计算机系统都是一个[状态机模型](https://zhuanlan.zhihu.com/p/47434856),对于程序设计语言来说,变量(对象)的值是状态,而当中的控制流就是描述状态如何转移,对于计算机系统来说,状态便是寄存器和内存,汇编指令则是在描述状态的转移。值得一提的是,在某种程度上,这两个状态机是等价的,甚至存在转换工具(编译器)。如果从开始接触CS是就有了状态机的概念,并在以后的学习不断强化理解他,这样你就嫩很快理解CS这门学科(大部分的东西都与状态机有关)。**务必牢记,任何程序都是一个状态机**。 70 | 71 | ## 3. 必学工具 72 | 73 | ### 3.1 写在前面的话 74 | 75 | **(1)远离CSDN和百度** 76 | 77 | 如果你坚持要用,你将很有可能会碰到以下情况之一: 78 | * 搜不到相关结果, 你感到挫败 79 | * 搜到看似相关的结果, 但无法解决问题, 你在感到挫败之余, 也发现自己浪费了不少时间 80 | * 你搜到了解决问题的方案, 但没有发现原因分析, 结果你不知道这个问题背后的细节 81 | 82 | 如果你不想在一堆相互抄来抄去的文章和广告里寻找自己想要的东西,就去试试bing和Google。一个很形象的比喻,在CSDN和百度上找东西就像是在垃圾堆里面找宝贝。已我最近工作时查找的问题为例: 83 | 84 | ![1659755774245](image/intro/1659755774245.png) 85 | 86 | ![1659755982620](image/intro/1659755982620.png) 87 | 88 | 百度的给我提供的东西只能说是毫无关系,而谷歌第一个就是相关的问题,如果你打开第一个StackOverflow的链接,你可以发现回答者从Qt源码级指出了问题并提供了解决方案。 89 | 90 | 也许一次这样的差距并不能决定什么,也许百度/CSDN会给你提供一个不知道为什么的解决方案... 但长久下去,别人每次都能从搜素中获取知识,而你每次只能复制一堆不知道是啥的命令去执行暂时的解决问题,差距不就有了吗? 91 | 92 | 你可能会觉得"可以解决问题就行, 不需要了解问题背后的细节"。 但对于一些问题(例如编程问题), 你了解这些细节就相当于学到了新的知识, 所以你应该去了解这些细节, 让自己懂得更多。如果谷歌能以更高的概率提供可以解决问题的方案, 并且带有原因分析, 你应该没有理由使用百度来搜索技术问题。 **如果你仍然坚持使用百度, 原因就只有一个: 你不想主动去成长。** 93 | 94 | **(2)避免中文关键词** 95 | 96 | 可能大伙都很不喜欢那种说话夹带着英文的人,但没办法,在CS里,无论是起源还是发展似乎都是西方主导(希望以后你们能改变现状),很多东西由于历史原因翻译出来很怪很不直观,比如说handle被翻译成了句柄(反正我第一眼看过去不知到是啥),甚至于有些关键字有不同的翻译,所以为了避开这些问题,建议使用英文关键字,对自己以后的科研(如果想的话)也是大有裨益的。 97 | 一般来说, 百度对英文关键词的处理能力比不上Google。 98 | 通常来说, 英文维基百科比中文维基百科和百度百科包含更丰富的内容。 为了说明为什么要使用英文维基百科, 请你对比词条前束范式分别在百度百科, 中文维基百科和英文维基百科中的内容。 99 | 100 | **(3)RTFM,STFW,RTFSC** 101 | 102 | 某种意义上,这三个词是CS里面的圣经。 103 | 104 | * RTFM : Read The ~~Fucking~~ Friendly Manual 去读手册 105 | * 手册包含了查找对象的所有信息, 关于查找对象的一切问题都可以在手册中找到答案。 106 | * STFW : Search The ~~Fucking~~ Friendly Web 去网上搜 107 | * 在向别人求助之前自己先尝试通过正确的方式使用搜索引擎独立寻找解决方案 108 | * RTFSC: Read The ~~Fucking~~ Friendly Source Code 去读源码 109 | * **源码之下,了无秘密** 110 | 111 | 想了解[更多](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md#rtfm-%E5%92%8C-stfw%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E4%BD%A0%E5%B7%B2%E5%AE%8C%E5%85%A8%E6%90%9E%E7%A0%B8%E4%BA%86)可以点进去看看,以及推荐[如何读手册](https://nju-projectn.github.io/ics-pa-gitbook/ics2021/1.7.html)。 112 | 113 | **(4)如何面对问题** 114 | 115 | 在大学里,除了老师/助教**没有人有义务去替你解决问题**。 116 | 117 | 你可能会遇到很多问题, 比如: 118 | 119 | * 不清楚某个工具的用法. 120 | * 不清楚某个功能实现的思路. 121 | * 编译/链接代码时出现警告或报错. 122 | * 程序输出的结果和你的预期相去甚远. 123 | * 其他各种各样的问题…… 124 | 125 | 与其说, 遇到问题是一件很正常的事, 不如说, 没遇到问题才是一件不正常的事情. 126 | 127 | 面对问题时,不要: 128 | 129 | * 抱着应付的态度, 遇到问题时随便改改自己的代码, 能过测试用例就万岁了. 130 | * 发现随便改改也没用, 于是直接找大佬/助教/老师求助, 不加任何思考. 131 | * 求助的时候问一些相当没价值的问题, 比如: “我的程序出错了, 怎么办”. 132 | 133 | * 想象一下你的电脑小白朋友, 三天两头来问你 “我电脑坏了, 怎么办?”, 同时完全不说到底发生甚摸事了, 你还能否保持低血压的健康生活. 134 | * 在某些国内网站上一通乱搜, 找到了另一些国内网站上的低质量内容, 大抄特抄. 135 | 136 | * ~~然后丝毫没有意识到, 自己在几天后遇到的某个问题就是因为抄了垃圾代码而导致的~~ 137 | 138 | 你应该: 139 | 140 | * 不放过任何一个问题, **包括编译代码时的警告** . 141 | * 遇到问题时对背后的原因多加思考, 找出它的深层原因. 142 | * 独立解决问题, ,同时 **不要怕尝试, 不要怕 debug** , 你会在这个过程中学到相当多的东西, **善于提出问题固然很棒,但更难能可贵的是自己解决**. 143 | * 遇到自己解决不了的问题: **STFW,RTFM**, **RTFSC** 搜索引擎和文档/手册里通常能找到绝大部分问题的答案, 如果没有, 源码里一定会有. 144 | * 学会摆脱对百度的依赖, **在 Google/Bing 上用英文搜索问题** . 中文互联网什么样相信各位心中自有 B-tree 145 | * 去各种网址上提问:诸如Stackoverflow,知乎(也有很多大佬)都提供提问功能,甚至于去Github/Gitee上提一个Issue寻求原作者的帮助也是可以的。不过在提问是要注意提问的方法,当你拋出一个技术问题时,最终是否能得到有用的回答,往往取决于你所提问和追问的方式。很推荐读一读[提问的艺术](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)以及[别想弱智一样提问,](https://github.com/tangx/Stop-Ask-Questions-The-Stupid-Ways/blob/master/README.md)学会如何提问对提问者和被提问者都是件好事。 146 | 147 | 如果你在解决问题的过程中实在坚持不下去了, [听听尼尔叔叔的鼓励](https://www.bilibili.com/video/BV1Fi4y1t7uG)(手动狗头). 148 | 149 | **(5)The Missing Semester** 150 | 151 | 考虑到大学中可能并不会专门讲授一些常识性的内容 (但显然**这不合理** ), 这些现象的出现也情有可原. 但在开始大学之前, 你必须对此有一个最基本的认识, 否则在你面前的, 将会是一条通往地狱的路。 152 | 153 | 我强烈推荐抽一些时间, 学习一下 MIT 的 [The Missing Semester of Your CS Education](https://missing.csail.mit.edu/),这会对后来的学习有很大帮助。 154 | 155 | ### 3.2 翻墙 156 | 157 | 由于一些众所周知的原因,谷歌、GitHub 等网站在大陆无法访问。然而很多时候,谷歌和 StackOverflow 可以解决你在开发过程中遇到的 95% 的问题。因此,学会翻墙几乎是一个内地 CSer 的必备技能。因为这个话题比较敏感,有需求的话可以考虑某些开源项目 158 | 159 | * [https://github.cm/freefq/free](https://github.com/freefq/free) 160 | * [https://github.com/bannedbook/fanqiang](https://github.com/bannedbook/fanqiang) 161 | * [https://github.com/Alvin9999/new-pac](https://github.com/Alvin9999/new-pac) 162 | 163 | PS:打个小广告, 个人自用[VPN](https://sodacloud.pw/auth/register?code=FzGQ),25r/季度,不限带宽,最多支持3设备。点此注册我会获得10%你充值的总额的收益。如果介意,可在注册时去掉邀请码。 164 | 165 | **墙外的世界纷繁复杂,请一定时刻保持清醒的认知,取其精华,弃其糟粕!!!** 166 | 167 | ### 3.3 Git 168 | 169 | Git 是一款分布式的代码版本控制工具(VCS),出自大神Linus之手,据说是因为嫌弃当时主流的版本控制工具太贵又太不好用了就花了十天自己写了一个版本控制工具。不过在介绍git之前,得先知道为什么要做版本控制: 170 | 171 | - **版本存储(正确地)**:经常性地保存项目的改动是一个非常重要的习惯。但是如果没有版本控制系统这个操作将是非常困难的,并且非常容易出错的: 172 | 173 | - 你到底改动了什么?仅仅是针对一些特定文件的改动还是整个项目?首先你必须及时并小心地审查整个项目的每一个可能的改动细节,然后你需要付出大量且并不必要的时间来整理它。 174 | - 你如何命名这些版本? 你也许会定义一个比较容易理解的通用命名规则(比如“xx-2022-08-06-v22”)。然而一旦涉及到一个多样性的改变,仅仅通过名字是很难追踪和判断这些改动的。与此同时你也会收获到一批看着心烦的前版本文件。 175 | - 你如何知道版本之间的改动?这也是最重要的问题,很少会有人把改动记录到诸如README这样的文件里(细琐重复的事情应该让程序来做,不是吗?) 176 | - **协同开发:** 试想一下,如果没有版本控制系统,当你需要处理那些共享文件夹中的文件时,你必须告知所有开发者,你正在对哪些文件进行编辑;与此同时,其他人必须要避免与操作相同的文件。这是一个不现实和完全错误的流程。当你花了很长时间完成你的编辑后,可能这些文件早已经被团队里的其他开发成员修改或者删除了。 177 | - **恢复之前的版本:** 要把一些文件恢复到上次改动之前的版本(甚至整个项目恢复到之前的版本)。这可能意味着你发现了一些严重的问题!如果你确定那些改动是错误的或者是没有必要的,那轻松的点几下你就可以简单地撤销它。在项目的每一个重要阶段,认识和正确地使用撤销这个功能会让你的工作变得非常轻松。 178 | 179 | 一些你需要知道的Git基本内容: 180 | 181 | * **初始化 Git 仓库:** 在仓库目录中 `git init`. 182 | * **忽略部分文件的更改:** 在对应目录中放置 `.gitignore` 文件, 并在该文件中添加需要忽略的文件的规则. 183 | * **查看仓库状态:** `git status`. 184 | * **暂存更改:** `git add 文件名`, 或 `git add -A` 暂存全部更改. 185 | * **提交更改:** `git commit`, 此时会弹出默认编辑器并要求你输入提交信息. 也可以直接执行 `git commit -m "提交信息"`. 186 | * **添加远程仓库:** `git remote add 名称 仓库URL`. 187 | * **推送本地提交到远程:** `git push`. 188 | * **查看所有提交记录:** `git log`, 你可以从中看到某个提交的哈希值. 189 | * **把仓库复位到某个提交的状态:** `git reset 提交的哈希值`. 190 | * **从当前提交新建分支并切换:** `git checkout -b 分支名`. 191 | * **切换到分支:** `git checkout 分支名`. 192 | * **删除分支:** `git branch -D 分支名`. 193 | 194 | 上面提到了 `.gitignore` 可以让 Git 忽略目录中某些文件, 且不让它们出现在 Git 仓库中. 这有什么用呢? 195 | 196 | 你在开发过程中难免会产生一些 **“只对你自己有用”** 且 **“不值得永久保留”** 的东西. 比如你在开发的过程中希望写几个简单的输入来测试你的程序, 或者验证你程序里的某处是否写对了, 于是你新建了个名字叫 `test.txt` 的文件, 里面写了一些测试的内容, 然后你在本地调试的时候会让你的程序读取这个文件. 197 | 198 | `test.txt` 显然只是个用来存放写一些只对你自己有用的临时内容的文件, 你不希望让 Git 每次都记录这个文件的更改 (因为没意义), 所以你可以把它写进 `.gitignore` 中, 来让 Git 忽略它. 199 | 200 | 其他类似的情况还包括, 你使用 VS Code 或 IDEA 开发你的编译器, 这些代码编辑器/IDE 可能会在项目中生成一些配置文件 (`.vscode` 或 `.idea`), 这些文件通常也是不需要被 Git 记录的, 因为其中包含了你的一些个人配置. 201 | 202 | 推荐两个网站,强烈推荐第一个,真的很好玩: 203 | 204 | * [Learn Git Branching](https://learngitbranching.js.org/). 205 | * [Git 快速入门](https://nju-projectn.github.io/ics-pa-gitbook/ics2021/git.html). 206 | 207 | ### 3.4 Linux 208 | 209 | Linux指的是操作系统内核,基于这个内核开发的操作系统叫做Linux的发行版,比较有名的发行版包括:Ubuntu、RedHat、CentOS等,对于CSer来说,为什么Linux会比Windows更好一点: 210 | 211 | * 一些开发只能基于Linux进行,比如ROS。 212 | * 在Windows下安装一些包/环境需要下载安装包并手动配置环境变量,而在Linux上只需apt install xxx(不要花太多时间和精力在配环境上)。 213 | * 有些Tool-kit在window下虽然显示安装完成了,但当你使用的时候就会报错,比如在windows下配置CUDA took-kit,安装完成后,使用nvcc -v是可以正常工作的,但当你真的用nvcc去编译CUDA文件时会报错,找不到cl.exe。 214 | * 在Linux下你可以很轻松的通过man来RTFM,具体可以参考[man入门教程](https://nju-projectn.github.io/ics-pa-gitbook/ics2021/man.html),而在windows虽然也支持man,但是手册的内容很干燥,请自行对比。 215 | ![1659844486095](image/intro/1659844486095.png)![1659844518755](image/intro/1659844518755.png) 216 | 217 | "那我可以从哪下载linux呢?",最简单方式是通过VM,采用虚拟机来运行Linux,至于Vmware的安装及Ubuntu(或者其他的发行版)镜像的下载请自行STFW。虚拟机是最简单的解决方案,但如果你不玩某些游戏(具体我也不清楚,只知道他们和Hyper-V冲突),我强烈推荐试试WSL 2以及WSLg,WSL指的是Windows Subsystem for Linux,通过WSL+vs code的方式可以很高效的完成Linux上的开发,这是[官方文档](https://docs.microsoft.com/zh-cn/windows/wsl/)以及[awesome-wsl](https://github.com/sirredbeard/Awesome-WSL),有兴趣的可以体验体检 (强推)。还有一种方式是直接在物理机上安装Linux的发行版,缺点是很麻烦,需要自己制作系统引导盘,还会碰到一些莫名其妙的问题,但优点就是你可以使用最原生的Linux,同时也可以体验一次在物理机上安装系统的过程。虽然学习计算机专业不是为了修电脑装系统, 但如果你连系统都没装过, 也确实不太好意思跟亲戚说你是学计算机的. 现在机会来了, 如果你以前真的从来没有安装过操作系统, 我们强烈建议你装一下真机, 来了解一下安装操作系统都需要经历些什么. 218 | 219 | 入门Linux很重要的一件事就是习惯命令行(CUI),命令行所有的黑客都使用的黑色窗口。它可能刚开始看上去有点吓人,但事实上它只是等待你的命令提示符。尽管很多事情完全可以通过图形化界面(GUI)点点鼠标来完成,但如果你接受了了命令行的操作方式,你会获得: 220 | 221 | * ~~看起来很炫酷的交互方式(装X)~~ 222 | * 对系统更强的掌控力:应用程序通常无法满足 power user 的全部需求 223 | * 生产系统的事实标准:Linux, macOS, Windows, ...运维基本都靠命令行工具 224 | * 来自开源社区的礼物:非常丰富、可定制、看得见源码的软件栈 225 | * 对计算机系统更深层次的了解:通过各类工具(strace、gdb等)了解软件是工作的,~~通过命令行和70年代的程序员交流~~ 226 | 227 | 一些你需要知道的命令行基本内容: 228 | 229 | * **运行当前目录下程序:** `./程序名`. 比如你通过gcc编译链接了一个a.out文件,就可以通过 ./a.out 来运行这个程序。 230 | * **查看上一条命令的返回值:** `echo $?`. 比如你可以在 Shell 中执行 `命令; echo $?` 来运行一个命令, 同时输出它的返回值. 231 | * **重定向输出:** 你希望把某命令输出到标准输出 (`stdout`) 的内容重定向到文件里, 可以执行 `命令 > 输出文件`. 例如: `ls > output.txt`. 232 | * **重定向输入:** 你希望把某个文件的内容作为某个命令的输入内容 (`stdin`), 可以执行 `命令 < 输入文件`. 例如: `wc -l < input.txt`. 233 | * **管道:** 你希望运行多个命令, 将前一个命令的标准输出作为后一个命令的标准输入, 可以执行 `命令1 | 命令2 | ... | 命令n`. 例如: `cat hello.txt | grep "hello" | wc -l`. 234 | 235 | 一些常用命令: 236 | 237 | * `cd 目录`: 切换到目录. 238 | * `pwd`: 输出当前目录. 239 | * `ls`: 输出当前目录下所有的文件. 240 | * `mkdir 目录`: 新建目录. 241 | * `cp 源文件 目标`: 把源文件复制到目标. 242 | * `mv 源文件 目标`: 把源文件移动到目标. 243 | * `rm 文件`: 删除文件. 244 | * `man 命令`: 显示命令的使用方法. 245 | 246 | 推荐 247 | 248 | [Linux 入门教程](https://nju-projectn.github.io/ics-pa-gitbook/ics2021/linux.html) 249 | 250 | [命令行的艺术](https://github.com/jlevy/the-art-of-command-line) 251 | 252 | ### 3.5 Github: 拥抱开源 253 | 254 | 从功能上来说,GitHub 是一个在线代码托管平台。你可以将你的本地 Git 仓库托管到 GitHub 上,供多人同时开发浏览。但现如今 GitHub 的意义已远不止如此,它已经演变为一个非常活跃且资源极为丰富的开源交流社区。全世界的软件开发者在 GitHub 上分享各式各样种类繁多的开源软件。大到工业级的深度学习框架 PyTorch, TensorFlow,小到几十行的实用脚本,既有硬核的知识分享,也有保姆级的教程指导,甚至很多技术书籍也在 GitHub上开源,所以闲来无事去逛逛 GitHub吧, 用好 [Github 的 “Awesome” 系列](https://github.com/search?q=awesome)。 255 | 256 | 如果你还从未在 GitHub 上建立过自己的远程仓库,也没有克隆过别人的代码,那么我建议你从 [GitHub的官方教程](https://docs.github.com/cn/get-started)和这份[CheetSheet](https://github.com/tiimgreen/github-cheat-sheet)开始自己的开源之旅。 257 | 258 | GitHub 之所以成功,我想是得益于“我为人人,人人为我”的开源精神,得益于知识分享的快乐。如果你也想成为下一个万人敬仰的开源大佬,或者下一个 star 破万的项目作者。那就把你在开发过程中灵感一现的 idea 化作代码,展示在 GitHub 上吧~[How to contribute to opensource](https://github.com/freeCodeCamp/how-to-contribute-to-open-source/blob/main/README-CN.md) 259 | 260 | 不过需要提醒的是,开源社区不是法外之地,很多开源软件并不是可以随意复制分发甚至贩卖的,了解各类[开源协议](https://docs.github.com/cn/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository)(比如本项目采用的是Do What The F*ck You Want To Public License)并遵守,不仅是法律的要求,更是每个开源社区成员的责任。 261 | 262 | ### 3.6 程序设计语言与开发环境 263 | 264 | 首先声明,所有的语言都是世界上最好的语言,有差别只是写他们的程序员。我接触过的编程语言很多,比如C\C\++,Python,Java,Go,Rust, JavaScript,Shell以及格式各样的汇编,从我个人的角度推荐,,面向对象的语言(典型的C++,Java,Python)自不必说,作为CS学生至少掌握一门系统级语言(C\\C++,Rust)不过分吧?掌握一门脚本(python JavaScript)语言平常写写脚本偷偷懒,想要早点找工作那Java和Go至少得2选1,最后无论你想学什么语言,请记住,他们都是在描述某种状态机,这些状态机最终都要在编译器/解释器的转换下,变成真正数字电路上的状态机(机器语言)。如果有兴趣,不妨来看看[Hello World in every computer language](https://github.com/leachim6/hello-world)。 265 | 266 | 如果你已经学习或者了解过C/C++, 就有一个很重要的概念需要知道(但按照我和身边人的经验,大部分人直到毕业也没有听过),[Undefined Behavior](https://en.wikipedia.org/wiki/Undefined_behavior),**未定义行为**是标准(C/C++)没有明确规定的行为。简单来说,就是你写的代码编译器没有报错,但C/C++标准没有规定这些代码应该怎样执行。“那我的代码里如果有UB会发生什么呢?”,Emm....什么可能发生,~~比如你系统盘被程序格式化了~~(不过在操作系统的保护下,一般不会发生这么严重的问题)。常见的UB包括有符号整型溢出,数组越界访问 (越界访问很经典,如果访问的内存是程序有权限访问的内存,那么你通常会得到一些不知所云的数据,如果是没有权限访问的内存,那么你会收到Segment Fault:段错误。"不过等等,权限又是哪来的?",呃...等你学习了操作系统就清楚了,~~如果再在括号里讲下去有点不尊重括号了~~ ) 等,这是[C](https://gist.github.com/Earnestly/7c903f481ff9d29a3dd1) 和 [C++](https://devtut.github.io/cpp/undefined-behavior.html)的UB列表。 267 | 268 | 还记得前面提到的状态机吗?如果从状态机的视角来看,正常的指令或者说定义行为是明确指出了状态机的状态转移方式,每次的状态转移都是固定,而UB并没有明确指出状态机怎样进行状态转移,换言之,转移到任意状态都是被允许的(最后到底转移到什么转态是由编译器,硬件等决定的),这样就是执行UB后程序什么都可能发生的原因。可以说正是因为UB的存在,程序状态机的终态被不合法的变成了多个,所以在编程时应避免UB(但不是消除,存在即合理,总有人可以利用UB写出一些很Fancy的程序)。 269 | 270 | 现代编译器可以利用 UB 进行一些非常激进的优化(这也是为什么含有UB的代码执行起来什么都有可能发生的原因)。比如, 编译器可以假定程序永远都不会发生 UB, 然后标记 UB 出现的位置是不可达的, 最后删掉不可达代码。经常有所谓的 “老一辈人士” 给你一些 “忠告”: 编译 C/C++ 的时候优化不能开到 `-O3`, 编译出来的程序会出问题, 因为编译器有 bug——这种说法基本就是扯淡, 因为虽然编译器确实会出现 bug, 但你遇到 bug 的概率总体来说还是很低的。程序出问题的原因几乎都是代码写出了 UB, 然后被编译器给优化飞了。解决这个问题的最好办法是,不要写出 UB。 271 | 272 | 大部分程序设计语言对开发环境有要求,而开发环境并不完全是IDE(Integrated Development Environment,集成开发环境)。首先要明白,理论上你可以用记事本写任何程序,但没有对应的开发环境或者环境有问题(缺少必要的库,版本等)是没有办法将程序运行起来。在这有必要说明一些程序是怎样运行起来,我们写的程序本质上都是文本文件(不用管什么后缀,都是文本文件),但计算机是不能执行普通的文本文件的(.sh/.bat 除外),因此在执行前需要将其翻译成一种可以被计算机执行的形式(可执行文件),而完成这份工作的便是编译器。一般来说,有两种翻译方式,第一种是像C语言一样,在执行前就将所有的代码翻译为机器语言,第二种是像python这样,翻译一条语句,执行一条。两者最直观的区别就是第一种会在编译时报错,而第二种会在运行时报错。如果想要深入了解编译器是如何工作的可以去学习编译原理这门课。 273 | 274 | 一般来说,最简单的配置开发环境方式就是安装IDE,但切记IDE并不是唯一的解决方案。很多 IDE 是为大型工程项目设计的,体量较大,功能也过于丰富。其实如今一些轻便的文本编辑器配合丰富的插件生态基本可以满足日常的轻量编程需求。个人常用的编辑器是 VS Code (插件配置非常简单)。当然对于大型项目我还是会采用略重型的 IDE,例如 Pycharm (Python),IDEA (Java),GoLand(Go) 等等(免责申明:**所有的 IDE 都是世界上最好的 IDE**)。 275 | 276 | 推荐: 277 | 278 | * [Python Tutor: Learn Python, JavaScript, C, C++, and Java by visualizing code](https://pythontutor.com/) 可以在这个网站上可视化你的程序 279 | 280 | 对于一些语言的碎碎念: 281 | 282 | * C :程序员拥有极大的自由,想干什么就干什么(编译器不报错的前提下),指针是灵魂,~~指针前面有多少*就代表你是几星级程序员~~。 283 | * C++ : 不是C with Class!也不是C with STL!也不是C with Cin/Cout!更不是C with UB(~~C++的底线~~),多了解一下现代C++吧,推荐 [Effective Modern C++](https://github.com/CnTransGroup/EffectiveModernCppChinese) 284 | * python: 人生苦短, 我用python 285 | * Rust: 高情商: 未来可期,低情商: ~~没人用~~ 小众。Rust把程序员的权力关进了笼子,能通过编译的程序基本都是安全的程序(~~关于rust的编译器给我报了5千多个错误的事~~)。 286 | > 第一阶段:你学会了 C with Classes,然后把各种东西都包装成了 class; 287 | > 288 | > 第二阶段:为了实现多态,你学会了继承、虚函数、多继承和虚继承,然后你用这些技术改写了一些代码,实现了代码重用。你觉得很开心,感觉自己减少了代码量,提高了工作效率; 289 | > 290 | > 第三阶段:你学会了用抽象类作为接口,发现以前的继承关系太复杂,用接口更清晰,于是把代码都改成了单继承+接口。你觉得很开心,觉得自己设计了很好的架构; 291 | > 292 | > 第四阶段:为了实现和使用泛型容器,你学会了模板。你觉得很开心,又进一步提高了代码重用度; 293 | > 294 | > 第五阶段:你了解到了动态分派(Dynamic Dispatch)和静态分派(Static Dispatch),于是你把接口都改成了模板。你觉得很开心,不降低抽象程度却提高了代码执行效率; 295 | > 296 | > 第六阶段:你学会了异常。你觉得有点不爽,异常虽方便,但异常安全(exception safety)太难做到了; 297 | > 298 | > 第七阶段:你学会了移动语义,你觉得很开心,可以用值的形式写出更高效的代码; 299 | > 300 | > 第八阶段:你学会了 unique_ptr,shared_ptr。你觉得很开心,妈妈再也不用担心我写出异常不安全的代码了; 301 | > 302 | > 第九阶段:你注意到了 Rust 这个语言,然后有意无意地在自己的 C++ 代码中贯彻 Rust 的思想,比如多用移动语义、trait、const; 303 | > 304 | > 第十阶段:你学会了模板元编程,SFINAE,并成功地使用不到 30 行代码使编译器输出了 4G 错误信息。然后你用模板实现了一套类型安全的 trait 系统。你觉得很开心,编译器的错误提示终于可以看了; 305 | > 306 | > 第十一阶段:你用 gcc 6 编译了代码,然后用你库的人:what the f*ck??怎么全是 undefined reference?原来他用的是 gcc 4.8。你不得不用 gcc 4.8 重新编译。你发现 gcc 4.8 的 libstdc++ 的 ostringstream 没有实现移动构造函数; 307 | > 308 | > 第十二阶段:你准备把代码部署到服务器上,what the ffffffffffuuuuucccccccc...??!怎么全是 segfault???!!原来服务器的系统是 CentOS 6,libstdc++ 版本太低不兼容 C++11……你不得不在服务器上装了 gcc 4.8。后来你学会了静态链接 libstdc++; 309 | > 310 | > 第十三阶段:你再也不想用 C++ 了。你读了《Object Oriented Programming in ANSI C》和《Inside the C++ Object Model》,然后用 C 改写了全部代码,并实现了一套使用 virtual function 机制的动态分派系统; 311 | > 312 | > 第十四阶段:你用宏把动态分派全改成了静态分派,并在 C 里模拟了一套 trait 系统; 313 | > 314 | > 第十五阶段:你发明了一个编译到 C 的语言。 315 | > 316 | > 第十六阶段:Rust 大法好 317 | > 318 | 319 | ### 3.7 GDB/LLDB 320 | 321 | 几乎没有人能够写出完全正确的程序,~~俗话说得好,一杯茶一包烟,一个程序调一天。~~ 322 | 323 | 任何时候请牢记 324 | 325 | * **The machine is always right. (机器永远是对的)** 326 | * Corollary: If the program does not produce the desired output, it is the programmer's fault. 327 | * **Every line of untested code is always wrong. (未测试代码永远是错的)** 328 | * Corollary: Mistakes are likely to appear in the "must-be-correct" code. 329 | 330 | > 2014年图灵奖得主[Michael Stonebraker](https://en.wikipedia.org/wiki/Michael_Stonebraker)在一次[访谈](http://idke.ruc.edu.cn/resources/Sigmod%20Record_cn/Michael%20Stonebraker_cn.pdf)中提到, 他当时花了5年时间开发了世界上第一个关系数据库系统Ingres, 其中90%的时间用于将它运行起来. 也就是说, 在开发过程中, 有90%的时间系统都是运行不起来的, 是有bug的, 需要调试. 331 | > 332 | > 只有掌握正确的方法和工具, 才能真正驱散心中对bug的恐惧. 333 | 334 | **一个小例子** 335 | 336 | 你信心满满的编写了 `if (p = NULL)`这样的代码. 执行到这行代码的时候, `p`被赋值成 `NULL`, 程序会往下执行. 然而等到将来对 `p`进行了解引用的时候, 触发段错误, 程序彻底崩溃. 337 | 338 | 我们可以从上面的这个例子中抽象出一些软件工程相关的概念: 339 | 340 | * Fault: 实现错误的代码, 例如 `if (p = NULL)` 341 | * Error: 程序执行时不符合预期的状态, 例如 `p`被错误地赋值成 `NULL` 342 | * Failure: 能直接观测到的错误, 例如程序触发了段错误 343 | 344 | 调试其实就是从观测到的failure一步一步回溯寻找fault的过程, 找到了fault之后, 我们就很快知道应该如何修改错误的代码了. 但从上面的例子也可以看出, 调试之所以不容易, 恰恰是因为: 345 | 346 | * fault不一定马上触发error 347 | * 触发了error也不一定马上转变成可观测的failure 348 | * error会像滚雪球一般越积越多, 当我们观测到failure的时候, 其实已经距离fault非常遥远了 349 | 350 | 再往后就是软件测试的范畴了,测试会尽可能将把fault转换为error,通过很多测试样例来帮助我们发现fault,想深度了解测试的话,可以自行STFW,接着说调试的问题。 351 | 352 | 调试程序有几种方法: 353 | 354 | * **硬看:** 除了能看出来一些~~弱智~~手误问题外,基本没啥用. 355 | * **print 大法:** 对小问题有用, 但一旦问题复杂起来, 你将迷失在巨量的日志里, 大脑过载, 难以自拔. 356 | * **使用 `assert()`设置检查点:** 确实可以替你排查出一些问题,并且也可以在程序出错后立刻告知你,是个不错的选择,但和print一样,一旦问题复杂起来.... (这里推荐自行 STFW [防御性编程](https://zh.m.wikipedia.org/zh-hans/%E9%98%B2%E5%BE%A1%E6%80%A7%E7%BC%96%E7%A8%8B)) 357 | * **使用 IDE 提供的调试功能:** 比较有用, 但也比较复杂. 而且有些情况你没法用 IDE 的调试器解决, 比如你开发的项目并没有使用IDE或者说有些语言根本没有IDE(~~点名批评Rust~~)。 358 | * **使用 GDB/LLDB 等调试器:** 适用范围极广, 但相对较难上手,上手后会体验到调试的快乐。 359 | 360 | 一些你需要知道的Debugger的基本内容(以编译器为gcc为例): 361 | 362 | * **编译带调试信息程序:** `gcc/g++ -g -O0 ...` 没有调试信息的程序是没有办法进行调试的,~~你连礼物都不给调试器带还指望她做什么呢.~~ 363 | * **用调试器载入程序:** `gdb/lldb 程序名`. 364 | * **用调试器载入程序并指定启动参数:** `gdb --args 程序名 参数 ...`, `lldb 程序名 -- 参数 ...`, 此时会进入调试器的命令行. 后续命令均需要在调试器的命令行中执行,也可以通过 `setargs 参数 `在进入调试器设置。 365 | * **添加断点:** `b 函数名`, `b 文件名:行号`. 366 | * **删除断点:** GDB: `d 断点编号`, LLDB: `br del 断点编号`. 367 | * **查看所有断点:** GDB: `info b`, LLDB: `br list`. 368 | * **执行程序:** `r`. 369 | * **单步执行, 跳过函数:** `n`. 370 | * **单步执行, 进入函数:** `s`. 371 | * **继续执行直到断点/出错:** `c`. 372 | * **查看调用栈:** `bt`. 373 | * **切换调用栈:** GDB: `frame 编号`, LLDB: `frame select 编号`. 374 | * **暂停执行:** `Ctrl + C`. 375 | * **退出:** `q` 或 `Ctrl + D`. 376 | 377 | 一个例子: 378 | 379 | 你写的程序出现了Crash(大概率是段错误)——这种问题使用 `print` 大法调试效率很低, 因为你很难知道你的程序到底在何处停止运行了, 进而无法得知应该在何处插入 `print`,同时由于 `print`的缓冲区问题,你的输出和程序的执行并不同步。遇到这种情况, 不妨使用调试器载入程序并运行, 当程序出现段错误时, 调试器会停住并进入命令行供你操作. 此时你就可以使用 `bt` 查看调用栈, 定位出错的位置, 然后在合适的地方下断点, 并重新运行程序来进一步调试了. 380 | 381 | 关于调试的更多信息和方法在[The Missing Semester of Your CS Education](https://missing.csail.mit.edu/)有提到,也可以阅读[How To Debug Your Code](https://www.freecodecamp.org/news/what-is-debugging-how-to-debug-code/) 382 | 383 | 推荐: 384 | 385 | * [GDB cheat sheet](https://darkdust.net/files/GDB%20Cheat%20Sheet.pdf). 386 | * [LLDB cheat sheet](https://www.nesono.com/sites/default/files/lldb%20cheat%20sheet.pdf). 387 | * [100个GDB小技巧](https://wizardforcel.gitbooks.io/100-gdb-tips/content/). 388 | 389 | ### 3.8 Docker 390 | 391 | Docker 是容器技术的一种实现, 而容器技术又是一种轻量级的虚拟化技术. 你可以简单地把容器理解成虚拟机: 容器中可以运行另一个操作系统, 它和你的宿主系统是隔离的. 392 | 393 | 当然, 容器和虚拟机实际上并不相同, 若感兴趣可自行 STFW, 此处不做过多介绍. 394 | 395 | 基于 Docker, 我们可以很方便地完成各类 “配环境” 的操作: 396 | 397 | * 负责配置环境的人只需要写好 `Dockerfile`, 然后使用 Docker 构建镜像即可. 和环境相关的所有内容, 包括系统里的某些配置, 或者安装的工具链, 都被封装在了镜像里. 398 | * 需要使用环境的人只要拿到镜像, 就可以基于此创建一个容器, 然后在里面完成自己的工作. 开箱即用, 不需要任何多余的操作, 十分省时省力. 399 | * 如果某天不再需要环境, 直接把容器和镜像删除就完事了, 没残留也不拖泥带水, 干净又卫生. 400 | 401 | **Docker 的局限性之一,它只能用在 64 位的操作系统上**。 402 | 403 | 你可以访问 [Docker 的官方网站](https://docs.docker.com/get-docker/) 来安装 Docker. 安装完毕后, 你可能需要重启你的系统. Docker 是支持 Windows, macOS 和 Linux 三大平台的, 所以 **你可以直接在你的宿主系统 (而不是虚拟机中) 安装 Docker** . 404 | 405 | 一些你需要知道的内容: 406 | 407 | * **拉取镜像:**`docker pull ...` linux中需要sudo权限,拉取镜像的速度可能并不快. 为了加快从 Docker Hub 拉取镜像的速度, 你可以自行 STFW, 为你系统中的 Docker 配置 Docker Hub Mirror. 408 | * **构建镜像:**`docker build -t ... .` 409 | * **运行容器:**`docker run -it ...`使用镜像创建一个临时的容器.启动这个临时容器.这里其实出现了两个概念: “镜像” 和 “容器”. 你可以把它们理解为: 前者是一个硬盘, 里面装好了操作系统, 但它是静态的, 你不能直接拿它来运行. 后者是一台电脑, 里面安装了硬盘, 就能运行对应的操作系统. 410 | * **删除容器:**`docker rm ...` 411 | * **删除镜像:**`docker rmi ...` 412 | * **查看容器:**`docker ps -a` 命令会列出刚刚我们执行 docker run 时创建的临时容器. 413 | * **查看镜像:**`docker images` 命令会列出刚刚我们执行 docker build 时创建的镜像. 414 | * **创建镜像:**`docker commit ...` 命令会创建一个镜像, 并且把容器的内容拷贝到镜像中. 415 | * **创建容器:**`docker create ...` 命令会创建一个临时容器, 并且把镜像的内容拷贝到容器中. 416 | 417 | 推荐 418 | 419 | * [Docker 学习笔记](https://github.com/jaywcjlove/docker-tutorial) 420 | 421 | 关于 Docker 的其他用法, 请参考 [Docker 的官方文档](https://docs.docker.com/engine/reference/commandline/docker/), 或根据情况自行 STFW. 422 | 423 | ## 4. 生存指南 424 | 425 | 优秀的同学也应该去面对挑战。“期末翻一遍书就有 95 分” 的课程似乎不能承担大家作为一名 “本科毕业生” 肩负的重任,所以,对自己要求高一点。 426 | 427 | * 静下心来,从头开始 428 | 429 | * 如果你还没有入门,仍然感到恐惧,请记住:坚持住,进入未知领域,**从简单的、能理解的东西试起,投入时间,就有收获**。 430 | * 试图理解一切事情是如何发生的 431 | 432 | * 从读得懂开始,逐渐过渡到会写。 433 | * 亲自去尝试 434 | 435 | * 掉坑里然后自己爬出来是训练重要的一环, 只有吃苦头才会让你成长. 如果你不想以后掉坑里, 正确的做法是现在花时间踩坑吃苦, 让自己变强大。不要**通过投机取巧的方式绕过那些你本应该接受的训练。** 436 | * 学术诚信([Academic Integrity)](http://integrity.mit.edu/) 437 | 438 | **学术诚信远比课程本身重要.** 439 | 440 | * 简单概括:独立完成 441 | * 也许有些内容你会感到三观尽毁,但有些事情确实是"天然"被禁止的,但我们的教育缺失了这些。 442 | * 请避免: 443 | * ~~老师压根就没精力管,对他来说吃力不讨好~~ 444 | * 拿个大腿的作业来改改不香吗?我还读懂了呢! 445 | * 照搬开源实现 446 | * 考前突击 447 | 448 | 很不幸,尽管我前面一直在说,成绩不是我们该努力的对象,但我们还是得分一些时间来关照成绩,~~不然就挂科了~~ 。万幸的事,几乎大学所有的课程都是可以突击,考前一周足矣。 449 | 450 | * 把握最后一节课,一学期的所有课都可以翘,但最后一节课一定要去。大部分老师会在最后一节课复习一学期的知识点,其实就是划重点加透题,如果有可能的话,建议留存影像资料。 451 | * 关注往年考题,大部分往年考题都会已另一种方式出现在今年的卷子上,~~秽土转生实锤了~~ ,如果你能熟练掌握(背过)往年考题的内容,80分左右是没什么问题的。 452 | * 关注课后题,作业题及PPT上的习题,没有往年考题的课程考试题目很大概率来自于这些地方。 453 | * 请保证这几天时间80%以上的利用率,睡觉也要尽量克制些。 454 | * 如果你有考点搞不太清楚,不要浪费过多的时间试图让自己“真的搞懂”。只要你能把解题步骤记牢,保证大部分习题都算对就是胜利。 455 | * 你可以总结出对这门课程的几个独创理论,比如你对某一章节的独特理解,分享这些经验,这会帮助很多人。W多参加专业群内的讨论,狠狠鄙视那些不愿意跟大伙分享心得的家伙。 456 | 457 | > 我们都是活生生的人, 从小就被不由自主地教导用最小的付出获得最大的得到, 经常会忘记我们究竟要的是什么. 我承认我完美主义, 但我想每个人心中都有那一份求知的渴望和对真理的向往, "大学"的灵魂也就在于超越世俗, 超越时代的纯真和理想 -- 我们不是要讨好企业的毕业生, 而是要寻找改变世界的力量. --jyy 458 | 459 | ## 5. 参考与推荐 460 | 461 | * [Project Based Learning](https://github.com/practical-tutorials/project-based-learning) 提供了不同方向的入手项目 462 | * [Crash-Course-Computer-Science-Chinese: 计算机速成课 ](https://github.com/1c7/Crash-Course-Computer-Science-Chinese)很棒的入门课 463 | * [CS自学指南 (csdiy.wiki)](https://csdiy.wiki/) 提供了很多自学课程和资源,大部分为英文 464 | * [HowToCook: 程序员在家做饭方法指南。Programmer's guide about how to cook at home ](https://github.com/Anduin2017/HowToCook) 465 | * [HowToLiveLonger: 程序员延寿指南A programmer's guide to live longer](https://github.com/geekan/HowToLiveLonger) 466 | * [RegExr: 学习、构建 和 测试 正则表达式 Test RegEx (regexr-cn.com)](https://regexr-cn.com/) 467 | * [Stack Overflow - Where Developers Learn, Share, & Build Careers](https://stackoverflow.com/) 468 | * [z-library](https://z-lib.org/) 电子书下载网站 469 | * [os-wiki](https://wiki.osdev.org/Main_Page): 操作系统技术资源百科全书 470 | * [HFS](https://hepsoftwarefoundation.org/training/curriculum.html): 各类软件教程 471 | * [free-programming-books: Freely available programming books ](https://github.com/EbookFoundation/free-programming-books)免费编程书籍 472 | * [《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被55个国家的300所大学用于教学。 ](https://github.com/d2l-ai/d2l-zh)李沐大佬的DL书,B站有对应视频 473 | * [AI-For-Beginners: 12 Weeks, 24 Lessons, AI for All!](https://github.com/microsoft/AI-For-Beginners) 微软官方人工智能教程 474 | * [DevOps-Guide: DevOps Guide - Development to Production all configurations with basic notes to debug efficiently. ](https://github.com/Tikam02/DevOps-Guide)常用工具教程 475 | * [FiraCode: Free monospaced font with programming ligatures ](https://github.com/tonsky/FiraCode)强推这款字体,舒适度极大提升(从命令行到IDE均可使用),安装自行STFW 476 | * [程序员英语词汇宝典 ](https://learn-english.dev/) 常见英语单词 477 | * [ English-level-up-tips-for-Chinese ](https://babyyoung.gitbook.io/english-level-up-tips/) 可能是让你受益匪浅的英语进阶指南 478 | * [ 编程入门指南 ](https://www.kancloud.cn/kancloud/intro-to-prog/52592) 479 | * [南京大学ICSPA手册](https://nju-projectn.github.io/ics-pa-gitbook/ics2021/index.html) **强烈推荐自己做一遍**,建议在大一的暑假,花上一个暑假的时间去细品,**他真的值得**。 480 | 481 | ## 6. 碎碎念 482 | 483 | 如今的大学试图将每个人像零件一样从流水线上生产出来,学校不会去关心你究竟被塑造成了什么样子,只关心你可以在一种**宽松到近乎放肆的准出条件**下顺利离开学校,似乎近乎百分一百的就业率就能向社会宣告他们教育的成功,再加上偶然冒出的几个知名校友便能攀上并大肆宣传一番,然而却并不会关心每个个体最终会变成什么样子, **没人会对你的教育质量负责** 。最直接的表现形式就是每个人手中几乎雷同的成绩单,学校不会去管你作为一个CS的学生日后是否会用的到电基数电等中的知识,也不管你以后是去写代码还是焊板子,学校只会说,你必须修完这些课程,因为这是从很久之前就规定要开这门课的。至于为什么,需不需要,应该怎么教,他们都不会去思考。并且为了方便省事,他们设置的考察方式总是对他们而言方便的,把试卷丢给助教批改这种事情多么简单,他们丝毫不会考虑自己设置的考察方式是否会放漏网之鱼过去, **反正学生是否学到东西又有什么关系呢** 。作为一个还算有些理想的学生,很想改变现状,但一个人的力量终究是有限的,如果有什么建议,可以在[本项目](https://github.com/als0-ran/cs-intro)发起PR,也欢迎和我联系(dukguo@duck.com) -------------------------------------------------------------------------------- /docs/杂文/image/intro/1659713570094.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/杂文/image/intro/1659713570094.png -------------------------------------------------------------------------------- /docs/杂文/image/intro/1659713643857.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/杂文/image/intro/1659713643857.png -------------------------------------------------------------------------------- /docs/杂文/image/intro/1659755774245.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/杂文/image/intro/1659755774245.png -------------------------------------------------------------------------------- /docs/杂文/image/intro/1659755982620.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/杂文/image/intro/1659755982620.png -------------------------------------------------------------------------------- /docs/杂文/image/intro/1659844486095.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/杂文/image/intro/1659844486095.png -------------------------------------------------------------------------------- /docs/杂文/image/intro/1659844518755.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npu-cs/SurviveNWPU-CSManual/910fb03cbe9fccd207361c7b8cc86d1f739ee248/docs/杂文/image/intro/1659844518755.png -------------------------------------------------------------------------------- /docs/留学/README.md: -------------------------------------------------------------------------------- 1 | # 留学篇 2 | 3 | 该部分内容请访问本项目的兄弟/姐妹项目:[NPU2World](https://npu2world.github.io/NPU2World/) 4 | 5 | 仓库地址:[https://github.com/NPU2World/NPU2World](https://github.com/NPU2World/NPU2World) 6 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Survive NWPU-CS Manual 2 | site_url: https://npu-cs.github.io/SurviveNWPU-CSManual 3 | theme: material 4 | -------------------------------------------------------------------------------- /update.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | from urllib.parse import quote 6 | 7 | EXCLUDE_DIRS = ['.git', 'docs', '.vscode', '.circleci', 'site'] 8 | README_MD = ['README.md', 'readme.md', 'index.md'] 9 | 10 | TXT_EXTS = ['md', 'txt'] 11 | TXT_URL_PREFIX = 'https://github.com/npu-cs/SurviveNWPU-CSManual/blob/master/' 12 | BIN_URL_PREFIX = 'https://github.com/npu-cs/SurviveNWPU-CSManual/raw/master/' 13 | 14 | 15 | def list_files(course: str): 16 | filelist_texts = '## 文件及下载列表\n\n' 17 | readme_path = '' 18 | for root, dirs, files in os.walk(course): 19 | files.sort() 20 | level = root.replace(course, '').count(os.sep) 21 | indent = ' ' * 4 * level 22 | filelist_texts += '{}- {}\n'.format(indent, os.path.basename(root)) 23 | subindent = ' ' * 4 * (level + 1) 24 | for f in files: 25 | if f not in README_MD: 26 | if f.split('.')[-1] in TXT_EXTS: 27 | filelist_texts += '{}- [{}]({})\n'.format(subindent, 28 | f, TXT_URL_PREFIX + quote('{}/{}'.format(root, f))) 29 | else: 30 | filelist_texts += '{}- [{}]({})\n'.format(subindent, 31 | f, BIN_URL_PREFIX + quote('{}/{}'.format(root, f))) 32 | elif root == course and readme_path == '': 33 | readme_path = '{}/{}'.format(root, f) 34 | return filelist_texts, readme_path 35 | 36 | 37 | def generate_md(course: str, filelist_texts: str, readme_path: str): 38 | final_texts = ['\n\n', filelist_texts] 39 | if readme_path: 40 | with open(readme_path, 'r') as file: 41 | final_texts = file.readlines() + final_texts 42 | with open('docs/{}.md'.format(course), 'w') as file: 43 | file.writelines(final_texts) 44 | 45 | 46 | if __name__ == '__main__': 47 | with open('README.md', 'r') as file: 48 | mainreadme_lines = file.readlines() 49 | 50 | with open('docs/index.md', 'w') as file: 51 | file.writelines(mainreadme_lines) 52 | 53 | --------------------------------------------------------------------------------