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

转:技术骨干做项目经理的优点和缺点

看看别人是怎么评价技术骨干做项目经理的,其实任何事都有利弊啦,不过这里说的几乎都是弊。
学工商管理的时候,对于一个职业往往都是讲究内拔外选,其实是和这个道理是一样。
内拔,对于内部的信息、资料都相对比较熟悉,同样,还有对于人员的能力也是相对熟悉,配合起来可能会比较方便,但缺点是眼界可能不会太开阔,比较容易局限于目前的视野
外选,可能技术能力较强,但同样也有缺点,很多人对于空降兵比较排斥,对于人员的能力不熟悉,短时间内不知道如何分配资源。

再看看别人说的吧:http://www.cnblogs.com/laozizhu/archive/2009/04/04/1429640.html

    开发骨干,由于主要或全部精力均忙于具体技术工作,各种项目管理任务(如:项目分析/评估、项目计划的制定/检查/调整、上下左右的沟通、专业资源调配、 项目组织调整、项目财务控制、风险分析/对策等)不可避免地疏于顾及,项目管理的事情“没人做”,导致项目控制的问题“积劳成疾”,后悔莫及。

    技术骨干担任的项目经理,不可避免地存在着“技术崇拜”,尽可能采用新技术。即使是需求明确的功能,由于实现方式有多种路径,一般都是从技术上采取最优的 路径,而不是从用户操作方便的角度上选择操作最方便、快捷的路径,用户必须严格按开发人员所预设的操作方式进行操作。

    说句老实话,用户是不管你用什么技术的,先进或落后的技术都可以,只要能满足用户的需求即可。这种类似闭门造车生产出来的产品,自然就是操作不便,功能差 强人意的。还有一种情况是,这种情况一般发生在项目后期,开发产品的情况较多,随着开发的深入,总会发现缺少某些功能,或者某些功能不够强大。项目经理对 功能的增加、删除、修改,不是通过集体讨论确定或通过从市场前线人员中了解确定,而是通过凭空想象,拍脑袋来作出决定。特别是对于某些功能的添加,由于项 目经理都无法把握用户是否需要这个功能,需要这个功能的程度,因此是很难令开发人员把握此功能的目的。当然,既然大家都无法把握用户是否会用这个功能,那 自然是应付式开发。只要过了测试,过了项目经理这一关就OK拉。

Tags: 项目, 闲聊

[转]PHP删除cookie的一个小秘密

首先我们看一下php手册中关于删除cookie的说明

------以下引用php手册内容--------------

bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )



要删除 cookie 需要确保它的失效期是在过去,才能触发浏览器的删除机制。
下面的例子说明了如何删除刚才设置的 cookie: 例子 2. setcookie() 删除
例子

// 将过期时间设为一小时前

setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);

----------------引用结束--------------------------

删除一个cookie的方法就是把这个cookie的有效期设置为当前时间以前,这
也是几乎所有php程序员都会这么做。

  后来一个初接触php的朋友告诉我,他在程序中本想把一个cookie的值设置为
空,结果导致这个cookie直接被删除。我当时的第一反应是不相信,于是测试
了一下

setcookie("testcookie", '');
print_r($_COOKIE);

结果果然是整个$_COOKIE数组都是空的,而非仅仅$_COOKIE['testcookie']为
空.于是用winsock抓包,观察返回的http头,发现http头竟然是

Set-Cookie: testcookie=deleted; expires=Mon, 18-Jun-2007 02:42:33 GMT



这说明setcookie("testcookie", '');的的确确是将testcookie这个cookie直
接删除.而关于这种情况在php手册中完全没有说明.

最后阅读php源码,终于发现真相(这就是开源的好处了,有什么不清楚的内幕
直接查源码)

以下代码可以在php5.20的linux源码包中ext/standard/head.c第99行附近找到.

C++代码
  1. if (value && value_len == 0) {  
  2.     /* 
  3.      * MSIE doesn't delete a cookie when you set it to a null value 
  4.      * so in order to force cookies to be deleted, even on MSIE, we 
  5.      * pick an expiry date 1 year and 1 second in the past 
  6.      */  
  7.     time_t t = time(NULL) - 31536001;  
  8.     dt = php_format_date("D, d-M-Y H:i:s T"sizeof("D, d-M-Y H:i:s T")-1, t, 0 TSRMLS_CC);  
  9.     sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);  
  10.     efree(dt);  
  11. else {  
  12.     sprintf(cookie, "Set-Cookie: %s=%s", name, value ? encoded_value : "");  
  13.     if (expires > 0) {  
  14.         strcat(cookie, "; expires=");  
  15.     dt = php_format_date("D, d-M-Y H:i:s T"sizeof("D, d-M-Y H:i:s T")-1, expires, 0 TSRMLS_CC);  
  16.         strcat(cookie, dt);  
  17.         efree(dt);  
  18.     }  
  19. }  



源码中清清楚楚的显示,if (value && value_len == 0) ,当value_len为0

sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);
会发送删除cookie的http头给浏览器.

最后我们可以得出结论,在php中使用
setcookie($cookiename, '');或者 setcookie($cookiename, NULL);
都会删除cookie,当然这些手册中并没有。

Tags: 删除, cookie, 清空

二十件事让身体越来越差

其实本来以前并不关心这些知识啥的,但,身为一名IT工作者,其实我们经常会饮食不规律、作息时间不规律,因此在看到这些从小处就可以进行简单养生的知识时,还是觉得要参考参考的。

以下为摘
要,详细看全文。。

19 .生吃胡萝卜不吸收! 
                
常见一些老婆婆给孩子吃些生的胡萝卜,她们讲:这样既可磨牙,又可补充“维他命”,这是发生在我们生活中最为典型的营养误区。生吃胡萝卜很不科学。将胡萝 卜分别生食、用微量的油脂烹调、用足量的油脂烹调,测胡萝卜素的消化吸收率分别为10%、30%、90%。可见,胡萝卜素在体内消化吸收率与油脂配比成正 比;胡萝卜用食油烹制后食用比生的食用营养价值高。>>>胡萝卜下酒会中毒  
                

20.“皮”很重要 弃之可惜! 
                
茄子、蓝莓和葡萄的皮中含有大量多酚,这是一种抗氧化剂,具有防止自由基氧化,延缓衰老的作用,去掉皮食用是很可惜的!另外,去掉番茄的皮也会使番茄中的很重要的抗氧化物质——番茄红素容易随汁液流失,不利于维护健康。

» 阅读全文

Tags: 健康, 身体

向东的工作周报(2月 20 日-4月2日)

从名字可以看出来,这是向东的工作周报。不过,他的这一周,好长啊。。。其实是他每周的工作情况的简报啦。
这个习惯真好,我就没有养成。

他的第一个问题,我在以前与java那边交互的时候就遇到过,开始也是一直判断一直判断。最后发现获取的就是字符串,都跨语言了,还是用的curl来取值的,怎么可能传递布尔值?

最后它说的BOM问题,这就不太应该了。不过他的正则写得不错。我一直用editplus,文件选项里可是有一条:保存时始终去除BOM,就行了啦。用记事本,是会生成BOM的,微软的东西是差呀。。

框架这东西,仁者见仁智者见智,不多分析


原文如下:http://www.xiangdong.org/blog/post/1699/

近半年的工作心得,摘录如下:
(    2月 20 日--   2月  26  日)
工作心得
一.Ajax通过POST提交给$_POST数组变量问题:
和 js人员一块调试ajax提交一些数据的时候,在ajax调用的时候,js人员通过Post方式传给我一个'allowComment',它为 True\false,刚开始误以为是一个TRUE 或 FALSE是PHP里面的一个布尔值(实际是一个字符串),于是写下如下代码片段:
if(true ==  $_POST['allowComment'])
{
  $this->_par['allow_comment'] = 0;//0为允许评论

}else
{
  $this->_par['allow_comment'] = 1;
}
导 致出现无论post过来的数据是true还是false,只走if不走else,当时很奇怪,我通过print_r()来打印看到明明是false,但是 还是不走else这条路,最后听建鑫说它是个字符串,我于是改用var_dump()函数来看:var_dump($_POST)发现它其实就是个 string类型的字符串:string(4) "ture",不是布尔型的一个变量。而修改为:(引号引起来即可)
if(‘true’ ==  $_POST['allowComment'])
{
  $this->_par['allow_comment'] = 0;//0为允许评论

}else
{
  $this->_par['allow_comment'] = 1;
}
结论:尽管PHP是弱类型语言,但我们调试时候最好用var_dump(),而不是print_r();
二.DIV模板取高度自动适应的问题:
在 做这次记录套页面的时候,提供的页面是一整张页面,这就需要php工程师去去掉里面的一些没有用的DIV标签和多余的html代码,但是在把最后剩下的一 些HTML代码套好页面后,在放到pengyou里面测试时候,发现页面被遮挡,最后发现是由于刘嵩Js想取到一个DIV的高度没有得到正确的值,而这正 是由于HTML设计人员把一整张页面让PHP开发人员去从里面提取出需要的东西,但是往往会出现某些DIV没有带到Smarty页面里渲染,才导致js在 通过ID或者NAME去取高度时候出错,也就是PHP工程师套页面的时候并不知道UI提供的页面中哪些DIV是JS人员必须要的,而UI人员就把整个页面 给PHP工程师自己去剔掉多余的DIV和HTML,而刚好把JS需要的DIV给干掉了造成的.
结论:切页面得按照产品结构来,而不是仅仅UE,涉及到JS的得事先和PHP工程师和JS人员沟通。
三.接口变动问题:
一 些底层接口的变动往往造成输入(入数据库)和输出(如:页面)出现一些明显的逻辑错误,于是我们首先会想可能是不是程序逻辑出现了问题,进一步去查程序代 码的逻辑是否严密,会发现数据库里面出现一些和现实逻辑不同的情况,而很容易把陈脚搞乱,特别是有其它系统的介入,更让人很难发现其中错误。
结论:尽量少动接口返回的数据结构,保持结口稳定,而一旦改变,及时通知接口使用和开发方。

(    3月 6 日--   3月  12  日)

工作心得
对重构的一点体会:

1.改进软件的结构:
在开发记录的时候有时由于一个新的需求导致为了更快的满足用户,不故到程序的整体结构,而这种解决方法不能以一个系统的角度来解决问题,如果任其发展会使代码的质量越来越难以维护,而重构能改善这个问题。

2.增加可读性:
以 前的记录的数据层是由外包人员写的,让我觉得有点难懂,而有人说,修改别人的代码不如自己写,但事实上往往自己写的代码比上一个人还难以让别的人读懂,但 是如果这个人有一天离职或者没有上班那就有些耗费时间去读懂对方的代码,而我们的重构可以通过一些命名规范和类的规范和层次结构的规范来尽量防止这类事情 的发生,仅管我也参考了他们的代码。

3.及早地发现错误:
进行重构我们必须对项目的每一行代码的逻辑都了解,明确它的功能和上下程序调用关系,这样的理解我觉得有助于少犯错误和及时发现自己的错误。

4.提高了开发速度:
知道用户80%的需求的情况下,这种情况下重构,可能从一定程度上能提高开发速度。
(    3月 13 日--   3月  19  日)
遇到一问题
   在对记录的项目中进行重构的时候发现需要通过Ajax多提交一个POST变量到PHP那边去,发现不能随意加,而和js开发人员沟通了一下,结果是必须得 修改一下js代码,把多提交的一个加进去才行,但是我个人觉得js的Ajax Post应该做得像表单提交数据那样,只要多加一个数据<input type="text" value="add_value" name="XXX" id="XXX" />加入<form>
</form>表单,就可以对它POST提交到另一个PHP文件,而不是仅仅对一个单独的应用而写一个Ajax Post提交数据 ,不知能否改进成这样?

工作心得
1.
  做项目最好先了解需求,然后明确需求,再思考用例,然后画数据流,最后才是数据库的设计,当然最后的数据库设计也是最重要的!
2.
  对于一些定义分级和对应级别的少量数据最好放到PHP数组里面,而尽量不要放到数据库里,而对一些不是经常改动而却又是经常频繁查询用到的数据在量不是很在的情况下如放到数据库里面会显得成本太高,放到一个文本里变为一个配置文件来用效率可能会反而更高。
3.
  对 大并发和高访问的数据库设计解决方法现目前还是分表,如还不行,再Hash打散分库,但不能无限分,一个库尽量256表,动用4个库来也就分了1000个 表左右,建鑫的经验告诉这样可能性能和稳定性相对高一些,而不能随意乱分。不知按时间或者天数来分表这种情况会有什么样的问题,期待通过人缘项目来尝试一 下。


2009-03-20 ----2009-03-26:
遇到一问题
工作心得
对于上次邮件里面讨论到的PHP BOM问题,我来说来句就当心得吧,其实这个BOM问题一直在我们进行开发的时候经常出现,前些日子在企业邮箱里面第一次遇到这个问题,当时好像是企业的图标LOGO没有办法显示出来,因为<img alt="" src="http://www.xiangdong.org/blog/img.php" />,是img.php去读一个图片的内容然后给img显示,经过长仔细排查出现在输出图片资源前就有输出,那时候用的是notepad+editplus,最后用Zend studio来看这个文件头出现一个锘�字,证明了该问题。

第二次遇到BOM问题,是陈鑫鑫在纸条项目里面输出XML数据到IE浏览器中展现出现XML错误。

第三次也就是我们的记录APP调用外部接口返回用户的昵称出现乱码,经琳琳查也由BOM造成!
为 何经常出现这种类似的问题,我看大家都在按照自己的方式来建立和开发PHP,特别是用Notepad来新建文件,系统默认在是ANSI格式,但我们的 PHP编码是UTF-8的,于是又通过Notepad的另存为修改为UTF-8格式的,这样也就产生了一个BOM,最后,再用现在统一的开发工具Zend for eclipse去编辑这个带BOM的PHP文件,但BOM依然存在文件当中,它一般是表现不出任何问题,但一旦在页面前不能有输出的情况:如上面我遇到的 三种情况它也就显现出来了。

BOM如此讨厌,该如何避免:
建议:
1.  切实统一开发工具:统一用Zend for eclipse 来新建PHP文件,和修改PHP文件编码!
2.  在 项目完成后对目录里面所有的PHP 文件进行遍历驱出有可能出现的BOM。如:用sed批量替换掉bom:(syscore目录和所有下级目录的PHP文件替换)   find ./syscore -type f -name "*.php" -exec sed -i '1s/^\xef\xbb\xbf//' {}  \;



(3月27日---4月2日)
遇到一问题:
在调试记录的js时发现超过了页数却没有出现翻页导航的页,开始首先以为是数据没有输出程序的问题, 最后查明是由于朋友下面的frame把下面给档住了,Js人员修正了这个问题,这个问题还经常出现,希望js人员也多注意一下!
工作心得:
本周收到老姜发的一点对PHP框架的看法,我也斗胆也说说我自己对这个问题的看法,有些可能说得不太准确或者有些错误,还望包含:
首先,我个人是不反对PHP采用一些轻量级的框架,但极力反对对PHP用一些重型的框架的,为什么呢?因为它的执行方式决定了它的这个特点:php每一 个脚本先全部载入所有资源,执行完毕后全部放弃,所以使用太重的框架,会极耗内存和计算资源,形成调用栈太深占用系统资源,个人觉得轻量框架和简单的分层 还是一定要采用的。
其次,你会说像Java这样的语言它能采用一些的框架,而且还涌现出了一些红红火火的框架了呢:)
个人觉得那是因 为java的执行方式和PHP不一样,对于内存管理也不一样,有很多都是一次装入内存,直到jvm重启才被释放的, 事务性,安全性等等很多基础性的服务,都需要预先装入,何况java是基于工业级应用产生的,php只是个人网站开发才出现的,能一样吗?不能。所以,不 能我们也不要一边倒,看人家采用什么什么了,自己也想把PHP往边上套。
再次,C++和Java强悍的框架不少,但惨不忍睹的框架也更多,为 什么呢?用一个越是尖端的东西越不容易用好,对于重型的编程语言对软件工程功底的要求是相当高的,不是谁说想做个框架就做个框架,更何况各个项目的千差万 别,实际的情况也不尽一样,更不能以一个框架来以逸待劳,放大了框架的作用,它并不是万能的。
最后,我仅对PHP的框架也就领悟到:轻量框架和简单的分层还是PHP在大多数项目开发中还是一定要采用的,但切忌过重,把握好度,适可而止。

Tags: php, 经验

从用户体验UE角度设计用户登录系统

很老的一篇文章,可即使是如今看来,也有可取之处。06年的了。现在都09年了
最近,几乎所有的网站都在以改善用户体验为首要目标,所以,更加需要查看这些文章来做参考。

原文:http://www.bloghuman.com/post/196/

内容如下:(图片我也没有下载到本地,直接用的该网站的)

登录界面经常遇到的几个问题:
1、“注册”“找回密码”等这些个非“登录”任务本身的嫡亲应该安排在那里?
我的观点:首先一定要明确“严格来说他们并不属于这个任务”。
放在那里不重要,重要的是我们需要给表现成“相关任务”,不要当作该任务界面的主要元素来处理。(无论在架构还是在交互上都不要让他“喧宾夺主”)
2、“保存cookies”“登录设置”等些个“登录”任务的直系亲属应该如何处理?
我的观点:首先,这些属于任务的一部分
其次, 如果默认设置能够帮助完成这些信息可以尽量不需要在登录任务里显示,
然后,如果需要 一定要简洁,但简洁的同时要注意文字的表达(如,“自动登录=保存密码+自动登陆”的表达就很不合适)。而且一定要注意默认的备选项设置。
3、表单的排列是横排还是竖排?横排该怎么排,竖排又该怎么排?
我的观点:横排还是竖排要看页面的排版所需,没有什么大的原则问题。具体怎么排只要用心思考一下肯定就知道权衡了,
横排用户的焦点轨迹跨度较大,但空间占用较小;竖排用户的焦点轨迹可以是直线,但空间较大。如果条件允许我建议用竖排,如果规范所限或条件有限我不介意用横排。但大部分情况下我很介意在输入框中默认一些类似"再次输入密码"等傻瓜提示信息的行为
4、是否需要验证码?
我的观点: 如果安全性没有大问题的话一定不要。
但好像你的技术搭档绝大部分时候都会告诉你“安全性”有大问题,所以很多时候我们不能“为了细节的良好体验而纵容了系统的安全受挫”...
所以这个命题索性可以改成“验证码”应该怎么设计?
我反对一: 中文验证码 (纯弱智的设计)
我反对二: 英文和数字混合的验证码 (给用户输入带来了不少麻烦)
我反对三: 超过4位的验证码 (记忆中好像据说是什么研究结果)
我反对四: 有大写字母的验证码
特别是大小写混合且实际系统判断时还不区别大小写的 —— 虽然你不区分大小写,但你显示的是大写很多用户就会很费劲的打开大写输入填写大写字母,无形中给用户带来了负担。
5、目前看到的一个我最喜欢的登录任务的设计:
点击在新窗口中浏览此图片
喜欢一: 任务明确,登录任务应该包括“登录信息+登录设置”,“找回密码”不属于登录任务,这些它都交代的很清楚。
喜欢二: 流程清楚,竖排排列用户可以直线思维操作, 用户>密码>保存密码>登录 一气呵成。
喜欢三: 设计精简,类似“保存我的信息”“自动登录”都没有放到这里,这就是我所说的“如果默认设置能够帮助完成,这些信息可以尽量不需要”。因为,大部分情况下如果你真的需要设置 说明你已经不是简单的初级用户,那么你一定有能力自己去找解决方案
喜欢四: 小细节大学问之 —— 错误密码记忆。
看看上图“用户>密码>保存密码>”三个步骤之间都有一个不小的行间距,这个间距空袭乍一看似乎并没有什么作用。
但研究过的人会发现里面的学问不小..
如,
点击在新窗口中浏览此图片
当我第一次输入一个错误的密码时,系统在判断错误后会在提示错误的同时把我的这个输入记忆,当我再次输入这个错误密码时,系统会自动在客户端提示“密码错误”。这样做减少了用户的一次误操作同时也减少了一次提交给服务器端的任务。因为: 密码的输入显示是*并非能直接看到你的确切输入结果,有很多时候你确实是记错了,可以你以为是你自己输入出错了。
喜欢五: 小细节大学问之 —— 验证码
等你输入错误一定次数时才会出现验证码。 (不是一开始就有验证码,也不是你输入错误多了就不让登录)
6、yahoo的登录也很有意思:
点击在新窗口中浏览此图片
优点一: “防密码失窃”功能的设计很有想法,这样的布局基于好的图形设计创新
优点二: 任务足够简单
优点三: 大家好像都具备这些..
缺点一: 任务足够简单,但拖泥带水过多
缺点二: 记忆用户ID的功能很好,但这种显示方式不舒服,给用户的修改增加了步骤
7、细节之 —— 减少用户的填写
我目前为止利用过四次很偶然的机会,观察过五个普通网民用户使用126邮件的过程。
他们在登录时有四个人遇见了同样的问题 —— 输入的时候不知道只要输入 whitecrow_zhu就可以了,而是输入完整的whitecrow_zhu@126.com。
另外一个没有出现这种情况的用户是因为,当他打到"@"符号时,旁边有个人提示他“你SB呀,后面的不用填”,所以他才没有填...

8、总之登录”就是一扇门“

一扇让产品和用户真正互通的门,让产品可以给用户体现出更多价值的门。
所以这个门一定要: 够宽、门槛够低、一直开着、记忆每次进出...

Tags: ue, 设计