分类 工作 下的文章

CTO 要我把这份 MySQL 规范贴在工位上!

因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成下边的文本。

规范在整个后端执行也有大半年的时间,对于整个团队在开发阶段就减少不恰当的建表语句、错误 SQL、错误的索引有积极的意义,故分享出来给大家参考。

下边分为建表规约、SQL 规约、索引规约三个部分,每部分的每一条都有强制、建议两个级别,大家在参考时,根据自己公司的情况来权衡。


建表规约

【强制】: ① 存储引擎必须使用 InnoDB

解读: InnoDB 支持事物、行级锁、并发性能更好,CPU 及内存缓存页优化使得资源利用率更高。

【强制】:②每张表必须设置一个主键 ID,且这个主键 ID 使用自增主键(在满足需要的情况下尽量短),除非在分库分表环境下

解读: 由于 InnoDB 组织数据的方式决定了需要有一个主键,而且若是这个主键 ID 是单调递增的可以有效提高插入的性能,避免过多的页分裂、减少表碎片提高空间的使用率。

而在分库分表环境下,则需要统一来分配各个表中的主键值,从而避免整个逻辑表中主键重复。

【强制】:③必须使用 utf8mb4 字符集

解读: 在 MySQL 中的 UTF-8 并非“真正的 UTF-8”,而 utf8mb4”才是真正的“UTF-8”。

【强制】:④数据库表、表字段必须加入中文注释

解读: 大家都别懒。

【强制】:⑤库名、表名、字段名均小写,下划线风格,不超过 32 个字符,必须见名知意,禁止拼音英文混用

解读:约定。

【强制】:⑥单表列数目必须小于 30,若超过则应该考虑将表拆分

解读: 单表列数太多使得 MySQL 服务器处理 InnoDB 返回数据之间的映射成本太高。

【强制】:⑦禁止使用外键,如果有外键完整性约束,需要应用程序控制

解读: 外键会导致表与表之间耦合,UPDATE 与 DELETE 操作都会涉及相关联的表,十分影响 SQL 的性能,甚至会造成死锁。

【强制】:⑧必须把字段定义为 NOT NULL 并且提供默认值

解读:

NULL 的列使索引/索引统计/值比较都更加复杂,对 MySQL 来说更难优化。
NULL 这种类型 MySQL 内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多。
NULL 值需要更多的存储空,无论是表还是索引中每行中的 NULL 的列都需要额外的空间来标识。

【强制】:⑨禁用保留字,如 DESC、RANGE、MARCH 等

解读: 请参考 MySQL 官方保留字。

【强制】:⑩如果存储的字符串长度几乎相等,使用 CHAR 定长字符串类型

解读:能够减少空间碎片,节省存储空间。

【建议】: ? 在一些场景下,考虑使用 TIMESTAMP 代替 DATETIME

解读:

这两种类型的都能表达"yyyy-MM-dd HH:mm:ss"格式的时间,TIMESTAMP 只需要占用 4 个字节的长度,可以存储的范围为(1970-2038)年,在各个时区,所展示的时间是不一样的。
而 DATETIME 类型占用 8 个字节,对时区不敏感,可以存储的范围为(1001-9999)年。

【建议】:?当心自动生成的 Schema,建议所有的 Schema 手动编写

解读: 对于一些数据库客户端不要太过信任。


SQL 规约

【建议】:①为了充分利用缓存,不允许使用自定义函数、存储函数、用户变量

解读:如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果都不会被缓存。

比如函数 NOW() 或者 CURRENT_DATE() 会因为不同的查询时间,返回不同的查询结果。

【强制】:②在查询中指定所需的列,而不是直接使用“ *”返回所有的列

解读:

读取不需要的列会增加 CPU、IO、NET 消耗。
不能有效的利用覆盖索引。

【强制】:③不允许使用属性隐式转换

解读: 假设我们在手机号列上添加了索引,然后执行下面的 SQL 会发生什么?

explain SELECT user_name FROM parent WHERE phone=13812345678;很明显就是索引不生效,会全表扫描。

【建议】:④在 WHERE 条件的属性上使用函数或者表达式

解读: MySQL 无法自动解析这种表达式,无法使用到索引。

【强制】: ⑤禁止使用外键与级联,一切外键概念必须在应用层解决

解读: 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

【建议】:⑥应尽量避免在 WHERE 子句中使用 or 作为连接条件

解读: 根据情况可以选择使用 UNION ALL 来代替 OR。

【强制】:⑦不允许使用 % 开头的模糊查询

解读: 根据索引的最左前缀原理,%开头的模糊查询无法使用索引,可以使用 ES 来做检索。

索引规约

【建议】:①避免在更新比较频繁、区分度不高的列上单独建立索引

解读: 区分度不高的列单独创建索引的优化效果很小,但是较为频繁的更新则会让索引的维护成本更高。

【强制】:②JOIN 的表不允许超过五个。需要 JOIN 的字段,数据类型必须绝对一致; 多表关联查询时,保证被关联的字段需要有索引

解读: 太多表的 JOIN 会让 MySQL 的优化器更难权衡出一个“最佳”的执行计划(可能性为表数量的阶乘),同时要注意关联字段的类型、长度、字符编码等等是否一致。

【强制】:③在一个联合索引中,若第一列索引区分度等于 1,那么则不需要建立联合索引

解读: 索引通过第一列就能够完全定位的数据,所以联合索引的后边部分是不需要的。

【强制】:④建立联合索引时,必须将区分度更高的字段放在左边

解读: 区分度更高的列放在左边,能够在一开始就有效的过滤掉无用数据。提高索引的效率,相应我们在 Mapper 中编写 SQL 的 WHERE 条件中有多个条件时,需要先看看当前表是否有现成的联合索引直接使用,注意各个条件的顺序尽量和索引的顺序一致。

【建议】:⑤利用覆盖索引来进行查询操作,避免回表

解读: 覆盖查询即是查询只需要通过索引即可拿到所需 DATA,而不再需要再次回表查询,所以效率相对很高。

我们在使用 EXPLAIN 的结果,extra 列会出现:"using index"。这里也要强调一下不要使用“SELECT * ”,否则几乎不可能使用到覆盖索引。

【建议】:⑥在较长 VARCHAR 字段,例如 VARCHAR(100) 上建立索引时,应指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可

解读: 索引的长度与区分度是一对矛盾体,一般对字符串类型数据,若长度为 20 的索引,区分度会高达 90% 以上,则可以考虑创建长度例为 20 的索引,而非全字段索引。

例如可以使用 SELECT COUNT(DISTINCT LEFT(lesson_code, 20))/COUNT(*) FROM lesson;来确定 lesson_code 字段字符长度为 20 时文本区分度。

【建议】:⑦如果有 ORDER BY 的场景,请注意利用索引的有序性

ORDER BY 最后的字段是联合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。

解读:

假设有查询条件为 WHERE a=? and b=? ORDER BY c;存在索引:a_b_c,则此时可以利用索引排序。
反例:在查询条件中包含了范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b;索引 a_b 无法排序。

【建议】:⑧在 Where 中索引的列不能某个表达式的一部分,也不能是函数的参数

解读: 即是某列上已经添加了索引,但是若此列成为表达式的一部分、或者是函数的参数,MySQL 无法将此列单独解析出来,索引也不会生效。

【建议】:⑨我们在 Where 条件中使用范围查询时,索引最多用于一个范围条件,超过一个则后边的不走索引

解读: MySQL 能够使用多个范围条件里边的最左边的第一个范围查询,但是后边的范围查询则无法使用。

【建议】:⑩在多个表进行外连接时,表之间的关联字段类型必须完全一致

解读: 当两个表进行 Join 时,字段类型若没有完全一致,则加索引也不会生效,这里的完全一致包括但不限于字段类型、字段长度、字符集、Collection 等等。

基于Thinkphp 系统合集 后续慢慢添加

FastAdmin 是一个基于ThinkPHP5和Bootstrap的极速后台开发框架。一键生成CRUD/一键生成菜单/一键生成API文档,完善的Auth权限控制管理,响应式布局和丰富的应用市场。

ThinkCMF5 一款基于ThinkPHP5和bootstrap3开发的中文内容管理框架。具有灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的需求以应用的形式进行扩展。

VueThink 是一套基于Vue全家桶(Vue2.x + Vue-router2.x + Vuex)+ Thinkphp5 的前后端分离框架。 脚手架构建也可以通过vue官方的 vue-cli 脚手架工具构建,不仅适用于管理后台或管理系统开发,且广泛适用于 B/S 架构的项目开发,已有许多的商业项目实践。

OneBase 是一个基于ThinkPHP5的免费开源,快速简单,面向对象的应用研发架构,是为了快速研发应用而诞生。遵循Apache2开源许可协议发布。

ApiAdmin 是一个面向API的后台管理系统,前后端完全分离,前端采用Vue构建,后端采用ThinkPHP v5.0.19,支持接口文档自动生成、接口输入参数自动检查、接口输出参数数据类型自动规整、灵活的参数规则设定、支持三方Api无缝融合、本地二次开发友好。

RhaPHP 是一个基于ThinkPHP5.1开发的微信平台管理系统,支持多公众号管理,小程序开发,APP接口开发、几乎集合微信功能,简洁、快速上手、快速开发微信各种各样应用。

EacooPHP 是基于ThinkPHP5开发的一套轻量级WEB产品开发框架,追求高效,简单,灵活。 具有灵活的应用和插件机制,模块式开发,大大降低开发成本。

VaeThink 基于 Thinkphp 和 Layui 的轻量级php内容管理框架。对一般项目所必需的功能进行了基础开发和封装,帮助开发者在开始一个新的PHP项目时能够快速完成基础功能的搭建。vaeThink保留了ThinkPHP和Layui的所有特征,对于熟悉TP5和Layui的开发者尤为方便。

OpenCenter 是一款开源的用户及后台管理系统,具有开发速度快,开发成本低的优势。遵循Apache2开源协议,允许开发者二次开发之后以全新的产品形式再分发。最新3.0版本基于ThinkPHP5.1和LayUI进行了重构。

HisiPHP ★★★ 基于ThinkPHP +Layui 开发的一套开源后台管理框架,默认集成了权限管理、模块管理、插件管理、钩子管理、数据库管理、富文本编辑器(已集成ueditor,kindeditor,ckeditor,umeditor)后台多主题切换,框架布局等常用功能,以方便开发者快速构建自己的应用(已经支持ThinkPHP5.1)。

WeiPHP5.0 是基于ThinkPHP5.1开发的一个开源,高效,简洁的移动应用系统,它实现一个后台同时管理和运营多个客户端(公众号,微信小程序,后续将支持支付宝小程序,百度小程序等)。一套环境,同时解决公众号和小程序。

DophinPHP(海豚PHP)是一个基于ThinkPHP5.0.23开发的一套开源PHP快速开发框架,秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种灵活快速构建工具,可方便快速扩展的模块、插件、钩子、数据包。统一了模块、插件、钩子、数据包之间的版本和依赖关系,进一步降低了代码和数据的冗余,以方便开发者快速构建自己的应用。

Vue-Admin 基于Vue-cli3.0 + Element UI + ThinkPHP5.1 + RBAC权限 + 响应式的后台管理系统。

https://www.itjiale.com/article-131.html

★ ☆ ? ? ? ? ? ? ? ?

一页纸手把手教你怎么做敏捷项目管理

文章来源于聂子云 ,作者聂子


敏捷项目是为应对变化和不确定性而生,作为项目的管理者(PM或者承担项目管理职责的人),在管理的过程中,需要明确项目的目标,带领团队,选择合适的实践,管理干系人的期望,协调和客户的关系,最终以专业的方式交付客户满意的结果。
简单来讲,需要关注四个维度的工作内容,也称为项目管理的 4P 领域。
1.png
People(人):包括客户、团队和自己,工作目标是灵活的调整和切换自己的角色,来协调这三者的关系,发挥1+1+1>3 的作用;
Purpose(目的):项目管理的目标是什么,以什么目的为出发点去进行项目管理;
Practice(实践):选择哪些合适的实践活动来帮助完成上述目标;
Professionalism(专业):做好干系人管理,专业的完成项目交付。

01 People (人) 的管理领域

包括客户、团队和自己,项目经理在这个领域需要灵活的调整和切换自己的角色,通过协调这三者的关系,带领所有人完成项目目标,这个领域的工作内容,可以通过面向团队/个体,是推的方式还是拉的方式将PM的角色分为四种:
2.png
第一个角色是Leader(带头人,领导者),作为Leader,PM 需要拉着团队一起做计划,完成项目交付目标,影响客户,过程中识别、控制并管理交付风险,管理客户关系和客户期望,加强团队的凝聚力,激励团队发挥高效能。
第二个角色是Facilitator(引导者,促进者),作为Facilitator,PM需要组织会议,跟踪行动,推动团队完成会议的行动事项,需要引导讨论,保证讨论和沟通的效率和良性产出,还需要推动并激励团队分享,在团队内部营造一种学习成长的氛围。
第三个角色是Supervisor(指导和督导者),作为Supervisor,PM需要对个体的行为进行监督和指导,提供反馈,帮助个体提升和成长;需要建立机制强化每个个体的正向行为,总结经验反思教训;还需要和相关的角色(比如TL,BA,QA)合作对流程、质量、目标进行管控。
第四个角色是Mentor(导师),作为Mentor,对团队成员要有细致的观察和了解,激励和培养团队成员;帮助团队成员突破局限获得成长;也要认识到个体差异性,基于差异分配任务设置挑战,指导并提供支持。

02 Purpose (目的) 的管理领域

在这个工作领域,PM 需要分析实施当下项目的目标是什么,不是所有的项目都是为了满足同样的目标,也就是说,项目管理是特定目标导向的。
3.png
内环是项目管理要考虑的一些约束,实际项目管理中,PM需要基于现实场景对这些约束下的目标做优先级排序,外环是实施项目可能会带来的整体价值,有时项目真正的价值是外环中的某个目标。
比如,领域经验,有时候我们会遇到一些未涉足领域的项目,这个领域可能是业务长期发展所要拓展的领域,那么组织有可能为了取得这个领域的经验而放低财务目标和成本控制,而投资这样一个项目;
又比如,有时候我们遇到的项目可能会提供很好的机会来培养团队的能力,那我们可能会在团队成长和按时交付上面找到一个平衡点。
总之,上述都是项目管理的目标,PM要做的是对这些目标做优先级排序。

03 Practice (实践) 的管理领域

这个领域有成熟的实践可借用,PM 需要做的是根据项目的实际情况选择合适的实践活动。
4.png
推荐每个PM 都了解一下Scrum 项目管理的 3355 核心要点。

3个核心角色

Scrum Master(敏捷教练):对应敏捷团队的PM(项目经理),职责是促进团队的工作,帮助团队熟悉与掌握 敏捷的价值观与框架,帮助团队排除影响生产力的障碍,保护团队不受打扰。
Product Owner(产品负责人):对应敏捷团队的BA(需求分析师),职责是定义需求,定义需求的优先级,定义需求的验收标准,定义产品发布内容与日期。

Scrum Team(敏捷团队):通常来讲是敏捷的全功能团队,对交付负责,协作开发,可能跨职能部门,自组织式的扁平化团队。

3个工件

产品待办事项 (Product Backlog):即产品视角的需求清单,由 Product Owner 负责维护,包括增删及优先级,用户故事是其中一种最佳实践,每项需求都需要描述其外部价值。
迭代待办事项 (Sprint/Iteration Backlog):即此次迭代周期内规划要完成的内容,由团队评估和选择产品待办事项中中哪些放入迭代待办事项,团队需要一起定义“完成”的标准。
迭代产出成果(也叫迭代可交付产品增量 ,Increment):即迭代结束后可对外发布的产品功能增量部分,需要关注其是可工作的软件功能增量,需要在成果展示会议(showcase) 上进行演示。

5个关键事件

迭代 (Sprint/Iteration):1-4周,固定周期,固定时间开始,固定时间结束。
迭代规划会 (Sprint/Iteration Planning Meeting):核心议题是下一个迭代要实现的目标和范围,对产品待办事项中的事项进行估算,以作为是否放入下个迭代的参考,输入是产品待办事项 ,输出是迭代待办事项。
每日站会 (Daily Standup):站会的目标是促进信息在团队内共享与透明,回答3个问题:本次会议之前,我做了哪些事情?本次会议之后,我准备做什么事情?目前我是否碰到障碍,是否需要帮助?
成果展示会议 (Review/Showcase):在迭代结束开,展示本迭代的产出,团队全体参与,邀请相关干系人参与提供反馈。
回顾会 ( Retrospective):团队一起复盘本迭代的过程,总结经验与教训,并形成切实可行的改进清单。

5大价值观

承诺 Commitment - 愿意对目标做出承诺;

专注 Focus – 全身心都用到承诺的工作上去;

开放 Openness – 团队内所有信息对所有人开放;

尊重 Respect – 每个人都有他独特的价值和经验;

勇气 Courage – 勇于承诺,履行承诺,敢于说不。

04 Professionalism(专业) 的管理领域

这个领域主要指的是如何通过管理干系人,为客户提供专业的服务。
首先,需要做的是对干系人进行分类,干系人分类的方法有很多,下面介绍的这种是基于干系人的权利和对项目的赞同程度来分的:
5.png
针对每一类型的干系人,进行区别管理:

  1. 对于位高权重且立场坚定的干系人,需要做的是建立同盟,邀请决策;
  2. 对于位高权重但容易动摇的干系人,需要做的是管理争议,帮助其坚定信心;
  3. 对于权利较低,左右摇摆的干系人,需要做的频繁沟通,尽量争取;
  4. 对于权利较低,死心塌地的干系人,需要做的是并肩作战,打听情报。

其次,需要在深度了解客户的基础上,通过自己的专业经验和服务态度引领客户做出最优的决策,并且帮助客户落地解决问题。
深度了解客户是提供专业服务的第一步,PM 需要带领团队了解客户业务、行业信息、竞争对手信息等等,切实站在客户的角度思考客户的痛点和诉求。
引领客户是在对客户业务了解的基础上,结合我们的能力和所能提供的服务,在客户的诉求和我们的服务之间建立联系,影响并带领客户去思考解决问题的思路和方向,优化决策的过程和结果。
践行我们的方案,帮助客户落地解决问题,也就是项目实施的过程,利用我们的最佳实践和能力,帮助客户把想法变成结果,做到价值交付。

总结

敏捷项目管理既是一门科学,又是一门艺术,它有规范严谨的理论体系,也有广阔的空间和自由度由管理者基于经验来发挥。真正做好敏捷项目管理,需要管理者在以上维度的基础上做更多深入的思考和总结,希望通过这个简单的总结,和大家共同探讨,一起在这条道路上精进。

腾讯内部论坛热文:如何做一个小型公司的技术总监

本文在腾讯内部论坛被浏览达7347次,收藏615次,评论几百条,曾经是讨论最热烈的项目管理文章之一。

作为作者本身,感觉这个话题可以讨论的范围非常大,希望能有更多朋友一起切磋探索技术团队的管理之道。

资深程序员是团队中最强大的生产力,但往往被不合理的工作安排浪费掉。

因此作为一个团队的技术的“头”,必须要有明确清晰的认识,把主要的事务性工作剥离出来。并且放弃大量的管理“权力”,以提高团队开发质量和效率为最主要的目标去安排自己的工作。

一般来说技术总监其实会被要求做事实上是2个职位的工作:主程、项目经理(技术化)。

因此必须明确此两个职位的工作任务分割。然后把项目经理的工作,安排给另外一个人做,当然其职称可能同样也得叫“技术总监”或“主程”,总之听起来越牛X越好。

而真正的主程(技术总监)则应该投身于尽量多的技术工作中。而最重要的工作则是开发——生产代码和文档。

主程的工作:

一、开发

从来没有一个资深的外科医生会放下手术刀,而转到手术室外面指手画脚。一个资深的程序员也不应该离开代码和文档的编写,而只是做做架构图。

作为对一个复杂系统的负责人,必须亲手领导和参与建造,才能有足够的能力去负担起这个责任。

因此需要至少使用60%的时间来参与开发的工作,并且建议从一开始上班就开始,虽然早上的效率很低,但是跟任何艰巨工作都一样:万事开头难。

在你好不容易等待电脑慢吞吞的打开了所有的IDE、需求文档、参考资料、工作计划这堆要命的东西之后,你就迈出了最重要的一步,你会发现你不在需要在网上看微博和聊QQ来提振开始工作的激情,而会被某一个优化代码的灵感而激励,或者被一个复杂而有趣的问题所吸引,从而更快的能投入到开发中。

坚持打开电脑做的第一件事是打开IDE软件,是这一切最重要的一步。

开发的工作内容包括有:

1、提出非功能性需求

一般来说功能需求总是让开发人员焦头烂额的主要原因。但是实际上很多项目死在发布之后,却是因为性能、产品质量、扩展性、二次开发效率等非功能性需求没认真去解决而导致的。

主程作为经验最丰富的成员,必须要利用自己曾经的经验和教训(在这里教训往往比经验重要),提出那些自己折腾自己的“非功能性需求”,来保障整个项目在发布后不会轰然倒塌。

这是个吃力不讨好的工作,因为老板和客户往往只会抱怨技术人员在玩弄把戏,骗取更多的资源或者杞人忧天。如何说服这些家伙也许不是主程的工作,但是主程必须要以高度的责任心把问题放到台面上来。沟通的工作也许让项目经理去做会更好,他们有一整套如何威逼利诱老板和客户的戏法。

2、设计和修正软件架构

软件架构设计至关重要,而且工作繁重。不画图纸就敢开工的技术人员要么是天才要么是笨蛋。

对于团队来说,架构在分工合作、避免风险、提高质量等多个方面有无可替代的作用。架构要避免成为空洞的文档,最重要的一步是有人来掌控和实施。而主程主持设计和修正的架构,并且亲手实施,让团队中的腹诽之徒完全无法避开,否则代码将无法运行!

所谓设计和修正架构,并不意味所有的文档应该一个人写,而是指这个架构的每个环节,都是经过主程决策同意的。当然最好这些文档能尽量由他撰写,对于“菜鸟”团队来说,输出这种文档本身就意味着“权势”,有助于主程建立个人威信——这种看起来有点肮脏的“政治”东西,在避免团队内无止境的扯皮,以及稳定那些随时准备跳槽的成员来说,都是相当实用的。

3、难点代码(关键需求)的开发

主程必须写代码,写那些大家都认为风险大的代码。

有的系统对于性能要求很高,他就必须去完成容易出性能问题的部分,比如IO操作或者设计数据库索引。有些系统的需求非常飘忽,他就要去想办法完成框架代码或者脚本引擎,以便众多小弟可以跟着产品人员疲于奔命。这种工作内容会让主程不必完全的读过所有代码,而能牢牢的“掌握”代码,以免团队成员甩耙子的时候能充当备胎。因为融入团队的代码开发,也是一个让架构设计从日常工作中真正控制系统的工作。而且主程代码通常会被别人接触,能直接教育其他团队成员,同时也能建立——威信。

4、救火和杀虫

这个工作其实和代码开发是一致的,如果没有平日的开发,通常紧急问题的解决也是比较难处理的。但是这个也有一个调试技巧的要求,比如要求会使用各种诊断工具。这些工具一般的开发人员可能会比较少使用。找问题的过程本身也可以提高团队其他人的技术水平。

二、培训

培训的工作应该占用30%左右的工作时间。培训是稳定团队人员最重要的手段。也是提高团队开发效率最有效的手段。工具、过程、制度、奖惩,这些都代替不了程序员一行行的去写代码,最直接的方法是让他们做的更快更好,这些需要经验和知识的积累。

1、代码审查

关于代码审查,有太多的论述。但是代码审查还是一种“强迫”推行某种风格或者技巧的手段,这是最真实的“控制”系统的手段。也是推广知识和经验最直接的手段。

一个人写的代码通常应对的问题不会特别“广泛”,因此只要审查其中一部分代码,就能给大部分别的代码带来好处。

2、技术方案评审

什么事情应该写一个技术方案,然后进行评审,这是一个关键的问题。

一般认为开发时间在2周以上的单项工作应该先做个方案。往往技术方案是系统架构的完善和补充,或者是挑战。所以主程的参与是非常必要的。

但是要注意不需要去做的太琐碎,而是要提炼出“关键”的需求和“关键”的解决方案进行评审,而这些“关键”往往不是功能,而是质量上的需求,如这个系统的扩展性,是否能方便后续开发等等。

也有可能在这些会议上会发生争吵,但是决策人是主程的地位是不容动摇的。君子和而不同,每个程序员都可以拥有自己的看法,但是代码必须能按方案运行起来,主程必须经常申明这点。

3、学习与讲座

如果团队碰到问题,没有新的方法和技术去解决,是不会提高开发效率的。就好像你用牛来耕地,不管用什么管理方法,都不会赶上机械化的速度。

而主程承担着不断突破自己的技术上限,介绍和推动团队使用更新的技术来解决问题的责任。抱残守缺,思想僵化,最后会被团队成员所抛弃,而且也会让团队的效能落后于业界,最后直接影响产品的生死。

每年学一门新语言,这个说法可能有点激进,但是这也是作为程序员应该有的激情。

三、管理

管理等于权势?管理等于沟通?管理等于文山会海?多年专业训练出来的技术人员如何去做管理?

管理的目标是提高绩效,如果和这个目标无关,而只是和“管理者”这个头衔有关的事情,最好丢给别人去做,包括那个头衔。

管理主要手段是创新:想出新的方法去解决问题,而不是繁杂的事务性工作!——一个专业秘书能比主程做的好一百倍。

技术工作的创新,最主要还是在技术工作里面,而不是跳出来说:做这个,做那个。

管理的事情如果超过10%的工作时间,等于说你更像一个项目经理而非主程。

1、绩效评定

以专业的意见来衡量别人的工作,这个负担是无人能够承担的。这个工作往往是利益分配的一种手段。类似奖惩手段。这种管理方法已经不是新事物了。

但是实际上技术人员对于绩效往往持一定保留和暧昧的态度,因为这种事情难以很清晰的界定出来。需要判断而非量度,才是绩效的真正手段。

如果一定要打分,一共两项足够了:进度、质量,5分制即可。

更重要的事情是,告诉每个人主程的看法,告诉别人,怎样做才是更好。或者告诉团队,怎样做才更有利于我们成功(发财、上市、赢得老板和客户……)——把目标清晰告诉团队,发挥他们的主动性,是绩效评定最重要的目标。

2、需求评定

最让技术人员头疼的可能就是和客户谈判。这个事情实际上不应该让技术人员来伤心,有项目经理就可以了。

而需求评定更多的是可行性的讨论。主程如果参加每个需求评定,他要三头六臂也搞不定,正确的做法应该是具体开发的团队人员参加,而主程在开会前给与自己的意见,或者会后听取参与者的总结。——这是了解别人做什么事的一个重要手段,但无需陷入太深,因为还有代码评审和项目经理的帮忙。

3、跨部门沟通

实在没必要参加,能躲就躲,这是扯皮的天堂。让项目经理去吧,他们的专业技巧能让这些事情更加有效。只要回来后让项目经理告诉你发生了什么事情就可以了。

4、进度审核和任务分派

又是一个很有“权势”的工作,实际上团队成员的情况大家都知道,决定谁应该做什么事情并非需要很多时间去想的事情。所以大可以把方向性的意见告诉项目经理,让他去做。很多优秀的开发者玩EXCELPROJECT之类的水平还不如只有一年工作经验的秘书,别折腾自己了。

5、面试

如果真想帮忙,准备一份有区分度的笔试题目吧。不靠谱的人太多,老板可不是花钱请你和他们聊天的。让项目经理去聊,不用担心他们技术不强,再不够,也会比大多数面试者要牛X。他们搞不定的人,就是应该雇佣的家伙。毕业生招聘怎么办?只要看看他们课外活动是不是有搞些专业的事情就可以了,上进心比别的东西都重要,HR会比主程看的更准,相信我。

6、各种会议

饭无好饭,会无好会,超过6个人的会议应该坚决抵制。如果你有一个程序等着你去写,你一定无比痛恨这些会议,顺应你的内心吧!上帝保佑你。


最后说说项目经理的工作:

项目经理就像下水道的清洁工,所有那些主程不愿意去做的事情,他们都弯下腰去认真的把玩,实在是太伟大了。

既然如此,为何不让他们拥有更好一点的头衔呢?如果没有他们去处理这些工作,任何一个主程都会被逼疯掉,或者他们自己变成了项目经理,让团队损失了最强力的一台代码发动机。

一、进度

1、指定工作计划

2、进度检查和告警

3、工作总结和统计

二、资源

1、整合提供各种资源,如找DBA,IT,运维人员,硬件,SVN权限,测试环境,福利,周末的活动……

2、面试:人员是最重要的资源,不是吗?

3、资源谈判:往往是和老板谈判,让别人明白现在的真实情况。又一个吃力不讨好的差事,但是总需要人做。

三、沟通

1、需求评审:和需求方讨价还价,项目经理真是命苦啊……

2、组织会议或者用其他方式通知信息给所有人:小喇叭、大喇叭、全服广播、世界频道……

对于一个小型公司,职权,头衔,收益,往往会更加敏感。但是这些都不是让项目失败的理由。

一颗叫程序员的种子说:长大了我就是叫管理者的树。这个错误的观念只会让这个种子永远无法发芽。

软件开发是类似外科医生的行业,而不是血汗工厂,所以不需要手持皮鞭的经理,而需要仁心仁术的神医。

对php代码混淆的研究

混淆方法:
两个文件采用了4种混淆方法对代码进行混淆
1、局部变量追加乱码
对于局部变量,在经过转为无意义单字符后,在变量名后追加多个'\xEF\xBD\xBD'字符,并在其中混杂一些其他不可见字符(7E以后的),给人以乱码的感觉,单实际上并无影响。局部变量可以任意命名,只要能区分出来就行。
2、利用unicode加转义符显示字符串,采用八进制和十六进制两种方式进行显示,避免直观看到。
php可以使用如"\150\157\155\145\120\141\164\150"(八进制)或"\x73\x79\x73\x74\x65\x6d\x4c\x6f\x67"(十六进制)在文件中作为变量名。
3、利用php字符串可以用作函数名,将常用函数名隐藏, 使用了
$GLOBALS全局变量
define宏函数
base64_decode函数
以及自定义不可逆函数_kstr2()函数
4、使用字符串连接符号来连接被分割并转换的字符串
其中_kstr2()代码还原后的结果如下

   function _kstr2($str) {
        $len = strlen($str);
        $result = '';
        $baseChar = ord($str[0]) - 30;
        for ($i = 1; $i < $len; $i+= 2) {
            if ($i + 1 < $len) {
                $result.= chr(ord($str[$i + 1]) + $baseChar );
                $result.= chr(ord($str[$i]) + $baseChar );
            } else {
                $result.= chr(ord($str[$i]) + $baseChar );
            }
        }
        return $result;
    }

由这段代码可以看出,被加密的字符串的第一个字符是一个随机字符,因此,即使是同一个字符串,在加密后得到的结果也可能是不一样的,这样大大提高了混淆的混乱程度。但,这个函数放在被混淆的代码之中,为代码还原提供了便利。

/* * @Author: your name * @Date: 2016-09-06 00:00:00 * @LastEditTime: 2020-03-17 18:29:35 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \htdocs\usr\themes\default\footer.php */