本站首页 返回顶部 关于博主

番茄工作法不适合程序开发

最近又有朋友在朋友圈推荐番茄工作法。作为一枚码农,说实话,我很不推荐在软件开发过程中采用番茄工作法。
软件开发是一项精神高度集中的脑力劳动。在编程过程中,需要长时间的专注,稍微地打断一下很有可能得话费很长时间进入打断之前的状态。而番茄工作法以25分钟为单位造成的后果就是刚刚进入状态很快就被打断,严重降低写代码的效率。在工作中,在家上班一天的效率很多时候比在公司上班两天的效率还高,就是因为在家干扰小,容易精力集中。
对于不必长时间专注的工作,可以使用番茄工作法。如果自身很难精力集中,或者做一些枯燥或很难让人精力集中的事情,番茄工作法倒是一个不错的选择,它能很大程度地提高效率。

吃饭与团队满意

–由吃饭想到的

吃完饭回来的时候,团队的一哥们偷偷对我说,“Frank,没想到你会拿自己的award请大家一起吃饭,太令人感动了。”
这哥们继续说,“如果PM都你这样,能处处能为我们着想就好了。”

其实,这哥们没有全面了解我请大家吃饭的原因。让大家开心,只是原因之一。
半年前,公司新成立一个重要性很高的项目组,从各个部门借调人手做这个项目,于是我从原来部门借调出来加入这个临时的项目组。
最近项目刚结束,邀请项目团队的核心成员给原来的部门做了次技术分享,然后申请了一个award,最后用这个award来请大家吃饭。

这不是工作必须的,我为什么要做这么做呢?
作为项目经理,工作目标无非是三个目标:让领导满意、让团队满意、让我自己满意。而我所做的,就是为了实现这三个目标。
怎样让领导满意呢?在这个项目里,按期保质保量完成任务,项目的直属领导满意;让团队成员向我所属的部门做技术分享,让原部门领导知道我的成绩,部门领导也满意。
怎样让团队成员满意呢?在项目过程中,从团队成员的立场思考问题,帮助大家解决问题,与此同时,以请吃饭的方式提高团队的满意度。
怎样让自己满意呢?向领导展现我的个人能力,提高在公司的曝光度,这对以后升职加薪有好处;向团队成员展现我的友好并获取大家的信任,毕竟以后大家有需要帮助的可能。

有感PMI Exam Dev Workshop

有幸参加了PMI协会在上海举办的PMI Exam Development Workshop活动。这是PMI协会第二次在中国举办此活动,上一次是2009年北京。
我第一次参加,感觉收获很多。

我们知道,PMI考试题库中的考题一直在不断地完善中,这就需要不断地淘汰旧题目,引入新题目,这次活动的目的就是补充新考题。整个活动分2个主题:评审已存在的题目和添加新的题目。

第一天下午主要是PMI协会高管的演讲。
第二天工作内容是评审以往的考题。部分考题来自题库中不计入考试分数的题目,部分来自其他PMI Exam Dev Workshop提交的题目。每个题目都会对应到项目开发周期中相应的领域(Domain)和任务(Task),无论是题干,还是选项都有很严格的要求。这种出题的方式对其他行业出考题还是很有借鉴意义的。因为签过协议,在此不方便提及更多题目相关的内容。
第三天工作内容是自己写题目。由于头一天评审过题目,所以基本上已经驾轻就熟了。大家可以参考自己以往的工作经验,项目中碰到的问题或经验,然后写出来。题目完成之后,与其他组相互评审,最后成题。

总结一下:
1.在项目管理方面有些新的感触。一方面来源于第一天PMI协会高管的演讲,另一方面,接下来两天评审题目、写题目,参考资料,讨论问题,相互交流。
2.认识了不少朋友。毕竟,扩展社交圈对个人的发展是很重要的。

Problem B. Cookie Clicker Alpha解答

这题的小数据8分,大数据11分,共19分。
 
在分析解题思路之前,我们先看一下题目中的例子。
假设方案一从来都不买form,那就意味着产生cookie的速率一直都是2个/秒;按照方案二,当买了第一个form之后,速率由2个/秒增加到了6个/秒,买了第n个form之后,速率变成(2+4n)个/秒。
如果以时间为横轴,cookie的数目为纵轴,那么时间和cookie的关系如下图。

Cookie数目和时间关系图

从上图中,我们可以看出,第一种方案需要1000秒,第二种方案需要500多秒。
从折现的斜率来看,买的form数目越多,产生cookie的速度越快。但每当买一个form之后,虽然速率增加了,但是cookie的数目马上就减少了。同不买form的那种方案相比,需要一定的时间才能赶上它。
也就是说,我们应当尽量地多买form才能保证多产cookie,但form的数目存在一个临界值,当form的数目多余这个数字时,我们不必买form就能更快地达到要求的cookie数目X。
 
那这个form数目的临界值是多少呢?
 
当第一次达到500个cookie时,假设此时的时刻为0,如果不买form,那么再过t秒,cookie数目为 500 + 2t。如买一个form,那么在t时刻的form数目为(2+4)t,也就是6t,那么方案二追上方案一随需的时间是多少呢? 500 + 2t >= 6t,得出t>=125,也就是说,在125秒之前,方案二中cookie的数目小于方案一的数目,这个临界数目是500 + 2t = 750。当产生cookie的数目小于750时,方案一更快,大于750时,方案二更快。
在当前例子中,X的数目为2000,大于750,所以应该采取方案二。
 
继续产生cookie,当cookie数达到500时,假设我们目前已经有了n个form,如果不买form,再过t秒的cookie数目为500 + (4n+2)t,如果买form,那么再过t秒,cookie数为 (4n+2)t + 4t。我们可以算出,t恒为125,也就是说如果500 + (4n + 2) * 125>=2000,那么应该采用方案一,否则采用方案二。
我们算出n>= 2.5,取整之后form的数目n>=3。
把C,F,X放到公式里,那就是  ( 2 + nF) * C/F  >=  X – C,然后得到 n的值是 X / C – 1 – 2 / F。那么算上买n次form的时间,加上最后一次的时间 X / ( 2 + n * F ),就是我们所需的结果了。
时间复杂度o(1)。
 
源代码:CookieClicker.java

Problem A. Magic Trick解答

原题链接:Problem A. Magic Trick

这一题6分,题目要求可简化如下:
前提条件:
1. 给定A和B两个4 x 4 的矩阵,两个矩阵中都填充了1 ~ 16这16个数字(每个矩阵中的数字都唯一)。
2. 取出矩阵A中指定某一行的4个数字;
3 .取出矩阵B中指定某一行(可能与第2步中行数相同)的4个数字。
要求:
判断步骤2中的数字与步骤3中的数字是否包含相同的数字。如果有且只有一个相同数字,那么输出这个相同的数字;如果没有相同的数字,则输出“Volunteer cheated!“;如果相同的数字个数大于或等于2,则输出“Bad magician!”。

解答:
把两组数字分别放到两个数组中,逐个比较这两个数组,然后把相同的数字放到一个list中,最后判断list.size()即可。函数实现如下
	private List<String> processTrickPair( String[] values1, String[] values2)
	{
		List<String> ret = new ArrayList<String>();
		for( int i = 0; i < values1.length; i ++ )
		{
			for( int j = 0; j < values2.length; j ++ )
			{
				if( values1[i].equals( values2[j]))
				{
					ret.add( values1[i] );
				}
			}
		}
		return ret;
	}
源代码下载:MagicTrick.java