一个好的程序员至少应该具备哪些条件?
1、扎实的基础
数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。
2、丰富的想像力
不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。开阔的思维对程序员来说很重要。
3、最简单的是最好的
这也许是所有科学都遵循的一条准则,复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
4、不钻牛角尖
当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5、对答案的渴求
人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
6、多与别人交流
三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
7、良好的编程风格
注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。
8、韧性和毅力
这也许是“高手”和一般程序员最大的区别。高手们并不是天才,他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。
程序员是一种技术工作.在IT的发展中有相当重要的地位.从底层硬件通讯协议的建立. 到数据传输层的处理.到操作系统的建设.到数据库平台的建设.一直到应用层上各种数 据营销平台的搭建.程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大 的贡献.
中国有很多精于编码的人.但是中国软件行业.尤其是网络应用开发方面误区很大.很难形成有规模的软件开发力量和产品能力.不但比美国差距甚远.和印度相比也是颇有不 如.这些问题不是在于中国程序员的智商和工作努力状况.也不是在于国家和民间对开发 的投入程度.而是很大程度上.有一些对技术.对程序开发.对项目设计方面的思想误 区.这些误区.导致了软件行业的产品化能力不足.缺乏规模化和大型复用系统研发能 力.可以说.改变认识误区.是解决软件行业小作坊模式和个体英雄模式所带来的局限性 的重要工作.
中国有很多小朋友.他们18.9岁或21.2岁.通过自学也写了不少代码.他们有的代码写的很漂亮.一些技术细节相当出众.也很有钻研精神.但是他们被一些错误的认识和观点左右.缺乏对系统.对程序的整体理解能力.这些人.一个网上的朋友说得很好.他们实际 上只是一些Coding fans.压根没有资格称为程序员.但是据我所知.不少小网络公司的 CTO就是这样的coding fans.拿着吓人的工资.做着吓人的项目.项目的结局通常也很吓人.
一.程序员基本素质
作一个真正合格的程序员.或者说就是可以真正合格完成一些代码工作的程序员.应该具有的素质.
1:团队精神和协作能力
把它作为基本素质.并不是不重要.恰恰相反.这是程序员应该具备的最基本的.也是最 重要的安身立命之本.把高水平程序员说成独行侠的都是在呓语.任何个人的力量都是有 限的.即便如linus这样的天才.也需要通过组成强大的团队来创造奇迹.那些遍布全球 的为linux写核心的高手们.没有协作精神是不可想象的.独行侠可以作一些赚钱的小软 件发点小财.但是一旦进入一些大系统的研发团队.进入商业化和产品化的开发任务.缺 乏这种素质的人就完全不合格了.
2:文档习惯
说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子.良好的文档是正规研发流程中 非常重要的环节.作为代码程序员.30%的工作时间写技术文档是很正常的.而作为高级 程序员和系统分析员.这个比例还要高很多.
缺乏文档.一个软件系统就缺乏生命力.在未来的查错.升级以及模块的复用时就都会遇 到极大的麻烦.
3:规范化.标准化的代码编写习惯
作为一些外国知名软件公司的规矩.代码的变量命名.代码内注释格式.甚至嵌套中行缩 进的长度和函数间的空行数字都有明确规定.良好的编写习惯.不但有助于代码的移植和 纠错.也有助于不同技术人员之间的协作.
有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂.这种叫嚣只能证明他们自 己压根不配自称程序员.代码具有良好的可读性.是程序员基本的素质需求.
再看看整个linux的搭建.没有规范化和标准化的代码习惯.全球的研发协作是绝对不可 想象的.
4:需求理解能力
程序员需要理解一个模块的需求.很多小朋友写程序往往只关注一个功能需求.他们把性 能指标全部归结到硬件.操作系统和开发环境上.而忽视了本身代码的性能考虑.有人曾 经放言说写一个广告交换程序很简单.这种人从来不知道在百万甚至千万数量级的访问情 况下的性能指标是如何实现的.对于这样的程序员.你给他深蓝那套系统.他也做不出太 极链的并访能力.性能需求指标中.稳定性.并访支撑能力以及安全性都很重要.作为程 序员需要评估该模块在系统运营中所处的环境.将要受到的负荷压力以及各种潜在的危险 和恶意攻击的可能性.就这一点.一个成熟的程序员至少需要2到3年的项目研发和跟踪经 验才有可能有心得.
5:复用性.模块化思维能力
经常可以听到一些程序员有这样的抱怨.写了几年程序.变成了熟练工.每天都是重复写 一些没有任何新意的代码.这其实是中国软件人才最大浪费的地方.一些重复性工作变成 了熟练程序员的主要工作.而这些.其实是完全可以避免的.
复用性设计.模块化思维就是要程序员在完成任何一个功能模块或函数的时候.要多想一 些.不要局限在完成当前任务的简单思路上.想想看该模块是否可以脱离这个系统存在. 是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用.这样就能极大避 免重复性的开发工作.如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到 这些问题.那么程序员就不会在重复性的工作中耽误太多时间.就会有更多时间和精力投 入到创新的代码工作中去.
一些好的程序模块代码.即便是70年代写成的.拿到现在放到一些系统里面作为功能模块 都能适合的很好.而现在我看到的是.很多小公司软件一升级或改进就动辄全部代码重 写.大部分重复性工作无谓的浪费了时间和精力.
6:测试习惯
作为一些商业化正规化的开发而言.专职的测试工程师是不可少的.但是并不是说有了专 职的测试工程师程序员就可以不进行自测,软件研发作为一项工程而言.一个很重要的特 点就是问题发现的越早.解决的代价就越低.程序员在每段代码.每个子模块完成后进行 认真的测试.就可以尽量将一些潜在的问题最早的发现和解决.这样对整体系统建设的效 率和可靠性就有了最大的保证.
测试工作实际上需要考虑两方面.一方面是正常调用的测试.也就是看程序是否能在正常 调用下完成基本功能.这是最基本的测试职责.可惜在很多公司这成了唯一的测试任务. 实际上还差的远那,第二方面就是异常调用的测试.比如高压力负荷下的稳定性测试.用 户潜在的异常输入情况下的测试.整体系统局部故障情况下该模块受影响状况的测试.频 发的异常请求阻塞资源时的模块稳定测试等等.当然并不是程序员要对自己的每段代码都 需要进行这种完整测试.但是程序员必须清醒认识自己的代码任务在整体项目中的地位和 各种性能需求.有针对性的进行相关测试并尽早发现和解决问题.当然这需要上面提到的 需求理解能力.
7:学习和总结的能力
程序员是人才很容易被淘汰.很容易落伍的职业.因为一种技术可能仅仅在三两年内具有 领先性.程序员如果想安身立命.就必须不断跟进新的技术.学习新的技能.
善于学习.对于任何职业而言.都是前进所必需的动力.对于程序员.这种要求就更加高 了.
但是学习也要找对目标.一些小coding fans们.他们也津津乐道于他们的学习能力.一 会学会了asp.一会儿学会了php.一会儿学会了jsp.他们把这个作为炫耀的资本.盲目 的追逐一些肤浅的.表面的东西和名词.做网络程序不懂通讯传输协议.做应用程序不懂 中断向量处理.这样的技术人员.不管掌握了多少所谓的新语言.永远不会有质的提 高.
善于总结.也是学习能力的一种体现.每次完成一个研发任务.完成一段代码.都应当有 目的的跟踪该程序的应用状况和用户反馈.随时总结.找到自己的不足.这样逐步提高. 一个程序员才可能成长起来.
一个不具备成长性的程序员.即便眼前看是个高手.建议也不要选用.因为他落伍的时候 马上就到了.
具备以上全部素质的人.应当说是够格的程序员了.请注意以上的各种素质都不是由IQ决 定的.也不是大学某些课本里可以学习到的.需要的仅仅是程序员对自己工作的认识.是一种意识上的问题.
MIT BBS上说微软电话面试的一道题就是“Who do you think is the best coder,
and why?”。我觉得挺有意思的,也来凑个热闹。排名不分先后。
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
的主要作者之一。
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”就不知所谓乐。嗯,扯远了,打住。
David Cutler,VMS和Windows NT的首席设计师,去微软前号称硅谷最牛的kernel开发
员。当初他和他的手下在微软一周内把一个具备基本功能的bootable kernel写出来,然
后说:“who can't write an OS in a week?",也是牛气冲天的说。顺便说一句,D爷
爷到NT3.5时,管理1500名开发员,自己还兼做设计和编程,不改coder本色啊。
D爷爷天生脾气火爆,和人争论时喜欢双手猛击桌子以壮声势。 日常交谈fuck不离口。
他面试秘书时必问:"what do you think of the word 'fuck'?" ,让无数美女刹羽而
归。终于有一天,一个同样火爆的女面对这个问题脱口而出:"That's my favorite
word"。于是她被录取乐,为D爷爷工作到NT3.5发布。
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 Mathemathics,时不时开怀大笑,让
老妈极其郁闷,觉得我nerdy到家,不可救药。其实呢,子非鱼,安知鱼之乐,更不知那
完全是高爷爷的功劳。说到写作高手,不能不提Stephen A. Cook。他的文章当年就被我
们的写作老师极力推荐,号称典雅文风的样本。库爷爷一头银发,身材颀长,总是面带
谦和的微笑,颇有仙风道骨,正好和他的仙文相配的说。
高爷爷其实还是开源运动的先驱。虽然他没有象Richard Stallman那样八方奔走,但他
捐献了好多作品,都可以在网上看到,比如著名的Mathematical Writing,MMIXWare,
The Tex Book等,更不用说足以让他流芳百世的Tex乐。
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, 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很幸福。愿他做出更棒的系统。
Dennis M. Ritchie, 既然Ken Thompson是我的偶像,新闻组上人称DMR的Dennis M.
Ritchie自然也是,毕竟两人共同缔造了UNIX,而Dennis几乎独力把C搞大(当然,C的前
身是B,而B是Ken Thompson一手做出来的)。两人1983年分享图灵奖,是有史以来少数几
个因工程项目得奖的工程师(本来是唯一的一对儿,但Alan Kay才因为SmallTalk得奖,
所以就成了唯二的乐) 一个人一生能做出一个卓越的系统已经不易,DMR的C和UNIX长盛
不衰近30年,至今生机勃勃,DMR此生可以无憾的说。
D爷爷也算有家学渊源:他老爸在AT&T贝尔实验室工作了一辈子,并在电路设计方面卓有
成就,还出了本颇有影响的书The Design of Switching Circuits,据说在交换理论和
逻辑设计方面有独到的论述。当然,D爷爷和他老爸是不同时代的人:他老爸的研究成
形于晶体管发明之前,而D爷爷的工作离了晶体管就玩儿不转乐。:-D
不要看D爷爷搞出了C,其实他最爱的编程语言是Alef,在Plan9上运行,支持并行编程。
Alef的语法和C相似,但数据类型和执行方式都和C大大不同。说到语言,D爷爷对后来
人有非常中肯的建议:抱着学习的目的来开发你自己的语言,不要冀望于它被众人接
受。这个建议不光对语言开发有用,也适用于其它大型系统的开发。别的不说,DMR后来
领导自己的团队在1995年和1996分别推出了Plan9和Inferno操作系统,又用多少人知道
呢?其实,D爷爷当初也没想过C会风行世界。他开发C的初衷和Eric S. Raymond
在Cathedral and Bazaar里阐述的一样,就是要消除自己对现有工具的不爽之处。谁
知D爷爷无心插柳,C竟然受到众多程序员的狂热拥戴,连D爷爷自己都大惑不解。在一次
采访中D爷爷说大概那是因为C的抽象程度碰巧既满足了程序员的要求, 又容易实现。当
然C一度是Unix上的通用语言也是原因。但不管怎么说,D爷爷对编程语言出色的审美意
识奠定了C广为流传的基础。
最后八卦一下。D爷爷的业余爱好和NBA大牛Karl Malone一样:开卡车。不过D爷爷更喜
欢开NASCAR,而KM独爱巨无霸。J D爷爷自称心中不供偶像,如果一定要说一个,那就
是Ken Thompson了。现在Ken爷爷退休当飞机教练去了,而D爷爷当了贝尔实验室系统开
发部的头,整日忙于开支票。他俩合作20年,屡屡创造历史。这段令人神往的佳话,也
就长留你我心中乐。
P.S., 很多人都以为Brian W. Kernighan是C的作者。其实BWK只是写了那本经典K&R C。
据D爷爷说,他,Ken, 和Kernighan三人中,Kernighan最能写文章,他次之,而Ken写
得最少;但说到编程,Ken爷爷才是当之无愧的老大。
Edsger Wybe Dijkstra, 对,就是E.W. Dijkstra. 一提到EWD,很多人就会想起找最短
路径的Dijkstra Algorithm,就好像一提到Sir. Tony Hoare,就想起Quick Sort一样。
其实这些个算法不过是两个牛人在他们职业生涯中最琐碎的贡献。比如Dijkstra算法,
无非是戴爷爷在1956年为了展示新计算机
ARMAC的计算能力,初试身手的成果,属于他的算法处女作。据戴爷爷自述,他搞出最
短路径算法的时候连纸笔都没用。当时他和他老婆在阿姆斯特丹一家咖啡厅的阳台上晒
太阳喝咖啡,突然就把这个算法想出来乐。而且当时的算法研究还比较原始,牛人们忙
着用计算机搞数值计算,对离散算法不屑一顾。那时连一个象样的专注于离散算法的专
业期刊都没有。戴爷爷于是推迟发表这个算法。直到1959年,他才把这个算法发表
在Numerische Mathematik的创刊号上,权为捧场。:-)
EWD在多个领域牛气冲天,端的是理论和编程两手硬的高手。只不过他的很多工作比较
深刻,学校的老先生们觉得本科生接受不了,不给本科生讲而已。
戴爷爷大概因为最短路径算法一战成名,于是有人请他参加另一台计算机X1的设计工
作,并且把设计实时中断系统的任务派给了他。现在看来实时中断也许不算什么,但要
知到,X1前根本就没有实时中断的概念。实现它简直就是一场豪赌。戴爷爷起初还不情
愿,但经不住项目负责人Bram和Carel的轮番 “吹捧”:我们知道实时中断让您工作变
得非常困难,但象您这样的牛人肯定能做出来的说。结果戴爷爷被糖衣炮弹彻底击穿,
接下了这个烫手山芋。两三年后,他不仅搞出了实时中断,还围绕这个写出了自己的博
士论文,顺利戴上博士帽。
让戴爷爷真正成名立万的还是在X1上开发的Algo60,最早的高级语言之一。戴爷爷没日
没夜地工作了8个月,就搞出了Algo60,也因此获得了 1972年的图灵奖。因为Algo60,
戴爷爷发表了一篇石破天惊的文章:Recursive
Programming,于是人们才知道,原来高级语言也可以高效地实现递归,原来从此以后,
所有程序员都不可避免地和戴爷爷发明的一个词(应该说是概念)打交道:堆栈。
而且Algo60还让戴爷爷深入地思考多道程序设计的问题,最终发明了每个系统程序员
都绕不开的概念:semaphore。当然,戴爷爷总是把他发明的概念严格形式化,极具科
学家本色的说。和这些成就想比,他提出的吃饭的哲学家问题,也就没什么好说的了。
说来好笑,当时的大学(忘了哪所了)还是觉得戴爷爷没有受过正统的数学训练,也不是
专门搞数值分析的,所以最后不太情愿地给了他一个教职。这种小挫折并不能妨碍象戴
爷爷这样的牛人创造历史。他一边教数值分析(:-D) ,一边开始开发一个新的操作系
统,并培养计算机科学家。几年后,THE Multiprogramming
System横空出世。THE是第一个支持松散耦合,显式同步的进程并由此使得严格证明系统
没有死锁变得容易的操作系统。可惜戴爷爷任职的系不识货,还强行解散了他的研究小
组(1972年戴爷爷给他的系主任说他得了图灵奖,系主任的第一反应是你们搞计算机就
喜欢乱发奖)。这让戴爷爷相当郁闷,得了抑郁症。在极度郁闷之中,戴爷爷决定用写作
来治疗自己的抑郁症。于是经典就诞生乐:Notes on Structured Programming。戴爷爷
从此被尊为结构化编程的奠基人,而且他的抑郁症也被治好乐。
EWD太牛,结果他的故事也太多。先到这里吧。1973起,他的故事就在美国发生了。
Anders Hejlsberg,微软.NET的首席架构师,编程语言设计和实现的顶尖高手。他一手
做出了 Turbo Pascal, 也是Delphi, J++(尤其是WFC),C#, 和.NET的主要作者。这些作
品的名字足以为他立传。作为一个程序员,我在这样的大师面前实在无语。生子当
如Anders的说。李维的<>里已详细讲述了Anders的传奇故事,我就不用费舌了:
http: //java.mblogger.cn/iexploiter/posts/1505.aspx
Artima上有Anders谈C#的系列访谈。MSDN上有一段Anders导游的录像 。有兴趣可以去看
看牛人的丰采。
真正的程序员就是天才,因为只有天才才能达到本文这样的水平。 ——引用
那你是不是天才?以上罗列的你能做到几条?做不到?做不到就别在这里放P,误导别人。
一条一条来讲:
* Real Programmers dont write specs -- users should consider themselves lucky to get any programs at all and take what they get.
真正的程序员不循规蹈矩,他们对用户说:拿到你想要的,然后滚蛋,你已经很幸运了!
你去超市买个面包,结果面包很难看,店员和你说:拿到你想要的,然后滚蛋,你已经很幸运了!
请问一下你此时的感想
* Real Programmers dont comment their code. If it was hard to write, it should be hard to understand and even harder to modify.
真正的程序员不写注释。难写的程序天生难以理解、难以修改。
我写一段20000行的代码,不写注释,逻辑很简单,就是把10000个变量来会赋值,你能看一眼就告诉我最后结果是多少的话,那我就承认这条。
Real Programmers dont write application programs; they program right down on the bare metal. Application programming is for feebs who cant do systems programming.
真正的程序员不写应用程序。他们爱白手起家。只有不懂写系统程序的软弱者才写应用程序。
相信看过此篇大论的老板,没有一个会把一个系统去交给这样的程序员去写。
* Real Programmers dont eat quiche. In fact, real programmers dont know how to SPELL quiche. They eat Twinkies, and Szechwan food.
真正的程序员不吃蛋卷。他们根本不屑也不懂拼“quiche(蛋卷)”这个词。 他们吃twinkies和四川菜。 注:twinkies可能是某种用两片面包片夹着的食物。
不知道你觉得这句话和一个真正程序员是否有关?如果你觉得有的话,恕小弟不才,解释一下来。
* Real Programmers dont write in COBOL. COBOL is for wimpy applications programmers.
真正的程序员不用cobol写程序。cobol是让胆小鬼用的。
那请问真正的程序员用什么来写程序?
* Real Programmers programs never work right the first time. But if you throw them on the machine they can be patched into working in "only a few" 30-hour debugging sessions.
真正的程序员总爱留些臭虫。只有将他扔回电脑旁,他才肯低头。他们只需几次就能调试好程序,但每次“只”需要30小时。
可能你的中文学的不是很好,你完全没有能好好的理解“天才”这个词所包含的意思,你不觉得你在自相矛盾嘛?
* Real Programmers dont write in FORTRAN. FORTRAN is for pipe stress freaks and crystallography weenies.
真正的程序员不用fortran写程序。fortran是让科学怪人用的。
还是想请教一下所谓真正程序员用什么来写程序?
* Real Programmers never work 9 to 5. If any real programmers are around at 9 AM, its because they were up all night.
真正的程序员不朝九晚五。如果你在早上见到一个象盲流一样的程序员, 那是因为他整晚工作。
如果说每天朝九晚五,还能写出效率高,无bug的程序,那么我想告诉你,现在是9:33AM,你该醒醒了。
* Real Programmers dont write in BASIC. Actually, no programmers write in BASIC, after the age of 12.
真正的程序员绝不用basic。如果你只有十二岁,你只管用, 你真的只有十二岁?!!
类似的语句目前为止提出了3条,可以作为一个模版来用了。
* Real Programmers dont write in PL/I. PL/I is for programmers who cant decide whether to write in COBOL or FORTRAN.
真正的程序员不用PL/I。如果你竟在用cobol还是用fortran上犹豫, 那你干脆做个彻底的笨蛋算了--用PL/I吧!
既然你说不出的话,就别浪费行数,留给有自己思路的人来写。以下的内容里会屏蔽此类话题。
* Real Programmers dont play tennis, or any other sport that requires you to change clothes. Mountain climbing is OK, and real programmers wear their climbing boots to work in case a mountain should suddenly spring up in the middle of the machine room.
真正的程序员不玩需要换装的运动,比如网球。 登山是最好的了,他们工作时总穿着登山鞋,而且他们觉得会有一座山在机房中央隆起,然后他们就能方便地爬上去。
这段话很有趣,请大家记一下,下文中会出现作者自掘坟墓的场景。
* Real Programmers dont document. Documentation is for simps who cant read the listings or the object deck.
真正的程序员不写文档。文档是让看不懂源程序的笨人准备的,而他们不喜欢笨人。
不知道阁下是否听说过维护这个词,如果说我搞得到XP源代码的话,真希望把里面注释之类的东西全部删掉,然后给你来开发个XXP,当然,按照你的要求是不给你文档的,只进行口述。
* Real Programmers only write specs for languages that might run on future hardware. Noboby trusts them to write specs for anything homo sapiens will ever be able to fit on a single planet.
真正的程序员只为未来机器上用的语言写标准。鬼才会相信有哪个星球会用他们的标准。
我记得标准之类的东西,似乎不是程序员的范畴。
* Real Programmers spend 70\% of their work day fiddling around and then get more done in the other 30\% than a user could get done in a week.
真正的程序员花70%的时间无事生非,然后用剩余的时间完成别人要一个星期才干完的事。
我相信一个合格的程序员就不会去把那么多时间浪费在无事生非上。
* Real Programmers are surprised when the odometers in their cars dont turn from 99999 to 9999A.
真正的程序员很诧异于他们小车上的里程表不会从99999跳到9999A。
其实一个网络游戏发烧友也会把游戏里面的一些术语和道具用到现实中来,只能证明他在这行干了很久,如果连现在处在哪个世界都分不清的话,我很怀疑这个人是否适合做程序员。
* Real Programmers are concerned with the aesthetics of their craft; they will writhe in pain at shabby workmanship in a piece of code.
真正的程序员很关心他们写的代码的艺术性。一小段蹩脚的代码都会让他们寝食不安。
这段话我倒是赞同的,谁都想写出精简,重用性高,可读性强,性能好的代码。
* Real Programmers will defend to the death the virtues of a certain piece of
peripheral equipment, especially their lifeline, the terminal.
真正的程序员会捍卫他们的生命线--网络。
这只能说明他可能是一个超级网虫。
* Real Programmers never use hard copy terminals, they never use terminals that run at less than 9600 baud, they never use a terminal at less than its maximum practical speed.
真正的程序员从不用慢modem。他们不用低于9600bps的modem,事实上, 他们不用任何低于极限速度的modem。
同上
* Real Programmers think they know the answers to your problems, and will happily tell them to you rather than answer your questions.
真正的程序员知道你所遇到的问题,他们不会等你发问。
我不知道你所谓的真正的程序员是否那么空,没是去看着别人的屏幕,帮人家找错。
* Real Programmers wear hiking boots only when its much too cold to wear sandals. When its only too cold, they wear socks with their sandals.
真正的程序员爱穿凉鞋,就算天气变冷,他们也只是再穿上袜子而已。 只有寒风彻骨时,他们才会换上跑鞋。
不知道是否有人记得刚才让大家记住的那段话,一会儿说喜欢穿登山鞋,一会儿说爱穿凉鞋,第2次自相矛盾了。
* Real Programmers dont think that they should get paid at all for their work, but they know that theyre worth every penny that they do make.
真正的程序员并不奢求取得每一分该得的钱,但任何拿到手的钱都问心无愧。
在国外可能会有这种现象,但是国内么,大家摸摸良心就知道了。
* Real Programmers log in first thing in the morning, last thing before they go to sleep, and stay logged in for lots of time in between.
真正的程序员每天只需记录起床后的第一件事和睡觉前的最后一件事, 之间的一切照套模板即可。
那只能说明他是个枯燥无趣的程序员。
* Real programmers dont draw flowcharts. Flowcharts are after all, the illerates form of documentation.
真正的程序员不画流程图。流程图是文盲写的文档。
这个问题上面讨论过了,不再浪费唇舌了。
* Real Programmers dont read manuals. Reliance on a reference is the hallmark of a novice and a coward.
真正的程序员不看使用指南。只有初学者和胆小鬼会百分百相信手册。
如果这本使用指南是你写的,那你可以不必去看,如果不是,那请你吹牛前打打草稿。
* Real Programmers dont write in FORTRAN. FORTRAN is for wimpy engineers who wear white socks. The get excited over finite state analysis and nuclear reactor simulations.
真正的程序员不写fortran程序。fortran是让畏缩的白领工程师用的。 那些人只钟情于有限的状态分析和核反应堆模拟。
不知道发贴的那位是否现在在模拟核反应堆?在研究的话还这么空来发个贴子???
* Real Programmers scorn floating point arithmetic. The decimal point was invented for pansy bedwetters who are unable to think big.
真正的程序员鄙视浮点运算。十进制是为蠢人而发明的。
请问1+1=?答不出来?连蠢人都不如。
* Real Programmers dont like the team programming concept. Unless, of course, they are the Chief Programmer.
真正的程序员不爱与人合作,除非自已是主程序员。
没合作,没交流,你让他去踢足球,一个人对11个人。不行?哦,你也知道不行啊?
* Real Programmers have no use for managers. Managers are sometimes a necessary evil. Managers are good for dealing with personnel bozos, bean counters, senior planners and other mental defectives.
真正的程序员对经理来说一无用处。但经理却是不可或缺的魔鬼。经理能摆平那些有心智缺陷的人,比如那些资深的策划者(他们很爱“教导”程序员们)。
该公司就4个人:经理,资深策划者,“真正的程序员”,程序员
* Real programmers ignore schedules.
真正的程序员不按日程表办事。
如果他去旅游,估计会因非法滞留被遣送回国。
* Real Programmers dont bring brown bag lunches to work. If the vending machine sells it, they eat it. If the vending machine doesnt sell it, they dont eat it.
真正的程序员不带午餐上班。有得吃就吃,没得吃就饿着。
是程序员都这样,大概除了你吧。
* Real Programmers think better when playing Adventure or Rogue.
真正的程序员在冒险和滋事时脑子最聪明。
平时就是块废铁?那叫真正的程序员?
* Real Programmers use C since its the easiest language to spell.
真正的程序员用C,因为C是最容易拼的语言,只有一个字母。
额。。不知道怎么说你。。。“C是最容易拼的语言,只有一个字母。”这能作为理由?
* Real Programmers dont use symbolic debuggers, who needs symbols.
真正的程序员不用符号化的调试器,因为它竟需要符号。
这句话不太理解,不做评论。
* Real Programmers only curse at inanimate objects.
真正的程序员只诅咒死气沉沉的东西。
看完这张贴子,我反而觉得所谓的“真正的程序员”死气沉沉。
世上本无好坏,楼上在胡说。
真有上面的程序员老板早就炒了他了。
程序员本身的水平可以不用很高,但是一定要有团队合作的精神。
我没有骂你,只不过作为程序员我实在看不下去了。什么3年前后都不能当程序员的鬼话,相信也没有人听。拿些洋文证明自己说的是对的?告诉你真正的程序员从来不会关注这些屁话的,这个“真正的程序员”我们早就看过了,只不过是老外拿来戏谑程序员的话,你还当宝献出来,脸红啊~~~~~~~~~~,顺便说一句我作程序员6年了,还在继续做。
只要有毅力和学习能力就够了
楼上怎么不去死呢,你知道什么是编程,你知道编程的真正意义吗,纯粹胡扯
一个优秀的程序员需要养成哪些良好的习惯
使用什么样的工具本来无所谓,只要你能更好更快地达到你的目的。但是有一点是优秀程序员都应该了解的——那就是应该去尝试一下别的工作环境。没有比较,你永远不知道谁好谁不好,你也永远不知道你所不知道的。使用版本管理工具管理你的代码 千万不要告诉我你不知道源码的版本管理,如果你的团队开发的源...
如何做好一名程序员
3,团队精神和协作能力 :我个人认为团队精神和协作能力对于个人和所在团体都是相当重要的。团队精神和协作能力是作为一个程序员应具备的最基本的素质。虽然海南师范大学开设软件工程专业仅有三年的时间,但软件工程在全国来说已经提了将近三十年了,当今的软件开发已经不是编程了,而是工程。独行侠可以写...
...我想要知道我现在有能力来学习它吗,至少要具备哪些条件
在这里大家显然可以看到数学和数据结构对于一个优秀程序员是多么重要,它们是和一般的程序员打开档次的最关键的地方。这样向"枣子"碰到的那种情况应该很轻松的就可以想到。 如果你是一位想学习编程的朋友,我经过多年的学习总结出来了一个学习的线路希望对你有所帮助。要学习编程是要有很大恒心和毅力的,首先你要明确...
做程序员需要什么学历
程序员因为是从事程序开发、程序维护的专业人员,所以通常需要大专学历及以上的学历。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚。软件从业人员分为初级程序员、中级程序员、高级程序员(现为软件设计师)、系统分析员,系统架构师,测试工程师六大类。
程序员需要学些什么?
在这里要明确一点,程序员不仅仅要注意到软件的功能需求,还应注意软件的性能需求。 要能正确评估自己的模块对整个项目中的影响及潜在的威胁,如果有着两到三年项目经验的熟练程序员对这一点没有体会的话,只能说明他或许是认真工作过,但是没有用心工作。 7、模块化思维能力 作为一个优秀的程序员,他的思想不能局限在...
如何自学成为程序员?
问题三:程序员能自学吗? 首要之首:不要急于选择一种语言 新手们有一个常见的错误就是犹豫于判断哪种编程语言是做好的、最该先学的。 我们有很多的选择,但你不能说那种语言“最好”。 我们应该理解:说到底,什么语言并不重要。 重要的是理解数据结构、控制逻辑和设计模式。 任何一种语言―甚至一种简单的脚本语...
要成为一个优秀的程序员,是不是需要高智商及良好数学
程序员的要求无论如何,作为程序员,以下几个内容必须掌握C语言,数据结构,算法,编译原理(不强求,至少知道词法分析和语法分析),OS的一些基本原理(进程调度,内存调度等等),计算机体系结构,软件工程其他的要求至少英语四级(不然MSDN没法看),写过程序,数学不要太差如果你掌握了这些内容,说明你至少...
一个高级java工程师需要具备什么能力和技术
这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?多线程同步、锁这块也是重点。 要想成为一个好的程序员就不要怕学习,有学历能力需要新技术才能跟得上技术发展的速度,会学习的人永远不会被淘汰。 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ...
java程序员掌握哪些技术好找工作?
二、java程序员掌握哪些技术好找工作?Java程序员在当下工资的确是高,各行各业都需要java程序员,但是企业需求的是具备合格专业技术的java程序员。一个java程序员想要获得好工作,就必须对语法很熟悉,熟悉JDK带的一些常用命令及其常用选项比如javac、javadoc、javap、javaw等等,还得必须至少熟练使用一种IDE...
从零开始成为一个程序员,你真的准备好了吗
) 10、我告诉你,程序就是:任何有目的的、预想好的动作序列,它是一种软件。11、编程序就是编写程序。12、你想好了吗?(如果你想好了还是决定要当程序员,可以继续往下读;否则,你可以继续寻找别的出路了。)(三) 一个程序员应该具备的基础知识和概念1、计算机是有什么组成的,CPU是什么东西,其工作原理是什么。(...
慎战舒林: 你好,小U来为您解答这个问题,众所周知,程序员是从事程序开发、维护的专业人员.作一个真正合格的程序员,需要具备:1:团队精神和协作能力 团队精神和协作能力是作为一个程序员应具备的最基本的素质.2:文档习惯 文档是一个软...
扎鲁特旗19153348184: 做个程序员应该具备哪些基本条件 - ?
慎战舒林: 我现在就是个程序员,以我的新身经历告诉你,如果你只是学过一门语言是远远不够的,必竟现在用C作开发的并不多,但是用C写程序挣的的确不少,一般都是大公司会用到C,所以你的学历也相对要高,至少是研究生.目前软件行业用的最多的还是Java和.NET,你可以在有C语言的基础上精通这两种中的一种,我希望你精一门,而不是什么都会,又什么都不强.这是最要命的,还有就是熟练一门数据库,比如Oracle和SQLServer,多从网上接一些小项目,这对你以后找工作有很大的帮助.总之,做程序员这行业挺辛苦的,你要做好心理准备,加班是常事,而且要随时保持学习,否则必然被淘汰.加油
扎鲁特旗19153348184: 程序员要具备那些? - ?
慎战舒林: 工程质量是检验优秀程序员的唯一标准,一般的程序员的思维需要有一个明确的目标(功能),逻辑上行得通的就能实现,很少去考虑为什么要这么做?这样的产品也只是基本满足,但是大多数程序来说,就这个基本满足就已经是加班加点的去...
扎鲁特旗19153348184: “高级”程序员应具备哪些素质 - ?
慎战舒林: 作一个真正合格的程序员,应该具有的素质.1:团队精神和协作能力团队精神和写作能力是作为一个程序员应具备的最基本的素质.软件工程已经提了将近三十年了,当今的软件开发已经不是编程了,而是工程.独行侠可以写一...
扎鲁特旗19153348184: 一个程序员需要哪些素质 - ?
慎战舒林: 心里素质最总要 要耐下心 其次身体素质 要能坚持编程 现在天天坐在电脑前几个小时编程 身体累死了 !!!至于编程习惯 一定要好好培养 平常编程的时候 注意语句的前后对应 注意格式!!
扎鲁特旗19153348184: 作为一名优秀的程序员,要具备哪些基本功 - ?
慎战舒林: 学习程式设计不必苛求一定要从某一种语言入手,可以选择自己比较容易接受的一种进行学习.从中主要学习的是编程本身的思想,学习的是用程式设计的眼光来看待问题.或许,学习的效果不能马上看到,但是可以学到扎实的基本功,而这对...
扎鲁特旗19153348184: 一个好的程序员应该具备什么? - ?
慎战舒林: 给你一些建议: 1、不要玩游戏,至少不要玩网络游戏.(我认识专业比较好的大学朋友中没有一个玩游戏的) 2、不要用分数衡量自己专业能力.(多去写程序,多去看代码肯定是对的) 3、培养学习的能力.(老师带领下学会一个东西很容...
扎鲁特旗19153348184: 做一个成功的程序员应当具备哪些条件? - ?
慎战舒林: 1、扎实的基础数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序.程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论....
扎鲁特旗19153348184: 做一个程序员要准备哪些具体的要素 - ?
慎战舒林: 我是一个C#程序员……程序员的世界是成就的世界!~追求的成就感!所以顽强的战斗力是必须的…… 所以我个人认为要想能成为一个优秀的程序员: 1、需要的最基本的条件是不烦不燥的耐心和一颗平常心态! 2、知识的进阶在于经验的积累!同时虚心接受别人的意见…… 3、有着对于事物永不放弃的恒心和自信心、遇到困难在所难免的. 一个程序员并不代表了代码的书写能力,更体现了项目开发的系统架构能力,如果没有好的架构思想,在强的程序也没有质的超越,上面只是我工作以后的一点点浅薄认识……
扎鲁特旗19153348184: 一个优秀的程序员需要具备哪些技能 - ?
慎战舒林: 1、超凡的学习能力.在软件技术领域,技术的更新日新月异,所以作为程序员必须学习不断涌现的技术,掌握尽可能多的技能.优秀的开发人员是渴望学习的人.善于学习的人才能在这一领域立于不败之地.也是程序员必备的条件之一. 2、...