首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

学编程要重视交流——写给一位有困惑的好学生

2012-09-09 
学编程要重视交流——写给一位有疑惑的好学生这是一封读着让我别有感觉的一封信。他在C++方面看的书比我多,他

学编程要重视交流——写给一位有疑惑的好学生

这是一封读着让我别有感觉的一封信。他在C++方面看的书比我多,他学习C++的历程也值得效仿,但他的学习方式也存在不合理的一面。我不得不避开具体的C++的问题,建议他在交流(与人、与书、与网络)方面有所改变,同时也建议他在实践上立刻行动起来。如果能有直接的体验,这些问题对他而言本来并不应该成为问题。

【学生来信】

贺老师:

  您好!

  自己在找东西的时候看到了您的博客,之前我也有一样的困惑,但是从没有去问过任何一位师兄,师姐,或者是老师,实际上,我是觉得他们不够格(也许这样说可能有点偏激吧),但是很多时候他们总是给我这种感觉,今天我看了您的博客以及对学生邮件的回复,我才觉得我这次可以问对人了。

  首先先向您介绍一下我的情况:我是一个快读大三了的学生,刚好,你从事c++教学,我大一下学期的时候开始学习c++,至今已有1年多了,我是一个自学能力,自主能力,很强的学生,从当时的懵懵懂懂的听人家说c++好就去学习到现在,我一直都是自己一个人在学习,从没有去和别人交流过,这个我得解释下,我非常了解自己的情况,之所以不和别人交流,我觉得可能性格上有点关系吧,以前读书的时候也很少问别人问题的,另一个重要的原因是,我一直都是通过自己去解决问题的,我一直都相信,我一定能够解决这个问题,我觉得靠我自己的能力能够解决问题,很幸运的是,因为我一直都是这样觉得的,而我遇到问题时也是这样做的(一般我都是自己先思考,实在想不出时才去网上找资料的),虽然这是一个比较痛苦的过程,(我一直觉得这是自学的人最痛苦的地方),但是还好,最终我都是解决了问题,并且我也渐渐习惯了,有点担心的是,自己一直这样可能不利于培养团队精神吧,我总是处在一个两难的境地,一方面我有觉得我应该去和别人讨论,培养我的团队精神,另一方面,我总是觉得,我自己能够解决的问题为什么要去问别人呢?

  上了大学,我莫名奇妙的成了别人眼中的“好学生”,“优生”,我觉得吧,他们也许看到的只是我的成绩,幸好,我也看的很清,成绩好不代表什么的。我觉得自己最大的优点就是有耐心,我之所以不说有毅力,是因为,很多时候我我觉得很多时候,耐心才是重要的,也正是因为如此,别人看个那些什么的常常的公式,n复杂时我最初也不懂,当我总能很耐心的去看个几遍,最后弄懂,无论表现在离散数学上,还是高数上,我都是如此,也因为如此,朋友们也经常觉得我是一个比较时候做学术研究的人,至少在看到那些天花乱坠的东西时我会晕,但我很有耐心。

  貌似我好想有点扯远了,我的本意是想让老师您更多的了解我的情况。我的c++学习之路一直都是自己一个人走的,虽然不久,才1年多,但是我承认自学的的人总是会经历很多弯路,有时候想想,总是觉得不是很必要,明明问别人马上就能找到答案,为什么要花费这个时间呢。

  我大学读的是软件工程,我不能说我读他是因为当初我喜欢他,因为我但是报考时也是一无所知,所幸运的是,我这人心态一直很好,我觉得读什么都无所谓,但是既然选了他,就一定要读下去。我一直以来都对得起我的学习,我觉得学校交给我们的东西太少了,这也是当初我去自学c++的原因之一,从<<c++ primer>>开始,这本书我看了两遍,是因为我看第一遍时懵懵懂懂的,这个过程,我看了<<c++ 标准程序库>>,<<Effective c++>>,<<More Effective c++>>,我的英文能力还行,后来英语越显得重要,有些书没有中文版,所以我只能硬着头皮去看英文的书,比如我看了<<c++ Template>>,整天开着有道字典,还好,习惯了,就发现原来不是那么的困难,所以,现在我看书,当然是首选是中文,没有英文我也可以接受,找资料的时候也更多的懂得要去英文网站找,这期间,也是因为老是觉得这些语言学来学去总是写控制台,做不出GUI,所以我也去学习了<<Windows 程序设计>>以及<<MFC Windows程序设计>>,我学习的这的时候书上的东西我都还挺懂的,也就是熟悉api的使用,当然msdn是必不可少的,但是尽管如此,并且<<MFC Windows程序设计>>这真的是好的不能在好的书,但是我总是感觉有点复杂,重要的是,我当时感觉这些东西实际上就是熟悉API调用而已,我觉得没意思,我想要的不是这些东西,但是我又不知道自己想要什么东西,迷茫中。

  这里要特别提一下<<Effective C++>>这本书,因为我也看了两遍,第一次我看懂了,但是我深知,我看的懂的原因是因为作者用简单的例子来说明问题,但是我觉得这个“懂”还是要分层次的,我这个懂是浅层次的,要真正的懂得他的精华,没有实际的开发经验是不能有切身感觉的,这也是我当初选择去学MFC的原因,我觉得只有我去接触开发,我才能有深刻理解,然后在看完<<MFC Windows程序设计>>后,我又回去看了一遍<<Effective c++>>,果然感觉是不一样的。这期间,我也有一直在寻找其他的书,网上有很多人推荐这些<<设计模式>>、<<c++编程思想>>的书,我承认这些都是好书,但是我一直觉得,这些书不是一般人都能真正理解的,我说的是真正理解,我觉得必须要有实际的开发经验,在回来看这些,才是正确的做法,所以我决定,要等到我的能力到达一个层次时,在回来看才是正确的,不然觉得会遇到看书时经常遇到的困惑,“我知道你说的肯定有用,但是他到底用在哪呢,我怎么看不见”,这也是我一直困惑的问题,语言的最终目的不是用来“生产”吗,要研究语言到什么程度呢,肯定不能一直看语言方面的书,但是何时才是终点呢?这个问题一直困惑着我,我知道c++语言强大,我懂得只是皮毛,或者不叫懂吧。因为<<Effective c++>>的作者强烈推荐熟悉Boost库,所以在我放弃了继续学习windows程序开发的时候,我去下了本<<Boost 程序库开发指南>>,遗憾的是因为种种原因,中间被中断掉了,但是通过Boost库,我认识了Python,因为我不懂脚本语言,所以我也皮毛的去学了Python语法,对我来说,还是非常快的接受的,即使我见得我一定会用,但是至少看书时都是畅通无阻的,我的观点是先大概有个印象,到时用时,在去深学,重要的是,通过Python,我认识到了wxPython,然后,我认识到了wxWidget,所以这个暑假,我就在家学习wxWidget,我之所以重新去学习GUI的原因不是因为功利,我的学习一直都不是功利性的,也就是为了工作,我是为了更进一步的学习<<设计模式>>这些东西,我觉得,至少,目前,我必须懂得一些GUI,懂得这些东西能帮助我更好的学习那些东西,因为这些东西是最能应用到那些“理论”的地方,很幸运,不知道,为什么,我总觉得自己很幸运,wxWidget是一个强大的跨平台库,而且他封装的很容易使用,这个暑假下来,我发现我很喜欢他,有很多方面,当是,因为wxWidget用起来在很多方面与MFC很像,所以当初的学习也给了我今天容易学习的很多帮助,使得我学习起来比较顺畅。学习wxWidget什么都没有,我就是靠着一份英文文档,自带的80多个sample,和一个wxWidget的论坛学习的,总之,尽管不想MFC那么流行,有很多人可以问,但我都还比较顺利。

  不好意思,我可能有点啰嗦了,至今都没说道正题,我现在快大三了,我的困惑是,尽管我貌似我用c++很久了,但是网上人家一直都说,c++适合底层,c++适合系统开发,但是为什么我就体会不到呢,书上说,c++的能力在于管理内存,并且花了很大篇幅讲内存,我看书的时候他说的我都还懂,但是这些东西究竟用在哪呢,为什么我就体会不到呢,我非常相信他用在某处,但是在哪呢,即使在GUI种,我也很少会遇到这些关于内存的重大问题,而我现在的困惑是,当我比较熟悉了wxWidget后,那我接下来的路有该真么走呢,我应该继续学习什么东西呢,是人家说的嵌入式吗,还是什么东西,我知道这些东西要看兴趣,但是我也不知道我的兴趣在哪,或者没有兴趣吧,学什么都无所谓,但万一我决定学下去,一定会学下去,我觉得自学的人痛苦的地方是很多时候都不知道自己该怎么继续,老师,这也正是我给您发邮件的原因,我不知道该如何继续,一方面,我想消除我心中对c++的种种困惑,另一方面,我又希望能够知道自己接下来的路该怎么走,或者简单点,我接下来该学习什么书呢,我觉得我的学习肯定不能终止在库的使用上,即使是Boost库,wxWidget库。我想做一个真正的开发者,一个真正的c++使用者。希望老师您能给我一些意见。

【我的回复】

  在看你信的过程中首先为你的学习历程感到高兴,这是一种真正意义上的学习,这样学得的东西是自己真正的体系,体现的是一种基于当前的条件,首先行动起来,这与我提出的破除‘系统学习’的情结可谓不谋而合。这种学习的方法,包括C++学习的历程,值得后来者效仿。我也将照我的老规矩,将你的来信及我的回复发表为博文,相信很多读者会由此受益。

  而具体到C++学习上,我可能会让你失望了。我十年前教过C,十年中做一些科研项目用的是别的语言和平台,一年前接受C++的教学任务才开始C++之旅,目前指点C++入门的同学尚还可以,和工程结合的问题,也还是我正在努力的一个方面。由于目前在更宏观的学习方法指导方面投入的精力太多,进步的速度也不能令我满意。我希望这不会对本来就不喜欢交流的你造成打击。而我奇怪的是,以你的经历和体会,你所提的一些问题本来是自己能做出回答的,从字里行间可以看出,你已经具有这样的能力和基础。可能还有层“窗户纸”隔着,所以我的回信想就你的某些观点做点讨论,希望在这方面对你有所帮助,也相信借此能让你自己去突破这些所谓的困惑。

  首先是关于交流的问题。在这方面,你在信中的用词是“问老师、问同学”、“找资料”。体会一下,“问”和“找”是单向的,你提问,被问者会给出一个答案,交互结束。被问者就应该具备某种条件去解答,这种解答也隐约有种标准答案的味道。我在这儿的用词是“交流”。“交流”是双向的,交流的结果没有标准答案,走向何方也无法预测,这非常关键。你提出一个问题,对方对此也可能是一头雾水,但他可能会从某一方面提出一个你没有想过的小点子,你加入些新的成份,讨论半天可能会解决问题,也可能发现需要补充一些背景知识才能将讨论进行下去,甚至原先的小点子可能会被完全否定掉,产生了一种新的思路,但无疑这样一个过程会使问题越来越明朗。这样,你的观点“他们不够格”就不仅是偏激的了。夫子所谓的“三人行,必有我师”的教导,也在告诉我们没有绝对的师者。上网找资料实际上也需要抱着交流的态度去开展,任何人的观点并不是绝对的,只有加入了你的成分,有了你的加工,才能够成为你自己的财富。进一步拓展,还有看书的问题。可以看出,对那些大部头的经典书籍你是非常尊敬的,确实需要这样。但在看书的过程中,要一直带着质疑的态度去看,且不说书中可能真的有错,这种质疑会让你不断地思考,按作者的思路理解,也按自己的思维整理,自己提出问题,试着寻找作者是如何解答这些问题的。这是读书中和大牛级的作者交流的过程。和不同的人,利用人际关系,利用网络等工具,进行技术上的交流、观念上的交流以及情感上的交流,是一件非常重要的事,这决定了你进步的速度和高度。优秀的程序员不应该是闷头技术的“苦逼”样,而是会充分利用这种交流和合作,使自己的工作、生活生动、活泼、有效。

  再要说的还和交流有关,我想和你探讨一下何谓“通过自己去解决问题”。我很欣赏你遇到问题,尽管痛苦,也要自己思考并最终解决。这种经历和能力对你非常重要,我下面的观点并不是要否定你的这种风格和做法,只是希望你能再拓展一种新做事方式。先讲一个寓言故事。有位父亲让儿子将一块大石头通过自己的力量搬到另外一个地方,显然大石头的重量超过孩子的能力,即使用上了杠杆之类的手段,石头还是纹丝不动。垂头丧气的儿子告诉父亲他搬不动时,父亲问他真的用尽力了吗。然后父亲告诉他,其实很简单,只要儿子请求父亲帮忙,这个问题就可以解决。请思考,请父亲帮忙,是否也是儿子自己的力量?力量不仅体现在四肢,但更强大的力量还体现在沟通、协调上。在时间、对痛苦的忍受度上能接受的前提下,可以“自己”蛮力解决,但时间紧急,以及想让学习更轻松,有更多愉快的体验,不妨找到可以合作的团队(正式的或非正式的),用好你周围的资源。所幸这一点你已经意识到了。

  我们的话题回到技术学习上。我有种感觉,你的看书、学习,可能也是一个你单向接受书本上的知识的过程。看书很重要,但不能忽视在看书的同时,找到些合适的题目和项目进行实践,这对课外自学的内容来讲,尤其如此。题目和项目可以是书上直接提供的,也可以是自己搜集的,甚至是自己编的(自己给自己编题目做,我认为这是一种非常重要的能力,你可以根据自己的需要试试)。从事实际生产之类的事,你现在就能做(见《开发经验和屁股的关系》一文),所以《设计模式》、《c++编程思想》之类的书,并非现在不能看,也不必坐等开发经验,看书和实践本来就应该是交叉前行的。所谓的真正理解,也不是完全领会到作者的本意,而是与自己的体验结合起来,一边看一边做,重复再看和做,将看出新味道来。你在C++做底层开发、内存管理等方面的困惑,是体验不足造的,需要通过实践,亲历体验去解决。如果你能够做到即时体验,这些问题将能自己解决。这方面合适的题目我拟不出,网上找些微软、谷歌、百度等大公司的面试题看看,或许有合适的题目。这个主意可能有点馊,因为涉及内存管理的题目可能会较难,可以暂时将这些问题放一放,等学习操作系统等课程后,尝试做一下分析操作系统源码的工作,再去考虑这些。大学学习有阶段性,自学也是。有时,将问题留给未来,也不失为一种好办法。我还有一篇文章也可参考《改变学习模式,在课外学习中获得突破》。

  最后想提醒的是,你整封信几乎都围绕C++了,要注重计算机基础的学习,这些基础分散在各门课中,这是将来你安身立命的真正本钱。C++仅是一门语言,学C++的目标是学会程序设计。当然,用C++,及其各种API资源、平台、工具,也是要解决具体问题的基础和手段。真正的开发者,并不仅是C++就可以支撑的。

  我不能直接回答你的问题,建议你扩展一些学习的方式,加强些实践获得体验,希望这些点子能对你有所帮助。


【学生回复】

  非常感谢您的来信,看到您的来信,我感到的更多的是您对我情感上的指导,而非学习上的,技术上的指导,我想也许这才是我真正的问题所在,困惑所在,也即您所说的那层“窗户纸”吧!
  还是谈到交流的问题,当我看到您对我写的“他们不够格”的评论时,我的第一反应是我的表达让老师您误会了,我要表达的意思是“他们没有这个能力去解决我的这些困惑,不是指学习上的指导,我的表达是不带鄙视性的”,实际上,生活中,我不是一个个人主义强烈,以自我为中心的人。接下来,我看到您关于交流的言语,我意识到,实际上,这两种情况都是我不能很好的与他人交流的表现。为什么我会觉得“他们没有这个能力去解决我的这些困惑”,实际上我还是抱着一种单向的“问”的想法,而不是从“我想跟你们去交流”的这种想法,交流的结果如果能解决问题更好,如果不能或许能得到点意外的收获。我在您谈到的这点上感触颇多,您的话语非常中肯。写到这里,我就不由的感慨下,生活就是这么奇怪,你每天都听到别人在讲交流这个东西,你也完全就觉得就是那么回事,当你没遇到任何事时,别人拿交流来跟你讲道理你会觉得无聊,当你遇到事时,而别人来点播你时,才发现,原来道理如此简单,就是那些平时觉得“无聊”的东西。我想这方面我知道我接下来该怎么做了,这不就是一个非常好的说明例子吗,您没有帮我解决我正面提问的问题,但您从另外一个方面却帮我解决了另一个更重要的问题,这不就是我和您交流的结果吗?
  关于技术学习,我原先确实和老师您想的一样,尽管自己平时动手很多,却也是一个单向接受书本上的知识的过程,原先基本上就是课本上说什么我学什么,很少能自己把他扩展出去,我觉得一般大家刚开始学习都会这样,现在我倒还好,仔细想想,我觉得帮助我度过这个过程的是文档,因为文档中经常有一些相关的链接(比如那些see also),通过这些链接,也就不断把自己扩展出去。至于您谈到的找一些题目和项目来动手,我觉得这个我能够很好的安排,自己感到有需要的时候一定动手。
  您也谈到了看书和实践应该交叉前行,看书不必坐等经验,之前我就一直纠结于“要还是不要的,如果不要,那什么时候才是‘正确’的时间呢”这个问题,现在我已经有答案了。
  针对您最后谈到的怕我吊死在“c++”这棵书上而不能自拔的问题,对于计算机的基础课,当别人觉得不知道这么东西用在哪是,我却时不时的遇见他们,我在加密解密中看到了概率论的影子,在图形学中看到了矩阵,当然,数据结构,离散数学更是不言而喻等等。我觉得这些都来源于我平时点点滴滴的使用经验,也许吧,我觉得,要感受理论如何应用于实践的方法,其实很简单,就是你一直在做与这专业相关的事,比如我在学c++,这或许听起来和那些理论什么的没有直接关系,你一直在做了,就自然而然会碰到它了。我也不会吊死在c++语言上,我一直相信,要用最合适的语言工具来完成一件任务,所以,这方面我也一直在努力。
  最后,我想基于我的现状,和老师您探讨一个关于团队的问题,你鼓励我应该加入一些团队,朋友也一直在鼓励我,而实际上,因为内心实际上还是有那么些情绪,所以一直没有真正加入。我的意思是,以前当我看着大家一起争着进学校的团队的时候,因为,学校也就只有那么几个团队,需要报名竞争名额的,当时我也什么都不懂,也跟着大家去参加笔试什么的,在这个筛选的过程中,我发现,这些团队比我的想象差很远,本来大家都是希望进入这些团队能学到一点东西。但是,我却发现(以及后来与我的一些已经加入的团队的同学聊天了解到的),他们实际上根本就不会教给你什么东西,虽然有师兄带着,但是师兄的作用就是给你问问题的,基本上不和老师接触。然后,师兄就告诉你可以看什么什么书,然后平时就在实验室里自己看书,有问题就可以问师兄,而偶尔的时候,老师接到一些项目的时候,就会分配任务,当然真正帮助老师的是那些师兄,对于我们这些小喽啰即使有事干,也就是分配点小任务去做,而这样的机会也很少,而且重复工作不少。总之,一句话,大部分时间就是在实验室里看自己的书。我倒也不是要批评什么,也觉得本来也是嘛,我刚进去什么都不会,自然不可能叫我做事的。我也知道这种现象可能是个别吧,因为本身学校的团队也就那么几个,也可能是我了解到的刚好就是那么的凑巧,反正我了解的情况,以及我以前的经历来看,就是这样。所以,我一直觉得这不是我想要的,这些团队根本就不是所说的那样,要帮助学生,培养学生什么的。与其这样,干嘛不自己来学习呢?也有人说,反正进去了又不损失什么,至少有机会和师兄们交流啊,即使在实验室看自己的书,那不也是一样的吗,反正不进也是看自己的书?但是心里上我就是不太喜欢。这样,不知老师您对这个问题怎么看?
  再次非常感谢老师您对我的帮助,期待您的来信!


【我回复】

  来信收到。随着文字,我对你的了解也在加深,甚至感到,你我之间相似之处不少。你是一个很认真的人,在交流方面,学习、技术方面的正式的、直接的交流要有,其实还包括和周围的人聊天、吹牛,给自己营造一个融洽的氛围。不要认为这是在浪费时间,人的成长,人的生活,并不仅是学习、工作,还有很多需要兼顾的事。这些没有任何目的性的交往,将是你将来的工作、生活是否能更加得心应手的保证。这些话说给你听,实际也是我的反思。
  不同意你“感到有需要的时候一定动手”的观点,你举例谈及的see also也只限在看的方面。光看不做、多看少做尽管比不看不做好,但结果只能是让困惑越积越多。看的东西积累太多,要体验的内容太多,也不方便安排实践了。人的认知总是在直接体验的基础上进行理解和抽象的,看书得到的是别人的抽象,非常必要,如果不加入自己的实践,即使得到了自己的抽象,也是靠不住的,尤其对计算机这样的人造系统。我在CSDN“IT学子成长指导”博客专栏中有几篇文章专门讲这个事,你可以看看,同时也可以看到几则不愿见到的反面案例。你没有那么严重,但也不应该让这种不当的方法影响你的效率和愉快学习的体验。
  关于团队。你提及的是正式的团队,有这样的条件非常好,在这样的团队中获得各种机会和锻炼,很令人羡慕。我想先谈一下非正式团队。其实与人合作的时候非常多,团队并不一定产生在某实验室中,在某老师带着。今天有个想法,得知某同学也想做,两人一嘀咕,一起做快一些,可以分工做,你界面我功能,我编码你测试,或者你我各做一份,遇问题商量一下,相互启发,团队就形成了。平时这样做多了,是多么好的体验。和我近日提到的“系统学习”的情结类似,有机会当然好,没有系统学习的机会时,东一榔头西一锤子先动起来也不错啊。即使你现在有在正式团队中学习的机会,将团队的概念广义化一些,重视在非正式团队、非长期的团队,对你有益。
  再说你在正式团队中的感受。初进这样的实验室,菜鸟一个,当然应该先长本事,人家也不能直接靠你做事。重复性的工作你不做让谁做?实际就在这些重复性的工作中,你是会不断得到新的体会和经验的。如果在这个阶段,没有人愿意让你干这样的事了,一种情况是,通过考察你可以干更重要的事了,另一种情况是,心高气傲眼高手低的你可以随时走人了。在实验室中安排的学习,一定是自学。其实在大学里,要培养的最重要的能力也是自学的能力。所以进到这样的团队中有人告诉你看什么书,遇到问题有人去问,多么幸福的一件事。
  还真指望有老师正经八百地开门课程,星期一三五准时上课,按点答疑吗?在这样的团队中,尤其是一段时间没有明确的任务时,要的就是大家各学各的,才能指望有百花齐放。你所描述的氛围,恰好就是一个团队带新人应该有的氛围,一个梯队中人员逐渐成长的理想环境。你需要利用好这种自由,需要理解这种环境,并调整自己的学习方式和思维,充分利用环境给你的支持,让自己处在进步的行列中。
  从你的描述中,我感觉你可能还存在主动性不够的问题。为什么一定要等有人告你、教你呢?在一个实验室中,一个突出的好处是研究方向基本稳定,你可能也是有兴趣在这个方向上深入一些的。除了看书,看师兄们开发用什么平台,学会它;老师和师兄们讨论的时候,如果能以,旁听一下;主动找师兄们把他们以前做过的项目要来,然后自己重做一次,甚至对他们的工作进行些局部的改进;收集本实验室师兄们和老师们发表过的文章,了解他们的研究方向,掌握他们关注的问题。除了可以看得见的收获外,一旦在事可做,你已经具备了需要的基础,如果不用你做事就奇怪了。
  好像我的语气对你有些苛责了。除了正式、可见的团队,运用各种方式,创建非正式的“团队”,还需要你自己融入到团队,而不是团队将你抱起来,我相信你更高效和自信的未来。


  

  

1楼youkuxiaobin昨天 15:17
我说的是真正理解,我觉得必须要有实际的开发经验,在回来看这些,才是正确的做法,

热点排行