内容相当丰富,这或许是最想要成为的模样。
图书
上学最宝贵的收获之一是结交学识过人的朋友。自己闷头学得山穷水尽时,高手轻轻一句点拨,眼前便峰回路转,柳暗花明。每次上完课,有幸和朋友小聚,请教弱智问题,听朋友妙语解惑,实在是难得的人生乐事。读The Little Schemer,也有同样的感受。读The Little Schemer的过程,就是被良师引导的过程。
作者的话说,The Little Schemer是一本教人理解计算本质的书。编程语言Scheme不过是传道的载体。书的体例独特。每页分成两列。每列寥寥几行代码,数段散句。左边一列问个问题。右边一列给出答案。作者就用这种轻松对话的形式讲解递归和函数编程。
序言的话说,The Little Schemer展示了列表是Lisp编程的心脏,而The Seasoned Schemer展示了函数是Lisp编程的灵魂。
Knuth在《Mathematical Writing》里强调的“为普通人而写,你的作品专家能看懂;为专家而写,你的书没人看懂”的箴言还不够深入人心。
做题的境界
把习题当成项目来做。十年寒窗。半世煎熬。习题做完,世界随之改变。例子:A = B这本200来页的书(免费下载。作者是好心银啊),解决了《编程的艺术》上一道难度系数为50的习题:自动化多维几何级数的求和。如果有封闭解,则自动找到该解。不然自动证明无解。这好比20年前Wolfman的Mathematica搞定自动积分,号称机器不能积的,人肉也不用想。又好比优化编译器生成人肉编译器们望尘莫及的全局优化代码。众多老大多年积累引为自豪的技巧转眼成为自娱自乐的玩具,价值可比1949年太祖登位前的法币。技巧贬值事小,附着于技巧上的汗水,骄傲,地位,以及掌控未来的安全感也烟消云散恐怕更有杀伤力。所以愤怒和抵制情绪就象巴普洛夫狗的唾液一样自然分泌。一将功成万骨枯。世界就这么残酷。工业革命萌芽时疯狂打砸自动纺织机器的英国纺织工人们想必早有体会。历史上喜剧也总在重演。我们至少已经看过机器语言高手们对汇编的鄙视,汇编语言高手们对C的不屑,C语言高手们对使用垃圾收集器的愤怒。靠,又扯远了。还是说回这本书。
关于科学和艺术的铿锵引言就是从这里来的:Science is what we understand well enough to explain to a computer. Art is everything else we do…. Science advances whenever an Art becomes a Science. And the state of the Art advances too, because people always leap into new territory once they have understood more about the old.
一本书和阅读代码
很难想象钢琴家不用聆听大师的作品;诗人不用揣摩传世的经典;画家不用体会前辈的佳作;拳手不用参详高人的示范。那我们怎么能想象程序员不用仔细学习性感的代码?
IBM的Grady Booch也强力推荐程序员大量阅读代码,认为这是从新手到高手的必要手段。如果喜欢软件开发老大还没有订阅Grady Booch的博客的话,现在是时候了。G老大的私人项目Architecture Handbook想必更是每位对软件架构有兴趣的老大的必读材料吧?他在这本公开的手册将归类整理历史上各式架构。虽然这些工作开始还不到四年,但上面已经有不少高质量的资料。比如以前提到过的Eclipse架构考古 Archeology.ppt)。也许用G老大自己的话最能雄辩地道出软件考古的意义:经典科学通过在定量观察和理论构建间曼舞取得进展。前者细致而刻意,后者富于创新且能经受检验。计算机科学充满了经验的观察和理论的构造,但软件世界里,我们往往把所有时间用于搭建实物,却疏于科学研究。我们有自己关于流程和工具的理论,但它们大部分都基于坊间传闻和个人经验,而不是基于反映了可靠经验研究的确凿且中立的数据(classical science advances via the dance between quantitative observation and theoretical construction.” The former is deliberate and intentional; the latter is creative and testable. Computer science is full of empirical observation and the construction of theories, but in the world of software we often spend all of time building artifacts and not enough time doing science. We have our share of theories, about process and tools, but much of that work is based on anecdote and personal experience, not the hard, dispassionate data that reflects good empirical work)
计算机系不仅要交给学生知识,也要让学生领会“激情,美丽,快乐,和敬畏”,真是深得我心啊。在演讲里,G老大频繁用“正确和高尚”来描述计算机业界众人的努力,说从事软硬件研发的工作既是特权也是义务。它是特权,因为我们从根本上多方面深刻地改变这个世界。基于同样的原因,这也是我们的义务。我们应当牢记这点,并让我们的学生同样明白。不知道G老大和蜘蛛人有什么瓜葛。
计算机科学经典论文
Jao的Programming Musing 看到的:Babar Kazar 整理了一堆经典论文。Jao强烈建议每个严肃的程序员读每篇论文,说它们都或多或少有意思。粗粗扫了一下,很多论文都没读过。挑了些俺多少知道一点的介绍。
- [An axiomatic basis for computer programming](http://www.spatial.maine.edu/~worboys/processes/hoare axiomatic.pdf) C. A. R. Hoare
Tony Hoare名下的公理化语义(Axiomatic Semantics)。 - Communicating Sequential Processes (CSP) C. A. R. Hoare
Hoare, 又见Hoare。 - Call-by-name, call-by-value, and the lambda calculus Gordon Plotkin
- Towards a theory of type structure John C. Reynolds号称经典中的经典。
- Structured Programming with go to Statements Donald E. Knuth
- Definitional interpreters for higher-order programming languages John C. Reynolds
- An APL Machine 1970 Philip S. Abrams
- The Anatomy of a Large-Scale Hypertextual Web Search Engine Sergey Brin and Lawrence Page
- No Silver Bullet: Essence and Accidents of Software Engineering Frederic P. Brooks, Jr.
- A Mathematical Theory of Communication Claude Shannon
- Bayesian Networks without Tears
A Universal Algorithm for Sequential Data Compression - A Relational Model of Data for Large Shared Data Banks 1970 Edgar F. Codd
- Let’s Build a Compiler 1988-1995
- Gauging Similarity via N-Grams: Language-Independent Sorting… Marc Damashek
- Worse Is Better Richard P. Gabriel
- Hints on Programming Language Design C.A.R. Hoare
- Why Functional Programming Matters John Hughes
- On the Expressive Power of Programming Languages Matthias Felleisen
- The Early History Of Smalltalk Alan Kay
Alan Kay评述Smalltalk的话:In computer terms, Smalltalk is a recursion on the notion of computer itself. Instead of dividing “computer stuff” into things each less strong than the whole–like data structures, procedures, and functions which are the usual paraphernalia of programming languages–each Smalltalk object is a recursion on the entire possibilities of the computer. Thus its semantics are a bit like having thousands and thousands of computer all hooked together by a very fast network. Questions of concrete representation can thus be postponed almost indefinitely because we are mainly concerned that the computers behave appropriately, and are interested in particular strategies only if the results are off or come back too slowly.
- Computer Programming as an Art Donald E. Knuth
- The next 700 programming languages Peter J. Landin
- Recursive Functions of Symbolic Expressions and their Computation by Machine (Part I) 1960 John McCarthy
- FORTH - A Language for Interactive Computing Charles H.Moore
- Teach Yourself Programming in Ten Years 2001 Peter Norvig
- The Definition and Implementation of a Computer Language based on constraints Guy Lewis Steele Jr.
- Growing a Language Guy Lewis Steele Jr.
- Epigrams on Programming Alan J. Perlis
- The Complexity of Theorem Proving Procedures Stephen A. Cook
- Steps Toward Artificial Intelligence Marvin Minsky
- The Original ‘Lambda Papers’ Guy Steele and Gerald Sussman
- The UNIX Time-Sharing System Dennis Ritchie and Ken Thompson
Dreaming In Code by Scott Rosenberg
作者把Chandler的开发历程,软件开发的历史,和软件开发的基础概念精巧地编织起来,只为探索一个问题:为什么软件开发那么困难?
- 文字方面,作为多年文青,资深记者,Salon的主编,Scott Rosenberg的笔头没得说。三年漫长写作和Chandler项目的艰辛曲折并没有消磨Scott的激情。相反,书中文字蕴涵着他对软件开发的热爱,很有感染力。书里涉及大量技术概念,从OOP到Literate Programming到停机问题,作者都科普得浅显明白。看局外人怎么理解软件开发,也是颇有意思的事情。
- 其次是资料翔实。光靠Wikipedia和Google随意搜寻是绝对写不出这样一本书的。大量的采访,连续三年实地跟踪Chandler项目组开会讨论,几百篇参考资料,包括大量经典论文和访谈录,和作者细心的整理,方才构成这本书丰厚的肌理。
- 三当然就是八卦满天飞了,尤其是著名项目和大牛们的故事及观点。呵呵。非常符合俺这种八卦爱好者的口味。虽然绝大部分八卦俺都知道,但放在软件开发这个大题目下系统读一次感觉还是不同。Alan Kay, Don Knuth, Alan Turning, Charles Simoni, Bill Joy, Frederick P. Brooks, David Parnas, Peter Drucker, Gerald Winberg, Douglas Engelbart等等等等。颇有新的领悟外,也是享受。书里也有一些俺从未听说的八卦。比如这条:一位叫Robert Britcher的程序员写了本回忆录,The Limits of Software,记录了美国航空管理局(FAA)1981年上马的AAS(Advanced Automation System)项目的悲惨过程。用Scott的话说,就是“没有人—哪怕作者—可以全身而退(No one—including, plainly, the author—escape scar free)。项目高峰期,1500名IBM程序员为FAA工作,每天花掉政府100万美元。项目最终失败了,因为项目的要求超出了当时技术和人力的极限。巨大的压力给参与项目的程序员带来心理上的严重创伤。有人砸烂自己的汽车。有人疯掉(我靠!),有人自杀。有个项目经理开始吃纸上瘾。项目拖后得越多,他在开会时嘴里的塞的纸就越多(靠靠靠!)。当初我读Ellen Ullman的小说The Bug的时候还对文中主角在地下室自杀有点不解。看来那也不是女文青Ellen自己的想当然。
- 书里记述了OASF(开发Chandler的组织)犯下的大量错误。这些案例值得我们学习。我觉得比较出奇的是Chandler项目成员开始决定用P2P架构这种来共享日历。虽然用P2P共享个人信息时非常困难的问题,但他们居然不全力设计相关算法或协议,而是花大量时间去讨论Chandler的界面。这一拖就是几个月。最后P2P架构被彻底放弃。Damien以一人之力搞出了基于文档的分布式数据库。不知道如果OASF找到Damien,情况会不会有所改观。Joel Spolsky已经写了篇关于OASF错误的详尽评论。强烈推荐。我就不饶舌了。
- 书的背面有若干书评。第一条是The Atlantic的James Fallows写的,说Dreaming In Code可以和Tracy Kidder的《新机器的灵魂》(The Soul of a New Machine)媲美。Tracy Kidder的书是一代经典,写尽工程师的光荣与梦想。《新机器的灵魂》里电脑工程师为了做出新一代电脑同DEC的VAX竞争,破釜沉舟,灵魂冲突激荡。历经曲折后,项目终于成功。一时间彷佛东方有日出,喷薄欲破晓,好不酣畅淋漓。可惜,这种痛快的阅读感受在Dreaming In Code里体会不到。我想原因有二。一是Chandler是个失败(至少前途还不明朗)的项目。5年过去,几百万花掉,Chandler才到0.7版。当年的设计被一次又一次的更改。当年Mitche Kapor心目中的杀手特性被一个又一个地去掉。看到书的后半部分,俺甚至觉得有些郁闷。正因为这样,Dreaming In Code缺乏戏剧性。我们看不到有独特魅力的灵魂人物,比如《新》书里的Tom West,比如Show Stopper里的Dave Cutler。二是作者把Chandler的项目当作讨论软件开发为什么那么难的案例来写。这样做人物形象就显得比较单薄。书里很少描写Chandler项目组里的成员的心理和行为。我甚至不记得里面有谁曾经意气风发过。问题是,谁没有在设计自己心爱的软件时浑然忘我,神情激越过?这点更远远比不上《新》和Show Stopper。这两本书里的工程师有非常突出的个性。Dreaming In Code里看不到像Show Stopper里微软的愤青们鄙视IBM,决定中止同IBM OS/2团队合作的戏剧性场面的,看不到Jim Alchin早上五点钟跑到高尔夫球场与同事开会的疯狂场景,也看不到两个微软工程师决定到加勒比海边设计Windows NT的API,把他们的经理气得发疯,结果两人一周就搞定了1000多个API的初稿这样的传奇故事。甚至Mitch Kapor在Dreaming In Code里也像个好好先生。
阅读计划
看是永远都看不完的,等什么时候看完也就熄了。
编程和编程语言
: Java Generics and Collections。俺的偶像之一,Haskell背后的主要黑手,Philip Wadler的新作。俺这种庸俗追星族自然屁颠屁颠地来捧场了。
: Java Concurrency in Practice. 正在读这本书。Java 5 里java.util.concurrent主要作者的力作,不仅介绍java.util.concurrent的用法,更细述设计并发程序的理念和经验。Herb Sutterl老大2004年就吐血呐喊Free Lunch Is Over, All We Got Is Multi-core Dinner,俺现在读这本书只算是亡羊补牢。
: Javascript the definitive guide. 今年颇写了些RIA应用。感受是:我恨HTML+CSS,但我爱Javascript。而且现在看来RIA越来越火(没办法,Google, Gucci, Nike, 和众多的Web2.0公司把门槛提高了)。俺向来认为做技术如杀敌,斩草须除根。所以今年要好好梳理一下JavaScript。今年初草草读过这本书第三版。现在第5版要出来了。据说有很多新内容。Steve Yegge说他在Google的时候一个月把关于DHTML和CSS的书翻得快散架,当是俺效仿的榜样。
:Making Reliable Distributed Systems in the Presence of Software Errors. Erlang的作者Joel Armstrong的博士论文。既然要学并发编程,不能说只懂synchronization不是?Erlang的消息传递好歹也是江湖一大显赫门派。所以俺准备今年学Erlang。牛人Damien Katz强烈推荐从这篇论文开始,因为它解释了很多看似古怪的Erlan功能,而且阐述了Erlang的来龙去脉。考察一门技术的历史沿革总能让我们深刻理解这门技术。
![img](https://p-blog.csdn.net/images/p_blog_csdn_net/g9yuayon/8ac9551c192548c2827f20e2ac743ef2.jpg): Concepts, Techniques, and Models of Computer Programming. 还没看,不过俺朋友和LtU都强烈推荐。号称需要一读再读的经典。今年就补上这一课算了。
Code Complete, 2nd ed. 大三时细读了第一版,至今受益。去年借来第二版,可耻地只翻了几页。今年纯还债。
设计和架构
:The Toyota Product Development System. 丰田的Lean Development模式开始慢慢影响到软件开发。据说丰田的开发方法里颇有些看似违反常理的东西,让人非常好奇。
:Framework Design Guidelines. 据说书的前身是微软的内部开发文档。好奇微软是怎么设计框架的。
项目管理
:Software Estimation: Demystifying the Black Art (Best Practices (Microsoft)). Steve McConnell的新作。我的弱点之一就是不能准确地估计项目的开销。很想知道喜好CMM/COCOMO这类重口味的Steve怎么解决这个问题。
: The Art of Project Management。 Scott Berkun的博客已经精彩纷呈。这本书放在我的wish list好久了。今年也该读了。
: Behind Closed Doors: Secrets of Great Management。好评如潮的书。也是放在我的wish list里N久了。纯清除债务。
: First, Break All the Rules. 健身房/洗衣房专用书。蹬自行车时看的。已经读了3/4了。学到不少东西。
写作
: On Writing Well. 谈写作的经典小册子。其实我更想向冯唐那么牛,写出动人的文字。可惜跑到当当上搜了半天,都没发现一本看上去不错的写作书。什么SAT写作,GMAT写作这类垃圾书倒一大堆。
计算机科学
:MMIXWare。Knuth的书。买了好几年了。一直说写一个MMIXWare的虚拟机一直没动手。鄙视自己很久了。想到一个传说。Steve Jobs邀请Knuth给苹果公司的工程师讲课。听说Knuth到了,Jobs赶快迎出办公室。同Knuth握手后说:Knuth教授,真荣幸见到你。我读过你的所有作品。Knuth答道:Steve, you’re full of shit。
:Verification of Reactive Systems。写论文用。买了快两年了,才读了两章。做人还是比较失败。
:How to Solve It: Modern Heuristics。看了三章了。
Never Stop Learning
Steve Yegge的新文章。 现在笔头好又肯耐心写文章的技术博客作者其实不多。Paul Graham和Steve Yegge是其中的佼佼者。新文章里这句话可作俺们程序员的座右铭:Every program you write should be the hardest you’ve ever written (你写的每个程序都应是你曾写过的最难的程序)。
注意力
从Keria Serria的博客看到的好文章。非凡的注意力 造就专家,智力起的作用其实不大。偏偏现在干扰越来越多。而且真正的干扰源自我们的内心。频繁地查信,随时随地地QQ/MSN,阅读无穷无尽的blog。。。到底怎么办呢?仔细读Kerria的帖子吧。
programmingreddit论坛大量文章都值得收藏。更重要的是,上面好多文章并非热门应景帖子,靠自己根本不能发现。其实这也是reddit这类所谓web2.0网站吸引用户的原因:现在的网络实在太庞大了。搜索引擎已经不能解决我们的问题,因为我们往往并不知道自己需要搜索什么。有时候,我们更需要一个“发现”引擎,根据我们的喜好帮我们发现合适的资料,推荐给我们。当然,reddit.com不算现在流行的推荐系统(比如findory.com那样的),但他利用大众的智慧,的确推荐了无数高质量文章。而且推荐的文章不局限于任何一门语言,技术,框架,平台。有讨论编程技巧的,有介绍牛人的, 有讨论技术趋势的,有谈理论的,有谈项目管理的,有谈历史八卦(谁知道.NET的CLR是怎么诞生的?谁知道CLR的GC原型是Common Lisp写的?)的,有介绍书籍的,有介绍工具的,有介绍语言的。。。不一而足。而且有浅显得博客帖子,也有深入的经典。
形式化方法在CS研究中的重要性。一旦抵触情绪消失,注意力就集中了,那些符号也没那么难懂了。
Danny Hillis有篇极为动人的文章,讲述费因曼在Connection Machine Inc时的传奇故事。文章里提到费因曼把每个问题当成一个游戏,总是从“给我一个最简单的例子”这样的问题入手,一直到把一个大问题简化成一系列他能解决的小问题为止。我套用了一下,效果还不错。另外就是把注意力集中在公式的直观意义,尤其是同数据流图的对应关系上。很多复杂公式一下就清晰了。这个手段其实从学数学就开始用。也许本科前的数学本来就直观,
挑战不是别人给的,而是在勃勃雄心驱使下,你自己找的。也许以后做每个项目时,我们应该给自己找点有挑战性的问题,激发自己的潜力。不然做的项目再多,也不过浪费人生。
商业软件编程
三篇博客帖子详解
- 一篇是Thoughtworks前员工Ravi Mohan写的,《但是马老大,商业编程就是无聊》。
- 第二篇帖子是Reg Braithwaite的一篇帖子,《商业编程没有那么难?》。
* 第三篇帖子是XML发明人Tim Bray的一篇短文。在Tim的努力下,JRuby的两个主程加入了Sun。
注意力比较集中
随着年岁增长,要学的东西只多不少。书桌上的论文摞得越来越高,买而未读的书越来越多,没做的项目列表越来越长。怎么办呢?也许该去看心理医生了。
提高效率的最简单的方法就是,增加兴趣。
学生应该做好一件事
ThoughtWorks的Chad Fowler面试Java程序员时,让应试人给自己的的Java功底按1到10打分。如果面试人打分在9以上,Chad Fowler就会问“你能不能谈谈怎么让JVM当掉”。原因很简单,打分在9以上,面试人显然是个Java专家,那自然得展示点Java专家的道行。好比马戏团招杂耍演员。一个候选人说,我会同时抛5个球,一边抛一边还可以空翻360度攀爬红绿灯追公车(朋友语)。面试官难道当场录用这个候选人?当然不。是骡子是马,得拉出来溜溜。你状态不好,抛不了5个球,总可以表演一下抛三个吧?不能空翻360度,转个圈儿总行吧?面试前没有翻书复习,记不清OBDD怎么实现,说说怎么用Hash总可以吧?
自称“了解数据库”,却答不上基本的数据库问题,面试官当然怀疑你的能力,甚至你的诚正。自称酷爱编程,却连二分查找都写不出来,那不是搞笑么?自称聪明伶俐,你的专业课却门门挂红,不是很讽刺么?什么,老师教得太差?课程太枯燥?也就是说,你告诉我因为该做的事情不合心意,你就乱来?问问自己,这样的人公司敢要么?我就不用评论有的人把高数,线代,计算理论什么的都通通归于没有意义的课程了吧?当然,我们不排除有编程高手不能兼顾学业。没关系,那展示一下你的编程成果啊。如果Linux kenerl里有你的patch,我可以相信你的操作系统课不及格事出有因。如果你有自己的3D游戏(一个ray tracer也中),我可以对你线性代数挂红视而不见。但如果你成绩一塌糊涂,也没有拿得出手的软件作品,面试官怎么能相信你是一个聪明可靠,勤勉好学的人才,怎么能得出你四年来没有虚度的结论?不排除有人大器晚成,但对不起,大器晚成的风险属于不可控型,我们只能祝你好运。
其实就是菜,动力很小,借口很多。
- 开发工具
- Build工具
- 测试工具
- 网页自动测试
- 性能测试
- 覆盖测试
- 测试环境
- 静态代码分析
- 排版工具
- JSP开发
- 数据库
- 版本控制
- CASE
程序员嘛,就应该琢磨怎么提高自己的效率。
被玩儿一次,别人可耻;被玩儿两次,自己该死(fool me once, shame on you; fool me twice, shame on me)。
学生建议
www.joelonsoftware.com上的精妙杂文。还好,网上总有热情洋溢的自愿者。这不,Joel的一篇精妙文章被翻译成中文了。强烈推荐一把:http://chinese.joelonsoftware.com/Articles/AdviceforComputerScienceC.html
- 毕业前学会写作
- 毕业前学会C语言
- 毕业前学习微观经学(microeconomics)
- 要因为某些非计算机课程枯燥无趣就敬而远之
- 学习有大量编程实践的课程
- 不要担心工作都跑到印度去了
- 好好做夏季毕业实习
Linus精通写作,他知道如何准确地在email和邮件讨论组中使用书面英语表达自己的思想,所以他能够从全世界召集大量志愿者为Linux工作。你听说过最近风靡全世界的极限编程(Extreme Programming)吗? 即使你不懂什么是极限编程,你至少听说过这个词。为什么?因为宣传极限编程的人都是天才的作者和演说家。就看看你身边的那些小型的软件开发组织吧,最有权力和影响力的人是那些可以用自信,准确,舒适的英语交流的人。好吧,我承认这些人也许言过其实,但是你无可奈何。
一个合格的程序员和一个伟大的程序员的区别不在于知道多少种编程语言,不在于他们是喜欢Python或者Java,而是在于他们是否擅长表达。他们能够说服,所以他们获得权力。他们能够写清楚明白的评论和接口文档,所以他们使得别人不用重写,而可以重用他们的代码,否则他们的代码就是毫无用处的。他们也能够写出清晰的用户手册,于是最终用户可以理解他们的代码是做什么用的,明白了他们的工作的价值。sourceforge埋葬着许多精美的代码,这些已死的代码无人使用,因为代码的作者很少写(或者根本不写)用户手册。
我不会雇佣一个不懂写作的程序员。如果你擅长写,你就很容易找到工作,紧接着你就会被要求写技术规格文档,这意味着你已经被管理层注意到了。大学里有一些课程,要求你做很多的写作练习,不要犹豫,赶快参加这些课程。不要错过任何要求你每周或者每天练习写作的课程。给自己建立一个网络日志(weblog)。在上面写的越多,你会写地越容易。写地越容易,你就写地越多,这是一个正向地循环激励。
握各种编程语言的程序员事实上用C来交流(lingua franca);更重要的是,C比某些“现代”语言更接近机器语言。我不管现在大学里在教什么流行的垃圾语言(trendy junk),你至少得花一个学期接近机器。否则,你不可能使用高级语言写出高效的代码。这意味这你不会有机会写编译器或者操作系统,也许这是更好的编程工作;别人不会相信你能够为大项目设计架构。无论你知道多少高级的控制结构,知道如何进行错误处理,如果你不能解释为什么**while (*s++ = *t++);**的意思是进行字符串拷贝(而且对你而言这是世界上最自然,最易懂的代码),那么你就是在对编程一窍不通的状态下编程(programming based on superstition)。
无论如何请学习微观经济学,因为你需要知道什么是“供给和需求”,什么是竞争优势,什么是净现值(NPVs,Net Present Value,指项目经济寿命期内现金流入总和与现金流出总和之差额),什么是折扣和边际效用(discounting and marginal utility),如果你真想了解商业是如何运作的话。为什么计算机系的学生要学习经济学?因为理解商业基本规律的程序员对商业界来说是宝贵的程序员。我记得无数个程序员使我非常沮丧,因为他们在代码中坚持某些疯狂的设计,这些设计从技术上来说,完美;从资本主义的角度来看,发疯。如果你是一个理解商业的程序员,商业会给你回报。这就是你要学习经济学的原因。
程序员职业规划:让自己重要
- 调研
- 投资
- 营销
- 执行
单纯的编程已经不够了。了解业务逻辑,了解管理流程,能把自己的技术和商务结合起来,解决实际的问题,才大有作为。作者建议我们有空读行业杂志,和做业务的同事多交流。
Pragmatic Programmer的另一个作者Dave的**How To Keep Your Job**是必读材料,非常有启发性。
转行的原因不过是发现自己坐在电脑前的时间远远超过了坐在课本前的时间。而且我没有耐性。看到本科花大力气学的东西,不过是为研究生阶段的学习做准备,就沮丧得不行。相比之下,搞计算机就舒服多了。每学一点东西,都可以马上试验,把玩,投入实用。现在想来,我也算幸运。
学习理论的实用意义
- 学习理论能拓展我们总结一般规律的能力。
- 学习理论能训练我们洞察不同事物间联系的能力。
- 学习理论让我们能迅速掌握计算机的前沿动态。
没有一定的理论知识,还真看不懂,更不用说和论文的作者讨论了。别告诉我看论文不重要。要开发出别人开发不出的软件,光看Dr. Dobb’s Journal 是远远不够的。
学习理论能训练我们对直观想法的表述能力。形式化方法要求我们把直观的描述转换成严格的数学描述,或者把一种形式的语言转换为另一种形式的语言。有时一个想法的直观意义明显,但它的形式化描述却不容易。比如说,把非正则的语言{aibi |i > 0} 用Monadic Second Order Logic 表示为∃X ( X(min) ∧∀y∀z (S(y,z) => (X(y) <=> !X(z))) ∧ !X(max))。与此类似,编程语言也是一种形式化的语言(最主要的特征:没有二义性,和严格受限的语素)。我们编程时也面临把心中想法转换成一行行程序的问题。至少对我来说,学习理论扩展了我对形式化语言的驾驭能力,让我相对轻松地把复杂的想法转化成精简的数学或算法语言描述。
程序员的效率
Steve McConnell的博客帖子。详述了程序员产率相差10倍的来历。插草标 卖身推荐。引用一段:80年代中期,波音上了一坨重要项目。80枚程序员参与其中。项目不顺利,眼看要错过一坨不容错过的最后期限。为了保证该项目成功,波音调走了这80枚老大,请来一个人。于是这枚老大以一人之力,按时按量交割项目。
Eric在他的blog里也提到他曾犯的类似错误,磨刀不误砍柴功。项目刚开始的时候,无数的书都说了有复杂关系的数据存取用EntityBean不错,但我居然没仔细想过别人为什么那样坚持,也没有深入调查,全忘了古训:事豫则立,不豫则废。
编程高手
目前来看都是不可超越的大山
编程高手 (1) – Bill Joy
Bill Joy, 前任Sun的首席科学家,当年在Berkeley时主持开发了最早版本的BSD。他还是vi和csh的作者。当然,Csh Programming Considered Harmful 是另一个话题乐。据说他想看看自己能不能写个操作系统,就在三天里写了个自己的Unix, 也就是BSD的前身。当然是传说了,但足见他的功力。另一个传说是,1980年初的时候,DARPA让BBN在Berkley Unix里加上BBN开发的TCP/IP代码。但当时还是研究生的B伯伯怒了,拒绝把BBN TCP/IP加入BSD,因为他觉得BBN的TCP/IP写得不好。于是B伯伯出手了,端的是一箭封喉,很快就写出了高性能的伯克利版TCP/IP。当时BBN和DARPA签了巨额合同开发TCP/IP Stack,谁知他们的代码还不如一个研究生的好。于是他们开会。只见当时B伯伯穿个T-shirt出现在会议室(当时穿T-shirt不象现在,还是相当散漫的哈)。只见BBN问:你怎么写出来的?而B伯伯答:简单,你读协议,然后编程就行了。最令偶晕倒的是,B伯伯硕士毕业 后决定到工业界发展,于是就到了当时只有一间办公室的Sun, 然后他就把Sparc设计出 来乐。。。象这种软硬通吃的牛人,想不佩服都不行的说。据Bill Joy的同事说,一般开会的时候B伯伯总是拿一堆杂志漫不经心地读。但往往在关键之处,B伯伯发言,直切要害,提出 漂亮的构想,让同事们彻底崩溃。对了,他还是Java Spec和JINI的主要作者之一。
编程高手 (2) – John Carmack
John Carmack,id Software的founder和Lead Programmer。上个月和一个搞图形的师兄聊天,他竟然不知道John Carmack, 也让偶大大地晕了一把。不过也许搞研究的和搞实战的多少有些隔吧。想必喜欢第一人称射击游戏的都知道J哥哥。90年代初只要能在PC上搞个小动画都能让人惊叹一番的时候,J哥哥就推出了石破天惊的Castle Wolfstein, 然后再接再励,doom, doomII, Quake…每次都把3-D技术推到极致。J哥哥的简历上说自己的专长是”Exhaust 3-D technology”,真是牛人之言不我欺的说。做J哥哥这样的人是很幸福的,因为各大图形卡厂家一有了新产品就要向他“进贡” ,不然如果他的游戏不支持哪种卡,哪种卡基本就会夭折乐。当初MS的Direct3D也得听取 他的意见,修改了不少API。当然,J哥哥在结婚前十数年如一日地每天编程14小时以上, 也是偶们凡人望尘莫及的。对了,J哥哥高中肆业(?),可以说是自学成才。不过呢,谁要用这个例子来为自己学习不好辩护,就大错特错了。那Leonardo Da Vinci还是自学成才呢(人是私生子,不能上学)。普通人和天才还是有区别的。对了,其实偶们叫“达分奇”是相当不对的,因为Vinci是地名,而Da Vinci就是从Vinci来的人的意思。换句话说,Leonardo Da Vinci就是“从Vinci来的Leonardo”的意思。叫别人“Da Vinci”就不知所谓乐。嗯,扯远了,打住。
编程高手 (3) – David Cutler
David Cutler,VMS和Windows NT的首席设计师,去微软前号称硅谷最牛的kernel开发员。当初他和他的手下在微软一周内把一个具备基本功能的bootable kernel写出来,然后说:“who can’t write an OS in a week?”,也是牛气冲天的说。顺便说一句,D爷爷到NT3.5时,管理1500名开发员,自己还兼做设计和编程,不改coder本色啊。
D爷爷天生脾气火爆,和人争论时喜欢双手猛击桌子以壮声势。:-) 日常交谈F-word不离口。他面试秘书时必问:”what do you think of the word ‘fuck’?” ,让无数美女刹羽而归。终于有一天,一个同样火爆的女面对这个问题脱口而出:”That’s my favorite word”。于是她被录取乐,为D爷爷工作到NT3.5发布。
编程高手 (4) – Donald E. Knuth
Don Knuth。高爷爷其实用不着偶多说。学编程的不知道他就好像学物理的不知道牛顿,学数学的不知道欧拉,学音乐的不知道莫扎特,学Delphi的不知到Anders Hejlsberg,或者学Linux不知道Linus Torvalds一样,不可原谅啊。:-)为了让文章完整,就再罗唆几句吧。高爷爷本科时就开始给行行色色的公司写各种稀奇古怪的编译器挣外快了。他卖给别人时收一两千美元,那些公司拿了code,加工一下卖出去就是上万上十万。不过也没见高爷爷不爽过,学者本色的说。想想那可是60年代初啊,高爷爷写编译器写多了,顺带就搞出了个Attribute Grammar和LR(k),大大地造福后人啊。至于高爷爷在CalTech的编程比赛(有Alan Kay得众多高高手参加)总是第一,写的Tex到86年就code freeze,还附带2^n美分奖励等等都是耳熟能详的,偶就不饶舌乐。
顺便说一下,高老大爷是无可争议的写作高手。他给Concrete Mathematics写的前言可谓字字铿锵,堪为前言的典范。他的技术文章也是一绝,文风细致,解释精当,而且没有学究气,不失轻快跳脱。记得几年前读Concrete Mathematics,时不时开怀大笑,让老妈极其郁闷,觉得我nerdy到家,不可救药。其实呢,子非鱼,安知鱼之乐,更不知那完全是高爷爷的功劳。说到写作高手,不能不提Stephen A. Cook。他的文章当年就被我们的写作老师极力推荐,号称典雅文风的样本。库爷爷一头银发,身材颀长,总是面带谦和的微笑,颇有仙风道骨,正好和他的仙文相配的说。
高爷爷其实还是开源运动的先驱。虽然他没有象Richard Stallman那样八方奔走,但他捐献了好多作品,都可以在网上看到,比如著名的Mathematical Writing,MMIXWare,The Tex Book等,更不用说足以让他流芳百世的Tex乐。
编程高手 (5) – Ken Thompson
Ken Thompson,C语言前身B语言的作者,Unix的发明人之一(另一个是Dennis M. Riche老大,被尊为DMR),Belle(一个厉害的国际象棋程序)的作者之一, 操作系统Plan 9的主要作者(另一个是大牛人Rob Pike, 前不久被google挖走了)。Ken爷爷也算是计算机历史上开天辟地的人物了。1969年还是计算机史前时代,普通人都认为只有大型机才能运行通用的操作系统,小型机只有高山仰止的份儿。至于用高级语言来写操作系统,更是笑谈。Ken爷爷自然不是池中物,于是他和DMR怒了,在1969年到1970间用汇编在PDP-7上写出了UNIX的第一个版本。他们并不知道,一场轰轰烈烈的UNIX传奇由此拉开了序幕。Ken爷爷在1971年又把Unix用C重写,于是C在随后20年成就了不知多少豪杰的梦想和光荣。
Ken爷爷还有段佳话: 装了UNIX的PDP-11最早被安装在Bell Lab里供大家日常使用。很快大家就发现Ken爷爷总能进入他们的帐户,获得最高权限。Bell Lab里的科学家都心比天高,当然被搞得郁闷无比。于是有高手怒了,跳出来分析了UNIX代码,找到后门,修改代码,然后重新编译了整个UNIX。就在大家都以为“这个世界清净了”的时候,他们发现Ken爷爷还是轻而易举地拿到他们的帐户权限,百思不解后,只好继续郁闷。谁知道这一郁闷,就郁闷了14年,直到Ken爷爷道出个中缘由。原来,代码里的确有后门,但后门不在Unix代码里,而在编译Unix代码的C编译器里。每次C编译器编译UNIX的代码,就自动生成后门代码。而整个Bell Lab的人,都是用Ken爷爷的C编译器。
编程高手 (6) – Rob Pike
Rob Pike, AT&T Bell Lab前Member of Technical Staff ,现在google研究操作系统。罗伯伯是Unix的先驱,是贝尔实验室最早和Ken Thompson以及Dennis M. Ritche开发Unix的猛人,UTF-8的设计人。他还在美国名嘴David Letterman的晚间节目上露了一小脸,一脸憨厚地帮一胖子吹牛搞怪。让偶佩服不已的是,罗伯伯还是1980年奥运会射箭的银牌得主。他也是个颇为厉害的业余天文学家,设计的珈玛射线望远镜差点被NASA用在航天飞机上。他还是两本经典,The Unix Programming Environment 和 The Practice of Programming 的作者之一。如果初学者想在编程方面精益求精,实在该好好读读这两本书。它们都有中文版的说。罗伯伯还写出了Unix下第一个基于位图的窗口系统,并且是著名的blit 终端的作者。当然了,罗伯伯还是号称锐意革新的操作系统,Plan9,的主要作者。可惜的是,Plan9并没有引起多少人的注意。罗伯伯一怒之下,写出了振聋发聩的雄文 Systems Software Research is Irrelevant,痛斥当下系统开发不思进取,固步自封的弊病。虽然这篇文章是罗伯伯含忿出手,颇有偏激之词,但确实道出了系统开发的无奈:开发周期越来越长,代价越来越大,用户被统一到少数几个系统上,结果越来越多的活动是测量和修补,而真正的革新越来越少。
就在罗伯伯郁闷之极的时候,google登门求贤来乐。如果说现在还有一家大众公司在不遗余力地把系统开发推向极致的话,也就是google乐。随便看看google的成果就知道了。具有超强容错和负载平衡能力的分布式文件系统GFS (现在能够用100,000台廉价PC搭起一个巨型分布系统,并且高效便宜地进行管理的系统也不多哈),大规模机器学习系统(拼写检查,广告匹配,拼音搜寻。。。哪个都很牛的说),更不用说处理海量并行计算的各式google服务了。Rob在System Software Research is Irrelevant里萧瑟地说现在没有人再关心系统研究的前沿成果了。想不到他错了,因为google关心。google网络了大批功成名就的牛人,还有大量初生牛犊般博士做开发,显然不是没事耍酷,而是因为它们的开发总是试图吸取系统研究的最新成果。想必Rob Pike在google很幸福。愿他做出更棒的系统。
编程高手 (7) – Dennis M. Ritchie
既然Ken Thompson是我的偶像,新闻组上人称DMR的Dennis M. Ritchie自然也是,毕竟两人共同缔造了UNIX,而Dennis几乎独力把C搞大(当然,C的前身是B,而B是Ken Thompson一手做出来的)。J 两人1983年分享图灵奖,是有史以来少数几个因工程项目得奖的工程师(本来是唯一的一对儿,但Alan Kay才因为SmallTalk得奖,所以就成了唯二的乐) 。一个人一生能做出一个卓越的系统已经不易,DMR的C和UNIX长盛不衰近30年,至今生机勃勃,DMR此生可以无憾的说。
编程高手 (8) – Edsger Wybe Dijkstra
戴爷爷大概因为最短路径算法一战成名,于是有人请他参加另一台计算机X1的设计工作,并且把设计实时中断系统的任务派给了他。现在看来实时中断也许不算什么,但要知到,X1前根本就没有实时中断的概念。实现它简直就是一场豪赌。戴爷爷起初还不情愿,但经不住项目负责人Bram和Carel的轮番“吹捧”:我们知道实时中断让您工作变得非常困难,但象您这样的牛人肯定能做出来的说。结果戴爷爷被糖衣炮弹彻底击穿,接下了这个烫手山芋。两三年后,他不仅搞出了实时中断,还围绕这个写出了自己的博士论文,顺利戴上博士帽。
心目中的编程高手 (9) – Anders Hejlsberg
Anders Hejlsberg,微软.NET的首席架构师,编程语言设计和实现的顶尖高手。他一手做出了Turbo Pascal, 也是Delphi, J++(尤其是WFC),C#, 和.NET的主要作者。这些作品的名字足以为他立传。作为一个程序员,我在这样的大师面前实在无语。生子当如Anders的说。李维的<Borland传奇>里已详细讲述了Anders的传奇故事,我就不用费舌了:<Borland传奇> 。 Artima上有Anders谈C#的系列访谈 。MSDN上有一段Anders导游的录像 。有兴趣可以去看看牛人的丰采。