公司内部代码协作

2012-05-02 10:58

[project]

公司内部,团队间不可避免的有代码互相访问的事情发生。

普通方式

提供者提供头文件和库供调用者实施访问,这是比较常见的方式。当然库有可能是静态库,动态库。

静态库要求双方编译环境,运行环境一致,否则就得提供多种环境的库文件。动态库要求稍微弱一些而已。

很多人会把别人的头文件进行封装,美其名曰为了屏蔽变化,虽说封装开销微乎其微,但是我尤其讨厌这么做。 这种事情甚至会出现在一个团队内的两个人间,一般这两人可能是独立设计。这是缺乏信任、沟通的结果。

如果只提供二进制,看不到代码,又不是经济方面的原因,那么这种公司可以离开了。

如果出现数次使用邮件、聊天软件传文件等方式交流代码,也无力改变,这种公司也可以考虑离开。

远程调用

提供者可以只提供 IDL 文件。 取决于远程调用的使用、部署方式等。工程间的依赖、接口的变更这都是需要解决的问题。

也可以进一步提供封装过服务发现、调用方式、错误处理等后的库。问题就和__普通方式__一致了。

直接使用

要求大家的代码在一颗代码树下,代码间能互相调用,工程间能引用。

假想公司内有个独立的防止 Spam 的小组,业务部门 Blog 需要使用他们的代码。

#ifndef SPAM_CHECK_H__

namespace spam {

bool Check(const char* text);

}

该工程产生 libcheck.a

#include "spam/check.h"

void Post(...) {
  if (spam::Check(text))
    return false;

  // ...
}

调用方的工程文件需要声明

  'dependencies' : ['spam.gyp:check'],

gyp 为工程文件,最终生成 Makefile

Blog 编译时自动加入 -lcheck,一般静态链接发布。能如此做是有很多先决条件的:

  • 公司内一颗代码树,至少都拥有可读权限

  • 每个团队间的代码不能互相影响,需要每个团队都得采用分支开发,保证主线是稳定,可发布版本

  • 信息是开放的,每个团队的代码的变更其他团队应该能知道

  • 公司内部有统一的良好的沟通工具,如 IRC, 邮件列表等

还有其他规范,如

  • 统一的代码风格

  • 目录规则、namespace 规则、冲突解决等。

如果是远程调用,大致可以拆解为:服务发现、调用包装、错误处理等子项,每个子项也可以同理解决。

很多公司把代码的权限管理得相当不错,虽然我也能遵守,但是通常呢? >

有能力的人不太在乎那些个代码,没有能力的呢?通常可能都玩不转那些个代码
连Google都是内部开放代码,有什么理由制造层层障碍。这种公司也不值得留下。

限制创造力的规则。