1.道可道,非常道。名可名,非常名。无名天地之始。有名万物之母。故常无欲以观其妙。常有欲以观其徼。此两者同出而异名,同谓之玄。玄之又玄,众妙之门。
02.天下皆知美之为美,斯恶矣;皆知善之为善,斯不善已。故有无相生,难易相成,长短相形,高下相倾,音声相和,前後相随。是以圣人处无为之事,行不言之教。万物作焉而不辞。生而不有,为而不恃,功成而弗居。夫唯弗居,是以不去。
03.不尚贤,使民不争。不贵难得之货,使民不为盗。不见可欲,使民心不乱。是以圣人之治,虚其心,实其腹,弱其志,强其骨;常使民无知、无欲,使夫智者不敢为也。为无为,则无不治。
04.道冲而用之,或不盈。渊兮似万物之宗。解其纷,和其光,同其尘,湛兮似或存。吾不知谁之子,象帝之先。
05.天地不仁,以万物为刍狗。圣人不仁,以百姓为刍狗。天地之间,其犹橐迭乎?虚而不屈,动而愈出。多言数穷,不如守中。
06.谷神不死是谓玄牝。玄牝之门是谓天地根。绵绵若存,用之不勤。
07.天长地久。天地所以能长且久者,以其不自生,故能长生。是以圣人後其身而身先,外其身而身存。非以其无私邪!故能成其私。
08.上善若水。水善利万物而不争,处众人之所恶,故几於道。居善地,心善渊,与善仁,言善信,正善治,事善能,动善时。夫唯不争,故无尤。
09.持而盈之不如其己;揣而锐之不可长保;金玉满堂莫之能守;富贵而骄,自遗其咎。功遂身退,天之道。
10.载营魄抱一,能无离乎?专气致柔,能如婴儿乎?涤除玄览,能无疵乎?爱国治民,能无为乎?天门开阖,能为雌乎?明白四达,能无知乎。
11.三十幅共一毂,当其无,有车之用。埏埴以为器,当其无,有器之用。凿户牖以为室,当其无,有室之用。故有之以为利,无之以为用。
12.五色令人目盲,五音令人耳聋,五味令人口爽,驰骋畋猎令人心发狂,难得之货令人行妨。是以圣人,为腹不为目,故去彼取此。
13.宠辱若惊,贵大患若身。何谓宠辱若惊?宠为下。得之若惊失之若惊是谓宠辱若惊。何谓贵大患若身?吾所以有大患者,为吾有身,及吾无身,吾有何患。故贵以身为天下,若可寄天下。爱以身为天下,若可托天下。
14.视之不见名曰夷。听之不闻名曰希。抟之不得名曰微。此三者不可致诘,故混而为一。其上不皦(jiǎo),其下不昧,绳绳不可名,复归於无物。是谓无状之状,无物之象,是谓惚恍。迎之不见其首,随之不见其後。执古之道以御今之有。能知古始,是谓道纪。
15.古之善为士者,微妙玄通,深不可识。夫唯不可识,故强为之容。豫兮若冬涉川;犹兮若畏四邻;俨兮其若容;涣兮若冰之将释;敦兮其若朴;旷兮其若谷;混兮其若浊;澹兮其若海;飉(liáo,风的声音)兮若无止。孰能浊以静之徐清。孰能安以动之徐生。保此道者不欲盈。夫唯不盈故能蔽而新成。
16.致虚极守静笃。万物并作,吾以观复。夫物芸芸各复归其根。归根曰静,是谓复命;复命曰常,知常曰明。不知常,妄作凶。知常容,容乃公,公乃全,全乃天,天乃道,道乃久,没身不殆。
17.太上,不知有之。其次,亲而誉之。其次,畏之。其次,侮之。信不足焉,有不信焉。悠兮其贵言,功成事遂,百姓皆谓 ∶ 我自然。
18.大道废有仁义;慧智出有大伪;六亲不和有孝慈;国家昏乱有忠臣。
19.绝圣弃智,民利百倍;绝仁弃义,民复孝慈;绝巧弃利,盗贼无有;此三者,以为文不足。故令有所属,见素抱朴少私寡欲。
20.绝学无忧,唯之与阿,相去几何?善之与恶,相去若何?人之所畏,不可不畏。荒兮其未央哉!众人熙熙如享太牢、如春登台。我独泊兮其未兆,如婴儿之未孩;儡儡(lěi,羸弱)兮若无所归。众人皆有馀,而我独若遗。我愚人之心也哉!沌沌兮。俗人昭昭,我独昏昏;俗人察察,我独闷闷。众人皆有以,而我独顽且鄙。我独异於人,而贵食母。
21.孔德之容惟道是从。道之为物惟恍惟惚。惚兮恍兮其中有象。恍兮惚兮其中有物。窈兮冥兮其中有精。其精甚真。其中有信。自古及今,其名不去以阅众甫。吾何以知众甫之状哉!以此。
22.曲则全,枉则直。洼则盈,敝则新。少则得,多则惑。是以圣人抱一为天下式。不自见故明;不自是故彰;不自伐故有功;不自矜故长;夫唯不争,故天下莫能与之争。古之所谓 ∶ 曲则全者」岂虚言哉!诚全而归之。
23.希言自然。故飘风不终朝,骤雨不终日。孰为此者?天地。天地尚不能久,而况於人乎?故从事於道者,同於道。德者同於德。失者同於失。同於道者道亦乐得之;同於德者德亦乐得之;同於失者失於乐得之信不足焉有不信焉。
24.企者不立;跨者不行。自见者不明;自是者不彰。自伐者无功;自矜者不长。其在道也曰 ∶ 馀食赘形。物或恶之,故有道者不处。
25.有物混成先天地生。寂兮寥兮独立不改,周行而不殆,可以为天下母。吾不知其名,强字之曰道。强为之名曰大。大曰逝,逝曰远,远曰反。故道大、天大、地大、人亦大。域中有大,而人居其一焉。人法地,地法天,天法道,道法自然。
26.重为轻根,静为躁君。是以君子终日行不离轻重。虽有荣观燕处超然。奈何万乘之主而以身轻天下。轻则失根,躁则失君。
27.善行无辙迹。善言无瑕谪。善数不用筹策。善闭无关楗而不可开。善结无绳约而不可解。是以圣人常善救人,故无弃人。常善救物,故无弃物。是谓袭明。故善人者不善人之师。不善人者善人之资。不贵其师、不爱其资,虽智大迷,是谓要妙。
28.知其雄,守其雌,为天下溪。为天下溪,常德不离,复归於婴儿。知其白,守其黑,为天下式。为天下式,常德不忒,复归於无极。知其荣,守其辱,为天下谷。为天下谷,常德乃足,复归於朴。朴散则为器,圣人用之则为官长。故大制不割。
29.将欲取天下而为之,吾见其不得已。天下神器,不可为也,为者败之,执者失之。夫物或行或随、或觑或吹、或强或羸、或挫或隳。是以圣人去甚、去奢、去泰。
30.以道佐人主者,不以兵强天下。其事好还。师之所处荆棘生焉。军之後必有凶年。善有果而已,不敢以取强。果而勿矜。果而勿伐。果而勿骄。果而不得已。果而勿强。物壮则老,是谓不道,不道早已。
31.夫佳兵者不祥之器,物或恶之,故有道者不处。君子居则贵左,用兵则贵右。兵者不祥之器,非君子之器,不得已而用之,恬淡为上。胜而不美,而美之者,是乐杀人。夫乐杀人者,则不可得志於天下矣。吉事尚左,凶事尚右。偏将军居左,上将军居右。言以丧礼处之。杀人之众,以悲哀泣之,战胜以丧礼处之。
32.道常无名。朴虽小天下莫能臣也。侯王若能守之,万物将自宾。天地相合以降甘露,民莫之令而自均。始制有名,名亦既有,夫亦将知止,知止可以不殆。譬道之在天下,犹川谷之於江海。
33.知人者智,自知者明。胜人者有力,自胜者强。知足者富。强行者有志。不失其所者久。死而不亡者,寿。
34.大道泛兮,其可左右。万物恃之以生而不辞,功成而不名有。衣养万物而不为主,常无欲可名於小。万物归焉,而不为主,可名为大。以其终不自为大,故能成其大。
35.执大象天下往。往而不害安平太。乐与饵,过客止。道之出口淡乎其无味。视之不足见。听之不足闻。用之不足既。
36.将欲歙之,必固张之。将欲弱之,必固强之。将欲废之,必固兴之。将欲取之,必固与之。是谓微明。柔弱胜刚强。鱼不可脱於渊,国之利器不可以示人。
37.道常无为,而无不为。侯王若能守之,万物将自化。化而欲作,吾将镇之以无名之朴。无名之朴,夫亦将无欲。不欲以静,天下将自定。
38.上德不德是以有德。下德不失德是以无德。上德无为而无以为。下德无为而有以为。上仁为之而无以为。上义为之而有以为。上礼为之而莫之以应,则攘臂而扔之。故失道而後德。失德而後仁。失仁而後义。失义而後礼。夫礼者忠信之薄而乱之首。前识者,道之华而愚之始。是以大丈夫,处其厚不居其薄。处其实,不居其华。故去彼取此。
39.昔之得一者。天得一以清。地得一以宁。神得一以灵。谷得一以盈。万物得一以生。侯王得一以为天下贞。其致之。天无以清将恐裂。地无以宁将恐废。神无以灵将恐歇。谷无以盈将恐竭。万物无以生将恐灭。侯王无以贞将恐蹶。故贵以贱为本,高以下为基。是以侯王自称孤、寡、不谷。此非以贱为本邪?非乎。至誉无誉。不欲琭琭如玉,珞珞如石。
40.反者道之动。弱者道之用。天下万物生於有,有生於无。
41.上士闻道勤而行之。中士闻道若存若亡。下士闻道大笑之。不笑不足以为道。故建言有之。明道若昧。进道若退。夷道若纇。上德若谷。大白若辱。广德若不足。建德若偷。质真若渝。大方无隅。大器晚成。大音希声。大象无形。道隐无名。夫唯道善贷且成。
42.道生一。一生二。二生三。三生万物。万物负阴而抱阳,冲气以为和。人之所恶,唯孤、寡不谷,而王公以为称,故物或损之而益,或益之而损。人之所教,我亦教之,强梁者,不得其死。吾将以为教父。
43.天下之至柔,驰骋天下之至坚。无有入无间,吾是以知无为之有益。不言之教,无为之益天下希及之。
44.名与身孰亲。身与货孰多。得与亡孰病。是故甚爱必大费。多藏必厚亡。知足不辱。知止不殆。可以长久。
45.大成若缺,其用不弊。大盈若冲,其用不穷。大直若屈。大巧若拙。大辩若讷。静胜躁,寒胜热。清静为天下正。
46.天下有道,却走马以粪。天下无道,戎马生於郊。祸莫大於不知足。咎莫大於欲得。故知足之足常足矣。
47.不出户知天下。不窥牖见天道。其出弥远,其知弥少。是以圣人不行而知。不见而明。不为而成。
48.为学日益。为道日损。损之又损,以至於无为。无为而不为。取天下常以无事,及其有事,不足以取天下。
49.圣人无常心。以百姓心为心。善者吾善之。不善者吾亦善之,德善。信者吾信之。不信者吾亦信之,德信。圣人在天下,歙歙(xīxī,无所偏执的样子)焉,为天下浑其心。百姓皆注其耳目,圣人皆孩之。
50.出生入死。生之徒,十有三。死之徒,十有三。人之生,动之於死地,亦十有三。夫何故?以其生生之厚。盖闻善摄生者,陆行不遇凶虎,入军不被甲兵。凶无所投其角。虎无所用其爪。兵无所容其刃。夫何故?以其无死地。
51.道生之,德畜之,物形之,势成之。是以万物莫不尊道,而贵德。道之尊,德之贵,夫莫之命而常自然。故道生之,德畜之。长之育之。亭之毒之。养之覆之。生而不有,为而不恃,长而不宰。是谓玄德。
52.天下有始,以为天下母。既得其母,以知其子。既知其子,复守其母,没身不殆。塞其兑,闭其门,终身不勤。开其兑,济其事,终身不救。见其小曰明,守柔曰强。用其光,复归其明,无遗身殃。是为习常。
53.使我介然有知,行於大道,唯施是畏。大道甚夷,而人好径。朝甚除,田甚芜,仓甚虚。服文彩,带利剑,厌饮食,财货有馀。是谓盗夸。非道也哉。
54.善建者不拔。善抱者不脱。子孙以祭祀不辍。修之於身其德乃真。修之於家其德乃馀。修之於乡其德乃长。修之於邦其德乃丰。修之於天下其德乃普。故以身观身,以家观家,以乡观乡,以邦观邦,以天下观天下。吾何以知天下然哉?以此。
55.含德之厚比於赤子。毒虫不螫,猛兽不据,攫鸟不抟。骨弱筋柔而握固。未知牝牡之合而全作,精之至也。终日号而不嗄,和之至也。知和曰常。知常曰明。益生曰祥。心使气曰强。物壮则老。谓之不道,不道早已。
56.知者不言。言者不知。挫其锐,解其纷,和其光,同其尘,是谓玄同。故不可得而亲。不可得而疏。不可得而利。不可得而害。不可得而贵。不可得而贱。故为天下贵。
57.以正治国,以奇用兵,以无事取天下。吾何以知其然哉?以此。天下多忌讳而民弥贫。民多利器国家滋昏。人多伎巧奇物泫起。法令滋彰盗贼多有。故圣人云我无为而民自化。我好静而民自正。我无事而民自富。我无欲而民自朴。
58.其政闷闷,其民淳淳。其政察察,其民缺缺。祸尚福之所倚。福尚祸之所伏。孰知其极,其无正。正复为奇,善复为妖。人之迷其日固久。是以圣人方而不割。廉而不刿。直而不肆。光而不耀。
59.治人事天莫若啬。夫唯啬是谓早服。早服谓之重积德。重积德则无不克。无不克则莫知其极。莫知其极可以有国。有国之母可以长久。是谓深根固柢,长生久视之道。
60.治大国若烹小鲜。以道莅天下,其迨ㄞ哄非其鬼不神,其神不伤人。非其神不伤人,圣人亦不伤人。夫两不相伤,故德交归焉。
61.大国者下流,天下之交。天下之牝。牝常以静胜牡。以静为下。故大国以下小国,则取小国。小国以下大国,则取大国。故或下以取,或下而取。大国不过欲兼畜人。小国不过欲入事人。夫两者各得所欲,大者宜为下。
62.道者万物之奥。善人之宝,不善人之所保。美言可以市尊。美行可以加人。人之不善,何弃之有。故立天子、置三公,虽有拱璧以先驷马,不如坐进此道。古之所以贵此道者何。不曰 ∶ 求以得,有罪以免邪?故为天下贵。
63.为无为,事无事,味无味。大小多少,报怨以德。图难於其易,为大於其细。天下难事必作於易。天下大事必作於细。是以圣人终不为大,故能成其大。夫轻诺必寡信。多易必多难。是以圣人犹难之,故终无难矣。
64.其安易持,其未兆易谋。其脆易泮,其微易散。为之於未有,治之於未乱。合抱之木生於毫末。九层之台起於累土。千里之行始於足下。为者败之,执者失之。是以圣人无为故无败,无执故无失。民之从事常於几成而败之。慎终如始则无败事。是以圣人欲不欲,不贵难得之货。学不学,复众人之所过,以辅万物之自然而不敢为。
65.古之善为道者,非以明民,将以愚之。民之难治,以其智多。故以智治国,国之贼。不以智治国,国之福。知此两者,亦稽式。常知稽式,是谓玄德。玄德深矣、远矣!与物反矣。然後乃至大顺。
66.江海之所以能为百谷王者,以其善下之,故能为百谷王。是以圣人欲上民,必以言下之。欲先民,必以身後之。是以圣人处上而民不重,处前而民不害。是以天下乐推而不厌。以其不争,故天下莫能与之争。
67.天下皆谓我道大似不肖。夫唯大故似不肖。若肖,久矣!其细也夫。我有三宝持而保之 ∶ 一曰慈, 二曰俭,三曰不敢为天下先。慈故能勇,俭故能广,不敢为天下先故能成器长。今舍慈且勇,舍俭且广,舍後且先,死矣!夫慈以战则胜,以守则固。天将救之以慈卫之。
68.善为士者不武。善战者不怒。善胜敌者不与。善用人者为之下。是谓不争之德。是谓用人之力。是谓配天之极。
69.用兵有言,吾不敢为主而为客。不敢进寸而退尺。是谓行无行。攘无臂。扔无敌。执无兵。祸莫大於轻敌。轻敌几丧吾宝。故抗兵相加哀者胜矣。
70.吾言甚易知、甚易行。天下莫能知、莫能行。言有宗、事有君。夫唯无知,是以我不知。知我者希,则我者贵。是以圣被褐怀玉。
71.知不知上,不知知病。圣人不病,以其病病。夫唯病病,是以不病。
72.民不畏威,则大威至。无狎其所居,无厌其所生。夫唯不厌,是以不厌。是以圣人自知不自见。自爱不自贵。故去彼取此。
73.勇於敢则杀。勇於不敢则活。此两者或利或害。天之所恶孰知其故。天之道不争而善胜。不言而善应。不召而自来。繟(chǎn,舒缓)然而善谋。天网恢恢疏而不失。
74.民不畏死,奈何以死惧之。若使民常畏死,而为奇者,吾得执而杀之,孰敢。常有司杀者杀。夫代司杀者杀,是谓代大匠斫。夫代大匠斫者,希有不伤其手矣。
75.民之饥以其上食税之多,是以饥。民之难治以其上之有为,是以难治。民之轻死以其求生之厚,是以轻死。夫唯无以生为者,是贤於贵生。
76.人之生也柔弱,其死也坚强。草木之生也柔脆,其死也枯槁。故坚强者死之徒,柔弱者生之徒。是以兵强则灭,木强则折。强大处下,柔弱处上。
77.天之道其犹张弓与。高者抑之,下者举之。有馀者损之,不足者补之。天之道,损有馀而补不足。人之道,则不然,损不足以奉有馀。孰能有馀以奉天下,唯有道者。是以圣人为而不恃,功成而不处。其不欲见贤邪!
78.天下莫柔弱於水。而攻坚强者,莫之能胜。以其无以易之。弱之胜强。柔之胜刚。天下莫不知莫能行。是以圣人云,受国之垢是谓社稷主。受国不祥是为天下王。正言若反。
79.和大怨必有馀怨,安可以为善。是以圣人执左契,而不责於人。有德司契,无德司彻。天道无亲常与善人。
80.小国寡民。使有什伯之器而不用。使民重死而不远徙。虽有舟舆无所乘之。虽有甲兵无所陈之。使民复结绳而用之。甘其食、美其服、安其居、乐其俗。邻国相望,鸡犬之声相闻。民至老死不相往来。
81.信言不美。美言不信。善者不辩。辩者不善。知者不博。博者不知。圣人不积。既以为人己愈有。既以与人己愈多。天之道利而不害。圣人之道为而不争。
来源:中制智库
美国从来没有放弃制造业,去年美国服务业占到了经济总量的81%,但其中60%以上都是为制造业服务的
演讲者:年勇(国家发改委产业司原司长)
9月9日,以“新制造时代”为主题的“2020中国互联网制造峰会”在厦门召开
智能制造是一个特别大的题目,我讲点自己的认识,跟大家分享。按理说,今天要讲制造业,有人会不太理解,说还讲制造业,题目和内容都很LOW。我说讲什么不LOW呢?讲大数据、云计算、区块链就不LOW?我说你理解错了,我们这个社会目前最大的误导就是认为讲制造业是过时的,是落伍的,认为要讲大数据、云计算、区块链、量子计算之类,才跟得上形势,才与时俱进。这是当前社会最大的问题。
美国从来没有放弃制造业
要谈制造业是因为当前制造业还是我们国民经济的基础,是我们科学技术的基本载体。一个国家的科技水平和经济实力体现在哪里?唯一的标志就是制造业发不发达。这是我们现在没人说,不想说,不愿意说的。我总结,人类的发展进步就是制造业的发展进步。有人会说我偏激,我说人和动物的区别就是在于人可以制造工具。
现在有一个说法叫做美国是服务经济,是后工业社会,不搞制造业了,而中国制造业很发达。但美国具体是什么情况呢?去年美国服务业的比重是81%,以此证明美国是后工业经济,是不要制造业的经济。但是很多人不知道,美国去年制造业是2.36万亿,占经济总量的11%,服务业是81%。大家不知道81%背后的东西,那么背后是什么呢?在美国服务业的81%里头60%以上都是为制造业服务的,这些年占美国经济总量约48%、49%、50%。什么意思?就是说美国经济全部总量里有一半是为制造业服务的。加上制造业本身就超过了60%。换句话说,美国制造业占美国经济总量超过60%。
所以说,美国其实是一个制造业大国。美国从来也没有放弃制造业,直到今天。前天特朗普还说,美国要成为世界制造业的超级大国。中心意思是讲要摆脱中国的依赖。总之,如果我们中国对这个认识不清楚,天天忽悠新概念,我估计中国要为此付出沉重的代价。
工业化发展历程
第一,昨天。人类历史就是科学技术不断为制造业赋能的历史,我们不断发明新的科学技术,不断应用在制造业上,促进制造业的发展进步。今天“智能制造”这个词是1988年美国怀特教授出的一本叫《智能制造》的书里首次提出来的,到现在也就32年,时间很短。实际上说起智能制造,往前追溯,第一次工业革命开始于1776年瓦特发明蒸汽机,那个时候制造业有了比较快的进步。为什么说工业革命的开始是瓦特发明蒸汽机呢?因为动力的进步,人力可以解放出来,是机械化时代,那个时候开始我们就已经进入了制造业的现代化进程。
之后,经历了第二次工业革命。第二次工业革命是以1821年法拉第发明电动机为标志,人类进入了电气化时代,电气化时代又上了一个台阶。进入第三次工业革命,是1946年发明电子计算机开始。第三次工业革命这个时代还在持续,至于持续多长时间,还不知道。
第三次工业革命过程中,大数据、云计算、人工智能等新技术的出现,又被认为是智能化时代。在过去200多年当中,第一次工业革命以来,发达国家从来没有放弃过制造业,而且始终处在制造业的领先地位。近年来,推进制造业的能力水平及各方面,发达国家从国家层面提出了很多的战略,也提出了很多的支持措施,包括资金支持。他们的企业,特别是大企业在推进制造业智能化方面有很多的战略举措。
从国内来看,我们国家改革开放40年来,紧跟发达国家步伐,向他们学习,在抓住全球产业大势特别是新一代信息技术和传统的制造技术有机融合方面还是取得了非常大的进步,取得了很多成就,这些成就就不一一列举。为什么有这个成就?一个原因是我们积极向别人学习借鉴,另一个是我们自己不断努力的结果。
短时间完成的工业化
我们丢失了什么?
第二,今天。尽管过去三十年我们在制造业取得了很大成就,发展成为世界第一大制造体系(总规模),但制造业存在的问题也是很多,距离发达国家差距还非常巨大。尽管块头不小,但从技术、工艺、材料、水平能力各个方面,尤其是高端(制造业)这部分差距还是非常巨大的。当然,(我国)真正走工业化的时间还比较短,实际上也就这四十年。
换句话说,现在我们取得的成就实际上是我们用三四十年的时间走完了西方发达国家近三百年的工业化道路。走过了第一次工业革命一百年,走过了第二次工业革命的一百年,又走过了第三次工业前三四十年,这么短的时间内我们急速地追赶,势必缺失了很多东西,少了很多环节。
归纳起来有三个方面比较突出:
第一,产业基础十分薄弱。现在产业基础包括研究的基础、产业化的基础、应用的基础等等与发达国家的差距还很大。其中最为突出的就是基础研究,基础研究对后面的应用至关重要。因为前面工业化时间很短这个客观现实,(导致)很多基础研究没有跟上,包括大学研究机构,还有大企业的基础研究都很差。
一百多年前美国有一个物理学家叫做亨利·罗兰,做过一次演讲,他说为了应用科学,科学本身必须成功,假如我们停止科学的进步而只留意科学的应用,很快就会退化成中国人那样。多少代人以来他们都没有什么进步,因为他只满足科学应用,却从来没有追问过他们所做事情的原理,这些原理就构成了科学。到了一百多年之后的今天,我们改得怎么样了?我回答不了这个问题。但是我们看到的现实是我们重大的基础理论,重大的原创核心技术几乎是空白的。到今天4G的关键基础材料、先进基础工艺、核心基础零部件等都严重依赖于国外。
目前我国高端的芯片,工业机器人(15.170, -0.10, -0.65%)等等这些硬件几乎不能生产,我们原创的操作系统等这些关键软件也要依靠进口。比如说驱动电机,生产驱动电机一个小部件国内生产规模很大,全世界无人可比,但制造这个电机所需的高速精密轴承,耐电的材料,高精度的位置和温度的传感器,里面的电子开关IGBT等等这些东西,我们没有一件能生产。由于基础研究差,导致了底层的硬件、底层的软件都要依赖别人,这是我们和发达国家,和美国最根本的、最大的差距。
第二个短板是产业生态上不去。(我国)制造业的整个产业链不完整,这个问题非常突出,有的环节是空白的。而且我们为智能制造服务的这些关键基础设施还差得很远,比如说这两天讨论的工业互联网、5G,包括数据资源的体系、人才资源体系几乎没有什么是健全的。
第三,产业环境亟待提升。我归纳有三个偏差,第一个是认知偏差,是不重视制造过程、制造经验的结果。这个积累非常重要,就是好大喜功,没有认识到工业1.0、2.0、3.0到4.0要一步一步走。为什么?因为工业化的进程可以缩短,不可以省略。省略了任何一个环节将来都要付出沉痛的代价,而且早晚要补上。第二是引导偏差,很多引导策略不系统、不完整、碎片化,没有办法执行,针对性和可操作性都很差,重点也不突出。这种情况下,没有办法形成共识、形成合力。第三个偏差就是执行偏差,在推进制造业智能化或者推进智能制造过程中,没有看见主导力量,各自为政,一片散沙,而且资本、人力、物力的投入都浪费掉了。这就是我们今天面临的形势,(形势)就是这么严峻。
美国的经济起飞的引擎是什么?
第三,明天。明天面临什么?实际上很清楚,今天面临什么短板、瓶颈,那就是我们明天要努力的方向。这样说的话,第一是要夯实基础,当然有高校问题、研究机构问题、企业问题,这些基础都要夯实,没有这个想飞基本是不可能的。意思是,必须全社会得有这个意识。
大学在基础研究中承担至关重要的角色,美国的经济起飞有两个引擎,一个是美国西部的旧金山湾区,一个在美国的东部波士顿。为什么会出现这两个特别活跃,创新成果层出不穷(的地方)?因为西部有加州大学、斯坦福大学这些著名大学。东部地区有哈佛大学、麻省理工学院等。这些大学有雄厚的研究力量,有长期的积累,有源源不断的学生进来和出来,就是提供了源源不断的一代又一代的精英人才。美国这两个地方围绕着大学形成相当成熟的产业,大学里头的发明创造提供给产业化一系列制造业(技术支撑),还有为制造业系统提供金融支持。
同时,这一套发达国家的制造业体系和发达的金融业体系就确保了美国从大学的基础研究出来的成果能够小试、中试、产业化,然后放大,最后就是很大的产业。工厂可以不放在美国,可以放在中国、欧洲。但是,它的原创成果在他的大学里,这些教授、实验室主任领着老师学生围绕着某一个细分领域,一个小领域持续研究。而且从前几代的实验室主任接过来这个接力棒。
曾经有一个中国小孩在那工作,我就问他,你是干什么的?他说就做研究,来了半年。我说我想知道你这半年的学习、生活状态是什么样的?他说我的半年全部在实验室,早上起床吃点东西就到实验室,晚上十一二点回去(宿舍)。他说也不是老师要求他这样子,从实验室主任到一帮的年轻老师,再到学生都是这样的状态,而且全是自愿的,每天的状态都非常激昂,觉得有意义。我说这就是美国强大的唯一原因,谁能做到一点谁就是最大、最强的。
第二,健全生态。一个是健全智能制造产业链,把短板补上。一个是推进智能制造的基础设施建设,包括工业互联网、5G。一个是人才体系的建设,没有人什么都干不成。
第三,完善环境。第一,提升认知水平。第二,加强引导,要破除引导策略的碎片化。我曾经牵头制定了一个《增强制造业核心技术三年行动计划》,每三年一次,为什么要制定这个?就是想集中少数重点领域,把各种资源、资金、人才都集中到这个领域,使这个领域尽快有所突破。现在已经执行到第二轮,支持了一大批项目,效果非常好。第三,推动实施。我们讲智能制造核心还是制造,你不能想你的制造不行,上面加计算机,加个软件就行了。不是这样的,制造业需要积累,需要摸索,它有很多隐性知识,不是三天两天就学得来的。如果不熟悉制造过程、制造程序、制造工艺、制造经验,后边再多的数据都没有用,你根本不知道数据背后是什么。
从这个意义上讲,智能制造的推进可能需要一个制造业巨头来引领、来主导,没有的话,这个事情就很难做。制造巨头才了解制造业,才明白制造工艺、制造的程序和掌握制造的核心技术,不掌握这个,你想引领也引领不了。国际上最典型就是GE,上百年的制造经验,它对制造工艺、制造领域的理解比任何其他企业都深刻。同时又有巨大的实力来提升信息技术水平,掌握了大量信息技术的关键,这样,两方结合才可能引领智能制造的发展。制造业大企业要承担起历史的责任。
本文由中制智库整理,并转自公众号“中制智库”
责任编辑:何中夫
记录下之前做用户反馈的 NLP 处理时,机器学习的笔记
概念定义
TensorFlow
一个科学计算库
张量 (Tensor)作为数据的基本单位。TensorFlow 的张量在概念上等同于多维数组,我们可以使用它来描述数学中的标量(0 维数组)、向量(1 维数组)、矩阵(2 维数组)等各种量
监督式机器学习定义
机器学习系统通过学习如何组合输入信息来对从未见过的数据做出有用的预测。
线性回归
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。
其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。
标签
标签是我们要预测的事物,即简单线性回归中的 y 变量。
标签可以是小麦未来的价格、图片中显示的动物品种、音频剪辑的含义或任何事物。
标签可以是测试用例的规模/覆盖率。
标签可以是BUG的数量
标签可以是产生BUG风险较大的功能模块
特征
特征是输入变量,即简单线性回归中的 x 变量。简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征,按如下方式指定:
x1,x2,…xn
在垃圾邮件检测器示例中,特征可能包括:
电子邮件文本中的字词
发件人的地址
发送电子邮件的时段
电子邮件中包含“一种奇怪的把戏”这样的短语
测试用例的功能模块
测试用例的优先级
测试用例发现BUG较多的功能模块
样本
样本是指数据的特定实例:x。
(我们采用粗体 x 表示它是一个矢量。)我们将样本分为以下两类:
有标签样本
无标签样本
有标签样本同时包含特征和标签。即:
labeled examples: {features, label}: (x, y)
我们使用有标签样本来训练模型。 无标签样本包含特征,但不包含标签。即:
unlabeled examples: {features, ?}: (x, ?)
模型
模型定义了特征与标签之间的关系。例如,垃圾邮件检测模型可能会将某些特征与“垃圾邮件”紧密联系起来。
重点介绍一下模型生命周期的两个阶段:
【训练】是指创建或学习模型。也就是说,向模型展示有标签样本,让模型逐渐学习特征与标签之间的关系。
【推断】是指将训练后的模型应用于无标签样本。也就是说,使用经过训练的模型做出有用的预测 (y’)。
回归与分类模型
回归模型可预测连续值。例如,回归模型做出的预测可回答如下问题:
加利福尼亚州一栋房产的价值是多少? 用户点击此广告的概率是多少?
分类模型可预测离散值。例如,分类模型做出的预测可回答如下问题:
某个指定电子邮件是垃圾邮件还是非垃圾邮件? 这是一张狗、猫还是仓鼠图片?
Gompertz 增长模型:y=a*bcT
把特征与标签结合,举例:某些系统信息特征(如历史版本出现问题频率、与其他功能的耦合关系、用户场景触发相关功能的频次)与风险指数较大的模块、BUG的数量
通过训练集,不断识别特征,不断建模,最后形成有效的模型,这个过程就叫“机器学习”
机器学习步骤:数据收集、数据清洗、数据准备
示例 1:支付宝信用评分
步骤一:构建问题,选择模型
5 个影响因素
付款记录 账户总金额 信用记录跨度(自开户以来的信用记录、特定类型账户开户以来的信用记录…) 新账户(近期开户数目、特定类型账户的开户比例…) 信用类别(各种账户的数目)
Y=f(ABCDE)
Y=结果
f 是公式关联 5 个因素
步骤二;收集已知数据
收集 5 种因素的信息以及对应的信用评分 数据分成 3 种类型: 训练集(60%)、测试集(20%)、验证集(20%)
示例 2:通过酒精度和颜色来区分红酒和啤酒
步骤一.收集数据
步骤二.数据分类
步骤三.选择模型
步骤四.训练
步骤五.评估
步骤六.参数调整
步骤七.预测
线性回归示例:蝉鸣叫声与温度之间的关系
Y 指的是温度(以摄氏度表示),即我们试图预测的值
m 指的是直线的斜率
x 指的是每分钟的鸣叫声次数,即输入特征的值
b 指的是 y 轴截距
模型方程式:$$Y = mx + b$$
其中:
y'指的是预测标签(理想输出值)
b 指的是偏差(y 轴截距)
w 指的是权重
w1 指的是特征 1 的权重(权重与上文中用 m 表示的“斜率”的概念相同)
x1 指的是特征(已知输入项)
要根据新的每分钟的鸣叫声值 x1 推断(预测)温度 y',只需将 x1 值代入此模型即可
下标(例如 w1 和 x1)预示着可以用多个特征来表示更复杂的模型。例如,具有三个特征的模型可以采用以下方程式:$$y'= b + w1x1 + w2x2 + w3x3$$
迭代
[梯度下降法]http://www.doc88.com/p-2445313427576.html
\(Y=a \* b^{c^T}\)
方法总结
基于代码指标的预测
预测对象:代码源文件(代码长度,运算复杂度,圈复杂度等)
主要方法:主要分析代码特征与 bug 的关联关系
备注:需要一个相对复杂的预测模型
不足:特征不准确,模型难落地
基于 bug 历史数据的预测
预测对象:代码源文件
主要方法:以 bug 历史数量作为主要计算依据
备注:从版本控制系统日志获取修复每个 bug 时被改动的源文件记录,统计出每个源文件历史上产生的 bug 数量,从而识别出一批在过去产生 bug 最多的源文件,同时为了避免历史记录产生的误报(有的模块即使存在大量历史 bug 记录,重构优化后 bug 实际是减少的),给每个 bug 增加权重,值随时间增加而减少(离当前时间最近的值权重为 1,离当前时间最远的值权重为 0)
不足:仅看 bug 历史数据不足以支撑预测准确率
基于代码活动特征的预测(即时 bug 预测)
预测对象:代码改动活动(代码特征+源文件)
主要方法:通过分析一次代码变更时,牵涉的所有代码变更活动(代码特征+源文件),映射模型,预测出 bug 发生概率,输出风险值(设置阈值,形成代码合入门槛)
备注:活动特征————
改动大小(添加、修改、删除行数)
改动范围(发生变动的源文件、目录数量)
改动历史(发生改动的源文件历史上的修改情况)
作者信息(提交代码、产生 bug 的记录)
代码评审信息(comments 数量、reviewer 记录)
不足:深层特征提取难度大,模型相对复杂
基于深度学习的即时 bug 预测
预测对象:代码改动活动(CommitMassage)
主要方法:通过对描述代码改动的 commit message 与实现代码改动的代码片段。将 commit message 和代码改动作为文本型输入,算法可以自动从中学习各种各样的低阶和高阶特征(包括代码语法和语义特征),并利用这些特征来构建预测模型。这个过程中用到的典型技术有 word embedding、卷积神经网络 CNN 等。
即时缺陷预测技术的一般过程,主要包括三个阶段,数据标注、特征提取和模型构建。其中 数据标注阶段主要依赖于版本控制系统(例如 Git)和缺陷追踪系统(例如 Bugzlla 或 Jira),将代码变更标注为缺 陷变更(Buggy)或非缺陷变更(Clean);特征提取阶段主要通过提取不同维度的特征来表示代码变更;模型构建 阶段主要依赖于机器学习技术构建预测模型,当新的代码变更提交时,模型将预测其缺陷可能性。
数据标注是指将代码变更标注为缺陷引入变更和非缺陷引入变更。准确的数据标注是完成模型训练和模型评估的前提。
SZZ 算法
1.查找 commit massage 数据中 fix bug 的记录,定位到具体的源文件
2.对上一步找到的源文件,通过 diff 算法,查找修复 bug 进行的代码变更,定位到产生 bug 的代码行(标记为‘-’号的代码行)
3.对上一步找到的产生 bug 的代码行,通过 annotate 命令,查找该 bug 的代码变更(提交)历史,定位到最早引入该 bug 的代码变更(标记为‘+’号的代码行)
4.以上一步找到的 bug 引入变更为基准,清除所有提交 bug 之后产生的代码变更(噪音消除)
B-SZZ
AG-SZZ(annotation grahp)
MA-SZZ
RA-SZZ
基于变更元数据的特征。
定义:描述变更属性(例如开发者、提交时间、变更日志、修改文件、每个文件增加和减少的代码行数等)的数据。
获取方式:
1.直接通过软件项目的版本控制系统中的变更提交记录获取。
基于变更代码内容的特征。
定义:基于变更代码内容的特征。
获取方式:
1.使用代码复杂度特征来表征变更。同时使用代码变更代码、日志和文件名的词频率特征来量化代码变更内容
2.将这些基于变更代码内容的特征与基于变更元数据的特 征结合,构建预测模型。
基于软件演进过程的特征。
定义:基于项目代码修改历史量化变更。
获取方式: 1.基于文件修改历史的特征可以直接通过变更提交历史记录计算。从文件修改历史角度提取变更特征,例如变更相关文件被修改的次数、修改变更相关文件的开发者人数等。
基于多源软件制品的特征。
定义:结合多源软件制品提取多维代码变更特征。
获取方式:
1.从项目的代码审查系统、测试管理系统、项目管理系统等提取特征来表征代码变更。
9 个维度:
变更元数据
规模 (Size):(要注意这里采用的是相对比值:相对增加行数、相对减少行数分别指变更实际增加、减少行数与变更提交前其相关文件代码行数的比值)
commit 活动中增加、减少的代码行数|与产生 bug 的概率成正比
commit 活动中增加、减少的代码片段|与产生 bug 的概率成正比
修改前的代码源文件大小|与产生 bug 的概率成正比
代码分布(Diffusion):
commit 活动中修改的子系统数|与产生 bug 的概率成正比
commit 活动中修改的代码目录数|与产生 bug 的概率成正比
commit 活动中修改的文件数|与产生 bug 的概率成正比
commit 活动中整体源文件的修改点分布(信息熵)|与产生 bug 的概率成正比
目标(Purpose)
commit 活动中的目的是否为修复 bug |与产生 bug 的概率成正比
commit 活动中与该变更相关的 bug 记录|与产生 bug 的概率成正比
开发者经验(Developer Experience)
提交记录越多的开发者|与产生 bug 的概率成反比(这里是指相对所有开发者的提交记录中的占比)
变更代码内容
复杂度(Complexity):
commit前后,复杂度指标的差值,复杂度指标如代码总行数(LOC)、注释代 码行数、圈复杂度等|与产生bug的概率成正比
文本(Text)
commit前后,变更日志、文件内容、目录、文件名的词频率特征|未知
代码结构(Structure)
软件演进过程
文件修改历史(File History)
该变更文件修改的开发者数量|与产生bug的概率成正比
该变更文件修改的次数|与产生bug的概率成正比
该变更文件修复的bug数量|与产生bug的概率成正比
变更文件的最近变更时间的时间差平均值|最近引入的变更产生bug的概率较大
多源软件系统
代码审查(Code Review)
变更被重复修正的次数、审查人数、审查意见数量以及审查时间|与产生bug的概率成正比
标签:
特征:
模块的 bug 历史总数、模块上一版本的 bug 总数、模块的严重级别为高的 bug、模块的优先级为高的 bug、模块的遗留(挂起)bug、模块的遗留(挂起)严重级别高的 bug
样本:
一组数据,由标签+特征组成【有标签样本】;由特征组成【无标签样本】
模型:
回归模型:
分类模型:
预测离散值,如某个指定电子邮件是垃圾邮件还是非垃圾邮件?
代码示例
import tensorflow as tf
#Set up a linear classifier.
classifier = tf.estimator.LinearClassifier()
#Train the model on some example data.
classifier.train(input_fn=train_input_fn, steps=2000)
#Use it to predict.
predictions = classifier.predict(input_fn=predict_input_fn)
步骤
第 1 步:定义特征并配置特征列
第 2 步:定义目标
第 3 步:配置 LinearRegressor
第 4 步:定义输入函数
特征提取
hot portions of the code base 代码库热门部分
git log --pretty=format:"%h - %an - %ad - %ar - %cd - %cr - %s" --shortstat >> /Users/jo/Development/Makeblock/mBlock/mblockWEB_commit.txt
初步导出了一份数据,一条记录里有两行(因为 git log 不支持一行显示)
第一行 提交记录 ID - 作者 - 修订时间 - 修订时间(按距今多久显示) - 提交时间 - 提交时间(按距今多久显示) - 提交注释信息
第二行 文件改动数量, 新增代码行数量, 删除代码行数量
在 TensorFlow 中,使用估计器开发机器学习程序的一般过程如下:
1.创建一个或者多个输入函数(Input Function)。
2.定义模型的特征列(Feature Column)。
3.用特征列和超参数(Hyper-parameter)等作为入参,实例化估计器,得到估计器对象(object)。
4.用输入函数作为入参,调用估计器对象的若干方法(训练、评价、预测等),完成机器学习工作。
代码示例
es.normalize_entity(base_entity_id ='bigmart', new_entity_id ='outlet', index ='Outlet_Identifier',
additional_variables = ['Outlet_Establishment_Year', 'Outlet_Size', 'Outlet_Location_Type', 'Outlet_Type'])
feature_matrix, feature_names = ft.dfs(entityset = es,
target_entity ='bigmart',
max_depth = 2,
verbose = 1,
n_jobs = 3)
特征基元
聚合基元:多个表之间的父子关系,例如:通过 client_id 将 loan 表进行分组,为每个客户找到最大贷款值
转换基元:单个表内的多列之间关系,例如:取 2 列之间的差值,取 1 列的绝对值
#bug、项目、字段之间的关系
r_issue_project = ft.Relationship(es['issues']['project_id'],
es['projects']['project_id'],
es['customfield']['project_id'])
#将关系添加到实体集
es = es.add_relationship(r_issue_project)
#以前的贷款和以前的付款之间的关系
r_payments = ft.Relationship(es['projects']['p_id'],
es['payments']['loan_id'])
思路
多表字段合并单表,再进行特征自动化
单表特征合成后特征数量 364 个,初步筛选出 185 个,特征工程的工作流程已经确定;
选择【即时缺陷预测】方案
数据标注:通过 git&jira 将代码变更的记录标注是否产生缺陷(buggy/clean)
具体方法:szz 算法
1.识别缺陷修复变更
扫描存储在版本控制系统的所有历史数据,即所有代码变更,识别日志中包含缺陷 ID 的代码变更。这些代码变更被识别为缺陷修复变更。
区分迭代周期,在单个迭代周期内,扫描整个代码库,根据代码 commit 修改文件,找出关联的模块 (git commit id -> 软件模块)找出 jira 中所有 bugID,再将 bugID 与 git 的 massage 做关联,查出包含 bugID 的提交记录(bug id -> git commit id) => (git commit id -> 软件模块 s -> (bug ids))
2.识别被修复的缺陷代码。利用版本控制系统实现的 diff 算法来识别上述修复缺陷的代码变更修改的代码行。这些被修改的代码行被识别为缺陷代码。
c.找出包含bugID的代码提交记录对应的,为了修复缺陷的代码变更。(定位错误代码位置)
3.识别可能的缺陷引入变更。使用代码版本控制系统中的annotate命令回溯代码变更提交历史,第一次引入缺陷代码的变更被识别为可能的缺陷引入变更。
d.找出该错误代码引入的提交记录(定位错误代码的引入信息)
4.噪音数据消除。缺陷引入变更应当在该缺陷被报告之前被提交。因此,提交时间晚于缺陷报告时间的代码变更会被当作噪音去除。
e.找出提交时间晚于缺陷产生的时间的错误代码引入的提交记录,并删除该类数据
git commit id1(代码改动) -|
|- Module1-—-
| |- bug 1 (严重性、reopen、...)
| |— bug 2
| |...
| |- bug n
|
|
|- Module2
|
|...
|- Moudule n
git commit id2(代码改动) -|
|- Module1-——
| |- bug 1
| |— bug 2
| |...
| |- bug n
|
|
|- Module2
|
|...
|- Moudule n
F(git commit id ) = [Pm1, Pm2, Pm3, ..., Pmn] Pm表示模块产生bug的概率或影响程度
Pm = F1(bug1,bug2,bug3 ... bug n) = sum(1 * c0 + bug.priority * c1 + bug.reopen * c2 + ... + bug.xxx * cn) //根据测试经验指定cn
st. sum (c0,c1 ... cn) = 1
样本:
[git commit id 1] [Pm1, Pm2, Pm3, ..., Pmn]
[git commit id 2] = [Pm1, Pm2, Pm3, ..., Pmn]
... ...
[git commit id n] [Pm1, Pm2, Pm3, ..., Pmn]
git commit idn = [filepath1, 改动行数1, ]
git commit idn = { //从gitlog提取特征
author: {P4, 参与项目时间, 责任心}
time: "",
modulechanges :[{name: "Module1", changeRatio:0.1, coverage: 0.6} , {name: "Module2", line:0}]
}
最终模型:
{ //从gitlog提取特征
author: {P4, 参与项目时间, 责任心}
time: "",
modulechanges :[{name: "Module1", line:5} , {name: "Module2", line:0}]
} => [Pm1, Pm2, Pm3, ..., Pmn]
{
"author": {
"author_level": "p4",
"author_bugs": 110,
"author_commits": 130
},
"commit_info": {
"commit_id": "c2as13b",
"commit_time": "2020-03-05",
"commit_purpose": "fix | feat | refactor | doc | style | test"
},
"modules_change": [{
"modules_id": "",
"module_name": "modules1",
"files_change": 2,
"insertions": 4,
"deletions": 4,
"testCoverage": 0.9,
"testPass": 0.8,
"testFail": 0.2,
"TotalBugs": 14,
"lastIterationBugs": 3,
"suspendedRatio": 0.1,
"reopenRatio": 0.1,
"missRatio": 0.01,
"highPriorityBugs": 5,
"highSeverityBugs": 3,
"affectingModulesBugs": 12,
"affectingVersionBugs": 3,
"affectingClientBugs": 7,
"bugs_info": [{
"bug_id": "[MBLOCK-00001]",
"modules": ["modules1", "modules2", "...", "modulesN"],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
},
{
"bug_id": "[MBLOCK-00002]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
},
{
"...": "..."
},
{
"bug_id": "[MBLOCK-N]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
}
]
},
{
"modules_id": "",
"module_name": "modules2",
"files_change": 2,
"insertions": 4,
"deletions": 4,
"testCoverage": 0.9,
"testPass": 0.8,
"testFail": 0.2,
"TotalBugs": 14,
"lastIterationBugs": 3,
"suspendedRatio": 0.1,
"reopenRatio": 0.1,
"missRatio": 0.01,
"highPriorityBugs": 5,
"highSeverityBugs": 3,
"affectingModulesBugs": 12,
"affectingVersionBugs": 3,
"affectingClientBugs": 7,
"bugs_info": [{
"bug_id": "[MBLOCK-00001]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
},
{
"bug_id": "[MBLOCK-00002]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
},
{
"...": "..."
},
{
"bug_id": "[MBLOCK-N]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
}
]
},
{
"...": "..."
},
{
"modules_id": "",
"module_name": "modulesN",
"files_change": 2,
"insertions": 4,
"deletions": 4,
"testCoverage": 0.9,
"testPass": 0.8,
"testFail": 0.2,
"TotalBugs": 14,
"lastIterationBugs": 3,
"suspendedRatio": 0.1,
"reopenRatio": 0.1,
"missRatio": 0.01,
"highPriorityBugs": 5,
"highSeverityBugs": 3,
"affectingModulesBugs": 12,
"affectingVersionBugs": 3,
"affectingClientBugs": 7,
"bugs_info": [{
"bug_id": "[MBLOCK-00001]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
},
{
"bug_id": "[MBLOCK-00002]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
},
{
"...": "..."
},
{
"bug_id": "[MBLOCK-N]",
"modules": ["modules1", "modules2", "...",
"modulesN"
],
"versions": ["v1", "v2", "...", "vN"],
"priority": "3 | 2 | 1",
"severity": "5 | 4 | 3 | 2 | 1",
"reopen": 3,
"missable": 1,
"suspendable": 1
}
]
}
]
}
{
"author": {
{
"author_level": "p4",
"author_bugs": 110,
"author_commits": 130
}
},
"commit_info": [{
"id": "",
"time": "",
"purpose": "fix | feat | refactor | doc | style | test"
}],
"modules_change": [{
modules_id: "",
module_name: "modules1",
files_change: 2,
insertions: 4,
deletions: 4,
testCoverage: 0.9,
testPass: 0.8,
testFail: 0.2,
TotalBugs: 14,
lastIterationBugs: 3,
suspendedRatio: 0.1,
reopenRatio: 0.1,
missRatio: 0.01,
highPriorityBugs: 5,
highSeverityBugs: 3,
affectingModulesBugs: 12,
affectingVersionBugs: 3,
affectingClientBugs: 7,
bugs_info: [{
bug_id: "[MBLOCK-00001]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
},
{
bug_id: "[MBLOCK-00002]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
},
{ ...
},
{
bug_id: "[MBLOCK-N]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
}
]
},
{
modules_id: "",
module_name: "modules1",
files_change: 2,
insertions: 4,
deletions: 4,
testCoverage: 0.9,
testPass: 0.8,
testFail: 0.2,
TotalBugs: 14,
lastIterationBugs: 3,
suspendedRatio: 0.1,
reopenRatio: 0.1,
missRatio: 0.01,
highPriorityBugs: 5,
highSeverityBugs: 3,
affectingModulesBugs: 12,
affectingVersionBugs: 3,
affectingClientBugs: 7,
bugs_info: [{
bug_id: "[MBLOCK-00001]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
},
{
bug_id: "[MBLOCK-00002]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
},
{ ...
},
{
bug_id: "[MBLOCK-N]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
}
]
},
{
...
},
{
modules_id: "",
module_name: "modules1",
files_change: 2,
insertions: 4,
deletions: 4,
testCoverage: 0.9,
testPass: 0.8,
testFail: 0.2,
TotalBugs: 14,
lastIterationBugs: 3,
suspendedRatio: 0.1,
reopenRatio: 0.1,
missRatio: 0.01,
highPriorityBugs: 5,
highSeverityBugs: 3,
affectingModulesBugs: 12,
affectingVersionBugs: 3,
affectingClientBugs: 7,
bugs_info: [{
bug_id: "[MBLOCK-00001]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
},
{
bug_id: "[MBLOCK-00002]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
},
{ ...
},
{
bug_id: "[MBLOCK-N]",
modules: ["modules1", "modules2", ..."modulesN"],
versions: ["v1", "v2", ..., "vN"],
priority: "3 | 2 | 1",
severity: "5 | 4 | 3 | 2 | 1",
reopen: 3,
missable: 1,
suspendable: 1
}
]
}
]
}
ps:其他优化 szz 算法
AG-szz,避免空行、注释、代码风格的对引入缺陷的误标记
MA-szz,避免分支创建、合并、修改文件属性等的(元变更)对引入缺陷的误标记
RA-szz,(不实用)避免代码重构的对引入缺陷的误标记
补充步骤:
1.查找 commit massage 数据中 fix bug 的记录,定位到具体的源文件
2.对上一步找到的源文件,通过 diff 算法,查找修复 bug 进行的代码变更,定位到产生 bug 的代码行(标记为‘-’号的代码行)
3.对上一步找到的产生 bug 的代码行,通过 annotate 命令,查找该 bug 的代码变更(提交)历史,定位到最早引入该 bug 的代码变更(标记为‘+’号的代码行)
4.以上一步找到的 bug 引入变更为基准,清除所有提交 bug 之后产生的代码变更(噪音消除)
特征提取:
模型构建:
依赖机器学习构建预测模型,当产生新的代码变更记录时,预测出现 bug 的可能性
具体方法:
gitlog 筛出所有代码关联的模块,1-N 关系,1 次提交对应多个模块
1个完整的提测周期内:代码提交->对应模块的相关度->是否产生 bug
输入:
输出:
迭代提测周期内,代码提交时,涉及的模块产生 bug 的概率
迭代提测周期内,代码提交时,产生 bug 的概率
step
源代码、缺陷报告、测试报告、代码审查报告、代码静态扫描
影响模块产生 bug 概率的特征(代码改动特征):
改动大小(添加、修改、删除行数)
改动范围(发生变动的源文件、目录数量)
改动历史(发生改动的源文件历史上的修改情况)
开发信息(提交代码、产生bug的记录)
代码评审信息(comments数量、reviewer记录)
变更增加减少行数
修改文件数量
变更类型
开发者
开发者经验
提交时间
变更日志
修改文件
模块的历史bug数量
模块的历史严重级别bug数量
迭代需求故事数量
技术挑战数量
迭代天数
人力数量
源文件变更时
源文件方法数量
源文件总行数
源文件圈复杂度
源文件包(方法)引用数量
改动的源文件数量
改动的(增加、减少)行数
改动前源文件大小
源文件历史改动次数
修复 bug 为目的的提交次数
实现新需求为目的的提交次数
重构为目的的提交次数
增加注释为目的的提交次数
Jira 历史数据
模块历史 bug 数量
模块历史严重级别较高的(致命/严重/一般)bug 数量
模块历史优先级较高的(最高/高/一般)bug 数量
模块上一迭代 bug 数量
模块上一迭代严重级别较高的(致命/严重/一般)bug 数量
模块上一迭代优先级较高的(最高/高/一般)bug 数量
模块发现阶段为用户反馈的 bug 数量
模块影响版本较多(>=1/2/3...)的 bug 数量
模块影响客户端较多(>=1/2/3...)的 bug 数量
模块影响其他模块较多(>=1/2/3...)的 bug 数量
模块遗留(挂起)bug 的数量
模块创建时间较近的(上一迭代)、挂起的 bug 数量
模块遗留严重级别较高的(致命/严重/一般)bug 数量
模块遗留严重级别较低的(提示/建议)bug 数量
模块遗留优先级较高的(最高/高/一般)bug 数量
模块遗留优先级较低的(低/最低)bug 数量
模块必现 bug 的数量
模块偶现 bug 的数量
模块测试步骤较多的(>=1/2/3...)bug 数量
模块挂起时间较长的(>1 个迭代周期)bug 数量
模块挂起时间较短的(<=1 个迭代周期)bug 数量
模块挂起时间较长的、严重级别较高的、优先级较高的 bug 数量
模块挂起时间较短的、严重级别较低的、优先级较低的 bug 数量
模块存在评论内容的 bug 数量
模块 reopen 次数较多的 bug 数量
产品需求信息
模块需求的历史修改次数
模块需求上一迭代是否修改
模块需求因为修复 bug 而修改的次数
模块需求修改内容为“文案”的次数
模块需求修改内容为“逻辑”的次数
模块需求修改影响其他需求(较多)的次数
代码审查信息
代码审查不通过的次数
代码审查通过的次数
代码审查的单次时长
代码审查的总时长
代码审查反复修正的次数
人为因素信息(同类比)
提交记录次数较多的开发者
职级较高的开发者
名下 bug 较多的开发者
名下挂起的 bug 较多的开发者
名下挂起的、严重级别较高 bug 较多的开发者
名下 bug 平均解决耗时较高的开发者
Commit Log 规范
type 用于说明 commit 的类别,只允许使用下面 8 个标识
br: 此项特别针对 bug 号,用于向测试反馈 bug 列表的 bug 修改情况
feat:新功能(feature)
fix:修补 bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动