很久之前给程序员杂志写的一篇IT思考的文章,今天发出来与大家共勉!
关于加班,在很久之前我就想说说这件事。因为我是个天性不太喜欢守旧的人,对于OT(overtime)这件事总觉得有几句话要说。
日本人的工作态度算是时间罕有,而经济的崛起自然是跟勤勤恳恳、一丝不苟的工作态度大有关系。虽说我对台湾不是很熟,但是我常常一遇到台湾朋友就对他们讲:"晚上两点多,我MSN只有两种人还在线:一种是不在我这个时区的人,一种就是台湾人。"半夜一排台湾的朋友MSN在线,蔚为壮观。
因此,我开始把这段时间对于OT这件事的思考提出来供大家讨论。
为什么要OT?台湾的朋友可能觉得,在大环境不是那么理想,尤其是韩国的科技业发展迅速的时候,再不拼命工作就很难迎头赶上,曾经的优势不再。而大陆这几年慢慢随着产业升级,除了公务员上班时间奇短无比之外,其他公司纷纷开始加班了��我刚工作的时候很多公司都还是蛮正常的作息,直到今年有一天我致电多位朋友,晚上七点多,纷纷告诉我都在加班。
当加班成了一种常态之后,我不禁想问,这合理吗?
台湾的公司,"上班打卡制、下班责任制",我的台湾朋友中有人对我说:"这是当兵之后留下的传统",也有台湾朋友对我说:"对,这就是以后欧美人会比不过我们的原因,因为他们不努力",而这两位朋友是表兄弟。
我想说的是,OT不应该是一种常态,更不应该是无薪加班。
当大家都认为加班是一种上班族不得不叹苦却回避不了的文化时,我认为整个行业的竞争力都在丧失。其一,我们不缺少劳动力,哪怕是智力密集型的行业。其二,若公司业务不稳定导致有时加班有时不加班,这家公司本身的竞争力就很成问题。其三,若只是临时突发的事件需要加班,那凭什么不给额外的薪水?
若这家公司是创业型公司,员工全员持股,每个关键岗位上都是一夫当关万夫莫开,那的确是不可避免,但是又引来一个问题,是否合理规划过每个岗位上的工作量?以我自己的经验,由于很多工作都是有一个紧前工序,有时的加班并不是事情多到做不完,而是因为必须是在前面的人把东西给你之后你才能完成因而不得不留下加班。这是非常不合理的。
当IT公司的高薪水把应届学生的眼睛蒙蔽时,过劳死也找上了这个群体。加班究竟是为了什么?如果加班是常态,公司为什么不能增加雇员?若抱持5个人的活3个人干,再给他们加30%薪水更省成本的做法去压榨劳动力,真的是科技产业的悲哀。创意来源于生活,连思考都透不过气来的公司不会是真正受尊敬的企业。
当大家都觉得加班没什么好抱怨的时候,我想问:加班是员工觉得大家目标一致很有干劲的加班,而是相关负责人觉得应该加班?有没有真正去了解过士气?
当我们热衷于加班文化的时候,欧美人出点子,亚洲人出时间,看似和谐的工作关系链条。能否真正走向平等?当大家都觉得有想法有创意的人才难找,任劳任怨的员工才是最合用的时候,有没有想过你想要的员工是不是就在你的公司里而你却安排他做无休止的机械工作?内部挖潜过没有?
而正因为有了OT,很多事情大家反而做得不疾不徐。因为晚上还要加班,现在再拼也不能早回家。当同样的程序同样的功能实现,国外的网站寥寥数行的代码(他们有时间去钻研更好的方法)时,国内的公司还在请人以最便宜的价格来山寨,混乱不堪在键盘上敲着,无从去思考更好的方法。
当国外在做创新的广告形式让我们啧啧惊叹时,我们还在雇佣着水军反复的转帖、删帖、建马甲号、软文,试图用人海战术来代替一个好创意、好点子、好执行。
创意无涯,时间有尽头,人不是机器,加班带不来竞争力,总有一天,世界上某个地方的员工,他比你的薪水要求更低��就好像我们的邻国发生的那样。
想要真正的使自己的公司强大起来,注重方法,合理安排工作量,将不必要的工作外包出去让更专业的人来做,这才是真正的解决之道。亚当斯密几百年前就说过的事情,时至今日,还是有很多人知而不为。
本文出自 "技术成就梦想" 博客,请务必保留此出处http://ixdba.blog.51cto.com/2895551/1585029
在写SQL中,经常会有诸如更新了一行记录,之后要获取更新过的这一行。 本身从程序来说,没啥难度,大不了把这行缓存起来,完了直接访问。 但是从数据库的角度出发,怎么能快速的拿出来,而又不对原表进行二次扫描? 比如其他数据库提供了如下的语法来实现:
返回更新掉的行:
t_girl=# update t1 set log_time = now() where id in (1,2,3) returning *; id | log_time ----+---------------------------- 1 | 2014-11-26 11:06:53.555217 2 | 2014-11-26 11:06:53.555217 3 | 2014-11-26 11:06:53.555217 (3 rows) UPDATE 3 Time: 6.991 ms
返回删除掉的行:
t_girl=# delete from t1 where id < 2 returning *; id | log_time ----+---------------------------- 1 | 2014-11-26 11:06:53.555217 (1 row) DELETE 1 Time: 6.042 ms
返回插入后的行:
t_girl=# insert into t1 select 1,now() returning *; id | log_time ----+---------------------------- 1 | 2014-11-26 11:07:40.431766 (1 row) INSERT 0 1 Time: 6.107 ms t_girl=#
那在MySQL里如何实现呢?
我可以创建几张内存表来来保存这些返回值,如下:
CREATE TABLE t1_insert ENGINE MEMORY SELECT * FROM t1 WHERE FALSE; CREATE TABLE t1_update ENGINE MEMORY SELECT * FROM t1 WHERE FALSE; CREATE TABLE t1_delete ENGINE MEMORY SELECT * FROM t1 WHERE FALSE; ALTER TABLE t1_insert ADD PRIMARY KEY (id); ALTER TABLE t1_update ADD PRIMARY KEY (id); ALTER TABLE t1_delete ADD PRIMARY KEY (id);
以上建立了三张表来存放对应的操作。 t1_insert 保存插入;t1_update 保存更新;t1_delete 保存删除。
那这样的话,我来创建对应的触发器完成。
DELIMITER $$ USE `t_girl`$$ DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_insert_after`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `tr_t1_insert_after` AFTER INSERT ON `t1` FOR EACH ROW BEGIN REPLACE INTO t1_insert VALUES (new.id,new.log_time); END; $$ DELIMITER ;
DELIMITER $$ USE `t_girl`$$ DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_update_after`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `tr_t1_update_after` AFTER UPDATE ON `t1` FOR EACH ROW BEGIN REPLACE INTO t1_update VALUES (new.id,new.log_time); END; $$ DELIMITER ;
DELIMITER $$ USE `t_girl`$$ DROP TRIGGER /*!50032 IF EXISTS */ `tr_t1_delete_after`$$ CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `tr_t1_delete_after` AFTER DELETE ON `t1` FOR EACH ROW BEGIN REPLACE INTO t1_delete VALUES (old.id,old.log_time);; END; $$ DELIMITER ;
创建好了以上的表和触发器后, 拿到返回值就非常容易了, 我直接从以上几张表来查询就是。
我现在来演示:
更新:
mysql> truncate table t1_update; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE t1 SET log_time = NOW() WHERE id < 15; Query OK, 3 rows affected (0.01 sec) Rows matched: 3 Changed: 3 Warnings: 0
获取更新记录:
mysql> select * from t1_update; +----+----------------------------+ | id | log_time | +----+----------------------------+ | 12 | 2014-11-26 13:38:06.000000 | | 13 | 2014-11-26 13:38:06.000000 | | 14 | 2014-11-26 13:38:06.000000 | +----+----------------------------+ 3 rows in set (0.00 sec)
插入:
mysql> truncate table t1_insert; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t1 VALUES (1,NOW()); Query OK, 1 row affected (0.08 sec)
获取插入记录:
mysql> select * from t1_insert; +----+----------------------------+ | id | log_time | +----+----------------------------+ | 1 | 2014-11-26 13:38:06.000000 | +----+----------------------------+ 1 row in set (0.00 sec)
删除:
mysql> truncate table t1_delete; Query OK, 0 rows affected (0.00 sec) mysql> DELETE FROM t1 WHERE id < 15; Query OK, 4 rows affected (0.01 sec)
获取删除记录:
mysql> select * from t1_delete; +----+----------------------------+ id log_time +----+----------------------------+ 1 2014-11-26 13:38:06.000000 12 2014-11-26 13:38:06.000000 13 2014-11-26 13:38:06.000000 14 2014-11-26 13:38:06.000000 +----+----------------------------+ 4 rows in set (0.00 sec)
本文出自 "上帝,咱们不见不散!" 博客,请务必保留此出处http://yueliangdao0608.blog.51cto.com/397025/1584932
没有评论:
发表评论