转:「连接未来」

身份

身份定义个人。

我们来想象一下,如果有一天早上起来,突然发现自己的「身份」完全无法确定了,或者说我的「身份安全」出现了问题,会发生什么。

一早我手机上的闹钟把我叫醒,但设备上指纹解锁的功能突然失效,手机解锁不了。我带着响个不停的手机出门,打开摩拜单车扫码,蚂蚁信用告知我的信用已经归零,交了押金,骑车到了银行来办理房屋贷款手续。银行查不到任何我的征信记录、收入记录或者社保记录,拒贷。走出了银行,手机发出了持续震动,无数条信用卡消费提醒弹了出来,消费地点有巴西、印度、尼泊尔等等,金额巨大。我立刻打车到警察局报警,警察扫描了我的身份证后,说我的身份不存在于中国公民系统中,无法立案。我回到家,打开贴吧想要把我这一天的经历吐槽一番,但是登录一直失败,密码找回,登录上去了之后,发现自己的昵称被改成了别人,自己的账号在今天发了很多八卦帖子。

硬设备、软应用、企业、政府机构乃至国家本身,都会「否认」我。除了我的朋友和亲人以外,甚至都可以无法判别我的存在。

听起来很不错吧?如果上面的情况太极端,我们只需要想象一下身份证或者信用卡如果丢了,我们会有多着急,就能够理解「身份」的重要性了。

现实生活中,每个人的所有系统中的「身份」定义了该个体的存在职能,甚至赋予了个人存在的意义或价值。

你可能认为你知道自己的身份是什么,但实际情况远比设想的要更危险和复杂。在我们进入雷区之前,我们先来回顾一下身份的含义。

所有的共有社会机制,全都是为了服务社会的某种发展倾向而创造出来的。身份也是如此,其本身毫无意义,亦无确切价值,但当和实际的人们需要结合起来之后,它就有了无穷的变种和使用场景。

当人有了私有物品意识,便会希望维持其所有权不受他人侵犯。31,000 年前,在一些有固定规范和共识的小亚细亚部落中,人们将自己的手掌通过雕刻的方式印记在某些物品上,以此来标记身份。在部落成员尽皆认可的情况下,身份用来标记物品所属,是维系私有财产的纽带。

公元前 450 年,各文明古国的规模不断扩张,古波斯一位叫做 Nehemiah 的官员获取到了有史以来第一份旅行文件——「护照」,前往犹大公干。在这个场景中,护照代表着身份,在两国使节未曾谋面的情况下,提供了可信的身份保障,成为了成功对等交流的基础。耳熟能详唐玄奘的通关文牒,与此有异曲同工之妙。

公元 14 世纪,机缘巧合下,商贸盛行的地中海沿岸出现了资本主义萌芽,私有银行开始出现。银行家们将钱小额借贷给平民,大额借贷给政府军政组织,并以收息为利。在这个场景中,与身份挂钩的是背景、权力和信用。当银行家可以确定某个人的身份,就可以对其身份所代表的偿还能力进行评估,继而有的放矢地借贷,对贵族给予更高额度,对贫穷者者关上大门。

1986年,中国通行现代身份证系统。在那之前,如果要证明身份,除了户口本以外,还需要携带档案、介绍信,甚至需要相熟之人互相介绍才能顺利,而身份证出现了之后,一切需要使用居民身份的场景:火车验票、银行开户、办理驾照、申请工作、居住上学等等流程也都随之简化,继而普及开来。

上面四个例子从古到今描述了使用了身份的四个场景,实际上也体现了身份在四个方面的作用,依次为「权属」、「交流」、「信用」和「社会」方面。

「权属」或者「权限」是最直观的身份的作用,表示了人和物之间的关系,而当资源出现富余,非劳动性质工种出现后,会出现贸易、战争、外交、宗教等复杂的人与人之间的「交流」,部落画地为圆成为了城邦和国家,由身份开始演变出地位、权力和财富。工商业的发展促生了资本主义,于是一个人的身份上又捆绑了更多的概念:「信用」、权益、还款能力、存款量等等。而进入了现代,社会的发展和保障体系愈发完善,与整个国家相对应的「统一身份」体系出现了,在国家范围内,身份证件打通了同一个自然人在不同国家系统中的各个身份,在某种程度上得到了身份与认证的完整统一,而随之而来的,是社会效率大幅增高、社会发展进程急速加快。

可以看得出来这四个层面并非是随机顺序,而是按照着人类文明的进程而逐次展开,随着人类社会的广度和深度在不断延伸,「身份」作为社会基础元素的功能也不断地进化发展。每当有突破性的技术发展或社会变革的时候,身份就会随之在新的世界中有了新的、不断累加的定义,其重要性也随着社群范围扩大、系统愈发多样复杂而急剧提升。

每当世界或某些特定场景发生了重要变革的时候,身份系统作为基本属性,也会随之发生进化。变革越巨大,进化也就越明显。

而当前的世界,正正处在历史上最巨大的变革之中。


变革

世界每次革命的起源,都是基础技术和理论的发明、稳定并且推广所带来的,而初始研究基础的人,对他们所研究事务的未来影响力,往往毫无概念。很少有人意识到,身份安全作为「信息化」革命的底层基础,到底有着多么特殊的重要性,也因此,这个话题值得我们去深入探讨。

「信息化」变革有诸多特性,不一而足,最明显也最基础的,是「数字化」。

数十年前,随着基础网络技术的不断拓延,最基础的书籍资料等最开始被数字化保存,之后邮箱的出现代表着网络超低成本超距交流的出现,再往后随着互联网的出现和成熟,一批批的渗透到我们生活方方面面的硬件和应用软件前赴后继而来,周围一切牵扯到数据和交流的机制,正在以不可阻挡的速度完成它们各自的数字化进程。

实在太快了。

人类历史记录中并无这种短时间内翻天覆地的记录,社会的有机自适应力远远跟不上时代的变迁。

在历史中,我们有数百、上千年甚至上万年的时间来消化某一项历史进程带来的革新,有充分的缓冲来释放新技术新理念带来的突破性压力。而现在,数千年的沧海桑田被压缩成了十年光怪陆离,技术革新带来的突破像气球内的不断生长的针尖,时刻在挑战试图爆破。

海量的数据和系统正在不顾一切地迁移到网络中,好尽快开始享受网络带来的巨大便利、低廉成本和规模化效应,不仅仅是一些相对无关痛痒的娱乐、咨询、交际等轻应用,很多军事、政府机构数据、金融、财务、征信体系、个人隐私、保密数据也同样接入了这巨大的网络社会中。

很少有人意识到在这繁花紧簇之下孕育的巨大危机。

你看到问题了吗?

当身份问题最多只能导致社交网站信息泄露,邮箱无法登录,或者游戏平台账号被盗窃使用的时候,我们并不会太过惊慌,因为这些应用与现实社会的接触面并不太广,能造成的损失也非常有限。然而,随着巨大车轮的运转,随着诸多更严密的场景、数据、应用的数字化,网络世界和我们真正生活愈发纠葛不清,风险可能造成的损失也成倍增加。

很多人开始拥抱各种IoT技术产物,能否设想一下,如果烟雾探测器被强制登录并手动触发了警报,会发生什么?如果在自动驾驶过程中GPS信号被劫持到了塔克拉玛干沙漠中,会发生什么?如果自己家的智能门锁认证机制被攻破,任何人的指纹都可以验证通过,又会发生什么?而我们作为新鲜事物尝鲜者,在应用落地相对早期,在相关规定法律条文仍未成型的时期,真的可以维护自己的生命财产安全吗?

和很多人设想的不同,身份保障是一套完整的体系,并非是在某些聚焦点做好就足够的。我们知道,某些城市中,所有交通路段的监控摄像头,访问使用的都是统一的默认密码,而默认密码,就写在摄像头设备的背面。也就是说,理论上只要知道摄像头的公开访问地址,并且拿把梯子爬到摄像头背面照张相,就能够访问到整个城市的交通设想体系中,并进行监控、篡改甚至破坏。

是摄像头的安全质量不过关吗?不见得。任何有密码的产品在说明书中都会要求用户尽快重置密码,无论多么有效的安全体系,都禁不住没有形成安全观念、未受到安全使用教育的使用者故意或无意的滥用。

那么问题的根源就在于我们整个社会对身份安全的教育不够吗?不,这仍然只是症状而非病因。

最大的风险,不是来自于危机有多么严峻,而是源于我们对其有多轻视。我们如果仍然以淡然处之的心态,对待在新社会形态中身份安全问题,就一直不会去弥补漏洞、寻求进步,风险就会永远一直存在,而且会随着使用场景越来越广而越来越危险。

商业未来是什么样子的?我们相信,一千个人眼中会有一千种哈姆雷特,但是有一点是共识的:

Everything that we will do in the future is all about delivering a personalized experience, and the cornerstone of personalization is identity management.

——Scott Howitt, MGM CISO

几乎任何商业业态在未来都会进行更加细化的划分,目的是为了为每个人提供定制化的体验或服务。而这未来商业「长尾」化的基石,就是身份管理和身份安全。(笔者译)

板上钉钉、无可更改、无可抵赖地确定你是谁。

而确定你是谁,正在变得无比缥缈和复杂。


现况

我们举个例子,来设想下,如果邮箱密码泄露了,会发生什么。

在很短的时间内,黑客可以把所有邮件以及它们的附件全部抓取下来,并且可以从邮箱账号的用户信息栏获取到邮箱拥有者的性别、年龄、学历、联系方式等基本信息。

在把邮件进行简单过滤以后,能获取到每个月的信用卡账单信息,能看到日常工作记录和项目交流记录,能获取到朋友之间的某些隐私图片或者视频。在查看历史记录后,黑客可以冒充受害人,向受害人的亲朋或同事发一封借钱的邮件,也可以利用这个邮件不留痕迹地去注册一些违法乱纪的网站。

很多常规网站在使用邮箱注册了以后,会向邮箱中发送验证码或者欢迎邮件,黑客以此可以得知用户都在哪些网站用这个邮箱进行了注册。黑客可以去这些网站尝试使用同样的邮箱和密码进行登录,80%的可能用户在不同系统之间使用的是相同或至少是类似的密码,所以很可能黑客可以登录很大一部分受害者日常使用的网站或应用服务。

而如果某个应用开启了邮件二次确认的话,由于邮件的访问权限已经透明,二次确认的手段可能也会被绕了过去。如果不牵扯到金钱的话,大多数系统都不会有非常成熟的足够安全的保障体系。到这一步,很多应用的访问都会被攻破,而根据这些被攻破的网站的业务不同,同时又开放了这些或高或低的新的业务权限给黑客,让黑客可以从这次单点突破中获取到更多的有效信息,牵连到更广泛的场景或更多的人,最后仍然可以将该邮箱账号信息售卖以换取基本利润。

当我们的身份证或信用卡遗失之后,我们会非常焦急紧张,食不知味夜不能眠,生怕有人会以此为恶,造成自己的损失。

但是如果是邮箱密码被盗窃了,很少有人会紧张。如果收到通知(如果邮箱系统有能力进行入侵检测并发出告警通知的话),可能也就是改个密码就足以心安了。与此对比,当现实中门钥匙遗失之后,甚至有人会考虑换一把门锁来确保安全。

在现在的网络环境中,邮箱不仅是一个发送邮件进行交流的地址,而也同时代表了个人的身份。邮箱可以绑定有个人的银行信息、工作信息、隐私机密信息,很多应用系统使用邮箱进行多因素认证、身份确认或密码找回。很多系统的身份安全体系都建立在稳定的可确定的邮件系统安全之上。邮箱作为虚拟网络世界中最典型的身份安全核心之一,一旦被突破,后果会有连续的深远性,随着与其绑定的业务种类越来越多、越来越核心,其后果甚至可能会超过身份证的遗失或伪造。

人们对此的认知严重缺乏、反应异常缓慢,在社会发展大车轮在持续加速碾压向前的时机,也就给黑客的入侵提供了天然的土壤。

在关键政府机构的门口都可以看到武装军官站岗,但在很多关系到社会民生甚至军国大事的网络访问的虚拟大门口,并不会指派专人严阵以待。

而在信息化的过程当中,后者的重要性愈演愈烈。

在现代网络出现以前,只有「国家」、「工作」、「学校」等等非常少数的「应用系统」存在,因而身份是贫瘠的。三两个同根同源的系统之间,如果希望将他们的身份体系打通,并不会有太大的困扰,人们在大多数生活场景中,也无须担心身份的确认或关联问题。

而现在,依靠着互联网的超距便利,每天都有成千上万个「应用系统」井喷而出。在工作场景、在学校场景、在私人场景、在娱乐场景等等都有着无穷多的应用繁花簇锦而来,在这些应用争宠般抢占使用者的精力和时间的时候,同时对身份安全造成的巨大而难以弥合的紊乱。

这是历史中从未发生过的巨大的观念性的身份变革。

现在,见面打招呼不再应该是递名片了,而是应该递一张纸条,并介绍说「这是我的 IP 地址,我的 MAC 地址,我的 GPS 定位,我的用户使用画像,我的微信号、百度贴吧账号和 github 账号和我的指纹。这就是我,很高兴认识你。」

但可惜的是,历史没有教导我们如何处理新鲜事物,它只用它笨拙的惯性思维,促使我们尝试用旧有的方式解决全新的问题。

一个用户使用各种各样的不同应用,于是,每个单独的应用有了各自的身份系统,而这些身份系统互不相干,尽管这些身份系统对应的现实的自然「人」,只有一个。在这基础之上,只有单系统的「身份认证」作为基础,已经无法满足动态应用场景,「多身份治理」开始走上了舞台。可以这样说,「多身份治理」是我们从「单一身份」到「统一身份」的一个过渡状态。历史上,所有事物的处理核心都是人,今天,无论应用多繁杂,核心仍然是人,未来亦如是。这点未变,也不可能改变。在现在应用变得多元而发散的情况下,一个用户的身份有明确的化为一的趋势。

身份曾因贫瘠而「唯一」,未来将随技术发展成熟而最终「统一」。

趋势无法质疑。


理念

身份系统有两个很有意思的基本特点。

一、和系统业务基本无关。大多数应用中只是需要有一个身份来进行用户标识而已,在很多应用软件公司中,身份安全纯属鸡肋,不能帮助业务带来收益,但是又不可能丢开。

二、非常复杂。一个真正安全的身份系统的复杂度,甚至会超过很多应用系统本身,投入的人手专业性要求非常高,耗费巨大。

绝大多数人,包括很多技术人员和管理者,都对身份系统的重要性没有任何清晰的认识,也就不会愿意投入大笔资源到他们看来不能产出同等效益的功能中。是这一点,导致了良好身份系统的普及缓慢,接受度仍然低下,但也正是因为明晰地看到了这一点,我们九州云腾找到使命并应运诞生。

导致市场普及度低下的这同样的两个原因,换个角度看,又同时代表着身份服务的产品价值和竞争壁垒。九州云腾能够为产品、企业和开发人员提供完整的安全统一身份产品和定制化解决方案,我们有专业的人员和产品,来保障我们所有客户和用户的身份安全。

世界并不缺乏先进的技术。我们已经有了针对于各个不同场景、情况下的身份统一的协议和方案,相当于网络发展过程中 TCP  IP 协议已经发展成熟。我们并不缺乏实际解决问题的手段,但是市场仍然缺乏足够的认知,行业仍然缺少先行者的推动。在将成熟的技术、完善的解决方案推广到相对落后封闭的系统的过程中,将会有非常严苛的克服障碍、披荆斩棘的过程,但同时也会产生瀑布般巨大的势能,并为创造者和先驱带来荣誉、机会和财富。

我们再展开去看,身份的未来会是什么样。

这个话题太广,我们不妨类比下万维网诞生过程,就从单一角度去看。在万维网出现之前,各个虚拟系统之间像是海上漂流的「孤岛」,老死不相往来,用户使用应用系统受限于资源、数据存储和地址位置的约束,打开电脑,只有电脑最基础的功能,以及在一些特定场景下内网的简单机器网络。

而到了万维网发明几年后,大众、甚至一些行业专家,都仍然看不到万维网的具体应用是什么,有电视主持人在节目中当众嘲讽电子邮件的应用。很多人无法理解,电脑可以用驱动安装软件,办公学校等场景有局域网、内网,一切都已经便捷了这么多,为什么还要继续互联呢?为什么要用电子邮件,而不是直接寄信呢?

互联网无疑是一片肥沃的土壤,但只有在这片土壤被深深耕耘之后,上面才会孕育出智慧之果、价值之实。又有谁能预想到,万维网在短短 20 年内会造就今天?

统一的、可信的身份系统是能够允许人们接触未知的先提条件,它允许了陌生人和陌生人、陌生人和陌生系统之间的交流有一个基本的、可靠的基础。在远古的历史中,如果没有可信的身份系统,人类走不出依靠强关系维系的部落时代,最大的有组织的社会将只有数百人。

连接产生交流,碰撞创造伟大。

而当下,所有的身份系统支离破碎,各自为政。我们也不妨畅想一下,当身份结成网络,当每个人在整个网络体系中的所有身份可以确定并且统一的时候会发生什么。我们的所有行为和操作将成为度量我们身份的标识,任何新服务都可以直接调用查看我的信用;摩拜单车、租房不再需要押金;贷款、申请信用卡等都不再需要填表申请;我在网页上的广告将精准地完全按照我的喜好和需要而展示;我在浏览视频网站的时候,也可以弹出来一个窗口,提醒我信用卡应该还款,或我的航班即将起飞。

一个人的虚拟身份将由其使用的所有应用中的身份网交织而成,统一而又可以去中心化。而人与人的身份之间,又会再次成网。应用身份系统的网络可以做到以统一身份为核心的数据流通,而人与人之间的身份网络会将身份的革命推向高潮,真正实现可以将现实社会中的组织、交流、社会机制完全映射到虚拟世界中去。

个人的虚拟身份将会可以像身份证一样有着实际、甚至更可靠的意义,而在这变革的前后,社交、娱乐、金融、广告、保险、医疗等等行业甚至包含政府在内,也会发生翻天覆地的变化。

身份是钥匙,而一个人的身份从来不「重置」、「退出」或者「宕机」,身份与人如影随形,24*7,无论你是否在线。

眼下,由于国家政策的上层合规推动,和企业场景内愈发复杂的应用环境和「云大物移」的趋势,我们的身份服务正在有针对性地解决特定场景的特定问题。而毫无疑问,特定场景会变成普遍场景,特定问题也会降临到普通用户的使用上。

 

在市场走向成熟的过程中,九州云腾的身份安全产品也会紧紧伴随其脚步。身份服务将会成为虚拟世界中类似衣食住行的基础服务,不光鲜但绝顶重要,消失不见而又无处不在。


连接未来

人独特而自由,而你真正是「你」的权力,是我们保护的理念,是我们创造的信仰。

我们是谁?我们是软件工程师,我们是安全专家?我们是UI设计师?我们是产品项目管理者?我们是市场和销售?不不不,我们到底是谁?是歌手?是球星?是猎手?是登山爱好者?是吃鸡团队?

我们远超于此。充沛的创造力,深厚的经验,卧薪尝胆的耐心和胆气,拥有身份安全专业知识的武装,老成持重又随时进化发展,我们是保卫者,是守望者,是革新者。

九州云腾,连接未来。

logo

 

原文链接: https://mp.weixin.qq.com/s/o9NNfY7xGWJreCKmlI10kg

各类JWT库(java)的使用与评价

https://jwt.io/ 网站中收录有各类语言的JWT库实现(有关JWT详细介绍请访问 https://jwt.io/introduction/),

其中JAVA语言到目前(2018-06)有6个实现库,如下图:

jwt

按顺序依次是

Auth0实现 的 java-jwt

Brian Campbell实现的 jose4j

connect2id实现的 nimbus-jose-jwt

Les Haziewood实现的 jjwt

Inversoft实现的prime-jwt

Vertx实现的vertx-auth-jwt.

 

以下是各个库的使用测试

java-jwt

oauth0

完整测试链接  https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/Auth0JwtTest.java

点评:

Auth0提供的JWT库简单实用, 依赖第三方(如JAVA运行环境)提供的证书信息(keypair);

有一问题是在 生成id_token与 校验(verify)id_token时都需要 公钥(public key)与密钥(private key), 个人感觉是一不足(实际上在校验时只需要public key即可)

 

jose4j

jose4j

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/Jose4JTest.java

点评:

jose4j提供了完整的JWT实现, 可以不依赖第三方提供的证书信息(keypair, 库本身自带有RSA的实现),类定义与JWT协议规定匹配度高,易理解与上手

对称加密与非对称加密都有提供实现

 

nimbus-jose-jwt

nimbus

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/NimbusJoseJwtTest.java

点评:

nimbus-jose-jwt库类定义清晰,简单易用,易理解 , 依赖第三方提供的证书信息(keypair), 对称算法 与非对称算法皆有实现.

 

jjwt

jjwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/JJwtTest.java

点评:

jjwt小巧够用, 但对JWT的一些细节包装不够, 比如 Claims (只提供获取header,body)

 

prime-jwt

primejwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/PrimeJwtTest.java

点评:

prime jwt库怎么说呢, 有些地方不符合JAVA语言规范, 支持对称算法(HMAC) 与非对称算法(RSA), 也算容易理解

 

vertx-auth-jwt

vertxjwt

完整测试链接: https://github.com/monkeyk/MyOIDC/blob/1.1.0/myoidc-server/src/test/java/myoidc/server/infrastructure/VertxAuthJwtTest.java

 点评:

Vertx Auth Jwt 库算是最不容易理解的一个库了.花了不少时间才弄通这一示例. 不容易上手. 并且生成与校验id_token 时都需要公钥与私钥,不足.

 

———————————————————

以下是在使用中的一些总结或注意点

1. 几乎所有库都要求JAVA版本1.7或更高版本, 1.6或以下的版本需要二次开发(或不支持)

2.从易用性, 扩展性, 完整性等来看, 使用首先推荐 jose4j, 其次是 Nimbus-jose-jwt.

3. JWT是实现OIDC的基石,掌握其使用对实现OIDC有很大帮助(同时对JAVA证书使用, PKI体系的掌握也有要求)

 

 

https://github.com/monkeyk/MyOIDC

2018年阅读计划

阅读自有书,2018阅读计划

  1. 《创新者的窘境》1月
  2. 《创新者的基因》5月
  3. 《鞋狗: 耐克创始人菲尔·奈特亲笔自传》
  4. 《那些古怪又让人忧心的问题what if?》2月
  5. 《硅谷百年史第3版 创业时代 创新时代 互联网时代(套装共3册)》
  6. 《周恩来转(精装典藏版)》6月
  7. 《李嘉诚:我一生的理念》6月
  8. 《点石成金:访客至少的WEB和移动可用性设计秘笈(原书第3版)》
  9. 《丝绸之路: 一部全新的世界史》
  10. 《细节: 如何轻松影响他人》11月
  11. 《逆向管理: 先行动后思考》4月
  12. 《金字塔原理: 思考, 表达和解决问题的逻辑》
  13. 《创华为: 任正非传》3月
  14. 《创京东》3月
  15. 《读者》2017年冬季卷  4月
  16. 《身份危机》4月
  17. 《黑天鹅》5月
  18. 《道德经》8月
  19. 《区块链-新经济蓝图及导读》7月
  20. 《架构解密-从分布式到微服务》6月
  21. 《黑客与画家》9月
  22. 《消防安全技术实务》10月
  23. 《赢在下班后》11月
  24. 《瓦尔登湖》12月

本周工作总结(20170521)

经历过许多的反思与自责,寻找哪个根本的问题:从哪儿来,去哪儿.探索最深层次的问题是出在哪儿.我们有人,有团队,配备也不差,可总是觉得不对劲,劲没往一处去.我们有产品吗?有好几个产品;项目也不少/团队成员也不少; 可我们真的做出了一个有许多真实用户使用,不断使用的产品吗. 功能不少,用户知多少? 我们对用户的使用,体验,有不断的反馈,跟进,再不断完善的机制,似乎没有.

时间久了,做的多了,也有些迷失了,我们去哪儿

从这周第一个API令牌产品的用户购买使用,技术上不断支持,结果却发现我们自己都不会用,还能期望用户使用的更好;真的有真实用户使用时,我们迷失了,我们没做好,不是用户的问题,不是销售的问题,不是客服的问题, 是什么问题.是什么问题,在我看来, 是我们都没弄清楚什么是产品,什么是产品成熟度模型.什么是用户体验,什么是用户使用场景.

更多的反思自己, 我们是我们产品的真实用户吗.我们爱我们的产品吗,会推荐我们的产品吗,会为我们开发了的产品感觉兴奋,激动不也吗.只有更多无声的沉默,只有那些该继续的继续,只有更多的紧张,不安,压力,迷惑,迷茫…

“人生就像一场旅行,不必在意目的地,在乎的是沿途的风景和看风景的心情…”

经历过的,煎熬过的,折断过的,否定过的,才有未来.

JAVA项目开发规范(参考)

以下是HeartBeat开发项目的一些规范,请大家自觉遵守。


>> 1.开发使用软件及版本信息

 * JDK     1.7.0_40
 * Maven   3.1.0
 * IDEA    11.1.3
 * Tomcat  7.0.47
 * MySQL   5.5
 * Git  1.7.10

 开发平台: Win 7 (X64)

(更多开发软件及版本号在第一次使用到时再指定)
[务必使用相同的软件版本]
      



>> 2.常用配置与要求

 电脑配置
    * 中英文切换快捷键, 不能使用Ctrl + 空格 键来切换输入法
    * IDEA所有快捷键不能任意更换

 数据库开发
    *表(table)与字段(column)全小写,以下画线分隔,如user; user_detail; color_def
    *所有SQL脚本必须手写,不能使用工具导出生成
    *任何字段,除了明确要求外,不要添加任何约束。如非空约束
    *项目数据库名后加上_test即测试数据库名; 如项目数据库为: hb 则测试数据库名为: hb_test



 IDEA配置
    *代码自动缩进(快捷键Ctrl+Alt+L)
    *更多配置参见intellij_templates.txt

 Git使用要求
    *不要使用IDEA自带的git程序, 修改依次点击菜单: File -> Settings... , 在打开的窗口中搜索git, 将 Path to Git Executable 的路径修改为机器安装的git.exe路径
    *尽量在每次提交代码时同时Push代码到仓库
    *提交代码时必须写注释(Comment),内容是关于提交或更改的功能的描述
    *代码必须确保在本地编译通过;尽量在完成一个功能,测试通过,并在review后提交


>> 3.项目配置与要求

   *所有代码,文件,数据库, request/response 等使用的字符编码都为 UTF-8
   *浏览器支持:HTML5支持的
   *DTO不能传入到Domain中

   *所有Service方法的参数与返回值必须是基础数据类型与DTO,不能是Domain
   *service层不做任何业务处理
   *方法或构造器的参数尽量控制到4过及以下

   *方法名与属性名必须有意义,不能乱命名方法名。JSP文件与包(package)命名要求全小写,如:companyform.jsp;com.andaily.service ;
    类名,方法名,属性名遵守驼峰命名规则,如:CompanyController
   *对于复杂的业务方法,Domain方法与数据库操作必须写单元测试(使用TestNG)
   *使用Spring的注解开发, Controller层使用@Controller, Service层使用@Service, Validator使用@Component;相互之间的引入用@Autowired; 必要的bean可以配置在xml文件中

   *项目事务添加到service中(如com.andaily.service包及其子包);Service方法中以load, is开头的方法只有只读事务,其他方法支持写事务
   *URL设置要求
            1).所有URL设置按模块划分目录,如Company模块的顶层目录为/company。所有Company的URL都在该目录下,如Company添加URL为:/company/add;
           编辑Company的URL为:/company/edit;删除的URL为:/company/delete;Overview的URL为:/company/overview 。
      其他的URL按其功能命名,如导出为:/company/export。 若有参数的URL如:/company/edit?guid=1223-soed-d等。
            2). 配置URL时分模块且结构清晰.
            3). 页面上的URL使用相对路径或完整路径(包括contextPath)
            4). URL的配置尽量简单清晰,一看就明白其功能

   *对于获取Spring容器中的实例时,可使用BeanProvider.getBean(Class clazz)获取。在Domain中获取Repository的方法如下:
      
          private transient BacklogRepository backlogRepository = BeanProvider.getBean(BacklogRepository.class);

     使用时如下:
       public void saveOrUpdate() {
          backlogRepository.save(this);
       }

   *前台使用JQUERY及相关插件, 所有的静态资源(js, css, image, html等) 放置在resources目录里.

   *任何新建的Repository必须继承Repository接口;MyBatis使用的Repository必须继承具体的子接口。一个示例如下:

      public interface CompanyRepository extends Repository {
          //codes
      }

      public interface CompanyRepositoryMyBatis extends CompanyRepository {
          //codes
      }



>> 4. 对于比较复杂的业务方法, 必须写一个辅助类去完成该业务方法. 如保存/更新 一个大的表单, 写一个XXXPersister的类去做保存/更新的事情.



(若有不清楚或尚未明确的开发规范, 请提出来)

HeartBeat https://git.oschina.net/mkk/HeartBeat

2017年阅读计划

看不完的书,2017阅读计划

  1. 《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》1月
  2. 《编程珠玑(第2版 修订版)》1月
  3. 《鲁迅经典作品全集(套装共6册)》1月
  4. 《鞋狗: 耐克创始人菲尔·奈特亲笔自传》
  5. 《架构即未来:现代企业可扩展的Web架构、流程和组织(原书第2版)》10月
  6. 《微服务设计》4月
  7. 《那些古怪又让人忧心的问题what if?》
  8. 《国富论(套装上下册)》4月
  9. 《Spring实战(第4版)》10月
  10. 《SRE:Google运维解密》9月
  11. 《独立宣言:一种全球史》2月
  12. 《沉思录》 8月
  13. 《硅谷百年史第3版 创业时代 创新时代 互联网时代(套装共3册)》
  14. 《无为而治:停止过度管理,成为一个杰出的领导者》4月
  15. 《蒋介石传(新版全译本)》 5月
  16. 《Java应用架构设计:模块化模式与OSGi》3月
  17. 《创业36条军规》 4月
  18. 《我所理解的生活》 6月
  19. 《假如给我三天光明》 6月
  20. 《告白与告别》 6月
  21. 《GOOGLE:未来之镜》 6月
  22. 《文化苦旅全书:千年一叹》 7月
  23. 《Scrum敏捷软件开发》 7月
  24. 《亿级流量网站架构核心技术》7月
  25. 《Spring Boot in Action》(中文) 9月

 

扩展计划

  1. 《史蒂夫·乔布斯传(修订版)》10月
  2. 《塔木德》 9月
  3. 《Linux命令行与shell脚本编程大全(第3版)》
  4. 《毛泽东传(名著珍藏版 插图本)》 7月
  5. 《重新定义公司:谷歌是如何运营的》 看第二遍

2016年及之前所看之书

倒序排列

2016

  1. 《绝对数学:什么是形状》
  2. 《启示录:打造用户喜爱的产品》
  3. 《下一个倒下的会不会是华为》
  4. 《深入理解Nginx:模块开发与架构解析(第2版)》
  5. 《CISSP认证考试指南(第6版 )》 部分
  6. 《影响力(经典版)》
  7. 《恰如其分的软件架构》
  8. 《重新定义公司:谷歌是如何运营的》
  9. 《SAP入门经典(第4版 修订版)》 部分
  10. 《MongoDB权威指南 第2版》
  11. 《阿里传:这是阿里巴巴的世界》
  12. 《另一半中国史(插图版)》 部分
  13. 《颠覆:鬼才卡兰尼克与他的Uber帝国》
  14. 《Tomcat权威指南(第2版)》
  15. 《中华经典必读:唐诗三百首·宋词三百首·元曲三百首》 部分

 

2015

  1. 《万维网的定律:透视网络信息生态中的模式与机制》
  2. 《Redis设计与实现》
  3. 《LDAP详解·IBM Tivoli Directory Server从入门到精通》 部分
  4. 《人人都是产品经理(纪念版)》
  5. 《教训 互联网创业必须避免的八大误区》
  6. 《精益创业》
  7. 《中国崛起的经济学分析:这个国家会好吗》
  8. 《创业维艰 如何完成比难更难的事》
  9. 《从0到1开启商业与未来的秘密》
  10. 《网站安全攻防秘笈:防御黑客和保护用户的100条超级策略》
  11. 《曾国藩全传》 伯伯推荐
  12. 《希特勒传:从乞丐到元首(套装2册)》
  13. 《设计模式:可复用面向对象软件的基础》
  14. 《代码整洁之道》
  15. 《时间简史(插图版)》
  16. 《PHP和MySQL Web开发(原书第4版)》 部分

 

2014

  1. 《重构:改善既有代码的设计》
  2. 《人件(原书第3版)》
  3. 《微信公众平台开发实践》
  4. 《人月神话(32周年中文纪念版 附国内实战体验精华册)》
  5. 《大型网站技术架构 核心原理与案例分析》
  6. 《Java程序性能优化:让你的Java程序更快、更稳定》
  7. 《狂人日记阿Q正传》

 

2013

  1. 《男人来自火星·女人来自金星》 部分
  2. 《数据结构与算法分析:Java语言描述(第2版)》
  3. 《软件随想录:程序员部落酋长Joel谈软件》
  4. 《代码大全 中文版》 电子书

 

2012

  1. 《JAVA编程思想》
  2. 《jQuery Mobile快速入门》
  3. 《Google Android开发入门指南(第2版)》 部分
  4. 《过瘾川菜精选1588例》 部分
  5. 《Java并发编程实战》
  6. 《数据结构与算法分析 JAVA语言描述》

 

2011

  1. 《jQuery权威指南》
  2. 《Groovy入门经典》
  3. 《Effective Java中文版(第2版)》

 

2010

  1. 《JAVA核心 卷I》
  2. 《JAVA核心 卷II》

 

大学

  1. 《羊皮卷》
  2. 《JAVA编程基础》 抄了两遍
  3. 《三重门》
  4. 《像少年啦飞驰》
  5. 《长安乱》
  6. 《毒》
  7. 《毒2》
  8. 《零下一度》
  9. 《就这么漂来漂去》
  10. 《一座城池》
  11. 《通稿2003》

 

高中及之前

  1. 《围城》
  2. 《围城后传》
  3. 《十万个为什么 画册 共8册》
  4. 《流星花园》
  5. 无名的小说
  6. 《逆向思维 作文》
  7. 《西游记》 伯伯推荐(小部分)
  8. 《红楼梦》 伯伯推荐(小部分)

 

 

 

我们不是在坚持 ,是撑,撑着就好

你总是觉得日子很闲, 一眼看到两三年后的日子.

正常. 这没错.

你总是担心着这有些时间如何过,如何去打发掉.

也正常,这也不是问题.

我们不想说什么坚持, 也谈不上坚持.

其实,能撑, 能继续,能还有一天不死掉.也就行了.

感觉每天都是在煎熬中度过.都在做很多.

如此,长久.

就算拍倒在桌子上不再起来,这也是选择,

正常,这没错.

你不总是定义人生,只需如此过完人生.

理解,不理解,

都在于能不能撑着,不死掉即可.

你现在的生活还有激情吗,

你心中的火焰还在燃烧吗/

仅此.

Spring data Mongodb 乐观锁实现及配置

pring 与 MongoDB整合的示例太多, 但研究的不够深入. 此处在实现Spring MongoDB乐观锁的实现及配置

1.在Domain(实体)中添加@Version字段, 类型为Long, 如下:

@Version
protected Long version;

注意这儿引入的包为:

import org.springframework.data.annotation.Version;

2.在Spring MongoDB的配置中添加auditing, 如下:

    <mongo:auditing/>

这一步必须配置, 否则在保存时会报异常 OptimisticLockingFailureException