大学里做不出好软件

jopen 12年前
   <p>软件正在吞噬这个世界。尽管年景不好,非死book还是创造了650亿美元的市值。这样一个仅仅2000名开发人员的小公司竟能抵得上一个汽车制造公司。</p>    <ul>     <li>大部分的教授很少编程。因为他们不编程,他们就不会特别强调像代码审查或单元测试这样的好的开发方法。不相信我说的吗?那去<a href="/misc/goto?guid=4958184186834948584">GitHub</a>上找找你最喜欢的教授的作品吧。他能充满自豪的在上面展示他开发的代码吗?</li>     <li>因为很少有教授编程,所以你也应该不会吃惊于学校里很少有软件发布途径来供那些想展示自己软件作品的人使用。于是,这也就意味着,即使你开发出高质量的软件,也难有同行来欣赏。</li>     <li>大多数学院里的软件都是由学生写成,他们缺乏经验,缺乏写出好软件的动机。你也许会认为,在学校里花了4年时间,上了无数堂课,做了无数的编程作 业后,大多数计算机科学/工程的学生都应该成为不错的程序员了。但这不是我看到的。部分的原因是学校教育是一个模仿老师的过程。我相信,如果大学四年你是 跟着<a href="/misc/goto?guid=4958346543670131514">李纳斯·托沃兹(Linus Torvalds)</a>上课,你一定会成为一个相当不错的操作系统内核编程高手。然而,Linus 不会、也不喜欢当一名大学教授。大学教授不花很多时间去编程,他的学生也会这样。</li>    </ul>    <p>所以,学校里的软件很烂,是因为学校里的人不善于编程。但这其中还有一些其它因素:</p>    <ul>     <li>编程可以像煎鸡蛋或建一个鸟窝那么简单。你也知道,写一个PHP脚本把数据库的内容展示到浏览器里并不是那么的难。但要开发出一个不凡的软件则需要程序员表现的像一个<a href="/misc/goto?guid=4958346544468633774">创造者</a>。然而,你们的编程课程也许会教如何去煎一个鸡蛋(比喻),但他们不会教你如何设计一个给四星级饭店用的菜肴。创造出新奇软件的门槛也许比你想象的要低。根据一个论文里的算法,我们可以有十几种实现方法,但大部分都是低效率的。<strong>即使是已经有原型伪代码提供了</strong>, 你仍然需要大量的工作经验在身,才能给出正确的设计。判断如何能正确的实现一个算法也许比你们想象的要难的多。理论家很少有认可这点的,他们通常相信最困 难的部分是用缜密的理论知识设计出算法。他们不知道在两个相同计算复杂度的算法会在软件实现上产生成几个数量级的速度差别。事实上,假设有人告诉你了作家 Stephen King的下一部小说的大纲,你就能写出一部能和King写的一样好的小说吗?很值得怀疑。软件开发也类似。执行是一切。再好的策划也无效。</li>     <li>大多数的学院里的研究者是<a href="/misc/goto?guid=4958346545263192025">为自己写软件</a>。 就像烹饪一样:“只给自己写软件的人不知道给别人写软件时有多少工作要做。”相比起在饭店里当一个厨师,给自己做饭要简单容易的多。这两者之间的难度差异 如果说有两个数量级太大,那至少也不在一个数量级上。学术界里很少有人会认可这些。他们基本上写的都是写完即丢的代码:写好程序,使用它,然后忘了它。诸 如维护和文档之类的问题,虽然在一些课堂上也讨论过,但在学院里,鲜有用于实践的。</li>    </ul>    <p>那么,将来会如何?我对学校里的软件保持悲观态度。也许会有例外,但看总体情况,我不抱太大希望。因此,当我审查一个学生的研究报告或论文时,我会 先假定实现这个理论的软件做的不怎么样。我希望招聘那些新程序员的人也要这样想。鉴于我这样的悲观论调,实际是有一些事情可以做的:如果你想在 非死book找到一份软件工程师的工作,你就应该多花一些时间在<a href="/misc/goto?guid=4958184186834948584">GitHub</a>上,少花一些时间在课堂上。如果你幸运的话,你可以说服学校就你的开源作品给你一些学分。</p>    <p id="page-note">[本文英文原文链接:<a href="/misc/goto?guid=4958346546801298355">On the quality of academic software</a> ]<br /> <br /> 载自: 外刊IT评论 <a href="/misc/goto?guid=4958183272158702965" rel="nofollow" target="_blank">http://www.aqee.net/</a> </p>