最近几年,程序员这个职业逐渐升温,学编程的人也越来越多,国外有个非盈利的开源社区,叫做FreeCodeCamp,目的是教人零基础学编程,现在已经汇聚了26万之多的人数。
我在深圳南山科技园上班,南山这边的写字楼也是越修越多,从科技园北区一路向南走,你会发现又多了好几个片区,在建的和新建的都有,例如深圳湾片区,软件基地片区等,我总在想,修这么多写字楼,有那么多科技公司吗?有那么多程序员吗?也许现在没有,等到修好就有了,这代表了这个行业的发展速度。
随着人工智能,虚拟现实等技术的爆发,计算机领域迎来了新一轮的技术革命,因为世界在发展,计算机处理的事情也会越来越复杂,计算机语言的发展趋势必定会越来越简单,不然开发的人力成本会越来越高,于是学习计算机的门槛会越来越低,结果是,我们的下一代人人都会使用计算机编程,编程变成了生存的基本技能,所以:未来的文盲不是不识字的人,而是不会编程的人。
微信公众号的slogan是:在小的个体,也有自己的品牌。于是一大批人开始写作,从而塑造自己的品牌,在公众号里写作,好的作家可以通过“赞赏”功能获得读者的鼓励,同时,他还可以把平时的作品汇集成一本书,从而将自己的一份时间出售多份。除了写书以外,任何创作实际上都可以达到这样的效果,其中开发一款受欢迎软件,并把它出售多次,是少有的可以让你产生巨额回报的方式。
作为一名程序员,我对这个职业的自豪感在近几年里不断提升,记得刚毕业那会,我经常会被金融行业的同学“鄙视”,因为待遇差距大,为了取得心里平衡,我只能用行业差距来安慰自己。而几年后,互联网行业已然冲到了行业榜的前列。曾经经常听到一句话:程序员吃的是青春饭,如果30岁前不转行或做管理,那么一定是死路一条,现在几乎没听过这样的言论了。相反听得最多的就是:嫁人就嫁IT男。
说了这么多,你一定对编程产生了好奇,也许你会问:非科班出生,如何才能学会编程?学编程难吗?这个问题的答案和你的目标有关,假如你想成为一名程序员,我会告诉你很难,例如在FreeCodeCamp上学完所有课程,需要2000个小时,学完后你就有能力找到一份相关工作,而坚持2000小时对于一个人来说并不容易——假设你每天花2小时,需要3年。
其实编程和成为一名程序员是两码事,就像用英语对话和成为一名英语翻译者是两回事一样,衡量程序员的标准往往更多,要求更严格,花的时间自然也更多,很多人在这条路上走得很辛苦,原因在于知识点多,无法看到全局,很容易就陷入其中而无法自拔,或者即便看到了全局,也要一项项的学完,即使学完了,还是不知道如何完整的完成一个作品。拿前端工程师举个例子,一个合格的前端工程师,要具备OS,HTML,CSS,Javascript,JQuery,Ajax,数据库,良好的编码风格,HTTP,Websocket,网络安全,git等众多技能,从一个初学者的角度来看,光看完这些专有名词就已经吓尿了,所以,花2000小时来成为一个程序员,是必要的。
程序员的门槛高,一般人不一定要以此为目标,�就像我写作,也并不代表我要改行成为一个作家,而想学会编程,却是一件很容易的事情,我理解的编程是具备编程能力及拥有计算机思维,换句话说,就是利用计算机提升你的工作效率,减少重复劳动,从而把更多的时间用在创造上面。当然,如果你具备了编程能力,同时有意成为程序员,从这个起点上过度会简单得多。
我认为具备编程能力很简单,是因为我们几乎每天都在使用计算机,使用计算机和会编程之间其实只隔了一张纸,那张纸,就是图形界面,你觉得难,是因为我们被图形界面驯化了,在罗振宇和罗永浩的《长谈》节目中,他们谈到对驯化的理解
有一种人30多就开始当领导,带team,这种人就是被公司驯化的人,就是虽然看着我们在合作,但是自己的能力就逐渐没有了。时间一长,你会丧失基本的生存能力。好比你有了秘书久了,什么订酒店之类的事情自己反而不会处理。穷查理宝典的查理芒格,他一个多么富有的人,出门还做经济舱。李笑来就说自己最怕被金钱驯化,无论富有还是贫穷,我们都值得警惕这一点。职场的人到今天为止最怕的就是驯化。
图形界面让我们使用计算机的方式更为傻瓜化,人们会认为日常使用的计算机软件(例如Word)和编程是两码事,而在我看来,他们的本质是一致的,都是利用计算机帮你做事,抽象点来说,就是你给予它一定的输入,它会反馈给你相应的输出。具体一点,面对图形界面的驯化,我们应该怎么做呢?
除了日常使用的软件外,抛弃图形界面,思考下一步操作,用命令行该怎么完成。
这里命令行相对于图形界面来说,是一个人机字符交互界面,在不同的操作系统上,命令行程序也有区别,在macOS上,我们一般使用zsh,Linux上使用Bash,而Windows上则使用PowerShell或sygwin,在你的计算机上安装对应的命令行工具,就可以开始了。
操作系统中的一切都被抽象为文件,文件是用一种树形结构来组织的,而我们日常的操作基本上也可以看做是对文件的操作,所以,抛开图形界面,你可能首先要弄清楚:
- 如何定位到一个目标文件
- 如何执行一个可执行文件,同时让另一个文件作为这个程序的输入,例如用MS Word打开一个word文件
- 如何更新一个可执行文件
- 如何从互联网上下载一个文件
- 安装一个程序,计算机里多了哪些文件
- 如何删除一个文件
- 如何搜索计算机里有没有一个文件
- 如何找出文件夹下含有“TODO”字样的文件
- ……
不用图形界面后,你可能会遇到很多这样的操作,千万不要想一次性学玩,最好的办法是,遇到一个学一个,记在本子上,下次用的时候,直接用,忘记了再查一下你的本子。
那么问题来了,你可能会问:这不是更麻烦了吗,我在图形界面操作一个文件可能需要1秒中,现在用命令行,至少要10分钟……不要小看这些命令操作,它们除了可以单独使用,还可以组合起来使用,即把前面一个命令的输出,作为下一个命令的输入,下面这个例子可以很好的进行说明:
某一个文件夹中有各种各样的文件,除了文件,还有子文件夹,现在你想把文件夹下所有.torrent种子文件打包到一个压缩包中
如果你用图形操作,你的步骤是:
- 挨个打开每个文件夹,把.torrent文件复制到另一个空文件夹中
- 将新文件夹压缩
而命令行只需要一行命令:
find . -name *.torrent | xargs tar czvf torrent.tar.gz
仅仅一个命令的组合,就可以产生惊人的变化,前提是你要知道基本的命令怎么写。那么你又可能会问了:我想学的是编程,这些命令和程序有什么关系?回答这个问题之前,我们要先认识一下什么是程序。刚才说了程序都有一个共同的特征:给它一些输入,它便会对这些输入进行处理,最后产生一些输出。下面是重点,基本上所有的程序语言都提供三种语句:
- 顺序
- 分支
- 循环
利用这三个语句可以完成一切流程,也就是说,所有的程序都是由这三种语句组成的,它们形成了程序的逻辑,可以把顺序、分支、循环理解为一种控制命令。了解了基本命令和控制命令后,把它们按照逻辑组织起来,就是你的程序了,你看简单吧。可能你还会问,我这学的是什么编程语言?在计算机中,这是最基本的编程,我们叫它Shell编程。
我再举一个例子来说明一下,我们每天写文章,可能要把下载的图片先处理一下再上传,比如一张图片很大,我们就要对它进行等比例缩小,这样在手机里显示时才不至于加载过慢,从而影响阅读体验,而每写一篇文章我们都要做这样的操作,显然需要花不少时间,所以你可以写个程序来帮你做这个事儿,这里先假设你的图片是在1小时内下载完的,这个程序的步骤如下:
- 切换到图片的下载目录,例如
~/Downloads
- 创建一个临时目录,例如
uploads_temp
- 找出1小时内下载的图片
- 将这些图片等比例压缩成宽度为400像素的图片
- 转换后的图片文件放在
uploads_temp
下 - 将处理后的图片上传到七牛云存储(可选)
- 回之前的目录
最终程序如下,我用数字标记了以上每一步,对应的代码是怎样的
#!/bin/sh
cd ~/Downloads # 1
mkdir uploads_temp #2
find . -mmin -60 | grep -iE "png|jpg" | xargs -I@ convert @ -resize 400 uploads_temp/@ # 3 4 5
sed -i 's#"src_dir".*#"src_dir":"uploads_temp",#' qupload.json # 6
qshell qupload ./qupload.json
cd - # 7
现在看不懂没关系,只要你开始,在今后一定会掌握这些命令。这里只是通过这个程序来给你一个深刻的印象,今后你每次下载完图片后,只需要执行这个程序,就可以一键完成上述所有工作,试想一下,如果你不用程序来完成,你需要花多长时间来做这件事,而真正解放了你的劳动力的,仅仅只有7行代码而已。
到这一步,你就是一个拥有编程能力的人了,后续,如果你想继续深入,也只需要你具备一个特质即可,那就是不断探索——例如,如果有一天你写的小程序足够多时,你可能需要做一个界面,或页面来管理你的程序,那时,你就真正从命令行跨越到了图形界面。