Files
fzu-product/3.编程思维体系构建/3.0 编程入门之道.md
2023-08-24 10:31:27 +08:00

140 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3.0 编程入门之道
> 作者:[爱飞的鸟](https://github.com/aFlyBird0)
## 缘由
### 为什么会有这篇讲义
原先的第三章,即 [3.编程思维体系构建](3.编程思维体系构建)是从 3.1 开始的。但我简单翻阅一下之后“很不爽”,新人得有多牛逼才能看完这章的讲义?
所以我强行塞了这篇教程进来,正好计算机一般从 0 开始计数,所以就有了 "3.0"。
### 这篇讲义讲什么
- 首先,如上文所述,如何轻松地利用本章乃至整个讲义
- 在第一点的基础上,引申出我自己归纳的**编程入门之“道”**
### 请随意喷这篇讲义
故意写这么大的题目,就是为了“噱头”,为了让读者有点开的欲望。
可能本文的所谓的“道”并不是普适的,甚至是错误的,请尽你所能地喷这篇讲义,让我们一起完善它。
## 如何利用好本章的讲义
<del>(首先纠正一个心态,当我们获得一大片非常丰富的新的知识的时候,不应该感到焦虑。不知道自己不知道什么,远比知道自己不知道什么来得好。同时,虽然你收获的信息量很大,但也并不意味着你要全部看完,不需要焦虑。)</del>
1. 这里的文章的最大的作用是帮你打开信息壁垒,告诉你编程的世界有哪些东西,可以去学什么。
2. 把讲义当成字典来用。很多文章并不是完全对新人友好的,你现在不需要看懂,甚至可能不需要看。你只要大概记下有这么个概念和工具,当下次要用到的时候,再查阅、再仔细学习就好。
简单来说就是,**抱着平和的心态,随便看看**,知道这一章都讲了哪些东西,看完有个印象就好,然后常回家看看。
技术细节本身永远都不是最重要的,重要的是思想和方法,如何快速掌握一门技术。
## 编程入门之道
### 先“run”起来
这是我的第一个也是最重要的建议。
无论是学一门语言,还是学一个工具:**尽可能地先用最短的时间搞懂这个东西是做什么的然后以最快的方式把它“run”起来。**
当你已经能跑起一个语言、一个工具的最简单的示例的时候,再去花时间慢慢了解背后的复杂的内容,再去拓展即可。先用起来,跑起来,带着问题去翻资料。
- 比如学写 C 语言,我建议大家直接跳过 [3.1 该使用哪个编辑器???](3.1%E8%AF%A5%E4%BD%BF%E7%94%A8%E5%93%AA%E4%B8%AA%E7%BC%96%E8%BE%91%E5%99%A8%EF%BC%9F%EF%BC%9F%EF%BC%9F.md)这章。直接打开在看的教程的第一章,把代码复制到这个[在线编译](https://rextester.com/l/c_online_compiler_gcc)的网站里,点一下 "Run it" 看效果。为什么要去详细了解编译器、编辑器、IDE、gcc、g++、make 这种东西?能最快地上手,最快地运行看到效果,对于初学者来说是最好的。等你把环境装好了,人家已经学完三章了。当你已经会了简单的循环、判断、函数,已经建立了信心,就可以慢慢地去看那些让人头疼的东西了。
- 比如学 Linux如果你电脑操作系统是 MacOS直接打开“终端”可以勉强当 Linux 使;如果你是 Windows直接跟着微软的 [WSL 安装教程](https://docs.microsoft.com/zh-cn/windows/wsl/install),一步步无脑地用鼠标点击然后装起来。这时候你就拥有一个 Linux 了,再对着教程去敲。等闲下来了就可以了解了解内核是什么,发行版是什么,去了解云服务器,去了解不同的装 Linux 的方式。
为什么要这样?
- 第一,计算机是很重实操的东西,不要光看所谓的理论不动手。动手是王道。
- 第二,要尽可能多地、尽可能快地给自己找一些正反馈,学编程不是当苦行僧
- 第三,很多东西没必要学,学了也忘。用到了再去学,是最省事最容易记住最高效的。
- 第四,程序员这一辈子会接触无数的新的东西,如何快速上手一个东西,是非常重要的能力。
### 任务/项目驱动
任务/项目驱动的意思承接上文,意思就是不要瞎看文章,不要让阅读教程和学习课本成为你的驱动力,等你看完一本 C 语言的书,一行代码就没敲,你就 g 了。
那么该怎么学呢?
**先简单地会一样东西的最核心的部分,再去找一个实际的编程场景、编程任务、项目。你会在完成这个项目中遇到各种各样的问题,无论是遗漏了知识点还是压根没思路,这时候不断地用搜索引擎来学习。( **[2.3 高效的信息检索](../2.%E9%AB%98%E6%95%88%E5%AD%A6%E4%B9%A0/2.3%E9%AB%98%E6%95%88%E7%9A%84%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2.md)****
举个例子:你想做一个小程序,来检测某电影院的电影预售。程序大概要做到不断刷新网页,一检测到这个电影预售了,就马上发短信给自己手机(或者直接帮你抢)
1. 你通过搜索引擎或者从不知道哪个学长/学姐那里得知这玩意叫爬虫简单来说就是用程序抓取网页上的内容。我们又通过搜索引擎得知python 写爬虫最舒服。[3.6python(灵巧的胶水)](3.6Python%EF%BC%88%E7%81%B5%E5%B7%A7%E7%9A%84%E8%83%B6%E6%B0%B4%EF%BC%89.md)
2. 我们又通过例如菜鸟教程这种最简单的极速入门教程,在 3 个小时内掌握了 python 的核心语法。
3. 这时候我们开始写代码了,但是我该怎么获取到网页啊?这时候,你在浏览器里分别搜索了以下几个内容:“程序如何获取网页内容”。
4. 你会学习到 http 相关的知识,大概知道了我们平时打开网页可以简单理解为一次 http GET。
5. 可是还是好抽象啊python 又怎么才能获取到网页的内容啊这时候你在浏览器里精确了一下搜索内容“python 如何获取网页内容”。
6. 搜索引擎会告诉你,可以用诸如 `requests` 一类的库来请求网页。但问题又来了,这个库一下子会返回整个网页内容,我怎么才能筛选出我要的电影有没有放出来?
7. 这时候你又去搜索,学会了怎么解析网页。比如用 `xpath`, `bs4`, 甚至直接用正则。
8. 我们现在能不断地刷新网页,并且筛选出所有的电影的信息,然后分析出自己想看的那个电影有没有放出来了。但是问题又来了,怎么让程序给自己发信息啊?
9. 这时候又打开了浏览器,我们可以知道诸如阿里云、腾讯云这样的云服务商提供了发短信的服务,并且会教你怎么写代码,主要注册、申请一下,就能发短信了。
10. 但是你又会发现这个申请流程真 tm 麻烦,我还是发邮箱吧!这时候又开始搜,如何用 python 发邮件。
11. 然后你会了解到 python 用于发邮件的一些库,以及简单的邮件协议的知识,如 `POP3`
12. 程序真的能如期运行了,能不断刷新、获取网页内容、解析内容以判断电影是否上映,上映了还会发邮件给你。
13. 又又又出问题了!!!你发现程序出错了,因为你请求频率过高,电影院的网站发现你是爬虫了,把你给 ban 了!这时候你知道了“反爬”这个概念,就是反爬虫,类似于外挂和反外挂。你开始学习反爬的知识。
14. 你了解到可以给程序挂个“代理”,相当于每次请求网页的时候,都伪装成了世界上上某个角落的另外一台电脑的请求。
15. 能走到这里太艰辛了,但你很快又发现了问题!现在程序是跑在自己的电脑上的,我们不知道电影院啥时候放票,所以程序得一直跑着,但是电脑会关机啊,关机了还怎么抢???
16. 这时候你了解到了服务器的概念。服务器可以简单地了解为一台远程的几乎从不关机的电脑,一般用的是 Linux 操作系统。[3.Y 附加模块Linux](3.Y%20%E9%99%84%E5%8A%A0%E6%A8%A1%E5%9D%97%EF%BC%9ALinux.md)
17. 这时候你又开始去学 Linux当然不是非常系统地学而是像我之前说的以最快的方式知道它是做什么的然后运行起来。比如可以直接在阿里云、腾讯云、AWS 等云服务器商那里购买。甚至也可以用自己的旧手机装个 Linux 等等,这些都是后话了。
18. 服务器是远程的,我们怎么连上去操纵它呢?我怎么把我的 python 代码传上去呢?这时候你又去求助万能的搜索引擎,或者神秘的学长学姐。你知道了世界上有 `ssh``ftp``sftp` 这些东西。
以上的“简单”的例子,就是所谓的任务驱动。带着目的去学,带着任务去学,带着问题去学,快速搞定。在上面的例子中,如果能成功走完,你会学到编程语言本身、学到网络知识、学到 Linux 服务器及其相关操作、学到云服务器和各种云服务(例如短信服务)。更重要的是,每一次从问题到答案的搜索与解决过程,你的编程内功就增强了一波。以后上手一个新东西,或者遇到问题再去解决它的速度,只会越来越快。
刚开始你可能什么都不会,什么地方都被阻塞,但当你把坑踩遍了。就发现,哎嘿,不好意思,这玩意我怎么又会!
**所以让我们基于这个“任务驱动”,再看看本章的内容。这些内容大多看了就忘,因为细节非常多,而且并不一定能解决你手头上的问题。但这些文档,带你领进了新的领域的大门,让你的工具箱里多了一个可以解决问题的工具,以后用到了可以想起他们。并且,这些文章多是通俗的,且作者多是讲述了 ta 所认为的该语言/工具的最核心、最精华的部分,或者说第一次入门最需要学习的部分。**
## 圈子
先干了这碗鸡汤,我之前写的,就单纯想让你看看。
> 每个大学的同一个专业,录取的时候分数是差不多的,但是毕业的时候工资可以差几十倍。他们的大环境是相同的,外界对他们的学历评价也是一样的。外部的大环境,我称之为大圈子,最典型的是学校。大圈子决定的是外部对你的整体性的刻板印象式的评价,以及决定了你能以多大的成本来获取资源(比如有没有公司来学校主要招生,有没有免费出国交流的机会,有没有图书馆)。但是,这个大圈子,在一般情况下,在你思考这个问题的时候就已经决定了,比如大家的大学是不能改变的。但更重要的是,小圈子,即你自身所营造的环境。比如每个人都有几个要好的朋友,他们的编程水平,其实就决定了你的编程水平,比如你是否有加入有技术大佬坐镇的社团,这样他们能带你学。如果线下都没有的话,你是否主动去加一些网上的社群、编程社区,问问公司对计算机专业学生的要求是什么,问问能进大厂的人,都在学些什么(知道要学什么很重要,瞎学悔大学)小圈子能时刻让你知道重要的讯息,比如计算机哪个细分方向的就业好,什么厂最近又有提前批,等等。圈子这东西太重要了,我以前很长一段时间就是一个所谓的一直在学习,很想提高自己,但因为比较自闭没有认识牛逼的人,所以我压根不知道学什么啊。那就只能随便弄,瞎搞,做无用功。
圈子,从另外一个角度,也可以理解为“信息差”,“信息壁垒”。对于编程这东西,知道有哪些东西能学,哪些东西赚钱多好找工作,哪些地方有项目,然后有着志同道合的人一起唠,太重要了。
我最近的两次编程能力的飞跃,一次是在加入了某个社团认识了很多技术大佬以及有了非常多的项目可以写,一次是意外地获得了一份实习所以能够和行业的领跑人物经常聊天,以及在开源社区慢慢接触到来自世界各地的技术大牛。
“破圈”的话,我目前接触到的最好的方式是参与开源社区。参与开源的好处如下:
1. 输入决定输出。开源的代码多是经过检验的牛逼的代码,通过多看看优雅的代码来提高编程能力,比自己无中生有简单地多。
2. 开源圈牛人多。无论是拓宽视野,还是在 issue 下的交流,还是别人给你的 review 建议,都能学到很多。你会在开源的过程中认识很多的人,很多大厂的人,说不定就是你以后的面试官。
3. 参与开源社区能极大地锻炼自己的编程能力,能给简历贴金。
4. 开源是程序员的浪漫。
对于学生而言,可以参加一些仅面向学生开放的开源活动。一般会有一个主办方,然后有许多知名的开源社区报名。他们会罗列出一些有一定难度的任务,学生可以提交申请书,陈述如何完成这个任务。中选后会分配单独的导师来带你,还会发奖金给你,一般是大几千起步。推荐阅读这个系列的文章:[https://erdengk.github.io/gsoc-analyse/](https://erdengk.github.io/gsoc-analyse/)
## 不同的知识媒介
这里主要讲讲我对不同媒介来学习编程知识的看法,媒介主要指的是
- 图文 vs 音视频
我身边的牛逼的人,一般都更喜欢通过看图文来学习,而不是视频。主要有以下几个原因:
1. 图文的信息密度最大。同样的时间内,看一篇图文获得的信息量比视频大很多。
2. 图文易定位、检索。你可以通过搜索功能非常迅速地在一个工具的官网内找到想要的内容。
3. 一些杂七杂八的原因:图文往往更新,因为视频制作耗时长,不容易更新;牛逼的人它不一定会做视频,或者说牛逼的人中有写博客习惯的远大于做视频习惯的。
当然,视频也有很大的好处,就是直观、简单。适合学习初期。
当然也不必强行把自己往上套,结合自身特质,以什么的方式学习效率最高,就采用什么样的方式。不过我建议你多锻炼阅读官方文档、文档教程的能力。
## 选择大于努力
[正确解读 GPA](../1.%E6%9D%AD%E7%94%B5%E7%94%9F%E5%AD%98%E6%8C%87%E5%8D%97/1.6%E6%AD%A3%E7%A1%AE%E8%A7%A3%E8%AF%BBGPA.md) 这篇文档写得很好,和我的想法完全一致,但是被放得太后面了,我想把它提上来。
大学不是唯分数论的,起码编程不是这样。我的建议是,如果以后大概率考研,可以多抓一下绩点;如果以后大概率工作,就不必追求高绩点了(指把大部分时间都花在提高绩点上)。
至于为什么是“选择大于努力”这么笼统的标题,因为我想表达更多的意思(虽然我一时想不到那么多)。
选择真的比你想象的重要。
- 例如,你是选择把大部分的时间花在把成绩从 85 提高到 90 上,还是把大部分时间用来做实际的项目直接上手以后大厂需要的框架上?
- 例如,你选择什么技术栈,哪个发展方向(这个目前来说大家不需要考虑,只是简单提一下。大家选计算机这个行为本身相对来说就已经很对了,比土木工程当牛马好太多)?
- 例如,你是选择以老师上课教的内容为主,埋头搞 C 语言,还是多去扩展自己的视野去了解现行的流行的框架是什么,大厂需要什么样的能力,然后去做项目?
以及,一旦作出了选择,就不要像祥林嫂那样自怨自艾。过去的事情无可改变,我们只能基于当前的状态和资源,去把接下来的事情做得更好。