计科专业大一学生一枚,如何提高编程能力?
作者:三级狗 长不帅的程序猿小哥哥 Python爱好者社区专栏作者
文章出处:https://www.zhihu.com/question/275611095/answer/407984155
先简单介绍一下我的情况:大概去年的这个时候从学校毕业,二本A软件工程,现在在北上广深之一的某卫星城从事互联网相关工作,月薪勉强养活自己。看上去一份很没说服力的简历,希望我下面的话,不会让你有这个感觉。
对于如何提升自己的编程能力。其他的回答中很多人都说了,这没什么捷径,就是多练,问题是并没有人说怎么练?一天敲50遍Hello Word算多练嘛?当然,各路大佬自然是知道该怎么练的,只是懒得在逼乎上浪费时间。我属于比较爱扯淡的,就在这里长篇大论的扯一波儿,不喜勿喷。
首先、什么算你所谓的编程能力?
我们对一项技能的掌握程度往往很难量化,对于编程能力的考量可能比较抽象,我们来类比比较直观的其他技能。比如说什么叫会弹吉他?我们说一个人吉他玩的好,这个人会弹吉他,是指他会弹《小星星》?还是会弹岸部真明的《time travel》?(力荐,好听!)恐怕都不是,我们对于会弹吉他的认知,应当是随手给他一个不熟悉的谱子,你也能很快的用吉他精彩的演奏,我们才说这个人吉他玩的真6。那编程也是,我们所希望的编程能力,指的是会写双向链表还是会写二叉树?恐怕都不是,我们所指的会编程,是指他在应对各种不同的业务需求时,都能很快的将业务逻辑转化成编程逻辑,并且编码实现的能力。
那么、如何来锻炼这种能力?
前段时间在罗胖的《得到app》上听的一篇精品课,非常受启发。一位老师讲如何高效地学习一项技能,他用两年的时间就从零基础达到了专业级的弹指吉他大师的水平,他所使用的方法很值得借鉴。内容大概是这样:他一开始接触吉他,没有从基础开始练,而是直接挑战难度极高的世界名曲开始演奏。可想而知这难度是极大的,没有任何基础的他,很多和弦都压不住。尤其对与刚玩吉他的人,十指连心啊,压弦的那只手是钻心的疼。一开始一句完整的都弹不下来,更别提什么扫弹,闷音,切音的技巧。就这样一节一节地弹,经过不懈的努力,他把这首曲子拿了下来。巨大的成就感是自然的,但对于优秀的渴望使得这位大佬感到仍然不能满足。怎么办呢?请教名师!这时候老师告诉他:“一禅呐!所谓知之者不如好之者、好之者不如乐之者,你现在已经能够从弹奏吉他中获得喜悦,现在,请再回过头,从基础开始学起。”这下子他才开始从最基础的乐理开始,什么叫节奏、什么叫旋律、什么叫音阶、什么C调G调F调。原来之前练到手指快疼死的的指法叫F和弦?原来之前的曲子里变调是这个意思?
和上去就啃吉他基础教学不一样,这波儿基础的学习让他任督二脉蹭的一下就通了,仿佛杨过一身雄厚的内劲得黄药师点化一番,实力大增。不但能将那首世界名曲演绎的更加纯熟,对于其他没有演奏过乐曲,只要稍加练习,就能够德芙般顺滑地弹奏下来。
同样的方法,映射到编程上,就是我想说的学习方法。我很不建议一开始就从基础开始啃,有多少人从大一刚入学立志将来做一个IT大佬,抱着一本《C++ Primer》开始啃,最后啃不到200页就去LOL上分冲段位了。所以我的建议是,一开始只要会点儿基础语法,就定一个小目标去实现就好了,不必强求每一行代码都是亲自手写。遇到问题就查,百度也可以查书也可以,我一开始写个五子棋小游戏的时候,连数组的声明语法都是查书的。把你遇到的问题从业务逻辑定位成代码逻辑,然后知道从哪儿可以找到想要的答案,这个能力在未来的工作、编程和面试中非常重要。一两个完整的程序做下来之后,再回过头来从变量、语法、表达式、流程控制、函数....重新去学习这门编程语言,这时候你会不断地发现原来这个地方这么写的原因是这样?原来这个地方是这么实现的,那个地方我还可以这么写。一本枯燥的语法书籍你会很流畅地读下来,甚至还可能读出快感和兴趣,这样一顿操作之后,你可以算真正掌握了一门编程语言,有了自己的理解在里面,并且有对应的应用经验,未来的面试中也可以讲的头头是道。
这就引出下一个问题,选择什么样的程序作为上手项目
首先!是你做出来的程序,一定要好看!
和语言没关系,不管是HTML+CSS还是Python还是C。我承认我是颜控,但这和个人癖好没什么关系。一个酷炫的UI设计将在很大程度上提升你的成就感以及你程序的品质。这里说的是品质,也就是逼格,用户体验好了,逼格上去了,自己的成就感油然而生,对于编程的兴趣也就上来了。下面上一波儿图来佐证一下我的观点:
大一的时候用纯C语言做的五子棋,比较遗憾的是AI算法是整合网上别人的:
是纯C你没听错,有一个简单易用的函数库,叫做easyx可以了解一波。就按官网教程看几篇下来做成这样没有丝毫问题。当时课程设计,同学们看到这个程序佩服的和关老爷一样,老师也对我赞不绝口,毕竟在大家都用控制台画界面的时候,我具有划时代意义地用上了鼠标。只有我自己知道这其中只不过是些花拳绣腿。
这个年代比较近了,使用了C++ Qt,王者荣耀风格的连连看:
最后这个更亮了,得意之作也是毕业设计,准备擦亮眼:播放器主界面
桌面歌词
手机遥控,同wifi下就可以遥控,还能定时关机
音乐魔方,旁边是酷狗的音乐魔方。有对比,才显的我更有逼格。
设置页面,很尴尬。这里都是假图,左侧五个按钮点击,右侧是五张图片来回换。-_-||
除了这还支持全局热键、播放MV、系统托盘等等。
如果你张大嘴哇了出来,就说明这些图片确实震撼到你了,试想如果你也把经手的程序做成这个样子,谁还会说对编程没兴趣?兴趣有了,动力就有了,项目搞完回过头来系统地学习语法基础,不但不再枯燥,而且理解也会更加深刻。
所以、做程序的时候想办法把程序做的漂亮一些,自己会P图就自己搞素材,自己不会就去网上下漂亮的UI素材整合到你的程序里,相信我、这些花拳绣腿不用花多大功夫就可以做到。
2.刚才说的是开发上手程序的建议的第一点,要好看。还有非常值得推荐的一点:把你的程序当做产品来看待。
当你把程序作为产品来看待的时候,你就会考虑到一个非常重要的因素:用户体验。假设你的产品要上线,是要给别人来用的一个程序。用户体验会倒逼你对你的程序作出一些调整和优化。有些调整优化力所能及,有些难度高到可能你实现不了,没关系,这对于你来说都将是成长很大的一步。在调整和优化的过程中,你的代码可能越改越乱,最后改不下去了,你会发现你的代码需要从底向上重新整理编写才能满足需求,恭喜你,这是编程能力提升的又一个重要阶段:Code refactoring 代码重构。无论重构的效果如何,一定会比上一个版本有所进步,这就是提升和成长。也将成为你编程经验中可贵的积累。
就以我刚才的音乐播放器为例,作为毕业设计已经绰绰有余,但是如果以产品的眼光来定位,它还存在着很多的问题,我大致记录如下:
随着我编程能力的提升,这些问题我在解决的过程中就发现,我的代码简直是一塌糊涂!现在存在的问题几乎到了不重构无法解决的地步。所以这个程序的重构后来被正式提上议程,并且因为我的懒惰成功搁浅了长达一年之久,现在还凉着。。。
学校学的东西到底还有没有用?
编程能力的提升说完了,你可能会有这样的疑问了,学校学的东西还有用吗?好像按照我上面的办法自己学也能小有所成。
答案是毋庸置疑的,学校学的东西必然有用!
先来看看大学都学了什么?高数、大物、英语、C语言、数据结构、算法、计算机网络、计算机组成原理等等。显然,都是些既枯燥又复杂的知识,后来做了开发的大家都知道,这些东西很难直接应用在生产实际中,相反,很多互联网公司招聘,要求的是熟练使用各种框架。前端要vue,React,java要ssh,python要Django,C++要Qt等等,大学里不教,企业招聘又要,怎么办?这不是多了雨后春笋般的培训机构么...甚至有人因此放出豪言壮语了:学校学的东西根本没卵用,不如早早学个流行的框架出去找工作。
难道说大学讲的东西真没用?既然这些东西我们工作中可能用不到,为什么学校还要讲?而不讲我们用得到的呢?我先来举几个实例:
1、你看到的大多数互联网公司招聘都要求熟悉这那的框架,但是越是大型互联网公司,比如BAT这种体量,学历要求是研究生到博士,数据结构和算法要求是精通,英语要求是6级。框架?不存在的,我招你进来很可能就是要参与开发我们自己的框架呢,你会用别人的框架用的再6也不是我想要的。
2、如果你研究人工智能领域的一些技术,机器学习、深度学习、神经网络什么的,一些似曾相识的名词开始映入眼帘:贝叶斯?逻辑回归?支持向量机?拉格朗日乘子法?数学让我寸步难行。。。
3、如果你学习前百度首席科学家吴恩达的全套机器学习课程,通篇没有说过一个中国字儿的,英语让我寸步难行。。。
4、答主之前接触过一款C++游戏引擎叫Cocos2d-x,设置一个小人跑酷,需要小人可以跑可以跳,自己会下落,可以碰撞检测。算坐标算的太麻烦,引入了一个叫Box2D的物理引擎。从此,小人的像前移动,变成了给小人设置一个像前的初速度。小人的自由掉落,变成了设置全局的重力加速度。小人的跳跃,变成了向上给一个初速度。碰撞检测变成了设置小人和物块为刚体,物理让我寸步难行。。。
5、答主一个朋友 @探索之言,在游戏行业做引擎优化和图像处理的,有一天跟我打电话,问我记不记得求空间中两个几何体相交截面的公式?我回了个黑人问号脸,后来他又打电话说起最近在做GPU编程,我为了不失逼格仍然不懂装懂的聊,他听出我啥也不懂,之后就再没给我打过电话了。。。
(这里的应用场景是很常见的,在很多3D游戏的物体的投影,不全是投在地上的,有些投影会投在其他物体上,那这个时候显示出来的投影的样子,就是刚刚他问我的横截面。CS游戏中的喷漆也是这个原理。)
6、前段时间写一个贪吃蛇的小游戏,蛇的身体我封装成了一个类,每一个类放了另一个身体节点的指针,巧妙地实现了贪吃蛇的走步方式,我沾沾自喜地找同事炫耀我靠大脑创造出的高科技算法,被同事怼了回来:“这特么不是链表么?!”。
从上面的实例你应该已经能看出来了,说大学知识没用的那些人,不是因为大学知识真的没用,而是因为以他的能耐和眼光,还看不到大学知识用在什么地方。编程达到一些深度,开始需要自己造一些轮子用的时候,数据结构和算法是不掌握不行的,一些高精尖领域的研究,比如图像识别、大数据、人工智能等等,玩的全是数学。而我们所说的这框架那框架,全部是基于我们大学里学的知识基础封装出来的,当你对编程研究到一定深度的时候,大学里落下的基础,一样也跑不了。
这就是为什么说大学的东西不见得用得到,而大学还一定要讲,因为这些都是最基础最核心的东西。坦白讲,框架、编程语言都是用来解决问题的工具,工具用的好坏只能决定你跑的多块,而基础有多么牢固,才能决定你跑的多远。
未来你要成为怎样的程序员?
这一点跟你的题目没太大关系了,作为程序员分享出来与大家共勉。
这个世界上有两种人才,一种是所有的事情都知道一些,另一种是知道一些事情的所有,而这两者兼具的人,就成了我们口中的业界精英、行业翘楚。
当然,成为翘楚光靠努力不够,还要一些运气和天赋,但这并不代表我们普通人不能向翘楚看齐,即使成不了精英,成为大佬还是有可能实现的。所以,对未来的规划,我的建议是从深度与广度两个维度来成长,定义好几个时间节点,在这些时间里就向这既定的目标来努力,如果中途感觉跑偏了,就回望初心,重新把自己划回正规。
就以我为例,我的大学基本是凉凉了,编程能力不错,但是成绩真的是有些不忍直视。我对自己明确的规划也是在快毕业的时候才有,那时候刚22岁,目标是在25岁之前,打造自己的广度,争取各个领域都有所涉猎有所了解,在25岁到28岁,选择一个自己喜欢的领域深入研究,打造自己的深度,争取在30岁之前,成为一个深度与广度兼具的大佬。在这期间,薪资不是我考虑的主要因素,薪资只是你个人能力的附属品(这话俺妈讲的)考虑的第一因素是成长。扯得哲学点就是:不要着急花更多的时间去赚钱,去花时间,让自己的时间更值钱。当然,现在的我还差的很远。
鸡汤写完了,以上只是我的个人观点以及经验之谈,希望能对你,对其他在校的在职的程序猿有或多或少的帮助。
最后,还有很重要的一点,善于总结。定期回过头来看看,自己都学到了什么掌握了什么欠缺什么,也许你能从中淬炼出一些很有价值的东西,比如今天这篇鸡汤,总结如下:
知之者不如好之者,好之者不如乐之者。尝试引导自己对编程产生兴趣,从中获取成就感。
尝试从实践出发然后再回归到理论,就像上面提到的学吉他的方式方法。
做出来东西一定要好看,会更有成就感,更容易感兴趣。
用产品的眼光去定位你的作品,会得到更加意想不到的成长和进步。
会用工具,能决定你跑的多块,但基础多么牢靠,才决定你能跑多远!
这个世界上有两种人才,一种是所有的事情都知道一些,另一种是知道一些事情的所有,而这两者兼具的人,就成了我们口中的业界精英、行业翘楚。
不要着急花更多的时间去赚钱,去花时间,让自己的时间更值钱。
自己从实践中总结的才能叫真理,看别人说的只能叫鸡汤。
再补充两点:
1、知乎可以刷,但不能天天刷,知乎大多是像我这样的浓鸡汤故事会,偶尔看看可以,有多余时间看是多看看技术干货更好。
2、拒绝私信聊人生聊理想聊职业规划,一天天忙着在知乎装逼,没时间编码了都o(╥﹏╥)o
6.25:私信有要五子棋源码的,补一下五子棋源码连接(https://link.zhihu.com/?target=https%3A//github.com/TheThreeDog/gobang),这个就不要star也不要fork了,大一些的代码实在太挫了。看到过去自己的神操作能笑死:
点击返回按钮,返回到游戏主界面,我直接......调用了main()函数。。。反正功能实现了,我才不管那么多 ̄□ ̄||。
上述的其他项目在我的github里都有,很遗憾代码搓的没有一个入眼。。。
(完)
更多精彩:
2017年创新人才推进计划拟入选对象公示,有你的学校和老师吗?
北京航空航天大学王田苗教授:当前智能机器人发展若干挑战性问题