关于自学

CS领域有一个非常明显的特点,即计算机的发展是学其他传统工科或理科的同学难以想象的。10年所流行的web技术或是先进的系统架构现在大都因为过于繁杂或是无法满足企业对于业务的高要求而变得逐渐落后于时代。在计算机这个领域基本不存在学好某一个技术就可以一直靠着它吃饭。所以与时俱进,不断学习,提升自己也成了对我们这个专业的人员的基本要求。所以,自学也就成为了我们需要掌握的最重要的技能,大多数你工作需要用到的知识,都是要靠自己去学习的。请千万不要觉得,学校不讲,我就可以先不学,这是一种愚蠢的典型的应试思维,请铭记,我们是为了技术而学习,为了提高自己,而不是fucking gpa。只要能提高自己,对自己有帮助的,都要多多益善的学习。而且你要习惯于自学,因为这会伴随我们整个学生和职业生涯。

关于入门的相关建议

学好英语

必须承认的是,cs相关的资料和课程,质量最高最精华的一部分大多还是英文的。而英文的博客和社群也往往有更高的质量。除此以外,在学习计算机的整个过程中,英语都是至关重要且可以给你的学习带来很大便利的工具,不要害怕英语,尽可能地学好英语。

掌握相关的工具

有一些工具对于以后的学习和实际应用是非常重要的。

  1. markdown (.md)

    Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF 以及本身的 .md 格式的文件。因简洁、高效、易读、易写,Markdown被大量使用,如Github、Wikipedia、简书等。 可以让人优雅地沉浸式记录,专注内容而不是纠结排版。

    今后所看到的绝大多数技术类的博客都是采用md格式来记录的。由于简介高效且高度编程化,他已经成为了程序员们最喜欢的文档格式之一。用md我们可以非常方便的记录学习笔记,记录代码,记录周报等。我们以后的很多文档类交流,也会建立在md的基础之上。所以非常建议大家掌握md的基本语法。md的基本语法是很容易上手的,几分钟不到就可以敲出你的第一遍blog了。

    md的编辑工具推荐:typora。

  2. 命令行:熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会极大地提高你作为工程师的灵活性以及生产力。命令行的艺术是一份非常经典的教程,它源于 Quora 的一个提问,但在各路大神的贡献努力下已经成为了一个 GitHub 十万 stars 的顶流项目,被翻译成了十几种语言。教程不长,大家可以通读学习一下。

  3. vim:一款命令行编辑工具。在命令行界面,你所能用到的几乎最好的编辑工具。建议至少掌握基本用法,可以用它修改文件等。

  4. IDE (Integrated Development Environment):集成开发环境,说白了就是你写代码的地方。作为一个码农,IDE 的重要性不言而喻,但由于很多 IDE 是为大型工程项目设计的,体量较大,功能也过于丰富。其实如今一些轻便的文本编辑器配合丰富的插件生态基本可以满足日常的轻量编程需求。个人常用的编辑器是 jetbrain系列的ide和VS Code 。

  5. Git:一款代码版本控制工具。Git的学习曲线可能更为陡峭,但出自 Linux 之父 Linus 之手的 Git 绝对是每个学 CS 的同学必须掌握的工具之一。不管是团队开发还是管理你自己的代码,git都是一个助力开发的神器。

  6. Docker:一款相较于虚拟机更轻量级的软件打包与环境部署工具。

  7. linux基础:linux是世界上最主流的服务端操作系统。但是不仅对于运维人员,对于普通的计算机学生,掌握一些基础的linux知识也是很有必要的。

  8. 数学基础。

    打好数学基础是和写代码至少同等重要的事情,相信已经有无数的前人经验提到过这一点,但我还是要不厌其烦地再强调一遍:学好微积分线代真的很重要!你也许会吐槽这些东西岂不是考完就忘,那我觉得你是并没有把握住它们本质,对它们的理解还没有达到刻骨铭心的程度。如果老师上课的内容比较晦涩难懂,可以参考b站的一些课程。比如MIT的线性代数和3b1b的微积分系列(仅作为辅助理解,课程内容较短)。不要以为我们就是敲代码的,不需要掌握多么高级的数学知识,数学作为所有工科的基础绝不应该被我们忽视。

  9. over the great firewall。

  10. 利用好AI工具,多去提问,逐步摸索出一套高效的写提示词的方法。

搜索引擎的使用

碰到问题,记住第一件事是 翻阅文档 ,不要一开始就直接搜索或者找人问,翻阅FAQ可能会快速找到答案。

信息检索,我的理解来说,实际上就是灵活运用搜索引擎中,方便快捷的搜到需要的信息,包括但不限于编程。

编程最重要的,就是 STFW(search the fucking web) 和 RTFM(read the fucking Manual) ,首先要读文档,第二要学会搜索,网上那么多资源,怎么用,就需要信息检索。

要搜索,我们首先要搞清楚搜索引擎是如何工作的:

搜索引擎工作原理

搜索引擎的工作过程大体可以分成三阶段:

  1. 爬行和抓取:搜索引擎蜘蛛通过跟踪链接访问网页,获取网页 HTML 代码存入数据库。
  2. 预处理:索引程序对抓取来的网页数据进行文字提取,中文分词,索引等处理,以备排名程序调用。
  3. 排名:用户输入关键词后,排名程序调用索引库数据,计算相关性,然后按一定格式生成搜索结果页面。

第一步,就是大家经常听说的网络爬虫,一般 Python 卖课的都会吹这个东西。简单可以理解为,我用一个自动的程序,下载网站中的所有文本、图片等相关信息,然后存入本地的磁盘。

第二步是搜索引擎的核心,但是对于我们使用来说,并不是特别关键,大致可以理解为洗干净数据,然后入库页面,每个页面加入关键字等信息方便我们查询。

第三步跟我们息息相关,不管是什么搜索网站, google 、百度、 Bing ,都一样,输入关键字或者需要查询的内容,搜索引擎会给你返回结果。我们也主要着眼于如何获得更好的搜索结果。

基础搜索技巧

根据上述的工作原理,我们大致就能明白,其实可以把搜索引擎当作一个比较聪明的数据库,更好的使用查询条件就能更快速的找到你想要的信息,下面介绍一些搜索的技巧:

使用英文

首先我们要知道一件事,编程中,最好使用英文搜索。原因主要有几点:

  1. 编程和各种软件操作中,英文资料质量比中文资料和其他语言资料高,英文通用性还是更好些
  2. 因为翻译问题,英文的名词比中文准确通用
  3. 中文搜索中,分词系统不准会导致歧义。

如果你英文不好,用百度翻译或者搜狗翻译,足够了。

当然下面的文档为了举例方便,都还是用中文例子。

提炼关键词

搜索时不要搜索整句话,虽然搜索引擎会自动帮助我们分词检索,但是整句和关键字搜索出来的结果再准确度和顺序上会有很大差别。搜索引擎是机器,并不是你的老师或者同事,看上面的流程,搜索实际上是去检索搜索引擎爬出来的数据库,你可以理解为关键字比模糊检索要快而且准确。

我们需要提炼问题,确定我们到底需要解决什么问题。尽量不要直接搜索长句,而去将较长的问题拆分出多个关键词 利用关键词来搜索。越具体的问题,机器分词越可能出问题,所以最好是拆分关键字,使用词组或者断句来进行搜索。

替换关键字

如果无法搜索出想要的结果,可以把某个关键词替换一下。 或者应用高级搜索。

关于搜索引擎的选择

从个人的搜索体验而言,google毫无悬念是最佳的搜索引擎,不管是中文还是英文。如果有能力的话推荐使用google。另外区分浏览器和搜索引擎。chrome,edge等是浏览器,google是搜索引擎。浏览器都可以,chrome和edge都是不错的选择。对于搜索引擎而言个人体验上bing对中文的搜录并不是特别的好。

学习工作流

参考https://csdiy.wiki/%E5%BF%85%E5%AD%A6%E5%B7%A5%E5%85%B7/workflow/

虽然一手信息很重要,但后面的 N 手信息并非一无是处,因为这 N 手资料里包含了作者对源知识的转化——例如基于某种逻辑的梳理(流程图、思维导图等)或是一些自己的理解(对源知识的抽象、类比、延伸到其他知识点),这些转化可以帮助我们更快地掌握和巩固知识的核心内容,就如同初高中学习时使用的辅导书。 此外,学习的过程中和别人的交流十分重要,这些 N 手信息同时起了和其他作者交流的作用,让我们能采百家之长。所以这提示我们学习一个知识点时先尽量选择质量更高的,信息损失较少的信息源,同时不妨参考多个信息源,让自己的理解更加全面准确。

现实工作生活中的学习很难像学校里一样围绕某个单一知识点由浅入深,经常会在学习过程中涉及到其他知识点,比如一些新的专有名词,一篇没有读过的经典论文,一段未曾接触过的代码等等。这就要求我们勤于思考,刨根究底地“递归”学习,给多个知识点之间建立联系。

实用工具箱

下载工具

设计工具

  • excalidraw: 一款手绘风格的绘图工具,非常适合绘制课程报告或者PPT内的示意图。
  • tldraw: 一个绘图工具,适合画流程图,架构图等。
  • draw.io: 强大简洁的在线的绘图网站,支持流程图,UML图,架构图,原型图等等,支持 Onedrive, Google Drive, Github 导出,同时提供离线客户端。
  • origamiway: 手把手教你怎么折纸。
  • thingiverse: 囊括各类 2D/3D 设计资源,其 STL 文件下载可直接 3D 打印。
  • iconfont: 国内最大的图标和插画资源库,可用于开发或绘制系统架构图。
  • turbosquid: 可以购买各式各样的模型。
  • flaticon: 可下载免费且高质量的图标。
  • 标准地图服务系统: 可以下载官方标准地图。
  • PlantUML: 可以使用代码快速编写 UML 图。

编程相关

  • sqlfiddle: 一个简易的在线 SQL Playground。
  • sqlzoo:在线练习 sql 语句。
  • godbolt: 非常方便的编译器探索工具。你可以写一段 C/C++ 代码,选择一款编译器,然后便可以观察生成的具体汇编代码。
  • explainshell: 你是否曾为一段 shell 代码的具体含义感到困扰?manpage 看半天还是不明所以?试试这个网站!
  • regex101: 正则表达式调试网站,支持各种编程语言的匹配标准。
  • typingt om: 针对程序员的打字练习/测速网站。
  • wrk: 网站压测工具。
  • gbmb: 数据单位转换。
  • tools: 在线工具合集。
  • github1s: 用网页版 VS Code 在线阅读 GitHub 代码。
  • visualgo: 算法可视化网站。
  • DataStructureVisual: 数据结构可视化网站。
  • Data Structure Visualizations: 数据结构与算法的可视化网站。
  • learngitbranching: 可视化学习 git。
  • UnicodeCharacter: Unicode 字符集网站。

学习网站

百科网站/词典性质的网站

交流平台

  • GitHub: 许多开源项目的托管平台,也是许多开源项目的主要交流平台,通过查看 issue 可以解决许多问题。
  • StackExchange: Stack Exchange 是由 181 个问答社区组成(其中包括 Stack Overflow)的编程社区。
  • StackOverflow: Stack Overflow 是一个与程序相关的 IT 技术问答网站。
  • Gitee: 一个类似于 GitHub 的代码托管平台,可以在对应项目的 issue 里查找一些常见问题的解答。
  • 知乎: 一个类似于 Quora 的问答社区,可以在其中提问,一些问答包含有计算机的知识。
  • 博客园: 一个面向开发者的知识分享社区,拥有一些常见问题的博客,正确率不能保证,请谨慎使用。
  • CSDN: 拥有一些常见问题的博客,正确率不能保证,请谨慎使用。

杂项

  • tophub: 新闻热榜合集(综合了知乎、微博、百度、微信等)。

  • feedly: 著名的 RSS 订阅源阅读器。

  • speedtest: 在线网络测速网站。

  • public-apis: 公共 API 合集列表。

  • numberempire: 函数求导工具。

  • sustech-application: 南方科技大学经验分享网。

  • vim-adventures: 一款基于 vim 键盘快捷键的在线游戏。

  • vimsnake: 利用 vim 玩贪吃蛇。

  • keybr: 学习盲打的网站。

  • Awesome C++: 很棒的 C/C++ 框架、库、资源精选列表。

  • HelloGitHub: 分享 GitHub 上有趣、入门级的开源项目。