敏捷精神:一种把以人为本、团队合作、快速响应变化和可工作的软件作为宗旨的开发方法
一. 态度决定一切
选定了要走的路,就是选定了字通往的目的地。
- 1. 做事: 指责不会修复bug, 把矛头对准问题解决的方法,而不是人。一个重大的错误应该被当作是一次学习而不是指责他人的机会。团队成员在一起工作,应相互帮助,而不是相互指责。
- 2. 欲速则不达:不要因为时间紧迫给自己找接口,而坠入快速简单的修复之中。在没有真正解理代码之前,不要急于进行bug修复。必须要投入时间和精力来了解代码是如何工作的,保证修复后的代码是整洁、敞亮的,修复本身是没有副作用的。
- 3. 对事不对人:每个人都会有好的想法,也会有不对的想法,团队中的每个人都需要自由地表达观点。让我们骄傲的应该是解决了问题,而不是比较出谁的主意更好。团队leader既要做到不带个人情绪,又要做到不盲目接受所有观点。
- 4.排除万难,奋勇前进:做正确的事,要诚实,要有勇气说出实情。
阅读全文…
最近新做的系统刚刚上线,前段时间的努力终于有了阶段性的成果,可以小小的庆贺一下。当然,这只是题外话了,主要目的是为了引入今天的正题——Jquery和Highcharts。在进入正式的内容之前,有必要先简单介绍一下jQuery和Highcharts分别是什么:
jQuery (http://jquery.com)
jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.
(jQuery是一个快速、简洁的Javascript库,它的主要功能是简化Html文档的遍历、事件处理、动画和ajax交互,从而加快web端的开发。jQuery设计的初衷是改变程序员使用Javascript写程序的方式。)
Highcharts (http://www.highcharts.com)
Highcharts is a charting library written in pure JavaScript, offering intuitive, interactive charts to your web site or web application. Highcharts currently supports line, spline, area, areaspline, column, bar, pie and scatter chart types.
(Highchars是一个用纯Javascript写的图表绘制的库,它可以为你的web app提供直观、交互式的图表。当前,用Highcharts可以实现直线图、曲线图、区域图、曲线区域图、柱状图、条形图、饼图、散点图等一系列的图表。) 阅读全文…
过去的半年,陆陆续续看过不少新同学写的代码,自己也写了不少代码。在这过程中,还是有不少感触的。我们知道,定时器(Timer)在程序中的是非常有用的一种utility。今天这篇文章,就结合自己看代码、写代码过程中的一些经验,来谈谈定时器的使用,包括基本的用法,还有使用过程中的一些误区。
在介绍定时器的使用之前,先简单介绍一下常见的定时器的实现。通常,定时器的是由一个单独的线程+一个最小堆来实现的。单独的线程基本上保证定时事件不被其他事件而阻塞,能够及时调度到,从而保证定时器的在时间上的“准确性”;用最小堆来做为核心的数据结构,主要是为了性能考虑,以时间为key,这样堆顶的元素就是最先到期的,因此每次check的时候,直接从堆顶开始check, 只到遇到第一个没到期的元素为止,这里的复杂度与在堆里的元素个数无关,可以看作是O(1)的,因此性能上还是比较有保障的。
接下来说说定时器的基本用法,通常情况下,定时器有两类主要的应用:一类是周期性的执行某个指定的动作;一类是延后特定的时间,执行指定的动作。第一类我们通常叫周期性定时器(PeriodTimer),第二类叫一次型定时器(OneshotTimer) 。 阅读全文…
做为一名linux后台开发工程师,每天面对着只有黑白两色的linux终端,你是否曾想过,让你的终端也能五彩斑斓起来,让每天的开发生活不再只是黑白那么的单调。只要你能想到,就一定会有实现的办法。接下来,我将一步步为你接开Linux终端显示彩色的神秘面纱。
1. 先照下面的例子,在你的终端操作,来一个直观的印象。

相信细心的朋友通过对比上面的例子,应该能看出上面的例子的一些特点,我在这里就不卖关子了,基本的格式是:
1
| echo "< ctrl-v >< escape >[xxmHello world< ctrl-v >< escape >[yym" |
其中,xx和yy分别是各种颜色的代码,通过它们可以来控制要显示的色彩的种类。在色彩码前面有三个特殊的字符,一个是< ctrl-v >,一个是< escape >,一个是[,这些都是必须的。 阅读全文…
1. 概述
HttpTuunnel(也叫Http隧道,Http穿梭),是这样一种技术: 它用HTTP协议在要通信的Client和Server建立起一条”Tunnel”,然后Client和Server之间的通信,都是在这条Tunnel的基础之上。
HttpTunnel通常被用在受限的网络环境中,比如在NAT环境中的Client,受防火墙限制的环境中的Client等,在这样的环境中,Client不能直接连接到公网(WAN)的Server,这时候就可以通过HttpTunnel技术,来解决上述问题。
2. 原理
阅读全文…
又一年过去了,每年到了年底的时候,总会感叹光阴比箭还快,离开家又整整一年了。回看了一下年初给自己制定的计划,感慨满满,总觉得要写点什么,来对过去的一年有个交待,那就写点什么吧。
首先说一下工作,过去的一年,是整个搜索后台大重构最重要的一年,从基础的云平台,到基本的搜索的后台,几乎都在重构。说实话,这一年大家都很累,但换个角度来讲,这对我们来说也是一个机会,一个深入了解搜索引擎后台各个系统的机会。从我个人的角度而言,这一年确实学到不少。下半年有幸以PM的身份,带领小团队做了其中的一个子系统。从项目整体的进度和质量来讲,还是令人满意的,期望后面接入业务后也能让人满意。从单纯的工程师,到PM的转变,对我来讲,是一种考验。单纯做为一名工程师,只要高质量地完成好自己所负责的模块,配合好与相关模块之间的调试即可;但是做为PM,同是也是工程师,一方面要完成好自己所负责的模块,另一方面,更重要的是协调好整个团队的资源,帮助团队成员一起成长。在这个期间,真正的感受到了“众人拾材火焰高”,大家共同成长,团队才会出成绩。另外,这期间,也确实发现了自身存在的一些问题,因为团队成员中大多是这两年新入职的毕业生,项目经验还相对比较少,所以有时候,出现一些这样那样的问题的时候,自己还是有点急性子了。事后自己也反省了一下,对新人更重要的是要耐心,耐心地帮助新人成长,当每个新人都成长起来,能独挡一面的时候,就是整个团队战斗力最强的时候。所以,这半年来讲,不仅是技术上的成长,更为感到欣慰的是,自己不再只是考虑只要做好自己就行了,更重要的是学会如何在做好自己的同时,处理好与团队成员之间的关系,与团队成员共同成长,这是职场中最为重要的财富。 阅读全文…
最近,用到了google-perftool分析程序的内存和CPU的使用情况,总结一下使用的一些方法和体会,分享给有需要的朋友。首先,说说google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分别介绍一下tcmalloc和profiler,然后再给出一些使用的例子,及一些使用时的注意事项。
1. tcmalloc
tcmalloc的全称是thread cache malloc,顾名思义,它是带有thread cache的内存管理工具,具体的实现细节这里不做过多的介绍,感兴趣的朋友可以参考google官方提供的文档,或者阅读源码。这里需要注明一下tcmalloc的一些优点,和它所提供的一些分析程序内存使用的一些功能。
tcmalloc的主要优点有两个方面,一个是内存allocate/deallocate的速度,通常情况下它的速度比glibc所提供的malloc要快;另一个方面是小内存(< =32K)的管理,它的小内存是在thread cache里面管理的,一方面减少了加锁的开销,另一方面用来表示小内存所用的额外的空间也比较小,比较节省空间。因此,对于多线程下,经常小内存的allocation/deallocation的程序(尤其多线程下使用STL比较多的程序),可以尝试使用一下tcmalloc。 阅读全文…
今天是Christmas, 首先向所有的亲人和朋友们道一声Merry Christmas,天气冷了,大家注意防寒。 早上,看到Cnbeta的头条是一个关于程序员的故事—-程序猿的HTML5圣诞礼物,讲的是一个程序员朋友用HTML5给自己女朋友做的一个Christmas礼物,想必所有的程序员朋友的GF看了都会有点暖暖的感觉。一直以来,听大家讲HTML5,自己也没去了解过,一个人的Christmas,正好了解一下HTML5。
1. 什么是HTML5?
HTML5是指新版本的HTML,最近的一个版本是4.01,于1999年发布,自此之后就没做过什么大的改动,HTML5是下一代的HTML。现在,HTML5的标准还没有正式发布,但是主流的浏览器(包括IE, Chrome, Firefox, Safari)等已陆续开始支持HTML5的特性了。 阅读全文…
近半年来,团队加入了不少新同学,陆陆续续也看过不少新同学写的代码,一个比较大的感受是,新同学程序的逻辑上问题不会太大,但是代码的封装方面,还是有明显的不足。具体主要包括以下几个方面,一是命名,包括类、函数、变量等的,一个好的名字,可以让读程序的人一看到它就大概知道它是做什么用的;二是函数、类的划分,哪些实体应该抽象为一个类,这个实体的那些功能该抽象成函数,这是程序设计中最为重要的内容;三是线程安全,在多线程环境下,线程安全是一个很重要的话题,很多时候因为封装的不合理,导致使用上的不方便,更为严重的是造成死锁等的问题。下面就分别从这三个方面,谈一些自己的看法,希望能够对初入职场的新同学有所帮助。
第一个方面是命名,这个是最为基本的内容。可以这样讲,把写程序比做写文章,命名对于程序的作用,就相当于措词对于文章,好的措词对于一篇好的文章的作用,不用我再多说。关于程序中的命名,主要包括三种,一是类型名,二是函数名,三是变量名。类型名在C++中应对的包括class, struct, enum等,它们都是抽象出来的一个实体,因此它们的名字最好是一个名词,或者名词词组,比如PCManager,它是一个PC管理器类型。 阅读全文…
熟悉printf/scanf的朋友应该对C/C++中的变参函数不陌生,它可以支持任意个数的参数。模板(template)在C++中的地位相信不用我再多说,但是,一直以来,C++模板不支持变参,这成了模板一个被诟病的地方,在很多使用场景限制了模板的威力。举例来说,同样语义的模板函数,因为参数个数不定,有若干个,这样的场景之下,我们只能通过枚举的方式来实现。这样的方法,一方面使得代码本身不够简洁,另一方面因为枚举只能做到有限个数的参数,还是在一定程度上限制了使用的灵活性。现在,C++0x引入了变参模板,上面讲的问题便迎刃而解了,这对C++程序员朋友们来说是莫大的福音。下面我们先看一个简单的例子,先对变参模板有一个直观的印象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include < iostream>
#include < string>
void Print()
{
std::cout < < "\n";
}
template< typename T, typename ... TRest>
void Print(const T& obj, const TRest& ... rest)
{
std::cout < < obj << " ";
Print(rest ...);
}
int main()
{
double p = 3.14;
std::string s("pi");
Print(p, &p, s, &s);
} |
阅读全文…

2011即将过去,再剩下差不多两个月的时间了。每年到了近年关,总感觉事情额外的多,有时候真的觉得有点心力交瘁,但是没有办法,还是得挺着。晚上把过年回家的机票搞定,好好整理一下心情,迎接2012来临之前的最后两个月!最近可能由于压力比较大,感觉有点小浮躁,需要好好静心反思一下,calm down and take it easy! 越来越觉得,职场确实是一所大学校,有好多东西需要我们去学习,而这些中,很多都是与技能无关的。在这个学习的过程中,有时候确实需要因为我们的无知而付出一些代价,这也许是我们成长需要经历的必要的过程,经历了,收获了,相信会越来越好的!
熟悉C++98的朋友,应该都知道,在C++98中没有thread, mutex, condition_variable这些与concurrency相关的特性支持,如果需要写多线程相关程序,都要借助于不同平台上各自提供的api,这样带来的问题就是程序的跨平台移植性比较差,经常要用一大堆的#ifdef WIN32类似的宏来区分不同的平台,搞得程序很难看。C++0x最原始的初衷之一就是为了让C++的功能更加强大,更加方便使用。现如今硬件如此发达,concurrency在程序设计中已经是司空见惯的事情了,如果C++再不支持这些concurrency相关的特性,就真的out了。现在,C++程序员的福音到了,C++0x提供了对thread, mutex, condition_variable这些concurrency相关特性的支持,以后多线程这一块的代码可以完全跨平台了,而且由于C++0x封装的都比较好,代码写起来也十分简洁。下面开始介绍今天的内容。
一直以来,对机器学习这个领域比较感兴趣,但由于平时所做的工作与这个方面关系不大,所以一直也没有深入、系统的学习过。但由于比较感兴趣,所以平时也零零散散地了解过一些相关的内容。小时候读书的时候,听老师说21世纪是信息爆炸的时代,现在是真真切切的感受到了。随着人们可用的信息量越来越大,如何在如此庞大的信息海洋中找到对自己有用的信息,成为了一个越来越重要的领域。而机器学习,在这个领域中的作用越来越大,越发觉得它将是未来改变世界的一把利剑。举几个生活中比较常见的例子,现在比较火的一些sns社区中的个性化推荐引擎,这个东西威力真的很大,它通过对已有数据的‘学习’,然后把你感兴趣的事物推荐给你,从人们主动去搜索,到被动的被推荐,这中间有一个质的飞越,毕竟人的本性都是懒惰的,再说很多时候,并不是每个人都清楚的知道自己喜欢什么,而推荐引擎所推荐的,很多时候都是你喜欢的,这个够神奇吧。再举一个垃圾邮件的例子,相信几年前email刚流行起来的时候,大家对这个事情都比较头疼。垃圾邮件的处理,也是一个很好的机器学习的例子,基本的思路是通过对已有的一些垃圾邮件进行特征提取,然后利用这些特征和垃圾邮件数据训练出一个识别垃圾邮件的模型,做的好的这样的模型准确率和召回率都还是挺不错的,现在像qq和163这些邮箱的邮件反垃圾还都不错的。这些机器学习相关的例子,都是与我们的生活关系非常密切的,信息技术越发达,机器学习的作用越大,我称之为可以改变世界的一把利剑。 阅读全文…
本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础。下面我们来看看wikipedia上对于计算机领域的closure的定义:
A closure (also lexical closure, function closure or function value) is a function together with
a referencing environment for the non-local variables of that function.
上面的大义是说,closure是一个函数和它所引用的非本地变量的上下文环境的集合。从定义我们可以得知,closure可以访问在它定义范围之外的变量,也即上面提到的non-local vriables,这就大大增加了它的功力。关于closure的最重要的应用就是回调函数,这也是为什么这里把function, bind和lambda放在一起讲的主要原因,它们三者在使用回调函数的过程中各显神通。下面就为大家一步步接开这三者的神秘面纱。
1. function
我们知道,在C++中,可调用实体主要包括函数,函数指针,函数引用,可以隐式转换为函数指定的对象,或者实现了opetator()的对象(即C++98中的functor)。C++0x中,新增加了一个std::function对象,std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。我们来看几个关于function对象的例子: 阅读全文…
近期评论