关于程序员

没有评论

2010 年 12 月 03 日 at 下午 11:39分类:乱七八糟

我大致总结了一下程序员的特点:
程序员们每天都对着电脑12个小时以上,总是迫不及待的看邮件。
周末总是宅在家里,户外活动很少参加。
他们处理问题的方式显得很怪异,大多数情况下以一种比较机械的方式去处理,但其他人却很难理解这种方式。
很多问题的回答只有两种答案:“是”和“不是”,没有稍加修饰的或者比较委婉的回答。
大多数程序员表面上看起来比较严谨,但骨子里比较闷骚,在很多技术群里并不聊技术,常聊男女、YY笑话、美女图片,群里80%的都是光棍
懒惰,袜子、衣服堆着不洗,直到没得穿的时候,饭懒得去吃,直到实在太饿了。
不懂浪漫,缺乏幽默感,和人沟通问题很大,表情硬邦邦,说话很死板。

我遇到过不少做程序很久的程序员,他们的生活都太单调,谈吐缺乏风趣,话题太狭窄,缺乏社交,很多人技术是很不错,但他们是孤单英雄。
试问,这样的生活有意思吗?每天除了电脑和代码你还能做些什么?如果让你转行,你能去做销售吗?能去做管理吗(现在想想,那些项目经理技术并不一定好,有些甚至不会技术,但他的价值在于沟通和协调成员间的合作)?……如果离开了这个行业,你还能做什么行业?

最近稍微看了下非常勿扰,我看到两个例子
(1)“张江男”,从上场到失败结束离场,面部基本没有任何表情,回答嘉宾的问题也很刻板机械。
(2)一位女嘉宾提到的一位IT男,每天对电脑18小时,和她面谈时甚至边看电脑边聊天,抽一个小时出来静下心来闲谈有这么难吗?

程序员这一族大多数智商超于常人,但情商的确不怎么高。

程序员应知——简单就是美

没有评论

2010 年 12 月 03 日 at 下午 11:30分类:乱七八糟

我们经常会听到这样一句话——简单就是美,或者是这句话的各种变体,而且这句话不限于行业,不仅仅是在软件业,在各种涉及到设计艺术的领域,很多大师级的任务都会告诉我们,简单就是美。
在这里我当然只想针对软件开发相关的内容来谈,其实我们要解决的问题就是——到底要多简单呢?
对于UI设计——不需培训直接能使用
还记得曾经看过的基本讲述交互设计知识的几本书,其中都提到了,最简单也是最美的界面设计,就是用户直接就明白怎么用,而不需要长期的培训,对于这一点我深以为然,并且努力把这一点贯彻到自己所做的系统中。曾经记得自己帮朋友写了一个简单的库存管理系统,界面上没有菜单,只有几个必要的按钮,采用的是Office 2007的ribbon样式,并且精心挑选了几个意义鲜明的图标。朋友使用的时候,就告诉我,这个东西比他之前用过的财务软件好多了,那个东西培训了两个月还是不会使用,而且其中有太多用不到的字段,虽然不需要填写,但是看起来也比较别扭。而我这个东西,当时特意就没告诉他如何使用,只是说,很简单,看看就会了。达到的效果也很让我自己满意,真的是看看就会用了,哈哈。
其实想想成功的产品,比方说最近大卖的ipod、iphone、ipad等一系列苹果的东西,每一种的设计都是超级简单,没有过于复杂的界面和操作,这种美不用我说,已经得到了无数人的认可。
复杂的界面真的非常考验人,曾经见过最复杂的界面还是出现在对日项目中,同样最复杂的报表也在对日项目中,日本人对于基础知识的培训和学习,以及对复杂情况的耐心和毅力的确值得我们学习,如果让我整天面对那样复杂的界面,我可能早就崩溃了。(比方说,一个界面上放40个以上的控件,并且填写一个表单需要滚三屏,都是很可怕的)
我只能说,我是个懒人,不喜欢复杂的东西,解决问题喜欢用简单的方法,各种东西的使用我也愿意选择简单的。
其实,对于设计界面的人来说,或者说叫做交互设计师来说,设计最简单的界面,让用户能够尽快地上手使用,并且所有的使用习惯都与用户的传统习惯相符,本身就是对客户的一种尊重,另外,在市场上,一个产品是否能够取得成功,往往界面设计的好坏会起到非常重要的作用,因为简单易用的界面,会让人真正感受到其中的美,并赢得更多的用户。
上面我们所说的是最终用户所要面对的东西,而对于我们这些程序员整天所要面对的代码,又应该如何呢?我觉得代码的简单就在于——直接能看懂
我们在工作中,不可避免地会需要维护别人的代码,而我们自己编写的代码也经常会由别人来review和维护,那么代码的简单之美就非常重要了。
想要直接看懂代码,我觉得必不可少的有几点:
简短——每个方法都应该尽可能地短,有人提倡每个方法不超过四行,暂时我觉得还达不到那个标准,不过我们至少可以达到的是,每个方法只做一件事。曾经见过非常可怕的代码是有超过五层的if嵌套,而且每个嵌套里面的处理代码都无法显示在一屏之内,我直接就崩溃了,哈哈。
命名准确——这个应该是最有利于在维护的时候理解代码的了。业界中提倡的自解释代码也正是如此,如果变量、方法、类等等的名称都能够准确地表达出它的意义,那么阅读代码就和阅读说明书一样,自然所有的工作就都变得简单了。
恰当的注释——在某些时候,注释还是非常必要的,甚至对于自解释代码,有时还是有必要用注释来说明一下,毕竟其中还有计算机语言无法说明的业务逻辑在里面。当然,注释不应该是越多越好,某些项目中规定一定要有30%的注释量,还是有些值得商榷的。
最后想说说关于数据库的设计,我觉得这其中也必须应该贯彻简单就是美的原则,我们应该达到的标准是——直接能理解。
好的数据库设计对于系统的开发和维护都是非常重要的,特别是对于一些MIS、ERP、MRP等管理软件,数据库的设计在系统的架构中会起到举足轻重的作用。
我想应该把握下面的几个原则:
表中字段不要太多——每个表的字段数应该控制在30个之内吧,这个标准可能会因项目而异,只是一个基本的概念。想象一下吧,当在项目中遇到一个数据表的定义中有超过100个字段的时候,是不是感觉到很难处理呢?我在工作的过程中遇到过多次,这种大而全的表往往就是问题的多发地段。
名称合理——有些项目中,为了预防,往往会使用一些备用字段,或者放一些不一定代表什么意义的字段,它们的的名称可能就是一个字母带数字,比方说a1 a2 a3……这种字段真的是维护者的噩梦,它们可能在不同的情况下代表不同的意义,那样我们不仅仅需要一份数据库说明书,还需要针对每个字段在不同情况下的说明书。如果能够避免这种情况,每个名称都清晰地代表自身的意义,那么难度就会大大降低。
其实这里的原则和编码的原则基本是相通的,毕竟暂时我还是以程序员的角度来看待这个问题的。
总之,简单就是美,就是美啊就是美,你是不是也这么认为的呢?:)

JQuery JCshare 0.1 分享插件

没有评论

2010 年 12 月 03 日 at 下午 11:28分类:JavaScript | jQuery | WEB开发 | 乱七八糟

一、介绍:
现在各类SNS网站、微博等都开设了分享接口,可以让你的咨询更快、更有效的通过用户分享给其好友,外面也有很多一键式的分享控件。我们公司网站(巴士国旅)为了让用户及其好友更快分享到我们巴士的特价线路,自己研究了下,写了个简单的JQery插件,现在完全开源,方便大家扩展。原理很简单,拼接了分享接口的url,很多一键式控件是弹窗类型的,我这里做成链接形式,或许后面一个版本,会加入弹窗类型,暂时先这样吧,用下来还不错,欢迎大家拍砖。

二、目录介绍:
|—–scripts 脚本
|——jquery-1.3.2.min.js jquery 1.3.2
|——jquery.jcshare.js 分享插件
|—–styles 样式
|——jcshare.css 分享样式
|——share.gif 背景图片
三、安装:
1、链接样式
2、链接jquery和分享插件的js文件
3、在$(document).ready(function(){})中 调用分享插件:

$(document).share({
title: document.title + "-James.Ying-巴士国旅",
content: "更多旅游线路尽在巴士国旅",
url: document.URL
});

第一版中,只支持title,content,url,稍后会加入图片,现在也仅支持链接方式,弹窗以后再加了。
4、分享链接:

使用了Jquery的选择器,如果对应的class改变的话,请在初始分享插件时,也把对应的class赋值,具体看代码。

点击查看示例代码

分享插件下载

内存分配方式及常见错误

没有评论

2010 年 12 月 03 日 at 下午 11:21分类:WEB开发 | 乱七八糟

内存操作对于程序开发人员来说,永远是一块雷区。在这片区域,总是不断的埋雷、排雷,而且往往是排雷花了非常大的代价。记得在公司实习时,有大概2个星期的时间,team的几个人去排雷——有地方发生了memory leak!

而以我现在的认知来看,只有极少数的programer敢拍着胸脯说,非常熟悉内存操作,手到擒来不会排雷。针对这个情况,我要求自己在尽量去探索,以求少埋雷、甚至不埋雷(这是一个很大的挑战)。以下内容摘自《高质量C++/C编程指南》(作者: 林锐 博士),以警醒自己。更多详细、深入的东西有待我继续深入调查、学习。

1、内存分配方式

内存分配方式有三种:

(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

2、常见的内存错误及其对策

发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。

常见的内存错误及其对策如下:

内存分配未成功,却使用了它。
编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

内存分配虽然成功,但是尚未初始化就引用它。
犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。

内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。

内存分配成功并且已经初始化,但操作越过了内存的边界。
例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界。

忘记了释放内存,造成内存泄露。
含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。

动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。

释放了内存却继续使用它。
有三种情况:

(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。

(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。

(3)使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。

【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。

【规则4】动态内存的申请与释放必须配对,防止内存泄漏。

【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”

CI内部问题(BUG)

没有评论

2010 年 12 月 03 日 at 下午 5:38分类:PHP | WEB开发

今天在弄CI 的表情符的时候发现两个问题:
问题一:当我们把所有的表情符弄好了,然后建立相应的控制器,并在控制器中添加相应的代码之后,运行之后,显示出了相应的表情图片。但是
当我们点击相应的表情符的时候,确出报一个JS变量未定义的错误信息,找了半天,在表情的辅助函数里面有个函数smiley_js(),这是函数里面有个部分有点问题;下面是该函数的部分代码:

$r .= <<<EOF
			
				var smiley_map = {$m};

				function insert_smiley(smiley, field_id) {
					var el = document.getElementById(field_id), newStart;
				
					if ( ! el && smiley_map[field_id]) {
						el = document.getElementById(smiley_map[field_id]);
					
						if ( ! el)
							return false;
					}
				
					el.focus();
					smiley = " " + smiley;

					if ('selectionStart' in el) {
						newStart = el.selectionStart + smiley.length;

						el.value = el.value.substr(0, el.selectionStart) +
										smiley +
										el.value.substr(el.selectionEnd, el.value.length);
						el.setSelectionRange(newStart, newStart);
					}
					else if (document.selection) {
						document.selection.createRange().text = smiley;     //这里原先是text,是不对的,改成smiley
					}
				}
EOF;

问题已经在注释里面说明了!这是问题之一
其次,在显示的所有表情图片中,有一个表情符号显示不出来,找了下问题所在,找到了相关的图片和在ocnfig/smileys.php文件中定义的代码,发现有点不一样,下面是没有显示图片对应的代码:

':P'			=>	array('raspberry.gif',		'19',	'19',	'raspberry'),

这里定义的图片名称是:raspberry.gif,而在表情包里面却没有这个图片只有一个rasberry.gif图片,由此看来这肯定是写的时候出错了!解决办法:
将表情里面的图片rasberry.gif名字改成raspberry.gif。这样子,图片就能全部显示出来了!

实现网站在线人数的统计

2条评论

2010 年 12 月 03 日 at 下午 3:11分类:PHP | WEB开发

在某些特殊的网站上需要对网站浏览的情况进行一个统计,这个当然包括在线人数的统计,下面就来说说网站在线人数的统计功能的实现!
我们首先要建立一个数据表表结构的代码如下:

CREATE TABLE IF NOT EXISTS `session` (
  `s_id` int(32) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户session的id',
  `s_uid` int(32) unsigned NOT NULL COMMENT '对应用户的uid',
  `s_sessionid` char(30) NOT NULL COMMENT '存放用户登录产生的session_id()',
  `s_login_ip` char(15) NOT NULL COMMENT '登录的ip',
  `s_login_time` int(16) unsigned NOT NULL COMMENT '登录的时间',
  PRIMARY KEY (`s_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;

这就是一个数据表的结构。下面我们来看下主要的脚本代码:
统计在线人数的函数:

//记录在线人数的函数,在网站首页调用该函数即可
	function fun_online($table,$mysql,$stay_time){
		$session   = session_id();
		$time      = time();
		$ip        = fun_getip();	
		$time_check= $time - $stay_time;					//设置时间10分钟=10*60秒  ,$time_check用于检测是否超时
		$sql       = "select * from `".$table."` where `s_sessionid` = '".$session."';";
		$count     = count($mysql->get_all($sql));
		if($count == "0"){
			$sql   = "INSERT INTO `".$table."`(`s_uid`,`s_sessionid`,`s_login_ip`,`s_login_time`)VALUES('".$_COOKIE['uid']."','".$session."','".$ip."','".$time."');";
			$result = $mysql->query($sql);		//执行插入
		}else{
			$sql    = "UPDATE `".$table."` SET `s_login_time` = '".$time."',`s_login_ip` = '".$ip."' WHERE `s_sessionid` = '".$session."';";
			$result = $mysql->query($sql);		//如果存在则修改连接时间
		}
		$sql    = "select * from `".$table."`;";
		$count_online = count($mysql->get_all($sql));
		$sql4   = "DELETE FROM `".$table."` WHERE `s_login_time` < ".$time_check.";";	//在session表中删除超时的用户登陆信息
		$result = $mysql->query($sql4);
		return $count_online;
	}

说明下:这里的参数$table是指表名 这里就是session了,这个表名自己可以随便命名,第二个参数是一个数据的操作的对象,第三个参数是设置有效时间的!这个函数中用到的一些对象的方法都是操作数据库的,比较简单,这里就不写了!
判断某位会员是否在线的函数:

//判断具体的某一个用户是否在线的函数
	function fun_is_online($uid,$table,$mysql){
		$sql = "select * from `".$table."` where `s_uid` = '".$uid."';";
		$res = $mysql->get_all($sql);
		if(empty($res)){
			return "0";				//返回0代表该uid代表的用户不在线
		}else{
			return "1";				//返回1代表该uid代表的用户在线
		}
	}

说明下:这里的参数$uid是指某位用户唯一标识符uid,这个可以通过登录获取,第二个和第三个参数和上面的函数是一样的!
接下来我们看下是怎么调用的!我们在网站的入口文件这么写:

if(isset($_COOKIE['uid'])){
		fun_online("session",$mysql,"600");				//用户每次刷新页面时将时间等信息写入session表
	}

这样子就可以实现该功能了,要输出总共的在线人数是要echo一下fun_online()就行了!