学习编程不仅在于可以解决当前的什么问题,更在于对自己思维方法的改变。
编程替代重复性劳动
编程能替代工作或生活中的大量重复性劳动。
比如偶尔偏离生活的轨道,真的是坏事吗?中的事例。
比如前一段我们有个工作是进行机构分类,查询文本文件中的机构是否为私募基金管理人。方法是在私募基金管理人综合查询网站中输入机构名称点击查询。但是有几十上百家机构的时候,手动从文件中复制再粘贴到网页中查询,是非常低效的。这时候,如果你懂点爬虫知识,只需要一段代码即可:
import requests
import json
headers = {
'Host': 'gs.amac.org.cn',
'Origin': 'https://gs.amac.org.cn',
'Referer': 'https://gs.amac.org.cn/amac-infodisc/res/pof/manager/index.html',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
url = 'https://gs.amac.org.cn/amac-infodisc/api/pof/manager?rand=0.7119720626937933&page=0&size=10'
data = {
'rand': '0.7119720626937933',
'page': '0',
'size': '10'
}
with open('私募基金.txt','r',encoding='utf-8') as f:
print('以下机构不是私募基金:')
is_pe = True
for org in f.readlines():
org = org.strip()
payloaddata = {"keyword":org}
dumpJsonData = json.dumps(payloaddata)
r = requests.post(url,data=dumpJsonData,headers=headers)
if r.text.replace(r'</em>','').find(org) == -1:
is_pe = False
print(org)
if is_pe:
print('无')
这都是学习编程能带给人们显而易见的好处,也是非科班选手进入编程世界的原因,学习编程在这方面也确实可以给人满意的回报。
以 Python
为例,近些年 Python
的流行,对编程的普及起到了极大的推动作用。更多没有接触过编程的人也能偶尔写段代码解放自己的双手。 Python
语法接近自然语言,入门简单,但是功能却很强大,所谓
Python
除了不能帮你生孩子,什么都能做!
虽然 Python
也有其缺点,如入门简单精通却很难,如优秀的库太多不知如何取舍,如运行效率不如 C
/ Java
等。但是对于非科班想要利用编程工具解决一些实际问题的人来说,这都不是问题。所以我认为,非科班的初学者最好的入门语言就是 Python
。
入门简单精通很难
对于很多生活中的应用场景来说,编写简单的 Python
代码即可,根本不需要很精通。况且,Python
生态圈很活跃,网上有大量的现成代码,只需稍加修改即可应用到自己环境中。
我开始入 Python
的坑是因为想爬取豆瓣图书、电影的数据。我的学习路径是先学习 Python
最基础的概念,就是数据类型和函数。对面向对象的概念只做了最基础的了解,就是别人写的时候我大概知道那是在干嘛,但是自己写是写不出来的。
这些了解之后,我就直接在网上找免费的爬虫视频教程。那时候B站上的教学视频还没有那么流行,资源很少,我就找了一个爬取新浪博客的教程跟着敲代码,熟悉基础的操作。说到这儿,初学者我还是很建议跟着视频操作或者有人带,因为对于编程初学者来说,上来就看书可能会遇到很多细节上的问题。这些问题对于老手来说,可能以为不用解释,但是对于初学者来说,就可能是迈不过去的天大的坎。
视频中爬虫非常简单,没有用任何框架,甚至文本解析也没有用常见的第三方库如 BeautifulSoup
等,直接用的 find
函数查找关键字。这样的好处就是学习门槛很低,没有任何理解障碍,特别适合于没有任何编程经验的初学者。
我在学了这个视频教程之后,又阅读了几篇爬虫相关的博文,就开始爬豆瓣电影,没想到很快成功了,这给了我极大的信心。在学习的初期,信心也许是最宝贵的东西。虽然后来由于爬取量大,需要把数据装到数据库中,又学了点 MongoDB
的操作;由于担心多次爬取被豆瓣封IP,又简单了解了使用代理;由于使用 find
函数解析文本代码量太复杂,又学习了正则表达式,等等。
这些后续学习的内容包括最开始学习的 Python
基础概念,都是走实用主义路线,只要做成想要的效果即可,学得并不精通。这也导致同样的东西我后来又多次学习。但是这样做的好处就是可以及时得到正面的反馈,很有成就感,也就获得了继续下去的动力。而且,前期虽然学得不扎实,但是对于后期的再学习也还是有潜移默化的帮助的。
当然还有一种学习方法是上来就系统性地学习,学扎实。两种方法各有优劣,适用于不同的人群,此处不做比较。
要学习哪个库
Python
火起来的一大重要原因就是拥有各个领域的大量优秀的库。这些直到我将 Python
大量应用到生活、工作中后,才有更深的体会。
- 想操作PDF,有
PyPDF2
、pdfplumber
等,PDF文件的分割、合并、加解密、文字提取等都不是事。 - 想做数据处理,
numpy
、Pandas
肯定是首选。 - 想做爬虫,
Requests
、BeautifulSoup
等库也是必学的。而且,作为pythonic的优秀代表,Requests
库的源码也是进阶学习的好素材。 - ……
很多初学者的面对大量的 Python
库会感到眼花缭乱,感觉要学习的太多,担心自己坚持不下去,于是就劝退了。
但实际上,这些常用库基本都有相应的demo,稍加修改即可应用到自己的项目中。所以,丰富的库非但不是累赘,反而可以给自己带来极大的便利。
我以前也稍微用过 VBA
,但一直不喜欢它的编辑环境,所以使用次数并不多,只是在实在无法用别的方式实现的时候才勉强写几行代码。
但是 Python
给了我另一种选择,可以拥有漂亮的编辑器,如 VS Code
、Sublime Text
等,还用于远比 VBA
好用得多的代码补全等功能,这也是我一开始想学习 Python
的原因。至于用于丰富的库,对于小白的我,其实是没有啥感觉的。
但是后来随着学习的深入,用 Python
做的事情也越来越多,才渐渐体会到丰富的库所带来的优势。
我认为对于初学者来说, Python
相比于 VBA
,最大的优势就是简洁,这种简洁一方面基于 Python
语言本身的一些特质,比如好用的基础数据类型如 list
、dict
等,另一方面就是得益于大量的库。
如果你不理解库是什么,你可以认为是工具箱,或者是零件库,是别人将常用的功能组装好,你写程序时可以直接一句话调用的东西。
举个可能不太恰当的例子。要把大象装冰箱,需要怎么操作?
- 打开冰箱;
- 把大象放进冰箱里面;
- 关上冰箱门。
用 VBA
实现,你需要吭哧吭哧从底层实现怎么开冰箱,怎么拖动大象到冰箱里,怎样关冰箱门。
而有了库的帮助,你可以直接关注业务逻辑层面的问题,即只需要关注上面三步。至于每一步怎么实现,库已经帮你做好了,你只需要调用即可。这无疑大大减轻了初学者进入编程世界的门槛。
运行效率问题
不可否认,Python
语言的运行效率总体上是不如 C
或者 Java
这样的语言的。但是运行效率恰好对初学者来说并不是一个很重要的问题。一个手动需要10小时完成的工作量,用 Python
需要10秒钟运行出结果,用 C
或者 Java
0.1 秒即可运行出结果。
这其中的差距大吗?大,有 100 倍的差距!
但对于我们要实现的功能来说,多个 10 秒钟或者少个 10 秒钟根本可以认为没什么差别好吗?
而学习 Python
语言却可以节省很多时间,编写简洁的 Python
代码也会更省时省力。
编程带来思维方式的转变
讲话有逻辑、做事有条理是一个逐渐被大家高度认可的能力。但是逻辑能力的培养却不是一朝一夕的事情。
世面上有很多书讲如何提升逻辑能力,但是一个关键问题是,这种底层能力的提升都不是靠看基本理论书就可以,而是需要大量练习的。
那如何练习呢?
我觉得数学训练是有助于提高逻辑能力的。但让大多数成年人去学习微积分、复变函数等是不现实的。且不说有没有时间、有没有兴趣,就算这些都有,那得能学得会啊!
而学习编程可以给你带来的逻辑能力的提升,这可能是很多人开始学习编程时所没有想到的。
也很好理解。
如果你逻辑思维能力不强,写出来的代码就会bug不断。变量的初始化是在循环外还是在循环内?边界条件要不要做特殊处理?还有什么特殊情况没有考虑到?这些都会影响着程序的正确执行。
疫情期间我写过一段代码,爬取每天公众号发布的疫情信息,解析其中的数据并记录下来。这段代码连续很多天一直运行很好,突然有一天发现出错了。仔细检查代码发现是疫情后期,每天的确诊病例数和无症状感染者数量很少,甚至有时候完全没有。这时候疫情信息的描述就与有数据时不同,程序检测不到相应的固定格式,就会报错。
所以程序员的目标都是写尽可能健壮的程序,也就是尽量能适应各种极端情况,这就需要在规划程序时就考虑到方方面面。没有良好的逻辑思维能力,是很难完成这样的工作的。但与此同时,持续这样的代码训练,也会让你的逻辑思维能力有极大的提升。
最后
写完本文,我听到了一个播客,为什么要学编程。里面提到了My First Million Podcast的节目主持人 Sam Parr 以2200万美元的价格卖掉了之前做的hustle,一个 newsletter 平台。卖掉的原因是,他觉得写 newsletter 对他来讲变成了一个工作,而不是生意。前者需要持续投入时间的事情,即不投入时间,就没有收益。而后者是可以以钱生钱的事业。
播客的主播提到这个事情,是因为想解释他为什么开始学编程。
主播在做播客,写博客,但这些需要持续输出、持续运营。他想学习前端等技术,这样可以运行某些服务,如SaaS。一旦服务部署,有了用户,则后续基本不需要持续投入,即可有源源不断的收入。
其实这也是我前面写的编程可以解决重复性劳动的一种思路。
但是对于大多数初学者来说,前端需要涉及的内容较多、较杂,一旦学习遇到挫折,很容易丧失继续学习的信心。 Python
入门需要的知识则少得多,也能立即对自己的工作、生活起到立竿见影的效果。后续如果对于互联网服务有兴趣,既可以学习 JavaScript
等前端语言,也可以继续学习 Python
。毕竟, Python
除了不能帮你生孩子,什么都能做!x