手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:mac

转:结对编程的误区

结对编程在我们现在的工作中真的没有使用这玩意。极限编程也没有用到,我们还是安稳的在一步一步的开发。。。但不代表我们没有尝试过。
其实,在07年的时候,那时候和一哥们就尝试过结对,效率确实上升了不少,但后来仔细想想,正由于两个人水平相近,这样的结对却没有真正带来了效率上升,反而还不如两个人单独开发,事后合并代码。虽然有一些BUG,但总体代码却多写了很多。再过了一段时间,也是和一朋友结对,但效率更低,因为两个人的水平不一致,水平高的受不了水平低的一些低级错误,水平低的却看不明白水平高的在做什么。痛苦。。。后来就放弃了这种想法。
以下是原文:http://www.cnbeta.com/articles/174866.htm
在过去的几年里,我有过许多结对编程的经历。有时在我的团队里进行,有时在客户那里,有时在coding dojo(一种编程模式,几个程序员一起合作完成一个任务),有时在我的开源项目里。对于那些知道如何结对编程的程序员来说,这种模式很棒,很高效。
但是你不能指望在两个程序员面前摆台电脑,就指望他们一开始就做得很棒。结对编程需要学习,程序员需要知道实施者(敲键盘的人)和领航员之间的区别。下面来看看些细节。

在结对编程中,我遇到了一些误区,列在下面。
一、领航员误区
1. 发号施令者
喜欢发号施令的人总是对敲键盘的人说:“到末行,加个反括号,然后…”。他不去关注解决方法和下一步该怎么做,而过度关注一些编程细节。
事实上,他希望他自己来掌控键盘。所以当你碰到一个喜欢发号施令的人,那么将键盘交给他吧,转换领航员的角色。
2. 拼写纠错者
拼写纠错者坐在你旁边,纠正你输入的每个错误字符。当然,他没有时间来真正的进行导航。
和纠错者商量一下,当他给你纠错的时候让他请你喝一杯咖啡(或者任何你想要的东西)。
3. 吹毛求疵者
吹毛求疵者会指责你写的每行代码。当他的意见正确时,他会一意孤行,不用你已经写好的代码,而完全照着他的想法。
就如自由爵士音乐人都是复用其他乐队成员的音符,来构造成一首曲子一样,好的结对编程也应基于现有的基础上进行推进。
试着转换角色,也许吹毛求疵者就会变成一个目中无人的人。
4. 默不作声者
默不作声者是那些几乎不发表意见的人。他仅仅坐在那里看着你工作。
试着问下他对你的方法有什么意见,或者问他下一步该写什么测试代码。
5. 心不在焉者
心不在焉的人企图让你分心,而不是提供给你有建设性的意见,帮你解决问题。
那么让他离开吧,比起一个让自己分心的人而言,不如一个人编程。
二、实施者误区
1. 深藏不露者
深藏不露者仅仅自己敲着代码而不告诉别人他在做什么。领航员不得不靠自己去弄懂代码。关于该用什么方法,该选择哪种设计,领航员和实施者之间完全没有交流。
领航员需要问问深藏不露者关于他的计划或想法。
2. 目中无人的人
目中无人的人通常忽略领航员的所有建议,大多数是因为他们觉得自己的想法或编程技能更胜一筹。
当碰到一个目中无人的人时,立即停止结对编程吧,开始下一个任务吧。自大的人往往也不会是个好的领航员。他们很可能变成发号施令者或是吹毛求疵者。
3. 不知所措的人
不知所措的的人往往不习惯结对编程,非常紧张,不能掌控全局。
确保自己的领航员角色做到最好。小心的提出意见,对于不知所措的人主要给予鼓励。
但是,大多数程序员开始都是这种情况。所以,不要对他们的结对编程期望太高。让他们首先成为一个领航员,或者让能够很好的处理人际交往问题的领航员在他们旁边。
4. 跳跃性很大的人
跳跃很大的人喜欢在代码中进行大范围的跳跃,这样领航员不知道进行到哪里了。
领航员需要让他慢下来,问他关于他的计划,并确保自己比他知道更多的快捷键。
5. 不熟悉工具的人
不熟悉工具的人不知道开发环境的快捷键,效率非常低。
交换角色吧,让他看看你的技巧。或者打印一张印有快捷键的cheat sheet。
我相信还有其他的误区,如果你有什么想法请写在评论留言吧。
原文: planetgeek.ch  编译:伯乐在线
----EOF---
如果上面的事情真的是真的,那证明我们还是有问题,在结对编程的处理上。但我真不敢尝试了。哎

Tags: xp, 极限编程, 结对编程

SOPA?PIPA?

以下是转贴内容,与我无关:
在美国,最近参议院和众议院正在分别审议《禁止网络盗版法案》也就是SOPA和《保护知识产权法》简称PIPA,互联网黑名单法案。这两个提案遭到包括Facebook、Google、亚马逊、eBay等在内的大公司的强烈抗议,他们正在考虑用“罢工”的方式来表达不满。这个简单点来说就是在该法案的允许下,司法部门可以随时要求搜索引擎,ISP公司,在线广告和支付公司停止与侵权的网站合作,随时可以从包括网站链接,网站IP各方面来封锁该网站。而且这些网站不分国别,这样一看中国大部分网站都会被从美国和谐掉。

互联网专家和知名人士,如“互联网之父”、 TCP/IP联合设计者温顿·瑟夫(Vint Cerf)、HTTP/1.1协议标准作者吉姆·盖提斯(Jim Gettys)和IPv6主要设计者史蒂夫·蒂灵(Steve Deering)等83人写了一封联名信发给国会议员以示抗议。

WordPress官方也十分抵触这两个法案,他说“在美国,举证的责任在于原告,在被证明有罪之前都是无辜的,但是在互联网的网页方面,如果这些法律得到通过,公司可以单独的指责而关闭网站,法律不像PHP语言,当你认为有更好的写法或者写法错误的时候能够轻松的改过来,我们不应该这么草率的编撰这样一个有着深远意义的东西”。
------

Tags: sopa, pipa

Yii 官方关于event和behaviors的文章

本文内容来自官方的wiki,一来是做备份,二来自己查询起来也会快一点,毕竟yiiframework官网经常抽风,当然它的抽风不是因为自己,而是因为GFW,说来也可怜,好象很多技术网站都被墙了。
不过想想也正常,如果一个搞技术的,连翻墙也不会,还搞个毛技术啊。
OK,上正菜:http://www.yiiframework.com/wiki/44/behaviors-events/#hh1

These features provide endless possibilities and unbelievable flexibility, but as current documentation does not give more than a few examples, it might be difficult to fully understand their internals and requirements.

It should be noted that they do mostly the same thing. You can attach behaviors and event handlers to components to modify the components' behavior.

Events

It is useful when you want to interrupt the normal application flow without extending base classes.

For example, enabling gzip compression on the output could be done via extending CWebApplication. But because there are entry points for event handlers, one can do this:

PHP代码
  1. Yii::app()->onbeginRequest = create_function('$event''return ob_start("ob_gzhandler");'),  
  2. Yii::app()->onendRequest = create_function('$event''return ob_end_flush();'),  

You can create an event handler -- which is simply a method in some class with a specific signature -- and attach it to the event of an object. You can add as many event handlers as you wish, from as many objects as you wish. If the event handler is, effectively static, then you can create the object as you assign it:

PHP代码
  1. $test_comp->onSomethingGoesOn = array(new SomeClass, 'eventHandler1');  
  2. $test_comp->onSomethingGoesOn = array(new SomeOtherClass, 'eventHandler2');  
  3. $test_comp->onSomethingGoesOn = array(new YetAnotherClass, 'eventHandler3');  

As long as you have a handle on the object, then you can add an event handler to it.

At some point, you can then raise the event with something like one of these:

PHP代码
  1. $test_comp->onSomethingGoesOn(new CEvent($this));  
  2. $test_comp->onSomethingGoesOn(new CEvent());  

So, basically, it allows you to build a list of function calls that can later be executed, in the order they were added. It can save you passing around a lot of object refs and building conditional code, since you can still raise the event, even if it doesn't do anything.

Behaviors

Behaviors are simply a way of adding methods to an object.

Take this scenario: You have 2 classes: MySuperClass1, MySuperClass2. There might be lots of methods from MySuperClass1 & 2 that you want in some new class, say MyBoringClass. Unfortunately, php does not allow for this:

PHP代码
  1. class MyBoringClass extends MySuperClass1, MySuperClass2 {  
  2. }  

This is where behaviors come in. Instead, you can go:

PHP代码
  1. class MyBoringClass extends MySuperClass1 {  
  2. }  
  3.    
  4. $classInstance = new MyBoringClass();  
  5. $classInstance->attachbehavior('uniqueName'new MySuperClass2);  

Now $classInstance has all the methods from MySuperClass1 and MySuperClass2. Since MySuperClass2 is being used as a behavior, it has to extend CBehavior. The only caveat to this is an attached behavior cannot override any class methods of the component it is being attached to. If a method already exists, if it be from the original class or already added by a previously attached behavior, it will not be overwritten.

In an OO language like Ruby, it's quite possible to start with a completely empty object and simply build its behavior as you go along. Yii provides this behavior with a little magic. The key is that the class you wish to add the behavior from must extend Cbehavior.

PHP代码
  1. class SomeClass extends CBehavior  
  2. {  
  3.     public function add($x$y) { return $x + $y; }  
  4. }  

Then use with:

PHP代码
  1. $test_comp = new TestComponent();   
  2. $test_comp->attachbehavior('blah'new SomeClass);  
  3. $test_comp->add(2, 5);  

So, in this case, you are extending the functionality of an object with functionality of another object.

After studying this cookbook page you are encouraged to reread the corresponding guide page as it contains advanced information (for example, if you are familiar with interfaces, you might find it enough to implement IBehavior before extending CBehavior).

-------------

behavior和Event在model里用的会相对较多一点,不过,其他地方也可以一用。如果你真的不明白这一块的逻辑,那还是用其他方式替代吧。

 

 

 

 

 

 

 

 

Tags: yii, behavior, event

丁丁历险记

丁丁历险记,恐怕很多人都会想到这部动漫吧。
居然也出了电影版,如果不知道丁丁历险记,那就是没童年的孩子。90后除外

BOSS在微博问有谁想去看,结果全公司的人都说要去。于是乎,包场了。。
准备周六去看,因为要带小孩,公司还特地发的中文版的票子(HOHO)

那天看了预告片,感觉特效什么的和以前的忍者神龟差不多,嗯非常满意。
丁丁,我来了

Tags: 丁丁, 历险记

转:极速理解设计模式系列【目录索引】

这里是一个文件索引,如果对设计模式感兴趣可以打开看看。
是同一个作者写的东西,也是他自己整理出来的索引,所以可以尝试一观,当然你可以从第一篇开始看,如果觉得兴趣不大,或者不对你的胃口,就可以咔嚓了。
作者是程兴亮。

        这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二。现在将本系列文章详列如下:

        极速理解设计模式系列:1.建造者模式(Builder Pattern)

        极速理解设计模式系列:2.观察者模式(Observer Pattern)

        极速理解设计模式系列:3.代理模式(Proxy Pattern)

        极速理解设计模式系列:4.原型模式(Prototype Pattern)

        极速理解设计模式系列:5.组合模式(Composite Pattern)

        极速理解设计模式系列:6.适配器模式(Adapter Pattern)

        极速理解设计模式系列:7.桥接模式(Bridge Pattern)

        极速理解设计模式系列:8.策略模式(Strategy Pattern)

        极速理解设计模式系列:9.工厂方法模式(Factory Method Pattern)

        极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)

        极速理解设计模式系列:11.单例模式(Singleton Pattern)

        极速理解设计模式系列:12.责任链模式(Chain of Responsibility Pattern)

        极速理解设计模式系列:13.外观模式(Facade Pattern)

        极速理解设计模式系列:14.轻量级模式(Flyweight Pattern)

        极速理解设计模式系列:15.中介者模式(Mediator Pattern)

        极速理解设计模式系列:16.迭代器模式(Iterator Pattern)

        极速理解设计模式系列:17.命令模式(Command Pattern)

        极速理解设计模式系列:18.访问者模式(Visitor Pattern)

设计模式这东西,本来就是属于通用的玩意,因此不用纠结语言,随便看看。
同时,也别过多的纠结这些,这些只是进阶的玩意,如果你连基础的代码都写不来也别看这些了,有意义吗??
其实我也看不懂,好吧

Tags: 设计模式

Records:2112345