软件设计师
这里的软件设计师是指软件公司以及企业单位从事软件开发的IT人员。他们所要开发的软件是指外部用户和企业内部用户两个方面。下面将不再特别区分这两种情况。
这段时间我一直在观察我周围的各种各样的软件设计师,也和他们进行了各种沟通,也谈过项目的总体构架,也谈过功能的具体实现。我不断地在观察他们所说所做的背后的原因,让我有更多的感慨。他们大都关注具体问题的如何解决,根本不注意问题的解决方法,不去注意自己的方法和别人的方法的不同之处,就事论事。就像很多中学生只关心试题的答案一样,不去深入掌握解决问题的方法,结果就造成做过的题会做,没做过的题不会做的状况,这样的学生如何能够获得稳定的好成绩呀。
感慨这么多,还是回到本次话题吧。我还是想换个思路,这次不是把软件设计师要思考的问题都罗列出来,而是要把如何写好这个话题的思路展示给大家,这个思路就一种解决问题的方法。掌握了这个方法我们就可以将这个话题写得更好。
1、 软件设计师要思考那些问题的范围
软件设计师要思考那些问题首先要确定思考的范围。这个思考范围是要对设计师是有用的,有重要作用的。那些无关紧要的内容,可以舍弃,我们必须突出重点。
从这个角度出发,我认为从软件制作周期内每个环节来讨论软件设计要思考的问题是比较合理和科学的。这里我强调了软件制作、周期、环节这三个重要的要点。很多人在考虑软件设计师要考虑问题时,立即会想到采用什么技术,某个功能怎么能具体实现这样的具体问题。如果,你要问他为啥这样想,他就会反问拿到这些问题不重要吗?不需要考虑吗?如果你回答不重要,他立即会讲出很多重要的理由,你回答重要,缺附和了他那种凌乱和具体的思维方式。
一个好的软件设计师应该闭上眼睛就能把他要思考的问题一个不漏的讲出来。这就说明了他掌握了那种职业的方法。如果他讲不出来,或者今天这样讲或明天那样讲说明他根本没有对这个问题有系统性的认知。对于这种软件设计师,你都可以闭上眼睛就可以知道他是如何走一步看一步的进行自己的设计的。
1) 软件制作
从软件制作这个方面来思考,表明了软件设计师的职业所然,是有明显的职业针对性的。如果我们从工资收入、人际关系等方面来思考问题,那就不仅仅是软件设计师了,其他的诸如项目经理、管理者、文秘等等都可能思考这些问题的。
2) 周期
软件制作是一个过程,也可以看作一个周期(相对于下一个项目)。软件设计师是这个过程的参与者,是全过程的参与者。因此,我们要站在软件制作的整个周期来思考些问题。而不是在这个过程中某一点来思考一些问题。很多设计师并没有软件制作的周期意识,只有别人问到他的时候,他才说这个他知道。其实他真的不知道。因为知道了,别人也不会问他了,知道了,也不会把思考点只集中诸如需求分析、方案设计上面了。
3) 环节
软件制作是一个周期,而且它是一个可以划分的。因此,软件制作就可以有各种各样的环节。无论这个环节怎么去划分,但是这些环节一定包含了软件制作的全过程。所以,环节和全部环节是我们必须要表达的。很多软件设计师并不在意软件制作的环节和全部的环节。还是那种自然主义思想,做到那边算那边。
我把软件制作分成10个环节: 1、需求 2、需求分析、3、软件构架设计 4、软件详细设计及文档 5、开发阶段 6、测试阶段 7、上线阶段 8、投产运行 9、用户反馈、10、日常维护。
面对这些环节,程序员都是有很多很多思考问题的。
2、 如何编写思考的问题
当我们明确了程序员思考的范围之后,我们就可以在这个范围内进行进一步的思考。比如我们面对需求这个环节,我们要去如何思考,我们面对软件设详细设计,我们要去如何思考。当我们掌握了这种思考方法后,我们就可以对其他环节进行更加有效的思考了。
一般的软件设计师并不关心思考方法,面对需求可能直观地想到了需求书、想到了功能;面对软件设计可能立即想到语言选择、采用什么技术、基本的算法。如果你去问他为啥要这样想,他又会同样的找出他说所讲的重要性。这种随想随说的思维方式和需要极强的逻辑性的软件设计师的职业特点是完全不符合的。
对于一个问题的思考每个人有每个思考方法,但是,这并不意味每种思考方法都是对的。判断对错的一个标准,就是思考的结果能够更好更快更科学地解决问题。这个“更”一般人都是和原来的自己比,也就是说通过思考自己比原来想的更好了。这样的“更”含金量价值不高。这个“更”应该和你周围的同伴相比,应该和你认为的高手相比。这样思考的结果才更有说服力。对于软件设计师来说这种思考的结果是必须的,不采用最好的思考结果,就不可能产生最好的软件。
对于软件设计师如何在某个环节的思考方法问题,我认为首先要明确这个环节的思考得目的,也就是说搞清楚为啥在这个环节要思考,不思考行吗?第二步把这个环节的有关思考的对象罗列出来,对象的颗粒度越细,思考的问题就越深入。第三步将思考的对象之间的关系以及程度罗列出来,第四步对这些对象和关系相互之间进行组合思考,第五步对每个思考加入自己的经验和其他人经验进行有效地验证,或进行有效的推论。第六步,对所有思考进行归纳得出思考的结论。
其中第一步是很重要的,它是你思考的基础和范围,如果你的对象在这个范围内收集的比较全,这样你的思考的全面性就得到了保证。在全面性基础上,我们才可以去考虑内容的合理性。
我们以需求这个环节为例,看看我们所要思考的问题。
首先我们要把需求环节思考的目标给明确起来:那就是软件设计师要对需求本身和需求环境有一个充分的了解,尤其是对需求的了解渠道和了解结果有一个充分了解了。只有对需求这个环节充分了解之后,我们才可能进入需求分析环节。否则,到了需求分析环节,你可能还要回到需求这个环节再次思考。
第二,将所有思考对象尽可能的罗列出来。例如,需求提出者、本人、其他需要掌握需求者、需求书、需求环境、时间要求。这些大类的对象还可以细分成很多小的对象,对象的颗粒度越细,思考的问题就越深入。例如,需求提出者的属性,提出者是单位,还是个人,提出者所在的企业、提出者所在的行业等。
第三、将对象之间的关系和关系程度进行罗列。例如,将需求书与本人之间对象的获取、阅读、理解、掌握罗列出来,对这些关系程度如:获取:没有问题、困难、暂时无法获取;阅读:完全阅读、不能全部阅读、无法阅读;理解:完全理解、部分理解、不理解;掌握:完全掌握、不完全掌握、不掌握等也罗列起来。
第四、第五、第六因篇幅问题我就不在举例了。
我就需求环节可以举出数以百计的问题来,我在这里随意地提出几个思考问题,并把思考这些问题的目的也进行了说明。
1、 提出项目的用户是什么企业事业单位?属于何种行业?其在行业中的地位如何?
问题的目的是要明确项目的分类,评估项目建成后项目的行业地位。强调行业是从行业的角度上来看待这个项目,以便这个项目可以归属到某个行业项目之中。或从某个行业项目之中获取相关需求经验。
2、 提出需求的用户是企业中的什么部门,是属于企业哪一类部门,生产业务部门?管理部门?办公部门?
问题的目的是明确项目的应用分类,是属于业务系统、MIS系统、办公系统。通过分类可以利用不同类型系统的规律对项目进行分析。
3、提出需求是软件公司自身吗?软件公司提出开发软件的原型需求的企业和部门是什么?
问题的目的是了解需求来源的渠道,如果是自身软件软件,渠道相对容易畅通,如果其他企业则要考虑渠道是否畅通问题。
4、用户提出需求的原因是什么?是因为企业产品业务发展的要求?是企业内部管理的要求?还是外部监管要求?是企业上级部门的要求,还是企业下级部门的要求?
其问题的目的是进一步了解需求的来源、了解需求的重要程度和紧迫程度,这对下面的各个环节都是十分重要的。
5、提出需求要解决什么问题?业务的流程的计算机化?产品生产的计算机化,减轻原来的手工操作、提高工作效率?满足上下级管理的要求?实现管理手段的信息化?原来的系统地升级改造?实现软件的商品化?
其问题的目的是进一步对项目进行分类,通过分类归属,可以按照所属归类进行不同的处理和分析。
6、需求是提出急迫吗?项目要求完成时间急迫吗?
其问题的目的是了解项目的紧迫性程度,不同的时间要求,可能决定不同的设计方案。
7、需求有完整的需求说明书吗?如果是外部强制要求,外部有相关文件和需求说明吗?
其问题的目的是了解项目需求书的是否存在,是否完整,相关外部需求能否获取。如果存在问题,则要考虑如何去解决这些问题。
8、当需求不完整的时候,用户能指定需求解释人员吗?
其问题的目的是能否建立面对面的沟通渠道,这个渠道能否满足对需求了解的要求。实践中指定的解释人员可能也不是能够解释通需求的。
9、根据以往经验初步判断,这个项目或软件是属于大项目?中项目?小项目?根据以往经验和开发队伍初步判断这个项目或软件是否有技术难点、这个难点能否克服、大概需要多长时间能够完成。
其目的对项目进行分类利用原有的开发经验对其作出初步的判断。
10、与之交流的用户属于什么类型?外向?内向?需求是否熟悉?表达是否清晰?是否有充足的时间?当无法与之交流的时候,是否可以请求换人或增加需求人员?
其问题是为项目的需求沟通做好各种准备工作,因为不同沟通对象会产生不同的沟通效果和效率,因此,要为有效的沟通进行充分的准备。
我可能在本文中过分强调软件设计师的思考方式了,这也是我感到无奈的地方。本文的题目可以改成“软件设计师应该如何思考问题”。软件设计师可以将数以百计的思考对象和数以十计的对象关系进行排列组合,那是怎么样的无穷无尽的思考话题呀。要思考的问题可以无穷无尽,而思考问题的方法却十分有限,我们真的可能要关注方法了,先方法后问题,也许我们可能收获更多。如果读者有兴趣按照软件制作十个环节,逐一地去思考每个环节中的目的、对象、关系、程度、组合、经验、结果,你就会发现软件设计的职业的思考范围之广之深之无限。可以这样说软件设计师的之间的差距首先是思考方式上的差距,然后是思考范围上的差距和思考内容上的差距。