分享

写了那么久代码了,给大家谈谈我怎么理解编程

 蜗牛s66shdvnz3 2018-05-06

目录

前言

什么是编程

从问题出发

在自己的生活中使用编程

检索信息

分析问题

向他人提问

给初学者的入门路线——略知天高地厚

学一门“性价比”极高的编程语言——JavaScript

学习做一个可视化的 UI 界面

把程序封装到想要的平台

学习与系统交互

学会利用第三方的库

找到自己的方向

写在最后

前言

最近公司要招一个人后端程序员,把面试的工作安排给了我。面试招人也很顺利,也招到了一个不错的小伙子,但让我印象深刻的是其中一个有着三年工作经验的“老程序员”。这位“老程序员”非常自信地给我展示了十多个他写的网站后台以及哪些千篇一律 CRUD 的表单,然后跟我谈他写的 SQL。

“你看你写了那么多差不多相似的东西,那你有没有积累一套自己的库或者工具用来快速生成这些 CRUD 的表单?”,我问道。“啊?”。看出了他明显有些疑惑,于是接着问道,“那你除了给公司写这些业务代码以外,有尝试过给自己写过代码吗?也就是说方便自己生活或者工作的工具之类的?”。“……”,他沉默了,不知道该怎么回答我。最终的结果当然不言而喻,否则我也不会写在这篇文章里面。在我看来,这位拥有三年工作经验的老程序猿,虽然他熟悉语言,熟悉框架,熟悉业务,但其实并没有学会编程,甚至不如我们刚招进来的应届生小伙子。

这次事情让我想了很久,也向身边很多人交了一下,才发现原来在编程时候,很多我觉得理所当然的基本能力,居然都是稀缺资源。这当然并不怪谁,因为“意识”或者“思维”这个看不到摸不到的东西,并不是说自己只要努力就行了,还需要向别人借鉴吸取经验,也需要有自己的悟性和思考。那么借着这篇文章,我也结合那么多年来的所想所感来聊聊怎么学编程,怎么学好编程。

什么是编程

我的理解的编程是:面对一个问题,经过思考后,最后将解决这个问题的思路用计算机能理解的方式表达出来。这里面有三个关键词,“问题”、“思考”以及“表达”,我觉得这是三个关键词也是编程最关键的地方。但是非常多的人看待编程这个问题的时候,往往都只能看到最浅层面上的写代码,而“问题”和“思考”这个两个关键词则被大多数人所忽视了。

其实“程序员”这项工作,无论是想做技术还是转管理,无论是做学术还是做工程,只要越往上走,“问题” 所占的重量就会越来越高,相应的写代码所占到的能力比重会越来越低。甚至一些顶层的大型系统架构师,顶层的算法科学家,甚至可能一行代码都不需要写。

从问题出发

举个例子,乔帮主的 iPhone 为什么能重新定义手机,因为一开始大家将手机所解决的问题定死在了打电话收短信这个通信领域,而乔帮主用 iPhone 重新定义了手机所解决的问题,让打电话和收短信支部会是附属的功能之一。乔帮主重新定义了问题,让以通讯起家的摩托罗拉,诺基亚等大厂从此衰败的。

众所周知,前端技术发展迅速,很多前端们大呼学习成本高,但是前端的小伙伴们真的想明白了前端为什么会如此迅速地发展,到底是什么在领着大家快速往前跑?答案还是我们这章节的标题——问题。比如,Vue / React 等框架的出现,并不是解决了 jQuery 所面临的 DOM 操作复杂的问题,而是从新定义了问题。前端的高速发展,就是我们的先辈们一遍一遍重新定义我们面对的问题而产生的。

我在知乎或者其他编程社区经常能看到有人问类似的问题,大致是说已经学会了一门编程语言了,但是却不知道自己能干什么。这种问题最常出现在计算机科班学生的身上,比如大一的时候学了 C / C艹 了,所有的语法都学会了,但是不知道自己能干嘛。

因为在那时我们并不知道自己学了这门编程语言,面对的是什么样的问题。老师从来都没有告诉我们学一门学科要拿来干嘛。这就导致了我们在学习的时候,尤其是学习计算机一些理论基础的时候,完全没有目的,不知道自己学习的这门学科面对的是什么问题,不知道它需要解决什么问题,在现实中是要怎么用。最终非常多学计算机的莘莘学子,像我一样,哪怕在双一流高校学习了四年,甚至靠着高中积累下来的应试经验拿了很高的成绩,却依然是一脸懵逼。

学习编程,尤其是计算机科班朋友一定要注意,在你学习一门课程的时候,请一定一定先了解这门学科的背景,历史以及所面临和需要解决的问题。

在自己的生活中使用编程

我大学时候是软件工程专业,我曾经推荐过一个直系小学妹用“按键精灵”这个工具。她非常疑惑为什么我一个她眼中的“专业”人士会给她这个正在走向专业道路上的人推荐一个“业余”工具。我跟她说,如果她能用好这个工具,那么肯定就能学好编程。

按键精灵,这样一个非常非常业余,很多所谓“专业人士”都看不上的小工具,却蕴含着编程这个领域非常深刻的理解。那就是发现我们生活中的问题,并且用我们手上能利用的工具来改善我们生活,方便我们生活的能力。

还记得我们初中历史上学的内容吗?人与动物根本区别是什么呢?答案是:会不会制造和使用工具。我们要解决一个问题的前提是,我们知道这是一个问题。我们人类会制造和使用工具,前提是我们人类明白 “提高效率” 这是一个问题。

在按键精灵上面写脚本的大部分都不是专业的程序员,他们可能是已经在工作的公务员,小学老师,也可能是闲着蛋疼的大学生,甚至可能是一个喜欢玩游戏的初中生在给自己做游戏挂机脚本。但是在我眼里,他们是一群保留了人类进步那种最原始的动力和火种的人。所以我也相信,这些人如果真的从事了程序员这个行业,毫无疑问都将会是其中的佼佼者,因为他们都懂得编程,只不过还不会一门编程语言而已。

如果有编程经验的朋友推荐工具:

Tampermonkey 油猴子: greasyfork.org

JSBox 手机上的油猴子: jsboxbbs.com

如果没有编程机的朋友,那么推荐以下工具来方便自己的工作和生活:

Mac 用户推荐:

Automator (现译 “自动过操作”)

检索信息

我曾经教过一个多伦多大学的金融妹纸 Python ,她们有 Python 的课程但是她根本没好好学,不然也不需要来找我临时抱佛脚了。我原以为教她会很难,但相反的她进步神速,基本上很少提那些太小白的,比如让我帮她找语法错误这种问题。我也很好奇,就问了她一下,她告诉我说:“啊?没什么啊,就是把程序的错误信息丢到 Google 上面随手搜了一下而已”,这一瞬间,我对她刮目相看。

没错,就是简单把程序的错误信息丢到 Google 搜了一下而已。但是你知道这项能力,就是在哪些个双一流高校的计算机专业孩子也不见得有呀。所以在开源世界大家甚至还需要专门做了一个叫做 Let me google that for you 来吐槽那些不会用 Google 的人所有。可想而知,搜索这项技能真的没有那么深入人心的。

GIF

我们为什么要读书?为什么要学习?根本原因是什么?我们要读书要学习的根本目的是要解决我们生产生活中的问题,这个应该所有人都能理解吧,但这只是目的不是原因。我们要读书,要学习的根本原因说出来可能不太好接受,就是这世界上除了极小一部分人以外,绝大多数人在生产生活中遇到的绝大多数问题都是别人已经解决过无数遍了的,所以我们才需要通过读书学习来获取我们前人的经验。

用好搜索引擎的关键在于提取你问题中的关键词,而不是用整句问题进行搜索。你可以到知乎搜索:如何用好谷歌等搜索引擎?获得更多技巧。

分析问题

既然如此,那我们岂不是就是复制前人的“工具人”吗?我们自己的智慧体现在哪里?带橡皮擦的铅笔不了解一下吗?

当然不是!我们广大程序员,每天夜以继日的工作,其实就在干一件事情——对问题进行分解,对工具进行组合。为什么有时候程序员会自嘲自己是“调包侠”或者“API工程师”,原因就在于我们大部分时候,用的都是先辈们给我们创造的基本工具。这些工具虽然只能解决基本问题,没办法直接满足实际复杂的问题,但是我们程序员可以通过分析现实的问题,然后通过组合现有的工具,来组成新的工具解决现实的问题。

我们程序设计的结构(架构),往往跟我们问题的分解结构是一致的。更确切的说,我们对问题的分解结构,确定了我们最终代码的结构。

将一个问题分解成多个简单的小问题。如果每一个小工具能解决一个小问题,那将工具组合,是不是能解决复杂问题吗?

向他人提问

我们可以用搜索引擎解绝大部分的问题,但是总有它解决不了的问题,这时候我们需要借助别人的力量,向他人寻求帮助。如果身边恰好有熟悉相关领域的大神,大可直接向身边的大神提问,不过不是所有人都有那么好运气,这时候我们可以去有大神的地方寻求帮助,比如可以来知乎提问题,去 stackoverflow,或者相关的社区和论坛,甚至可以直接在 github 上开 issue 来寻求帮助。

那么,问题来了。怎么提问题?以及你真的会提问题吗?有时候我们有一个错觉,觉得我们每天都在做的事情很简单。提问题就是其中一个,怎么样提一个好问题,提一个别人愿意帮助你的问题,绝对是一门学问。你觉得 “程序错了,急急急,在线等” 这样的问题会有人愿意答吗?你觉得会有人喜欢给伸手党解决什么问题嘛?当然不可能呀不是。

庆幸的是,在开源世界的上古时期,就已经有人先辈发现了提问题,同样也是一个问题。所以先辈们将提问题的方法和经验总结在了一份文档里面,并起名为《提问的智慧》。我认为这应该是所有进入这个领域这个行业的必修课程之一。

提问的智慧:github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way

给初学者的入门路线——略知天高地厚

“好的,你说的道理我都懂了,那么我想学编程,我应该怎么办?”

不给勺的鸡汤都是耍流氓,我写这篇文章当然不是为了只耍个流氓就跑的,所以还是希望给想学编程的小伙伴们一些更为实质的意见吧。

学一门“性价比”极高的编程语言——JavaScript

首先对于选择编程语言方面不要犹豫,就学 JavaScript。我从来都喜欢推荐萌新入门学习 JavaScript,甚至我推荐所有相关行业都学一下 JavaScript 备用,这不是因为 JavaScript 有多好,而只是因为 JavaScript “性价比”非常高。

我推荐用 JavaScript 入门的原因非常简单:

简单好学,并且包含虽有主流编程语言范式。

可以简单快速的建立漂亮的 UI 界面。

从前端到后端,从 PC 端到移动端,从应用到游戏,从嵌入式和机器人到深度学习以及人工智能, JavaScript 都能有所涉及。

回到我们本章的标题《略知天高地厚》,略知代表我们并不需要去深入研究所有领域,我们只需要依赖 JavaSciprt 这个环境,以及知道这些领域的成果,我们就可以通过“调包”、“调API”来为我们解决问题就行了,所以才是略知天高地厚。

你可以通过廖雪峰的教程来学习 JavaScript ,并且稍微了解一下 Node 和 npm 环境:

学习做一个可视化的 UI 界面

所以我们的第二步就是弥补我们曾经的缺陷,我们现在一开始做出来的程序,就是要有图形界面,就是要能够给我们其他的朋友用以及炫耀。这里需要学习的东西也非常简单,HTML 和 基本的 CSS 足以。我们的图形界面必须要跟我们的程序交互才有意义,所以要学习一个能把程序和界面轻松绑在一起的工具 Vue

把程序封装到想要的平台

到上面为止,我们学到的东西还仅仅只能做一个网页对吧。我们想给我们的朋友玩,不能就发一个 HTML 页面或者一个 JavaScript 脚本吧,因为这并不像一个独立的程序。那么接下来,我们要做的就是把我们的程序封装打包到我们喜欢的平台。

如果喜欢封装在 PC 平台,那么欢迎使用 Electron 或者 NW.js,学习其中一个就能将我们的程序打包成一个有带有图形界面的“exe”(跟黑框框 say good bye 吧)。NW.js 更简单,但是文档和资料比较少,Electron 文档和资料比较好,但是使用稍微复杂。自行斟酌。

如果想要做成移动应用(也就是大家说的 APP),那么可以学习 PhoneGap ,可以将我们的程序封装成手机上的 APP 。如果是想打包成安卓应用的话,可以直接发给身边的小伙伴,iOS因为有限制没有办法。

学习与系统交互

我们的程序现在已经有一定能力,但是能力其实还是很弱的,弱在一个可用的程序需要跟操作系统交互,来读写文件、读写图片或者访问网络。而接下来需要学习的就是如何和系统进行交互。我们需要学习的是上面所使用框架提供的读写文件图片,访问网络的 API。常用的网络的协议还有 HTTP 和 WebSocket 等。

访问文件 API:

Electron https:///docs/api/file-object

http://docs./en/latest/References/Changes%20to%20DOM/#input-typefile

PhoneGap 选择获取图片 : http://docs./en/3.3.0/cordova_camera_camera.md.html#Camera

Electron / NW.js / Node: https:///api/fs.html

Eelectron / NW.js/ Node 访问网络,使用第三方库:

https://github.com/request/request

HTTP https://www./

SocketIO https:///

学会利用第三方的库

在学习的过程中要时刻明白一点,我们所遇到的问题大概率是别人已经解决烂了,所以这时候要尽量站在巨人的肩膀上,而不是什么都尝试自己造。所以我们需要第三方别人已经造好的库和工具来加速我们写代码的过程。下面两个网站就是收集了各类常用资源的大全,如果遇到什么问题,不妨在上面找找,说不定就有惊喜!小技巧:自行 Google 你所使用的语言或者框架加上 awesome 关键词,就能搜索到常用的第三方库合集。

javscript 有趣的项目: github.com/sorrycc/awesome-javascript

nodejs 有趣的项目: https://github.com/sindresorhus/awesome-nodejs

找到自己的方向

略知天高地厚,是大概清楚编程的能力,大致能干什么。现在你已经有足够的能力去找到一个自己喜欢或者适合的领域自学了。现代环境对程序员的要求已经慢慢变高了,一个正经的程序员基本上都能熟练使用 3 门以上的编程语言。所以不要纠结于编程语言,需要用到就去学便是。

到目前为止,上面学到的所有东西也许可能不见得会成为你吃饭的直接工具,但是绝对是你背后的助力。

写在最后

编程是一项对一个人综合能力的集中体现,并不是说学个语言,会写两行代码就叫做会编程的。最后欢迎来到我们编程世界!也希望大家能够自由地畅游在我们这个多最多彩的世界!

Hello world!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多