@Crossin
回头看学生时代,最大的弯路就是怕走弯路、想不走弯路。
纠结该学什么语言、该研究哪个方向、该做项目还是啃算法,生怕一失足成千古恨,踏上一条不归路。
很久之后才发现,与其纠结选择,不如找个点坚持下去。好比爬山,你在山脚下纠结该从哪条路上去,而实际上,每一条都能通往山顶,每一条都不会是笔直平坦的。你怕错过另一条路的风景踟蹰不前,却不知道只要登上山顶就可以一览众山小。
如果一定要说个经验教诲,那就是尽可能多地写代码、读源码、读文档。
有两个词,一个叫做功不唐捐,一个叫做殊途同归。
@Blueve
学习过程中的弯路是不得不走的,但是学习方法上的弯路还是可以绕的。
得到经验和浪费时间终归是两回事吗。
我是个完完全全自学入门的人,现在虽已经进入科班,但是我认为经验还是可以分享给想自学编程的大家
的。当然如果题主是想要为了信息学的竞赛学习,那我觉得这个答案就不适合你了,你应该选择更为系统,更为针对,强度也更大的训练方法。
1.
大多数人学习编程最早的懊恼就是不明所以的“烫烫烫烫烫烫烫烫”,虽然基本教育的节奏都是从伟大的C语言开始,但是作为一个早早自学编程的人来看,C语言作为入门语言是很容易打击人的(教材本身的质量也是一个因素),所以如果是自学入门的话,不妨学一学的入门容易规则简单的语言培养语感和基本素养,例如PHP、VB这样的东西,可以很快做出一个可以看可以用的东西,是很有成就感的,有了自信就自然而然得会想深入的提升自己了。
2.
自己当年中学的时候做论坛,那时候流行的是Discuz!,为了做好玩的互动插件学的PHP。当时的感觉是,自学一门编程语言并不轻松,在会的人看来容易的概念其实不容易灌输给完全不会的人。最开始自己就是啃书本,上课都不记笔记的我把学习到的东西规规整整地记在本子上,直到把基础的语法和语言特性都了解了才停止。不一定像我这样,但是作为一个一清二白的菜鸟,一定要让自己有一个把基础的基础看下去的驱动力才可以。
3.
实践是检验真理的唯一标准。实践对于初学者而言非常重要,但是C语言课本上的实践大多是一些就事论事,针对知识的题目,面对一个控制台程序,其实做完了……过几天也不会觉得这个有什么意思,所以我认为一定要尽可能的尝试去做一个可以用的东西。学PHP做个登陆页面呀~学VB仿个Win计算器呀~学Java做个扫雷~总之做出能够对除你之外的人都能有一点点兴趣的东西,对自己是很鼓舞的。在这方面,C语言这种,对于初学者做图形界面比较不友好的语言……主要的问题就是不会让你产生那种真正解决问题的成就感。
4.
最开始的实践是一种拼凑,因为知识的不牢靠,但是需要解决的问题对自己又是如此的庞杂,所以那个时候的代码都是以能解决问题为主,而不是以好的方法解决问题为主。现在回过头来看当年写过的论坛家族,论坛宠物中心,从外观上讲确实是当时一流的,但是背后的代码着实惨不忍睹。不过对于初学的人而言,能够利用现有知识达成目标已经是竭尽全力了。那个时候的编程没有精雕细琢,就是为了实现而实现,也不管有多少if套着if,甚至变量名我都能起成$if。不过我必须承认的是,没有那段经历,我可能不会如此的喜欢编程。当有人使用了你的成果,不管是对他提出建议还是提出赞美,对于一个尚未破壳的菜鸟而言,都是很棒的感觉。说实话,作为初学者,敢写代码,就是个里程碑了。
5.
历史和人的感觉是很像的,当你的代码写得多了的时候,你自然就会觉得写得不好看。照现在的话讲,那些代码一点都不优雅。作为一个逼格满满的人,完成任务已经不再是一个追求,当Ctrl+C/V成了编程的必备步骤的时候,你自然而然的就会思考了:是不是可以不这样做?这是一个重要的过程,你会想要提升你代码的执行效率,你会想减少查询数据库的次数,你会想用轻便的代码实现想要的功能……当你步入这个阶段的时候,恭喜,菜鸟终于入门了。
这是三个大坑,算法优化、数据库查询优化、代码复用。
你得心甘情愿跳进去,再慢慢往外爬。
5.
看上去我好像在抬高PHP一样,其实不是这个意思。我只是觉得作为一个可以立竿见影的入门语言,它是很合适的。进入大学计算机专业后,我和同学一样,一起学习C语言,我没有接触过这门语言,但是我却比周围的初学者们更快更好地接受了它,即便是像内存、数据类型、指针等从没有接触过的概念,我也比别人更快的认识清楚。我觉得这一方面是因为编程所带来的学习能力的提升,另一方面也是因为我自认为我不是菜鸟所带给我的自信和动力。我当时做了很多出格的事情,当讲课、教科书都在用VC的时候,我执拗的使用VS2010,因为我觉得这个用户体验好。在课设说明书还在按照Turbo C说明图形界面的时候,我却找了个能在VS下使用的仿造的图形库EasyX。其实人都是追求美的,老师也不喜欢你开个DOSBOX滚动翔一样的Turbo C给他演示。擅用和检索现有的工具和资源,是这个时期我最大的收获。
当然,这里也挖了一个大坑,用户体验。
前几天知道,我的学弟学妹们都放弃Turbo C了。
6.
在学校的学习过程是这样的:C -> C++ -> Java。
C++和C截然不同,作为一个拥有面向对象特性的语言,它带给我们很多新鲜的概念。尽管初次见面的时候我们彼此都如此羞涩,谁都看不懂谁。在学习C++的时候,其实我并没有提起多大的劲头,只是觉得STL很好很方便,在OJ上刷题的时候能比C省事不少。不过之后看到一本国外的关于物理引擎的书,便又是提起了12分的兴趣看了看。那本书终归我是没有看完,不过只看一部分我便能感受到自己的肤浅——原来类是这么用的啊。
很久之后我才知道这是一个高级坑:设计模式。
7.
之后数据结构的课程设计,按照套路是要用Java做UI的,但是Java的IDE在我的电脑上一直表现不佳,加上调试时候的种种不顺畅,使得我我对Java做窗体程序好感不佳。于是我想起了初中的VB,随后又联想到了它的同门C#(求别问怎么联想的=。=),那种拖拽做界面的爽快感……经过我的推广,班里最后只有一人用Java做UI,还有另外一个人用的MFC。这个其实是想说,我这个人比较懒,所以喜欢找更好的解决方案,存在就有存在的价值,短短5天,所有人都可以用C#做出一个好看的界面,而Java搞得很麻烦又不好看。这不是在谈优劣或是投机取巧,而是在谈生产力、效率。我训练的人可以5天上岗,做得比你训练一个学期的人还要好,那这就是价值。
8.
其实一路走来,站的越高,自己就越容易被颠覆。
当PHP写代码觉得原始的时候,框架这样的东西就会跳在你眼前打脸。
当WinForm程序做起来感觉到代码混搭的怪异的时候,就发现其实还有个WPF。
当觉得Java臃肿性能堪忧的时候,高级的Web技术又会颠覆你对Java的偏见。
……
学习编程的人需要这样一个自我认知和自我提高的过程,老实说,我觉得这其实不算弯路,这可都是经验呀。这些所谓的弯路是你只要踏上这条路就必走不可的,就像是宜家的步道设计,人家设计好就是要你走遍全程。因为这是一个过程,学习过程上的弯路是宝贵的。
至于我之前所说的学习方法上的弯路,大多是指教材选择、训练方法上的弯路,这些弯路可以通过前辈的指导来避免,我觉得这种弯路走上了,就是浪费时间。现在时间这么宝贵,我们都要讲效率的。当大家都说谭老的书不好的时候,就不要选这本书了。当大家都说某些习题没有用的时候,就不要去做了。学会选择,学会甄别,学会找到适合自己的方法,这才是最重要的吗。