1.确认bug:仔细查阅异常报告,确定是否是个bug,找出各种有用的信息(日志或控制台的输出)发现问题的症结,予以重现。再次检查是否与报告发生重复。如果发生重复,那看看曾经的相关人员是如何处理的。

2.匹配测试环境:需要把开发环境换成和测试出此bug的环境

3.满足重现bug的条件:测试出bug的操作、报错的页面位置、测试出bug的数据

4.修改Bugs:根据报错的原因和日志找出代码的问题,是业务方面还是技术方面,如果是业务方面则需要确保修改后的代码是符合需求的。

5.检查此次修复:使用重现bug的步骤下或者进行单元测试检查是否已经解决了此bug

6.提交测试:让测试人员进行测试确认,集成测试、回归测试,以确保此bug已被解决以及不会加入任何新的bug。

7.思考总结:如果一个bug需要耗费你很多时间,那么一定要好好弄清楚原因,bug的影响和严重程度?想想为什么会错?为什么要这样修复?这种类型的bug还会出现在哪里?得到什么样的经验教训?采用的方法、使用的工具是否还有可以改进的地方?等。

8.整理代码(可选):通过一步一步重构,让你的代码更具鲁棒性。

9.代码审查(可选):可以让团队成员都研读下他人的代码,有问题就提出来,以及分享自己遇到的代码问题以及解决的方法。

原文出处: JavaScript-总结常用代码书写规范

全局命名空间污染

总是将代码包裹在一个立即的函数表达式里面,形成一个独立的模块。

不推荐

var x = 10,
    y = 100;
console.log(window.x + ' ' + window.y);

推荐

;(function(window){
    'use strict';
    var x = 10,
        y = 100;
    console.log(window.x + ' ' + window.y);
}(window));

立即执行函数

立即执行函数 里面,如果有用到全局变量应该通过变量传递的方式,让 立即执行函数 的函数体在调用时,能以局部变量的形式调用,在一定程度上提升程序性能。 并且应该在 立即执行函数 的形参里加上undefined,在最后一个位置,这是因为ES3里undefined是可以读写的,如果在全局位置更改undefined的值,你的代码可能得不到逾期的结果。 另外推荐在 立即执行函数 开始跟结尾都添加上分号,避免在合并时因为别人的代码不规范而影响到我们自己的代码

不推荐

(function(){
    'use strict';
    var x = 10,
        y = 100,
        c,
        elem=$('body');
    console.log(window.x + ' ' + window.y);
    $(document).on('click',function(){

    });
    if(typeof c==='undefined'){
        //你的代码
    }
}());

推荐

;(function($,window,document,undefined){
    'use strict';
    var x = 10,
        y = 100,
        c,
        elem=$('body');
    console.log(window.x + ' ' + window.y);
    $(document).on('click',function(){

    });
    if(typeof c==='undefined'){
        //你的代码
    }
}(jQuery,window,document));

严格模式

ECMAScript 5 严格模式可在整个脚本或独个方法内被激活。它对应不同的 javascript 语境会做更加严格的错误检查。严格模式也确保了 javascript 代码更加的健壮,运行的也更加快速。

严格模式会阻止使用在未来很可能被引入的预留关键字。

你应该在你的脚本中启用严格模式,最好是在独立的 立即执行函数 中应用它。避免在你的脚本第一行使用它而导致你的所有脚本都启动了严格模式,这有可能会引发一些第三方类库的问题。

不推荐

'use strict';
(function(){

}());

推荐


(function(){
    'use strict';
}());

变量声明

对所有的变量声明,我们都应该指定var,如果没有指定var,在严格模式下会报错,并且同一个作用域内的变量应该尽量采用一个var去声明,多个变量用“,”隔开。

不推荐

function myFun(){
    x=5;
    y=10;
}

不完全推荐

function myFun(){
    var x=5;
    var y=10;
}

推荐

function myFun(){
    var x=5,
        y=10;
}

使用带类型判断的比较判断

总是使用 === 精确的比较操作符,避免在判断的过程中,由 JavaScript 的强制类型转换所造成的困扰。

如果你使用 === 操作符,那比较的双方必须是同一类型为前提的条件下才会有效。

不推荐

(function(w){
  'use strict';

  w.console.log('0' == 0); // true
  w.console.log('' == false); // true
  w.console.log('1' == true); // true
  w.console.log(null == undefined); // true

  var x = {
    valueOf: function() {
      return 'X';
    }
  };

  w.console.log(x == 'X');//true

}(window.console.log));

推荐

(function(w){
  'use strict';

  w.console.log('0' === 0); // false
  w.console.log('' === false); // false
  w.console.log('1' === true); // false
  w.console.log(null === undefined); // false

  var x = {
    valueOf: function() {
      return 'X';
    }
  };

  w.console.log(x === 'X');//false

}(window));

变量赋值时的逻辑操作

逻辑操作符 || 和 && 也可被用来返回布尔值。如果操作对象为非布尔对象,那每个表达式将会被自左向右地做真假判断。基于此操作,最终总有一个表达式被返回回来。这在变量赋值时,是可以用来简化你的代码的。

不推荐

if(!x) {
  if(!y) {
    x = 1;
  } else {
    x = y;
  }
}

推荐

x = x \|\| y \|\| 1;

分号

总是使用分号,因为隐式的代码嵌套会引发难以察觉的问题。当然我们更要从根本上来杜绝这些问题[1] 。以下几个示例展示了缺少分号的危害:

// 1.
MyClass.prototype.myMethod = function() {
  return 42;
}  //这里没有分号

(function() {

})();

 //2.
var x = {
  'i': 1,
  'j': 2
}  // 这里没有分号
//我知道这样的代码你可能永远不会写,但是还是举一个例子
[ffVersion, ieVersion][isIE]();

 // 3.
var THINGS_TO_EAT = [apples, oysters, sprayOnCheese]  // 这里没有分号

-1 == resultOfOperation() \|\| die();

错误结果

  1. JavaScript 错误 —— 首先返回 42 的那个 function 被第二个function 当中参数传入调用,接着数字 42 也被“调用”而导致出错。

  2. 八成你会得到 ‘no such property in undefined’ 的错误提示,因为在真实环境中的调用是这个样子:xffVersion, ieVersion().

  3. die 总是被调用。因为数组减 1 的结果是 NaN,它不等于任何东西(无论 resultOfOperation 是否返回 NaN)。所以最终的结果是 die() 执行完所获得值将赋给 THINGS_TO_EAT.

语句块内的函数声明

切勿在语句块内声明函数,在 ECMAScript 5 的严格模式下,这是不合法的。函数声明应该在作用域的顶层。但在语句块内可将函数申明转化为函数表达式赋值给变量。

不推荐

if (x) {
  function foo() {}
}

推荐

if (x) {
  var foo = function() {};
}

不要使用eval函数

eval() 不但混淆语境还很危险,总会有比这更好、更清晰、更安全的另一种方案来写你的代码,因此尽量不要使用 eval 函数。

数组和对象字面量

1.用数组和对象字面量来代替数组和对象构造器。数组构造器很容易让人在它的参数上犯错。

不推荐

//数组长度3
var a1 = new Array(x1, x2, x3);
//数组长度2
var a2 = new Array(x1, x2);

//如果x1是一个自然数,那么它的长度将为x1
//如果x1不是一个自然数,那么它的长度将为1
var a3 = new Array(x1);

var a4 = new Array();

正因如此,如果将代码传参从两个变为一个,那数组很有可能发生意料不到的长度变化。为避免此类怪异状况,请总是采用可读的数组字面量。

推荐

var a = [x1, x2, x3];
var a2 = [x1, x2];
var a3 = [x1];
var a4 = [];

2.对象构造器不会有类似的问题,但是为了可读性和统一性,我们应该使用对象字面量。

不推荐

var o = new Object();

var o2 = new Object();
o2.a = 0;
o2.b = 1;
o2.c = 2;
o2['strange key'] = 3;

推荐

var o = {};
var o2 = {
  a: 0,
  b: 1,
  c: 2,
  'strange key': 3
};

三元条件判断(if 的快捷方法)

用三元操作符分配或返回语句。在比较简单的情况下使用,避免在复杂的情况下使用。没人愿意用 10 行三元操作符把自己的脑子绕晕。

不推荐

if(x === 10) {
  return 'valid';
} else {
  return 'invalid';
}

推荐

return x === 10 ? 'valid' : 'invalid';

for循环

使用for循环过程中,数组的长度,使用一个变量来接收,这样有利于代码执行效率得到提高,而不是每走一次循环,都得重新计算数组长度

不推荐

for(var i=0;i<arr.length,i++){

}

推荐

for(var i=0,len=arr.length;i<len,i++){

}

重复的dom操作

重复的dom操作,使用一个变量来进行接收很有必要,而不是频繁的去操作dom树,这对性能与代码的整洁及易维护性带来不好的影响

不推荐

$('.myDiv').find('.span1').text('1');
$('.myDiv').find('.span2').text('2');
$('.myDiv').find('.span3').text('3');
$('.myDiv').find('.span4').text('4');

推荐

var mydiv=$('.myDiv');
mydiv.find('.span1').text('1');
mydiv.find('.span2').text('2');
mydiv.find('.span3').text('3');
mydiv.find('.span4').text('4');

在jquery .end()可使用的情况下应该优先使用.end()

推荐

$('.myDiv').find('.span1').text('1')
           .end().find('.span2').text('2');
           .end().find('.span3').text('3');
           .end().find('.span4').text('4');

注释规范

在描写注释时,推荐格式化且统一的注释风格,在写注释时尽量描述写代码时的思路,而不是代码做了什么。

不推荐

//获取订单
function getOrderByID(id){
    var order;
    //...
    return order;
}

方法的注释应该统一用块级注释

推荐

/**
 * 根据订单id获取订单详细数据
 * @param  {[number]} id [订单ID]
 * @return {[order]}    [订单详细信息]
 */
function getOrderByID(id){
    var order;
    //...
    return order;
}

“原则式谈判”既不温和也不强硬,但却刚柔相济,是根据事情本身的是非曲直寻求解决方案,而不是进行一场各执己见的讨价还价,必须让谈判结果基于某些公平的准则,而不是以某一方的意志为转移。原则谈判是在道理、原则上强硬,对人则采取温和的态度。

第一章 不要在立场上讨价还价

1.强调以双方关系为主的谈判往往会导致双方无法取得明智的协议

谈判的四个建议:

人:把人和事分开。谈判者应该肩并肩地工作,一起解决问题,而不是相互攻击

利益:着眼于利益,而不是立场。谈判中的立场经常掩盖你的实际利益需求。

选择:以共同利益和协调冲突创造选择方案。

标准:坚持使用客观标准。谈判要基于一个公平合理的依据、标准,比如市场价值、专家意见、管理、法律法规等。

原则谈判的过程分为分析、计划和协商三个阶段:

在分析阶段你只需要判断形势,收集整理和分析信息,你需要思考双方对问题的不同认识,对方对你的敌意程度以及双方交流的障碍,当然还有双方各自的利益。

计划阶段,要怎样处理人际关系问题,对方的利益中什么最重要,你的现实目标是什么

协商阶段,互相交换意见,消除意见的分歧,克制情绪的冲动,以及排除交流过程中的障碍,每一方都应该理解对方的利益所在,并根据客观标准寻求共识以解决利益冲突

制定谈判规则

1.把人和事分开;

2.着眼于利益,而不是立场;

3.为共同利益创造选择方案;

4.坚持使用客观标准

第二章 把人和事分开

人是有感情,有自己的价值观,有不同的背景和看问题的角度,所以建立良好长期的谈判是需要建立在信任、理解、尊敬和友谊的基础上,然后通过长时间合作的考验。

人们在谈判中坚持己见,往往不是因为谈判桌上建议本身不能接受,而只是不想表现得在对方面前败下阵来,如果改变下措辞,或者换一种形式,使谈判看上去也公平一些。

各种人际关系的问题都可以从三方面找到原因

1.双方对于事实的不同认知:所以需要站在对方的角度上换位思考。理解对方观点可能会改变你对形势的看法,但并不意味着对其表示赞同,也不必付出代价,而是所少冲突范围的手段,但注意不要以自己的担心去推测对方的意图。尽可能讨论各自对问题的认知:亮出各自的想法,进行讨论,当然需要双方都认真倾听。

2.承认并理解自己和对方的情绪:把情绪表现出来,并承认情绪是正常的。对付别人发脾气的手段就是静静听着,不对情绪的冲突做出回应,等待对方说完为止。在很多情况下,一声道歉就能有效化解敌对情绪,但并不意味你需要为某种行为负责。

3.交流需要被重视:认真聆听并理解对方的意思,必要的话,按照自己的理解加上态度积极,措辞明确,清楚表达来进行重复确认;说出你的想法,争取对方理解;话语中只谈自己,不说对方;有的放矢,在做出重要表态前,先弄清楚自己所要表达的意图或想得到的信息。

在构建谈判策略时,要把人际关系和实质问题分开,避免将个人意识牵扯到实质问题的讨论中,当然也要将对方当做有血有肉的人来对待,而不是就事论人。对谈判各方有效的策略是视彼此为合作者,一起去冷静寻找有利于双方的公平策略。

第三章:着眼于利益,而不是立场。

利益驱动人的行为,是立场争执背后的动机。你的立场就是你已做的决定,而利益是导致你做出这一决定的原因。立场有冲突利益,也有共同利益。共同利益和互补不同利益都可以成为达成明智协议的基础

如何确定利益

1.问为什么:分析对方采取的每一个立场,问自己对方为什么会这样做?

2.问为什么不:考虑对方的选择,同时和对方谈谈我希望他们做出什么样的决定,也要理解对方为什么没有那么做的原因。

最重要的利益时人的基本需求:安全感;经济利益;归属感;获得他人认同;能主宰自己的生活

与对方沟通才能增加实现双方利益的可能性:明确、形象、具体告诉对方怎么样做才符合你的利益,让对方准确了解你利益的重要性和合理性;先说对于问题的考虑,然后才得出结论或提出建议才能让对方倾听并理解你的解释。

人们在争吵的时候总是被动地对另一方的言行做出反应而不是主动为自己的长期利益作打算。

就事论事,但不要指责对方。不仅不要指责对方,还要对他们表示支持:洗耳恭听对方的意见,对他们彬彬有礼,感谢对方付出的时间和精力,强调你也考虑到他们的基本要求等。你要让对方知道,你对事不对人。

第四章:为共同利益创造选择方案

谈判者应该善于创造多种选择方案而不是只为了寻找唯一最佳答案。实际的谈判需要的似乎是切实可行的想法,而不是凭空想象。

将创造选择方案与评判决定方案二者分开,先只是思考,然后才通过集体讨论或者头脑风暴来选择。

寻找多种选择方案的方法

第一步:考虑某个具体问题

第二步:是进行描述性分析

第三步:从整体出发,考虑也许应该做什么

第四步:找出一些具体可行的行动建议。

改变所提出协议的范围和粒度,可以把问题分割成小而好操作的几部分,这样涉及的当事人也可以少些,减少冲突和增加可行性。

寻求共同利益

第一,共同利益往往潜藏在每项谈判中,寻求是否有机会合作以寻求共同利益,弄清楚如果谈判破裂,我们要承担什么损失。

第二,明确提出共同利益,并作为双方的共同目标。

第三,强调你们的共同利益可以使谈判变得愉快,顺利。

第四,寻求是否能融合双方的利益、考虑问题的主次、观念、以及对风险的态度等差异的方法,如果不清楚对方的利益下,可以提出几个对你来说都能接受的选择方案,问对方倾向于哪一个。你只需知道对方倾向什么,而不是接受什么。然后,你根据他们所倾向的方案再做进一步调整,再提出两种或更多修改方案,询问对方倾向于哪种选择。这样,无须任何人作出任何决定,你就可以完善一个方案,直到再也找不出任何共同利益为止。

给对方决策以方便

1、 站在对方的角度理解问题和解决方案

2、 做出什么决定,可以用起草协议的方法帮助自己理清思路

3、 要让对方明白,如果他们按照你的希望作决定,将会出现什么结果,又要站在他们的立场改进那些结果。

第五章 坚持使用客观标准

既然凭个人意愿调和利益冲突要付出如此高的代价,那么解决方案就是,独立于任何个人意愿--也就是根据客观标准来进行谈判。越是用公平原则、效率原则或科学标准解决具体问题,就越有可能最终达成明智而公平的一揽子协议。

运用客观标准进行谈判

1、 双方就每一个问题寻求客观标准;如果标准本身就是他们提出的,那么遵从这个标准不是软弱,而是有实力、说话算话的表现。

2、 以理服人,并乐于接受合理劝说以确定最合适的标准及其运用方式,如果你仍然不能接受对方提出的标准,则请第三方来建议你们用哪一种标准来解决问题

3、 绝不屈服于贿赂,威胁,强迫别人相信或是全然拒绝让步等压力情况下提出的标准,必须让对方摆出合理的理由。

第六章:如果对方实力更强大怎么办

保护自己:制定自己做出决定的底线;制定协议失败后的最佳替代方案;确定一个虽然不理想但却比最佳替代方案更好接受的协议;

最佳替代方案越理想,谈判实力就越强,所以需要制定你的最佳替代方案

第一,提出如果不能达成协议自己所要采取的措施

第二:完善其中最后希望的想法,并把它们转化成具体的替代方案

第三:初步选定看上去最好的替代方案。

考虑对方的最佳替代方案,如果你的最佳替代方案不如对方想象的那么好,向对方透露只会削弱而不是增强自己的实力;如果对方认为自己的最佳替代方案无可挑剔,因而不觉得有必要就事实进行谈判,你就要想办法改变他们的方案。如果两边的最佳替代方案都对自己有利,那么对双方来说,通过其他途径来满足自己的利益,而不要再企求达成协议。

如果要表明自己的最佳替代方案,你最好要做到尊重双方的关系,保证双方的交流渠道畅通,强调自己提出的最后条件是合理的,并表明它符合双方的利益等

第七章:如果对方不合作怎么办

当对方反驳你的观点、对你进行人身攻击时,不要回击,不要躲避,相反,要把对方的力量引导到探讨双方利益、制定共同受益的选择方案和寻求客观标准上来。

谈判柔术

1、不要攻击对方立场,而是把对方的立场看做一种可能的选择,寻找立场背后的利益,找到其遵循的原则,并考虑改进的方法

2、不要为自己的想法辩护,欢迎批评和建议,并主动询问对方这个观点有何不妥。

3、当对方进行人身攻击时,倾听对方的诉说,表现出你愿意尊重他们的意见。等他们诉说完后,将对方的注意力从对自己的攻击转移到对问题的批评上来。

4、沉默是你最好的武器,要充分利用它。如果对方提出不合理方案或是采取在你看来站不住脚的攻击,最好的手段是带有疑惑表情并一言不发。有时候,最有效的谈判是在你没有开口时发生的。

第八章:如果对方使用卑鄙手段怎么办

1.验证对方凿凿有据的陈词可以遏制其欲行欺骗的动机,降低你上当受骗的风险。

2.清楚对方在谈判中的权力,只和真正管事的人谈判,或是表明你这一方保留重新考虑任何提议的同等自由。

3.如果怀疑对方有不遵守协议的意图,你可以把遵守协议本身作为协议的一部分。

4.如果发现周围环境对你不利,要立即指出来。

5.认清对方的人身攻击可以使其失效。如果将其挑明,可以阻止对方再次使用类似的伎俩。

6.站在自己的利益考虑而不是别人

7.说明对方行为的后果不是基于你意愿的后果,也不要提及因你施加影响所产生的后果

8.让对方用原则来解释其立场,看是否有充分的理由,直到连他们自己也觉得荒谬为止。

9.注意谈判中对方是否提出了更多的要求,考虑是否继续进行谈判或者基于什么原则继续双方的谈判

10.指出对方的拖延战术并与之谈判外,还要考虑不给对方以机会。

集体讨论的技巧

  • 集体讨论之前:

A、 明确你的目的,要带着什么样的结果走出会议室。

B、 寻找几个参与者,5-8人为宜

C、 改变环境,尽可能不同于平常的讨论

D、 创造一种非正式氛围,让大家放松

E、 选择一个主持人,保证不跑题,保证每个人都有发言的机会,遵守一定的原则,并且通过发问激发大家讨论。

  • 在集体讨论会上:

A、 让参会人员并排坐在一起,面对面容易从自己角度出发容易其争执;

B、 明确基本原则:包括不批评原则,鼓励疯狂的想法,包括哪些看似完全不可能的想法,另外的原则可能还有:整个讨论不做针对记录,不对号入座。

C、 集思广益,各抒己见。

D、 记下所有想法,一目了然,把所有想法都记在黑板上,大家都可以看到。

  • 在集体讨论之后:

A、 把最有可能的想法标出来;

B、 改进有希望的方案。完善并付诸实施。

C、 确定一个时间来评估这些想法,并作出决定。

  • 考虑与对方展开集体讨论:

产生的想法会充分考虑参与各方的利益,创造合作解决问题的氛围,并能让各方了解对方的关注点。