精华内容
下载资源
问答
  • 目前高校在应对网络舆情方面存在对其建设重视程度不高、高校网站内容和教师教育队伍有待加强、网络信息处理和监管需提升等问题。针对存在的问题,高校应当采取重视网络舆情建设、丰富网站思想政治教育内容、加强高校...
  • 领导不重视也要干好,工作中可以看出个人的人品,保持一颗平常心,把思想用在求知上,新技术新知识需要去学习,抱怨,烦恼,你有了本事不用别人看你,你自然会发光!  我深有同感。我干了26年电工。从当年的...
      领导不重视也要干好,工作中可以看出个人的人品,保持一颗平常心,把思想用在求知上,新技术新知识需要去学习,不抱怨,不烦恼,你有了本事不用别人看你,你自然会发光!
    

        我深有同感。我干了26年电工。从当年的18个电工退休的退休,调走的调走,至今就剩下我一个人还在电工班外,其他就9个电工都是后来近几年招来的。大家来当初的想法一般是学门技术今后出门好打工找事做。可是干了一段时间后就不是这样了。发现一天到晚干的事都是体力活没多大技术含量,关键是工资也不高还压力山大。有技术含量的活不会叫你去总是那个别人的专属。这样耗下去看不到希望不会有前途。所以来了又走了,走了又招。进进出出不知道有多少人。有人说我们这里是一所技校来了一批呆两年毕业了又来一批。没有谁是愿意长期干下去的。

        问题在于好多企业思维很简单,电工没了就再请咯!工人没了就再请咯,工资压得再低也有人干!并不是人不想反抗,而是根本没得反抗。

        多学点真本事,業精于勤,做一行爱一行,维修电工是很有前途的一项工作,把本质工作做好,三百六十行,行行出状元。向有技术的师付看齐,要强国,首先要有一大批肯学肯做的高技术人才,我是一名高级维修电工,乐在其中,其乐无穷!

        得不到企业重视,不是企业的问题,这恰恰是电工的问题。如果手艺好干嘛不跳槽,还修什么水管,烧什么电焊,不要说人家看不起你。打铁还需自身硬,做电工不是换换灯管,修修开关那么简单,现在的工厂电气自动化程度是很高的,要做到能单独排除各种复杂的电气故障,才能受到企业的尊重。

    转自工控资料窝

    展开全文
  • 当然数学能力也很重要,编写算法懂数学,到一定程度后就上去了,这个除了自己努力还要看天赋了。但总得来说,勤能被拙是良训,一分辛劳一分才。你只要花时间在基础算法和基础数学上有所付出和努力,算法还是会...

    算法重要的是思维,不是程序的实现


           实现一种算法首先是一种思维的实现,而不是埋头就在那里编程去实现。做为一个优秀的PM,要善于从思维中把握算法的核心,而不是象工人一样,人家已经给你了思维,你就斧头,凿子就干开了。前几年热炒一个话题,就是如何程序编程自动化,就是因为大家觉得思维层次的算法已经搞清楚了以后,程序的实现只是一个工程量的问题,而不会存在计算机理解的二义性问题。而现在很多人似乎更乐意成为一个coder,一个算法在程序上的完美实现者,而不是一个架构师,算法思维大师,一种算法的创造者,组织者。这是一个值得深思的问题。


           算法源于生活,是解决问题的策略和步骤的提炼。如,大家坐公交车,从A到B站没有直达的情况下,如何计算一个特定策略下的最优解,对于策略,你可以选择:1)总路径最短。2)总时间最短。(总路径短还不一定就是时间短,可能径直穿过闹市区,反而慢。3)给每输公交车统计舒适度,你可能想时间不在乎,我就要坐着舒服。4)你是一个游客,你想要多路过风景区。确定了哪一种策略解决问题,再你设计解决问题的步骤。如,按总路径最短,你必须计算每两点之间的距离和可达性。


           任何纷繁复杂的算法程序,总有这样的共性:输入和输出。在设计程序时,就象疱丁解牛一样,先把这两根主骨理出来。里边的算法结构,要培养良好的流程图思考习惯。所以说程序算法是千变万化的,但算法的思维是相通的。所以各种算法思想是对各种程序实现流程的一种非常高度的概括。就象之前说的公交车算法,输入是A,B,策略模式。输出:策略下的最优解。如果更加专业一点,或者要跟别人交流,或者形成电子文档,建议还是按照正规点的流程图软件,visio和UML都是相对不错的选择。


           思维最重要的是条理,那么体现这种条理的工具就是流程图,程序流程图是一种用规定的图形,指向线及文字说明来准确表示算法的图形,具有直观、形象的特点,能清楚地展现算法的逻辑结构.画程序框图的规则:使 用标准的框图符号;框图一般按从上到下,从左到右的方向画;除判断框外,大多数程序框图的符号只有一个进入点和一个退出点,而判断框是具有超过一个退出点 的唯一符号。 其实大部分的算法还是通过基本的算法组合流程图是体现你算法思想的语言,把你的思维物化。要非常习惯于画流程图。程序流程图是人们对解决问题的方法、思路或算法的一种描述。流程图的优点:(a)采用简单规范的符号,画法简单;(b)结构清晰,逻辑性强;(c)便于描述,容易理解。流程图采用的符号:(1)起始框{椭圆形} (2)终止框{椭圆形} (3)执行框{长方形框} (4)判别框{水平菱形}。除了上述这种比较通用的流程图,还有一些国际比较流行的流程图样,如:NS图和PAD图,当然采用具体什么样的流程图样没有固定的。关键是清晰表达你的思维。


           扩展开来,如果状态很糊涂,就画状态机图;如果交互的流程不清楚,就画序列图;有时候各个类关系搞不定,就画类图。如果需求时各个部门责任不明确,不知道每个部门做什么,那就画部门责任图。


            实现的,如果你打算自己发明基础算法,那需要很深的数学功底,你可以去看看具体数学。如果你只是打算编写普通的算法,首先还是要把那些基础算法都融汇贯通,这里涉及到很多的计算机基础也算是核心课程,数据结构、算法基础、编译原理、操作系统、离散数学。数据结构和算法基础是我比较喜欢的课程,它们是一种高度思想的结晶,你可以一遍又一遍反复地看,反复去思考,去理解,去实现。这样你可以对基础算法的精髓了解得很深。


           算法能力的提高周期比较长,即使你是一个自认为比较聪明的程序员,也不要指望在很短时间内达到一个很高的水平。当然数学能力也很重要,编写算法不懂数学,到一定程度后就上不去了,这个除了自己努力还要看天赋了。但总得来说,勤能被拙是良训,一分辛劳一分才。你只要花时间在基础算法和基础数学上有所付出和努力,算法还是会得到一定能力的提高。


          提高自己对算法的思维逻辑能力,先提高自己的计算机逻辑思维能力,再考虑如何让计算机提高逻辑思维能力,最后让计算机自己提高逻辑思维能力。当然最后一种境界是大牛才有的境界,提高自己提高自己的逻辑思维能力是一个必备基础,如果自己的思维也没有条理化,那么计算机不是你的优质复制品,能够自己去学习,去优化自己的算法;提高计算机的思维能力,就是在你的算法中有强大的容错机制和反馈机制,使它象人一样能与人沟通。当然最高的境界是计算机有自主的逻辑思维能力,就是说的编程自动化,能理解人的算法的思维表达结果,然后自动转化成二进制世界里的语言形式。 至于算法的实现,先抓住核心算法的实现,然后再是调用算法的程序,而不是反过来先编好测试用例和调用者算法,再去写核心算法。这是一种思维优先级的排列。
    展开全文
  • 软件界面设计思想方法

    万次阅读 2015-03-04 10:16:28
    15.1什么是好的软件界面 ...易用性是指用户使用软件的容易程度。计算机软件诞生之初,主要用途是科学计算,那个时期几乎没有界面,只有计算机专业人员才能使用命令行来操作软件。之后出现了图形用户界面,例如Windo
    15.1什么是好的软件界面
    简而言之,好的软件界面应当是易用的和美观的。易用是交互设计的主要目标,美观是视觉设计的主要目标,交互设计和视觉设计完成后,最终靠编程来实现可运行的软件界面。
    15.1.1易用
    易用性是指用户使用软件的容易程度。计算机软件诞生之初,主要用途是科学计算,那个时期几乎没有界面,只有计算机专业人员才能使用命令行来操作软件。之后出现了图形用户界面,例如Windows,使得普通老百姓也可以使用电脑。现在流行iPad、iPhone触摸界面,就连不识字的儿童都会使用。
    软件界面越易用,整个软件系统就越容易被用户接受。反之,如果界面很难用,即使软件功能很强大,用户也可能抛弃这个软件系统。
    例如,轿车自带的导航系统目前都比较难用。由于没有键盘,输入地址非常麻烦。一般靠旋扭或者触摸屏来选择 26个字母,输入较长地址可能要花费3-5分钟,拼音不好的用户常出错。与其这么费劲,还不如查地图或打电话询问更加方便。要使车载导航系统真正发挥价值,就必须提高它的易用性,否则就是个摆设。
    针对这个问题,比较可行的解决方案是:( 1)提供更加快捷的“手写输入或语音输入”;(2)智能手机与汽车互联,用汽车屏幕来展示手机导航软件(例如Google地图)。目前只有少数百万元级别的高档轿车才有这种操作界面,远未普及。
    商业社会越发达,人们的生活节奏就越快,干啥事都想图方便,这是人之常情。如果软件系统功能很强,但是需要看完帮助文件才知道如何使用,而大部分用户没有耐心看完文档,就提前放弃了使用,岂非可惜。所以软件易用性越来越重要,这是商业发展的自然趋势。
    15.1.2美观
    除了要求软件易用之外,用户还希望软件界面美观。电影《食神》里的一段精彩对话可以帮助我们理解界面美观的重要性:
    在一次香港大厨比赛中,食神周星星担任主考官。某个厨艺高超的大厨正得意地向食神展示他的招牌菜。
    食神看了看大厨的脸说:“出局、出局。”
    大厨十分惊诧:“你还没有看我的菜呐!”
    食神说:“不用看了,因为你长得太丑了!”
    大厨怒曰:“我长得丑难道也有错!”
    食神说:“当然!如果顾客知道做菜的人长得那么丑,吃下的菜都会吐出来的!我看你还是不要干这一行了,出局、出局。”
    美观的界面能消除用户由感觉引起的乏味、紧张和疲劳(情绪低落),可以提高用户的工作效率,从而进一步为发挥用户技能和为用户完成任务做出贡献。
    人们对美的向往和追求是与生俱有的。显然没有开发人员愿意丑化自己的软件,也没有用户嗜好丑陋的界面。软件开发者要设计美,用户要享受美,所以界面的美是开发者与用户的共同需求。
    当然也存在反例:并不是任何人在任何时候都喜欢美观的东西。
    不少好动的儿童(男孩居多)更加喜欢丑陋的动物玩具,例如恐龙、蛇、甲虫等。儿童喜欢摔打、折腾丑陋的动物玩具(让人难以相信“性本善”的说法),所以这类玩具卖得快、坏得快、再卖也快。玩具厂商分析儿童的心理特征后,推出各色各样的丑陋动物玩具,赚了大钱。
    倘若有一天,我们发现某些用户群体喜欢丑陋的软件界面,那么我们就应该设计具有市场价值的丑陋界面,而不要只专注于“美观”的界面。
    15.1.3易用和美观哪个更加重要
    广大用户希望使用令人愉快的界面,可以把“易用”比喻为“界面的心灵美”,把“美观”比喻为“界面的外表美”,两者都重要。
    倘若开发方的精力和能力有限,难以同时实现易用和美观的界面,那么要识别优先级。一般规律如下:
    (1)对于长期使用的商品而言,易用比美观更加重要。人有审美疲劳,再美的东西也禁不起长期看哪。易用的东西长期使用后会爱不释手,而不易用的东西若长期使用则会招致愤恨。
    (2)对于短暂使用的商品而言,美观比易用更加重要。人们看到美观的东西,容易一见钟情,忽视其它缺点,容易冲动购买。
    15.2软件界面设计的商业价值
    对软件开发方而言,软件界面设计的主要商业价值体现在: (1)能显著提升软件系统的营销竞争力;(2)获得较高的投资回报。
    很多用户不懂软件技术,也不关心软件技术。在没有深入使用软件系统之前,用户只能通过界面来感知软件系统的好坏。 如果软件系统A比B的界面更加易用、更加美观,在价格相似的情况下,大多数用户倾向于购买A。也许B比A的技术更加出色,但是用户不知道,可能也不在乎。所以软件界面设计能够显著提升软件系统的营销竞争力。
    要开发出易用美观的软件界面并不容易,对开发方而言不仅是能力挑战,而且要付出更多的精力和成本,但是值得去做。
    软件系统几乎所有的功能都是通过 “界面”来展现的,用户对软件系统的满意度与界面的易用美观程度成正比关系。假设开发方多付出10%代价改善了软件界面,每个用户对软件系统的满意度提升了10%,那么开发方付出的边际成本是10%,而边际收益则是“10%*用户总数”,用户总数越多,边际收益就越高。
    可见,开发方对软件界面设计的投资,将获得很高的回报(与用户数量成正比)。
    15.3软件界面设计的行业共性问题和基本对策
    尽管软件企业有不少技术出色的软件工程师,但是多数工程师开发出来的软件既难用又难看。客户对软件界面很不满意,经常要修改软件界面,造成极大的生产力浪费。软件企业都希望一次性地做出让用户满意的好界面,但是不知道怎么做。
    软件界面设计一直是中国软件行业的弱项,存在两方面行业共性问题:首先是缺乏系统性的软件界面设计方法和配套教育;这也导致第二个问题“缺乏好的界面设计师和娴熟的界面程序员”。
    15.3.1缺乏系统性的软件界面设计方法和配套教育
    有一位外国军人到德国军校访问交流,他惊奇地发现,在军校里居然出现了音乐、美术这类艺术课程。他觉得很奇怪。
    德国军官自豪地说:对于德国军人而言,每一场战斗,每一次战役,都是艺术,因此要接受艺术教育。
    美国西点军校为世人所知,是因为培养了很多著名将领。然而人们却不知道,西点军校更是培养 商界领袖的摇篮。从二战以来,该校为美国商界造就了1000多名董事长、5000多名高级管理者,西点军校堪称美国最优秀的“商学院。”
    这种环境熏陶出来的人,他们带的队伍,他们做的东西,都是世界一流的。这就是系统性教育产生的价值。
    不要认为软件开发就是编程,仅仅懂编程的人,绝对做不出优秀的软件系统。要想成为优秀的软件人才,仅仅学会编程语言是远远不够的。
    国内理工科大学的计算机和软件专业,侧重于系统性的科学技术教育。基础课程有数学、物理、电路等,专业课程有操作系统、编译原理、编程语言、数据结构与算法、数据库等等。每门课程都有很好的教材(甚至有世界名著),而且有很好的老师。所以国内理工科大学能够培养出大量技术功底扎实的软硬件研发人才。
    相比之下,软件界面设计领域的教育就差远了。既缺乏好的教材,又缺乏好的教师。
    20世纪90年代初,浙江大学计算机系就有了工业设计专业,如今计算机系升级为计算机学院,工业设计专业升级为工业设计系。在计算机科学技术与人文艺术相结合方面,浙江大学计算机学院无疑处在国内前列地位。工业设计系在工业和民用硬件产品设计方面有很强的师资力量,并逐步开拓了数字媒体专业。但是在软件界面设计的教学方面仍然遇到棘手问题:计算机专家不熟悉工业设计,而工业设计专家又不熟悉软件开发,既无合适的教材也难找合适的教师。
    迄今为止,我还没有见到哪个大学计算机学院或软件学院把“人机工程学、美学、心理学、界面设计”等课程很好地整合起来,提供界面设计领域的系统性教育。如果有的话,我要带大批人员去这个学校进修,大家着急啊。
    由于计算机和软件专业学生们接受的教育几乎全是科学技术,他们不知道怎样才能设计出易用、美观的用户界面,很多人甚至不知道还有界面设计这回事。当他们毕业后真正参与软件系统开发时,只好凭着个人的经验与感觉来设计软件界面,这样产生的界面往往得不到广大用户的认可。
    上述教育缺陷绝非短期内能够解决得了,我写这个问题不是发发牢骚,而是提醒软件企业关注这个问题:中国现阶段软件界面设计的人才数量和行业水平远远落后于技术开发,企业要抓住一切机会弥补这个缺陷,否则做不出优秀的软件系统。
    15.3.2缺乏软件界面设计和实现人才
        中国最近几次参加奥运会,金牌和奖牌总数位列前三,名声显赫。但是中国仍然不是体育强国,只是奖牌大国而已,因为获奖选手都是万里挑一选拔出来的,不能代表广大人民群众的体育素质。
    但是在乒乓球运动这个领域,中国绝对是体育强国,强大到了独孤求败的地步。我每次看乒乓球比赛,总是希望中国队不要包揽全部金牌,留一点给别国(否则别人绝望后就不和你玩了),但是很遗憾别国没有机会。为什么我们那么强?那是因为中国乒乓球运动太普及了,随便哪个县的乒乓球选手都是国际一流水平,真是人才济济,生生不息啊。反之,如跨栏运动,全国就盯着刘翔一个人,那就太脆弱了。
             在中国的大学教育里,软件技术教育最为普及,学员最多,和乒乓球运动有点相似。国内前一百名大学(姑且称为名牌大学)都能提供很扎实的计算机科学技术教育。此外还有无数的大专院校设立了软件学院,每年软件专业毕业生多到泛滥成灾的地步。
             但由于软件界面设计教育的缺陷,以及界面设计本身的复杂性,中国浩浩荡荡的软件开发大军中,擅长做软件界面的人才非常少,我估计连1%都不到。
             我们把软件界面开发分为三个环节:交互设计、视觉设计和程序实现。企业希望界面设计师负责“交互设计和视觉设计”,由娴熟的程序员实现这个界面,这个要求似乎并不高,但现实情况很糟糕。
    不少软件企业既有程序员又有美工人员,但遗憾的是这两类人的工作配合不太理想。
    企业领导和程序员们大多认为界面设计是美工人员的事情,否则公司招聘美工人员干什么用?所以程序员会等着美工人员完成界面设计后,再编程实现,至于界面设计好不好就不管了。
    美工人员大多是美术相关专业毕业,他们的优点是擅长于视觉设计,缺点是:( 1)不熟悉待开发软件系统的业务逻辑,不了解用户的特征,难以开展交互设计;(2)不懂软件技术,他们不知道自己构思出来的界面在技术实现方面的难易程度。
    千万不要低估界面实现的难度,不要以为界面想得出就做得出。有些 Web软件界面控件,要同时兼顾功能、性能和易用性,技术难度相当高,不是普通程序员做得好的(往往顾此失彼)。感兴趣的读者请试用集成化研发管理平台MainSoft,创建一个项目导入数千条任务,体验一下Web任务树形表和Gantt图的功能,想想什么水平的程序员花多少时间才能够做得出这样复杂的界面控件。
    当不懂技术的美工人员和只懂技术的程序员产生分歧时,他们很难协商出更好的方案来。
             可见美工人员并不是人们期望的软件界面设计师(常被人误解为软件界面设计师)。不是我泼冷水,既能做好交互设计又能做好视觉设计的界面设计师是比较少见的(吹牛皮的除外),能够同时做好交互设计、视觉设计、程序实现的人更加罕见,估计比熊猫还少。
    我们必须承认,在现阶段,中国绝大多数软件企业都没有优秀的界面设计师。那只能用“三个臭皮匠、顶得诸葛亮”的替代方案,如果几个人分工合作能把界面做好的话,我们就不必一直叹惜没有优秀的界面设计师了。我的建议是:
             (1)由“软件产品经理或项目需求分析师”兼任交互设计师,负责交互设计。软件产品经理或项目需求分析师是最熟悉软件业务逻辑的人,他们了解用户特征,知道什么样的交互方式适合于目标用户群体。另外,他们大多是搞技术出身的,能够判断出交互方式在技术实现上的难易程度。他们既能和美工沟通,也能和程序员沟通。交互设计既属于需求工程范围,也属于软件设计范围,是交集。我倾向于在需求分析阶段开始交互设计,尽量前移。
             (2)交互设计师向美工人员解释目标用户群体的特征,由美工人员负责视觉设计。有些软件企业没有大量的视觉设计工作,出于成本考虑,不必招聘全职的美工人员,可以聘请兼职的美工人员。倘若实在请不到美工人员,你还可以把视觉设计外包出去,只要你能够描述清楚需求。
             (3)交互设计师和程序员沟通界面实现方面的问题,既要满足用户需求,又不能使程序实现的代价太高。请技术水平高的程序员开发界面控件,努力做成标准件,构造界面库,还要有人负责维护界面库(不能随意改动界面控件)。其他普通程序员只要调用界面控件,专心去实现软件业务逻辑即可。这样使整个团队的软件界面开发效率和质量都很高。
    15.4以用户为中心、以效益为目标的软件界面开发理念
    15.4.1界面设计以用户为中心
    软件系统是给用户使用的,而不是给自己使用的。所以界面设计要“围绕用户需求和用户使用习惯”开展,即“以用户为中心”。目的是让用户用得满意,而不是让开发者自己用得满意。
    这个道理非常浅显,似乎无需解释,但现实情况是人们经常颠倒着干。虽然软件公司宣扬“以用户为中心”,但是大部分开发人员埋头干活,闭门造车,早忘记了用户。他们自己觉得界面挺易用、挺漂亮,那么用户也会满意。
    例如,当开发方向用户演示软件时,常会得意地讲:这个软件非常好用,我演示给你看,……是很好用吧!蛮漂亮的吧!
    这是典型的“王婆卖瓜,自卖自夸”。
    用户出于礼貌不断地点头,但点头并不表示赞同。用户不好意思说他没有看明白怎么回事,总不能在别人面前显得自己很笨吧!所以用户一边点头,一边心里嘀咕“这是什么玩意儿”。
    若干年前,我公司在开发 MainSoft时,其中权限管理功能相当复杂,我让一名技术高手负责开发。两周后这位高手兴冲冲地告诉我,他已经完美地实现了权限管理功能。
    他演示给我看的时候,一边飞快地敲键盘、点击鼠标,一边自言自语地解释:这样很方便,那样很方便, ……,大约一分钟就演示完了,然后充满期望地问我怎么样。
    在这一分钟之内,我完全没有看清楚权限管理功能是怎么使用的。但是我又不能打击他的积极性,只好说:不错不错,让我自己体验一下吧。
    这位高手自信地说:你好好体验吧,把改进建议写下来,我估计再花几个小时调整细节,这个功能就完美了。
    作为第一次使用的用户,谁能够像开发者本人用得那么熟练啊。他只花一分钟就演示结束了,可是我完全不知从何下手,足足摸索了半个小时才学会使用这个功能,哪个用户受得了这种界面啊。
    结果该功能经过了多次修改, 3个月之后才变得实用,显然不止再花几个小时调整细节那么简单。这位高手没有在预定时间内一次性地完成该功能,进度大大地延误,让公司付出了额外的代价。
    软件是否易用、是否美观要让用户来评价。如果用户对界面很不满意,开发方不要有逆反情绪:从哪里找来的笨蛋!
    其实不是用户笨,是自己开发的软件太笨了。当用户真的感到软件很好用时,一股温暖的感觉油然而生,于是就用“界面友好”来表扬这个软件。软件行业很少发生那么感动人的场景:用户热切地握着开发人员的手,连声称赞“你们开发的软件真是好用啊”。我们看到的大多是相反的场景:用户满腹牢骚,开发人员垂头丧气。
    很多开发人员不能够一次性地完成某些开发任务,主要原因不是技术水平低下,而是他们没有真正理解用户的需求,也没有站在用户角度看待界面。如果用户不满意软件的功能和界面,那么开发方将被迫重新开发,产生额外的成本。所以企业要经常宣传“界面设计以用户为中心”的理念,让这个理念印到开发人员的脑海里,成为一种本能。
    15.4.2界面实现以效益为目标
    用户和开发方都要承担界面成本,双方都要效益。用户买了觉得值,开发方卖了要有利润。所以真正实现界面的时候,不见得完全按照设计要求来实现界面。界面做到什么程度,要以效益为目标。
    微软公司的 Vista 比起 Windows XP 而言 ,功能更加强大,界面更加华丽。微软公司曾经轰轰烈烈地宣传 Vista 多么好,是个革命性的产品。但是市场证明 Vista 是个华丽而不实用、商业失败的窗口系统,差点革了自己的命。主要原因:
    1 Vista 拥有酷炫的界面,对硬件要求很高,原先的 Windows XP 用户要多花钱升级硬件或者更换硬件才能使用 Vista ,这导致很多用户不愿意升级到 Vista
    2 )由于 Vista Windows XP 有很大的差异,导致原先大量的 Windows 应用软件无法在 Vista 下正常运行,这个问题比硬件升级产生额外成本更加严重。我本人就把默认安装 Vista 的笔记本电脑,倒退回到 Windows XP ,否则无法正常办公。
            界面实现要以效益为目标,宣传这个理念是为了“避免过度设计而损害用户或开发方的效益”。
    15.5 软件界面开发三步曲
    为了做出易用美观的软件界面,我们把软件界面开发分为三个环节,如图15-x所示:(1)交互设计的主要目标是设计出易用的界面;(2)视觉设计的主要目标是设计出美观的界面;(3)交互设计方案和视觉设计方案确定后,最终靠编程来实现可以运行的软件界面。
    15-1  软件界面开发三步曲:交互设计、视觉设计和程序实现
    15.5.1交互设计
    一、界面需求征询
    界面需求征询的目的是把握“界面设计的方向和程度”,分两个层面:首先是当前需求,搞清楚当前界面要解决什么问题,达到什么程度;其次是未来的需求,把软件界面划分若干版本,考虑每个版本要做什么,达到什么程度。
    对于自主研发的软件产品而言,开发方自己可以决定界面需求。参与界面需求征询会议的主要人员有: 交互设计师(可让软件产品经理兼任),营销人员,技术负责人,潜在用户代表,可能还要老板(开发方领导)参与。
    对于软件合同项目而言,需要开发方和客户方双方共同商议界面需求。 开发方主要人员有:交互设计师(可让需求分析员兼任),技术负责人,商务代表。客户方主要人员有:各类用户代表(真正的使用者),商务代表。可能双方领导也要参与。
    界面需求征询做的越全面越好,把当前、未来可能要做的事情一并考虑进来,交互设计师要记录所有关注点,进行汇总分析。
    二、用户特征调研
    对于企业级应用软件,提取软件系统的所有角色,访谈每种角色对应的典型用户,记录他们的使用习惯。
    对于面向个人的软件,例如 QQ 、微博等,用户十分广泛,不像企业软件有比较严格的角色职责定义。需要对用户进行多角度地分类调研,例如按年龄、性别、文化程度、职业划分多个类别。
    三、提出多套交互设计方案
    交互设计师在界面需求征询和用户特征调研的基础上,提出多套交互设计方案,便于后续讨论和选择。交互设计方案主要是草图加文字说明,能够表达清楚设计意图即可。
    四、头脑风暴会议
    对于自主研发的软件产品而言,由交互设计师在本公司召开头脑风暴会议,主要参加人员和职责如下:
    (1)交互设计师逐一介绍每个设计方案,解答别人的疑问。
    (2)营销代表,将平时收集来的用户抱怨和建议整理成文档,看看在交互设计方案中是否已经得到了解决。
    (3)技术代表,负责分析每种交互设计方案的技术可行性和实现代价。
    (4)潜在用户代表,把自己作为真实的使用者,谈谈自己对每种交互方案的感受。
    对于软件合同项目而言,需要双方人员共同召开头脑风暴会议,主要参加人员和职责如下:
    (1)开发方交互设计师逐一介绍每个设计方案,解答别人的疑问。
    (2)开发方技术代表,负责分析每种交互设计方案的技术可行性和实现代价。
    (3)客户方用户代表,把自己作为真实的使用者,谈谈自己对每种交互方案的感受。
    (4)双方商务代表,主要分析是否存在商务风险。
    与会者各抒己见,畅所欲言,会议结束时要达成共识,最终选择一种、或者重新组合出一种相对满意的交互设计方案。
    五、制作并体验“可运行的软件界面原型”
    头脑风暴会议结束时选定的交互设计方案仅是个纸面方案,尚不能体验,是人们根据自己的经验和感觉定下来的,存在比较大的风险。
    就如中国的期房市场,房子没有造好之前就可以销售(这是极不合理的制度),每个房产商制作的效果图和模型都非常精美,老百姓抱着美好的期望买了房子,等到房子造好后进去一看,心都凉了,但是钱已经付了,损失惨重。
    对于金额比较大的软件系统,为了降低风险,不宜把纸面交互设计方案直接交给开发团队去实现,最好先制作“可运行的软件界面原型”,让相关人员去体验这个原型,才知道好不好,发现问题可以尽早改正,避免或减少后续的损失。
    为了对界面原型有一个比较客观、全面的评价,财力雄厚的企业可以使用眼动仪。眼动议可以记录眼球在屏幕上停留和滑动的轨迹,用于分析用户是怎样使用软件界面的。体验人员(潜在用户)带上眼动仪,根据预先设计好的测试用例一项一项地执行。除了眼动仪之外,电脑上安装有屏幕录像软件,实验室也有高清摄像头,对用户的操作行为进行全程记录。所有的测试用例执行完毕后,交互设计师可以对记录结果进行分析,发现问题及时改正。
    六、交互设计方案定稿
    人们体验了可运行的软件界面原型,并做了相应的改进,在此基础上形成了最终的交互设计方案。之后就不能随意做大的修改了,视觉设计师和程序员将根据这个交互设计方案开展各自的工作。
    15.5.2视觉设计
    通常由美工人员担任视觉设计师,在既定的交互设计方案基础之上,努力使界面变得更加美观,让用户看了舒服(至少不讨厌)。
    视觉设计的主要内容有:界面布局,色彩搭配,图标设计,字体设计,界面元素的背景图案设计等。交付的成果通常是效果图,例如设计一种按钮,要制作“正常、加亮、按下、禁用、焦点”五种状态的效果图。
    为了提高视觉设计的效率,企业需要维护一套界面素材库,保存常用界面元素的各种效果图。在制作应用软件的界面时,首先从素材库中挑选合适的界面元素,如果没有合适的,再制作新的,不断地丰富素材库。
    15.5.3界面实现
    程序员负责界面实现:在交互设计方案和视觉设计方案基础之上,通过编程来实现可以运行的软件界面。
    界面实现的常见弊病是:程序员为了图编程方便,把界面代码和业务逻辑混杂在一起,导致团队协作和后续维护都很麻烦。只要界面或业务逻辑一改动,就要改动很多地方,经常出错。
    开发团队要努力使“界面和业务逻辑”分离,使两者的相互干扰变得最小,模型见图 15-2
    1 )业务逻辑形成编程接口;
    2 )界面元素的交互操作也形成编程接口;
    3 )程序员调用上述两类编程接口以及界面资源文件(如文字、图片等),实现特定功能的界面。
    15-2  界面和业务逻辑分离模型
    15.5.4软件界面开发示例
    某杀毒软件公司是国内老牌的供应商,从 2000 年到 2005 年,其用户占有率遥遥领先于其他同类产品。但是随着 360 杀毒、金山杀毒新一代产品的出现,国内杀毒软件市场重新洗牌。为了适应新的市场需求,大力改进用户体验,该公司决定对杀毒软件界面彻底重新开发,借助 UIPower 集成化界面开发工具(见附录 C 介绍),在较短的时间内完成了任务。其界面开发过程如下:
    第一步:交互设计。 交互设计团队利用 UIPower 工具(见附录 C 介绍)设计了可运行的软件界面原型,图 15-3-1 是杀毒软件主界面原型,图 15-3-2 是功能模块的界面原型。该原型通过测试、评审之后定稿,进入视觉设计环节。
     
     
    15-3-1  杀毒软件的主界面原型
    15-3-2  杀毒软件各功能模块的界面原型
    第二步:视觉设计。 美工人员结合“交互设计方案、公司品牌特征”开展视觉设计,制作多套效果图,加入到可运行的软件界面原型上。相关评审人员直接试用高度逼真的界面原型,提出改进建议,形成最终的视觉设计方案,进入程序实现环节。图 15-3-3 是杀毒软件主界面的视觉设计,图 15-3-4 是各功能模块界面的视觉设计。
    15-3-3  杀毒软件主界面的视觉设计
    15-3-4  杀毒软件各功能模块界面的视觉设计
    第三步:程序实现。 项目开发团队采用增量开发模式,项目负责人制定任务进度计划,分配任务给相关程序员。期间程序员、交互设计师、美工人员、测试人员分工合作,一边开发,一边改进界面细节,最终在预计时间内完成了界面开发任务。
    15.6 软件界面设计应遵循的原则
    本文总结了软件界面设计应遵循的原则:界面适合于目标用户群体,容易理解,及时反馈操作过程和结果,防错处理,最少操作步骤(最高操作效率),合理的布局,合理的色彩搭配,界面元素标准化。读者(开发者)理解这些设计原则的含义之后,要结合待开发软件的特征,进一步演绎和细化,从而确定待开发软件的界面设计原则,并让开发团队全员遵循这些设计原则。
    15.6.1界面适合于目标用户群体
    界面适合于目标用户群体,这是第一重要的界面设计要素,事关产品的生死存亡。不适合于目标用户群体的界面,用户不会购买,或者买了也不用,即使界面很美观也无济于事。
    有些通用的软件系统如操作系统、字处理软件、浏览器等,面向的用户十分广泛。由于用户群体之间存在年龄、性别、语言、教育程度的差异,导致使用习惯也有很大差异。在设计软件界面时应当尽可能多地了解各种用户群体的使用习惯,努力使用户在操作软件界面的时候感觉不到麻烦,一般需要提供多种操作途径以适应各种类型的用户。
    例如 Windows系统的文件管理器,对于一个初学者来说,他愿意使用鼠标和菜单一步一步地操作;而对于行家而言,他也许更愿意使用热键来获取更高的效率。
    全世界的软件用户中可能有成千上万的人患有色盲或色弱,当他们面对花花绿绿的软件时会一片茫然。因此通用软件的界面还要经过色盲色弱人群的测试。界面设计者越为用户着想(即以人为本),用户就越喜欢这样的软件。
    要做出一款让全世界人民都满意的软件系统是非常困难的,考虑因素太多了,会导致系统非常复杂、不好用而且质量不可靠。即使软件业巨头微软公司的拳头产品,也会遭遇失败,例如Vista视窗系统。
    iPhone引领了智能手机的设计潮流,但是iPhone并不适合于全人类,尤其不适合于老年人和儿童。
    60岁以上老年人也需要好的手机:他们的听力不太好,说话不清晰,对手机的通话质量要求比较高;他们想念后代,经常看照片,拍照片,看视频,录视频……。貌似iPhone具备了所有功能,可是老年人的手指灵敏度远不及年轻人,很难用触摸方式输入文字,iPhone这类手机对老年人而言不具有实用性。我曾经给一位长辈换了4个手机,都没有满意的,只好将就着使用老式的2G手机。由于市面上没有针对老年人特征而用心设计的手机,你即使有钱孝敬长辈都买不到满意的手机,真让人丧气。
    出于安全考虑,家长也希望儿童(4-10岁)有合适的手机:既不能影响上学,又能够及时了解儿童的状况。iPhone太贵了,丢失不起;它太精致脆弱了,禁不起摔;它的娱乐功能太多了,影响孩子上学……。
    国内智能手机厂家都尾随苹果和三星,抄它们的功能和界面,同质化竞争非常激烈,利润低微甚至赔本赚吆喝。何苦要这么做啊,你若用心去设计适合老年人和儿童的手机,这个细分市场也是很好的。
    我对研发企业的建议: 不要企图让一款产品适用于差异很大的用户群体,要把广泛的用户划分成为若干目标用户群体,根据本企业的实力,选择一个或若干细分市场来开发产品。一款产品最好只面向一个目标用户群体,这样容易设计而且质量可靠,能够打造出精品。多个产品之间可以共享技术,但是不要把不同类型的操作界面全揉在一起。
    我公司的软件产品集成化研发管理平台 MainSoft适合于管理企业的研发项目,为了拓展市场,我曾经尝试用MainSoft去管理大学的科研项目。我给大学老师们讲解MainSoft的功能,他们听后觉得这个软件功能太强大了,用于管理大学的科研项目和毕业设计项目应该绰绰有余。可是他们试用了几周后就纷纷放弃,主要原因不是软件功能不够用,而是功能太多太复杂了,学生们不知如何下手;每个功能的流程和逻辑很严格,不适合于本科生和研究生的科研环境。学生们没有组织结构、岗位职责、流程制度这类概念,当然就难以使用企业级软件来管理他们的项目。
    经过数次试验之后,我发现 MainSoft无法很好地兼容“企业用户”和“高校用户”。与其把MainSoft改造成为两类用户都能够用,但是哪个都用不好的平庸产品,还不如彻底分拆。于是我们单独开发了适合于高校用户群体的云计算项目管理平台MansuoCloud。这两个产品的市场定位和操作界面差异很大,但是后台技术高度相似,复用率很高。实践证明我们这个决策和设计是正确的。
    15.6.2容易理解
    如果用户很难理解界面的意图,那么他使用起来肯定很费劲。所以“容易理解”是“容易使用”的前提条件。以下措施可以提高用户界面的可理解性:
    (1)界面上的所有元素都不能出现错误文字,字段名称必须“正确、准确”,没有二义性,上下文不矛盾。这本是最起码要求,但是并非人人都做得到。软件人员的文字功底普遍较差,经常写出令人费解的字段。我曾看到某些软件界面同时出现“交易种类、交易类型”、“开户行名称、银行别称”、“项目种类、项目类型”、“发票代码、发票编号”这样的相似输入框,用户怎么区分得清楚啊。
    (2)图标力求直观明了,要让用户看到这个图标就知道什么含义。若图标比较抽像,则应给图标加文字说明,防止用户误解。切忌为了使界面好看而硬生生地加上漂亮的图标,就如商场和饭店厕所门口各种奇思妙想的图标,看起来很有品味,却让人提心吊胆不敢进门。
    (3)所有的界面元素应当提供充分而必要的提示。若界面空间有限而无法写全文字时,则使用Tooltip,当鼠标移动到某个界面元素上时,用一个小窗口来显示完整的提示。提示文字一定要通顺,不要像马路左转车道大字写着“左弯待转区”,念起来多么别扭啊,能不能改为“左转待行区”通顺一点的文字啊。
    (4)界面上的功能菜单(或按钮)布局和操作步骤应当匹配于正常的工作流程,先后顺序合乎逻辑,以便用户按部就班地操作。不要把五脏六腑全部堆砌在界面上,所有功能都在上面了,你自己用吧,用户不知道从哪里下手啊。
    5)没有先后逻辑关系的选择项,如姓名、标题等,可以按照字母排序,便于用户选择。但是不要把功能菜单、有严格逻辑关系的状态集按照字母顺序排列。
    (6)对于复杂的用户界面,最好提供界面“向导”,让用户知道自己在界面结构中所处的位置。例如多级页面的网站,应该在界面上显示现在是什么页面,上一级是什么,否则用户很容易在众多的页面中迷失方向。
    15.6.3及时反馈操作过程和结果
    当用户进行某项操作后,过了一会儿软件界面一点反应都没有,如果时间超过了用户的心理预期,将使用户感到迷茫和不安,因为他不知道是自己操作错了还是软件系统错了。
    十年前,银行刚推行自动取款机的时候,系统性能比较低,取款操作等待时间比较长,只听到机器不停地发出滚动声音,就是不吐钱。把很多人急得团团转,有些人把眼睛趴在槽口想看看里面发生了什么事情。
    所以及时反馈操作过程和结果对用户而言很重要,得让用户知道操作进行得怎么样了,有什么样的结果。
    一、时间比较长的过程,应当显示进展情况。
    例如下载一个大文件,或进行一项复杂的运算,界面上应当用文字或图形来显示进度,如图15-4-1所示,否则人们不知道要等待多少时间。若过程时间很长,那么用户就可以去做其它事情,避免浪费时间。
    15-4-1  操作过程的进度提示
    如果某些操作过程无法提供进度数据,那么至少要提示“正在处理,请等待…”,让用户明白系统还在正常处理,没有出错。
    二、正确结果的提示
    某些操作会产生显然的、正确的结果,若用户一目了然,则无需额外提示。例如使用文件管理器复制文件、或进行排序,用户马上就能看到文件列表更新后的结果。这种操作结果就无需额外提示,多此一举的提示会让用户烦死的。
    某些重要的操作结果,例如银行汇款,即使结果显然是正确的,也要把正确的结果汇总起来反馈给用户。这个提示不是多此一举,一是让用户放心,二是让用户保存这个重要的操作结果以备未来之需。
    有些操作结果是正确的,但是后面还有重要的事情要做,则不仅要反馈正确结果,同时还要提示下一步要做什么。例如网站上的用户注册功能,不仅要告诉用户注册成功了,还要提醒用户收邮件,使用邮件里面的链接来激活账户。
    三、错误结果的提示
    正确的结果不必全部反馈给用户,但是错误的结果一定要及时反馈给用户:
    (1)不仅要让用户知道当前操作发生了错误,而且要让用户知道错在哪里、怎么错的,有助于用户纠正错误并且积累经验,避免下次犯相同的错误。不能没头没脑地弹出一个告警对话框“错误!”,如图15-4-2。
    (2)提示语句应当采用被动语态,不要出现诸如“你不能、你不该”这样的语句,避免指责用户,如图15-4-3。
     
    15-4-2   没头没脑的错误结果提示                  15-4-3   指责用户的错误结果提示
    (3)如果有处理错误的措施,也要写在错误提示信息中,协助用户处理错误,但是不要把姓名、电话号码写在上面。
    某程序员开发公安信息管理系统,错误提示对话框是这样的:错误!请联系某某某,电话号码 xxxxxxxx。
    结果他家每天都接到派出所打来的电话,父母吓得不轻,以为儿子闯了大祸,导致警察天天找他。
    四、没有达到预期结果的提示
    例如在搜索引擎中输入关键字“交胡设计”,查询结果为零,即没有达到预期结果,系统提示“您要找的是不是交互设计”,提醒用户检查输入是否有误,如图 15-4-4所示。
    15-4-4  提醒用户检查输入是否有误
    15.6.4防错处理
    用户在使用软件的过程中,不可避免地会出现一些错误的操作。倘若用户不小心输入了错误的数据、或者错误地删除了有用的数据,而软件傻乎乎地、将错就错地执行了,那么用户肯定很恼火,以后就不敢使用软件了,严重的话会引发供需双方纠纷(如索赔等)。
    软件界面必须考虑防错处理,使用户不必为避免犯错误而提心吊胆、小心翼翼地操作,而是放心大胆、轻松愉快地使用。
    常见的防错处理措施有:
    一、对输入数据进行正确性检查。用户输入数据后点击提交按钮,在真正执行后续功能之前,要对用户输入的数据进行正确性检查:
    (1)如果用户忘记了输入必填项(通常加红色*标记),软件应当提醒用户哪个必填项忘记了。如果数据类型错误或数据越界,软件应当识别错误并且提示用户改正数据。如图15-5-1所示。
    15-5-1  必填项和数据类型错误提醒
    (2)检查上下文语义的防错提醒:例如人们发邮件的时候经常忘记发附件,但是正文里面出现了“附件”两字,软件提醒用户“您可能要发送附件,但是还没有加上附件”,如图15-5-2所示。
    15-5-2  检查上下文语义的防错提醒
    二、如果数据有特定的格式,则须提示用户按照正确的格式输入。最好提供合适的默认值,减少出错的概率,如图15-5-3所示。
    例如,全世界没有统一的日期格式。中国常用的日期格式是“年 /月/日”(2013/1/15)、“年-月-日”(2013-1-15)、“年月日”(20130115)。而美国的日期格式是“mm/dd/yyyy”(01/15/2013)、“mm/dd/yy”(01/15/13)。有些欧洲国家则用“dd/mm/yyyy”(15/01/2013)。如果没有格式提示和默认值的话,用户无疑会经常输错日期。
    15-5-3  日期格式和默认值
    三、某些情况下不应该出现的菜单项和命令按钮,应当将其“隐藏”(而不是失效)。例如:不同的用户有不同的操作权限,低权限用户登录到系统,那些仅供高权限用户使用的功能应当被隐藏。例如银行系统的普通用户登录后,不应该看到给系统管理员使用的菜单,否则会误导、引诱用户想入非非、干点不该干的事情。
    四、在某些情况下,用户可以看到、但是不能操作的菜单项和命令按钮,应当将其“失效”(变成灰色),避免误操作,如图15-5-4所示。例如某个业务有N个操作步骤,当前步骤没有完成则不能使用下一步的按钮(将其失效而不是隐藏),让用户看到后续的按钮,他就知道后面还有哪些事情要做,但是不会发生误操作。
    15-5-4  失效的菜单(灰色)
              五、执行删除操作或交易操作之前,应当获得用户的确认。例如用户删除一个文件、汇出一笔钱时,应当弹出对话框询问用户是否真的要这么做,用户确认之后才可以执行。
             这个确认规则不仅软件开发方要遵守,而且用户也要知晓,在紧要关头不要忘记了“确认”。
        有个王牌期货交易员得到公司嘉奖,到加勒比海度假,刚住到海滨酒店就接到老板电话:今天大豆会暴跌,你赶紧上网抛售。
        交易员上网把他的所有大豆都抛了,关了电脑关了手机去海滨享受去了。等他回来打开手机,看到老板打来无数个未接电话。他想这回又发财了,于是打电话给老板:嗨,头儿,这次赚了多少钱?
        老板怒曰:我叫你抛,你为什么不抛?
        交易员回答:我接到你的通知,马上就抛了!
        老板大怒:你这个蠢货,你忘记了按“确认按钮”了!把公司害惨了。
    确认提示的书写很重要(可惜很多程序员乱写一气),规则如下:
    (1)只能用一般疑问句,不能用复杂的、让人迷惑的句式,例如反问句。
    (2)让用户知道他将干什么,以及有什么后果(例如不可撤销)。
    (3)提示语句应当和命令按钮在语义上保持一致,不能询问是否去医院,而按钮却写着去吃饭。
    良好的确认提示如图15-6-1所示,差的确认提示如图15-6-2所示。
     
    15-6-1  良好的确认提示
     
     
    15-6-2  差的确认提示
    注意:不要混淆“结果反馈”和“确认提示”,前者是无需“确定”或“取消”的。如果用对话框来反馈操作结果,那么对话框的按钮只有一个“关闭”(即关闭对话框),而不是“确定”和“取消”。如图15-6-3所示,用对话框告知用户“您成功地上传了文件 a.doc”、“您成功地汇款100万元”,用户会对“确定”、“取消”按钮迷惑不解—— 难道还需要确认才能操作成功?难道按下“取消”会撤消刚才的操作?
    15-6-3  令人困惑的确定和取消
    六、尽量提供Undo功能,给用户反悔的机会,让用户可以撤销刚才的操作。通常编辑软件都具有Undo功能,例如Word、PhotoShop等。但遗憾的是,由于技术原因,基于数据库或互联网的软件很难实现Undo功能。例如你发邮件给某些人,发完之后才发现发错了,但是你无法取消已经发出的邮件。你通过网上银行汇款给某人,汇出之后才发现金额或收款人写错了,你也无法取消这笔汇款。对于无法Undo的功能,“确认”尤为重要。
    15.6.5最少操作步骤(最高操作效率)
    设法让用户用最少的操作步骤来完成任务,获得最高的操作效率。
    例如字处理软件,“新建”、“打开”或“保存”文件是最常用的功能。如果使用菜单方式操作,先点击主菜单“文件(F)”、然后点击子菜单执行“新建”、“打开”或“保存”,这样需要2个操作步骤,如图15-7-1所示。为了提高操作效率,应当把最常用的功能用图标按钮的形式摆放在工具条(toolbar)上,这样用户直接点击图标按钮就可以执“新建”、“打开”或“保存”,只需要一个操作步骤,如图15-7-2所示。
     
    15-7-1  使用菜单的方式( 2 个操作步骤)         15-7-2  使用图标按钮的方式( 1 个操作步骤)
    再如,对于输入数据的页面,尽可能使用“选择数据”取代“手工输入数据”,不仅提高了输入效率,还能减少出错的概率。更进一步,提供模糊匹配输入框,只要输入少量字母或文字,就能自动列出匹配的数据,用户可以迅速选中他想要的数据,如图15-7-3所示,输入“北京”,自动列出所有北京客户。

     

     

     

    15-7-3  模糊匹配输入框
    尽管减少一个操作步骤而完成任务所节约的时间微乎其微(可能只有几秒钟),倘若用户频繁地使用,那么用户对少一个步骤和多一个步骤的感觉反差是很强烈的,好感或怨恨都会积少成多。尤其是互联网和智能手机领域,业界流传“多 1个操作步骤,流失10%用户”的经验教训。
    界面设计师要深入分析软件系统的业务流程和用户使用习惯,才能设计出最少的操作步骤。若在既有流程和技术条件下,已经把操作步骤减少到了最少,但用起来还是不方便的话,那么就要靠技术革新。例如手机看照片功能,老式手机只能用上下箭头键一个一个地翻滚照片,而新一代采用触摸技术的手机,用手指滑动屏幕来操作照片。两者的效率和感受简直天差地别、不可比拟。
    15.6.6合理的布局
    界面布局会影响易用性和美观性。实现“合理的布局”相比“合理的色彩搭配”要容易一些,因为绝大多数的界面元素的形状已经标准化,而且界面元素的组合方式也有约定俗成的规矩可循。
    以下是软件界面布局的一些建议:
    (1)界面的总体布局应当有一定的逻辑性,尽可能与工作流程吻合。
    (2)窗体(或页面)上的界面元素的布局应当整齐清爽。界面元素应当在水平或者垂直方向对齐,行、列的间距保持一致,避免参差不齐的视觉效果。
    (3)窗体(或页面)的尺寸要合适,界面元素不应放得太满,边界处需要留有一定的空间,也不可过于宽松,显得零乱。
    (4)要善于利用窗体和界面元素的空白,以及分割用的线条。
    (5)逻辑相关的元素要就近放置,便于用户关联操作。
    传统Windows客户端软件的界面布局模式非常成熟,如图15-8所示,一般有5个区域:主菜单区;工具条区;功能树;内容展示及操作区;状态信息区。这种模式已经被广大用户接纳,典型客户端软件如Word、Outlook、Foxmail、编程工具VC++、Eclipse等,界面示例见图15-8。
    1. 主菜单区
    2. 工具条区
    3. 功能树
    4. 内容展示及操作区
    5. 状态信息区
    15-8 -1 传统 Windows 客户端软件的界面布局模式
     
    15-8-2 Word 的界面布局                        15-8-3 Outlook 的界面布局
     
    15-8-4 Foxmail 的界面布局                        15-8-5  编程工具 Eclipse 的界面布局
    随着互联网的发展和普及,越来越多的应用软件采用B/S架构。目前国内大多数软件公司都在开发Web应用软件,其中管理信息系统居多(例如电子政务软件、办公软件等)。Web应用软件界面不像Windows客户端软件界面那样高度相似,有利有弊:好的一面是给设计师们留有开阔的设计空间,可以设计出令人耳目一新、乃至惊艳的界面;坏的一面是 Web界面五花八门,易用性和质量堪忧。
    据我观察,国内Web软件界面设计倾向于模仿网站的界面,偏重于视觉效果设计,而轻视交互设计。
    我对从事复杂Web应用软件开发的企业(或个人)的建议: 不要把网站的界面套用到Web应用软件上,而应当多借鉴Windows客户端软件界面。
    Web软件和网站的运行环境与技术几乎完全相同,但是两者的使用特征很不相同。网站面向大众用户,主要目的是吸引用户前来浏览,重要的具有吸引力的内容,而不是界面多么易用。 Web软件的本质是软件,只不过它在Web环境下运行、以页面的方式展示内容而已。软件用于处理有流程(逻辑)的业务,而不是仅仅让人们浏览信息。网站并不关心业务流程,几乎没有防错处理,倘若Web软件也没有业务流程、没有防错处理的话,试问谁会用这样的Web软件?
    Windows客户端软件界面虽然乏味,但是久经考验,有丰富的设计内涵,可以开发出极其复杂的应用软件。而网站界面看起来很华丽,但不足以支撑复杂应用软件。
    我心目中“复杂系统”的“好界面”应该是这样的:视觉效果不必惊艳,用户不必一见钟情,但是经久耐用,天天相处都不厌烦。就如德国大众的汽车高尔夫,貌不惊人,却越用越喜欢,为全球数千万用户带来了便利。
    我就是用这种思路来设计“集成化研发管理平台MainSoft”的Web软件界面。MainSoft有十个子系统,数万个页面,算得上是一个复杂的管理软件。其界面设计要满足如下苛刻的商业需求:Web交互方式要适应研发企业不同岗位用户的使用习惯 ;几乎每周都在增加新的功能,能够支撑未来近十万个页面的交互需求;至少要满足5年内客户们的无缝升级需求;软件界面十年内不落伍不做大改动(避免频繁发生高风险的设计大改动)。面对上述需求,如果没有合理的界面布局,没有高度规范化的界面元素,没有严密的逻辑设计,随着功能不断增加,软件产品界面必将乱得一塌糊涂。
    我看了无数网站,都没有找到适合于MainSoft的Web界面,于是我借鉴Windows应用软件的界面风格,自行设计软件界面,界面布局模式如图15-9所示。MainSoft软件界面的视觉效果,说得好听一点是朴实无华,说得不好听一点是平淡土气,而其内在的交互设计则几乎没有破绽,保证了实用性。

    各子系统菜单树

     
    内容展示及详细操作
    选择子系统以及全局按钮

     

    15-9 MainSoft 的界面布局模式
    界面设计追求是无止境的,但是企业的能力和精力是有限的。我并不非常在乎界面是否很漂亮、很吸引人,我更关注的是界面设计是否满足商业需求,是否实现了应有的商业价值。MainSoft界面设计的主要商业价值是:在公司创业初期,在我们有限的能力范围内,我们用心设计了界面。在它诞生之后六年多时间,几乎没有大的改动,也没有发生质量事故,程序员们可以快速复用界面成果,专注于功能开发而不必花费大量精力去调试界面,对软件开发的效率和质量有极大的好处。这个设计思路,值得软件业界同行们借鉴。
    15.6.7合理的色彩
    世上没有丑陋的颜色、只有丑陋的色彩搭配。在软件界面上实现合理的色彩难度比较高,因为色彩组合千变万化,并且各个用户对颜色的喜好也极不相同。
    软件界面设计人员需要了解人类对颜色的共性感知,避免软件界面出现 “红配绿俗得哭”、“黄配紫丑得死”的色彩搭配。
    一、色彩的冷暖感
      不同的色彩会产生不同的温度感。红、橙、黄色常常使人联想到东方的太阳和燃烧的火焰,因此有温暖的感觉,称为暖色系;蓝、青、蓝田、到大海、晴空、阴影,因此有寒冷的感觉,称为冷色系。凡是带红、黄、橙的色调称为暖色调,凡是带青、蓝、蓝紫的色调称为冷色调。绿与紫是不暖不冷的中性色。五彩色系的白是冷色,黑色则是暖色,灰色是中性色。
      色的冷暖是比较而言的,由于不同色彩的对比,明度纯度不同,物体的表面机理原因其冷暖性质可能发生变化。 
    二、色彩的轻重感
      色彩的轻重感与知觉度有关,凡纯度高的暖色具有重感,纯度低的冷色具有轻感。色彩的轻重感的基本规律为:
      (重)黑>低明度>中明度>高明度>白(轻)
      (重)高纯度>中纯度>低纯度(轻)
      明度低的深色系具有稳重感,而明度高的浅色系具有轻快感。
    三、色彩的软硬感
      色彩的软硬感主要取决于明度和纯度,高明度的含灰色具有软感,低明度的纯色具有硬感。色彩的软硬感与色彩的轻重、强弱感觉有关,轻色软,重色硬;弱色软,强色硬;白色软,黑色硬。
    四、色彩的明快与忧郁感
      色彩的明快与忧郁感主要与明度与纯度有关,明度较高的鲜艳之色具有明快感,灰暗浑浊之色具有忧郁感。高明度基调的配色容易取得明快感,低明度基调的配色容易产生忧郁感。在无彩色系列中,黑与深灰容易使人产生忧郁感,白与浅灰容易使人产生明快感,中明度的灰为中性色。色彩对比度的强弱也影响色彩的明快忧郁感,对比强者趋向明快,弱者趋向忧郁。纯色与白组合易明快,浊色与黑组合易忧郁。
    五、色彩的兴奋与沉静感
      色彩的兴奋与沉静感取决于刺激视觉的强弱。在色相方面,红、橙、黄色具有兴奋感,青、蓝、蓝紫色具有沉静感,绿与紫为中性。偏暖的色系容易使人兴奋,即所谓 “热闹”;偏冷的色系容易使人沉静,即所谓“冷静”。在明度方面,高明度之色具有兴奋感,低明度之色具有沉静感。在纯度方面,高纯度之色具有兴奋感,低纯度之色具有沉静感。色彩组合的对比强弱程度直接影响兴奋与沉静感,强者容易使人兴奋,弱者容易使人沉静。
    六、色彩的华丽与朴素感
      色彩的华丽与朴素感以色相关系为最大,其次是纯度与明度。红、黄等暖色和鲜艳而明亮的色彩具有华丽感,青、蓝等冷色和浑浊而灰暗的色彩具有朴素感。有彩色系具有华丽感,五彩色系具有朴素感。
      色彩的华丽与朴素感也与色彩组合有关,运用色相对比的配色具有华丽感,其中以补色组合为最华丽。为了增加色彩的华丽感,金、银色的运用最为常见,所谓金碧辉煌、富丽堂皇的宫殿色彩,昂贵的金、银装饰是必不可少的。
    七、色彩的舒适与疲劳感
      色彩的舒适与疲劳感实际上是色彩刺激视觉生理和心理的综合反应。红色刺激性最大,容易使人产生兴奋,也容易使人产生疲劳。凡是视觉刺激强烈的色或色组都容易使人疲劳,反之则容易使人舒适。绿色是视觉中最为舒适的色,因为它能吸收对眼睛刺激性强的紫外线,当人们用眼过度产生疲劳时,多看看绿色植物或到室外树林、草地中散散步,可以帮助消除疲劳。一般讲,纯度过强,色相过多,明度反差过大的对比色组容易使人疲劳。但是过分暧昧的配色,由于难以分辨,视觉困难,也容易使人产生疲劳。
    八、色彩的积极与消极感
    色彩的积极与消极感与色彩的兴奋与沉静感相似。歌德认为一切色彩都位于黄色与蓝色之间,他把黄、橙、红色划为积极主动的色彩,把青、蓝、蓝紫色划为消极被动的色彩,绿与紫色划为中性色彩。积极主动的色彩具有生命力和进取性,消极被动的色彩是表现平安、温柔、向往的色彩。体育教练为了充分发挥运动员的体力潜能,曾尝试将运动员的休息室、更衣室刷成蓝色,以便创造一种放松的气氛;当运动员进入比赛场地时,要求先进人红色的房间,以便创造一种强烈的紧张气氛,鼓动士气,使运动员提前进入最佳的竞技状态。
    九、常见颜色的心理感受
    (1)红色是强有力的色彩,是热烈、冲动的色彩。在深红的底子上,红色平静下来,热度在熄灭着;在蓝绿色底子上,红色就像炽烈燃烧的火焰;在黄绿色底子上,红色变成一种冒失的、莽撞的闯入者,激烈而又寻常;在橙色的底子上,红色似乎被郁积着,暗淡而无生命,好像焦干了似的。 
      ( 2)橙色的波长仅次于红色,因此它也具有长波长导致的特征:使脉搏加速,并有温度升高的感受。橙色是十分活泼的光辉色彩,是暖色系中最温暖的色彩,它使我们联想到金色的秋天,丰硕的果实,因此是一种富足的、快乐而幸福的色彩。橙色稍稍混入黑色或白色,会成为一种稳重、含蓄有明快的暖色,但混入较多的黑色后,就成为一种烧焦的色,橙色中加入较多的白色会带有一种甜腻的味道。橙色与蓝色的搭配,构成了最响亮、最欢快的色彩。
    3)黄色是亮度最高的色,在高明度下能够保持很强的纯度。黄色的灿烂、辉煌,有着太阳般的光辉,因此象征着照亮黑暗的智慧之光;黄色有着金色的光芒,因此又象征着财富和权利,它是骄傲的色彩。黑色或紫色的衬托可以使黄色达到力量无限扩大的强度。白色是吞没黄色的色彩。
    4)鲜艳的绿色非常美丽,优雅,特别是用现代化学技术技术创造的最纯的绿色,是很漂亮的颜色。绿色很宽容、大度,无论蓝色还是黄色的渗入,仍旧十分美丽。黄绿色单纯、年青;蓝绿色清秀、豁达。含灰的绿色,也是一种宁静、平和的色彩,就像暮色中的森林或晨雾中的田野那样。 
    5)蓝色是博大的色彩,天空和大海着最辽阔的景色都呈蔚蓝色,无论深蓝色还是淡蓝色,都会使我们联想到无垠的宇宙或流动的大气,因此,蓝色也是永恒的象征。蓝色是最冷的色,使人们联想到冰川上的蓝色投影。蓝色在纯净的情况下并不代表感情上的冷漠,它只不过代表一种平静、理智与纯净而已。真正令人的情感缩到冷酷悲哀的色,是那些被弄混浊的蓝色。
    6)波长最短的可见光是紫色波。通常我们会觉得有很多紫色,因为红色加少许蓝色或蓝色加少许红色都会明显地呈紫味。所以很难确定标准的紫色。紫色是非知觉的色,神秘,给人印象深刻,有时给人以压迫感,并且因对比的不同,时而富有威胁性,时而又富有鼓舞性。它处于冷暖之间游离不定的状态,加上它的低明度的性质,也许就构成了这一色彩在心理上引起的消极感。与黄色不同,紫色可以容纳许多淡化的层次,一个暗的纯紫色只要加入少量的白色,就会成为一种十分优美、柔和的色彩。随着白色的不断加入,也就不断的产生出许多层次的淡紫色,而每一层次的淡紫色,都显得很柔美、动人。 
    6)黑色与白色是对色彩的最后抽象,代表色彩世界的阴极和阳极。太极图案就是黑白两色的循环形式来表现宇宙永恒的运动的。黑白所具有的抽象表现力以及神秘感,似乎能超越任何色彩的深度。黑色意味着空无,像太阳的毁灭,像永恒的沉默,没有未来,失去希望。而白色的沉默不是死亡,而是有无尽的可能性。黑白两色是极端对立的色,然而有时候又令我们感到它们之间有着令人难以言状的共性。白色与黑色都可以表达对死亡的恐惧和悲哀,都具有不可超越的虚幻和无限的精神,黑白又总是以对方的存在显示自身的力量。它们似乎是整个色彩世界的主宰。 
      (7)在色彩世界中,灰色恐怕是最被动的色彩了,它是彻底的中性色,依靠邻近的色彩获得生命,灰色一旦靠近鲜艳的暖色,就会显出冷静的品格;若靠近冷色,则变为温和的暖灰色。与其用“休止符”这样的字眼来称呼黑色,不如把它用在灰色上,因为无论黑白的混合、不色的混合、全色的混合,最终都导致中性灰色。灰色意味着一切色彩对比的消失,是视觉上最安稳的休息点。然而,人眼是不能长久地、无线扩大地注视着灰色的,因为无休止的休息意味着死亡。
    软件界面设计师要凭借自己的感觉、经验以及想象力,用心设计界面色彩,使广大用户看到界面时感到舒服,而不是浑身鸡皮疙瘩。以下是软件界面色彩设计的一些建议:
    (1)如果不是为了显示真实感的图形和图像,那么应当限制一帧屏幕的色彩数目,因为人们在观察屏幕的时候很难同时记住多种色彩。
    (2)应当根据对象的重要性来选择颜色,重要的对象应当用醒目的色彩表示。
    (3)使用颜色的时候应当保持一定的规律,例如错误提示信息,不要一会儿用醒目的红色、一会儿用其它颜色。
    (4)表达重要信息时,不要过分依赖颜色,因为有些用户可能色盲或色弱。
    15.6.8界面元素标准化
    在一个软件系统内,同类的界面元素应当有相同的视感和相同的操作方式。例如命令按钮是最常见的界面元素,所有命令按钮的形状、色彩以及对鼠标的响应方式都是一致的。
    界面元素标准化的最大好处就是能够减少用户的记忆量、减少出错几率,并且迅速积累操作经验。例如微软Office家族软件的界面元素高度一致,所以熟悉Word软件的用户基本上不用翻阅手册就能使用Office家族的其它软件。
    设计者必须密切注意在相同领域中最广泛的软件界面操作方式。例如DOS和Windows下的软件习惯于设置F1键为帮助热键,如果某个设计者别出心裁地让F1键成为软件终止的热键,那么在用户渴望得到帮助而伸手击F1键的一刹那,他的工作就此完蛋。相信这个用户会被这另类的F1气疯。
    软件界面元素“标准化”与 “个性化”之间存在微妙的矛盾关系。
    对于一些非常注重安全性的软件系统(如金融软件、军用软件)而言,界面元素的“标准化”要比“个性化”重要得多,因为标准化的界面可以减少用户出错几率,避免损失。
    例如,国内所有银行取款机的软件界面操作方式都是非常相似的,谁也不会用奇特的方式来取钱、转账和存钱。用户插入银行卡(机器把银行卡吞进去了),输入密码验证通过后,再进行各项交易操作,最后一步是退出系统并取卡。
    美国取款机的操作方式不同于中国:用户插入银行卡后,机器并不把卡吞进去,而是提醒用户马上拿走银行卡,然后输入密码,验证通过后再进行各项操作,最后一步是退出。我第一次使用的时候很吃惊,怎么还没有交易就要我取卡,我本能地认为是银行卡坏了或者是取款机坏了,于是就到另一个银行取款机试验,试了好几次,才发现是操作方式不同。后面排队的美国人肯定觉得前面那个人很奇怪。
    这就是操作方式不同(不标准)给用户造成的麻烦。我当时的确有些紧张,在国外取不出钱那麻烦大了。事后想想美国取款机的操作方式更加合理:避免输错密码被吞卡,避免忘记取卡,否则才是真正的麻烦。
    对于娱乐性质的软件而言,用户更加喜欢有个性的甚至是颠覆传统的界面,如图15-10所示,个性化界面比平淡乏味的标准化界面更具有吸引力。娱乐软件界面风格不适合于严肃软件系统,反之亦然。
    界面设计师应当根据软件用途和广大用户的喜好,在“标准化”和“个性化”两者之间取得均衡。不仅让用户使用起来方便,而且对软件某些个性化元素留下比较深刻的印象。

    15-10  娱乐软件的个性化界面
    15.7常见界面元素的设计和应用规则
    本文总结了常见界面元素的设计和应用规则:字体,菜单,命令按钮,工具条和图标按钮,鼠标提示信息(Tooltip),RadioButton和Checkbox,输入框,标签页,Web表格控件,Web树形表控件。
    15.7.1字体的规则
    文字是用户界面中最基本的元素,是表现界面意图的最主要方式。要使用常见的规范字体,不要选择罕见的字体。英文推荐使用Ms Sans Serif、Arial、Tahoma字体,中文界面的文字一般选用宋体小五。使用粗体来表示标题或引起重视,使用斜体表示强调或提示,但不宜多用。软件界面不宜混和过多的字体,同类用途的字体应当一致,颜色不宜过多。
    15.7.2菜单的规则
    (1)菜单项的数目一般应当小于15,菜单层次少于三层(否则很难找到菜单)。
    (2)对于功能相关的菜单项,应当使用分割线分组显示。
    (3)菜单图标一般在菜单项左边,如果工具栏有相同功能的图标按钮,那么对应菜单也要有图标。
    (4)菜单文字的末尾加“…”表示执行该菜单将弹出对话框。
    (5)菜单右侧加右箭头   ,表示还有下一级菜单。
    (6)对于某一时刻不可访问的菜单,应当使其处于禁用状态(灰色),避免出现错误的操作。
    (7)Web软件一般很少使用Windows风格的多级下拉菜单,通常使用一级菜单(如右键弹出菜单),或用图标按钮取代菜单。菜单的示例见图15-11。
      
                15-11-1  多级下拉菜单的示例                15-11-2  右键弹出菜单的示例
    15.7.3命令按钮的规则
    (1)按钮上的文字是必需的,文字应当选用动词并且位于按钮中间。
    (2)窗口一般有的默认按钮,用于执行常用的操作,而非破坏性的操作。
    (3)同一个界面的命令按钮的高度和宽度应当一致,对鼠标的响应方式(如点击、移走)也一致。
    (4)如果执行命令按钮将弹出对话框,那么在按钮文字后添加“…”。
    (5)在有多页选项板的对话框中,如果按钮对所有页面有效,则放在选项板之外;如果只对某一页面有效,则放在选项板该页内。命令按钮的示例见图15-x。
    15-12  命令按钮的示例
    15.7.4工具条和图标按钮的规则
    界面元素中,图标是表现力很强的一种。某些情况下,设计合理的图标可以代替冗长的说明,并且可以精简和美化用户界面,对用户产生一种亲和力。工具条和图标按钮的示例见图15-13。
    (1)在制作图标时,要尽量使图标和具体操作含义相吻合,避免用户误解图标的含义
    (2)工具条集中了最常用的图标按钮,用纵向分割线对图标按钮进行分组。
    (3)如果图标的含义很直观,可以不加文字;反之,最好给图标加文字。
    (4)工具条的每一个图标按钮都应当有鼠标提示信息(tooltip)。
    (5)对于某一时刻不可操作的图标按钮,应当处于灰色禁用状态(disable)。
    15-13  工具条和图标按钮的示例
    15.7.5鼠标提示信息Tooltip的规则
    有些界面控件的含义比较丰富,但不能用比较长的文字来描述,则使用Tooltip。当鼠标停留在该界面控件(如图标按钮、菜单)上时,出现一个小窗口来显示提示信息,用户移走鼠标则提示信息消失。Tooltip的示例见图15-14。
    15-14 Tooltip 的示例
    15.7.6 RadioButton和Checkbox的规则
    RadioButton的选项标记是圆形按钮,选项之间是互斥的,只能选中一个,而且必须有一个缺省选中。
    Checkbox的选项标记是可以打勾的方框,选项之间没有互斥关系,可以选择一个或者多个。
    RadioButton和Checkbox的示例见图15-15。
         
    15-15 RadioButton Checkbox 的示例
    15.7.7 输入框的规则
    (1)文字左对齐,数字右对齐。
    (2)可编辑状态和不可编辑状态外表(主要是颜色)应当不同。对于不可编辑的文字区域,用户可以选择和拷贝文字。对于可编辑的文字区域,用户可以修改、剪切、拷贝、粘贴文字。
    (3)用于输入密码时,应使用*号作为掩码,此时文字不可以被剪切或拷贝。
    (4)用于输入限长字符串时,如果用户的输入超过限制长度,应当使用声音提示,而不应当继续显示超出的部分。尽量检测用户输入中的错误,以声音提示而不要显示错误的字符。输入框的示例见图15-16。
    15-16  输入框的示例
    15.7.8  标签页 的规则
    标签页 (Tabbed Pane)主要用于显示相关性较强的多页信息:
    (1)尽量使用单行标签页,避免出现多行的标签页,否则标签页被选中时,标签位置将出现大的跳动,用户不适应。
    (2)页标签的标题上最好有数字提示,若数字为零,表示没有信息,用户就不必点击查看该页面。标签页的示例见图15-17。
    15-17  标签页的示例
    15.7.9 Web表格控件的规则
    Web表格控件用于显示行、列数据,它是Web软件最常用的界面控件。Web表格和Windows表格相比,有优点也有缺点。
    Web表格控件的主要优点是:风格多样,视觉效果要比灰土色的Windows表格漂亮得多,设计者用HTML+CSS可以把Web表格做成任何样式。
    Web表格控件的主要缺点是:HTML本身只能绘制静态的表格,几乎没有任何交互。而Windows表格控件可以随意改变宽度和高度,可以在任意单元格中编辑数据等,这对于Web表格而言是极难实现的。程序员要用HTML + JavaScript编写程序,实现必要的交互功能,才能使Web表格控件具有实用性。
    Web表格控件的规则如下:
    (1)单元格应当尽量完整显示数据,如果内容太多而无法完全显示,则应当加省略号…,让用户知道还有更多信息未显示。表格的高度发生变化时,应显示完整的行,不应出现数据被遮挡的现象。改变某一列的宽度时,不要影响其他列的宽度。
    (2)如果表格的列很多,可以让用户自己设置哪些列显示或隐藏(字段设置)。
    (3)允许用户使用鼠标直接选中一列,选中后加亮该列,以示区别。如果需要选中多列,通常在表格左侧加checkbox 。
    (4)可以用鼠标左右拖动列的分割线,调整列的宽度。
    (5)如果对一行数据的操作功能很少,例如只有修改和删除操作,那么直接在表格中显示操作按钮即可。如果操作功能很多,则使用右键弹出菜单。
    (6)用鼠标点击表格任意列的“标题”,应当可以排序(升序或者降序)。经过排序后的表格,阅读起来很方便。
    (7)当数据有很多行时,表格能够自动分页,例如每页显示20行,避免页面显示和刷新很慢,导致用户失去耐心。
    (8)对某些列可以设置“过滤条件”。很多时候,人们仅仅关心符合一定条件的数据,并不想看到全部的数据。
    具有复杂交互功能的Web表格控件示例见图15-18。

    字段设置

     
    分页功能
    过滤功能
    排序功能
    右键菜单

     

    15-18  具有复杂交互功能的 Web 表格控件示例
    15.7.10 Web树形表控件的规则
    Web树形表控件是在Web表格控件基础上扩展而成的,用于显示和处理具有树形结构的数据,例如菜单树,任务树等。
    Web树形表控件的规则如下:
    (1)具备Web表格控件的基本常用功能,如鼠标选中行,改变列的宽度,右键菜单,字段的显示或隐藏,数据过滤等。
    (2)与Web表格控件的主要差异是,数据不可重新排序和分页,因为树形结构已经固定了数据顺序关系。
    (3)每个树节点都可以收缩(-)和打开(+),便于查看。
    (4)可以按照一定的规则移动数据(如上移、下移、移动到其它节点),移动之后,树形结构要做相应的改变。
    具有复杂交互功能的Web树形表控件示例见图15-19。

    移动数据

     
    右键菜单
    过滤功能
    收缩、展开

     

    15-19  具有复杂交互功能的 Web 树形表控件示例
    展开全文
  • 比特币 —— 区块链思想诞生的摇篮

    万次阅读 2019-05-17 18:26:12
    作为区块链思想诞生的源头,比特币项目值得区块链技术爱好者们仔细研究。 比特币网络是首个得到大规模部署的区块链技术应用,并且是首个得到实践检验的数字货币实现,无论在信息技术历史还是在金融学历史上都具有...

    之所以看得更远,是因为站在了巨人的肩膀上。

    作为区块链思想诞生的源头,比特币项目值得区块链技术爱好者们仔细研究。

    比特币网络是首个得到大规模部署的区块链技术应用,并且是首个得到实践检验的数字货币实现,无论在信息技术历史还是在金融学历史上都具有十分重要的意义。比特币项目在诞生和发展过程中,借鉴了来自数字货币、密码学、博弈论、分布式系统、控制论等多个领域的技术成果,可谓博采众家之长于一身。

    虽然后来的区块链技术应用已经远超越了数字货币的范畴,但探索比特币项目的发展历程和设计思路,对于深刻理解区块链技术的来龙去脉有着重要的价值。

    本章将介绍比特币项目的来源、核心原理设计、相关的工具,以及关键的技术话题。

    比特币项目简介

    比特币项目

    图 1.9.1.1 - 比特币项目

    比特币(BitCoin,BTC)是基于区块链技术的一种数字货币实现;比特币网络是历史上首个经过大规模长时间检验的数字货币系统。

    自 2009 年正式上线以来,比特币价格经历了数次的震荡,目前每枚比特币市场价格超过 2500 美金。比特币网络中总区块数接近 48 万个。

    比特币网络在功能上具有如下特点:

    • 去中心化:意味着没有任何独立个体可以对网络中交易进行破坏,任何交易请求都需要大多数参与者的共识;
    • 匿名性:比特币网络中账户地址是匿名的,无法从交易信息关联到具体的个体,但这也意味着很难进行审计;
    • 通胀预防:比特币的发行需要通过挖矿计算来进行,发行量每四年减半,总量上限为 2100 万枚,无法被超发。

    下图来自 blockchain.info 网站,可以看到比特币字诞生以来的汇率(以美元为单位)变化历史。

    比特币汇率历史

    图 1.9.1.2 - 比特币汇率历史

    比特币大事记

    2008 年 11 月 1 日 19:16:33,中本聪在 metzdowd 的加密技术邮件列表发布比特币白皮书:《Bitcoin: A Peer-to-Peer Electronic Cash System》(《比特币:一种点对点的电子现金系统》)。

    2009 年 1 月 3 日 18:15:05,中本聪在位于芬兰赫尔辛基(Helsinki)的一个小型服务器上挖出了第一批 50 个比特币,并记录下当天泰晤士报的头版标题:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks(财政大臣考虑再次紧急援助银行危机)”。第一个区块被称为创世区块或初始区块(Genesis Block),可以通过 https://blockchain.info/block-index/14849 查看其详细内容。

    2010 年 5 月 21 日,第一次比特币交易:佛罗里达程序员 Laszlo Hanyecz 用 1 万 BTC 购买了价值 25 美元的披萨优惠券。这是比特币的首个兑换汇率:1: 0.0025 美金。这些比特币在今日价值超过 8000 万美金。

    2010 年 7 月 17 日,第一个比特币交易平台成立。

    2011 年 4 月,首个有官方正式记载的版本 0.3.21 发布,支持普通用户参与到 P2P 网络中,并开始支持最小单位 “聪”。

    2011 年,开始出现基于显卡的挖矿设备。2011 年年底,比特币价格约为 2 美元。

    2012 年 6 月,Coinbase 成立,支持比特币相关交易。公司目前已经发展为全球数字资产交易平台,同时支持包括比特币、以太币等数字货币。

    2012 年 9 月 27 日,比特币基金创立,此时比特币价格为 12.46 美元。

    2012 年 11 月 28 日,比特币产量第一次减半。

    2013 年 3 月,1/3 的专业矿工已经采用专用 ASIC 矿机进行挖矿。

    2013 年 3 月 12 日,比特币发布 0.8.0 版本,大量完善了节点内部管理和网络通信,使得比特币有能力支持后来大规模的 P2P 网络。该版本包含一个严重的 bug,虽然后来被紧急修复,仍造成比特币价格大幅下跌。

    2013年 4 月 10 日,BTC 创下历史新高,266 美元。

    2013 年 6 月 27 日,德国会议作出决定:持有比特币一年以上将予以免税,被业内认为此举变相认可了比特币的法律地位,此时比特币价格为 102.24 美元。

    2013 年 10 月,世界第一台可以兑换比特币的 ATM 在加拿大上线。

    2013 年 11 月 29 日,比特币的交易价格创下 1242 美元的历史新高,而同时黄金价格为一盎司 1241.98 美元,比特币价格首度超过黄金。

    2014 年 2 月,全球最大比特币交易平台 Mt.Gox 宣告因 85 万个比特币被盗而破产并关闭,造成大量投资者的损失,比特币价格一度暴跌。

    2014 年 3 月,中国第一台可以兑换比特币的 ATM 在香港上线。

    2014 年 6 月,美国加州通过 AB-129 法案,允许比特币等数字货币在加州进行流通。

    2015 年 6 月,纽约成为美国第一个正式进行数字货币监管的州。

    2015 年 10 月,欧盟法院裁定比特币交易免征增值税。

    2015 年 10月,《经济学人》杂志发表封面文章《信任机器》,开始关注比特币网络背后的区块链技术。

    2016 年 1 月,中国人民银行在京召开了数字货币研讨会,会后发布公告宣称或推出数字货币。

    2016 年 7 月 9 日,比特币产量第二次减半。

    2016 年 8 月 3 日,知名比特币交易所 Bitfinex 遭遇安全攻击,按照当时市值计算,损失超过 6000 万美金。

    2017 年 1 月 24 日,中国三大交易所(Okcoin、火币、BTCC)开始收取比特币交易手续费,为成交金额的 0.2%。

    2017 年 7 月,比特币网络全网算力首次突破 6 exahash/s(即每秒10的18次方哈希),创下历史新高。

    时至今日,单个比特币价格一度接近 20000 美元,总市值超过 2000 亿美金。

    比特币区块链目前生成了约 47 万个区块,完整存储需要约 110 GB 的空间,每天普遍完成 20~30 万笔交易。主流的交易所包括 Bitstamp、BTC-e、Bitfinex 等。多家投资机构(包括红杉、IDG、软银、红点等)都投资了比特币相关的创业团队。

    其它数字货币

    比特币的“成功”,刺激了相关的生态和社区发展,大量类似数字货币(超过 700 种)纷纷出现,比较出名的包括以太币和瑞波(Ripple)币等。

    这些数字货币,要么建立在自己独立的区块链网络上,要么复用已有的区块链(例如比特币网络)系统。全球活跃的数字货币用户据称在 290 万 ~ 580 万之间(参考剑桥大学 Judge 商学院 2017 年 4 月发表的《GLOBAL CRYPTOCURRENCY BENCHMARKING STUDY(全球加密货币基准研究)》报告)。

    注:通过 blockchain.info 网站可以实时查询到比特币网络的状态信息,包括区块、交易在内的详细数据。

    实体货币到加密数字货币

    区块链最初的思想,诞生于无数先哲对于用加密数字货币替代实体货币的探讨和设计中。

    货币的历史演化

    众所周知,货币是人类文明发展过程中的一大发明。其最重要的职能包括价值尺度、流通手段、贮藏手段等。很难想象离开了货币,现代社会庞大而复杂的经济和金融体系如何保持运转。也正是因为它如此重要,货币的设计和发行机制是关系到国计民生的大事。

    历史上,在自然和人为因素的干预下,货币的形态经历了多个阶段的演化,包括实物货币、金属货币、代用货币、信用货币、电子货币、数字货币等。近代以前相当长的一段时间里,货币的形态一直是以实体的形式存在,可统称为“实体货币”。计算机诞生后,为货币的虚拟化提供了可能性。

    同时,货币自身的价值依托也不断发生演化,从最早的实物价值、发行方信用价值,直到今天的对科学技术和信息系统(包括算法、数学、密码学、软件等)的信任价值。

    注:中国最早关于货币的确切记载“夏后以玄币”,出现在恒宽《盐铁论·错币》。

    纸币的缺陷

    理论上,一般等价物都可以作为货币使用。当今世界最常见的货币制度是纸币本位制,因为纸质货币既方便携带、不易仿制,又相对容易辩伪。

    或许有人会认为信用卡等电子方式,相对于纸币等货币形式使用起来更为方便。确实,信用卡在某些场景下会更为便捷,但它依赖背后的集中式支付体系,一旦碰到支付系统故障、断网、缺乏支付终端等情况,信用卡就无法使用;另外,信用卡形式往往还需要额外的终端设备支持。

    目前,无论是货币形式,还是信用卡形式,都需要额外的支持机构(例如银行)来完成生产、分发、管理等操作。“中心化”的结构带来了管理和监管上的便利,但系统安全性方面存在很大挑战。诸如伪造、信用卡诈骗、盗刷、转账等安全事件屡见不鲜。

    很显然,如果能实现一种数字化的货币,保持既有货币方便易用的特性,同时消除纸质货币的缺陷,无疑将极大提高社会整体经济活动的运作效率。

    让我们来对比现有的数字货币(以比特币为例)和现实生活中的纸币,两者的优劣如下表所示。

    属性分析优势方
    便携大部分场景(特别较大数额支付时)下数字货币将具备更好的便携性。数字货币
    防伪两者各有千秋,但数字货币整体上会略胜一筹。纸币依靠的是各种设计(纸张、油墨、暗纹、夹层等)上的精巧,数字货币依靠的则是密码学上的保障。事实上,纸币的伪造时有发生,但数字货币的伪造目前还无法实现。数字货币
    辩伪纸币即使依托验钞机等专用设备仍会有误判情况,数字货币依靠密码学易于校验。数字货币胜出。数字货币
    匿名通常情况下,两者都能提供很好的匿名性。但都无法防御有意的追踪。持平
    交易对纸币来说,谁物理持有纸币谁就是合法拥有者,交易通过纸币自身的转移即可完成,无法复制。对数字货币来说则复杂得多,因为任何数字物品都是可以被复制的,但数字形式也意味着转移成本会更低。总体看,两者适用不同的情景。持平
    资源通常情况下,纸币的生产成本要远低于面额。数字货币消耗资源的计算则复杂的多。以比特币为例,最坏情况下可能需要消耗接近甚至超过其面值的电能。纸币
    发行纸币的发行需要第三方机构的参与;数字货币则通过分布式算法来完成发行。在人类历史上,通胀和通缩往往是不合理地发行货币造成的;数字货币尚缺乏大规模验证,还有待观察。持平
    管理纸币发行和回收往往通过统一机构,易于监管和审计;而目前数字货币在这方面还缺乏足够支持和验证。纸币

    可见,数字货币并非在所有领域都优于已有的货币形式。要比较两者的优劣应该针对具体情况具体分析。不带前提地鼓吹数字货币并不是一种科学和严谨的态度。实际上,仔细观察数字货币的应用情况就会发现,虽然以比特币为代表的数字货币已在众多领域得到应用,但目前还没有任何一种数字货币能完全替代已有货币。

    另外,虽然当前的数字货币“实验”已经取得了不小影响,但可见的局限也很明显:其依赖的区块链和分布式账本技术还缺乏大规模场景的考验;系统的性能和安全性还有待提升;资源的消耗过高;对监管和审计支持不足等。这些问题的解决,都有待金融科技的进一步发展。

    注:严格来讲,货币(money)不等于现金或通货(cash/currency),货币的含义范围更广。

    “去中心化”的技术难关

    虽然数字货币带来的预期优势可能很美好,但要设计和实现一套能经得住实用考验的数字货币并非易事。

    现实生活中常用的纸币具备良好的可转移性,可以相对容易地完成价值的交割。但是对于数字货币来说,因为数字化内容容易被复制,数字货币持有人可以试图将同一份货币发给多个接收者,这种攻击被称为“双重支付攻击(Double-spend Attack)”。

    也许有人会想到,银行中的货币实际上也是数字化的,因为通过电子账号里面的数字记录了客户的资产。说的没错,这种电子货币模式有人称为“数字货币 1.0”,它实际上依赖了一个前提:假定存在一个安全可靠的第三方记账机构负责记账,这个机构负责所有的担保所有的环节,最终完成交易。

    中心化控制下,数字货币的实现相对容易。但是,有些时候很难找到一个安全可靠的第三方机构,来充当这个记账者角色。

    例如,发生贸易的两国可能缺乏足够的外汇储备用以支付;汇率的变化等导致双方对合同有不同意见;网络上的匿名双方进行直接买卖而不通过电子商务平台;交易的两个机构彼此互不信任,找不到双方都认可的第三方担保;使用第三方担保系统,但某些时候可能无法连接;第三方的系统可能会出现故障或被篡改攻击……

    这个时候,就只有实现去中心化(De-centralized)或多中心化(Multi-centralized)的数字货币系统。在“去中心化”的场景下,实现数字货币存在如下几个难题:

    • 货币的防伪:谁来负责对货币的真伪进行鉴定;
    • 货币的交易:如何确保货币从一方安全转移到另外一方;
    • 避免双重支付:如何避免同一份货币支付给多个接收者。

    可见,在不存在第三方记账机构的情况下,实现一个数字货币系统的挑战着实不小。能否通过技术创新来解决这个难题呢?

    比特币融合了数十年在金融、密码学和分布式系统领域的科技成果,首次实现了可以在全球范围内运行的大规模加密货币系统。

    原理和设计

    比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。

    区块链网络提供一个公共可见的记账本,该记账本并非记录每个账户的余额,而是用来记录发生过的交易的历史信息。该设计可以避免重放攻击,即某个合法交易被多次重新发送造成攻击。

    基本交易过程

    比特币中没有账户的概念。因此,每次发生交易,用户需要将交易记录写到比特币网络账本中,等网络确认后即可认为交易完成。

    除了挖矿获得奖励的 coinbase 交易只有输出,正常情况下每个交易需要包括若干输入和输出,未经使用(引用)的交易的输出(Unspent Transaction Outputs,UTXO)可以被新的交易引用作为其合法的输入。被使用过的交易的输出(Spent Transaction Outputs,STXO),则无法被引用作为合法输入。

    因此,比特币网络中一笔合法的交易,必须是引用某些已存在交易的 UTXO(必须是属于付款方才能合法引用)作为新交易的输入,并生成新的 UTXO(将属于收款方)。

    那么,在交易过程中,付款方如何证明自己所引用的 UTXO 合法?比特币中通过“签名脚本”来实现,并且指定“输出脚本”来限制将来能使用新 UTXO 者只能为指定收款方。对每笔交易,付款方需要进行签名确认。并且,对每一笔交易来说,总输入不能小于总输出。总输入相比总输出多余的部分称为交易费用(Transaction Fee),为生成包含该交易区块的矿工所获得。目前规定每笔交易的交易费用不能小于 0.0001 BTC,交易费用越高,越多矿工愿意包含该交易,也就越早被放到网络中。交易费用在奖励矿工的同时,也避免了网络受到大量攻击。

    交易中金额的最小单位是“聪”,即一亿分之一(10^-8)比特币。

    下图展示了一些简单的示例交易。更一般情况下,交易的输入、输出可以为多方。

    交易目的输入输出签名差额
    T0A 转给 B他人向 A 交易的输出B 账户可以使用该交易A 签名确认输入减输出,为交易服务费
    T1B 转给 CT0 的输出C 账户可以使用该交易B 签名确认输入减输出,为交易服务费
    ...X 转给 Y他人向 X 交易的输出Y 账户可以使用该交易X 签名确认输入减输出,为交易服务费

    需要注意,刚放进网络中的交易(深度为 0)并非是实时得到确认的。进入网络中的交易存在被推翻的可能性,一般要再生成几个新的区块后(深度大于 0)才认为该交易被确认。

    下面分别介绍比特币网络中的重要概念和主要设计思路。

    重要概念

    账户/地址

    比特币采用了非对称的加密算法,用户自己保留私钥,对自己发出的交易进行签名确认,并公开公钥。

    比特币的账户地址其实就是用户公钥经过一系列 Hash(HASH160,或先进行 SHA256,然后进行 RIPEMD160)及编码运算后生成的 160 位(20 字节)的字符串。

    一般地,也常常对账户地址串进行 Base58Check 编码,并添加前导字节(表明支持哪种脚本)和 4 字节校验字节,以提高可读性和准确性。

    注:账户并非直接是公钥内容,而是 Hash 后的值,避免公钥过早公开后导致被破解出私钥。

    交易

    交易是完成比特币功能的核心概念,一条交易可能包括如下信息:

    • 付款人地址:合法的地址,公钥经过 SHA256 和 RIPEMD160 两次 Hash,得到 160 位 Hash 串;
    • 付款人对交易的签字确认:确保交易内容不被篡改;
    • 付款人资金的来源交易 ID:从哪个交易的输出作为本次交易的输入;
    • 交易的金额:多少钱,跟输入的差额为交易的服务费;
    • 收款人地址:合法的地址;
    • 时间戳:交易何时能生效。

    网络中节点收到交易信息后,将进行如下检查:

    • 交易是否已经处理过;
    • 交易是否合法。包括地址是否合法、发起交易者是否是输入地址的合法拥有者、是否是 UTXO;
    • 交易的输入之和是否大于输出之和。

    检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播。

    用户可以从 blockchain.info 网站查看实时的交易信息,一个示例交易的内容如下图所示。

    比特币交易的例子

    图 1.9.3.1 - 比特币交易的例子

    交易脚本

    脚本(Script) 是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。比特币脚本语言是一种非图灵完备的语言,类似 Forth 语言。

    一般每个交易都会包括两个脚本:负责输入的解锁脚本(scriptSig)和负责输出的锁定脚本(scriptPubKey)。

    输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易的输出(例如,要花费该交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。

    认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。

    输出脚本目前支持两种类型:

    • P2PKH:Pay-To-Public-Key-Hash,允许用户将比特币发送到一个或多个典型的比特币地址上(证明拥有该公钥),前导字节一般为 0x00;
    • P2SH:Pay-To-Script-Hash,支付者创建一个输出脚本,里边包含另一个脚本(认领脚本)的哈希,一般用于需要多人签名的场景,前导字节一般为 0x05;

    以 P2PKH 为例,输出脚本的格式为

    scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
    

    其中,OP_DUP 是复制栈顶元素;OP_HASH160 是计算 hash 值;OP_EQUALVERIFY 判断栈顶两元素是否相等;OP_CHECKSIG 判断签名是否合法。这条指令实际上保证了只有 pubKey 的拥有者才能合法引用这个输出。

    另外一个交易如果要花费这个输出,在引用这个输出的时候,需要提供认领脚本格式为

    scriptSig: <sig> <pubKey>
    

    其中, 是拿 pubKey 对应的私钥对交易(全部交易的输出、输入和脚本)Hash 值进行签名,pubKey 的 Hash 值需要等于 pubKeyHash。

    进行交易验证时,会按照先 scriptSig 后 scriptPubKey 的顺序进行依次入栈处理,即完整指令为:

    <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
    

    读者可以按照栈的过程来进行推算,理解整个脚本的验证过程。

    引入脚本机制带来了灵活性,但也引入了更多的安全风险。比特币脚本支持的指令集十分简单,基于栈的处理方式,并且非图灵完备,此外还添加了额外的一些限制(大小限制等)。

    区块

    比特币区块链的一个区块不能超过 1 MB,将主要包括如下内容:

    • 区块大小:4 字节;
    • 区块头:80 字节:
    • 交易个数计数器:1~9 字节;
    • 所有交易的具体内容,可变长,匹配 Merkle 树叶子节点顺序。

    其中,区块头信息十分重要,包括:

    • 版本号:4 字节;
    • 上一个区块头的 Hash 值:链接到上一个合法的块上,对其区块头进行两次 SHA256 操作,32 字节;
    • 本区块所包含的所有交易的 Merkle 树根的哈希值:两次 SHA256 操作,32 字节;
    • 时间戳:4 字节;
    • 难度指标:4 字节;
    • Nonce:4 字节,PoW 问题的答案。

    可见,要对区块链的完整性进行检查,只需要检验各个区块头部信息即可,无需获取到具体的交易内容,这也是简单交易验证(Simple Payment Verification,SPV)的基本原理。另外,通过头部的链接,提供时序关系的同时加大了对区块中数据进行篡改的难度。

    一个示例区块如下图所示。

    比特币区块的例子

    图 1.9.3.2 - 比特币区块的例子

    创新设计

    比特币在设计上提出了很多创新点,主要考虑了避免作恶、采用负反馈调节和基于概率的共识机制等三个方面。

    如何避免作恶

    基于经济博弈原理。在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。

    实际上,博弈论早已被广泛应用到众多领域。

    一个经典的例子是两个人来分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么制定规则才公平?

    最简单的一个方案是任意一个人负责分配蛋糕,并且这个人后挑选。

    注:如果推广到 N 个人呢?

    比特币网络中所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。

    负反馈调节

    比特币网络在设计上,很好的体现了负反馈的控制论基本原理。

    比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。

    反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。

    因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值),这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。

    从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140 年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。

    注:比特币最小单位是“聪”,即 10^(-8) 比特币,总“聪”数为 2.1E15。对于 64 位处理器来说,高精度浮点计数的限制导致单个数值不能超过 2^53 约等于 9E15。

    共识机制

    传统共识问题往往是考虑在一个相对封闭的分布式系统中,允许同时存在正常节点、故障节点,如何快速达成一致。

    对于比特币网络来说,它是完全开放的,可能面向各种攻击情况,同时基于 Internet 的网络质量只能保证“尽力而为”,导致问题更加复杂,传统的一致性算法在这种场景下难以实用。

    因此,比特币网络不得不对共识的目标和过程都进行了一系列限制,提出了基于 Proof of Work(PoW)的共识机制。

    首先是不实现面向最终确认的共识,而是基于概率、随时间逐步增强确认的共识。现有达成的结果在理论上都可能被推翻,只是攻击者要付出的代价随时间而指数级上升,被推翻的可能性随之指数级的下降。

    此外,考虑到 Internet 的尺度,达成共识的时间相对比较长。按照区块(一组交易)来进行阶段性的确认(快照),提高网络整体的可用性。

    最后,限制网络中共识的噪音。通过进行大量的 Hash 计算和少数的合法结果来限制合法提案的个数,进一步提高网络中共识的稳定性。

    挖矿

    基本原理

    了解比特币,最应该知道的一个概念就是“挖矿”。挖矿是参与维护比特币网络的节点,通过协助生成新区块来获取一定量新增的比特币的过程。

    当用户向比特币网络中发布交易后,需要有人将交易进行确认,形成新的区块,串联到区块链中。在一个互相不信任的分布式系统中,该由谁来完成这件事情呢?比特币网络采用了“挖矿”的方式来解决这个问题。

    目前,每 10 分钟左右生成一个不超过 1 MB 大小的区块(记录了这 10 分钟内发生的验证过的交易内容),串联到最长的链尾部,每个区块的成功提交者可以得到系统 12.5 个比特币的奖励(该奖励作为区块内的第一个交易,一定区块数后才能使用),以及用户附加到交易上的支付服务费用。即便没有任何用户交易,矿工也可以自行产生合法的区块并获得奖励。

    每个区块的奖励最初是 50 个比特币,每隔 21 万个区块自动减半,即 4 年时间,最终比特币总量稳定在 2100 万个。因此,比特币是一种通缩的货币。

    挖矿过程

    挖矿的具体过程为:参与者综合上一个区块的 Hash 值,上一个区块生成之后的新的验证过的交易内容,再加上自己猜测的一个随机数 X,一起打包到一个候选新区块,让新区块的 Hash 值小于比特币网络中给定的一个数。这是一道面向全体矿工的“计算题”,这个数越小,计算出来就越难。

    系统每隔两周(即经过 2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),来调节生成区块的时间稳定在 10 分钟左右。为了避免震荡,每次调整的最大幅度为 4 倍。历史上最快的出块时间小于 10s,最慢的出块时间超过 1 个小时。

    为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和计算力。算力一般以每秒进行多少次 Hash 计算为单位,记为 h/s。目前,比特币网络算力峰值已经达到了每秒数百亿亿次。

    汇丰银行分析师 Anton Tonev 和 Davy Jose 曾表示,比特币区块链(通过挖矿)提供了一个局部的、迄今为止最优的解决方案:如何在分散的系统中验证信任。这就意味着,区块链本质上解决了传统依赖于第三方的问题,因为这个协议不只满足了中心化机构追踪交易的需求,还使得陌生人之间产生信任。区块链的技术和安全的过程使得陌生人之间在没有被信任的第三方时产生信任。

    如何看待挖矿

    2010 年以前,挖矿还是一个非常热门的盈利行业。

    但是随着相关技术和设备的发展,现在个人进行挖矿的收益已经降得很低。从概率上说,由于当前参与挖矿的计算力实在过于庞大(已经超出了大部分的超算中心),一般的算力已经不可能挖到比特币。特别那些想着利用虚拟机来挖矿的想法,意义确实不大了。

    从普通的 CPU(2009 年)、到后来的 GPU(2010 年) 和 FPGA(2011 年末)、到后来的 ASIC 矿机(2013 年年初,目前单片算力已达每秒数百亿次 Hash 计算)、再到现在众多矿机联合组成矿池(知名矿池包括 F2Pool、BitFury、BTCC 等)。短短数年间,比特币矿机的技术走完了过去几十年的集成电路技术进化历程,并且还颇有创新之处。确实是哪里有利益,哪里的技术就飞速发展!目前,矿机主要集中在中国大陆(超过一半的算力)和欧美,大家比拼的是一定计算性能情况下低电压和低功耗的电路设计。全网的算力已超过每秒 10^18 次 Hash 计算。

    很自然地,读者可能会想到,如果有人掌握了强大的计算力,计算出所有的新区块,并且拒不承认他人的交易内容,那是不是就能破坏掉比特币网络。确实如此,基本上个体达到 1/3 的计算力,比特币网络就存在被破坏的风险了;达到 1/2 的算力,从概率上就掌控整个网络了。但是要实现这么大的算力,将需要付出巨大的经济成本。

    那么有没有办法防护呢?除了尽量避免计算力放到同一个组织手里,没太好的办法,这是目前 PoW 机制自身造成的。

    也有人认为为了共识区块的生成,大部分计算力(特别是最终未能算出区块的算力)其实都浪费了。有人提出用 PoS(Proof of Stake)和 DPoS 等协议,利用权益证明(例如持有货币的币龄)作为衡量指标进行投票,相对 PoW 可以节约大量的能耗。PoS 可能会带来囤积货币的问题。除此之外,还有活跃度证明(Proof of Activity,PoA)、消耗证明(Proof of Burn,PoB)、能力证明(Proof of Capacity, PoC)、消逝时间证明(Proof of Elapsed Time)、股权速率证明(Proof of Stake Velocity,PoSV)等,采用了不同的衡量指标。

    当然,无论哪种机制,都无法解决所有问题。一种可能的优化思路是引入随机代理人制度,通过算法在某段时间内确保只让部分节点参加共识的提案,并且要发放一部分“奖励”给所有在线贡献的节点。

    共识机制

    比特币网络是完全公开的,任何人都可以匿名接入,因此共识协议的稳定性和防攻击性十分关键。

    比特币区块链采用了 Proof of Work(PoW)的机制来实现共识,该机制最早于 1998 年在 B-money 设计中提出。

    目前,Proof of X 系列中比较出名的一致性协议包括 PoW、PoS 和 DPoS 等,都是通过经济惩罚来限制恶意参与。

    工作量证明

    工作量证明,通过计算来猜测一个数值(nonce),使得拼凑上交易数据后内容的 Hash 值满足规定的上限(来源于 hashcash)。由于 Hash 难题在目前计算模型下需要大量的计算,这就保证在一段时间内,系统中只能出现少数合法提案。反过来,能够提出合法提案,也证明提案者确实已经付出了一定的工作量。

    同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后,会基于用户认为的最长链基础上继续难题的计算。因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为最长的链。

    Hash 问题具有不可逆的特点,因此,目前除了暴力计算外,还没有有效的算法进行解决。反之,如果获得符合要求的 nonce,则说明在概率上是付出了对应的算力。谁的算力多,谁最先解决问题的概率就越大。当掌握超过全网一半算力时,从概率上就能控制网络中链的走向。这也是所谓 51% 攻击的由来。

    参与 PoW 计算比赛的人,将付出不小的经济成本(硬件、电力、维护等)。当没有最终成为首个算出合法 nonce 值的“幸运儿”时,这些成本都将被沉没掉。这也保障了,如果有人尝试恶意破坏,需要付出大量的经济成本。也有设计试图将后算出结果者的算力按照一定比例折合进下一轮比赛考虑。

    有一个很直观的超市付款的例子,可以说明为何这种经济博弈模式会确保系统中最长链的唯一性。

    Pow 保证一致性

    图 1.9.5.1 - Pow 保证一致性

    假定超市只有一个出口,付款时需要排成一队,可能有人不守规矩要插队。超市管理员会检查队伍,认为最长的一条队伍是合法的,并让不合法的分叉队伍重新排队。新到来的人只要足够理智,就会自觉选择最长的队伍进行排队。这是因为,看到多条链的参与者往往认为目前越长的链具备越大的胜出可能性,从而更倾向于选择长的链。

    权益证明

    权益证明(Proof of Stake,PoS),最早在 2013 年被提出,最早在 Peercoin 系统中被实现,类似现实生活中的股东机制,拥有股份越多的人越容易获取记账权(同时越倾向于维护网络的正常工作)。

    典型的过程是通过保证金(代币、资产、名声等具备价值属性的物品即可)来对赌一个合法的块成为新的区块,收益为抵押资本的利息和交易服务费。提供证明的保证金(例如通过转账货币记录)越多,则获得记账权的概率就越大。合法记账者可以获得收益。

    PoS 试图解决在 PoW 中大量资源被浪费的缺点,受到了广泛关注。恶意参与者将存在保证金被罚没的风险,即损失经济利益。

    一般的,对于 PoS 来说,需要掌握超过全网 1/3 的资源,才有可能左右最终的结果。这个也很容易理解,三个人投票,前两人分别支持一方,这时候,第三方的投票将决定最终结果。

    PoS 也有一些改进的算法,包括授权股权证明机制(DPoS),即股东们投票选出一个董事会,董事会中成员才有权进行代理记账。这些算法在实践中得到了不错的验证,但是并没有理论上的证明。

    2017 年 8 月,来自爱丁堡大学和康涅狄格大学的 Aggelos Kiayias 等学者在论文《Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol》中提出了 Ouroboros 区块链共识协议,该协议可以达到诚实行为的近似纳什均衡,认为是首个可证实安全的 PoS 协议。

    闪电网络

    比特币的交易网络最为人诟病的一点便是交易性能:全网每秒 7 笔左右的交易速度,远低于传统的金融交易系统;同时,等待 6 个块的可信确认将导致约 1 个小时的最终确认时间。

    为了提升性能,社区提出了闪电网络等创新的设计。

    闪电网络的主要思路十分简单——将大量交易放到比特币区块链之外进行,只把关键环节放到链上进行确认。该设计最早于 2015 年 2 月在论文《The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments》中提出。

    比特币的区块链机制自身已经提供了很好的可信保障,但是相对较慢;另一方面考虑,对于大量的小额交易来说,是否真需要这么高的可信性?

    闪电网络主要通过引入智能合约的思想来完善链下的交易渠道。核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和 HTLC(Hashed Timelock Contract)。前者解决了链下交易的确认问题,后者解决了支付通道的问题。

    RSMC

    Recoverable Sequence Maturity Contract,即“可撤销的顺序成熟度合同”。这个词很绕,其实主要原理很简单,类似资金池机制。

    首先假定交易双方之间存在一个“微支付通道”(资金池)。交易双方先预存一部分资金到“微支付通道”里,初始情况下双方的分配方案等于预存的金额。每次发生交易,需要对交易后产生资金分配结果共同进行确认,同时签字把旧版本的分配方案作废掉。任何一方需要提现时,可以将他手里双方签署过的交易结果写到区块链网络中,从而被确认。从这个过程中可以可以看到,只有在提现时候才需要通过区块链。

    任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现时需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果,被双方确认过,但未必是最新的结果)。在一定时间内,如果另外一方拿出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑方;否则按照提出方的结果进行分配。罚没机制可以确保了没人会故意拿一个旧的交易结果来提现。

    另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间要晚于对方,这就鼓励大家尽量都在链外完成交易。通过 RSMC,可以实现大量中间交易发生在链外。

    HTLC

    微支付通道是通过 Hashed Timelock Contract 来实现的,中文意思是“哈希的带时钟的合约”。这个其实就是限时转账。理解起来也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。

    不太恰当的例子,约定一定时间内,有人知道了某个暗语(可以生成匹配的哈希值),就可以拿到这个指定的资金。

    推广一步,甲想转账给丙,丙先发给甲一个哈希值。甲可以先跟乙签订一个合同,如果你在一定时间内能告诉我一个暗语,我就给你多少钱。乙于是跑去跟丙签订一个合同,如果你告诉我那个暗语,我就给你多少钱。丙于是告诉乙暗语,拿到乙的钱,乙又从甲拿到钱。最终达到结果是甲转账给丙。这样甲和丙之间似乎构成了一条完整的虚拟的“支付通道”。

    HTLC 机制可以扩展到多个人的场景。

    闪电网络

    RSMC 保障了两个人之间的直接交易可以在链下完成,HTLC 保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。闪电网络整合这两种机制,就可以实现任意两个人之间的交易都在链下完成了。

    在整个交易中,智能合约起到了中介的重要角色,而区块链网络则确保最终的交易结果被确认。

    侧链

    侧链(Sidechain)协议允许资产在比特币区块链和其他区块链之间互转。这一项目也来自比特币社区,最早是在 2013 年 12 月提出,2014 年 4 月立项,由 Blockstream 公司(由比特币核心开发者 Adam Back、Matt Corallo 等共同发起成立)主导研发。侧链协议于 2014 年 10 月在白皮书《Enabling Blockchain Innovations with Pegged Sidechains》中公开。

    侧链诞生前,众多“山寨币”的出现正在碎片化整个数字货币市场,再加上以太坊等项目的竞争,一些比特币开发者希望能借助侧链的形式扩展比特币的底层协议。

    简单来讲,以比特币区块链作为主链(Parent chain),其他区块链作为侧链,二者通过双向挂钩(Two-way peg),可实现比特币从主链转移到侧链进行流通。

    比特币侧链

    图 1.9.7.1 - 比特币侧链

    侧链可以是一个独立的区块链,有自己按需定制的账本、共识机制、交易类型、脚本和合约的支持等。侧链不能发行比特币,但可以通过支持与比特币区块链挂钩来引入和流通一定数量的比特币。当比特币在侧链流通时,主链上对应的比特币会被锁定,直到比特币从侧链回到主链。可以看到,侧链机制可将一些定制化或高频的交易放到比特币主链之外进行,实现了比特币区块链的扩展。侧链的核心原理在于能够冻结一条链上的资产,然后在另一条链上产生,可以通过多种方式来实现。这里讲解 Blockstream 提出的基于简单支付验证(Simplified Payment Verification,SPV)证明的方法。

    SPV 证明

    如前面章节所述,在比特币系统中验证交易时,涉及到交易合法性检查、双重花费检查、脚本检查等。由于验证过程需要完整的 UTXO 记录,通常要由运行着完整功能节点的矿工来完成。

    而很多时候,用户只关心与自己相关的那些交易,比如当用户收到其他人号称发来的比特币时,只希望能够知道交易是否合法、是否已在区块链中存在了足够的时间(即获得足够的确认),而不需要自己成为完整节点做出完整验证。

    中本聪设计的简单支付验证(Simplified Payment Verification,SPV)可以实现这一点。SPV 能够以较小的代价判断某个支付交易是否已经被验证过(存在于区块链中),以及得到了多少算力保护(定位包含该交易的区块在区块链中的位置)。SPV 客户端只需要下载所有区块的区块头(Block Header),并进行简单的定位和计算工作就可以给出验证结论。

    侧链协议中,用 SPV 来证明一个交易确实已经在区块链中发生过,称为 SPV 证明(SPV Proof)。一个 SPV 证明包括两部分内容:一组区块头的列表,表示工作量证明;一个特定输出(output)确实存在于某个区块中的密码学证明。

    双向挂钩

    侧链协议的设计难点在于如何让资产在主链和侧链之间安全流转。简而言之,接受资产的链必须确保发送资产的链上的币被可靠锁定。

    侧链双向挂钩的过程

    图 1.9.7.2 - 侧链双向挂钩的过程

    具体,协议采用双向挂钩机制实现比特币向侧链转移和返回。主链和侧链需要对对方的特定交易做 SPV 验证。完整过程如下:

    • 当用户要向侧链转移比特币时,首先在主链创建交易,待转移的比特币被发往一个特殊的输出。这些比特币在主链上被锁定。
    • 等待一段确认期,使得上述交易获得足够的工作量确认。
    • 用户在侧链创建交易提取比特币,需要在这笔交易的输入指明上述主链被锁定的输出,并提供足够的 SPV 证明。
    • 等待一段竞争期,防止双重花费攻击。
    • 比特币在侧链上自由流通。
    • 当用户想让比特币返回主链时,采取类似的反向操作。首先在侧链创建交易,待返回的比特币被发往一个特殊的输出。先等待一段确认期后,在主链用足够的对侧链输出的 SPV 证明来解锁最早被锁定的输出。竞争期过后,主链比特币恢复流通。

    最新进展

    侧链技术最早由 Blockstream 公司进行探索,于 2015 年 10 月联合合作伙伴发布了基于侧链的商业化应用 Liquid。

    基于一年多的探索,Blockstream 于 2017 年 1 月发表文章《Strong Federations: An Interoperable Blockchain Solution to Centralized Third Party Risks》,被称为对侧链早期白皮书的补充和改良。白皮书中着重描述了联合挂钩(Federated Pegs)的相关概念和应用。

    此外,还有一些其他公司或组织也在探索如何合理地应用侧链技术,包括 ConsenSys、Rootstock、Lisk 等。

    热点问题

    设计中的权衡

    比特币的设计目标在于支持一套安全、开放、分布式的数字货币系统。围绕这一目标,比特币协议的设计中很多地方都体现了权衡(trade-off)的思想。

    • 区块容量:更大的区块容量可以带来更高的交易吞吐率,但会增加挖矿成本,带来中心化的风险,同时增大存储的代价。兼顾多方面的考虑,当前的区块容量上限设定为 1MB。
    • 出块间隔时间:更短的出块间隔可以缩短交易确认的时间,但也可能导致分叉增多,降低网络可用性。
    • 脚本支持程度:更强大的脚本指令集可以带来更多灵活性,但也会引入更多安全风险。

    分叉

    比特币协议不会一成不变。当需要修复漏洞、扩展功能或调整结构时,比特币需要在全网的配合下进行升级。升级通常涉及更改交易的数据结构或区块的数据结构。

    由于分布在全球的节点不可能同时完成升级来遵循新的协议,因此比特币区块链在升级时可能发生分叉(Fork)。对于一次升级,如果把网络中升级了的节点称为新节点,未升级的节点称为旧节点,根据新旧节点相互兼容性上的区别,可分为软分叉(Soft Fork)和硬分叉(Hard Fork)。

    • 如果旧节点仍然能够验证接受新节点产生的交易和区块,则称为软分叉。旧节点可能不理解新节点产生的一部分数据,但不会拒绝。网络既向后和向前兼容,因此这类升级可以平稳进行。
    • 如果旧节点不接受新节点产生的交易和区块,则称为硬分叉。网络只向后兼容,不向前兼容。这类升级往往引起一段时间内新旧节点所认可的区块不同,分出两条链,直到旧节点升级完成。

    尽管通过硬分叉升级区块链协议的难度大于软分叉,但软分叉能做的事情毕竟有限,一些大胆的改动只能通过硬分叉完成。

    交易延展性

    交易延展性(Transaction Malleablility)是比特币的一个设计缺陷。简单来讲,是指当交易发起者对交易签名(sign)之后,交易 ID 仍然可能被改变。

    下面是一个比特币交易的例子。

    {
      "txid": "f200c37aa171e9687452a2c78f2537f134c307087001745edacb58304053db20",
      "version": 1,
      "locktime": 0,
      "vin": [
        {
          "txid": "21f10dbfb0ff49e2853629517fa176dc00d943f203aae3511288a7dd89280ac2",
          "vout": 0,
          "scriptSig": {
            "asm": "304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a33e712870503438d8be2d66a0102204782a2714215dc0d581e1d435b41bc6eced2c213c9ba0f993e7fcf468bb5d311[ALL] 025840d511c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a26299",
            "hex": "47304402204f7fb0b1e0d154db27dbdeeeb8db7b7d3b887a33e712870503438d8be2d66a0102204782a2714215dc0d581e1d435b41bc6eced2c213c9ba0f993e7fcf468bb5d3110121025840d511c4bc6690916270a54a6e9290fab687f512c18eb2df0428fa69a26299"
          },
          "sequence": 4294967295
        }
      ],
      "vout": [
        {
          "value": 0.00167995,
          "n": 0,
          "scriptPubKey": {
            "asm": "OP_DUP OP_HASH160 7c4338dea7964947b3f0954f61ef40502fe8f791 OP_EQUALVERIFY OP_CHECKSIG",
            "hex": "76a9147c4338dea7964947b3f0954f61ef40502fe8f79188ac",
            "reqSigs": 1,
            "type": "pubkeyhash",
            "addresses": [
              "1CL3KTtkN8KgHAeWMMWfG9CPL3o5FSMU4P"
            ]
          }
        }
      ]
    }
    

    发起者对交易的签名(scriptSig)位于交易的输入(vin)当中,属于交易内容的一部分。交易 ID(txid)是整个交易内容的 Hash 值。这就造成了一个问题:攻击者(尤其是签名方)可以通过改变 scriptSig 来改变 txid,而交易仍旧保持合法。例如,反转 ECDSA 签名过程中的 S 值,签名仍然合法,交易仍然能够被传播。

    这种延展性攻击能改变交易 ID,但交易的输入和输出不会被改变,所以攻击者不会直接盗取比特币。这也是为什么这一问题能在比特币网络中存在如此之久,而仍未被根治。

    然而,延展性攻击仍然会带来一些问题。比如,在原始交易未被确认之前广播 ID 改变了的交易可能误导相关方对交易状态的判断,甚至发动拒绝服务攻击;多重签名场景下,一个签名者有能力改变交易 ID,给其他签名者的资产带来潜在风险。同时,延展性问题也会阻碍闪电网络等比特币扩展方案的实施。

    扩容之争

    比特币当前将区块容量限制在 1MB 以下。如图所示,随着用户和交易量的增加,这一限制已逐渐不能满足比特币的交易需求,使得交易日益拥堵、交易手续费不断上涨。

    日益增加的区块容量

    图 1.9.8.1 - 日益增加的区块容量

    关于比特币扩容的持续争论从 2015 年便已开始,期间有一系列方案被摆上台面,包括各种链上扩容提议、用侧链或闪电网络扩展比特币等。考虑到比特币复杂的社区环境,其扩容方案早已不是一方能说了算;而任何一个方案想让要达成广泛共识都比较困难,不同的方案之间也很难调和。

    当前,扩容之争主要集中在两派:代表核心开发者的 Bitcoin Core 团队主推的隔离见证方案,和 Bitcoin Unlimited 团队推出的方案。

    隔离见证方案

    隔离见证(Segregated Witness,简称 SegWit)是指将交易中的签名部分从交易的输入中隔离出来,放到交易末尾的被称为见证(Witness)的字段当中。

    对交易 ID 的计算将不再包含这一签名部分,所以这也是延展性问题的一种解法,给引入闪电网络等第二层协议增强了安全性。

    同时,隔离见证会将区块容量上限理论上提高到 4MB。对隔离见证的描述可详见五个比特币改进协议(Bitcoin Improvement Proposal):BIP 141 ~ BIP 145。

    Bitcoin Unlimited 方案

    Bitcoin Unlimited 方案(简称 BU)是指扩展比特币客户端,使矿工可以自由配置他们想要生成和验证的区块的容量。

    根据方案的设想,区块容量的上限会根据众多节点和矿工的配置进行自然收敛。Bitcoin Unlimited Improvement Proposal(BUIP) 001 中表述了这一对比特币客户端的拓展提议,该方案已获得一些大型矿池的支持和部署。

    比特币的监管和追踪

    比特币的匿名特性,使得其上交易的监管变得十分困难。

    不少非法分子利用这一点,通过比特币转移资金。例如 WannaCry 网络病毒向受害者勒索比特币,短短三天时间里传播并影响到全球 150 多个国家。尽管这些不恰当的行为与比特币项目自身并无直接关系,但都或多或少给比特币社区带来了负面影响。

    实际上,认为通过比特币就可以实现完全匿名化并不现实。虽然交易账户自身是匿名的 Hash 地址,但一些研究成果(如《An analysis of anonymity in the bitcoin system》)表明,通过分析大量公开可得的交易记录,有很大概率可以追踪到比特币的实际转移路线,甚至可以追踪到真实用户。

    相关工具

    比特币相关工具包括客户端、钱包和矿机等。

    客户端

    比特币客户端用于和比特币网络进行交互,同时可以参与到网络的维护。

    客户端分为三种:完整客户端、轻量级客户端和在线客户端。

    • 完整客户端:存储所有的交易历史记录,功能完备;
    • 轻量级客户端:不保存交易副本,交易需要向别人查询;
    • 在线客户端:通过网页模式来浏览第三方服务器提供的服务。

    比特币客户端可以从 https://bitcoin.org/en/download 下载到。

    基于比特币客户端,可以很容易实现用户钱包功能。

    钱包

    比特币钱包存储和保护用户的私钥,并提供查询比特币余额、收发比特币等功能。根据私钥存储方式不同,钱包主要分为以下几种:

    • 离线钱包:离线存储私钥,也称为“冷钱包”。安全性相对最强,但无法直接发送交易,便利性差。
    • 本地钱包:用本地设备存储私钥。可直接向比特币网络发送交易,易用性强,但本地设备存在被攻击风险。
    • 在线钱包:用钱包服务器存储经用户口令加密过的私钥。易用性强,但钱包服务器同样可能被攻击。
    • 多重签名钱包:由多方共同管理一个钱包地址,比如 2 of 3 模式下,集合三位管理者中的两位的私钥便可以发送交易。

    比特币钱包可以从 https://bitcoin.org/en/choose-your-wallet 获取到。

    矿机

    比特币矿机是专门为“挖矿”设计的硬件设备,目前主要包括基于 GPU 和 ASIC 芯片的专用矿机。这些矿机往往采用特殊的设计来加速挖矿过程中的计算处理。

    矿机最重要的属性是可提供的算力(通常以每秒可进行 Hash 计算的次数来表示)和所需要的功耗。当算力足够大,可以在概率意义上挖到足够多的新的区块,来弥补电力费用时,该矿机是可以盈利的;当单位电力产生的算力不足以支付电力费用时,该矿机无法盈利,意味着只能被淘汰。

    目前,比特币网络中的全网算力仍然在快速增长中,矿工需要综合考虑算力变化、比特币价格、功耗带来的电费等许多问题,需要算好“经济账”。

    本章小结

    本章介绍了比特币项目的相关知识,包括核心技术、工具、设计,以及最新的闪电网络、侧链和扩容讨论等进展。

    比特币自身作为数字货币领域的重大突破,对分布式记账领域有着很深远的影响。尤其是其底层的区块链技术,已经受到金融和信息行业的重视,在许多场景下都得到应用。

    通过本章的剖析,可以看出,比特币网络系统中并没有完全从头进行创新的技术,而是有机地组合了密码学、博弈论、记账技术、分布式系统和网络、控制论等领域的已有成果。有人认为,比特币发明人对于对这些技术的应用也并没有达到十分专业的地步。但正是如此巧妙的组合,让比特币项目能完成这样一件了不起的创举,也体现出了发明者堪比大师的境界。

    展开全文
  • 重视基础学习的大一同学

    千次阅读 2012-07-23 20:23:04
    也就是只知道一些语法相关知识,另外离散数学听学哥说很重要,可是我学习了一个学期在编程上没有用过,对于离散在计算机编程中有什么作用我也懂,希望老师能够回答我几个问题,谢谢您! 1,离散
  • 模块设计思想

    千次阅读 2015-11-09 09:27:00
    我一般讲模块设计的时候,都会先讲架构相关的一些东西,首先架构师必须重视的第一件事情是需求,因为架构的目的是为了满足需求,这一点千万能搞错。谈到架构,很多人都会喜欢说,我设计了一个牛逼的框架。但是我...
  • 搞焊接的,对每一焊点质量充分保证,能钻研进去,在这方面成为专家,也有价值上的承认,照样拿工资。他们是为生活好而奋斗,多挣钱买房、买车、旅游。干什么爱什么。而我们的青年人,干干就想着提升,就想脱离自己...
  • 在这大跃进的三年中,如果我们乱,则在很大程度上取决于秘书系统乱,有条不紊。 华为公司的整体水平在提升,如果我们的秘书跟上趟,则你们就拖了公司很大的后腿。 我认为,通过这次考核,工作应有调整,...
  • 他在C++方面看的书比我多,他学习C++的历程也值得效仿,但他的学习方式也存在合理的一面。我不得避开具体的C++的问题,建议他在交流(与人、与书、与网络)方面有所改变,同时也建议他在实践上立刻行动起来。...
  • 1、领域名词解释 稳定性(Reliability)、可用性(Availability)、可维护性(Maintainability),是三个有关联的概念、合称RAM,较为容易混淆,因此本需要特别说明一下。...“ 稳定性并纯粹、搞混淆...
  • ERP的管理思想

    万次阅读 2012-10-30 10:16:46
    ERP的管理思想 MRP是ERP的核心功能 只要是"制造业",就必然要从供应方买来原材料,经过加工或装配,制造出产品,销售给需求方,这也是制造业区别于金融业、商业、采掘业(石油、矿产)、服务业的主要特点。任何...
  • Lasso思想及算法

    万次阅读 2013-09-30 15:45:45
    Lasso思想及算法 分类: 机器学习 math2013-09-08 16:59 30人阅读 评论(0) 收藏 举报 lasso 最优化 本文转载自:http://liuzg202.blog.163.com/blog/static/29427196201010259233251/ ,致谢...
  • [b]摘要:[/b]当今整个社会进入了一个高度发达的物质文明的时代,人们对于自己所创造的造物世界的依赖程度变得前所未有的程度,人类自觉地逐渐走向了一个自我的“物化”。面对这种情况,人们也已逐渐认识到这种...
  • 聚类分析(一)基本思想

    万次阅读 2018-09-11 21:41:00
    聚类分析 1.什么是聚类分析 聚类分析是将个体或对象分类,使得同一类中的对象之间的相似性比其他类的对象的相似性更强。 2.目的 目的是把相似的研究对象归成类,使类内对象的同质性...3.聚类分析的基本思想 ...
  • 思想交锋:证券业数字化转型实践

    千次阅读 2019-03-07 21:07:28
    思想交锋:证券业数字化转型实践 原创: 金融电子化 金融电子化 今天 文 / 本刊记者 韩维蜜 数字化转型已经成为行业共识,目前各方探讨的已经不是要不要发力数字化转型,而是如何开展数字化转型。从资本市场来看,...
  • 应该了解的世界思想名著

    千次阅读 2012-04-02 23:11:00
    深感现在的理科生人文素养实在是太缺乏了,还是...女儿让我给她列出应该了解或阅读的世界思想名著,挑选了在人类思想史上影响最大的名著推荐给她。   林语堂曾说,读书就应该读那些最高尚的和最下流的。了解或阅读
  • 业务流程优化设计之思想和原则

    千次阅读 2008-11-23 08:31:00
    谈到ERP理论的核心思想,大致都离开“企业流程优化和再造”、但到底什么是“企业流程优化(再造)”,又应依据什么来对企业进行“流程优化”或者“流程再造”呢,下文将详细论述: 核心思想和总体思路 业务流程...
  • ERP业务流程优化设计之思想和原则

    千次阅读 2010-09-01 13:14:00
    ERP业务流程优化设计之思想和原则  谈到ERP理论的核心思想,大致都离开“企业流程优化和再造”、但到底什么是“企业流程优化(再造)”,又应依据什么来对企业进行“流程优化”或者“流程再造”呢,下文将...
  • 高级系统架构师培训笔记

    万次阅读 多人点赞 2014-09-14 16:55:14
    系统架构师的工作是复杂设计总体解决方案以及领域对象的逻辑和物理布局,这是一项在复杂环境中风险、影响力的活动。 1、软件架构的定义:软件架构(Software Architecture)也称之为软件体系结构,它是一组有关...
  • 敏捷开发 宣言 思想 认识误区

    千次阅读 2014-12-11 14:16:50
     也就是说,尽管右项有其价值,我们更重视左项的价值。  We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:  ...
  • 算法的领悟(上):枚举思想

    千次阅读 2010-05-16 20:47:00
    这让我想起很多生活在我们身边关心着我们的人,我们对他们总有点或烦或平淡无奇以致讨厌,但是我们却离开,比如唠叨的老爸老妈。首先我们看一看枚举思想的威力吧,我们就是通过这个例子,感悟(perceive)到了枚举...
  • 思想实验及其在科学发展中的作用

    千次阅读 2007-05-24 16:42:00
    摘 要:思想实验是有别于真实实验的一种理性思维活动。在近代科学发展的过程中,思想实验以其思维的独特性、深刻的创造力而大放异彩。伽利略、马赫、爱因斯坦等大科学家对此曾有专文进行探讨和研究。深入研究思想...
  • 数学思想方法的几次重大转折

    千次阅读 2008-03-10 18:19:00
    摘自 譚建國《數學美賞析(下)》kemin稍作整理—本文作者任教於中國雲南大學數學系、 基礎數學研究所—(一)数学思想方法的几次重大转折 历史表明,数学的发展,不仅表现为量的积累,而且还表现为质的飞跃。数学思想...
  • 你们都知道的,我本身肯定是达到技术专家的地步的。 我不是但是我身边很多人是,字节跳动,PDD,阿里等等的大佬我认识很多,所以以下是我问了他们的成长路径的总结,还是具有一定的代表性。 身边这些朋友都是在...
  • 知道别人看完了想法如何,无非有的窃喜,有的麻木,有的愤怒一下,凡此总总,当然,我更希望更多的人能够进行思考,这种理由拒绝合适吗?合适,合理吗?怎么就合理了,违背了什么社会底线了--如果还能找到的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,669
精华内容 14,267
关键字:

思想重视程度不高