月度归档:2013年12月

些许吐槽

今年换了一个新的工作,主要工作内容还是写代码,不过工作性质由之前的移动应用服务器后端api转变为日志数据内容的读取和分析。

实话来说,这个是换糟糕了。这个等过些时段在详细记录一下,其中有着各种错误。

 

暂且不说工作的对或错的问题,还是吐槽一下这个分析系统的代码。

这套系统(说是系统不如说就是cms)主要目的是供内部人员或者合作方的客服查看数据,分析数据使用。这个cms采用的是ThinkPHP3.1 Release框架开发,开发完成后的代码量也不多,代码结构和逻辑也复杂。

但我所认为槽点确是相当的多啊。

1、业务实现结构混乱

ThinkPHP怎么说也是PHP5,ORM面向对象的开发框架。不过在这系统里面,Controller的业务处理作用几乎是100%,Model几乎被闲置,最最关键的是开发人员说“我觉得Model没有什么用”,我只能表示黑线了。而现在我尽可能的使用Model构建业务,Controller做转发和调用。

 

2、代码结构不分块,几乎没有组织

是的你没看错,foreach一共嵌套了5层!!!对于能写出这样代码的我深感佩服,你有信心读下去吗?!假如你刚好还要维护这样的代码呢??你一定会崩溃。所幸我目前还不用维护这一部分。我认为不论多么复杂的逻辑以及实现方式,代码业务分块编写,简洁调用这是应该的,不管是维护修改和重新设计都会有好处。尽管这只是一个特例但是有很多Controller里面就是这样的写法,入switch case 块里面做 foreach ,foreach里面进行if else判断等等。

3、代码非常冗余


//导出excel列表
$import_excel=$params['import_excel'];
if ($import_excel == 1)
{
C ( 'SHOW_PAGE_TRACE', false );
header ( 'Content-Type: application/vnd.ms-excel' );
header ( 'Content-Disposition: attachment;filename=excel.xls' );
header ( 'Cache-Control: max-age=0' );
}

 

这是一段简单的excel导出代码,几乎每一个Controller里面都可能有这个需求,但是这段代码居然是每创建一个Controller就重新复制一遍。天哪你崩溃了吗,很简单的一个解决办法在父控制器类里面加入一个方法,子控制器有需要的调用该方法即可。


/**
* 查询list导出为excel
* @param int $import_excel
* @param string $outname
* @author Lei
* @time 2013-10-10 13:56:30
*/
protected function headerExcel($import_excel, $outname){
if ($import_excel == 1) {
C ( 'SHOW_PAGE_TRACE', false );
header ( 'Content-Type: application/vnd.ms-excel' );
header ( 'Content-Disposition: attachment;filename='.$outname.'.xls' );
header ( 'Cache-Control: max-age=0' );
}
}

 

同样还有很多地方的代码相当冗余,几乎每一个类文件里面都包含那几个方法,差别的只有对应的参数值。

4、条件分支被大量滥用

$table_name="";
if($this->partition=='1'){
$table_name=C("DB_PREFIX").$this->tablename.date("Ymd",strtotime($date));
if(empty($mksql_array[$table_name])){
$_makesql=str_replace("{TABLE_NAME}",$table_name,$this->_makesql);
$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='".C("DB_NAME")."' and  TABLE_NAME ='".$table_name."'";
$tablelist = $model->query($sql);
if(empty($tablelist)){
$model->query($_makesql);
}
$mksql_array[$table_name]=1;
}

}elseif($this->partition=='2'){
$table_name=C("DB_PREFIX").$this->tablename.date("Ym",strtotime($date));
if(empty($mksql_array[$table_name])){

$_makesql=str_replace("{TABLE_NAME}",$table_name,$this->_makesql);

$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='".C("DB_NAME")."' and  TABLE_NAME ='".$table_name."'";
$tablelist = $model->query($sql);
if(empty($tablelist)){
$model->query($_makesql);
}
$mksql_array[$table_name]=1;
}
}else{
$table_name=C("DB_PREFIX").$this->tablename;
if(empty($mksql_array[$table_name])){
$_makesql=str_replace("{TABLE_NAME}",$table_name,$this->_makesql);
$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='".C("DB_NAME")."' and  TABLE_NAME ='".$table_name."'";
$tablelist = $model->query($sql);
if(empty($tablelist)){
$model->query($_makesql);
}
$mksql_array[$table_name]=1;
}
$table_name=C("DB_PREFIX").$this->tablename;
}

 

你会看到这里的if else 里面的块代码就是一模一样的,只是上面的一个参数差别。显而易见的是我们可以写一个函数把参数传递进去即可。


/**
* 检测以及创建对应的logtable
*
* @param string $date
* @return string
* @author Lei.Lu
*/
protected function createLogTable($date){
$model = M ();
static $mksql_array = array ();
$table_name = "";

$dbprefix = C ( "DB_PREFIX" );

switch ($this->partition){
case '1':
$table_name = $dbprefix . $this->tablename . date ( "Ymd", strtotime ( $date ) );
break;
case '2':
$table_name = $dbprefix . $this->tablename . date ( "Ym", strtotime ( $date ) );
break;
default:
$table_name = $dbprefix . $this->tablename;
}

if (empty ( $mksql_array [$table_name] )) {
$_makesql = str_replace ( "{TABLE_NAME}", $table_name, $this->_makesql );
$sql = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES where `TABLE_SCHEMA`='" . C ( "DB_NAME" ) . "' and  TABLE_NAME ='" . $table_name . "'";
$tablelist = $model->query ( $sql );
if (empty ( $tablelist )) {
$model->query ( $_makesql );
}
$mksql_array [$table_name] = 1;
}

return $table_name;
}

5、各种不规范的地方

代码逻辑不用了,注释起来。不删除

这样的变量赋值

╮(╯▽╰)╭

魔法数字的滥用,写到哪个就是哪个

代码格式的不规范;变量、方法名的命名一会拼音,一会英文;单点登录的用户信息数据传输不加密。。。等等

 

总体而言,代码作者的完成意识一切以功能出来为主,在controller里想到哪写到哪,没有代码分块,系统MVC分层的概念,Model、module更不会用。更不用说那些规范方面的问题了,让人有各种糟糕的感觉。

 

尽管如此,但是我还是得坚持。

不过也不能说明这个cms就是一无所用的,存在即为合理,看来确实如此,所在部门包括我就两个程序,其他都是小白,如一个网页缓存没刷开页面都不知道怎么解决的那些人是不考虑这些问题的,既然在这里要求他人改变,他人不改变那么我也只好自己保持自我,直到不用忍耐的那天。

 

论工作积极性的问题

上班快4年了。我的看法是工作积极性的问题是一个很重要的事情。好比在一个公司你的职位不是那么重要,你的作用不是那么大,最关键的是你还不喜欢这个工作。但是你的工作态度好,积极向上,那么人家自然不会忽视你的。反过来说,你既然不是那么喜欢这个工作,工作积极度也自然不会有多大的提高。这样就是一个循环了,恶性循环。

 

很像我现在的处境,不过可能目前我的处境更糟糕一些吧,连工作积极性都没有了。三天两头的迟到,我知道这很不好。所以我决定抛开喜欢或者不喜欢,有意义或者没有意义的角度来看这个工作。短期来说我从这个工作里面创造了价值,实现自己的价值,对应的每个月会收到那些报酬月薪。长期来说,从事一个你所不喜欢和你认为无聊的工作真的很难受啊。(所以暂时不讨论长期工作的好处了)不过既然是抛开喜欢不喜欢、有意义无意义的问题来谈论,那还是说点工作价值产生的问题。工作的价值是什么呢,我的理解是为老板创造了价值,老板给你发钱,理论上来说你为老板创造的价值越大,你收到老板的钱就越多,这是成正比的。不过不全是,当你认为你的创造的价值超过你的回报你会心思难安,心生去意。当老板认为你创造的价值小于给你的回报他会考虑开掉你换个人。以上的情况一般出在一个岗位上面待到1-2年的时候。也就是1-2年内在这个岗位上面你创造的价值没有变化,那双方一定会有变化。好了,那现在再回到工作积极性的问题,如果一个人在工作不积极的情况下,如迟到、不合群,早退等。创造的价值还是 一个很稳定的值,没有升没有减,那么这样的一个人到底会怎样呢?

一个很有能力的员工,经常迟到,应该予以辞退吗?

我想在知乎这个问答的逻辑中,这样的一个人一定会被开掉。所以结论就是我继续这样下去一定会被开掉。当然我现在为了避免这样的情况发生,那必然的是创造的价值要高于现在的,工作积极性要必然的高于现在的状态。更正这个积极性的第一步必然就是征服迟到。迟到且不牛逼有不合群的人一定不会讨人喜欢早晚得开掉,相反要是你又迟到又合群关键是又牛逼那么你一定很受人的喜欢(貌似以前那个人就是这样吧)。

所以现在要做的是征!服!迟!到!