Joel给计算机系学生的建议

作者: 周思博 (Joel Spolsky)
译: Chen Bin
2005年1月2日

虽然大概一两年前我还在夸夸其谈桌面应用程序是将来的潮流,大学生们现在还是偶尔向我请教职业发展的问题。所以我把我的建议写下来。以供学生们阅读,嘲笑,忽略。

大多数锐气十足的学生从来不向前辈征求意见。在计算机科学领域,这样做是正确的。因为前辈们很可能说些“在2010年前,市场对于那些只会敲击键盘的代码工人的需求将会超过一亿(因此前景是乐观的)”,或者诸如“Lisp语言现在真的很热门”。

我和那些前辈也差不多,当我给别人建议时,实际上我不知道自己在说些什么。我是如此的落后于时尚,以至于连AIM也搞不明白,而不得不使用 email(恐龙时代的产品,在那个时代,音乐是刻在扁扁的的圆圆的盒子上,噢,那种盒子叫cd)。(译者按:我认为祖儿这里在说反话,后文很多地方作者都在说反话,读者尽量理解这种美国式幽默吧。)

所以你最好不要理睬我将要说的,你应该立刻去制作某种在线交友软件

然而,

如果你喜欢编程,那就感谢上帝吧:你属于幸运的少数人,这些人喜欢工作,他们的工作可以保证他们能过上舒适的生活。大多数人没有这么幸运。对大多数人来说,工作是不愉快的,忍受工作的目的攒钱,是为了在年满65岁退休后能过上自己想过的生活。如果他们想过的生活不需要灵活的膝盖,明亮的眼镜,轻盈的脚步的话。

现在让我回到主题,我将提供一些建议。

好了,不罗嗦了,下面就是Joel给计算机系学生们七条免费的建议:

  1. 毕业前学会写作
  2. 毕业前学会C语言
  3. 毕业前学习微观经济学(microeconomics)
  4. 不要因为某些非计算机课程枯燥无趣就敬而远之
  5. 学习有大量编程实践的课程
  6. 不要担心工作都跑到印度去了
  7. 好好做夏季毕业实习

让我逐条解释这些建议。但解释之前我要说明一下,如果因为这些建议是Joel的建议你就打算无条件地接受,以至于连我的理由都想跳过,那么你就太单纯,太容易被别人骗了。如果你是那种单纯的人,我还要给你第八条建议,找心理医生咨询一下如何培养自信(self-esteem)。

毕业前学会写作

如果Linus Torvalds不懂如何布道的话,Linux会成功吗? 正象每一个黑客,Linus精通写作,他知道如何准确地在email和邮件讨论组中使用书面英语表达自己的思想,所以他能够从全世界召集大量志愿者为Linux工作。

你听说过最近风靡全世界的极限编程(Extreme Programming)吗? 即使你不懂什么是极限编程,你至少听说过这个词。为什么?因为宣传极限编程的人都是天才的作者和演说家。

就看看你身边的那些小型的软件开发组织吧,最有权力和影响力的人是那些可以用自信,准确,舒适的英语交流的人。好吧,我承认这些人也许言过其实,但是你无可奈何。

一个合格的程序员和一个伟大的程序员的区别不在于知道多少种编程语言,不在于他们是喜欢Python或者Java,而是在于他们是否擅长表达。他们能够说服,所以他们获得权力。他们能够写清楚明白的评论和接口文档,所以他们使得别人不用重写,而可以重用他们的代码,否则他们的代码就是毫无用处的。他们也能够写出清晰的用户手册,于是最终用户可以理解他们的代码是做什么用的,明白了他们的工作的价值。sourceforge埋葬着许多精美的代码,这些已死的代码无人使用,因为代码的作者很少写(或者根本不写)用户手册。

我不会雇佣一个不懂写作的程序员。如果你擅长写,你就很容易找到工作,紧接着你就会被要求写技术规格文档,这意味着你已经被管理层注意到了。

大学里有一些课程,要求你做很多的写作练习,不要犹豫,赶快参加这些课程。不要错过任何要求你每周或者每天练习写作的课程。

给自己建立一个网络日志(weblog)。在上面写的越多,你会写地越容易。写地越容易,你就写地越多,这是一个正向地循环激励。

毕业前学会C语言

我可没有说是C++。虽然现在用C的工作不多,但是掌握各种编程语言的程序员事实上用C来交流(lingua franca);更重要的是,C比某些“现代”语言更接近机器语言。我不管现在大学里在教什么流行的垃圾语言(trendy junk),你至少得花一个学期接近机器。否则,你不可能使用高级语言写出高效的代码。这意味这你不会有机会写编译器或者操作系统,也许这是更好的编程工作;别人不会相信你能够为大项目设计架构。无论你知道多少高级的控制结构,知道如何进行错误处理,如果你不能解释为什么while (*s++ = *t++);的意思是进行字符串拷贝(而且对你而言这是世界上最自然,最易懂的代码),那么你就是在对编程一窍不通的状态下编程(programming based on superstition)。打个比方,就好比一个医生不懂基本的解剖学就给你开处方,如果你问这个医生为什么开这种药而不是那种药,他会说因为医药销售代表说这种药有用。

毕业前学习微观经济学(microeconomics)

我个人对经济学的一些理解:在经济学刚诞生的时候,它只是局限于有限的领域,在这些领域中人们发展和发现了很多有用的理论和很有趣的事实,这些理论和事实是从逻辑上是可以证明的。然后, 经济学开始走下坡路了。 “有限的领域”就是微观经济学,它对于商业可以进行有意义的指导。然后,事情就开始变糟了(以下部分你可以跳过),你接下来碰到的是讨论诸如失业率和银行利率之间关系之类东东的宏观经济学,很多时候宏观经济学讨论的理论都是无法证明正确或者错误的。接下来事态更加恶化了,经济学中的一些领域开始和物理学搭界,嗯,学习物理经济学也许你帮你在华尔街找到好工作。言归正传,无论如何请学习微观经济学,因为你需要知道什么是“供给和需求”,什么是竞争优势,什么是净现值(NPVs,Net Present Value,指项目经济寿命期内现金流入总和与现金流出总和之差额),什么是折扣和边际效用(discounting and marginal utility),如果你真想了解商业是如何运作的话。

为什么计算机系的学生要学习经济学?因为理解商业基本规律的程序员对商业界来说是宝贵的程序员。我记得无数个程序员使我非常沮丧,因为他们在代码中坚持某些疯狂的设计,这些设计从技术上来说,完美;从资本主义的角度来看,发疯。如果你是一个理解商业的程序员,商业会给你回报。这就是你要学习经济学的原因。

不要因为某些非计算机课程枯燥无趣就敬而远之

首先,你需要让你的学分平均分(GPA)看起来漂亮点。

不要低估学分平均分的威力。很多雇主和人事经理(包括我)阅读简历时首先看成绩,为什么?因为这代表了大部分的教授在很长的时期内对你的学业的一个平均的看法。托福成绩(美国的托福大致相对于我国的高考中的语文考试)?哈,几个小时的测验而已。当然学分不一定说明了一切,如果你修的是很难的课程,学分就有可能低一点。即使你的学分平均分很高,我还是要看各科分数是否一致。如果你应聘的是软件工程师职位,我为什么要关心你在大学里学的欧洲历史课程分数的高低呢?毕竟,历史很枯燥。那么要是你要编程的部分也是很枯燥的,你是不是要放弃了?事实上,有时候编程是枯燥的,如果你不能忍受编程中的枯燥部分的话,你就不能完成整个工作,雇主不愿意雇佣你这样的员工。

我在大学里修过一门叫做“文化人类学”的课程,因为那时候我也搞不懂我到底要学什么,听起来这么课程可能还蛮有意思的。

出乎我的意料。我不得不阅读大量讲述巴西热带雨林中的印第安人如何如何的书,让人真昏昏欲睡。听老师讲解也好不到哪去,我发觉看教室外的草如何长更有趣点。土著人如何烤蕃薯藤和我有什么关系?我为什么要去讨论如何烤蕃薯藤?但是期中考试马上就要到了,我暗暗下定决心,如果我能跨越“文化人类学”这个障碍,以后也许没有什么能难倒我了。我决心得A并且得到了A。以后当我不得不坐在林肯中心,连看18个小时的瓦格纳的《尼伯龙根的指环》时,我终于明白我为什么要学习“文化人类学”了,相比之下,我也能忍受这种歌剧了。

学习有大量编程实践的课程

我还记得决定不去读研究生的那一刻。

就是在学习《动态逻辑》(Dynamic Logic)这门课的时候,我记得是耶鲁的Lenore Zuck(一个天才的教师)教的。

修这门课的时候,我已经不再是雄心勃勃了。我可不指望在这么课程中得个A,我梦想的是混个及格。逻辑本质上是很简单的:如果结论正确,前提必须正确。例如,如果“所有读书好的人都能找到工作”并且“张三的读书好”,那么“张三能够找到好工作”。就这么简单。

但是我要学的是动态逻辑, 动态逻辑和一般逻辑差不多,但是要考虑时间因素。例如,“在你开灯之后,你可以看见你的鞋子”加上“过去灯被打开了”意味着“你现在可以看到你的鞋子”

动态逻辑学对于象Zuck教授这样的天才理论家来说非常诱人,因为这门学科的知识也许可以用来证明计算机程序是否正确。我记得在第一堂课上,为了证明“如果你有一盏关着的灯”并且“你按了一下开关”,那么“现在灯亮了”,Zuck教授就使用了两黑板加上边上的墙壁。

证明过程难以置信的复杂。我觉得如此复杂的证明过程很可能会有小错误,但是我没办法证明证明过程本身是正确的。事实上,写在黑板上的证明跳过了很多中间步骤,许多步的证明使用了演绎法,使用了归纳法,以及一些研究生才懂的证明方法。

作为课后作业,我们需要证明以下命题:如果灯过去是关着的,并且现在它是开着的,请证明有人按了开关

我真的试着证明它了。

我花了许多小时,试图证明这个命题。

在无数个小时的努力后,我发觉Zuck博士的原始的证明有一个逻辑上的错误,也许这个错误是我的笔记抄错了,我不知道。于是我终于认识到,如果为了证明一个简单的问题需要花三个小时写下几黑板的证明步骤,再考虑到这个漫长的证明过程中可能会引入种种错误,那么这种机制是不可能用来证明任何有趣的东西的。

对动态逻辑学家来说,有用是无关紧要的。

于是我退出了那门课程,发誓永远不会去读计算机系的研究生。

这个故事的主题是,计算机科学和软件开发不一样。如果你非常非常幸运,你的学校会开软件开发的课程。然而,他们也可能不开这样的课程,因为名牌大学认为教授实用技巧的事情应该留给那些二三流的技术学院或者某些释放犯人再安置计划。你可以在任何地方学习编程,我们是耶鲁大学,我们培养未来的世界领导人。你付给耶鲁16万美元的学费就是为了学习如何写循环语句吗?你把耶鲁当成什么地方了?Java速成班吗?哼。

问题在于,我们没有一个专业的学校教授软件开发。所以如果你想成为一个程序员,你可以进计算机系读书(当然计算机科学也值得学习),但是你学的不是软件开发。

如果走运的话,你可以在计算机系发掘出很多有大量编程实践的课程,就象你能在历史系找到很多提供写作水平的课程一样。这些课程绝对值得学习。如果你喜欢编程,不要为你不能上教授诸如lambda算子或者线性代数的课程沮丧,在那里你连摸一下计算机的机会都没有。找找看有没有名字中带有“实习(Practicum)”字样的课程,不要在乎Practicum是个拉丁语。有用的(无奈状)课程就是需要在课程名中塞一些拉丁语,才能从那些装模作样(Liberal Artsy Fartsy)管理层的眼前蒙混过关。

不要担心工作都跑到印度去了

啊哈,如果你人在印度,你就无所谓了。愿你享受外包带来的工作机会并顺祝身体健康。

但是我听说现在愿意读计算机系的学生越来越少了。据说原因之一是工作机会都跑到印度去了。我认为这种观点是大错特错。首先,根据眼前的商业时尚选择事业是非常愚蠢的。其次,即使工作真的都跑到印度和中国去了,编程对于其他有趣的工作来说都是极好的训练,例如业务流程工程(business process engineering)。第三,无论是在美国还是印度,好程序员仍然是非常短缺的,请相信我。当然,现在有许多所谓搞IT的人吵吵嚷嚷地说就业形势不好,工作太难找。但是事实如何?恕我直言,好程序员找工作还是很容易。第四,你还有更好的主意吗?历史系的毕业生找工作更容易吗?去法学院如何?据我所知,99%的律师恨他们的工作,每分钟都恨。而且律师一周工作90小时。正象我以前说过的,如果你喜欢计算机,那么感谢上帝,你将属于全世界人中的极少数的幸运儿,这些幸运儿热爱他们的工作,而且工作也可以提供体面的收入。

实际上,我也不认为报考计算机系的人越来越少有多大的意义。相对于internet泡沫时期大家都疯狂的往计算机系挤,现在的人数回落只是回归正常水平而已。在泡沫时期,我们这个行业涌入了许多对计算机毫无兴趣的南郭先生,他们梦想的是拿着高的吓人的薪水加诱人的期权,然后年轻退休。谢天谢地,现在这些人都跑了。

好好做夏季毕业实习

明智的招聘者知道热爱编程的人初中就为当地的牙医写数据库程序,高中就在计算机夏令营教课,为校报规划网站,在某个软件公司做实习。他们找的就是这样的人。

如果你喜欢编程,你最容易犯的最大的错误就是“有活就接”。我知道,其他专业的学生假期打工可顾不了这些条条框框。但是你不一样,你拥有一种特殊技能,不要浪费它。当你毕业时,你的简历上应该已经罗列一堆的编程工作实习。让其他人去“为大家提供租车服务”(Tom Welling是个例外,他业余时间去演超人)。

最后,为了让你的生活更容易一点,也为了说明我这篇文章是能够自圆其说的,我将给我自己的公司的做做广告。我的公司Fog Creek软件公司,可以为大学生提供软件开发方面的实习机会。在我们公司,你可以学习“编码,开发,商业”。去年在我们公司实习的Ben就是这么说的,可不是因为我给他什么好处他才这么说。二月一号截至,抓紧机会吧。

如果你听了我的建议,你就会太早地卖掉Microsoft公司的股票,拒绝Google提供的职位,原因是因为你已经拥有自己的公司了。到时候可别后悔,更别怪我,呵呵。

 

一个词法分析器的简单实现

词法分析器是编译器的前端,作用是将源代码的字符串分解成具有独立意义的最小单位,也就是计算机所认识的单词。这篇文章中,通过一个实验报告来明确这个词法分析器的需求,然后带大家通过代码的方式来实现一个简单的词法分析器(另一个方法是通过flex自动生成词法分析器)。

一、实验目的:

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

二、实验内容

编制一个单词获取程序,从文件输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、整数、小数、字符串、分隔符、运算符等七大类。并依次输出各个单词的内部编码及单词符号自身文本串(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

注意:单词类型大小写不敏感(即不区分大小写

三、实验要求

1、词法规则

  1. 关键字: program、const、var、integer、decimal、string、procedure、begin、end 、if、then、else、while、do、call、read、write、not
  2. 标识符: 字母或“_”打头的由字母、数字串或“_”组成的任意长度的符号串。
  3. 整数: 数字串。
  4. 小数: 数字串·数字串
  5. 字符串: 由一对“”括起来的任意长度的符号串。注意:可以多行。
  6. 分隔符: {、}、(、)、;、空格
  7. 运算符: :=、=、<、<=、>、>=、+、-、*、/

2、设计词法分析函数getToken( ),完成以下功能:

  1. getToken( )每调用一次就分析出一个单词;
  2. 返回单词类别、单词自身文本串、单词在源文件中的行列号;

3、编写测试程序,反复调用函数getToken ( ),输出单词信息。

IMG_20150331_222331.304

我的实现思路是:

  1. 先将源程序代码全部读入缓冲区中。这一步可以有三种方法:一个一个字符读,一行一行读,全部读入。其中,1的代码可读性有点差,所以这里不采用。按行读实现起来是最难的,因为要处理换行的字符串问题。全部读入之后,只通过词判断,并没有换行的区别,只要识别出一个单词,就重新开始,识别出下一个单词。
  2. 调用getToken()从缓冲区的第一个字符开始,按照上图的状态转换图往后读,直到分析出一个单词;
  3. 输出这个单词的判定类别,返回,继续读取一个字符。

源代码如下:

参考:一条鱼、尹雁铃(更详细的词法分析器讲解)

 

怎样才算健康的生活方式

一个朋友问我这样的问题,很巧的是,我最近正好很认真地想了这个问题。

我的观点是,按照自己想要的方式生活,就算健康。你可能会觉得这是一种享乐主义,但那又怎样呢?人生只有900个月,掐指一算,能干的事情真的不多。

而且我心中的乐,是分等级的。我一直认为,只有素质越高,能享受的娱乐就越多,是一个良性循环。比如读书,网络小说有网络小说的乐趣,言情有言情的乐趣,但是读的书越多,从这里得到的乐趣就越少,从经典著作中得到的乐趣就更多。这里说的乐趣不是“韬光养晦”这种高尚的情操,我说的就是站在“消费者”的角度讲。不是说你读了一本晦涩难懂的名著,心里得到了满足感,成就感,坚持读完不容易,而是宏伟著作所带来的一种真正的,精神上的快感。而对于同一本书就有可能有的人得到了“读完的艰辛”、“没怎么看懂”,有的人却得到了启发和快感,这就是素质的区别。

再比如说,打游戏。我从小时候就崇拜过身边的游戏高手:有个拳皇玩家手很快,快到看不清;隔壁宿舍玩弹幕游戏跟神一样,再密集的弹幕都能躲开;楼上星际2到白金用了一个周。相反的是,我还遇到过打了两万场的黄金玩家。

这只是天赋差别吗?我认为不是。玩游戏玩的好的人,都有一个特点:思考。看录像,或者不断练习,提升。读书也是,走马观花,和认真地读,区别很大。所以我认为,即使是按照自己想要的方式生活,也不是一件简单的事情。你可能会说,如果一个人喜欢玩游戏,那他不停地输,也会很开心啊。我不否认,但是如果他能多动动脑子,玩的越来越厉害,会更开心吧!

如果你非要说到吸毒的话,我只能说:这是一种廉价的快感。

在这篇文章变成”鼓励思考“的励志鸡汤文之前,我要强调一下上文中那900个月。我不喜欢鸡汤文的原因就是它们只会说你要去努力却不会说你为了什么努力,它们告诉你要过追寻自己的梦想却不告诉你如何找到自己的梦想。答案很简单,人生苦短,就是你喜欢的事情呗。可能你现在学的吐血只为将来做一个好医生/程序员/老师,那么不如就现在开始。用现在的苦难时光希望换来将来的梦想,我觉得得不偿失。若真成功,你可能会感谢现在的自己,但是肯定也会对不起现在的自己,那么何不让现在成为不错的回忆?

我把这些写出来,是因为晚上我看到传智播客培训出来的程序员工作只要四个月,不是黑他们,也不是做广告,其实我看过他们的培训课,私以为也差不多。于是我想,我在象牙塔里四年,是为什么?

制作东西让我感到快乐和成就感。软件在我看来是最简单(不需要很多材料),能力最大的了。所以我对各种各样的计算机技术感兴趣。觉得很多东西实现地很巧妙,就像一种信仰的崇拜。有人跟我说,杂而不精,没什么用的。没关系,我了解他们不是为了有用。有人说,将来硬件发展比软件要好,工资更高,工作好找。我知道我还是更喜欢软件开发。我做的事情让现在的我感到快乐,这就足够了。同理,我玩游戏花的时间,也从来没有后悔过。

不要把太多的希望寄托在未来,不要想着将来某一天过上多好多好的生活,就从现在开始吧!还记得”上了大学就能 XX“的话吗?多愚蠢的骗局啊!

 

MacVim 配置攻略

网络上对于 Vim 的配置较为杂乱,所以我整理了一下我用到的所有配置,写了一个一站式的教程。这篇教程将从零开始,一步一步将你的 Vim 打造成一个好用的编辑器。本文包括:

  1. Vim 的安装;
  2. Vim 颜色主题配置;
  3. 编程友好的字体——SourceCodePro 的安装和配置;
  4. gcc,gdb 的编译安装和一键编译配置;
  5. 我的 vimrc,供参考。

这是现在我的 Vim 使用界面:

myvim

1.Vim 的安装。

GVim(图形界面)的安装:关于 Vim 的安装,你可以直接从 Vim.org 指定的链接来下载最新的版本。下载之后直接将其拖动到你的 /Application 目录中,就可以在应用程序界面看到 Vim 图标了。

Vi 的安装:Mac OS 系统的终端中自带了 vi,不需要再进行安装了。本文主要以配置 GVim 为主,但是原理都差不多。

2.Vim 的颜色主题。

Vim 的配色方案多种多样,比较流行的有:tomorrow ,zenburn ,solarized 等。我比较喜欢 molokai,颜色对比不过分,也不刺眼,看起来比较舒服。

打开 vim 的文件夹(即你刚刚拖动的文件夹),右键 MacVim,选择“显示包内容”,依次选择 Contents/Resources/vim/,你将会看到一个 gvimrc 文件,这个就是 vim 的配置文件内容了(vimrc 用于配置终端上的 vi)。右键以文本格式打开,可以在里面设置各种各样的配置参数。配置文件的详细内容将在最后以代码形式给出,供参考和修改。

这个目录下还有一个 runtime 文件夹,保存了一些资源文件,其中 colors 文件夹保存的就是配色方案。使用这些配色方案的方式是,在gvimrc 中添加这样的设置:

重启 vim ,就应用了!

你也可以到 Github 上下载molokai或者其他的配色方案,拷贝到 colors 文件夹下,然后设置他们。请注意,你必须使用你的 colors 文件夹中存在的配色方案。

3.字体的安装和配置

这些都做好了之后,你会发现你的 Vim 和我的还有点不一样,就是字体啦。字体的设置和主题类似(其实,大多数的设置都是这样的)。其中要注意的是,用“_”代替空格。

有可能你会发现你的字体没有改变,这是因为你的系统中不存在这种字体。打开系统自带的“字体册”,你会发现确实没有……字体的安装方法如下(这里就以 SCP 为例啦):

  1. github 上下载字体的源代码到本地。
  2. 下载 Adobe 的字体开发工具(AFDKO)对源代码进行编译。  这个工具的安装方法是:

    其实,你也可以直接双击这个 FinishInstallOSX 执行。
  3. 编译字体的源代码:

    这部分完成后,这个文件夹中将多出来 target 文件夹,里面的 TTF 就是字体,OTF 就是预览啦。
  4. 安装字体。使用系统的字体册,点击“+”号,找到选择 TTF 下的所有文件,安装。这时,你的字体册就出现了新的字体!

现在,你 Vim 的字体应该生效了吧?

4.一键编译。

Vim 是一个编辑器,但仅仅这样而已,经过配置,Vim 完全可以变成一个 IDE!这里,就介绍一下在 Vim 里配置 C/C++ 编译环境。

首先,需要安装编译器 gcc,调试器 gdb。你可以从官网 GNU.org下载源代码,自己动手编译进行安装,或者通过 homebrew 指令进行安装。

编译安装

  1. 以 gdb 为例( gcc 是编译器,不能编译安装)。先从官网的镜像下载源代码。
  2. 解压。然后从终端中进入你的解压目录。执行以下步骤。(由于每个编译步骤之间需要时间,你会看见终端的文字飞快地闪动,耐心等待几分钟就好了。)

Homebrew 安装

如果你没有 Homebrew 的话,需要先在终端中执行这样一句话,完成 Homebrew 的安装。

然后用下面的指令安装 gcc :

安装好以后,经过适当的配置,就可以在 Vim 里面进行 C/C++的编译和调试了,那么“适当的配置”是什么呢?

5.尾声——配置文件。

这是我使用的配置文件,如果你照上述方法安装了编译环境,字体,下载了颜色方案,那么你把 gvimrc 改成我的代码,看到的效果应该是和图一样的了!当然,你也可以更改成自己喜欢的配置,在代码中放入了注释,可以根据需要修改。

 

 

学习培训课程的视频效果好吗?

博客好久没更新了。寒假里拿到了驾照,看完了《绝命毒师》和《破产姐妹》,就过去了,没啥好写的。开学之后有点沉迷于星际争霸2,不过这个周显卡烧掉了,没法再玩了,这才认真了起来。

我想讨论一种编程的学习方法——视频课。这种方法比较流行,因为难度不大,易于入门,学起来也不太会偷懒,因为视频一直在走,进度在那里。我初次学习 Java 的时候,就是看的传智播客的毕向东老师的视频(院老师推荐的)。看的时候我还认真地做了笔记,也谢了不少代码,效果还是有的。

但后来在没了视频写程序的时候,问题就来了。首先,不能看文档。学习的时候写的代码,都是跟着老师写的,他写一行,我写一行,他翻文档,我也跟着翻到那一页。自己写的时候,就不熟悉文档,不知道某个方法应该怎么找。其次,没有思路。学习过程中大多数的时间都是跟着老师,还要加上写代码做笔记,不时地暂停一下,思考的时间就非常少。导致后来不知道怎么思考了。除此之外,我觉得视频课程的缺点还有:浪费时间。培训班的课程是零基础的,很多常识性的东西要解释半天,进度其实也很慢,毕竟是面向社会招生的。所以在这方面时间白白浪费掉了。

看视频的好处就是:难度低。因为跟着视频一步一步做,很少出错。如果自学的话,很可能在配置 Java 编译环境的时候就受到挫折。

其实这种优点在某种程度上可能成为一种缺点。因为难度低了,无形中也削弱了你的自学能力。每当你想学习一门新技术的时候,总想着去看视频,跟不上潮流(必须等流行了才能去学)先不说,当你对某冷门技术感兴趣或者必须用到的时候,就又必须经历上面那种挫折了。

自学最重要的是思考。可以说,方法并不重要。不推荐视频的原因是它不鼓励你去思考,如果你能在看的时候想到很多问题,动手很多,那么视频当然不失为一种好方法。如果你不喜欢思考,那么就是在真正的课堂上,效果也是不好的。学习不就是思考的过程吗?

在我以前一篇文章中提到过我对课堂的认识。而且我认为尤其是计算机,最主要的是自己的思考,老师只是引路人。如果能让我进行教育改革的话,我会取消所有的计算机专业课程,老师们都集中精力写简明易懂的教案或课本,然后建立一个论坛,学生在上面和老师交流,提问等。这样节省资源,效率也高。一个人的提问,能带来所有人的思考。说实话,课堂上老听一个人讲,很没意思,所以这学期很多课我都不上了。

这里,批评的并不是一种方式,毕竟内容才是最重要的,不偷懒,总会有收获的。