2012年1月15日 | 分类: 随想 | 标签:

这一年,学习的心态也发生了很多变化,小小地总结一下一些心得:

不纠结

技术层面,这一年很长一段时间内,我基本都是扮演着“哪里需要去哪里”的角色,到下半年才慢慢稳定下来,专注与相对后端、数据分析和运维。和很多人一样,一开始我也对语言这种东西很看重,有一段时间,也很喜欢看各个语言支持者之间的骂仗,不过现在已经坦然,特别赞同Coolshell那一句话:

软件的精髓不在于你对系统底层有多了解,也不在语言层面,而是在于设计和架构,而设计和架构这种东西只能靠多想多看”(出处

坦白说,相对于很多从高中慎重初中就开始接触计算机编程的人来说,很长一段时间,我是打心里自卑的,我初三开始接触计算机的时候,我们村拥有的PC机用手指就可以数出来,那个时候真是一个幸福快乐的小孩,没有人指导,书籍匮乏,就到二手书摊淘那些过期的计算机期刊,高考也就非常自然而然地选择了计算机相关的专业,那个时候也就是一个玩玩Linux、用Dreamweaver做做网页的小孩,进入大学,最先熟悉的语言是PHP,简单明了的语法让我印象深刻,并且最重要的是我可以用它去快速实现自己的想法,后来是Python,有一段时间都会很在意那些大家推崇的语言和技术,可能跟那份潜藏在心底的“自卑”有关,很幸运的是,这个阶段看了很多书,比如《Unix编程思想》,算是比较深入地学习了一个web框架(cakePHP),得益与那份自卑带来的对知识的渴望,订阅了很多博客,知识面得到了很大的拓展,也就不会纠结于语言和技术的问题,可以踏踏实实地去做事情。

这一年,由于性能方面的需要,用C写了一个Nginx模块,用C/Python写了一个任务分发系统(后来用Go进行了重写),在做这些工作的时候,写PHP的经验给我很大的帮助,很快地就可以完成另外一门语言的入门。

产品层面,不纠结竞争对手的节奏,不纠结竞争对手的抄袭或者干扰也是很重要的,跟随只会乱了自己的节奏,纠结也只是阻碍自己的进步,只有不纠结,坦然面对了,抓住自己的核心了,才能形成自己的节奏,一步一个脚印走下去。

只做核心的事情

对于技术型创业团队来说,采用成熟的技术方案还是自己开发,我们往往很容易陷入对这个问题的纠结。在构建我们系统的过程中,我们大量地采用开源或者其他现成的解决方案:Redis,MongoDB,AWS等等,将精力集中在最为重要的地方。我们也曾经纠结与是否构建自己的Hadoop集群,当时我和一位实习生研究了很久,尝试构建我们自己的集群,但是发现运维成本相当高,最后果断选择了AWS EMR。真的很感谢AMAZON这样一个伟大的公司,为我们创业者提供了一个伟大的平台。

技术选型要“只做核心的事情”,产品上面也是一样,最重要的是专注,最难的也是专注,我们也曾经头脑发热过,把大量的资源浪费在不应该的地方,但是没有磕碰过,也就不会知道专注的可贵。总结来说,做一件事情之前,一定要沉淀一下,不要头脑发热,可以把事情化解成一个个关键问题,解答好每一个关键问题,看看是否符合预期,是否符合大方向,再考虑做不做和怎么做。

停止抱怨,解决问题

在公司里面,对于低效的会议大家一定深恶痛绝,开会真的是一门艺术,组织得好则高效且富有成果,组织得不好不仅浪费时间且往往没有任何成果。我们也有这样一段开无效会议的时间,有讨论没结果,还好的是我们就是这样一群不安分的人,只要做的不对,就会有人站出来,提出解决方案,帮助大家改进,分享一下我们的例会经验:

  1. 每周都有人固定收集需求和反馈的问题,提炼问题,问题分为Q&A类,需求方案确定类,议题讨论类。
  2. 每周开会前提前收集内部和外部的讨论议题(比如晚上开会,则上午开始收集),议题要清楚且准确地要达到的目的。
  3. 开会前要提前把要讨论的问题整理成邮件发给所有参会人。
  4. 每次开会需要有一个主持人,会议顺序:
    1. Q&A问题开始:给出明确的答复。
    2. 需求方案确定类:给出各个方案的优势劣势,确定方案及实施方法。
    3. 议题讨论类:议题提出者需要阐述提出议题的目的,确立一些边界问题,最好是分解成具体的问题,再进行分问题解答。
    4. 会引起长时间争论或者暂时无法解决的问题则开邮件讨论。
  5. 总的原则是,对于Q&A,需求或者议题都好,描述一定要尽可能地清楚,讨论之后一定要给出总结,超过一定时间的问题都另开邮件讨论。
  6. 开完会之后主持人要把会议讨论的问题和达成的措施发邮件给所有参会人确认。
  7. 例会控制在一个小时内,可提前不可拖后。

这里以会议为例子,是想说明一个问题:对于存在的问题,除了抱怨,更应该想办法去解决它,很高兴能够在这样一个敏感的团队里面,在意思到开会的问题之后,大家就自觉的开始寻找方法去优化它,上面也算是我们的一点经验。所以“保持敏感”这一点我觉得很重要,当然,敏感之余,要做的是想想怎么去解决问题,而不是抱怨,抱怨是解决不了任何问题的。
———————

重读了一下,文字还是很稚嫩,希望大家见谅:)

2012年1月15日 | 分类: 随想 | 标签: ,

距离我的上一篇博文已经是一年前的事情,这一年发生了很多事情,对我来说也是极为重要的一年(一辈子都不会忘记的那种),就在前天晚上的这个时候,我们部门还在为昨天的年后准备节目,小谢推荐我们唱《最初的梦想》,虽然最后没有唱成(对于我们这群技术宅来说,这歌难度不是一般高),虽然之前也听过很多次,但是这次认真地看了一下歌词,颇有感触(技术青年偶尔也会文艺一下):

如果骄傲没被现实大海冷能拍下
又怎会懂得要多努力才走得到远方
如果梦想不曾坠落悬崖千钧一发
又怎会晓得执着的人有隐形翅牓

沮丧时总会明显感到孤独的重量
多渴望懂得的人给些温暖借个肩膀
很高兴一路上我们的默契那么长
穿过风又绕个弯心还连着
像往常一样最初的梦想紧握在手上

抉择 – 艰难的选择

2010年9月份的时候,我从国内某大公司实习回到了有米,10月份是最令人纠结的一个月,想必跟我同届毕业的同学都深有感触,那一年的校园招聘相当火爆,也是开复老师到处宣传“电子商务、移动互联网、云计算”的日子,我们几个人刚刚实习归来,奋斗还是安逸,这是我(准确来说,是我们)当时要面对的最直接的问题,听多了太多大学生创业失败和工作得经验再创业的“理论”,说不犹豫不纠结那是假的,做了很久的思想斗争,最后我们还是决定留下。做出决定的那一个下午,刚好去参加学校的某交流会,当时一位刚从腾讯实习回来的同学聊到毕业抉择时,抛出了一个问题:“想想10年后你是否会为今天的决定而后悔”,这对我触动很大(直到后来跟几位犹豫要不要留下来的实习生交流的时候,我都会提出这个问题,这个是后话了),这让我几乎是立刻做了决定,回到公司的小会议室,如果没记错的话,刚坐下来我就说了我的决定,另外几个人当时也做了同样的决定,这让我大大地松了一个口气,真的很感激他们,这一辈子,能够跟几位志同道合的人一起奋斗成长,也算值了。

成长 – 快乐地奋斗

卸下心头的包袱之后,也就全身心投入到工作当中,当时公司十几个人挤在一个像网吧的小屋子里面,最幸福的事情就是看着网站上面的投放次数不断地再增长,从几百万到上亿,像一群天真的小孩,每个人身上所表现出来的坚定、执着和兴奋,不自觉地感染其他人。从一个程序员的角度来说,最幸福的事情莫过于看着系统从小到大,就像呵护着自己的小孩一样。我们经历了所有互联网系统必经的阶段,从简单的系统结构开始,分离数据库、数据缓存、任务队列、负载均衡到采用Hadoop、Hive做数据分析等等,学习和快速成长给我带来了很多在大公司无法得到的快乐。

毕业 – 迟到的感谢

6月,毕业季,想起来,这是让我略有遗憾的一段,但是我几乎把所有的时间都投入到了公司,也搬了出学校,虽然离学校不远,但是也极少回去,现在想想,有点愧对同宿舍的那帮好友:刀爷、杜毛、大建,非常感谢他们对我这样一个有段时间经常晚上跑到活动室写代码写到晚上两点吵到他们睡觉,或者经常要麻烦他们帮忙逃课,或者因为工作而推掉跟他们聚餐的人的支持和理解。还有波波、勇爷、JS、WS,感谢chandy和zk,能够让我在大学遇到他们,这是改变我一生的一次相遇,波波的责任心、勇爷的沉稳、JS的执着、WS的激情,都让我受益颇丰,非常感谢他们能够理解和支持我这样一个脾气火爆且又强势的人。

遗憾与祝福

最遗憾和最痛心的还是对于那些一起奋斗过但是最终无法一起继续共事的人,虽然无法共事,但是作为朋友,看到你们这一年的成长,也非常替你们高兴。我们曾经有一段时期,进行了比较大的扩张,招了实习生,很多我们看好的最终没有留下,这是让我非常遗撼的事情,这里面我要负很大一部分的责任,那个时候我们没有好好关注他们的成长,也只能在这里表示抱歉了。祝福你们能够成为你们所在领域的大能:),当然,最重要的还是快乐地享受生活。

2010年12月15日 | 分类: 分布式 | 标签:

随着项目的发展,我们需要一个高可用性的缓存系统。在对比了memcache和几个流行的key/value数据库之后,我们最终选择了redis。redis绝对是个好东西。用redis之前,推荐看一下下面这几篇文章:

使用php操作redis有好几个选择,个人推荐 Rediskaphpredis,其中Rediska是一个纯php实现的类库,如果你需要多台服务器组建一个redis集群的话,推荐用这个,它支持基于CRC32的一致性哈希算法的分布式集群构建,另外也可以自己实现自己的分布式算法。而phpredis则是一个php的c扩展,需要自己编译然后在生产环境中加载,相比Rediska好处就是速度快一点,最终我们选择了phpredis,我们的项目对性能的要求还是比较苛刻一点,暂时也不需要构建一个集群。

另外,我们的项目特点比较特殊,对于value需要频繁修改,所以我自己在自己的机器上面小测了一下,使用的是redis的hash列表数据结构还有phpredis:

测试环境:
CPU:model name    : Intel(R) Pentium(R) Dual  CPU  T2370  @ 1.73GHz
redis 2.01
phpredis (用来访问redis的扩展)

主要模拟了1K个应用在10W个修改的情况,测试结果:
10W个修改:
real    0m11.930s
user    0m2.976s
sys    0m3.856s

CPU:50%~60% MEM:1.5M+

从这个表现来看,基本上可以支撑1W+/s的并发修改场景,完全可以满足我们的需求了。

<?php
$app_cnt = 1000;                       // 模拟的应用数
$test_cnt = 100000;                     // 模拟的访问次数
 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$start_time_a = microtime();
for ($i = 0; $i < $test_cnt; $i++) {
  $key = 'app_' . rand(1, $app_cnt);
  if ($redis->exists($key)) {
    $redis->hIncrBy($key, 'req', 1);
  }
  else {
    $redis->hMSet($key, array(
      'a' => 0,
      'b' => 0,
      'c' => 0,
      'd' => time() + 60,
      'e' => 0,
      'f' => 0,
      'g' => 0)
    );
    $redis->hIncrBy($key, 'req', 1);
  }
}
$end_time_a = microtime();
$time = $end_time_a - $start_time_a;
printf('all time:%s \n', $time);
$redis->close();
?>
2010年11月2日 | 分类: 编程随想 | 标签: , , ,

这两个框架应该是我最为熟悉的两个WEB开发框架,分属Python和PHP两个阵营的两个具有代表性的开发框架。不过近一段时间主要是在用Cake。性能方面一直是我比较关心的,今天无意中挖掘到一篇各大开发框架的评测文章,这里放一下最后的结果:

从上面的图表比较而言,Django还是很NB的,CakePHP有点惨不忍睹,不过对于WEB项目来说,在没有达到一定量的时候,语言往往不是瓶颈,还是要把力气用在刀刃上面,片面追求开发框架的效率也是不行的。

附上相关文章的地址:

2010年7月10日 | 分类: 编程随想 | 标签: ,

上次KNSS团队内部交流,分享了一下自己的知识获取思路、方法以及相关工具,大家的反映还不错,但是当时分享的时候思路比较混乱,只是临时写了个提纲,所以一直想将这些东西整理一下,无奈前段时间考试、课程设计等等一堆事情。这两天整理了一下思路,写一下。同时欢迎大家评论补充分享自己的知识管理的方法。

背景

从我的角度来说,对于知识的获取,总是在遵循着“自我补全”的这一原则,对于自己感兴趣的领域,希望自己能够有一个全方位的了解,不一定要全部都深入的了解,但是当需要的时候,自己能够快速地找到相关知识,这是很有必要的。但是,知识的零散促使我们需要知识管理工具来进行记录和组织,当然根据知识的来源、类型等等,我们需要用不同的工具来进行记录组织。

过程

纯粹自己的总结:分析 – 提炼 – 挖掘 – 记录

分析

首先要分析自己需要什么知识,这个遵循上面提到的“自我补全”的原则,比如对于我自己来说,我对WEB应用有着相当浓厚的兴趣,在未进大学之前,略学过一点网页设计(HTML)和Linux,那么我进大学之后急需的就是加强对HTML以及相关的动态网页开发能力,还有就是对WEB服务器的实际操作部署等等。

提炼

提炼,当然就是根据上面的分析结果,提炼出自己最为需要知道的,将他们简化为一个个问题,将这些问题解决,那么就完成了提炼的工作了。在我开始学PHP的时候,最为迫切的肯定是要去了解网页是怎么由PHP生成的,WEB应用的开发流程是怎样的,怎么让自己写的应用跑起来,需要什么服务器环境。

挖掘

仅仅是解决问题还是不够的,举一反三,深入挖掘才能知道一些有趣的东西(经常是更加有用的东西),停留在表层只会让自己更加肤浅。同样类似与上面的问题,我们深入挖掘一下,比如“怎么让应用跑起来?”我们可以深究为“怎么让应用在多台服务器上面跑起来?如何做负载均衡?如果应用有错,如何回滚?怎么样快速将应用部署到多台服务器上面”,看似简单的问题,深究一下,会有更多有挑战性的问题可以去思考。

记录

“好记性不如烂笔头”,将自己获取的知识记录下来,是很有用的,这不仅仅只是方便到以后查找的方便,在记录整理知识的过程,本身就是一个回归思考的过程,可以让自己的思路更加清晰。对于自己的心得或者想法,博客是一个不二的选择,写博客不是为了追求什么知名度啊之类的,想想你写的东西会让别人看到,你就会更加负责人去整理自己的思路。总而言之:“一件事情,如果你不能说清楚,十有八九你就做不好

工具

列举一下一些有用的工具以及自己的心得:

Evernote – 随时随地的笔记

官方网站:http://www.evernote.com

更加详细介绍看善用佳软:http://xbeta.info/tag/evernote

Evernote是一个很好的笔记型软件,标签、全文搜索,用来管理知识是相当方便的,最重要的是提供了很多手机客户端(iPhone,Android,BlackBerry…)不过由于我大部分时间用教育网,同步起来不方便,使用这个软件并不是很长时间,所以不做过多评论,纯粹力荐。

Scrapbook – 收集网页、离线阅读

下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/427/

相当好用的Firefox扩展,用来收集网页上面的知识(特别是多级页面)非常方便,我现在使用的组合就是Scrapbook + Vimwiki的组合。因为经常需要到网上找一些手册之类的,大部分都是在线版本,对于这钟,用Scrapbook下载到本地,然后慢慢阅读,相当惬意。

Vim Wiki – 个人知识管理

(适用vim控 :D

项目地址:http://code.google.com/p/vimwiki/

善用佳软的教程:http://xbeta.info/vimwiki.htm

这个就不多说了,由于对VIM有强烈的依赖,所以这个VIM插件当仁不让成了我的首要个人笔记工具。

Calibre – 电子书、文献管理

官方网站:http://calibre-ebook.com/

开源,跨平台的电子书管理软件,星级、分类、搜索、标签应有尽有,对于经常下电子书,硬盘里面电子书一大堆的来说这个软件相当方便,另外一个特点就是可以将PDF转成mobi格式,跟电子书阅读器结合得很紧密。强烈推荐给使用Kindle或者其他电子书阅读器的同学。

日常积累

对于自己关注的领域,日常的积累相当重要,特别是对于IT行业,相信大家也明白这个道理,需要不断更新自己的知识,才能跟得上。总的来说,以RSS为中心,订阅相关的博客、标签到Google Reader。基本上就可以解决日常的知识积累问题。

两个好推荐

1. Delicious

在很多人眼里,Delicious大概只是一个网上书签而已,事实上,Delicious完全可以帮助我们获取到我们需要的知识,想想看,对于相关标签里面的条目的推荐,基本上可以是对这个表情所在领域最新动态的一个体现。因此,想了解哪个领域,就去订阅哪个标签吧,对于页面重构工程师,CSS和HTML标签是一定要订阅了 :)

2. Reddit

Reddit的programming频道,力荐

http://www.reddit.com/r/programming/

2010年4月16日 | 分类: 大学生活 | 标签: ,

很久没写博客了。寒假回来之后就跟团队其他人一起混在一起开发项目,现在,我们决定一起写博客啦。

我们是华南理工大学在校的5名大学生, 很喜欢开发WEB应用,喜欢VIM,喜欢FIREFOX,喜欢LINUX…… 因而走到了一起来。在日常的合作中,建立了深厚的友谊,碰到过很多技术问题,所以我们创建了这个博客来记录我们的点点滴滴收获,与大家一起分享我们的进步。

http://weknss.com

2010年2月13日 | 分类: WEB2.0生活 | 标签:

好吧,实在忍受不住某空间商的办事风格,本来在国内应该还算是不错的空间商,数据都没有备份就敢搬运服务器,就不点名批评了。

大年30了,因为种种原因回不了家,一个人在北京过春节,这应该是人生的第一次吧。

好啦,祝朋友们以及订阅此博客的网友们“新年快乐,虎虎生威”!

2010年1月16日 | 分类: 得力工具 | 标签: , , ,

1.去掉Firefox默认菜单栏、工具栏、收藏栏

Vimperator未出世之前,就一直想扩大Firefox的页面显示空间,特别是到了宽屏时代,这种需求愈发强烈。Vimperator解决了我大多数需求,并且对于像我这种VIM控的人来说,这本身就是福音。但是Vimperator与某些扩展结合起来之后,用得不是很顺,特别一些辅助WEB开发的扩展,比如Live Http Headers。或者Read it Later这种扩展。后来发现使用Google工具栏的Firefox版本作为载体,用来放相关扩展的按钮,是一个很不错的方案。

实现方法很简单,先用”set guioptions+=mT”命令调出Firefox默认的标题栏和工具栏,右键点击工具栏的空白处,选择定制,再把你需要的按钮拖放到Google工具栏上面,最后隐藏掉标题栏和工具栏即可。

2.自动隐藏Vimperator命令输入框

在使用Vimperator的时候我们频繁地使用到Vimperator的命令输入框,这个可以通过Vimperator的一个插件来实现自动隐藏,等我们输入命令的时候它才会出现。这个需要Maine Coon以及它依赖的库_libly,根据Vimperator版本来选择相应的插件以及库版本,Linux用户放到.vimperator/plugin目录下面,WIndows用户放到用户目录下面的vimperator/plugin目录下,没有就创建相关目录。

3.自动隐藏Firefox状态栏

这个推荐使用autoHideStatusBar,让状态栏只在鼠标移到链接上面、载入页面的时候出现。大大地扩展了Firefox的页面显示空间。

2010年1月7日 | 分类: 编程随想 | 标签: , ,

由于博客所在IDC的种种原因,这一篇本来应该在2009年12月31号的博文到现在才发。

小结了一下,2009年那一年:

4月份:

离开了百步梯,这是一个新的开始。

7月份~11月份:

加入到某创业公司的主站研发,很惭愧,技术是我主导的,虽然最后网站做出来了,但是充斥着随心所欲更改需求的伤痕。最后,公司由于各种原因在2009年最后一天清算,看着自己几个月的心血就这样没了,我和我的同伴们都感到很伤感。

12月份:

借着参加某国内高校开源创新大赛的契机(最后得了个二等奖,有点不服,呵呵^^,不过本来就不大重要),我们几个人利用了期末考试时间的晚上时间(3个星期的晚上),做了一个山寨Basecamp。当然,现在还是相当粗糙的,我们的本意是能够用脑图来辅助进行项目管理和规划,但是完全实现还是需要一定的时间。

项目地址:http://code.google.com/p/itaskit

关于这个项目的详细情况,另写博文介绍。

另外,参加了一次广州技术沙龙,收获颇多,感谢开源的人们。借着上面的项目,我们也希望能够奉献点微博之力。

2010年,大概有这么几件事要做:

1.把itaskit这个开源项目完善了

2.利用空余时间做点小东西(具体保密^^)

3.暑假找一份好的实习(大三下了,是该找实习了)

4.最后,当然是在2010年找到自己喜欢的工作

2010年1月6日 | 分类: 编程随想 | 标签:

不想说太多,经过一个多星期,博客总算能够恢复并且能够正常使用了,接下来,是应该好好珍惜了。。

Page 1 of 1012345...10...Last »