怎样做一名合格的程序员_一名合格的程序员

2020-02-27 其他范文 下载本文

怎样做一名合格的程序员由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“一名合格的程序员”。

作者: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,领导一个优秀的软件开发团队,才有机会实现这个终极职业目标,对不对?

好吧,不管你现在的感受如何,我都谢谢你能读到这里!我不习惯假歉虚,就不

说什么作者水平有限,本文抛砖引玉,欢迎大家批评斧正之类的客套话了,虽然

作者水平确实有限。所以我认为你尽管有权砸砖,但实在没必要搞回帖、或回骂、或顶之类的玩意儿,我只是尽兴写一点多年从事软件开发工作的体验,因此接

下来我就高挂免战牌,不回复任何回帖了。再次谢谢你能有耐心读到这里!希望

本文对你有所裨益,祝你成功!再见!

《怎样做一名合格的程序员.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
怎样做一名合格的程序员
点击下载文档
相关专题 一名合格的程序员 程序员 一名合格 一名合格的程序员 程序员 一名合格
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文