学编程,究竟学的是什么
爱因斯坦说过一句话
我学得东西越多,我越意识到更多的我不知道的东西。
编程领域也是一样。
没有编程经验的人,心中对编程人员的理解可能就是电影上描绘的黑客。坐在密密麻麻屏幕前,随便敲敲代码,嗖,银行卡里的钱就多了,别人家的门就开了,说不定哪颗导弹就上天了。好像学会了编程就无所不能,为所欲为了。
是,确实是有可能做到这些的。“黑”到了别人的系统,你就可以想干啥就干啥了。但是落到具体的动作,就完全不是你想象的“敲敲键盘”这么简单了。
不说别的,就说编程语言。按照大类就有
- 机器语言
- 汇编语言
- 高级语言
可能每天学一种,一个月都不带重样的。怎么样,是不是很惊悚。原因非常简单,计算机科学在短短的四五十年时间内发展速度实在太过惊人,每隔一段时间就会有新的技术出现。比如说现在大家能听到的云,大数据,人工智能都是在近四五年时间突然崛起的。
好了,那请问你说的学编程是学什么呢?是学哪门语言么?是学某个具体的技术么?这些都是。那对于一个想要学习编程的人,尤其是一个初学者,怎么样在这浩如烟海的计算机知识中选择需要学习的内容学习?又怎么样建立起自我学习的能力,在下一次技术革新的时候,能够有自己的判断力知道自己要怎么学习,或者自己不要学什么呢?
在这里我分享一下我自己的一点点总结,希望能够帮助到大家。
带着计算机思维学习经典语言
很地方都说语言是最不用学的一个,因为学会了一种语言基本上再学另一门语言就易如反掌。
是的,基本上没错。计算机语言之间(高级语言)可能有80%是互通的。只要你对某一门语言掌握得比较好了,另一门语言基本不需要学习。
那我为什么还要着重提这一点,而且还放在头一位?
因为对刚学习编程的小白来说,理解语言是进入计算机世界的一个渠道
就好像我们要进入英语世界一样,如果连英语都不会,别人再怎么说英语其实不难,你还是被挡在了英语世界之外。
除了要学好编程语言之外,作为一个老司机,我还有两个tips给到你:
- 带着计算机的思维去学习
- 要学习就要学习经典
第一点和学英语又很像了。很多人英语学了半天讲出来的一听就知道是中式的,这就是因为他没有用英语思维在说话。换到计算机领域如果我们知识掌握了一个语言的表面意思,很可能换到另一个语言你就慌了。
比如很多程序猿写代码已经很溜了,因为干这一行很久了嘛,所谓熟能生巧是也。然而很多人反应不会用git,说靠这玩意太难了。但是git已经是现在软件行业代码管理的事实标准了,不懂不行。为什么呢?因为在他们的头脑中想象不出git的运行机制,自然理解起来就困难些。然而你通过语言的学习,如果掌握了计算机的思维,那对以后的学习就所向披靡了。
写到这里我突然想起新东方三巨头王强在北大做过的演讲。其中提到学习的关键就是 读一流书。
(视频无法嵌入,用bing 搜索“王强北大演讲读书如何改变我”。或者关注我的微信公众号“杨小伟的世界”看原文。)
我人生的捷径就是花了时间非常痛苦的啃了那些一流书,反而最后收益。
若能遇到像王强一样的老师,真是吾生所幸。
我推荐的学习的和王强当时学习的语言一样,c语言。在视频42:00段还提及了学习c语言时选择的经典书目。不过很多人都被c语言的难度吓跑了。却不知道看似挑了一条快速的道路,实则要用更多的时间去弥补。
跟着大牛学习经验和行业知识
如果我们抛开计算机思维,单纯把编程看作一项技能,那学习技能的最佳途径是什么呢?
跟着别人模仿
我们很多人觉得编程很难,觉得做某个新的领域很难是因为
我们没有看到活人在做
这一点在我之前的文章中也曾经提到。当我们开始一个新的领域时,我们通常倒在了最最简单的地方,而不是传说中很难的地方。比如我之前参加全栈营的学习,很多同学在系统环境配置上就倒下了,还根本没有到代码编写,真正体会编程乐趣的时候。因为有非常详细的教材,有助教和同学的帮助,很快速的跨过了第一阶段的环境问题,避免了大家倒在一个根本不是问题但又确实存在的坑上。
所以学习编程的第二点就是找到某个领域的大牛,看着他是怎么做的,从他身上获得这个领域最直接最快速的套路,避免自己跌在前任曾经跌过的坑里。不仅是编程,我认为这是进入所有新领域的最快速的方式。
而且这也是你能“买”到的唯一方式
又回到全栈营的例子,作为一个资深程序员我获得的是什么呢?
- 用RoR搭建网站的套路
- 发布自己网站的套路
- 各种工具使用的套路
所以编程学习,不仅仅是我们想象中的语法和代码,还有周围的各种软件的使用,工具的搭配,外部资源的利用等等。这些如果是依靠自己摸索那绝对避免不了踩坑,这也是这些牛人经验的价值所在。
持续训练自己的逻辑思维
编程说到底是逻辑在软件上的体现。这也是我上一节中说大牛的经验是唯一能“买”到的东西。逻辑思维能力不可能由别人告诉你,哪怕是告诉了你一种方案,下次遇到新的方案你就又懵圈了。
逻辑思维能力需要的是训练,而且是大量的重复训练
刚才被王强老师吓回去的朋友这次估计又要吓回去了,能读到这里的估计能有30%就不错了。在这个鼓吹一切都要快速的世界,人们最受不了的就是要花时间。恨不得马上学会九阳神功,或者像段誉一样吸收别人的功力。
记得武志红的专栏中说过(非原话,是我记忆的版本)
这世界一切都是时间的凝结
不论是你自己技能的提升,还是和别人的关系,都离不开时间的因素,只是大家都觉得自己会飞。
最近有朋友问“没有经验,能学会编程么?”这个问题我思考了很久,一开始一直不知道怎么回答。编程不是很简单吗,按照语法敲敲键盘不就出来了么?不对,那些神一般的代码还是看不懂啊,这能算学会了么?后来我终于想明白了,“学会”的概念是在太宽泛,太不准确了。
不同的层次对“学会”有着巨大的差距
- 刚开始能输出HelloWorld就算学会了
- 接着能够用代码读写文件就算学会了
- 再后来能写个贪食蛇游戏就算学会了
在这个过程中,每一次的提升都对语言和工具本身的提升。这些都是比较好容易量化,但是如何让自己的程序有魂,能够写出自己想要的结果,则依赖于自身逻辑思维能力的提高。而这个过程则是永无止境的。
那回到学习编程这件事上,怎么样才能提高自己的逻辑思维能力呢?
不断练习
是的就这么简单。
以前有人问我为什么我的英语还不错,我想我唯一做的事情就是当时把所有课文都背到滚瓜烂熟。那些所谓的语法和语感就自然显现。这和逻辑思维能力一样,只要你不断的训练自然就能提高。但是这又不是一朝一夕,能够迅速让你看得到变化的。
这就涉及到了学习方法,恐怕本篇展开也无法说清。总结成一句话
学到了最少必要知识,就直接开干
写在最后
一入编程深似海
这是编程最痛苦的地方,也是编程最有乐趣的地方。
学习的东西总是那么多,但你总觉得自己在不断进步
对于一个想要学习编程的你,我的建议是:
- 带着计算机思维学习经典语言
- 跟着大牛学习经验和行业知识
- 持续训练自己的逻辑思维
你来或者不来,程序都在那里,不增不减
最后放一个我曾经写的无聊的游戏吧