前端管理这两年

456 阅读15分钟

简言:

不知不觉做了两年的前端leader,在这个美好的下午时光,对自己做个总结,同时也分享一下, 由于在这个公司待了多年,大大小小的项目做过十几个了,交付质量还算是可以的。两年前组织结构的调整,我就担任了一个部门的前端leader,从一个单纯的技术转变到了管理,从刚开始的四人小队逐渐发展到十人的团队,两年下来有很多的感触。

为什么要做管理?

1.有些时候,可能并不是我们主动需要的,在公司当时的发展情况下,需要有人来做这个事,所以部分高开都是在这样的情况转成管理的

2.在当代发展的趋势下,很少有大龄程序员始终在一线进行开发的,一部分公司对大龄程序员不太友好,加班加不过年轻人,由于家庭的负担,大龄程序员的成本相对也是比较高的,对于公司来说,做一般难度的项目,大龄程序员的性价比是远不如年轻人。从个人角度来说,开发转管理是大部分普通程序员所需要走的路,也是一种趋势,不同的年龄做不同的事情,大龄程序员所有的优势,在于你的积累与经验,遇见问题的解决能力,这些东西在管理上能更好的发挥作用,举个简单的例子,在同样的时间,你很好的做完一个项目,只有一个项目的价值,如果你带领其它几个萌新,你辅助与指导他们,在同样的时间能完成更多的项目,创造出更多的价值,同样由于你的指导和监管,其它几个项目的质量也是挺好的,如果不好,就是你的责任了。遵从价值最大化的原则,程序员也是慢慢的需要转管理的

3.利益金字塔模型,大家应该都知道,一线开发应该是处于最底层的,那么获取的利益可想而知的,管理层获取到的信息和利益一般是比开发高的,获取更多的信息为了能够及时应对变化,利益这个就不说了,打工不都是为了这个么。

4.做到管理自由度相对高一点,稍微有些权利能够选择自己要做的事,在管理妥当的情况下,你有更多的时间来进行技术的精进和研究,来精进自己

5.当然原因有很多,剩下的这一条由你来补充

管理需要做什么?

我想把这部分拆解成两类,向上和向下

向上管理

我们需要将领导的目标进行拆解

  1. 我们团队要做什么?

  2. 我们要产出什么?

  3. 我们需要什么资源,需要什么支持?

  4. 我们需要投入什么?

  5. 我们要怎么做?

我们要将规划、目标、产出详细的蓝图与上级达成一致,与上级的目标一致(这个很重要)

每个阶段(周、月、季度)量化出来更有帮助

一个团队存在的根本是要创造出价值,价值就是你的资本。当然公司也有很多人认为,向上管理换一种说法就是跪舔上级,怎么说呢,这也算是一种辅助能力,人性就是这样,都是趋利避害的,喜欢听好听的话语,需要有,但不推荐纯走这种路线,在公司昌盛的时候,可能不会有什么问题,在公司遇到危机的时候,价值能力才是你能留下的护身符,当然两者能并向发展的人都已经是大佬了。

向下管理

当向下管理的时候,就需要转变你的角色,你是这个团队的灵魂,你的性格和决策都会对这个团队有多多少少的影响,要有担当和责任感,兵怂就一个,可以fire掉,将怂就完了。

1.作为一个团队的带头人,首先需要稳住人心,人心一致,做什么都好干事。稳不住就需要去找原因了,是成员的问题还是自己的问题

2.人心一致,需要考虑的就是协作、分工的问题了,一个团队的运转,需要协作,有协助那么就需要有分工,每个环节都是一个正向需要的过程,你所做的就需要保持这个正向链路每个环节都不会出问题,不能因为分工的问题导致协作更加困难,不能因为协作而导致团队的运作出了问题,不能因为团队运转问题导致整个团队的价值变低。

3.在往下我们要搭班子,组团队,组团队我们不能都要能力一样的人,比如招了一堆js能力很强悍的人,碰见了一个比较棘手的css问题,一堆人坐那干瞪眼了。要根据公司的业务发展,有能力梯度建设,这样碰见难关的时候,更有作战能力。有踏实干活的,有js能力强悍,css能力强悍,工程化和框架擅长的,活跃团队气氛的,还需要来弥补你能力不足的人,招不来就需要自己来学习了。能力梯度是团队必须要考虑的

4.一个人来到一个新公司,无非就是为了薪资和成长,当然还有一些是养老的,组建自己想要的团队,薪资是自己无法决策的,我所能做的就是成长,团队要有自己的规范和技术规划

5.两年来自己在这个公司也做了很多,代码规范方面采用了husky+commitlint+eslint+stylelint+prettier强校验,由于大家在合作开发一个项目时,会因为代码风格问题出现各种各样的merge冲突问题,风格需要约束统一一致,这个是基础,有团队必须要有规范

git commit提交规范

(git commit提交时已加上husky和commit规范,希望大家能遵守这个规则,不按照规则提交的,无法提交代码)

          1.commit 正常提交有两部分组成

                type(scope?): subject      // 本次提交代码修改的类型

                body?                             // 本次提交的内容

              示例 : git commit -m "feat: xxxx"

               git commit -m "feat: xxxx"  --no-verify  // 此指令是跳过检查的,不建议使用此操作(非特殊情况下不要使用)

               下面是类型的介绍

类型描述
build主要目的是修改项目构建系统(例如 glup,webpack,rollup 的配置等)的提交
ci主要目的是修改项目继续集成流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交
docs文档更新
feat新增功能
merge分支合并 Merge branch ? of ?
fixbug 修复
perf性能, 体验优化
refactor重构代码(既没有新增功能,也没有修复 bug)
style不影响程序逻辑的代码修改(修改空白字符,格式缩进,补全缺失的分号等,没有改变代码逻辑,css样式的更改)
test新增测试用例或是更新现有测试
revert回滚某个更早之前的提交
chore不属于以上类型的其它类型

前端编码规范-js

   前端eslint检验规则,使用以下规则

        1.  0或者off代表不检验,1 代表如果没有执行则报警告,2代表如果没有执行则报错,eslint报错,可以对应着这个进行修改

        2.  具体官网详情:eslint.bootcss.com/docs/rules/       eslint.vuejs.org/rules/comme…

        3.  如果出现某种情况下必须与lint规则冲突的话,或者lint报的错误较难修改,可使用   /* eslint-disable */,进行临时跳过检查,不建议较多使用破坏规则

  

    'no-unreachable': 2, //不能有无法执行的代码  

    eqeqeq: 2, // 不要求非要使用 === 和 !==     新项目2

    'no-empty-pattern': 2', // 禁止使用空解构 

    'space-in-parens': 2, // 强制在圆括号内使用一致的空格

    'no-unused-vars': [2, { vars: 'all', args: 'after-used' }], //不能有声明后未被使用的变量或参数

    'no-extra-semi': 2, //禁止多余的冒号 

    'no-dupe-args': 2, //禁止 function 定义中出现重名参数

    'no-dupe-keys': 2, // 禁止对象字面量中出现重复的 key

    'no-redeclare': 2, // 禁止多次声明同一变量

    'no-prototype-builtins': 'off', // 禁止多次声明同一变量

    'no-empty': 1, // 禁止出现空语句块

    'no-useless-escape': 'off',  // 禁用不必要的转义字符,先不开

    'space-before-function-paren': [2, { anonymous: 'never', named: 'never' }], // 函数名后面加空格

    'vue/no-unused-components': 2, // 没有使用的组件,报警告提示

    'vue/require-prop-types': 1, // 在props中需要类型定义

    'vue/require-default-prop': 1, // props中不需要默认值

    'vue/no-lone-template': 2, // 禁止不必要的template标签

    'vue/this-in-template': 2, // 禁止在模板中使用this

    'vue/no-unused-vars': 2, // 如果未使用v-for指令或范围属性,定义的属性没有使用报警告

    'vue/return-in-computed-property': 1, // 计算属性要存在return 返回值

    'vue/require-prop-type-constructor': 2, // prop属性的type为基本数据类型,不能为构造函数

    'vue/prop-name-casing':0, // 此规则强制在 vue 组件中正确地对 props 进行大小写(camelCase)本身应该开开

    'vue/attribute-hyphenation':0, // 此规则强制在 Vue 模板中的自定义组件上使用带连字符的属性名称。本身应该开开

    // 'space-before-function-paren': 1, // 定义函数时前面要空格

    'eol-last': 2, //文本是否已单一换行符结束

    'no-trailing-spaces': 1, // 禁用行尾空格

    'vue/script-indent': [2, 2, { baseIndent: 1 }],

    'vue/no-v-html':0,   // 因为项目中有用富文本编辑器,对这个指令不进行校验

    'vue/no-irregular-whitespace': [       2,       {

        skipStrings: true,

        skipComments: false,

        skipRegExps: false,

        skipTemplates: false,

        skipHTMLAttributeValues: false,

        skipHTMLTextContents: false

      }

    ],

    'vue/no-mutating-props': 2, // props的属性被修改,将报此问题 

    'vue/require-valid-default-prop': 2, //props声明的属性和默认值的类型不一样时,将报错执行

    'vue/no-dupe-v-else-if': 2, // 防止重复的判断条件,无用的代码

    'vue/require-v-for-key': 2, // v-for时写上key值,提高遍历效率

    'vue/valid-v-model': 2, // v-model时不要写运算

    'vue/valid-v-for': 2, // 对v-for的校验

    'vue/no-use-v-if-with-v-for': 1, // 防止在同一元素上同时使用v-for指令和v-if指令

    'vue/html-end-tags': 2, // 禁止缺少结束标签

    // 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',

    // 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',

    quotes: ['error', 'single'],  // 单引号

    'comma-dangle': 0,  // 根据项目自行添加

前端style书写规则-css

    前端启用stylelint规则,书写统一的样式

    具体详情可查看stylelint官网:stylelint.io/user-guide/…

         'no-descending-specificity': null,    // 禁止低优先级的选择器出现在高优先级的选择器之后  

         "block-no-empty": true,  //不允许空块

         "max-empty-lines": 1,  // 相邻选择器之间需要空一行

        "indentation": 2,  // 缩进为2

        "declaration-block-no-duplicate-properties": true, // 禁止在声明块内出现重复属性

        "unit-no-unknown": true,    //禁止未知单位

        "no-duplicate-selectors": true, // 不允许重复的选择器

        "font-family-no-missing-generic-family-keyword": null, // 禁止在字体族名称列表中缺少通用族

        "declaration-block-single-line-max-declarations": null, // 限制一个单行声明块中声明的数量

        "declaration-block-no-duplicate-properties": [ true, { // 不允许复制属性块中声明,不限制一些兼容的写法

          ignore: ["consecutive-duplicates-with-different-values"], 

         } ],

         "at-rule-no-unknown":[true,{

          "ignoreAtRules":["mixin"]

          }]

preitter可根据自己装的vscode进行配置,本地还可以安装上sonar-scanner插件在写代码的时候,进行自动扫描刚写过的代码,检查一些写的不规范或者写错的代码。

开发规范如果都加上 #### husky + commitlint + eslint + stylelint + prettier + sonnar-scanner,那么团队内写的代码这一块,就不需要太操心了。每次提交的代码都是很规范的,风格也都是统一的。

6.在对代码这一块放心了,需要对ui进行还原度进行自测,别的公司我可能不太了解,目前所在的公司对ui要求极高,经常被ui吊打,为了走出这个困境,借助谷歌这个插件 => Visual Inspector,来进行对自己画完的页面进行自我修改,这个插件的使用方法可以看插件介绍,在我写过的其它文章里也有介绍

7.一般写完这个之后,更加规范一点的我们需要加个单元测试,由于所在公司的业务比较繁忙,写单元测试也要费上很多时间,这一块就暂时省略了,但是为了保证业务这一块的质量,也是借助了另外一个谷歌的ui 自动化测试插件 => UI.Vision RPA 浏览器自动化工具(开源的 Selenium IDE, 现代的网页自动化工具 (支持行为录制和回放)。适用于网页自动化测试,表单填写以及网页内容抓取),来进行业务模块的自动化测试

8.在提测之前,再进行人工的code review,code review之前先对照着检查表先进行自我修改,自我修改之后,人工code review更多的是一个对代码以及上面规范执行的一个check。

下面是code review检查项

优先级事项内容
注释每个函数必须有注释说明用途,以及参数的类型
注释每个if判断必须有注释说明(包括v-if)
注释data里面的数据有注释说明
注释较复杂的逻辑(视情况而定)
注释正则加注释说明
命名不要使用汉语拼音
命名变量使用驼峰
命名函数名以及变量名语义化(四个单词以上,过长使用简写加上注释)
命名const和let做对应的事情,不要一直let,非必要情况下不用var
命名不使用关键字(比如:split)
逻辑props传值 required type default 齐全以及注释说明
逻辑监听完事件对应着移除,配套使用
逻辑取dom操作时,一定要进行做非空判断
逻辑对象取属性值或 json 转换时,一定要进行做非空判断
逻辑html中存在三个以上的逻辑判断写computed里
逻辑同页面两次以上相同逻辑的复用,写到一个公共的函数调用
逻辑公共方法函数代码,参数类型校验,健壮性是否良好
逻辑尽量避免多层嵌套if(有使用的注释说明)
逻辑内部静态方法命名规范使用_开头
逻辑z-index非必要情况下,不要超过10,10个层级大部分页面已够用
逻辑简单的if else逻辑用三元运算代替
逻辑使用async await对应着用try catch进行捕获
逻辑html模板中不要使用this
逻辑html 中较多的 if else 使用动态组件(视情况而定)
逻辑接口返回的数据尽量用解构赋值,看着比较清晰
样式不加scoped的情况下,一定要用单个组件中最大的类名进行包裹,避免样式覆盖
样式html标签中有class类名的,就不要再写style行内样式(需要用变量动态处理的除外)
样式style 尽量少的 !important,通配符(如果写,注释说明原因)
样式颜色六位相同的缩写成三位,0px的直接简写成0
样式style兼容性前缀非必要情况下不需要写,比如-webkit
风格单个方法不要超过50行或者一屏,不便于阅读,超过自行归类拆解
风格删除掉无用代码或者不执行的代码
测试经过sonar扫描, 接入 sentry 工具
注意禁止使用外链CDN

9.在上线前接入sentry,方便线上监控报错的收集,假如线上有问题出现,sentry能更好的帮你找到问题所在

10.以上就是我在前端leader期间,为团队所做的基础建设,从两个方面总结一下

代码方面:

husky + commitlint + eslint + stylelint + prettier + sonnar-scanner

质量保证方面:

code review + Visual Inspector + UI.Vision RPA + sentry

11.团队的基础建设做完,需要满足组员的成长,需要技术分享,这个事情不要老是leader自己去讲,只要有用的,完全是可以放给组员互相分享的,更能提高组员之间的参与感与团队的凝聚力。

相信自己的组员,有能力做好这个事情,每个人都是从不同行业因为有缘才能聚到一起的,没有说谁就一定技术强压谁一头,各自擅长的领域不同,不同前端(同一level下)之间都有其它人所需要学习的优点,来完善自我。

有一种学习法叫做费曼学习法,学习完一个知识,完全理解之后,给别人讲一遍学习效果是比较好的。

12.如果公司条件允许的话,可以做个技术规划能更好一些,作为一个前端leader,不能脱离业务,但也不要为业务所累。

当然,现在有很多的前端leader是纯管理或者是纯技术,没有对与错,所选择的道路不同,剑走边锋都会面临不同的烦恼,自己喜欢就好,个人认为两者相辅相成,综合发展会更好一些吧

总结

两年的前端leader时间,放弃了一些,收获了一些,从之前的关注个人,到现在关注整体的一个转变,多了一些责任感,有时能带给你一些在开发时体验不到的快乐,有时又不得不面对或者去做自己不喜欢做的事情,怎么说呢,喜忧各半,人总是要面对成长的。共勉!

欢迎各位小伙伴一起讨论,互相学习!