关于pair coding

极限编程中,有一项实践是pair programming, 是说两个dev在一起programming,用一台机器,两个显示器,两套键盘鼠标。在agile中,人们对TDD 和 CI的质疑比较少,基本上还是赞同的。
但是对于pair programming, 却存在很多的质疑,到底pair programming是不是一个好的practice?pair programming到底有什么优势?有什么弊端?什么时候pair是适当的,什么时候又是不合适pair的。
agile推崇pair,据我所知,主要是因为pair可以share knowledge,可以帮助一个新进入项目的人或者一个缺乏某一方面知识的人很快的进入状态, 可以防止由于人员变动导致某一功能模块无人熟悉的情况。而且pair可以提高代码的质量,两个人总是比一个人的思路要广泛,发现问题的可能性也大得多。
但是pair programming 也有其无法避免的弊端。
pair programming 一般要求两个人中至少有一个具有pair经验, 要知道,一个人coding的时候可以只顾自己的思路,两个人的话,你不但要有自己的思路,还要思考别人的思路,这需要极大的耐心去兼顾别人的想法。
举一个简单的例子,当两个人fix bug的时候, 两个人很可能有不同的思路来探索bug产生的原因,而且这时候很难说谁对谁错,如果两个人都以自己为中心,尝试自己的想法,那就会发生抢鼠标的情况,这是最不愉快的。
和fix bug很相似,当做某些research的工作的时候,很可能N个思路都可以达到目标,而且讨论谁的思路正确也会无果而终。这时候就不适合pair programming。
现在回顾一下最好的pair 方式是什么呢? 一个人写测试,一个人写实现。不会有什么冲突,为了实现一个目标各有分工。另外就是对系统做较大的改动的时候需要share这个改动的信息,这时候可以pair。 但是只要是做类似research的工作的时候,就不适合pair,这时就需要独立思考。

做了pair不到1年,我感觉只要是research的工作,而且2个人都有不同的想法,这时候就可以不pair。
如果是做新的story,对系统有较大的改动,就需要pair。

pair之所以很难推广,是因为在开发的过程中,大部分的时间都是做research, 因为在动手之前,首先要知道相关的功能是如何运作的,所以就会反复的看代码。

另外,从绩效考核的方面说,如果到了一段时间就要考核dev的performance,而且考核结果和奖金挂钩,那就热闹了, pair的两个人肯定会抢着做story, 谁都不想让出主力的位置,要知道,一旦让出主力位置,你就有可能被拉开差距,对系统的熟悉程度也会降低。那最后你的绩效也会不好。如果两个人抢着干活,就很容易出现rush的情况,做出来的东西有可能是没有经过深思熟虑的。

有的dev能力可能很强,可能说:“我不会跟我的pair抢着coding...”,这可能是因为他的功力比较深,对类似的系统已经很熟悉。但是这样的人又有多少呢? pair要想很好的推广,就要考虑大部分dev的情况。

所以,pair的利弊和实施的时机就是上述我说的。以后要是哪一个人说:“诶? 你们怎么没有pair啊,这样不行啊!”。 那么我会说:“玩儿蛋去, 谁告诉你任何时候都需要pair啦”
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于 Dijkstra 算法实现武汉地铁站点最短路径搜索的 C++ 代码: ```cpp #include <iostream> #include <vector> #include <queue> #include <climits> using namespace std; const int MAXN = 100; // 最大站点数 const int INF = INT_MAX; // 无穷大 vector<pair<int, int>> adj[MAXN]; // 邻接表存图 int dist[MAXN]; // 距离数组 bool vis[MAXN]; // 访问标记数组 // Dijkstra 算法实现 void dijkstra(int s) { dist[s] = 0; // 初始距离为0 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq; pq.push(make_pair(dist[s], s)); while (!pq.empty()) { int u = pq.top().second; pq.pop(); if (vis[u]) continue; // 已经访问过了 vis[u] = true; for (pair<int, int> edge : adj[u]) { int v = edge.first; int w = edge.second; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; // 更新距离 pq.push(make_pair(dist[v], v)); } } } } int main() { int n, m; cin >> n >> m; // 输入站点数和边数 for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; // 输入边的起点、终点、权值 adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); // 无向图 } int s, t; cin >> s >> t; // 输入起点和终点 fill(dist, dist + n, INF); // 初始化距离数组 dijkstra(s); // Dijkstra 算法求最短路径 cout << dist[t] << endl; // 输出起点到终点的最短距离 return 0; } ``` 在代码中,我们使用邻接表存储图,并使用了 STL 中的优先队列来实现 Dijkstra 算法。同时,我们也注意到 Dijkstra 算法适用于边权值非负的图,因此在实现中需要对边权值的范围做出限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值