非科班如何学编程

作者: 程序员在深圳 | 来源:发表于2017-04-21 18:57 被阅读3337次
    题图

    最近几年,程序员这个职业逐渐升温,学编程的人也越来越多,国外有个非盈利的开源社区,叫做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,在你的计算机上安装对应的命令行工具,就可以开始了。

    操作系统中的一切都被抽象为文件,文件是用一种树形结构来组织的,而我们日常的操作基本上也可以看做是对文件的操作,所以,抛开图形界面,你可能首先要弄清楚:

    1. 如何定位到一个目标文件
    2. 如何执行一个可执行文件,同时让另一个文件作为这个程序的输入,例如用MS Word打开一个word文件
    3. 如何更新一个可执行文件
    4. 如何从互联网上下载一个文件
    5. 安装一个程序,计算机里多了哪些文件
    6. 如何删除一个文件
    7. 如何搜索计算机里有没有一个文件
    8. 如何找出文件夹下含有“TODO”字样的文件
    9. ……

    不用图形界面后,你可能会遇到很多这样的操作,千万不要想一次性学玩,最好的办法是,遇到一个学一个,记在本子上,下次用的时候,直接用,忘记了再查一下你的本子。

    那么问题来了,你可能会问:这不是更麻烦了吗,我在图形界面操作一个文件可能需要1秒中,现在用命令行,至少要10分钟……不要小看这些命令操作,它们除了可以单独使用,还可以组合起来使用,即把前面一个命令的输出,作为下一个命令的输入,下面这个例子可以很好的进行说明:

    某一个文件夹中有各种各样的文件,除了文件,还有子文件夹,现在你想把文件夹下所有.torrent种子文件打包到一个压缩包中

    如果你用图形操作,你的步骤是:

    1. 挨个打开每个文件夹,把.torrent文件复制到另一个空文件夹中
    2. 将新文件夹压缩

    而命令行只需要一行命令:

    find . -name *.torrent | xargs tar czvf torrent.tar.gz
    

    仅仅一个命令的组合,就可以产生惊人的变化,前提是你要知道基本的命令怎么写。那么你又可能会问了:我想学的是编程,这些命令和程序有什么关系?回答这个问题之前,我们要先认识一下什么是程序。刚才说了程序都有一个共同的特征:给它一些输入,它便会对这些输入进行处理,最后产生一些输出。下面是重点,基本上所有的程序语言都提供三种语句:

    1. 顺序
    2. 分支
    3. 循环

    利用这三个语句可以完成一切流程,也就是说,所有的程序都是由这三种语句组成的,它们形成了程序的逻辑,可以把顺序、分支、循环理解为一种控制命令。了解了基本命令和控制命令后,把它们按照逻辑组织起来,就是你的程序了,你看简单吧。可能你还会问,我这学的是什么编程语言?在计算机中,这是最基本的编程,我们叫它Shell编程。

    我再举一个例子来说明一下,我们每天写文章,可能要把下载的图片先处理一下再上传,比如一张图片很大,我们就要对它进行等比例缩小,这样在手机里显示时才不至于加载过慢,从而影响阅读体验,而每写一篇文章我们都要做这样的操作,显然需要花不少时间,所以你可以写个程序来帮你做这个事儿,这里先假设你的图片是在1小时内下载完的,这个程序的步骤如下:

    1. 切换到图片的下载目录,例如~/Downloads
    2. 创建一个临时目录,例如uploads_temp
    3. 找出1小时内下载的图片
    4. 将这些图片等比例压缩成宽度为400像素的图片
    5. 转换后的图片文件放在uploads_temp
    6. 将处理后的图片上传到七牛云存储(可选)
    7. 回之前的目录

    最终程序如下,我用数字标记了以上每一步,对应的代码是怎样的

    #!/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行代码而已。

    到这一步,你就是一个拥有编程能力的人了,后续,如果你想继续深入,也只需要你具备一个特质即可,那就是不断探索——例如,如果有一天你写的小程序足够多时,你可能需要做一个界面,或页面来管理你的程序,那时,你就真正从命令行跨越到了图形界面。

    相关文章

      网友评论

      • AE_sdyang:可能有一天程序像高等数学一样是基础课,每个人掌握的技能。而谋生需要智慧,技巧,算法
      • 林培智:这是林培智点评的第17篇文章

        标题简单,但足够吸引人,相信作为一篇教程文,这样的标题无疑保证了较高的文章打开率,然而最重要的还是内容本身。这一点上,我从行动证明。简书上的第一笔打赏给了这篇文章。写的不复杂,通俗易懂,特别是对于不懂编程的人而言,举图片处理的例子,作为一个摄影师确实是深刻的理解到每天要花大量的时间,处理图片的痛点。

        今年的一个目标:报名全栈营,学编程,看完这篇文章之后更加坚定了这一目标。

        请教两个问题,对于一个小白,想入门编程,有哪些书可以推荐?另外,如何评价X-dite的全栈营?

        感谢分享,林培智个人观点,仅供参考。
        程序员在深圳:@林培智 她比我牛,facebook黑客松冠军不是一般人可以做到的,要相信比你牛的人
      • 椰汁加冰:那市面上那些开源的可视化爬虫怎么刊,除了要费用之外,其他有什么区别吗,因为对于超级超级小白来说,真的是很头痛
      • 2014王小子:现在巅峰说的?
      • 何思源:对你的文章印象深刻!
        1、宏观趋势、微观操作都讲解的十分清楚!
        2、考虑到的读者的需要和目前亟待解决的问题;
        3、用浅显的例子完美支持了自己的观点。

        最近正在读《Head First HTML与CSS》觉得把教程写好也是非常不容易的!赞赏一个!
        程序员在深圳:@小鱼宝的读书生活 谢谢
      • 我的职业是小说家:步步设伏,步步精彩,让我对shell编程有了更进一步的认识
        程序员在深圳:@秋月春风_b612 谢谢
      • 扰人的梦:讲解思路挺实用
      • 小轩看世界:看了很有收获,还有我想知道的是你文章里的代码用的是哪种编程语言
        程序员在深圳:@小轩看世界 shell
      • 庞哈哈哈12138:文章很有深度,不错,赞一个。刚入行那阵,接触过vim 也是老前辈带我怎么用Linux 命令行编程,让用IDE 习惯的我一时难以理解,不过确实命令行敲得6,基本可以离开鼠标了,就是学习曲线非常陡
      • 鸣鹿11:图片的处理好实用,先保存下
      • 仲秋雨路:写的深入迁出,不错,向你学习

      本文标题:非科班如何学编程

      本文链接:https://www.haomeiwen.com/subject/tjhoattx.html