这段日子辞职参与一个项目,空余时间比较多,找了几个家教教编程。我想一个做软件的做家教的应该很稀有吧。
学生都是初中生,教C语言基础。以下是我以邮件的形式引导他们入门时总结的一些入门思想,希望能让大家对编程行当能看的更透彻一些。
针对一个初一学生,如下所述:
学习编程需要一些思想理论上的武器。
1.程序是有生命的,生命能力的大小和复杂度完全掌握在程序员的手里;而程序中每一个对象也是有生命的,她们的生命周期不尽相同,但是也像生物一样有她们的共性,比如从生到死的过程。
比如一条蚯蚓和一只鸟的活动能力是完全不一样的;
2.程序是一门语言,而且是一门特殊的语言。特殊就特殊在语法的简单,语法的简单造成了语言的不规范性;这种不规范性带来了很大的语言自由度和复杂度,所以才能写出各种怪异绝伦的程序,比如类似蠕虫的病毒等等;
她的不规范性决定了:程序员可以发挥的空间比其他自然语言要大,可以定制自己的规则,生成自己的天堂,在自己的天堂里一切规则都可以自己定制。
3.把控一切事物有一个共同的规律:把规则熟练到成为自己身体的一部分。那么做起事情来才能跟玩游戏一样自由组合、自由发挥。比如数学、文学、物理、化学等等都是如此,所以说学习其实是最简单的事情,跟游戏一样,深入进去比游戏更有趣,因为玩游戏自己就跟僵尸差不多,是在按别人定制好的规则办事;而学习确实在慢慢组建自己的游戏规则。
4.了解事物要了解到本质,不能浮于表面。因为了解到不同的层次将决定你的能力。如果你有把生活当做游戏的境界,那么你了解事物本质的深度其实也就是你掌控事物规则的深度和熟练度,这将决定这场游戏你能不能玩的尽兴,玩出激情和活力。
比如:
人类只看到自然现象而不懂本质,就只能处于迷信的原始社会和封建社会;
人来后来慢慢明白了自然现象,所以就产生了哲学(科学);
人类后来认识到微生物:所以就克服了传统简单的传染病致命的情况,还产生了外科手术成功的案例,医学得意快步发展;
人类后来认知到了微生物并不是最小的,最小的是原子:于是就产生了原子弹;
人类后来认知到了原子还可以分割成更小的中子:于是就产生了中子弹;
等等,这些说明了什么?就是说明人类对事物本质认知的越透彻,人类科学就会越发达,对自然的掌控能力就越强。同样道理。
5.实践出真知,一切概念如果没有实践证明一下都是虚伪的,即使它的存在是必然的。有些东西用实践、用行动去证明,去探索。希望你在学习的过程中,遇到的每一个问题想到的第一个办法是去实践一下,自己证明,而非问直接书本找答案或问老师,实在解决不了了再问。
6.做事情讲究胸有成竹。学习自然也是这个道理。其实玩游戏也是,你喜欢玩游戏,那么为什么有时候赢,有时候败呢?因为你的策略不行,你一开始就没有给自己一个了解彼此并制定策略的机会,输在了起跑线上。
程序也是一样,刚才第一条也说了,程序是有生命的,他生命的强悍是写程序的人赋予它的能力,你如果随心去写,必然有所遗忘,比如忘记了这条生命的一个内脏?或者眼睛写的不到位成了近视眼到处乱闯(比如死循环,病毒的自我复制能力)。所以必须先了解整个过程需要什么,胸有成竹,然后才能去写。
比如我给你上课从来不带课本,那是因为课本都在我脑子里,我备课不需要备知识点的课程,只需要备教学思路的课程,备如何讲才能让你更容易理解的途径即可,一切皆在心中。
再比如,你每次进课堂之前有没有做过事前规划?是不是每次进了课堂就等着老师来浇灌,而你则和其他人一样被动的去接受浇灌?这都是不对的,虽然或许你会很认真很听话的接受浇灌,可是早晚被灌出泥浆来,脑子里一片糊涂。其实你完全可以用10分钟左右的时间,看看今天各门功课都会讲啥,那些地方要重点听,其他简单的地方可以不那么绷紧神经。你会觉得一天都会过的很轻松,而非时时刻刻都强迫自己绷紧神经来应付课堂学习。这就是对学习的胸有成竹,要把控学习的整个脉络,不能讲这个权利随意的就丢给老师而把自己变成木偶。你应该去主动的掌控这个脉络,去把老师变成呆呆的只会做一件事的木偶,事实上却就是如此。
针对一个初三刚刚毕业的学生,如下所述:
编程可以看成是一门同英语、日语、法语等相同的一门语言,从语法上有其简单性,却也有其抽象性的特点。更要明确知道,它作为语言本身不过时肤浅的一个工具,或许抽象些、难以理解一些,但不能改变它是一个工具的本质。
在编程界,虽然存在很多被周围人认可的“高手”,但是我不得不说,真正能称得上高手的很少,他们之所以被大多数人认为是高手不过是因为行业的神秘性和行业区别性决定的,他们的所谓“高”是高在了对语言语法的熟练程度上,可以实现许多复杂的功能上。可是这样的高手或许也很聪明但是真的不是真正意义上的高手。
编程是一门哲学艺术,是一门严谨科学,凡是停留在语言级别上的都只是凡夫俗子。我希望你学习编程的过程中能学习到编程真正的本质,这样你才能终生受益。如下:
1.人一生会不断的遇到各种问题,永远都不会停歇,从哲学上说这是矛盾论存在的原因。所以人一辈子就是不断处理矛盾的过程;而编程恰恰就是时刻会给你出现问题的一个事情,而且出错频率远远高于生活中遇到问题或挫折的水品,你要适应这种高频率面对挫折的过程,你必须冷静并学会愉悦的对待遇到的每一个问题而非浮躁,就如同对待你喜欢做的任何其他事情一样,比如钢琴或游戏。只有这样你才会活在解决问题成就感的快乐中。
有时候一个问题几天解决不了也实属正常,你必须在几天之后面对一个尚未解决的问题还能充满求知欲和解决问题的激情,这也是一个人成功的关键因素之一。
2.编程本身就是一个问题(不包括不断出现的bug),这是编程最大的不同点。而处理编程中每一个问题就是在学习生活中处理各种问题的智慧的过程,深入它人人都会喜欢,因为人人都喜欢做一个智者。
掌握了语言,实现一个功能简单,只要掌握了至少一门语言的人基本上都能实现。但是每个人实现的结果或过程却千变万化,最厉害的那个人绝对是用最简练的语言实现了最复杂的功能,而且是能最高效率的运作。
学习编程处理所面对的问题的过程,你会发现你就是在总结生活,总结学习之道,总结人生。或许你会觉得夸张,但是等你真正学的深了确实如此。人是一个经验性的动物,从不断重复的问题中找出共性解决方案的核心就是智慧的体现,而这种共性规律的解决方案是完全生活中抽象出来的科学,而且属于哲学范畴中非常抽象的层次。研究会他们会让你有种把握了生命的感觉。这种过程完全是人类思维或人类科学从古至今发展到最前沿的智慧结晶的体现。
这样说有点笼统,更直白一些说,实现任何一个功能的过程其实就是通过编程各种技能、思维各种手段找出最佳解决方案的一个过程,找出来了,剩下的工作不是一个工程师干的,而是一个代码劳工干的事情了。
之前我跟你谈论过,任何一个行业当你研究到一定深度,就可以称为“大师”,如果更深那就是宗师级别的,一般这个级别的人都把行业发展上升到了哲学理论。其实其他任何一门课程当你还不是高于大师级的人物时,根本不会考虑或根本不会接触到哲学范畴的东西;而编程恰恰相反,从一开始就架设在抽象的哲学基础上,从一开始就是在研究人类发展规律的科学上开始的,编程是主动研究方法论或处事规则的一个特殊行业,所以这个行业真正的高手都会是或成为特别聪明的人。
3.世界上只有想不到的功能没有实现不了的功能。而且要清晰的知道哪些东西是不容置疑的,哪些东西是可以不断置疑的。
比如真理、比如自然规律等等,都是不容置疑的。编程中总是存在由于解决不了问题总是置疑权威性的东西,这样是不对的,不但解决不了问题还容易钻牛角尖。
希望这几点你能细细的看一下,下节课我就会少花点时间聊这些东西。都是理论指导实践,这算是我送你准备入门理论吧。这也是你无论从哪一门课程的课本上都不能学习到的东西,相信你在将来的学习过程中会慢慢越来越深入的体会到这些东西。
随笔写的,就先想到这些。当然,呵呵,从小最烦的就是老师一言堂,有什么想法或迷惑都可以跟我交流。讨论才会使人进步。
最近媲雅姿项目结束,也希望朋友们也都能来指点指点。