换个姿势学C语言
上QQ阅读APP看书,第一时间看更新

1.3 明确“外汇牌价看板”程序的设计目标

理解要解决的问题是解决问题的第1步。在普通人看来“外汇牌价看板”是一个很简单的程序,但作为它的设计者和实现者则需要了解更多相关的业务知识以及用户的需求,这项工作被称为“需求分析”;需求分析是否成功决定了软件开发的成败。

需求分析是一项需要理解业务需求并和用户反复沟通才能完成的工作。很多程序员认为只要掌握最先进的编程技术就可以了,不愿意与用户沟通,回避需求分析的环节或者敷衍了事;或者总是在第1次与用户交流时就在思考用什么语言、框架或数据库来完成系统,盲目地相信自己能做出用户满意的软件。但这种情形下做出的软件系统往往不能满足用户的需求,再加上有些不负责任的销售人员给客户承诺了一个根本不可能实现的工期,导致程序设计人员在多方压力下很快进入设计和开发阶段,最终“成功”地做出了一个客户不接受的软件系统。导致在交付项目以后反复加班修改,甚至项目失败。

另一个方面,需求分析不准确的责任也不全在软件工程师身上。因为很多时候客户自己也不清楚想要什么,这听上去很荒谬但事实经常如此,很多客户只有在看到产品后才能更精确地知道自己要什么,因此总是在开发基本完成时提出一些意见,这在软件开发领域有一个词叫做“需求变更”,所有人(除了客户)都很痛恨它却又无法避免。必须要说明的是——需求变更是一种非常正常的现象,所以在制订项目计划时要将需求变更考虑进去;同时还要采用一些手段尽可能深入地与客户反复确认他们的需求。

从开发者的角度进行需求变更不一定是坏事,因为很多客户是愿意为需求变更付钱并增加额外的工期。但如果事先没有对客户需求进行详细的调研和反复确认,也没有任何文档来说明客户需求,当需求变更时将无法证明客户需求和以前不一样,就只能为自己犯下的错误买单——在工期和经费不增加的情况下加班加点满足客户的新需求。

1.3.1 什么是“外汇牌价看板”

外国货币在大多数国家中是不可以在本国市场上流通的。如果人们手里有外币想在本国花掉,需要去银行把它兑换成本国货币,这个过程称为“结汇”;反过来,如果人们出国需要携带外币,就需要去银行办理“购汇”,用手中的本国货币兑换外币。

结汇与购汇业务一般是在银行进行的,所以在银行的大厅里一般都会有一个显示着各种外汇兑换比率(汇率)的显示屏。图1-1就是银行大厅中的外汇牌价看板。

图1-1 外汇牌价看板

本书中的实战案例将要实现的就是一个运行在计算机上的“外汇牌价看板”程序。如果你之前没有接触过购汇和结汇,会不明白这里的外汇买入价、现钞买入价、外汇卖出价的含义。除此以外,你会发现在同一时间不同银行的外汇牌价表上同种货币的价格是不一样的,这又是为什么?

1.人民币汇率

无论是结汇还是购汇,兑换的比率都与汇率密切相关。汇率是指不同国家货币相互兑换的比率,这个比率不是两国政府坐下来开会协商决定的(那非得打起来),而一般是由外汇市场的供需关系决定的,通俗地说就是“行情”。具体而言,中国境内的银行结汇与购汇时采用的汇率是各家银行参考每天上午9时15分中国外汇交易中心公布的“在岸人民币汇率”,结合本行的具体情况确定的。

中国外汇交易中心是如何决定“在岸人民币汇率”的呢?每天上午中国外汇交易中心会要求所有的“做市商”报价,“做市商”包括商业银行和中央银行(中国人民银行),他们根据多方面的因素向外汇交易中心报出愿意交易的人民币兑美元的价格。中国外汇交易中心将他们的报价去掉最高和最低报价后,对剩余的报价进行加权平均计算,得到当日人民币兑美元的“汇率中间价”(例如,1美元兑换6.77元人民币)。

但是,只得到人民币兑美元的汇率是不够的,其他国家的货币和人民币的汇率如何确定呢?因为美元是国际货币,所以在确定了人民币兑美元的汇率中间价后,结合当天上午9时国际外汇市场美元兑其他外币的价格,就可以套算出人民币兑其他外币的汇率了。

所以,每个工作日上午9时15分左右,中国外汇交易中心就会公布当天人民币兑各种外币的汇率中间价,也就是前面提到的“在岸人民币汇率”。

2.汇率与银行牌价

然而人们到银行去办理外币兑换业务时银行采用的汇率往往不是当天中国外汇交易中心公布的汇率中间价,因为银行有权根据中间价在许可的范围内上下浮动(因为银行也要赚钱)。

银行的兑换价格被显示在银行大厅的牌子上,所以人们称它为“外汇牌价”。在几年以前,银行的外币牌价是“一日一价”,而随着信息传递的快捷,很多银行开始实行“一日多价”。同样拿100美元兑换成人民币,排队的次序先后可能导致兑换的人民币数量不一样。

不同银行的外汇牌价通常显示在大厅里的外汇牌价显示屏上,例如在2020年10月6日13时18分,中国银行(以下简称为“中行”)和招商银行人民币兑美元的牌价如表1-1所示。

表1-1 中行和招商银行外汇牌价

为什么会有四个价格?在这里有“买入”和“卖出”的区别,“现钞”和“现汇”的区别。

1)买入和卖出

外汇牌价上的“买入”和“卖出”是从银行角度来定义的,人们用100美元兑换人民币,在银行看来是“买入”外币,而人们用人民币兑换美元在银行看来则是“卖出”外币。

无论现钞还是现汇,卖出的价格一般高于买入的价格。

2)现钞与现汇

在银行看来,同样是100美元,“”和“”是不同的概念。

”是指现金,是实物,银行要为它付出保管和运输的成本;而“”则不同,它只须在银行的计算机交易系统内记录就可以了,银行因此付出的成本要低一些。银行会根据自己的成本来决定“”和“”的不同价格。

例如,在2020年10月6日13时18分用100美元现钞在中行可以兑换到672.21元人民币,此时如果你在海外的朋友或客户向你的外币账户汇款的100美元,银行会记作“美元现汇”,你把它兑换成人民币会得到677.72元,会存在差额。

这就是“”和“”的不同。

思考

现在,你可以看懂外汇牌价了吗?

如果你手里有10 000美元现金,按照表1-1的牌价去哪家银行兑换人民币会比较多呢?差额是多少?

1.3.2 通过需求会议确定软件功能要求

在学习了外币牌价的基础业务知识以后,开发人员就可以与客户沟通具体的产品需求了。沟通的内容包括:

· 了解、理解甚至修改(优化)客户原有的业务流程;

· 与客户一起讨论他们提出的需求合理性、可行性和可能的解决方案;

· 与客户一起讨论是否还有未考虑到的合理需求(需求挖掘);

· 用文档、图表来描述客户需求并和客户确认。

这个过程往往很漫长,所有的客户都会认为他们需要的软件功能很简单。一方面是因为他们精通自己业务领域的知识所以自然觉得简单;另一方面是他们不了解软件开发需要关心更多的细节问题。他们会说:“这个很简单的,把我行外汇牌价显示出来就可以了。”但实际上软件工程师要考虑下面的问题:

· 要显示哪些外币的汇率?

· 汇率数据从哪里获取?要求多长时间更新一次?

· 用于显示汇率数据的计算机和网络怎么连接?

· 用什么类型的显示器来显示外汇数据?

· 如果是专用显示器,它支持什么样的显示方式和分辨率?接口是怎样的?

· 如果是通用显示器(比如计算机屏幕、液晶电视机等),显示器分辨率是多少?是否要求自动适应不同的分辨率?

· 显示器的尺寸会有多大?安装在什么地方?

· 对显示汇率的字体、字号和颜色有要求吗?

· 是否要用不同的颜色表示买入、卖出价格?

· 是否要在货币名称前面加上货币发行国家(地区)的国旗(行政区区旗)图片?

· 汇率变动的历史记录是否要保存?保存多久?

作为新手,提不出这些问题是正常的,这需要经验的积累。当软件设计人员向客户代表提出这些问题时,有些他们能够立刻回答你,而有些问题他们则要“问下领导”;也有一些不太负责任的客户代表会含糊地说出一个意见并试图让你“先做出来看看”。这些不确定的回答会带来成本增加、工期延长等后果,也可能会导致最终交付的软件与客户需求大相径庭。如果没有提前预料到这些风险并且采取有效的方法来控制,最后几乎一定要通过加班来确保交货。

为了控制这种专业能力和责任心因素带来的不确定风险,召开需求分析会议并形成会议纪要是必要的。将需求讨论的结果用标准的会议纪要格式记录下来,在会后及时要求与会代表签字确认(有时也通过电子邮件确认),这种“凡事有据可查”的工作方式会让每一个队友都明确自己的职责,提高他们的责任心和需求分析的有效性,确保项目的顺利交付。

软件开发不是一个纯粹的技术工作,而是需要与人打交道的工作。软件工程师要关注和关心客户的感受,而不是只站在自己的角度,用自己的好恶去处理问题。需求调研也不是把客户的需求简单复述一遍就算是完成了,而是要主动学习客户的业务流程甚至商业模式。有经验的工程师能想到客户前面去,想到客户心里去,也可以提前感知将来可能出现的需求变更,减少项目需求变更的风险。

1.3.3 编写需求规格说明书

在经历了多次客户访谈和会议后,软件工程师可以基本明确客户对于软件系统的需求了,此时可以开始编写“需求规格说明书”。需求规格说明书有时候也被称作“需求文档”。编写需求规格说明书是为了使客户和软件开发者双方对该软件的范围、功能和性能要求有一个共同的理解和约定,它是整个开发工作的基础和契约。需求规格说明书应包含硬件、功能、性能、输入输出、接口需求、警示信息、保密安全、数据与数据库、文档和法规的要求等。

需求规格说明书的读者是客户或产品经理、项目经理、系统设计师、开发人员、测试人员、交互设计师、运营以及所有与项目相关的角色。在项目开发开始之前,必须要让需求规格说明书通过评审和确认。几乎所有初级程序员都反感与客户交流和编写文档,他们认为“Talk is cheap,show me the code(谈话是廉价的,代码才有意义)”,然而针对大型软件项目或者功能比较复杂的系统,规范地编写各种文档是必不可少的工作。对于软件工程师的个人发展来说,编写文档的能力也是至关重要的。

1.3.4 设计原型系统

软件工程师通过与客户的多次沟通,确定了要开发的“外汇牌价看板”的具体功能需求。然而,仅仅使用文字和语言来描述客户对软件的功能需求是不够的,因为同样的文字不同的人有不同的理解,并且文字也无法直观地描述软件的视觉和交互效果。

基于这样的原因,为了使客户、软件工程师能更直观地对软件功能、外观和交互效果进行确认,设计人员会采用“原型系统”的方式来制作一个软件的“模型”,在正式开始系统设计与编码之前就让客户和软件工程师看到软件最终运行的样子。它类似于各种工程建设中的效果图,在开工之前就让人们看到最终建成的效果。图1-2是设计好的“外汇牌价看板”程序运行效果图。

图1-2 “外汇牌价看板”运行效果图

原型图设计不是一蹴而就的,一般是产品经理先在纸张上绘制初稿(线框图),然后再使用专门的原型设计工具实现视觉效果或向客户展示交互效果。常用的原型设计工具包括Photoshop、Axure等,图1-2的运行效果图是用Photoshop设计出来的。

注意

即使是用于确认软件界面设计的原型图,也要尽量采用真实的数据。胡乱编造的数据放在界面上固然能减少设计时的工作量,但只有最大程度接近软件最终运行时的设计稿才会引起客户深入讨论软件需求的兴趣并提出有价值的意见。

因此,在设计原型图和演示系统时不要使用“货币名称A”“货币名称B”甚至“ASDF”“QWER”“1234”这样随意输入的文字。

在软件的各个界面原型图设计和通过评审后,很多初学者认为可以直接开始写代码了,但很快会发现因为“没有思路”而进行不下去。这是因为对系统实现缺乏总体的思考,对要做的事有哪些,怎么做,以及做这些事步骤和完成标准都不够明确。

因此,即使是初学者也要先进行“概要设计”工作,它有助于开发者找到开发系统的思路并有条不紊地开展工作。概要设计并不需要太多编程经验,因为“设计”和“实现”是两回事。举个例子,如果你要设计办公室装修方案,并不需要具备砌墙的技能。