雷布斯数据库
① 进化论耍猴,我只佩服雷布斯!→_→
也不能全是耍猴。你想想一个加工厂一天能做出来多少手机。一条产线一天能做一千部,在小米前期,连小米都不敢也没有嫩多加工厂愿意给它马力全开,所有产线加工小米,卖不出去的都是库存消耗现金流。如果前期没大量储备新机,那么动则销量上百万的,你想想开五条产线,一天能产多少?得多少天能跟上销售?这还不包括过程中某些配件有问题,导致停产,返工,或者配件供应商跟不上货。所以开一个手机公司真的很难,制造容易,量产不是一般公司能做到的!
② 雷军和董明珠的10亿赌局 什么来历
2013年12月12日,在央视财经频道主办的第十四届中国经济年度人物颁奖盛典上,小米公司董事长兼首席执行官雷军与格力集团董事长董明珠就发展模式再次展开激辩,并打下10亿元的天价赌局。具体介绍如下:
在央视财经频道主办的第十四届中国经济年度人物颁奖盛典上,董明珠和雷军也是作为一对获奖人物共同出场的。主持人陈伟鸿开玩笑说,这是这个舞台上少有的“型男和美女”组合。
表面的风平浪静很快结束,在两位颁奖嘉宾定义完雷董二人是代表传统与虚拟两种模式之后,董明珠表示,虽然他俩都来自珠海,但也不能不在这里“掐一下”。
董明珠的第一波挑战是市场调查,她问观众,有多少人使用小米手机?现场只有3个人举手。不过雷军的应对也很快,他说,这说明我们的市场空间很大,还有99%的人都没用小米手机。
随后,董明珠又把矛头对准了小米的短板:工厂和供应链。她问雷军:“如果全世界的工厂都关掉了,你还有销售吗?”雷军作答:“发展到今天,强调专业化分工,做工厂的人专心把工厂做好,做产品的人专心做产品。”
接着,董明珠又爆了一个猛料:刚才在后台,雷军和她就“杠起来”了,雷军说五年以后小米会超过格力,自己当时没有回应,现在在台上她要说:“不可能。” 主持人陈伟鸿见缝插针:“那你跟他打个赌。”
可惜,董明珠并未接招,而是转而寻求外援。她说,小米的网上销售模式也可以为格力所用,假如她和马云合作,利用好传统和电商两个零售渠道,“那不是天下都是格力了吗?”
董明珠步步紧逼,雷军则连插话都很难。就在主持人宣布要进行下一环节的时候,“雷布斯”终于忍不住开始了反击。他说,小米的优势在于极其贴近用户、轻模式以及全天候服务。伴随着越来越重的语气,雷军最后终于抛出了他的赌局:“五年之内,如果我们的营业额击败格力的话,董明珠董总输我一块钱就行了。”
这一回,董明珠则是毫不客气地见招拆招。她说,首先小米超过格力是不可能的;其次,要赌就不是一块钱,“我跟你赌10个亿。”
(2)雷布斯数据库扩展阅读:
雷军和董明珠的10亿赌局是模式的竞争
雷军和董明珠两个人都表达了自身模式的优点。雷军说,小米最大的优势是跟用户群最贴近,极其强调用户体验和口碑。他强调,互联网已经成为一种趋势,浩浩荡荡、势不可当。
董明珠也认为,时代在发展,在大数据到来之时,格力这样的制造业企业坚守什么、发展什么很重要。格力电器不靠价格靠技术,有科技创新研发能力和23年的基础,还有优秀的服务和几万家专卖店,如果能和阿里巴巴这样的电子商务企业合作,世界就将是属于格力的。
同时,二人也指出了对方的短板。董明珠说,对于一个企业的发展,可能三五年之内追求的是利润,但长期看更重要的是能否持久。做企业要有共赢的思想,不能把所有的风险都转嫁给别人。
雷军也说,传统企业的缺点首先是层层渠道距离用户非常非常远;其次,渠道过长,库存全部在路上,有可能造成极大的风险;第三,做的事情太多,使企业不能真正专心地把自己最擅长的事情做好。
除了双方互相“揭短”,两位颁奖嘉宾也对两种模式进行了点评。王健林说,他同意董明珠的观点,做生意只有共赢或者说多赢,最后才能自己赢。马云也表示,像阿里巴巴和小米这样的新经济企业,成长快是必须的,同时做得久才是最艰难的。互联网企业要思考如何在高速发展的同时活得更长、活得更好。
③ 雷军不卖掉卓越网,马云,刘强东还能成功么
不是所有创业者都能碰到自己人生中的孙正义,起的个大早也可能赶个晚集,起得早就意味着你要忍受寒冷的清晨,在黎明的黑暗中摸索,特别是早期的雷军马云刘强东这类创业者手里并没有雄厚的资金供他们烧钱,当时的投资人也未必能坚持让你烧掉几十个亿,这一点你必须要看见。
亚马逊今年经过了几次改名,从卓越网到卓越亚马逊,再到亚马逊中国,最后才改成亚马逊,其中的曲折,可谓坎坷。亚马逊的前身卓越网是雷军、陈年等人联合创办的。
从最开始的网上书店,到综合品类,卓越网是早期中国最成功的电商企业之一,不过04年卓越丢给了亚马逊,雷军等人从中获得了巨额回报。获得了财富自由,以凭借着这笔财富投资了多玩等众多互联网公司。
那么当年雷军等为什么要卖掉卓越网?
时间回到2004年8月9号,亚马逊正式签约收购卓越,并购牵连到很多人和事,创始人雷军也卸下了董事长职务。雷军卖掉自己一手养大的“孩子”,雷军的凄凉和感悟可想而知。这在当时的中国互联网划下一条厚重的破折号。
当时雷军卸下董事长职务,也推掉了一切采访。因为这次并购牵连到很多人和事,也顾及到身后的大股东金山和联想,雷军没有说话。互联网并购很正常,大多数可创始人一般都跟进了新的公司,谁也不忍心离开一手养大的孩子。卖掉易趣邵亦波还在eBay,卖掉3721周鸿祎还在雅虎,而雷军是卖得最彻底的一个。
电商持续烧钱,雷军撑不过寒冬
一个VC曾劝雷军不要放弃,因为网上零售是个长久的生意。零售存在了上千年,软件也才几十年。只要不出大问题,沃尔玛肯定比微软长寿。盖茨400亿成了首富,沃尔顿五个孩子每个200亿,如果老人不分家,足足有1000亿,两个盖茨也算不上首富。
雷军说,盖茨创业以来不过三十年,可沃尔顿家族已经历了两代人。再看看一路艰辛的亚马逊,创立在1994年,到2002年才开始盈利,那时已经花掉几十亿美金。
相对于美国,在中国做B2C更难,复杂度是随着规模不断放大的。
卓越起步的时候,每天处理100张订单感觉很容易。从100单到500单,就发现库房不够,东西也送不出去,所有员工都被赶到库房里做包装。100单到1000单是一个质变,一千到一万又是一个质变。卓越过了一万,但到十万就极其痛苦了。
资本只想套现,无法跟进
04年2月,卓越开始其创业以来的第四轮融资。B2C全球盟主亚马逊是意向之一,因其财力和经验都雄厚、对中国也感兴趣。亚马逊在2月和3月来中国两趟,第一次分别拜会卓越和当当,第二次只找了卓越。
初谈有三种模式。第一,亚马逊持小股,像Google注资网络。第二,亚马逊持大股,像IAC控股E龙。第三,全资收购,像雅虎买3721,eBay收易趣。
第一种,亚马逊通不过;他们看准了中国市场,一定要强力介入,不留余地。第二种,卓越通不过。双方资本实力太悬殊了,如果亚马逊要增资,再投入1亿美金,金山和联想跟还是不跟?跟不起,那就只能被撵出局。而即使亚马逊不采取更多的动作,金山联想又如何套现退出呢?亚马逊没有再次上市的打算。
既然迟早要被撵或者套牢,那不如现在就放弃,就是第三种模式,全资并购。
其实向风险投资(VC)融资也行。金山和联想初始投资1600万,股份大致七三开。后来VC先后投入920万美金,就把金山股份稀释到了50%以下。而卓越要实现稳健盈利,还要再投入至少数千万美金。最终逃不出一个结果:股份被稀释,失去主导权,出局。
④ 如何进行对标学习
对标学习的方法其实就是实现对标管理的过程:
1、制定对标计划。确保对标计划与公司的战略一致。
2、建立对标团队。团队的结构取决于对标范围的大小、公司规模、对标预算、对标程序和环境等要素;其次是就对标程序、分析工具和技术、交流能力、公司背景和系统对团队人员进行培训。
3、收集必要的数据。首先,要收集本公司的流程表、客户反馈、程序手册等信息进行自我分析;其次,找到适合自己的模仿对象。
4、分析业绩差距数据。在理解对标对象最佳的方法基础上,衡量自己与别人业绩的差距。
5、持续进行对标管理。企业在减少与最佳案例的差距时,需时常用衡量标准来监测实施的有效性;另外,由于表现最佳的公司本身也会继续发展,所以“找到并实施最好的方法”的对标管理也是一个只要开始就没有结束的过程。
(4)雷布斯数据库扩展阅读
对标学习的注意事项
1、对标学习为企业提供了优秀的管理方法和管理工具,提供了追求不断改进的思路。还可以让企业形成一种持续学习的文化,认识到赶学超的重要性,持续追求获得持续的竞争力。
2、对标学习是追求卓越的过程,也是持续不断的学习过程。同时也可以帮助企业进行策略性定位,塑造企业的核心能力。
3、对标学习将焦点放在过程上而不是结果上,可以帮助企业达成突破性的绩效改善,促进企业不断的进行自我修正和自我突破。
4、对标学习要求企业通过对标增强危机意识,传递竞争压力,创造卓越绩效。增强危机意识是企业应该有的永远不满足现状的态度。
5、对标学习瞄准一个比自身绩效更高的组织进行对比,以便取得更好的绩效,不断超越自己,超越标杆,组织创新和流程再造以追求卓越。
⑤ 雷军:芯片缺货可能会持续两年,芯片缺货为何如此严重
雷军表示芯片缺货可能会持续两年,之所以芯片如此缺货就是由于疫情的持续,再加上恐慌性的囤积导致的。
自从进入2021年以来,芯片领域就一直缺货,其实在我们的印象当中,芯片一直都和手机挂钩,但是它其实和很多领域都挂钩,包括显卡、汽车等等,这些领域对于芯片的需求也是非常大的。近日雷军在接受记者采访的时候就表示,现在全球不管哪个地方对芯片的需求都是非常大的,而且进入了缺货的状况,并且说这种情况即将要持续两年,所以一些电子产品将会越来越买,价格也会越来越高,因为芯片的缺乏所以使得某些物品生产的数量极其的少。俗话说的好物以稀为贵,所以价格也会有所上升。有相关的领域专家表示,直到2022年以后,芯片缺乏危机才会有所缓解。
⑥ kbasesrv是什么软件
kinggsoft是金山公司的软件文件夹存放目录,一般保存位置是在C:Program Files (x86)kingsoft里面。
该程序由金山旗下软件静默下载安装到电脑里,使用特定参数启动并篡改首页。
用户双击打开桌面的快捷方式,会启动IE浏览器并访问“毒霸网址大全”。
⑦ 保存失败 Value at 0 is null. 什么意思
作者 | 聂晓龙(率鸽)
01 前言
前天回家路上,有辆车强行插到前面的空位,司机大哥暴躁地拍着方向盘吐槽道“加塞最可恶了”,我问“还有更可恶的吗”,司机大哥淡定说道“不让自己加塞的”。似乎和我们很类似,我们程序员届也有这 2 件相辅相成的事:最讨厌别人不写注释,更讨厌让自己写注释。
一段糟糕的代码,往往大家最低的预期是把注释写清楚,最合理的做法通常应该对代码做优化。如果我们将代码真正做到了优秀,我们是否还需要注释?
02 注释的意义
; **************************************************************************
; * RAMinit Release 2.0 *
; * Copyright (c) 1989-1994 by Yellow Rose Software Co. *
; * Written by Mr. Leijun *
; * Press HotKey to remove all TSR program after this program *
; **************************************************************************
; Removed Softwares by RI:
; SPDOS v6.0F, WPS v3.0F
; Game Busters III, IV
; NETX ( Novell 3.11 )
; PC-CACHE
; Norton Cache
; Microsoft SmartDrv
; SideKick 1.56A
; MOUSE Driver
; Crazy (Monochrome simulate CGA program)
; RAMBIOS v2.0
; 386MAX Version 6.01
注释是对代码的解释和说明,本质目的是为了增强程序的可读性与可解释性。注释会随着源代码,在进入预处理器或编译器处理后会被移除。这是雷布斯 1994 年写的一段 MASM 汇编代码,注释与代码整体结构都非常清晰。如果说代码是为了让机器读懂我们的指令,那注释完全就是为了让我们了解我们自己到底发出了哪些指令。
03 争议与分歧
注释的起源非常早,我们甚至已经查阅不到注释的由来,但现在任何一种语言,甚至几乎任何一种文本格式都支持各式各样的注释形式。
但如何使用注释,其实一直是一个备受争论的话题。当我们接手一段‘祖传代码’时,没有注释的感觉简直让人抓狂,我们总是希望别人能提供更多的注释。但软件届也有一段神话传说,叫做‘我的代码像诗一样优雅’。有注释的代码都存在着一些瑕疵,认为足够完美的代码是不需要注释的。
04 坏代码的救命稻草
The proper use of comments is to compensate for our failure to express ourself in code. -- Robert C. Martin 《Clean Code》 译:注释的恰当用法是弥补我们在用代码表达意图时遭遇的失败
Clean Code 的作者 Robert C. Martin 可以说是注释的极力否定者了,他认为注释是一种失败,当我们无法找到不用注释就能表达自我的方法时,才会使用注释,任何一次注释的使用,我们都应该意识到是自己表达能力上的失败。
PH&V 的系统架构师和负责人 Peter Vogel,同样也是一名坚定的注释否定着,他发表了一篇文章 why commenting code is still bad 来表述为代码添加注释在某种程度上可能是必要的,但确实没有价值。
事实上,我们也确实经历着非常多无价值的注释,以及完全应由代码来承担解释工作的“职能错位”的注释。
01 零注释
糟糕的代码加上完全不存在的注释,我喜欢称呼它们为‘我和上帝之间的秘密’,当然过 2 个月后也可以称之为‘上帝一个人的秘密’。
压垮程序员最后一根稻草的,往往都是零注释。可以没有文档,可以没有设计,但如果没有注释,我们每一次阅读都是灾难性的。当我们抱怨它一行注释都没有时,其实我们是在抱怨我们很难理解代码想要表达的含义,注释是直接原因,但根本原因是代码。
零注释往往和坏代码一起生活,“没有注释”的吐槽,其实本质上直击的是那堆歪七扭八的英文字母,到底它们想表达什么!
02 无用注释
/**
* returns the last day of the month
* @return the last day of the month
*/
public Date getLastDayOfMonth(Date date) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return calendar.getTime();
}
这是典型的废话注释,读代码时代码本身就能很好的表达具体的含义,我们完全不需要看注释,并且注释也不会给我们提供更多有效的信息。无用注释或许是零注释的另一个极端,我们担心自己写的代码被人所吐槽,于是尽可能去补全注释,当你为 getLastDayOfMonth() 补一段 get last day of month 的注释时,恭喜你,你得到了双倍的代码。
03 代码优于注释
"Comments Do Not Make Up for Bad Code" -- Robert C.Martin 《Clean Code》 译:注释不能美化糟糕的代码
当需要为一段代码加上注释时,说明代码已经不能很好的表达意图,于是大家开始为这段代码添加注释。Robert C.Martin 在 Clean Code 中提出一个观点:注释不能美化糟糕的代码。能用代码表达的直接用代码表达,不能用代码表达的,你再想想,如何能用代码表达。
复杂的代码最直接的表现就是不够直观、难以理解,加上注释后往往会清晰很多,但你是愿意看这段代码:
// 判断是否活跃用户
if((customer.getLastLoginTime().after(dateUtils.minusDays(new Date(),15)) && customer.getCommentsLast30Days() > 5)
|| orderService.countRecentDaysByCustomer(customer,30) > 1)
还是这段代码?
if(customer.isActive())
糟糕代码的存在,通常是我们写注释的常见动机之一。这种试图粉饰可读性差的代码的注释称之为‘拐杖式注释’,即使大名鼎鼎的 JDK,也存在这样的拐杖式注释。
public synchronized void setFormatter(Formatter newFormatter) {
checkPermission();
// Check for a null pointer
newFormatter.getClass();
formatter = newFormatter;
}
这是取自 JDK java.util.logging.Handler 类的 setFormatter 方法,作者为了不让空指针异常下传,提前做一次空指针检查。没有这段注释我们完全不知道游离的这句 newFormatter.getClass() 到底要做什么,这段注释也充分表达了作者自己也知道这句代码难以理解,所以他加上了注释进行说明。但我们完全可以用 Objects.requireNonNull() 来进行替代。同样的代码作用,但可读性可理解性大不一样,JDK 里的这段代码,确实让人遗憾。
04 注释否定论
"If our programming languages were expressive enough, or if we had the talent to subtly wield those languages to express our intent, we would not need comments very much—perhaps not at all." -- Robert C.Martin 《Clean Code》 译:若编程语言足够有表达力,或者我们长于用这些语言来表达意图,就不那么需要注释--也许根本不需要
通过代码进行阐述,是注释否定论的核心思想。当你花功夫来想如何写注释,让这段代码更好的表达含义时,我们更应该重构它,通过代码来解释我们的意图。每一次注释的编写,都是对我们代码表达能力上的差评,提升我们的归纳、表达、解释能力,更优于通过注释来解决问题。当代码足够优秀时,注释则是非必须的。并且需求在不断调整,代码一定会随之变动,但注释可能慢慢被人遗忘,当代码与注释不匹配时,将是更大的灾难。
05 软件设计的乌托邦
01 好吧你很优秀
曾经我的确对优秀的代码不断钻研,对代码本身所蕴含的能量无比坚信。如同当科学代替鬼神论走上历史舞台时,即使存在有科学解释不了,我们依然坚信只是科学还需要发展。当代码别人无法理解时,我会认为是我表述不够精准,抽象不够合理,然后去重构去完善。
有一次给老板 review 代码,当时老板提出,“你的代码缺缺少注释”,我说不需要注释,代码就能自解释。于是老板现场读了一段代码,“query-customer-list 查询客户”、“transfer-customer-to-sales 分发客户到销售”、“check-sales-capacity 检查销售库容”,每一个类每一个函数,一个单词一个单词往外蹦时,你会发现好像确实都能读懂,于是老板回了一个“好吧”。
02 美丽的乌托邦
"'good code is self-documenting' is a delicious myth" -- John Ousterhout《A Philosophy of Software Design》 译:‘好的代码自解释’是一个美丽的谎言
在软件设计中,总有一些软件工程师所坚信的诗和远方,有的是大洋彼岸的美好国度,有的或许是虚无缥缈的理想乌托邦。John Ousterhout 教授在 A Philosophy of Software Design 中提到一个观念,‘好的代码自解释’是一个美丽的谎言。
我们可以通过选择更好的变量名,更准确的类与方法,更合理的继承与派生来减少注释,但尽快如此,我们还是有非常多的信息无法直接通过代码来表达。这里的信息,或许不单单只是业务逻辑与技术设计,可能还包括了我们的观感,我们的体验,我们的接纳程度以及第一印象带来的首因效应。
06 好代码的最佳僚机
You might think the purpose of commenting is to 'explain what the code does', but that is just a small part of it.The purpose of commenting is to help the reader know as much as the writer did. -- Dustin Boswell《The Art of Readable Code》 译:你可能以为注释的目的是“解释代码做了什么”,但这只是其中很小一部分,注释的目的是尽量帮助读者了解得和作者一样多
如同 John Ousterhout 教授一样,The Art of Readable Code 的作者 Dustin Boswell,也是一个坚定的注释支持者。与 Robert C.Martin 类似,Dustin Boswell 同样认为我们不应该为那些从代码本身就能快速推断的事实写注释,并且他也反对拐杖式注释,注释不能美化代码。
但 Dustin Boswell 认为注释的目的不仅解释了代码在做什么,甚至这只是一小部分,注释最重要的目的是帮助读者了解得和作者一样多 。编写注释时,我们需要站在读者的角度,去想想他们知道什么,这是注释的核心。这里有非常多的空间是代码很难阐述或无法阐述的,配上注释的代码并非就是糟糕的代码,相反有些时候,注释还是好代码最棒的僚机。
01 更精准表述
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton 译:计算机科学中只有两个难题:缓存失效和命名
Martin Fowler 在他的 TwoHardThings 文章中引用了 Phil Karlton 的一段话,命名一直都是一件非常难的事情,因为我们需要将所有含义浓缩到几个单词中表达。很早之前学 Java,接触到很长的类名是 。可能有人认为只要能将含义准确地表达出来,名字长一些无所谓。那如果我们需要有一段处理有关“一带一路”的内容,那我们的代码可能是这样的:
public class {
他非常准确的表达了含义,但很明显这不是我们期望的代码。但如果我们辅以简单的注释,代码会非常清晰,说明了简称,也说明了全意,表述更精准。
/**
* 一带一路
* 丝绸之路经济带和21世纪海上丝绸之路
*/
public class OneBeltOneRoad {
02 代码层次切割
函数抽取是我们经常使用且成本最低的重构方法之一,但并非银弹。函数并非抽得越细越好,如同分布式系统中,并非无限的堆机器让每台机器处理的数据越少,整体就会越快。过深的嵌套封装,会加大我们的代码阅读成本,有时我们只需要有一定的层次与结构帮助我们理解就够了,盲目的抽取封装是无意义的。
/**
* 客户列表查询
*/
public List queryCustomerList(){
// 查询参数准备
UserInfo userInfo = context.getLoginContext().getUserInfo();
if(userInfo == null || StringUtils.isBlank(userInfo.getUserId())){
return Collections.emptyList();
}
LoginDTO loginDTO = userInfoConvertor.convertUserInfo2LoginDTO(userInfo);
// 查询客户信息
List customerSearchList = customerRemoteQueryService.query(loginDTO);
Iterable it = customerSearchList.iterator();
// 排除不合规客户
while(it.hasNext()){
CustomerSearchVO customerSearchVO = it.next();
if(isInBlackList(customerSearchVO) || isLowQuality(customerSearchVO)){
it.remove();
}
}
// 补充客户其他属性信息
batchFillCustomerPositionInfo(customerSearchList);
batchFillCustomerAddressInfo(customerSearchList);
}
其实细看每一处代码,都很容易让人理解。但如果是一版没有注释的代码,可能我们会有点头疼。缺少结构缺少分层,是让我们大脑第一感观觉得它很复杂,需要一次性消化多个内容。通过注释将代码层次进行切割,是一次抽象层次的划分。同时也不建议大家不断去抽象私有方法,这样代码会变得非常割裂,并且上下文的背景逻辑、参数的传递等等,都会带来额外的麻烦。
03 母语的力量
其实上述例子,我们更易阅读,还有一个重要的原因,那就是母语的力量。我们天然所经历的环境与我们每天所接触到的事物,让我们对中文与英文有完全不一样的感受。我们代码的编写本质上是一个将我们沟通中的“中文问题”,翻译成“英文代码”来实现的过程。而阅读代码的人在做得,是一件将“英文代码”翻译成“中文表述”的事情。而这之中经过的环节越多,意思变味越严重。
TaskDispatch taskDispatch = TaskDispatchBuilder.newBuilder().withExceptionIgnore().build();
taskDispatch
// 外贸信息
.join(new FillForeignTradeInfoTask(targetCustomer, sourceInfo))
// 国民经济行业、电商平台、注册资本
.join(new FillCustOutterInfoTask(targetCustomer, sourceInfo))
// 客户信息
.join(new (targetCustomer, sourceInfo))
// 客户扩展信息
.join(new FillCustExtInfoTask(targetCustomer, sourceInfo))
// 收藏屏蔽信息
.join(new FillCollectStatusInfoTask(targetCustomer, sourceInfo, loginDTO()))
// 详情页跳转需要的标签信息
.join(new FillTagInstanceTask(targetCustomer, sourceInfo, loginDTO()))
// 客户信息完整度分数
.join(new FillCustomerScoreTask(targetCustomer, sourceInfo))
// 潜客分层完整度
.join(new FillCustomerSegmentationTask(targetCustomer, sourceInfo))
// 填充操作信息
.join(new FillOperationStatusTask(targetCustomer, sourceInfo, loginDTO))
// 认证状态
.join(new FillAvStatusTask(targetCustomer, loginDTO))
// 客户地址和组织
.join(new FillCompanyAddressTask(targetCustomer, loginDTO))
// 违规信息
.join(new FillPunishInfoTask(targetCustomer, sourceInfo))
// 填充客户黑名单信息
.join(new FillCustomerBlackStatusTask(targetCustomer, sourceInfo))
// 填充客户意愿度
.join(new FillCustIntentionLevelTask(targetCustomer, sourceInfo));
// 执行
.execute();
这是一段补齐客户全数据信息的代码,虽然每一个英文我们都看得懂,但我们永远只会第一眼去看注释,就因为它是中文。并且也因为有这些注释,这里非常复杂的业务逻辑,我们同样可以非常清晰的了解到它做了哪些,分哪几步,如果要优化应该如何处理。这里也建议大家写中文注释,注释是一种说明,越直观越好,中文的亲和力是英文无法比拟的。当然,这条建议并不适合美国程序员。
07 注释的真正归属
01 复杂的业务逻辑
// Fail if we're already creating this bean instance:
// We're assumably within a circular reference.
if ((beanName)) {
throw new (beanName);
}
// Check if bean definition exists in this factory.
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
// Not found -> check parent.
String nameToLookup = originalBeanName(name);
if (args != null) {
// Delegation to parent with explicit args.
return parentBeanFactory.getBean(nameToLookup, args);
}
else {
// No args -> delegate to standard getBean method.
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
}
这是 Spring 中的一段获取 bean 的代码,spring 作为容器管理,获取 bean 的逻辑也非常复杂。对于复杂的业务场景,配上必要的注释说明,可以更好的理解相应的业务场景与实现逻辑。
截取自:
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
02 晦涩的算法公式
/**
* Returns the value obtained by reversing the order of the bits in the
* two's complement binary representation of the specified {@code long}
* value.
*/
public static long reverse(long i) {
// HD, Figure 7-1
i = (i & 0x5555555555555555L) << 1 | (i >>> 1) & 0x5555555555555555L;
i = (i & 0x3333333333333333L) << 2 | (i >>> 2) & 0x3333333333333333L;
i = (i & 0x0f0f0f0f0f0f0f0fL) << 4 | (i >>> 4) & 0x0f0f0f0f0f0f0f0fL;
i = (i & 0x00ff00ff00ff00ffL) << 8 | (i >>> 8) & 0x00ff00ff00ff00ffL;
i = (i << 48) | ((i & 0xffff0000L) << 16) |
((i >>> 16) & 0xffff0000L) | (i >>> 48);
return i;
}
这是 JDK 中 Long 类中的一个方法,为 reverse 方法添加了足够多的注释。对于几乎没有改动且使用频繁的底层代码,性能的优先级会高于可读性。在保证高效的同时,注释帮助我们弥补了可读性的短板。
截取自:java.lang.Long#reverse
03 不明所以的常量
/**
* The bin count threshold for using a tree rather than list for a
* bin. Bins are converted to trees when adding an element to a
* bin with at least this many nodes. The value must be greater
* than 2 and should be at least 8 to mesh with assumptions in
* tree removal about conversion back to plain bins upon
* shrinkage.
*/
static final int TREEIFY_THRESHOLD = 8;
这是 JDK 中 HashMap 的一个常量因子,记录由链表转向红黑树的链表长度阈值,超过该长度则链表转为红黑树。这里记录了一个 8,不仅记录了该常量的用途,也记录了为什么我们定义这个值。经常我们会发现我们代码中存在一个常量等于 3、等于 4,有时我们不知道这些 3 和 4 是干什么的,有时我们不知道为什么是 3 和 4。
截取自:java.util.HashMap#TREEIFY_THRESHOLD
04 意料之外的行为
for (int i = 0; i < 3; i++) {
// if task running, invoke only check result ready or not
Result result = bigDataQueryService.queryBysql(sql, token);
if (SUCCESS.equals(result.getStatus())) {
return result.getValue();
}
Thread.sleep(5000);
}
代码及注释所示为每 5 秒 check 一下是否有结果返回,远程服务将触发与获取放在了一个接口。没有注释我们可能认为这段代码有问题,代码表现的含义更像是每 5 秒调用一次,而非每 5 秒 check 一次。为意料之外的行为添加注释,可以减少对代码的误解读,并向读者说明必要的背景及逻辑信息。
05 接口对外 API
Checks if a CharSequence is empty (""), null or whitespace only.
Whitespace is defined by {@link Character#isWhitespace(char)}.
* StringUtils.isBlank(null) = true
* StringUtils.isBlank("") = true
* StringUtils.isBlank(" ") = true
* StringUtils.isBlank("bob") = false
* StringUtils.isBlank(" bob ") = false
* @param cs the CharSequence to check, may be null
* @return {@code true} if the CharSequence is null, empty or whitespace only
public static boolean isBlank(final CharSequence cs) {
final int strLen = length(cs);
if (strLen == 0) {
return true;
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
return true;
我们经常使用的 StringUtils 工具类中的 isBlank 方法,写了非常详情的注释,不仅包括方法的逻辑,入参的含义,甚至还包括具体示例。我们平常定义的二方库中的 HSF、HTTP 接口定义,同样需要有清晰详尽的注释,这里的注释甚至经常会多过你的代码。
截取自:org.apache.commons.lang3.StringUtils#isBlank
06 法律文件信息
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding right ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
与法律相关的注释,在开源软件库中较经常遇到。涉及到一些版权及着作声明时,我们需要在源文件顶部放置法律相关注释。当然,我们不需要将所有法律信息写到注释中,如例子中的跳链,引用一份标准的外部文档,会是一个更好的选择。
08 写在最后
注释并不会妨碍你写出优雅简洁的代码,它只是程序固有的一部分而已。我们不用过分在意我们的代码是否可以脱离注释,也不需要强调因为我们的代码符合什么原则,满足什么约定,所以代码是优秀的注释是冗余的。代码是一门艺术,并不会因为满足三规九条它就一定完美,因为艺术,是不可衡量的。
参阅书籍
《A Philosophy of Software Design》
《Clean Code》
《The Art of Readable Code》
技 术 好 文
企 业 案 例
⑧ 雷军为什么被称为雷布斯,雷军和乔布斯是相同类型的人吗
不是。雷布斯是先做事后说话,比如小米的芯片,在发布前有多少人知道人家已经埋头苦干几年拿出东西,而且直接装到小米5C上去了。雷布斯,踏踏实实,步步为营,言而有信。贾布斯是先说话还不做事,比如做体育,他说要做体育,融了上百亿,真正投入到体育里面的不到一半,其他的都进了家族的账户,买几个高价版权营造一个在做事的样子,实际上真正投到里面的钱不到一半。做汽车,目的就是为了把国内的钱转移出去,找的由头。天天发布请这个牛逼的高管,那个牛逼的行业牛人,其实跟请明星代言人一个性质而且价格比明星低多了,但收益却高的多,至少融资骗投资人的钱的时候,请业内大咖比请明星好的多,但是花的钱确比明星少太多了。请业内大咖,只是借人家名字和图片用用而已,从来都不会做实际的工作的,而且人家也不愿跟一个骗子做实际的工作。
⑨ 陈年往事!雷军玩BBS结识马化腾和丁磊,大佬喜欢的东西为何一样
8月11日晚,小米秋季发布会在北京举行,小米集团创始人、董事长兼CEO雷军第三次做年度公开演讲,分享穿越人生低谷的三个故事,之后他找到新的寄托BBS论坛,由于打字快、发帖量大,他成为版主。在BBS论坛,雷军结识了马化腾和丁磊,据雷军所述,当时两人在BBS论坛上耗费大量时间,热情也非常高。
3、交互性强
BBS具有很强的实时交互操作功能,能够提供强大的站上实时交谈和交互游戏的功能。BBS按不同的主题、分主题分成很多个布告栏。布告栏的设立依据是大多数BBS使用者的要求和喜好,使用者可以阅读他人关于某个主题的最新看法,也可以将自己的想法毫无保留地贴到公告栏中。如果需要私下交流,也可以将想说的话直接发到某个人的电子信箱中。