修炼一名程序员的职业水准_转

转自:http://blog.jobbole.com/8960/程序员

做者:林庆忠,1990年毕业于昆明工学院计算机软件专业,后又于1999年毕业在南京大学 完成软件工程专业硕士的学习,现供职于CNPC旗下的一个行业软件研发中心,由于在网上看了许多有经验的各路软件开发人员写的好帖,一时手痒兴起,也凑一 篇壮壮声势。(伯乐在线注:此文写于2005年)面试

假设你是一名软件专业毕业的本科学子,如何在工做中修炼成为一名有较高职业水准的程序员呢,本文试图总结做者从事15年软件开发工做的感想,但愿对 有志成为职业程序员的人有所帮助,并借此机会感谢原昆明工学院计算机系的和智玲老师和张怀宁老师,特别感谢个人硕士导师,南京大学计算机系的博导郑国梁教 授。算法

注:文章言辞尖刻,乃做者脾气秉性使然,若是你看着有气,就请多多见谅,放下别看了。数据库

程序就是一系列按步骤进行的操做序列,它有好多种级别,好比最低级的微程序、次低级的汇编程序、高级 的各类编程语言程序、最高级的脚本语言程序,也许我列的不对,但不要紧,我要说的是无论是那个级别的程序,其本质都是操做的逻辑序列。大多数系统和应用程 序都是创建在高级编程语言上的,好比C、C++、C#、FORTRAN、BISIC、JAVA等等,就让咱们只关注这一级的编程能力吧。所以若是一个程序 员的逻辑能力不高,他永远都不能成为一名具备合格职业水准的程序员,咱们在下面的讨论有关编程能力的方方面面,最终都是为了最大程度地提升和实现一名程序 员的逻辑能力。编程

1、掌握基础知识:十六年寒窗的持续积设计模式

从7岁读小学起,通过16年的学习,你从软件专业本科毕业后,必须完成如下几门专业课程的学习:计算 机组成、操做系统原理、汇编语言、数据结构、编译原理、数据库原理、软件工程、结构性设计语言(PASCAL、C)、面向对象设计语言(C++、C#)、 计算机网络等,你最好还懂一些算法分析、分布式系统、计算机图形学、形式逻辑、人工智能原理、软件设计模式、软件构架/框架等研究生的课程,16年来,你 积累的除了知识,更重要的是造成最适合本身的学习方法和工做方法。这些是你具有程序员职业水准的基础能力,不要受什么计算机软件怪杰之类传奇的影响,那不 过是小几率事件,并且这些怪杰们就算没有读过软件本科和研究生,也每每自学了大多数专业课程,极可能比在校学习的学生对这些课程的精髓部分理解的更好,还 有他们的工做方法和思惟方式是特别而高效的,但广泛性差,能够借鉴,不宜模仿。好,因此如今你只须要问问本身,那些课程和知识都学会并掌握了吗?若是是, 那就准备好进行实践了。网络

2、在实践中提升:成为一名高水平的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了,然而你须要进一步登堂入室才能成为一名真正的程序员。

让咱们继续吧,一般你都是从精通一种编程环境开始的,假设你已经较为精通在Windows下用VC开 发软件了,这时在技术和技巧方面你将面临一小一大两个挑战,第一个小挑战是若是公司/单位改换了开发环境,好比用LINUX下的QT交互语言工具进行开 发,你不过是把前面掌握VC的过程再来一遍,因为在主观上经历了VC工具的学习过程,在客观上各类开发环境都有太多类似的方面,这回你掌握的应该较快。要 当心,在这时第一次诱惑之门打开了,由于你感受良好,看!这回这么快,我就这么好地掌握了新的开发环境,你开始关注其它暂时还用不到的同类环境,好比 VB、Delph、JAVA,如饥似渴地掌握各类开发工具,证实本身的学习能力和价值,但你忘了一点,你仍然是个Coder,只不过是一个在好多开发环境 下都能编程的Coder,就像你生活在中国,于是精通了汉语,工做须要你又掌握了英语,而后你就来了劲,把俄语、日语、阿拉伯语、拉丁语,等等等等,都学 习个遍,我只能说,有点BT。你忘了本身是个职业人,同一类的东西工做中用获得才需学习,太多太多的Coder们喜欢在一块儿比较和炫耀本身会掌握了几种开 发工具,不信你看看招聘时的求职书就知道了,sigh!他们中绝大多数人永远都只能停留在这个层次上,心浮气躁,一辈子都再也当不成真正的程序员了。总结一 下,其实你在这时须要的是对本身掌握新开发环境的能力的自信,而不是一遍遍地重复来证实本身。

第二个大挑战就是你明白了只掌握VC是不够的,你发现本身有 点浅薄,有不少东东你会用但你不太懂,不少方面支持VC编程的知识你都没掌握,好比操做系统的源码、网络协议知识、Windows 的注册表、进程和线程的基础知识、硬件驱动方面的知识、ActiveX、Windows 庞大的 API,又是一个等等等等,这些基础知识的学习和掌握但是要花费大量时间的,你再一次深切地感到时间太不够用了,由于这时的你大概有许多俗务缠身了,因此 有点沮丧,还不用提IT业天天不知有多少新东西在发布,KAO,永远都跟不上,越拉越远了。哎!别气馁,振做一点,你仍是忘记了本身是个职业人,既然好多 东东在工做中你永远都没机会用,那么干吗要学呢?用什么才学什么,最多预测到立刻要用什么,先一步学什么好了,要知道没有人是真正的、无所不精的全科大 夫,除非你是神,但若是你还在耐着性子看这篇文章,你确定是我的嘛。

OK,通常工做后三五年,你经历了上述过程,经受了诱惑和考验,终于明白了一个道理:你要的是强劲的 学习知识的能力,是对某种软件知识/技能的有深度的精通,一种摸到它的根的深度,而不是已掌握的技能的种类和数量。这时不管谁用他掌握了多少种你不会的技 能来吓唬你都没用,你对他的层次只有蔑视。经过几年的学习和工做,要记住最重要的一点,永远最重要:对本身学习IT知识能力的自信,一个程序员一辈子都要不 停地进行高强度的学习,用心问问本身,有没有这个自信?别用虚荣心来骗本身哦,若是没有的话,那就没必要花费你宝贵的时间向下看了,做者在此感谢你有耐心看 到这里,如今建议你关闭这篇文章,趁着年轻,当机立断转行吧!

3、注重逻辑:成为一名职业程序员

好,再前进一点点,你就要成为一名职业程序员了,让咱们继续来完成这个任务吧!咱们在前一节提到过, “你发现一些个别的demo是极品,它所展示的程序逻辑结构是你设计不出来的,你如今有点更关心它的程序设计构架,甚于对你原始目的(某种相关的技术/技 巧)的关注”,其实你是在关注这个demo程序做者的思惟逻辑,全部程序的本质就是逻辑。技术你已经较好地掌握了,但只有完成逻辑能力的提升,你才能成为 一名职业程序员。打一个比方吧,你会十八般武艺,刀枪棍棒都很精通,但就是力气不够,因此永远都上不了战场,这个力气对程序员而言就是逻辑能力(其本质是 一我的的数学修养,注意,不是数学知识)。逻辑能力也是逐步提升的,开始时你必定是用直观的逻辑能力来编程的,怎么想就怎么编,不对就再改,在改进中提升 本身的逻辑能力,从直观逻辑能力提升到抽象逻辑能力,这是很正常的。提早说一句吧,到达逻辑能力的至高境界,其表现是用数学语言来描述问题和问题的解决办 法,高度抽象!好,说回来吧,你要提升逻辑能力,最快的办法就是读别人写的结构优秀的程序。优秀的代码是百读不厌的(这句话是我抄来的),暂时放放对其中 某种技术和技巧的关注吧,你要推导和学习的是这些好程序的逻辑结构,它们是被精心设计出来的。

你能够先捂住这个demo程序,本身设计一个功能相同的程序 结构,而后比较一下demo的程序结构,若是差距较大,那你就不该简单地改进一下,而是要把demo做者设计的过程在内心复原一遍,作到这一点也许有点困 难,但这种事干的多了,你就会越干越快,愈来愈驾轻就熟,你的逻辑能力飞速提高,你能看得上的逻辑结构优秀的程序开始很少了,下一步就是练习。从工做中开 始吧,若是你有空闲,你须要作至少两类练习,一类是算法练习,全部的经典算法都是经典的逻辑,题目有的是,像个好学生同样吧,每一年的国内国际编程竞赛都有 逻辑要求很是高的题,你能够只选一两道难题来作作。当你能够把复杂的单递归程序(只有A调A)变成非递归程序时,已经不错了,若是你能看得懂双递归程序 (A调A、A调B、B调A、B调B都有),我为你鼓掌!你没必要往下看了,我有点很差意思啦――班门弄斧,你快滚蛋吧!另外一类是把之前和当前你工做中你不满 意的程序推倒从新设计一遍,这很是重要,省时省力,由于你熟悉需求,技术上也没问题,目的就是改进程序的逻辑结构,很划算哦,惟一要克服的就是:你对推翻 之前工做中那点小小成就的心理障碍,若是你真想优秀,说句粗话:这点心理障碍算个屁,一遍遍反复地推倒已有的成果只能使本身快速进步,放手干吧,没什么好 惋惜的,马恩早就在《共.产.党宣言》里说过了:在这个过程当中,你失去的只有锁链(禁锢你思想的锁链)。

让咱们来总结一下,通过自我否认后,再生的你尽管对过去的“业绩”还有一些眷恋,但已经是一个初步具有职业水准的程序员了,掌握了相应的技术和技巧,具有了较高的抽象逻辑思惟能力,最主要的特征是:能自觉地自我否认,不断地追求更高水平的逻辑能力。

在这个过程当中,若是你能注意如下一些小的方面,你前进的步伐也许会快一些。

从编译原理的角度来理解你工做中使用的高级语言,若是你作到这一点,至少有两个好处,第一个好处是避免一大堆低水平重复出现的编译错误。一名优秀的 Coder平均在一个工做日中应该完成200行以上的源码,其编译错误应该控制在5个如下,要知道这200行源码不是一次完成的,因此大多数状况下你都要 追求一次编译经过,而一名职业水准的程序员,应该进一步作到即便用purify这类的工具来检查源码,也不会存在严重的内存泄露。第二个好处是能够提升源 码的可读性和效率。规范地编写你的代码使你本身的逻辑清晰,由于你明白多加几个括号和空行、多换行对齐、多注释,编译器是会自动识别的,不影响程序执行的 效率,反过来,控制好递归调用和循环内的if语句才是提升程序效率的关键,要全力避免递归,但要深入理解递归,能经过本身创建堆栈来把递归程序转换成非递 归程序,要求仍是较高的哦!

避免思惟陷阱,只要你是人就必定有本身的思惟惯性,这必定又会表如今你的程序逻辑中,有时你就是从这个惯性中跳不出来(谁都有这个时候),但要内心 有数才 行,因此你须要帮助,若是你有几个水平相若或更高的职业伙伴,太好了,当遇到花30分钟还打不下的bug时,就别浪费时间了,找他们吧,最要紧的是能思路 清晰明确地表述你的问题,一般你本身在这个过程当中或者伙伴中就有人把问题解决了,又快又好。另外,有几个能够良性竞争的职业伙伴是人生的一件幸 事,1+1>2,你们各有所长,你最好作到及时公开你的成果,技不压身嘛,IT发展的这么快,你再优秀,那点东东也没有什么值得隐藏的,因此你能够 技术或水平不够高,但千万不可让真正具备职业水准的选手鄙视你的职业品质和行为。

有本身debug的特色,下面的说法做者不敢太确定,只是经验之谈。即便在VC这种高度完善的开放环境下,你仍然应该要求本身仅凭打印语句就能 debug。这也有两点好处,第一个好处是,遇到bug你会认真想问题所在,而不是用debug工具一步步简单地追踪卡在哪儿了,你定位bug范围的方式 是从大到小、从粗到精,这是一种自顶向下的思惟方式,而用工具追踪,容易造成自底向上的思惟方式,这不算好,你应该先看到森林,再看到树木。我反复说起: 程序就是逻辑过程,大多数程序从main函数开始,是由数据结构和功能子程序组成的一个树形结构的逻辑过程(要认清即便是面向对象的程序语言也是同样 的),它的执行过程是深度优先的,但你定位bug应该是广度优先的,好好想一想这一点,嗯?第二个好处是强迫你思考并记住而不是用工具看到调用过程,你大脑 的抽象逻辑思惟能力和胳膊上肌肉的力量同样,都是练出来的,若是你的bug是程序结构上的逻辑错误引发的,这一点就很是重要了,顺便说一句,最难打的 bug就是程序逻辑结构错误致使的bug。你要是真正明明白白地认识到这儿了,那我就没什么东西能够告诉你了。总之,程序员的职业水准:生产效率和程序质 量,主要是取决于源码中bug的数量和debug的速度,而不是取决于编写源码的速度。给你一个我本身定义的考查一个职业程序员的指标:一个合格水准的职 业程序员,编程的时间若是算一份的话,其累计debug的时间不能超过一份,真正职业高手累计debug的时间应该控制在0.5份如下,如何?你关上门悄 悄问问本身,你花费在编程和debug上的时间比例是多少?若是你把程序员做为本身一辈子的职业,那么就永远都要牢记一点:追求作一个0 bug的优秀程序员!这是任何一个想成为职业程序员的人的理想,请相信:坚忍不拔地追求实现这个理想将让你出类拔萃!

作好程序的单元测试,这是另外一项考查你是不是一名具备合格职业水准的程序员的一个必要指标。其实在你拿到需求的时候就要准备单元测试用例了,而且这 些用例 将直接影响你的详细设计(有关软件设计原本是该放在第四节讲的)。咱们仍是打比方吧,当你拿到一个需求时,除了分析它静态的功能外,还应明确它动态的操做 /执行过程,把这个动态过程明确地用流程图画出来,好比分为A~Z的26步,其中A又能够进一步分解为A1~A5的5步,直到不能再分解为止。又好比说 A3步不可分解了,那么你应该把A3步的正常操做和全部五花八门的异常操做都列出来,确保正常的操做确定正确,异常的操做起码程序不退出才行。这样你就要 写好多好多的测试用例,说句老实话,我也历来不写!但我通常会列一个提纲,好比A3步有正常的操做a、b、c、d、e共5项,异常的操做有f、g、h、 i、j、k、l、m、n共9项,你在进行单元测试时都应该跑一遍,这样的程序都还不敢说质量如何好,但起码能够说较稳定吧!若是要想在进行单元测试时干得 快、效率高,那么在进行详细设计时,你就应该把A3步中对全部正常操做和异常操做的判断都设计好,在编程实现A3步时,使得程序的结构合理高效,对不对? 因此,若是你在工做中是割裂地看待软件工程中从需求、分析、设计、编程、测试等各个环节,恐怕水平颇有限喔!但若是你在分析需求时就能看到测试的问题,并 改进设计和实现,为此作好相应的准备工做,嘿嘿,整个软件开发过程你的效率会高不少,一般你在一个开发团队中就会高度自信的,你已越过当一名偏颇、露骨的 高手的境界,成为一个平静的高手,这但是The best in the best!,用周星星的话说:是高手之高高手,由于别人看不出你高在哪儿,没见你有什么高招或特拚命干,但反正你就是干得又快又好、又省力。关于进行单元 测试还有不少复杂的方法,在此本文只提到了最基本的一点,目的是让你在工做上考虑周全、安排有序,其它的本身琢磨吧,没有人能替你吃饱饭!

若是你是用C++编程,我再简单谈谈有关内层释放的一个小技巧,就是对全部你编写的类,在构造和析构函数中加打印语句,统计每一个类在运行程序时构造 和析构 的地方,若是是配对的,那么起码没有对象类一级的内层在程序运行结束时没有释放,而后你就能够把打印语句删掉了,招数虽土,但管用!

还有其它一些好习惯,在这里我随笔写一些,你要是有不一样见解也请一笑过之吧。编程时应该对齐缩进,一个缩进用一个tab键,通常是4个空格,严格遵 守开发 团队的编程规范也是很是重要的。一个子程序不该超过30行(不算空行),其内多重循环不该超过3层,不然都应该分裂成两个子程序,个别算法程序能够长一 些,但也不宜超过200行。一般一个类的全部成员函数总和不宜超过1500行,多了就应该考虑分解成两个类(这个工做最好在设计时就完成)。每完成一小段 程序,好比15~30行,就当即编译运行,不要伪装高手,先敲它一大堆程序,再编译运行,妄想一次成功,体验一种假爽的、虚荣的快感,或炫耀给别人看,这 么作只能证实本身是一个彻彻底底的傻瓜,装酷而已。由于只要有一次不成功,你就会花费大量的时间来调程序,别人的进度在这时就远远地超过你了,日常心是 道,仍是修炼真功夫吧!孙子兵法里关于这一点有明确的阐述,我就不引用了,但建议你真的不要这么干,除非你确实就是这样老是一次就成功的天才,那你还看这 篇文章干什么呢?我又不是写给大家这些天才们看的。再就是有学会买好书、读好书,关于计算机和软件方面的书太多了,时间有限,好比有一个叫侯捷的家伙,几 乎写的每本书都不错,张国峰的C++编程也不错,这只是个人我的意见啊,好书多着呢,列出来比这篇文章长好多倍,我就很少说了。还有一招,要是你运气好, 能搞到一些著名软件系统的源码,好好读读吧,在此我只能告诉你,Linux操做系统的一些源码不错,是开放的,你能够合法地搞到,其它的不要说是我建议你 侵犯知识版权啊!

4、天生神力:成为系统分析员

原本就论述如何成为一名职业程序员而言,本文已基本完成任务了,但《菜根谭》有言:竭世机枢,似一滴投于巨壑,穷诸玄辩,若一毫置于太虚。既已乘兴到此,何妨多置一毫于太虚呢,做者不才,干脆尽兴写算了。

你要是运气好,直接进入了一个严格规范生产的软件企业就业,刚开始就应该是按别人作好的软件设计来实 现编程,你能够有机会直接学习软件设计,当你积累的足够多了,可以对其中的一些设计提出好的改进建议,并且干得又快又好,就会渐渐地展露头角,我相信你终 有一天成为一名软件设计人员(注意,不是软件产品设计人员),步入系统分析员的行列,但这还需其它的一些条件和自我修炼。若是你在一个不规范的软件企业工 做,那也不错,你极可能直接就有机会进行软件设计,而后开发、测试,甚至还不得不本身定义需求,把软件开发过程的各个环节走一个遍,固然这样对你的要求更 高,并且你也不容易获得及时有益的指点,在正态分布的状况下,你应该是成长的很慢。但无论就业的单位如何,若是你决心要成为顶尖软件职业选手,一般什么客 观困难都阻挡不了你,然而你我的的因素可能会阻止你的前进。下面提出的观点纯属一己之见,伤人自尊之处做者在此提早道歉,并建议你除非对本文有强烈的兴 趣,不然就请直接看第五节或放下别看了。丑话已说在前头了,在各类软件开发组织的发展过程当中的事实也证实,只有少数程序员能成为系统分析员,我想这一点不 是我杜撰的吧,所以你要是在看接下来的部分时感到气愤难当,那也实在没着,纯属活该,由于做者只是在说明本身的观点而已,你最多能够呲之以鼻,表示一下你 的轻蔑好了,但没有任何理由能够骂人!

做者本身没有到微软面试过,但身处软件行业,关于微软的许多东东固然仍是有耳闻的,听说微软招聘一名 程序员要过五个已经成为微软程序员的面试关,并且是一票否决制,又听说大多数面试题并不是编程,而是一些有关逻辑和智力的题,做者私下也作过许多流传的微软 面试题,并对此作法深觉得然。程序的本质就是逻辑,因此几十年前就有人提出编程是一门艺术,而艺术是要靠天份的,这一点少有人反对。一我的的逻辑能力能够 不断提升,但其能到达的终极逻辑能力的层次一定为其天生智力所限制,这一点就让人不易接受了。可笑啊!人们能够公开认可本身没有某种或所有的艺术天份,但 要说本身逻辑天份不够,换句话说认可本身笨、IQ不够高,每每是要怒发冲冠的,其实这又有什么区别呢?话都说到这儿了,再次建议你若是不够自信,就跳过这 一节吧,直接看第五节,好吗?

好了,把话题说回来,你已经成为一门合格的职业程序员了,若是要想成为从事软件系统设计的职业系统分 析员,第一件事就是悄悄找一个标准智商测试的网站或其它渠道,严格认真的测一测本身的智商,若是IQ低于130 (正常智商是110),就请别费劲了,打消掉成为系统分析员的念头吧!好!好!先请你冷静一下,好好想一想,其实微软面试时就是在测你的智商和逻辑数学素质 呢,这就是本节的标题为“天生神力”的缘由,由于设计就是从无到有地进行创造,不管是软件仍是其它行业都同样,能够有借鉴的,没有现成的,设计就是创造! 若是你IQ在130以上,又决心要当一名职业软件系统分析员,其实你不过是要准备好吃更大的苦而已,有什么好虚荣的呢?

修炼仍是从基本功开始的,过程和成为一名职业程序员差很少。必须使用设计工具这一点是不用多说的。在 工做中,你基本上遇到的是两类方式的设计,一个是结构化设计,另外一个是面向对象设计,就我的经验而言,面向对象的设计更好。若是你工做中不得不采用结构化 的设计,你必须熟练地掌握数据流图和控制流图的分析和设计,通常来说,若是你把一个软件中用到的数据模型设计好了,针对功能化的流程,不难设计出数据流 图,但下一步设计控制流图才是挑战,若是你按照需求走不通设计好的控制流图,那么你或别人在按照这个设计编程实现时,一定也走不通,没有奇迹会发生,仍是 在设计阶段严格要求吧,又有一点须要牢记:返工是最慢的。当你在进行控制流图的设计时,也不要妄想获得需求人员提供给你明确的指点,一般他们要是可以把需 求的功能和操做次序写完整的话,你应该就感恩戴德了,从需求中整理出功能、操做的拓扑次序和条件是你做为系统分析员的职责。看看,要是没有一点图论的基础 和拓扑学的入门知识,你是当很差一个职业系统分析员的,即便你天赋不错,必要的数学和逻辑素质仍然不可或缺。也不用气馁,永远没有最好的设计,只有更好的 设计,反复地进行设计迭代,敢于推翻旧的设计,你将快速进步。

若是你在工做中是采用面向对象进行设计的,那就更有利了,有关面向对象设计的书太多了,不用 做者在此多费口舌,建议精读一本经典的书,好比北大邵维忠等编译的《面向对象的分析》,有些方法和技巧可能过期,但其逻辑的基本原理是很是正确的,其本质 是,你在逻辑上是如何认识这个世界的,你就是如何设计软件体系结构的,而后读读其它书,举一反三,本身创造机会多实践,成功天然会到来的,总之,无论是结 构化设计仍是面向对象设计,评价一下本身的软件系统设计方案吧,有好多指标呢,好比是否均匀和平衡?局部独立性强不强?有没有歧异的结构?有没有层次太多 或太少?有没有某个层次太大、太广?是否是逻辑结构先复杂了再化简的?仍是只会设计简单的,复杂不起来(这一点是笨哦,若是出现屡次,请你不要意气用事, 转行吧)?最重要的一点,是否容易理解、实现和改进?你本身会得出评价的。若是有机会看到别人的设计,必定不要错过学习的机会,本身推导一遍,认真比较比 较,获益会较多。

走到这一步,你就应该关注设计模式了,首先仍是学习,这方面的好书有的是,但通常在工做中用到的设计 模式较为单一,应该多尝试一下其它的设计模式。其次必需要明白设计模式不是设计思路,也不能代替设计思路,比方你要从A到B修一条路,设计模式只是让你选 择,是修水泥的仍是柏油的?是高架路仍是普通的,但线路必须你本身定,而线路就是设计思路,模式对思路是有影响,但不能代替,因此若是你的智商高达 250,我相信你直接用汇编语言也能写出面向对象的程序来。第三在此有一个陷阱,不少系统分析员生搬硬套设计模式,全然不懂如何融会贯通,在你的一项具体 工做中,每每是以一种设计模式为主,其它模式为辅的,思惟不拘泥于形式才是关键,并且也为你到达更高的软件设计的境界作好准备。

唉!都不知该怎么向下写好了,由于已达到做者水平的极限了,我胡乱说一点,你凑合看吧。软件设计最终 的层次是:以没法为有法、以无限为有限,这句话是李小龙说的,不是我说的。再拾人牙慧一把,类比一个故事吧,金大侠在《倚天屠龙记》里讲到张无忌初学太 极,学会的标志是把刚学的招数全忘了,记住的是太极的道理和精神,和李小龙有些类似喔,软件设计也同样,忘记全部的设计模式,为所欲为进行设计才是至高境 界,因此你能到达多高的软件设计的境界最终将取决于你的哲学素质,这一点实在是很差写啊,你本身领悟吧!做者只有祝福了!

5、职业人的终极目标:全面修炼,成为Leader

这一节更很差写,涉及到太多其它非技术方面的因素,特别是我的人生观和世界观的修炼,若是本帖的点击 率超过做者私下指望的一个数值,那我就争取尽力厚着脸皮再补上吧。我只说一句,虽然你们都知道软件开发是一个团队性的工做,但追求参与一个大型软件系统的 成功开发,是一名软件人员的本能,就像拿破仑说的不想当元帅的士兵不是好士兵,因此不追求实现大系统的软件人员,也不是一个好的职业软件人员,但你只有成 为Leader,领导一个优秀的软件开发团队,才有机会实现这个终极职业目标,对不对?

好吧,无论你如今的感觉如何,我都谢谢你能读到这里!我不习惯假歉虚,就不说什么做者水平有限,本文 抛砖引玉,欢迎你们批评斧正之类的客套话了,虽然做者水平确实有限。因此我认为你尽管有权砸砖,但实在不必搞回帖、或回骂、或顶之类的玩意儿,我只是尽 兴写一点多年从事软件开发工做的体验,所以接下来我就高挂免战牌,不回复任何回帖了。再次谢谢你能有耐心读到这里!但愿本文对你有所裨益,祝你成功!再 见!

相关文章
相关标签/搜索