第一篇:一名平庸程序员的自白
一名平庸程序员的自白
来源:王昱(2010-5-15 16:30:49)
作者:阿兰·诺顿(Alan Norton)
翻译:Purple Endurer
导读:阿兰·诺顿揭示了他作为一名平庸程序员的生存之道:如何让自己一般般的编程技能发挥出最佳效果。
我一直以编写代码为乐,起因并不是我精于此道,而要部分归因于它是一大挑战。我发现没有什么比指挥个人电脑在显示器上显示“Hello World!”更令人激动的了。而在显示器上显示三个红桃或者黑桃A(Ace)和J(Jack)则是一个完全不同的问题。我毕业后写的第一个程序是用Northstar Basic为NorthStar Horizon编写一个自动售货机程序,后来又为Northstar Advantage编写了基于图形的21点纸牌(Blackjack)游戏程序。
PurpleEndurer注:
1、Northstar Basic:是源自NorthStar Horizon 和 NorthStar Advantage的一种BASIC语言。详见 http://en.wikipedia.org/wiki/NorthStar_BASIC2、NorthStar Horizon:是North Star Computers公司生产、以ZiLOG Z80A为处理器的8位电脑。详见http://en.wikipedia.org/wiki/NorthStar_Horizon
尽管如此陶醉于编程,但我必须坦白地承认:我是一个平庸的程序员,总在寻找一种方法来获得大的回报 - 即程序没有语法错误并能正常运行。这并不奇怪,我从未像一名程序员那样做好本职工作;我发现自己具有成为一名优秀开发人员的天赋。但是,在我们继续往下谈之前,我要给“平庸程序员”下一个定义。
平庸程序员——会使用一些现成工具的程序员。他只知道最简单的命令语法,但懂得在哪能
找到更复杂命令的语法。他不知道如何编写最高效的代码,但懂得在必要时如何重写和测试比较高效的代码。他可以克服重重困难独辟蹊径达到目标,但他把每个困难视为挑战,并自信会找到每一个困难的解决方法。他可能需要较长时间才能完成,但总能达到目标。他不知道如何创建一个DLL,但在必要时可以弄懂。他与大多数程序员一样,并不特别喜欢做工作记录,之所以这样做是因为他是一个专家。
工作决定技能
虽然我很想继续编写游戏,但为了填饱肚子,我只得迁就本地就业市场;公司们有“必需胜任实际工作”这个奇怪的要求是众所周知的。产品、人力资源、会计、库存跟踪和数据报告只是做生意必要的一些东西 - 你知道,很无聊的东西。
当我真正为报酬而编写程序时,我的技能发生了戏剧性地变化。它不需要采用大量先进的编码技术来围着数据团团转,并耍魔术般地变成信息。
我被 休斯飞机(Hughes Aircraft)公司雇用,通过IT服务来为产品控制部门提供支持。我的工作需要开发/分析技能,我热爱我的工作。编程不过是达到目的的手段。
开发人员身兼数职
程序员只是开发人员所扮演的诸多角色中的一个,通常你要身兼以下数职:
购买方(带预算)Buyer(with budget)
清道夫(无预算)Scavenger(no budget)
分析师(Analyst)
设计师(Designer)
规划师(Planner)
程序员(Programmer)
协调员(Coordinator)
测试员(Tester)
文档管理员(Documenter)
技术支持员(Support technician)
当开发人员未被认可为一个或更多角色中的专家时并不太令人奇怪。对我来说,工作职能就是编程。
我的生存之道
尽管我的编程技能不尽如人意,我仍然是一个非常成功的开发人员。这里有一些我多年来学到的诀窍,以及如何我作为一个平庸程序员,发挥出最佳平均编码技能水平的生存之道:
▲ 明确要求——我会预先得到完整、精确的系统要求清单。如果你直接开始编码就意味着你没有针对系统设计的要求来进行。
▲ 分析和设计——我获得了分析和设计权。一名普通程序员获得了分析和设计权,就拥有了一个超越一名伟大的程序员的优势。
▲ 项目计划——坦白来说,我早期职业生涯中没有用过正式的项目计划,一直到我加入了CSC,不得不使用更多的正式文档编制技术,从而开始使用项目计划。由此我充分认识到使用经过慎重考虑后的项目计划也是平庸程序员的一个优势。
▲
考材料。经常翻阅手册、指南——我总是备有手册、指南以供不时之需。我也研究了其它的参
▲ 拷贝-粘贴程序员——我不介意承认自己是一名拷贝-粘贴程序员。多年来,我写了许多可以在新项目中重复使用的代码。因为我至少花时间写了一次代码,所以我对这些代码如何工作略知一二。在工作中我从不拷贝其他人写的代码,并且我从不使用我在其他公司写的代码。黄金规则和版权法都适用于知识产权:您不得复制和使用别人的代码,除非明确允许,或者你可以得到特别的许可。
▲
▲ 毅力——我永不放弃,我一直相信自己能完成任何编程任务。工具——当我需要一台更快的电脑但这又不在预算之列时,我发现了一个经理愿意用他们的一部分预算资金为我购买。你可以通过乞求、借用,或交易来获取所需工具,从而完成自己的任务,要经常向你的经理提出自己的要求;只这些要求是合理的,一个优秀的经理会尽最大努力找到一种方式来获得软件,硬件,手册,或者你所需要的帮助。
▲ 手气好(Serendipity)——也被称为“代码一写就好”策略。有几次我像一个初级程序员那样写了代码,而这些代码运行得很好。我把它比作是国际象棋,你在下棋的过程中突然发现,自己走两步就有将死的机会。这不是编程应有的方法,但由于我在检讨自己的职业中的罪过,我不得不纳入此项。
底线
我要做一个最终坦白:我不喜欢被看作是次等的团队成员。我见识卓越,而幼稚的程序员却真的相信:不能写出“先进”代码的人对团队和公司来说毫无价值。这些精英认为平庸的程序员能力有限,不足以生产高品质的代码,几乎总是犯错,令人不快。有个观念令我感觉既可笑又惊讶:如果你不能________(填空),就不是优秀的程序员。
你不必成为一个出色的程序员或伟大的开发者,特别是正在开发商用系统的时候。没错,我是一个平庸的程序员,其主要原因是我从来不需要成为一个伟大的程序员。
我不是纵容平庸。不论做什么,都要尽力做好——包括编程。“最好”的代码可能难以确定,但越高效的代码可能也越难维护。可以说,任何可以完成工作的代码就是好的代码。代码是像索玛立方体(Soma cube),有240种途径可以解决索玛难题,同样,也有许多代码编写方法可以用来完成任务。底线就是尽可能做好工作——这是任何一个平庸的程序员都可以做到的。(完)
第二篇:如何成为一名程序员
苦逼中的战斗鸡:如何成为一名程序员
下面要说的是我在成为一名程序员的道路上做的几件事情。写在这里除了要让自己铭记在心外,我还希望它能对别人有些用处。1.建立一个博客
这是我后来才认识到的事,其实应该很早就去做。如果你是跟我类似的情况,你应该尽早开通一个博客——尽管还不知道该写什么。注册一个域名,买一个 空间。你会惊奇的发现有很多可写的东西。你可以记录下你成为一名程序员的过程,或写一下你感兴趣的技术方面的东西。我一直以为没什么好写的,可当真正思考 这些问题时,却发现有很多值得写的。最重要的事情是开始去做。2.开发一些东西
开发什么并不重要。选一种编程语言,任何一种都行,开始干。你不必去花大量的时间来决定应该使用什么语言。直接开始学一种语言,事实上最重要的是学习编程语言的基础知识,而不是劳神费力的去选择一种“最好的编程语言”。我选择的是PHP。因为它是一种被广泛使用的语言,在网上有大量的学习范例,我已经通过搭建一个WordPress网站而熟练的掌握了它。没有丝毫的遗憾。它使我学到了很多 基础知识。我还学习了其它语言吗?当然,我后来涉猎了很多脚本语言,我要在下一个项目上试试Ruby。编程语言不断的在变化,不要只盯着一个不放。3.注册你的GitHub帐户
我已经在Bitbucket上有了一个代码库。我最初选择注册Bitbucket是因为它能提供5个免费的私有库。后来我决定在GitHub上注册。事实上,我丝毫没有拖延,看看我的成果吧。4.向开源项目捐赠代码
我早该如此做了。我起初低估了做这种事情的重要性,说老实话,我现在仍需要进一步重视。向开源项目捐赠代码,这是一种很好的学习别人如何编程的方法,并且能把自己的代码公开。我今晚的就要去列一个准备去参与的开源项目的清单。5.热心参与
这也是我需要改进的方面。我应该到stackoverflow网站上去回答更多的问题,在一些博客,科技网站上分享自己的东西。去那些网站,让大家看到你。不在网上露面,就相当于待在屋里不出门却想找一份做巴黎导游的工作。重复做第2,4和5点 其它一些事情
很明显,每一个有志向的程序员都应该每天阅读Hacker News和其它开发/科技/编程类的博客文章。
我打听到了不少的技术讨论会。这周末我准备去参加一个。我会把那里的情况写出来。我在这里并没有提读书。我喜欢阅读,但我们没有买任何的关于web开发的书籍。这是我个人的做法。我相信很多人都会建议首先买一本书看看。
找一些能和你讨论你的web开发/技术/编程想法的人和群体。如果我做了更多的第5项,我可能找到了更多的这样的人。
好了,这就是我要说的。这些就是在过去的一年里我成为一个程序员的成长之路上做到事情。如果有人觉得在这个清单里我还应该加入什么,请给我留言。我永远都希望听到新的观点。
第三篇:如何做好一名程序员
如何做好一名合格的程序员
一、90%的编程工作来自内部软件
(90% of programming jobs are in creating Line of Business software)计算机专业的学生,可能有一种印象,觉得大部分程序员,都在编写公开出售的软件或者通用软件。
这种看法是不对的。大部分程序员,实际上编写的是不公开的企业内部软件,比如追踪费用的软件、优化装运成本的软件、帮助记账的软件、设计新部件的软件、计算保单价格的软件、识别恶意订单的软件等等。
各种各样的商业公司,开发内部软件,解决它们自己的问题。市场上对程序员的大部分需求来源于此,只有极少数程序员直接编写面向外部顾客的软件。内部软件的开发,通常非常乏味,令人厌倦。因为它们的技术复杂性低、技术决策非常保守、预算很少、缺乏长远考虑。但是,世界上大部分编程工作都是这种。
二、别人雇你的目的,是让你创造利润,不是让你编程
(Engineers are hired to create business value, not to program things)商业公司最关心的(或者说唯一在乎的)事情,就是增加收入、降低成本。因此,它们实际上需要的不是程序员,而是能够帮助它们增加收入、降低成本的人。
开发优美的软件,解决技术难题,编写没有 bug 的代码,这些都不是商业公司的目的。它们雇佣你,是为了让你帮它们完成某个可以增加收入、降低成本的项目,而不是因为你是 geek。
你个人对于公司的唯一价值,就在于你能多大程度上为它们增加收入、降低成本。
三、不要自称为程序员
(Don't call yourself a programmer)
很多公司的经理不懂计算机,在他们心目中,“程序员”就是一群高成本的劳动力,只会在一台复杂的机器上干一些难懂的事情。
如果你自称为“程序员”,当公司需要压缩成本的时候,某些经理首先就会想到解雇你。有一家公司叫 Salesforce,口号是“没有软件”,意思就是如果经理们购买了他们的服务,就不再需要别的软件管理销售业务了,也就是说,不再需要自己雇佣程序员了。
正确的做法是,你应该把自己描述成与增加收入、降低成本有关系的人,比如“xx 产品的开发者”或“改进者”。有一个 Google Adsense 程序员的自我介绍,是这样写的:“Google 公司97%的收入,与我的代码有关。”
四、不要限定自己
(You are not defined by your chosen software stack)
年轻学生经常会问,应该选择哪种语言或平台?学会 Java,是不是比学会.NET 容易找工作?
过分强调某一种语言或平台,都是不必要的。如果你把自己限定为 Java 程序员或.NET 程序员,你就已经输了,因为首先你不应该自称为程序员(理由见上一点),其次这种限定使得你自动被排除在世界上大多数编程工作之外。现实生活中,学会一种新语言,只需要几个星期,然后再过半年到一年,你
就会变成老手。那时,根本没人在乎你以前用什么语言。
天才程序员是很少的,可是需要天才程序员的工作机会却很多很多,大多数场合都是需求远远大于供给。这意味着,即使你不是天才程序员,只要你是一个优秀工程师,那些招聘公司也会立刻录用你,因为它们知道招聘到天才程序员的机会微乎其微。(重复一遍,所谓“优秀工程师”,就是你的履历上有一连串增加收入、降低成本的记录。)
某些公司的人事部门,会根据某个关键词(比如 Java 或.NET)过滤简历。虽然这样的公司根本不值得去,但是如果你真的想过这一关,也很容易:投入几个晚上和周末,在你当前的项目中设法用到这个关键词,然后再把它写进简历就行了。
五、如何提高求职时的谈判能力?
(How do I become better at negotiation?)
(1)记住你不是在求职,不是在展示编程技巧,而是在推销某种商业需求(增加收入或降低成本)的解决方案。
(2)面试时,要有自信,要平等的对话。你要的是一个互利的录用合同,不要每次对方提出要求,你都说 Yes。
(3)雇主可能会问“你的上一份工资是多少”,他们其实在说“给我一个理由,压低你的报酬”。你要想好如何适当地回答这个问题。
(4)要还价。这里不仅仅指钱,还指其它你关心的方面。如果你无法要求更高的薪水,那就试着要求更多的假期。
(5)在对方决定录用你以后,才开始讨论薪水。因为那时,他们已经在你身上,投入了大量的时间和金钱,产生了一定的成本,此时他们可能觉得一些小问题已经不值得再纠缠了,比如每年的工资增加几千元。
六、创业公司是否适合应届毕业生?
(Are startups great for your career as a fresh graduate?)
如果你一毕业就加入创业公司,最可能的结果是,接下来几年你都工作得非常辛苦,然后公司悲惨地失败了,你失业了,不得不又去另一家创业公司工作。如果你真的想去创业公司,应该首先找一家大公司干上两年,攒一点钱,积累一些经验,然后精心挑选后再去创业公司。
在创业公司工作,一般情况下,你遇到的都是创业者。他们大多数人没有能力在两年后雇佣你;而在大公司工作,你遇到的都是其他大公司的人,他们中很多人将来有能力雇用你或者帮你介绍工作。
七、在创业公司工作是否值得推荐?
(So would you recommend working at a startup?)
选择创业公司,就是选择一条职业道路,而不是选择一种生活方式。可惜很多人把这两者颠倒了,他们推荐创业公司,实际上是在推荐一种你感兴趣的生活方式。
如果你确实喜欢这种生活方式,老实说,你在大公司里也可以得到它们。在许许多多大公司里,你都有机会钻研最新的技术,而且还能5点半准时回家照顾孩子。
八、沟通技能是最重要的职业技能
(Your most important professional skill is communication)
前面说过,工程师被雇佣,不是因为会编程,而是因为能够创造商业价值。所以,你让人们相信你能创造价值,这是帮助你找到工作的最重要的能力。这种
能力与你真的能创造多少价值,实际上联系不是很紧密。
我认识的一些最优秀的程序员,往往拙于表达。因此,别人不是不想与他们一起工作,就是低估了他们的价值。相反地,如果你看上去很会编程,并且很善于表达,别人就会真的这样看待你
第四篇:码农故事:一位中级程序员的自白(写写帮推荐)
码农故事:一位中级程序员的自白
我是一名中级程序员。
我有相当不错的基本技能。我犯了足够多的错误才明白为什么那些被称为错误。我很清楚我还需要了解更多东西。最重要的是,我知道那些东西大概是什么,并且我正在努力而积极地提升自己。
勇敢地承认自己不过是水平一般的程序员,这花了我一些时间。我不再感觉有必要去抓住那些我并不了解的观点。当人们发现我对某样东西不了解时,我也不再感到害怕。事情并非从来如此。你可能对此不以为然,但是我曾经自诩为编程大师。
这种对自己能力的不正确的评估,很大程度归因于我在一个相对封闭的环境中学习技能。在过去那些日子里,有电脑就已经很特别了;更不用说知道如何使用了。
在我自己看来,我当时是一个知识渊博并且经验丰富的程序员。在我不到20岁的时候我已经用C++、Pascal、C#、JavaScript写过程序。当然我最引以为傲的是,曾经徒手用PHP编了一个电子商务平台。
事实上,我可能只是人们平时谈话中提到的“我有个朋友的儿子很会写网站”。我和别的程序员没有任何交流,所以我仅有的比较对象是我周围的人;要么是一些根本不在意电脑的人,要么是那些会用电脑,但是在IE窗口中塞了5个没用的工具栏的人。那些可能会说“我的网坏了”这种话的人。
接下来这个故事就是讲我如何产生自己很厉害的幻觉的。
天才的起源
当我九岁的时候,我的一个朋友家里有卫星电视。而在我们家里,我们只能收到四个英国的频道(你能想象第五频道出现之前的日子吗?),我热切地盼望有一台普通的电视机。我们所需要的只是那些“卫星盘子”,或者我称为“卫星”的东西——那样我就随时可以看QVC台或者Eurosport台。由于隐约意识到自己的某种天分,我开始搭建自己的卫星!我的设计包括了一把打开的伞和一条铜质音频线,一段接在伞的金属柄上,另一端接在电视机天线上。必须承认我的设计有一些缺陷,并直接导致我没有得到想要的结果。但是这个小故事仅仅想表达我童年和青少年时期对技术的渴望。我认识的人中从没人想过制造“卫星”。几年后,当我父亲的办公室得到一个14.4k的猫时,我成为了最早一批网民一员。我能回忆起花了整个星期六下午的时间等待这个火焰漫画图标被加载,每个帧的动画大概要过一分钟才显示。我甚至用Netscape搭建了我自己的网站。由于不知道互联网的架构,我把所有的HTML文件存放在本地,并且期待有一天他们会出现在互联网上。然而这些细节并没有削弱一个事实:我认识的人中没有一个制作了他们自己的网站。
在我十多岁的时候,我发现了自己天才中的黑暗面。在装备了Jolly Rogers的食谱后,我和一群小伙伴们准备动摇整个九十年代英格兰的技术和道德根基。破解电话系统是我们的专长。我们用手提式声音耦合器和公用电话,给我们在ICQ上认识的美国姑娘们打免费国际电话,以及在私人交换机上设立语音信箱。最终学业和滑板阻止了我们在这条路上越走越
远,如果没有这些干扰,我们无疑已经在制造凝固汽油,黑进政府网站并且徒手杀人了。尽管我们没有把自己的能力发挥到极致,但事实是除了我们没有其他人哪怕拥有声音耦合器。
尽管到那个时候我已经经历了一些冒险和失败,我还是缺少一些东西。我的想法总是要超前我自身能力好几步-正如在“卫星”一节里体现出来的。我需要一种把我脑海中想法表达出来的方式。我需要一个直接的介于我想象和现实之间的接口。
Fuck 生成器
真正的转机出现在我十四岁的时候。我购买了一份PC Plus杂志,其中附赠了带有完整版Borland C++编译器的CD。我安装了,并且认真学习了杂志上的“hello world”教程。
就这样,一个崭新的世界在我面前打开了。物质世界对于我想象力的限制消失了。我的创造力被解放了,我脑海中的大教堂要成为现实了!我该把这个新工具用于怎样崇高的事业呢?很显然,Fuck生成器。
简单而优雅的Fuck生成器是一个命令行程序,也是我即”hello world”之后第一个里程碑。程序开始运行后会提示用户输入一个数字n,然后它会输出字符串”fuck”,n次。最后用户被提示可以重复以上过程或是退出。尽管功能有限,我还是沉醉于我所品尝到的成就。这是任何程序员都能享受到的一种快感,即看着机器执行你的命令,不管这个任务有多简单。它在运行了,并且你知道为什么它能够运行。它除了在那里运行不会做任何别的事。
过了些时日,另一期的PC Plus附赠了一个完整版的Borland Delphi。有了这个,我把程序升级为带有窗口界面并且可以随机生成彩色的4种不同的脏话。当别的孩子在玩PlayStation的时候,我正在投身于一项更有意义和创造性的事业,我在生成很多fuck。
到那时,一切都预示着我是注定要成大事的。我要向世人展示我真正可以做的事情。我的巨著
在90年代晚期,我为一家小型并且扩张迅速的邮件订购零售商创建了一个网站。一开始,这个站点只包含一些静态的页面——关于商品的小册子,一个导航菜单和一个访问数量计数器。
当我们的访问量越来越大时,我们决定加入电子商务功能。我们遍历了一些现成的工具包,它们的质量从差到极差不等。我印象中第一个版本大部分建立在摆弄cgi脚本以及怪异地把
不久后我们意识到,如果我们想要一个真正可用的甚至体面的在线商店,我们需要一个自定义解决方案。我想到了我过去的成功经验:fuck生成器系列,以及截至那时我所编写的优秀网站,这其中:我的 Manic Street Preachers吉他谱收藏网站非常具有权威性。我认为是时候看看我能真正做些什么的时候了。我要自己从头开始干。
从头开始?即使那个时候开源框架已经存在,我也不会知道他们。我有自己的计划。我买了一本关于PHP和MySQL的书,一边学习一边着手搭建新的网站。
幸运的是,这本书把一个非常简单的购物网站作为它的核心例子。所有的部分都在那儿:“category.php”会列出一个目录中的所有物品;“product.php”会显示商品信息以及
把该商品加入购物车的按钮;以及最重要的“cart.php”,它是所有奇迹发生的所在。这就是我想要的东西!
我孜孜不倦地学习这个例子,充满自信地实现所有巧妙的而且毫无疑问也是最新潮的技术-那些方便的“mysql_”函数;用于建立查询的字符串连接函数;把不同的函数放进“functions.php”文件;通过加入“header.php”和“footer.php”来维护整个网站的一致性;为了代码的快速运行而回避了笨重的面向对象的设计方式(管它是什么玩意)。我的技能在飞速成长。
像一个人的王国一样,我建造了高塔和迷宫般的地道。我每添加一个特性,就好像整个结构在向天空伸展同时也向地下蔓延。顾客帐户、商品评价、购买历史、优惠点数、帐单号、特殊优惠、日志、A/B测试、支付信息加密,等等。一个蔓延的迷宫,一整个星系的函数,大的小的,缓缓围绕一个不变的核心:“cart.php”。
经过八个月的激情工作,我终于完成了。
现在,你们这些读者一定在期待我会详述当网站正式运行时发生了怎样恐怖的事情。恐怕我要让你们失望了。
它成功运行了。
最糟的方法
尽管我现在把这当作我最糟的设计,但是这个东西确确实是能够运行。它在每一个糟糕的教程,每一个反php的帖子里都能找到。搅成一团的代码?是的。不一致的数据和方法名称?是的。介绍和业务逻辑混在一起?是的。魔幻数和全局变量?是的。
对我而言,面向对象的设计只是一堆不必要的开销和公式化的代码,并且有很多片面的理论支持我的观点。我知道有关测试的所有,点击一些你设计的特性,看上去不错,上传运行。我不太知道别的架构,但是据我所知,我所采用的是最明智的方法。
一些事实能“证明”我所做的都是正确的:我从零开始,白手起家,用智慧创造了一个功能齐全的电子商务站点。更重要的,它运行完好并且还在扩张。
在我的眼里,我和那些写了亚马逊的程序员们没什么太大区别。当然亚马逊要大一些,但是我没有看到任何我的网站不能扩张成那样的理由--尤其考虑到我采用的高速运行的架构。
我认为我的技术水平已经到了巅峰了。并不是说我对学习新技术不感兴趣了,我只是不再对此感到紧迫。毕竟我创造了一些不错的产品。任何在此之上的东西只是附加奖励,是蛋糕顶端的樱桃而已。
回到地表
我很遗憾,我在这种心态下生活了好几年。我只是将一小部分时间用在这个网站上,而把主要时间用在完全不同的领域。在之后多年的维护和偶尔添加特性的过程中,我确实意识到了之前做的一些选择是有问题的。我意识到有时候要花很长时间才能找到我要找的文件。有时候当我做一个改动时,一些看上去毫无关联的地方会出现bug。
我的学习没有停止,但它确实进展缓慢。我意识到我曾经写的mysql函数是有风险的,因为后面版本的PHP减少了对它们的支持。在一段时间里,我克服对此的恐惧的方法是坚信我的无懈可击的设计可以弥补这些风险。毕竟我尝试了所有形式的我能找到的SQL注入,一切看起来都没有问题。
去年的一天我接到了一个紧急电话,网站挂了。所有的请求都得到500错误。在工程师们重新启动并且分析了事故原因后,这被证实是一起来自国外的sql注入攻击,是我从来没见过的一种。
好吧,我想,这也许是我该转向PDO的时候了。
觉悟
当我坐下来准备重写所有的数据存取方法时,我意识到了一些深层次的问题。我意识到这将会很困难。而且我知道为什么它会这么困难。
因为这些方法散落在所有地方;因为我无法知道是否会不经意地破坏一些东西;因为代码是如此不一致以至于我要小心地研究不同对象的细微差别;因为很多代码和别的部分紧密相连,这也会导致我会不小心造成破坏。简单地说,这将会很困难。不仅因为所有这些坏的实现方法,还因为我对它们所将造成的后果缺乏预见。
所有的辩护,借口,逃避都无法继续下去了。我错了。我不是那个幻想中的天赋卓越的程序员。这么多年来,我一直都没有认清这一点。
我的愚蠢已经显而易见,尽管这对我的自尊心是极大的打击,但这也是很宝贵的一个教训。我通过亲身经历(而且是非常痛苦的),学到了为什么做一件事的方法有对错之分。这不仅仅关系到品味或者时尚。这不是比谁的方法更聪明。正确的方法可以在现实生活中找到,并且能让你和那些使用你代码的人的生活更好。错误的方法让人沮丧,浪费时间。我在这里不想说明哪些东西是组成“正确方法”的要素。只要说不是我做的那些就够了。
真正的错误
我实现了PDO。同时开始第一次使用PHPUnit。我决不想尝试通过单元测试去改造那样的代码。
现在我有意识地迫使自己无论何时都尽量去学习。我正在读一些每个程序员都应该读的书。我在关注别人的博客。我在收听播客。我会看会议视频。我正在参加一些当地的社团并且在其中做演讲。我在做副业并且挑战自己学习新的技术。我在学习用正确的方法做事。
对你们所有献身于这项事业中的人来说,有一个对我们很重要的有利条件。即编程是这样一个完全抽象的活动,任何其他领域都会受到的现实世界中的限制在这里不存在。在这里,你的极限是你自己。
我要以一些真正的箴言结束这个故事。我在开始写这片博客的时候正好刚看完第二版的《代码大全》。在书的最后,第825页的底部,作者准确地描绘了我在写这篇文章时的想法。可以说他只用了两句话就表达我在这数千字里想表达的东西:
“作为一个初学者或者进阶者,这并没有什么错。当一个有能力的程序员而不是领导者,这也没有什么错。真正的错误是,当你知道应该如何去提高时仍然选择做一名初学者。”
第五篇:怎样做一名合格的程序员
作者:xx,1990年毕业于xx工学院计算机软件专业,后又于xx年毕业在xx大学完成软件工程专业硕士的学习,现供职于CNpC旗下的一个行业软件研发中心,因为在网上看了许多有经验的各路软件开发人员写的好帖,一时手痒兴起,也凑一篇壮壮声势。sO100
假设你是一名软件专业毕业的本科学子,如何在工作中~成为一名有较高职业水准的程序员呢,本文试图总结作者从事15年软件开发工作的感想,希望对有志成为职业程序员的人有所帮助,并借此机会感谢原xx工学院计算机系的和智玲老师和张怀宁老师,特别感谢我的硕士导师,xx大学计算机系的博导郑国梁教授。
注:本帖言辞尖刻,乃作者脾气秉性使然,如果你看着有气,就请多多见谅,放下别看了。
程序就是一系列按步骤进行的操作序列,它有好多种级别,比如最低级的微程序、次低级的汇编程序、高级的各种编程语言程序、最高级的脚本语言程序,也许我列的不对,但没关系,我要说的是不管是那个级别的程序,其本质都是操作的逻辑序列。大多数系统和应用程序都是建立在高级编程语言上的,比如C、C++、C
#、FORTRAN、BISIC、JAVA等等,就让我们只关注这一级的编程能力吧。因此如果一个程序员的逻辑能力不高,他永远都不能成为一名具有合格职业水准的程序员,我们在下面的讨论有关编程能力的方方面面,最终都是为了最大程度地提高和实现一名程序员的逻辑能力。
一、掌握基础知识:十六年寒窗的持续积累
从7岁读小学起,经过16年的学习,你从软件专业本科毕业后,必须完成以下几门专业课程的学习:计算机组成、操作系统原理、汇编语言、数据结构、编译原理、数据库原理、软件工程、结构性设计语言(pASCAL、)、面向对象设计语言(C++、C#)、计算机网络等,你最好还懂一些算法分析、分布式系统、计算机图形学、形式逻辑、人工智能原理、软件设计模式、软件构架/框架等研究生的课程,16年来,你积累的除了知识,更重要的是形成最适合自己的学习方法和工作方法。这些是你具备程序员职业水准的基础能力,不要受什么计算机软件怪杰之类传奇的影响,那不过是小概率事件,而且这些怪杰们就算没有读过软件本科和研究生,也往往自学了大多数专业课程,很可能比在校学习的学生对这些课程的精髓部分理解的更好,还有他们的工作方法和思维方式是特别而高效的,但普遍性差,可以借鉴,不宜模仿。好,所以现在你只需要问问自己,那些课程和知识都学会并掌握了吗?如果是,那就准备好进行实践了。
二、在实践中提高:成为一名高水平的Coder好了,你毕业了,在校功课都不错,也找了一个专业对口的工作,你想大展鸿图了,可是别急,你的翅膀还不够硬,不信我们说来看看。通常,你在工作中都会用到某一种单位/公司固定的操作系统和编程语言开发环境,比如Windows、UNIX、LINUX等操作系统,又比如用VC、VB、pB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor等编程语言和开发环境,我们在后面把它们合称为开发环境。就在校学习的有关开发环境的知识而言,大概你距工作需要的差距是不小的,当某个操作系统和编程语言环境成为你的饭碗时,就不应也不能用通过课程/认证考试之类的眼光和要求来评价你的能力,即使你能考100分。
你需要深入地学习该操作系统和编程语言环境的各类开发手册的所有内容,你会说大多数你都用不上,其实你既对又不对,对的是单从使用的角度而言,你确实用不上开发手册的大多数内容,比如庞大的VC开发类库和复杂的开发环境,你在实际工作中能用到的不到总数的1/10或1/5,不对的地方在于,你用到的部分不是孤立存在的,它们是整个体系中的一部分,只有对整个体系有了一个较完整的了解,才能得心应手、随心所欲地用好你用到的部分,你才算初步具备在这种开发环境下进行Coding的职业水准(还远不够程序员的职业水准呢),而这只是刚开始。如何才能真正掌握一种开发环境的全面的知识呢,最原始的办法就是读开发指南/教程、参考手册,一般来讲,学习开发指南/教程时,你如果是一个认真的人,都会完成5/10~7/10左右内容的学习和练习,如果你想成为职业选手,就应该完成9/10以上内容的学习和练习。参考手册不同,大多数所谓的“程序员”们只是用到了才翻翻,这差的太远了,你应该象读开发指南/教程一样,每个环节都要读,比如VC,参考手册中的每个类,类的每个函数,都要读上几遍,它们往往是一小伙一小伙地纠缠在一起使用的,开始时读得你毫无头绪、心烦意乱,不要紧,还有一手呢,如果你开发环境安装的全面,它们往往都有开发商做的demo例子可看,你就进入另一个境界了,开始时你关注demo中的具体技术,后来你发现这些demo的程序写的都还算不错,结构简单但合理,如果你真的用心,就一定能发现一些个别的demo是极品,它所展现的程序逻辑结构是你设计不出来的,你现在有点更关心它的程序设计构架,甚于对你原始目的(某种相关的技术/技巧)的关注,这时的你,开始了从一名Coder向一名programmer的转变,你会忍不住要看看开发商提供的源程序,比如.h和.cpp,通常你会找到include路径下所有的.h程序,你才知道,哇!好多好多东东在参考手册中都没提到,你要学的太多了,没时间顾及其它的业余爱好了,现在知道为什么程序员是年轻人的职业了吧,你要有足够多的时间才行,即使你的智商有160。如果你走到这一步,在你工作的团队中,已经是经常有人向你请教技术问题,经常有人请求你帮忙debug,你已是公认的“高手”了,别得意,因为你仍然是个Coder,为什么这么说呢,你想想,你已深入了解了这个开发环境中的各种技能,知道一名Coder如何用好这些东西,可是你能设计的出提供给Coder们用的东西吗?唔……,你想了想,可能还不太行。对了,就是这样,你还是一名小我境界的程序员呢,本质是个Coder,当然已是一名高水平的Coder了,然而你需要进一步登堂入室才能成为一名真正的程序员。
让我们继续吧,通常你
点也许有点困难,但这种事干的多了,你就会越干越快,越来越
得心应手,你的逻辑能力飞速提升,你能看得上的逻辑结构优秀的程序开始不多
了,下一步就是练习。从工作中开始吧,如果你有空闲,你需要做至少两类练习,一类是算法练习,所有的经典算法都是经典的逻辑,题目有的是,像个好学生
一样吧,每年的国内国际编程竞赛都有逻辑要求非常高的题,你可以只选一两道
难题来做做。当你可以把复杂的单递归程序(只有A调A)变成非递归程序时,已经
不错了,如果你能看得懂双递归程序(A调A、A调B、B调A、B调B都有),我为你鼓
掌!你不必往下看了,我有点不好意思啦――班门弄斧,你快滚蛋吧!另一类是
把以前和当前你工作中你不满意的程序推倒重新设计一遍,这非常重要,省时省
力,因为你熟悉需求,技术上也没问题,目的就是改进程序的逻辑结构,很划算
哦,唯一要克服的就是:你对推翻以前工作中那点小小成就的心理障碍,如果你
真想优秀,说句粗话:这点心理障碍算个屁,一遍遍反复地推倒已有的成果只能
使自己快速进步,放手干吧,没什么好可惜的,马恩早就在《共.产.党宣言》里
说过了:在这个过程中,你失去的只有锁链(禁锢你思想的锁链)。
让我们来总结一下,经过自我否定后,再生的你尽管对过去的“业绩”还有一些
眷恋,但已是一个初步具备职业水准的程序员了,掌握了相应的技术和技巧,具
备了较高的抽象逻辑思维能力,最主要的特征是:能自觉地自我否定,不断地追
求更高水平的逻辑能力。
在这个过程中,如果你能注意以下一些小的方面,你前进的步伐也许会快一些。
l从编译原理的角度来理解你工作中使用的高级语言,如果你做到这一
点,至少有两个好处,第一个好处是避免一大堆低水平重复出现的编译错误。一
名优秀的Coder平均在一个工作日中应该完成200行以上的源码,其编译错误应该
控制在5个以下,要知道这200行源码不是一次完成的,所以大多数情况下你都要
追求一次编译通过,而一名职业水准的程序员,应该进一步做到即使用purify这
类的工具来检查源码,也不会存在严重的内存泄露。第二个好处是可以提高源码的可读性和效率。规范地编写你的代码使你自己的逻辑清晰,因为你明白多加几
个括号和空行、多换行对齐、多注释,编译器是会自动识别的,不影响程序执行的效率,反过来,控制好递归调用和循环内的if语句才是提高程序效率的关键,要全力避免递归,但要深刻理解递归,能通过自己建立堆栈来把递归程序转换成非递归程序,要求还是较高的哦!
l避免思维陷阱,只要你是人就一定有自己的思维惯性,这一定又会表
现在你的程序逻辑中,有时你就是从这个惯性中跳不出来(谁都有这个时候),但
要心里有数才行,所以你需要帮助,如果你有几个水平相若或更高的职业伙伴,太好了,当遇到花30分钟还打不下的bug时,就别浪费时间了,找他们吧,最要紧的是能思路清晰明确地表述你的问题,通常你自己在这个过程中或者伙伴中就有
人把问题解决了,又快又好。另外,有几个可以良性竞争的职业伙伴是人生的一
件幸事,1+1>2,大家各有所长,你最好做到及时公开你的成果,技不压身嘛,IT
发展的这么快,你再优秀,那点东东也没有什么值得隐藏的,所以你可以技术或
水平不够高,但千万不可以让真正具有职业水准的选手鄙视你的职业品质和行为。
l有自己debug的特点,下面的说法作者不敢太肯定,只是经验之谈。即
使在VC这种高度完善的开放环境下,你仍然应该要求自己仅凭打印语句就能debug
。这也有两点好处,第一个好处是,遇到bug你会认真想问题所在,而不是用
debug工具一步步简单地追踪卡在哪儿了,你定位bug范围的方式是从大到孝从
粗到精,这是一种自顶向下的思维方式,而用工具追踪,容易形成自底向上的思
维方式,这不算好,你应该先看到森林,再看到树木。我反复提及:程序就是逻
辑过程,大多数程序从main函数开始,是由数据结构和功能子程序组成的一个树
形结构的逻辑过程(要认清即使是面向对象的程序语言也是一样的),它的执行过
程是深度优先的,但你定位bug应该是广度优先的,好好想想这一点,嗯?第二个
好处是强迫你思考并记住而不是用工具看到调用过程,你大脑的抽象逻辑思维能
力和胳膊上肌肉的力量一样,都是练出来的,如果你的bug是程序结构上的逻辑错
误引起的,这一点就非常重要了,顺便说一句,最难打的bug就是程序逻辑结构错
误导致的bug。你要是真正明明白白地认识到这儿了,那我就没什么东西可以告诉
你了。总之
p;,Linux操作系统的一些源码不错,是开放的,你可以合法地搞到,其它的不要说
是我建议你侵犯知识版权啊!
四、天生神力:成为系统分析员
本来就论述如何成为一名职业程序员而言,本文已基本完成任务了,但《菜根谭
》有言:竭世机枢,似一滴投于巨壑,穷诸玄辩,若一毫置于太虚。既已乘兴到
此,何妨多置一毫于太虚呢,作者不才,干脆尽兴写算了。
你要是运气好,直接进入了一个严格规范生产的软件企业就业,刚开始就应该是
按别人做好的软件设计来实现编程,你可以有机会直接学习软件设计,当你积累的足够多了,能够对其中的一些设计提出好的改进建议,而且干得又快又好,就
会渐渐地展露头角,我相信你终有一天成为一名软件设计人员(注意,不是软件产
品设计人员),步入系统分析员的行列,但这还需其它的一些条件和自我~。如
果你在一个不规范的软件企业工作,那也不错,你很可能直接就有机会进行软件
设计,然后开发、测试,甚至还不得不自己定义需求,把软件开发过程的各个环
节走一个遍,当然这样对你的要求更高,而且你也不容易得到及时有益的指点,在正态分布的情况下,你应该是成长的很慢。但不管就业的单位如何,如果你决
心要成为顶尖软件职业选手,通常什么客观困难都阻挡不了你,然而你个人的因
素可能会阻止你的前进。下面提出的观点纯属一己之见,伤人自尊之处作者在此
提前道歉,并建议你除非对本文有强烈的兴趣,否则就请直接看第五节或放下别
看了。丑话已说在前头了,在各种软件开发组织的发展过程中的事实也证明,只
有少数程序员能成为系统分析员,我想这一点不是我杜撰的吧,因此你要是在看
接下来的部分时感到气愤难当,那也实在没着,纯属活该,因为作者只是在说明
自己的观点而已,你最多可以呲之以鼻,表示一下你的轻蔑好了,但没有任何理
由可以骂人!
作者自己没有到微软面试过,但身处软件行业,关于微软的许多东东当然还是有
耳闻的,据说微软招聘一名程序员要过五个已经成为微软程序员的面试关,而且
是一票否决制,又据说大多数面试题并非编程,而是一些有关逻辑和智力的题,作者私下也做过许多流传的微软面试题,并对此做法深以为然。程序的本质就是
逻辑,所以几十年前就有人提出编程是一门艺术,而艺术是要靠天份的,这一点
少有人反对。一个人的逻辑能力可以不断提高,但其能到达的终极逻辑能力的层
次必定为其天生智力所限制,这一点就让人不易接受了。好笑啊!人们可以公开
承认自己没有某种或全部的艺术天份,但要说自己逻辑天份不够,换句话说承认
自己笨、IQ不够高,往往是要怒发冲冠的,其实这又有什么区别呢?话都说到这
儿了,再次建议你如果不够自信,就跳过这一节吧,直接看第五节,好吗?
好了,把话题说回来,你已经成为一门合格的职业程序员了,如果要想成为从事
软件系统设计的职业系统分析员,第一件事就是悄悄找一个标准智商测试的网站
或其它渠道,严格认真的测一测自己的智商,如果IQ低于130(正常智商是110),就请别费劲了,打消掉成为系统分析员的念头吧!好!好!先请你冷静一下,好
好想想,其实微软面试时就是在测你的智商和逻辑数学素质呢,这就是本节的标
题为“天生神力”的原因,因为设计就是从无到有地进行创造,无论是软件还是
其它行业都一样,可以有借鉴的,没有现成的,设计就是创造!如果你IQ在130以
上,又决心要当一名职业软件系统分析员,其实你不过是要准备好吃更大的苦而
已,有什么好虚荣的呢?
~还是从基本功开始的,过程和成为一名职业程序员差不多。必须使用设计工
具这一点是不用多说的。在工作中,你基本上遇到的是两类方式的设计,一个是
结构化设计,另一个是面向对象设计,就个人经验而言,面向对象的设计更好。
如果你工作中不得不采用结构化的设计,你必须熟练地掌握数据流图和控制流图的分析和设计,一般来讲,如果你把一个软件中用到的数据模型设计好了,针对
功能化的流程,不难设计出数据流图,但下一步设计控制流图才是挑战,如果你
按照需求走不通设计好的控制流图,那么你或别人在按照这个设计编程实现时,必定也走不通,没有奇迹会发生,还是在设计阶段严格要求吧,又有一点需要牢
记:返工是最慢的。当你在进行控制流图的设计时,也不要妄想得到需求人员提
供给你明确的指点,通常他们要是能够把需求的功能和操作次序写完整的话,你
应该就感恩戴德了,从需求中整理出功能、操作的拓扑次序和条件是你作为系统
分析员的职责
。看看,要是没有一点图论的基础和拓扑学的入门知识,你是当不
好一个职业系统分析员的,即使你天赋不错,必要的数学和逻辑素质仍然不可或
缺。也不用气馁,永远没有最好的设计,只有更好的设计,反复地进行设计迭代,勇于推翻旧的设计,你将快速进步。如果你在工作中是采用面向对象进行设计的,那就更有利了,有关面向对象设计的书太多了,不用作者在此多费口舌,建
议精读一本经典的书,比如北大邵维忠等编译的《面向对象的分析》,有些方法
和技巧可能过时,但其逻辑的基本原理是非常正确的,其本质是,你在逻辑上是
如何认识这个世界的,你就是如何设计软件体系结构的,然后读读其它书,触类
旁通,自己创造机会多实践,成功自然会到来的,总之,不管是结构化设计还是
面向对象设计,评价一下自己的软件系统设计方案吧,有好多指标呢,比如是否
均匀和平衡?局部独立性强不强?有没有歧异的结构?有没有层次太多或太少?
有没有某个层次太大、太广?是不是逻辑结构先复杂了再化简的?还是只会设计
简单的,复杂不起来(这一点是笨哦,如果出现多次,请你不要意气用事,转行吧)?最重要的一点,是否容易理解、实现和改进?你自己会得出评价的。如果有机
会看到别人的设计,一定不要错过学习的机会,自己推导一遍,认真比较比较,获益会较多。
走到这一步,你就应该关注设计模式了,首先还是学习,这方面的好书有的是,但一般在工作中用到的设计模式较为单一,应该多尝试一下其它的设计模式。其
次必须要明白设计模式不是设计思路,也不能代替设计思路,比方你要从A到B修
一条路,设计模式只是让你选择,是修水泥的还是柏油的?是高架路还是普通的,但线路必须你自己定,而线路就是设计思路,模式对思路是有影响,但不能代
替,所以如果你的智商高达250,我相信你直接用汇编语言也能写出面向对象的程
序来。第三在此有一个陷阱,很多系统分析员生搬硬套设计模式,全然不懂如何
融会贯通,在你的一项具体工作中,往往是以一种设计模式为主,其它模式为辅的,思维不拘泥于形式才是关键,而且也为你到达更高的软件设计的境界做好准
备。
唉!都不知该怎么向下写好了,因为已达到作者水平的极限了,我胡乱说一点,你凑合看吧。软件设计最终的层次是:以无法为有法、以无限为有限,这句话是
李小龙说的,不是我说的。再拾人牙慧一把,类比一个故事吧,金大侠在《倚天
屠龙记》里讲到张无忌初学太极,学会的标志是把刚学的招数全忘了,记住的是
太极的道理和精神,和李小龙有些相似喔,软件设计也一样,忘记所有的设计模
式,随心所欲进行设计才是至高境界,所以你能到达多高的软件设计的境界最终
将取决于你的哲学素质,这一点实在是不好写啊,你自己领悟吧!作者只有祝福
了!
五、职业人的终极目标:全面~,成为Leader
这一节更不好写,涉及到太多其它非技术方面的因素,特别是个人人生观和世界
观的~,如果本帖的点击率超过作者私下期望的一个数值,那我就争取尽力厚
着脸皮再补上吧。我只说一句,虽然大家都知道软件开发是一个团队性的工作,但追求参与一个大型软件系统的成功开发,是一名软件人员的本能,就像拿破仑
说的不想当元帅的士兵不是好士兵,所以不追求实现大系统的软件人员,也不是
一个好的职业软件人员,但你只有成为Leader,领导一个优秀的软件开发团队,才有机会实现这个终极职业目标,对不对?
好吧,不管你现在的感受如何,我都谢谢你能读到这里!我不习惯假歉虚,就不
说什么作者水平有限,本文抛砖引玉,欢迎大家批评斧正之类的客套话了,虽然
作者水平确实有限。所以我认为你尽管有权砸砖,但实在没必要搞回帖、或回骂、或顶之类的玩意儿,我只是尽兴写一点多年从事软件开发工作的体验,因此接
下来我就高挂免战牌,不回复任何回帖了。再次谢谢你能有耐心读到这里!希望
本文对你有所裨益,祝你成功!再见!