`
走了弯路的人
  • 浏览: 32102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

zz修炼一名程序员的职业水准(林庆忠__署名原创)

阅读更多

文章分类:综合技术
 
修炼一名程序员的职业水准(林庆忠__署名原创)
 
作者:林庆忠,1990年毕业于昆明工学院计算机软件专业,后又于1999年毕业在南京大
学 完成软件工程专业硕士的学习,现供职于CNPC旗下的一个行业软件研发中心,因为在
网上看了许多有经验的各路软件开发人员写的好帖,一时手痒兴起,也凑一篇壮壮声势

 
 
假设你是一名软件专业毕业的本科学子,如何在工作中修炼成为一名有较高职业水准的
程序员呢,本文试图总结作者从事15年软件开发工作的感想,希望对有志成为职业程序
员的人有所帮助,并借此机会感谢原昆明工学院计算机系的和智玲老师和张怀宁老师,
特别感谢我的硕士导师,南京大学计算机系的博导郑国梁教授。
 
注:本帖言辞尖刻,乃作者脾气秉性使然,如果你看着有气,就请多多见谅,放下别看
了。
 
 
程序就是一系列按步骤进行的操作序列,它有好多种级别,比如最低级的微程序、次低
级的汇编程序、高级的各种编程语言程序、最高级的脚本语言程序,也许我列的不对,
但没关系,我要说的是不管是那个级别的程序,其本质都是操作的逻辑序列。大多数系
统和应用程序都是建立在高级编程语言上的,比如C、C++、C#、 FORTRAN、BISIC、JA
VA等等,就让我们只关注这一级的编程能力吧。因此如果一个程序员的逻辑能力不高,
他永远都不能成为一名具有合格职业水准的程序员,我们在下面的讨论有关编程能力的
方方面面,最终都是为了最大程度地提高和实现一名程序员的逻辑能力。
 
 
一、掌握基础知识:十六年寒窗的持续积累
 
从 7岁读小学起,经过16年的学习,你从软件专业本科毕业后,必须完成以下几门专业
课程的学习:计算机组成、操作系统原理、汇编语言、数据结构、编译原理、数据库原
理、软件工程、结构性设计语言(PASCAL、C)、面向对象设计语言(C++、C#)、计算机
网络等,你最好还懂一些算法分析、分布式系统、计算机图形学、形式逻辑、人工智能
原理、软件设计模式、软件构架/框架等研究生的课程,16年来,你积累的除了知识,更
重要的是形成最适合自己的学习方法和工作方法。这些是你具备程序员职业水准的基础
能力,不要受什么计算机软件怪杰之类传奇的影响,那不过是小概率事件,而且这些怪
杰们就算没有读过软件本科和研究生,也往往自学了大多数专业课程,很可能比在校学
习的学生对这些课程的精髓部分理解的更好,还有他们的工作方法和思维方式是特别而
高效的,但普遍性差,可以借鉴,不宜模仿。好,所以现在你只需要问问自己,那些课
程和知识都学会并掌握了吗?如果是,那就准备好进行实践了。
 
 
二、在实践中提高:成为一名高水平的Coder
 
好了,你毕业了,在校功课都不错,也找了一个专业对口的工作,你想大展鸿图了,可
是别急,你的翅膀还不够硬,不信我们说来看看。
 
通常,你在工作中都会用到某一种单位/公司固定的操作系统和编程语言开发环境,比如
Windows、UNIX、LINUX等操作系统,又比如用VC、VB、 PB、Delph、JAVA、Motif/XWin
dow、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了,然而你需要进一步登堂入室才能成为一名
真正的程序员。
 
让我们继续吧,通常你都是从精通一种编程环境开始的,假设你已经较为精通在Window
s下用VC开发软件了,这时在技术和技巧方面你将面临一小一大两个挑战,第一个小挑战
是如果公司/单位改换了开发环境,比如用LINUX下的QT交互语言工具进行开发,你不过
是把前面掌握VC的过程再来一遍,由于在主观上经历了VC工具的学习过程,在客观上各
种开发环境都有太多相似的方面,这回你掌握的应该较快。要小心,在这时第一次诱惑
之门打开了,因为你感觉良好,看!这回这么快,我就这么好地掌握了新的开发环境,
你开始关注其它暂时还用不到的同类环境,比如VB、Delph、JAVA,如饥似渴地掌握各种
开发工具,证明自己的学习能力和价值,但你忘了一点,你仍然是个Coder,只不过是一
个在好多开发环境下都能编程的Coder,就像你生活在中国,因而精通了汉语,工作需要
你又掌握了英语,然后你就来了劲,把俄语、日语、阿拉伯语、拉丁语,等等等等,都
学习个遍,我只能说,有点BT。你忘了自己是个职业人,同一类的东西工作中用得到才
需学习,太多太多的Coder们喜欢在一起比较和炫耀自己会掌握了几种开发工具,不信你
看看招聘时的求职书就知道了,sigh!他们中绝大多数人永远都只能停留在这个层次上
,心浮气躁,一生都再也当不成真正的程序员了。总结一下,其实你在这时需要的是对
自己掌握新开发环境的能力的自信,而不是一遍遍地重复来证明自己。第二个大挑战就
是你明白了只掌握VC是不够的,你发现自己有点浅薄,有很多东东你会用但你不太懂,
很多方面支持VC编程的知识你都没掌握,比如操作系统的源码、网络协议知识、Window
s 的注册表、进程和线程的基础知识、硬件驱动方面的知识、ActiveX、Windows 庞大的
 API,又是一个等等等等,这些基础知识的学习和掌握可是要花费大量时间的,你再一
次深切地感到时间太不够用了,因为这时的你大概有许多俗务缠身了,所以有点沮丧,
还不用提IT业每天不知有多少新东西在发布,KAO,永远都跟不上,越拉越远了。哎!别
气馁,振作一点,你还是忘记了自己是个职业人,既然好多东东在工作中你永远都没机
会用,那么干嘛要学呢?用什么才学什么,最多预测到马上要用什么,先一步学什么好
了,要知道没有人是真正的、无所不精的全科大夫,除非你是神,但如果你还在耐着性
子看这篇文章,你肯定是个人嘛。
 
OK,一般工作后三五年,你经历了上述过程,经受了诱惑和考验,终于明白了一个道理
:你要的是强劲的学习知识的能力,是对某种软件知识/技能的有深度的精通,一种摸到
它的根的深度,而不是已掌握的技能的种类和数量。这时无论谁用他掌握了多少种你不
会的技能来吓唬你都没用,你对他的层次只有蔑视。通过几年的学习和工作,要记住最
重要的一点,永远最重要:对自己学习IT知识能力的自信,一个程序员一生都要不停地
进行高强度的学习,用心问问自己,有没有这个自信?别用虚荣心来骗自己哦,如果没
有的话,那就不必花费你宝贵的时间向下看了,作者在此感谢你有耐心看到这里,现在
建议你关闭这篇文章,趁着年轻,当机立断转行吧!
 
三、注重逻辑:成为一名职业程序员
 
好,再前进一点点,你就要成为一名职业程序员了,让我们继续来完成这个任务吧!我
们在前一节提到过,“你发现一些个别的demo是极品,它所展现的程序逻辑结构是你设
计不出来的,你现在有点更关心它的程序设计构架,甚于对你原始目的(某种相关的技术
/技巧)的关注”,其实你是在关注这个demo程序作者的思维逻辑,所有程序的本质就是
逻辑。技术你已经较好地掌握了,但只有完成逻辑能力的提高,你才能成为一名职业程
序员。打一个比方吧,你会十八般武艺,刀枪棍棒都很精通,但就是力气不够,所以永
远都上不了战场,这个力气对程序员而言就是逻辑能力(其本质是一个人的数学修养,注
意,不是数学知识)。逻辑能力也是逐步提高的,开始时你一定是用直观的逻辑能力来编
程的,怎么想就怎么编,不对就再改,在改进中提高自己的逻辑能力,从直观逻辑能力
提高到抽象逻辑能力,这是很正常的。提前说一句吧,到达逻辑能力的至高境界,其表
现是用数学语言来描述问题和问题的解决办法,高度抽象!好,说回来吧,你要提高逻
辑能力,最快的办法就是读别人写的结构优秀的程序。优秀的代码是百读不厌的(这句话
是我抄来的),暂时放放对其中某种技术和技巧的关注吧,你要推导和学习的是这些好程
序的逻辑结构,它们是被精心设计出来的。你可以先捂住这个demo程序,自己设计一个
功能相同的程序结构,然后比较一下demo的程序结构,如果差距较大,那你就不应简单
地改进一下,而是要把demo作者设计的过程在心里复原一遍,做到这一点也许有点困难
,但这种事干的多了,你就会越干越快,越来越得心应手,你的逻辑能力飞速提升,你
能看得上的逻辑结构优秀的程序开始不多了,下一步就是练习。从工作中开始吧,如果
你有空闲,你需要做至少两类练习,一类是算法练习,所有的经典算法都是经典的逻辑
,题目有的是,像个好学生一样吧,每年的国内国际编程竞赛都有逻辑要求非常高的题
,你可以只选一两道难题来做做。当你可以把复杂的单递归程序(只有A调A)变成非递归
程序时,已经不错了,如果你能看得懂双递归程序(A调A、A调B、B调A、B调B都有),我
为你鼓掌!你不必往下看了,我有点不好意思啦――班门弄斧,你快滚蛋吧!另一类是
把以前和当前你工作中你不满意的程序推倒重新设计一遍,这非常重要,省时省力,因
为你熟悉需求,技术上也没问题,目的就是改进程序的逻辑结构,很划算哦,唯一要克
服的就是:你对推翻以前工作中那点小小成就的心理障碍,如果你真想优秀,说句粗话
:这点心理障碍算个屁,一遍遍反复地推倒已有的成果只能使自己快速进步,放手干吧
,没什么好可惜的,马恩早就在《共.产.党宣言》里说过了:在这个过程中,你失去的
只有锁链(禁锢你思想的锁链)。
 
让我们来总结一下,经过自我否定后,再生的你尽管对过去的“业绩”还有一些眷恋,
但已是一个初步具备职业水准的程序员了,掌握了相应的技术和技巧,具备了较高的抽
象逻辑思维能力,最主要的特征是:能自觉地自我否定,不断地追求更高水平的逻辑能
力。
 
在这个过程中,如果你能注意以下一些小的方面,你前进的步伐也许会快一些。
 
l         从编译原理的角度来理解你工作中使用的高级语言,如果你做到这一点,至
少有两个好处,第一个好处是避免一大堆低水平重复出现的编译错误。一名优秀的 Cod
er平均在一个工作日中应该完成200行以上的源码,其编译错误应该控制在5个以下,要
知道这200行源码不是一次完成的,所以大多数情况下你都要追求一次编译通过,而一名
职业水准的程序员,应该进一步做到即使用purify这类的工具来检查源码,也不会存在
严重的内存泄露。第二个好处是可以提高源码的可读性和效率。规范地编写你的代码使
你自己的逻辑清晰,因为你明白多加几个括号和空行、多换行对齐、多注释,编译器是
会自动识别的,不影响程序执行的效率,反过来,控制好递归调用和循环内的if语句才
是提高程序效率的关键,要全力避免递归,但要深刻理解递归,能通过自己建立堆栈来
把递归程序转换成非递归程序,要求还是较高的哦!
 
l         避免思维陷阱,只要你是人就一定有自己的思维惯性,这一定又会表现在你
的程序逻辑中,有时你就是从这个惯性中跳不出来(谁都有这个时候),但要心里有数才
行,所以你需要帮助,如果你有几个水平相若或更高的职业伙伴,太好了,当遇到花30
分钟还打不下的bug时,就别浪费时间了,找他们吧,最要紧的是能思路清晰明确地表述
你的问题,通常你自己在这个过程中或者伙伴中就有人把问题解决了,又快又好。另外
,有几个可以良性竞争的职业伙伴是人生的一件幸事,1+1>2,大家各有所长,你最好做
到及时公开你的成果,技不压身嘛,IT发展的这么快,你再优秀,那点东东也没有什么
值得隐藏的,所以你可以技术或水平不够高,但千万不可以让真正具有职业水准的选手
鄙视你的职业品质和行为。
 
l         有自己debug的特点,下面的说法作者不敢太肯定,只是经验之谈。即使在V
C这种高度完善的开放环境下,你仍然应该要求自己仅凭打印语句就能 debug。这也有两
点好处,第一个好处是,遇到bug你会认真想问题所在,而不是用debug工具一步步简单
地追踪卡在哪儿了,你定位bug范围的方式是从大到小、从粗到精,这是一种自顶向下的
思维方式,而用工具追踪,容易形成自底向上的思维方式,这不算好,你应该先看到森
林,再看到树木。我反复提及:程序就是逻辑过程,大多数程序从main函数开始,是由
数据结构和功能子程序组成的一个树形结构的逻辑过程(要认清即使是面向对象的程序语
言也是一样的),它的执行过程是深度优先的,但你定位bug应该是广度优先的,好好想
想这一点,嗯?第二个好处是强迫你思考并记住而不是用工具看到调用过程,你大脑的
抽象逻辑思维能力和胳膊上肌肉的力量一样,都是练出来的,如果你的bug是程序结构上
的逻辑错误引起的,这一点就非常重要了,顺便说一句,最难打的 bug就是程序逻辑结
构错误导致的bug。你要是真正明明白白地认识到这儿了,那我就没什么东西可以告诉你
了。总之,程序员的职业水准:生产效率和程序质量,主要是取决于源码中bug的数量和
debug的速度,而不是取决于编写源码的速度。给你一个我自己定义的考查一个职业程序
员的指标:一个合格水准的职业程序员,编程的时间如果算一份的话,其累计debug的时
间不能超过一份,真正职业高手累计debug的时间应该控制在0.5份以下,如何?你关上
门悄悄问问自己,你花费在编程和debug上的时间比例是多少?如果你把程序员作为自己
一生的职业,那么就永远都要牢记一点:追求做一个0 bug的优秀程序员!这是任何一个
想成为职业程序员的人的理想,请相信:坚忍不拔地追求实现这个理想将让你出类拔萃

 
l         做好程序的单元测试,这是另一项考查你是否是一名具有合格职业水准的程
序员的一个必要指标。其实在你拿到需求的时候就要准备单元测试用例了,并且这些用
例将直接影响你的详细设计(有关软件设计本来是该放在第四节讲的)。我们还是打比方
吧,当你拿到一个需求时,除了分析它静态的功能外,还应明确它动态的操作 /执行过
程,把这个动态过程明确地用流程图画出来,比如分为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!,用周星星的话说:是高手之高高手,因为别人看
不出你高在哪儿,没见你有什么高招或特拚命干,但反正你就是干得又快又好、又省力
。关于进行单元测试还有很多复杂的方法,在此本文只提到了最基本的一点,目的是让
你在工作上考虑周全、安排有序,其它的自己琢磨吧,没有人能替你吃饱饭!
 
l         如果你是用C++编程,我再简单谈谈有关内层释放的一个小技巧,就是对所
有你编写的类,在构造和析构函数中加打印语句,统计每个类在运行程序时构造和析构
的地方,如果是配对的,那么起码没有对象类一级的内层在程序运行结束时没有释放,
然后你就可以把打印语句删掉了,招数虽土,但管用!
 
l         还有其它一些好习惯,在这里我随笔写一些,你要是有不同看法也请一笑过
之吧。编程时应该对齐缩进,一个缩进用一个tab键,一般是4个空格,严格遵守开发团
队的编程规范也是非常重要的。一个子程序不应超过30行(不算空行),其内多重循环不
应超过3层,否则都应该分裂成两个子程序,个别算法程序可以长一些,但也不宜超过2
00行。通常一个类的所有成员函数总和不宜超过1500行,多了就应该考虑分解成两个类
(这个工作最好在设计时就完成)。每完成一小段程序,比如15~30行,就立即编译运行
,不要假装高手,先敲它一大堆程序,再编译运行,妄想一次成功,体验一种假爽的、
虚荣的快感,或炫耀给别人看,这么做只能证明自己是一个不折不扣的傻瓜,装酷而已
。因为只要有一次不成功,你就会花费大量的时间来调程序,别人的进度在这时就远远
地超过你了,平常心是道,还是修炼真功夫吧!孙子兵法里关于这一点有明确的阐述,
我就不引用了,但建议你真的不要这么干,除非你确实就是这样总是一次就成功的天才
,那你还看这篇文章干什么呢?我又不是写给你们这些天才们看的。再就是有学会买好
书、读好书,关于计算机和软件方面的书太多了,时间有限,比如有一个叫侯捷的家伙
,几乎写的每本书都不错,张国峰的C++编程也不错,这只是我的个人意见啊,好书多
着呢,列出来比这篇文章长好多倍,我就不多说了。还有一招,要是你运气好,能搞到
一些著名软件系统的源码,好好读读吧,在此我只能告诉你,Linux操作系统的一些源码
不错,是开放的,你可以合法地搞到,其它的不要说是我建议你侵犯知识版权啊!
 
四、天生神力:成为系统分析员
 
本来就论述如何成为一名职业程序员而言,本文已基本完成任务了,但《菜根谭》有言
:竭世机枢,似一滴投于巨壑,穷诸玄辩,若一毫置于太虚。既已乘兴到此,何妨多置
一毫于太虚呢,作者不才,干脆尽兴写算了。
 
你要是运气好,直接进入了一个严格规范生产的软件企业就业,刚开始就应该是按别人
做好的软件设计来实现编程,你可以有机会直接学习软件设计,当你积累的足够多了,
能够对其中的一些设计提出好的改进建议,而且干得又快又好,就会渐渐地展露头角,
我相信你终有一天成为一名软件设计人员(注意,不是软件产品设计人员),步入系统分
析员的行列,但这还需其它的一些条件和自我修炼。如果你在一个不规范的软件企业工
作,那也不错,你很可能直接就有机会进行软件设计,然后开发、测试,甚至还不得不
自己定义需求,把软件开发过程的各个环节走一个遍,当然这样对你的要求更高,而且
你也不容易得到及时有益的指点,在正态分布的情况下,你应该是成长的很慢。但不管
就业的单位如何,如果你决心要成为顶尖软件职业选手,通常什么客观困难都阻挡不了
你,然而你个人的因素可能会阻止你的前进。下面提出的观点纯属一己之见,伤人自尊
之处作者在此提前道歉,并建议你除非对本文有强烈的兴趣,否则就请直接看第五节或
放下别看了。丑话已说在前头了,在各种软件开发组织的发展过程中的事实也证明,只
有少数程序员能成为系统分析员,我想这一点不是我杜撰的吧,因此你要是在看接下来
的部分时感到气愤难当,那也实在没着,纯属活该,因为作者只是在说明自己的观点而
已,你最多可以呲之以鼻,表示一下你的轻蔑好了,但没有任何理由可以骂人!
 
作者自己没有到微软面试过,但身处软件行业,关于微软的许多东东当然还是有耳闻的
,据说微软招聘一名程序员要过五个已经成为微软程序员的面试关,而且是一票否决制
,又据说大多数面试题并非编程,而是一些有关逻辑和智力的题,作者私下也做过许多
流传的微软面试题,并对此做法深以为然。程序的本质就是逻辑,所以几十年前就有人
提出编程是一门艺术,而艺术是要靠天份的,这一点少有人反对。一个人的逻辑能力可
以不断提高,但其能到达的终极逻辑能力的层次必定为其天生智力所限制,这一点就让
人不易接受了。好笑啊!人们可以公开承认自己没有某种或全部的艺术天份,但要说自
己逻辑天份不够,换句话说承认自己笨、IQ不够高,往往是要怒发冲冠的,其实这又有
什么区别呢?话都说到这儿了,再次建议你如果不够自信,就跳过这一节吧,直接看第
五节,好吗?
 
好了,把话题说回来,你已经成为一门合格的职业程序员了,如果要想成为从事软件系
统设计的职业系统分析员,第一件事就是悄悄找一个标准智商测试的网站或其它渠道,
严格认真的测一测自己的智商,如果IQ低于130 (正常智商是110),就请别费劲了,打消
掉成为系统分析员的念头吧!好!好!先请你冷静一下,好好想想,其实微软面试时就
是在测你的智商和逻辑数学素质呢,这就是本节的标题为“天生神力”的原因,因为设
计就是从无到有地进行创造,无论是软件还是其它行业都一样,可以有借鉴的,没有现
成的,设计就是创造!如果你IQ在130以上,又决心要当一名职业软件系统分析员,其实
你不过是要准备好吃更大的苦而已,有什么好虚荣的呢?
 
修炼还是从基本功开始的,过程和成为一名职业程序员差不多。必须使用设计工具这一
点是不用多说的。在工作中,你基本上遇到的是两类方式的设计,一个是结构化设计,
另一个是面向对象设计,就个人经验而言,面向对象的设计更好。如果你工作中不得不
采用结构化的设计,你必须熟练地掌握数据流图和控制流图的分析和设计,一般来讲,
如果你把一个软件中用到的数据模型设计好了,针对功能化的流程,不难设计出数据流
图,但下一步设计控制流图才是挑战,如果你按照需求走不通设计好的控制流图,那么
你或别人在按照这个设计编程实现时,必定也走不通,没有奇迹会发生,还是在设计阶
段严格要求吧,又有一点需要牢记:返工是最慢的。当你在进行控制流图的设计时,也
不要妄想得到需求人员提供给你明确的指点,通常他们要是能够把需求的功能和操作次
序写完整的话,你应该就感恩戴德了,从需求中整理出功能、操作的拓扑次序和条件是
你作为系统分析员的职责。看看,要是没有一点图论的基础和拓扑学的入门知识,你是
当不好一个职业系统分析员的,即使你天赋不错,必要的数学和逻辑素质仍然不可或缺
。也不用气馁,永远没有最好的设计,只有更好的设计,反复地进行设计迭代,勇于推
翻旧的设计,你将快速进步。如果你在工作中是采用面向对象进行设计的,那就更有利
了,有关面向对象设计的书太多了,不用作者在此多费口舌,建议精读一本经典的书,
比如北大邵维忠等编译的《面向对象的分析》,有些方法和技巧可能过时,但其逻辑的
基本原理是非常正确的,其本质是,你在逻辑上是如何认识这个世界的,你就是如何设
计软件体系结构的,然后读读其它书,触类旁通,自己创造机会多实践,成功自然会到
来的,总之,不管是结构化设计还是面向对象设计,评价一下自己的软件系统设计方案
吧,有好多指标呢,比如是否均匀和平衡?局部独立性强不强?有没有歧异的结构?有
没有层次太多或太少?有没有某个层次太大、太广?是不是逻辑结构先复杂了再化简的
?还是只会设计简单的,复杂不起来(这一点是笨哦,如果出现多次,请你不要意气用事
,转行吧)?最重要的一点,是否容易理解、实现和改进?你自己会得出评价的。如果有
机会看到别人的设计,一定不要错过学习的机会,自己推导一遍,认真比较比较,获益
会较多。
 
走到这一步,你就应该关注设计模式了,首先还是学习,这方面的好书有的是,但一般
在工作中用到的设计模式较为单一,应该多尝试一下其它的设计模式。其次必须要明白
设计模式不是设计思路,也不能代替设计思路,比方你要从A到B修一条路,设计模式只
是让你选择,是修水泥的还是柏油的?是高架路还是普通的,但线路必须你自己定,而
线路就是设计思路,模式对思路是有影响,但不能代替,所以如果你的智商高达250,我
相信你直接用汇编语言也能写出面向对象的程序来。第三在此有一个陷阱,很多系统分
析员生搬硬套设计模式,全然不懂如何融会贯通,在你的一项具体工作中,往往是以一
种设计模式为主,其它模式为辅的,思维不拘泥于形式才是关键,而且也为你到达更高
的软件设计的境界做好准备。
 
唉!都不知该怎么向下写好了,因为已达到作者水平的极限了,我胡乱说一点,你凑合
看吧。软件设计最终的层次是:以无法为有法、以无限为有限,这句话是李小龙说的,
不是我说的。再拾人牙慧一把,类比一个故事吧,金大侠在《倚天屠龙记》里讲到张无
忌初学太极,学会的标志是把刚学的招数全忘了,记住的是太极的道理和精神,和李小
龙有些相似喔,软件设计也一样,忘记所有的设计模式,随心所欲进行设计才是至高境
界,所以你能到达多高的软件设计的境界最终将取决于你的哲学素质,这一点实在是不
好写啊,你自己领悟吧!作者只有祝福了!
 
五、职业人的终极目标:全面修炼,成为Leader
 
这一节更不好写,涉及到太多其它非技术方面的因素,特别是个人人生观和世界观的修
炼,如果本帖的点击率超过作者私下期望的一个数值,那我就争取尽力厚着脸皮再补上
吧。我只说一句,虽然大家都知道软件开发是一个团队性的工作,但追求参与一个大型
软件系统的成功开发,是一名软件人员的本能,就像拿破仑说的不想当元帅的士兵不是
好士兵,所以不追求实现大系统的软件人员,也不是一个好的职业软件人员,但你只有
成为Leader,领导一个优秀的软件开发团队,才有机会实现这个终极职业目标,对不对

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

分享到:
评论

相关推荐

    修炼一名程序员的职业水准(林庆忠__署名原创)

    作者:林庆忠,1990年毕业于昆明工学院计算机软件专业,后又于1999年毕业在南京大学完成软件工程专业硕士的学习,现供职于CNPC旗下的一个行业软件研发中心,

    编程学习指南 编程“初学者”入门指南

    一部很好的学习编程的书籍 编程“初学者”入门指南 2 各种计算机语言的经典书籍 8 怎样成为优秀的软件模型设计者...修炼一名程序员的职业水准(林庆忠__署名原创) 21 计算机科学与技术学习反思录 28 计算机经典书籍 44

    Toxi / Oxy Pro 便携式气体检测仪参考手册 使用说明书

    Toxi Oxy Pro 便携式气体检测仪参考手册 使用说明书

    科傻模拟网优化操作-教程书

    官方的的说明书资料,部分视频说明在这里: https://www.bilibili.com/video/BV1Fz4y1d7rn/?spm_id_from=333.999.0.0&vd_source=13dc65dbb4ac9127d9af36e7b281220e

    node-v8.14.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2023商业银行数据资产体系白皮书,主要介绍了“三位一体”数据资产体系的构成与工作机制,以及商业银行数据资产体系建设实践

    2023商业银行数据资产体系白皮书 目录 第 1 章 数据资产化与数据要素市场化相辅相成,相互促进 第 2 章 数据资产化是企业数据治理向上演进的必经之路 第 3 章 数据资产体系发展概述 第 4 章 “三位一体”数据资产体系的构思 4.1“三位一体”数据资产体系的构成与工作机制 数据资产管理 数据资产运营 数据资产评价 数据资产体系工作机制 4.2“三位一体”数据资产体系的相互作用关系 4.3“三位一体”数据资产体系的构建 4.4“三位一体”数据资产体系的优势 第 5 章 商业银行数据资产体系建设实践 5.1商业银行开展数据资产体系建设的背景和目标 5.2商业银行数据资产体系建设的工作步骤 5.3上海银行数据资产体系建设实践的主要成果 第 6 章 数据要素流通市场赋能企业数据资产化 6.1全国多层次数据要素市场的建设 6.2上海数据交易所赋能企业数据资产化 6.3数据要素流通交易市场赋能企业数据资产化的展望 第 7 章 未来演进与展望

    基于微信小程序的助农扶贫小程序

    大学生毕业设计、大学生课程设计作业

    车辆销售数据Python爬取并做数据分析,项目源码注解清晰一看就懂.zip

    车辆销售数据Python爬取并做数据分析,项目源码注解清晰一看就懂

    毕业设计:基于SSM的mysql-学生社团管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_学生社团管理系统(源码 + 数据库 + 说明文档) 第2章 主要技术和工具介绍 1 2.1 JSP语言 1 2.2 MySQL数据库 1 2.3 jsp技术 2 2.4ssm简介 3 第3章 系统分析 1 3.1可行性分析 1 3.1.1经济可行性 1 3.1.2技术可行性 1 3.1.3操作可行性 1 3.2需求分析 1 3.3业务流程分析 2 3.4数据流程分析 3 第4章 系统设计 5 4.1系统结构设计 5 4.2功能模块设计 5 4.3数据库设计 6 4.3.1数据库设计概述 6 4.3.1概念设计 6 4.3.2表设计 7 第5章 系统实现 15 5.1基本任务 15 5.2登录模块的实现 15 5.2.1首页实现 15 5.2.2管理员后台登录 16 5.3用户模块的实现 19 5.3.1注册模块及登录的实现 19 5.2.2入团模块的实现 21 5.2.3场地预约模块的实现 22 5.4管理员模块的实现 24 5.4.1系统用户管理模块的实现 24 5.4.2活动公告管理模块的实现 26 5.5社团模块的实现 28 5.5.1活动信息

    大健康零售业务O2O数字化战略规划方案.pptx

    大健康零售业务O2O数字化战略规划方案.pptx

    数据中台项目主要岗位及其职责和任务

    数据中台项目主要岗位及其职责和任务

    node-v8.0.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    流程制造行业数字化智能工厂总体规划建设方案.pptx

    流程制造行业数字化智能工厂总体规划建设方案.pptx

    c语言学生成绩管理系统源码.zip

    c语言学生成绩管理系统源码.zip

    DEV-C++-5.11下载链接

    DEV-C++-5.11下载链接

    电器租赁小程序.zip

    电器租赁小程序.zip

    知乎小程序算法.zip

    知乎小程序算法.zip

    基于R语言SIR传染病传播的SIR模型,很全,可直接应用仿真模拟.rar

    基于R语言SIR传染病传播的SIR模型,很全,可直接应用仿真模拟.rar

    node-v6.13.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics