存档

‘Linux运维技术面试’ 分类的存档

面试中的海量数据处理问题

2016年5月27日 评论已被关闭

面试中的海量数据处理问题

http://itindex.net/detail/21691-面试-量数-理问

终于找到了一份比较完整的,分享一下。

———

海量数据处理:十道面试题与十个海量数据处理方法总结
作者:July、youwang、yanxionglu。
时间:二零一一年三月二十六日
说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结。有任何问题,欢迎交流、指正。
出处:http://blog.csdn.net/v_JULY_v
——————————————

 

第一部分、十道海量数据处理面试题

1、海量日志数据,提取出某日访问百度次数最多的那个IP。

首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法, 比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大 的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。

或者如下阐述(雪域之鹰):
算法思想:分而治之+Hash
1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;

2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

典型的Top K算法,还是在这篇文章里头有所阐述,详情请参见:十一、从头到尾彻底解析Hash表算法。

文中,给出的最终算法是:
第一步、先对这批海量数据预处理,在O(N)的时间内用Hash表完成统计(之前写成了排序,特此订正。July、2011.04.27);
第二步、借助堆这个数据结构,找出Top K,时间复杂度为N‘logK。
即,借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K(该题目中是10)大小的小根堆,然后遍历300万的Query,分别 和根元素进行对比所以,我们最终的时间复杂度是:O(N) + N’*O(logK),(N为1000万,N’为300万)。ok,更多,详情,请参考原文。

或者:采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。
3、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

方案:顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为x0,x1,…x4999)中。这样每个文件大概是200k左右。

如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M。
对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结 点的最小堆),并把100个词及相应的频率存入文件,这样又得到了5000个文件。下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。
4、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。

还是典型的TOP K算法,解决方案如下:
方案1:
顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。

找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的 query_cout输出到文件中。这样得到了10个排好序的文件(记为)。

对这10个文件进行归并排序(内排序与外排序相结合)。

方案2:
一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。

方案3:
与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。
5、 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

方案1:可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999)中。这样每个小文件的大约为300M。

遍历文件b,采取和a相同的方式将url分别存储到1000小文件(记为b0,b1,…,b999)。这样处理后,所有可能相同的url都在对应的小 文件(a0vsb0,a1vsb1,…,a999vsb999)中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的 url即可。

求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。

方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。

Bloom filter日后会在本BLOG内详细阐述。
6、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。

方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看 bitmap,把对应位是01的整数输出即可。

方案2:也可采用与第1题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。
7、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

与上第6题类似,我的第一反应时快速排序+二分查找。以下是其它更好的方法:
方案1:oo,申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

dizengrong:
方案2:这个问题在《编程珠玑》里有很好的描述,大家可以参考下面的思路,探讨一下:
又因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;
这里我们把40亿个数中的每一个用32位的二进制来表示
假设这40亿个数开始放在一个文件中。

然后将这40亿个数分成两类:
1.最高位为0
2.最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(这相当于折半了);
与要查找的数的最高位比较并接着进入相应的文件再查找

再然后把这个文件为又分成两类:
1.次最高位为0
2.次最高位为1

并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿(这相当于折半了);
与要查找的数的次最高位比较并接着进入相应的文件再查找。
…….
以此类推,就可以找到了,而且时间复杂度为O(logn),方案2完。

附:这里,再简单介绍下,位图方法:
使用位图法判断整形数组是否存在重复
判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。

位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的新数组,然后再次扫描原数组,遇到几就给新数组的第几位置上 1,如遇到5就给新数组的第六个元素置1,这样下次再遇到5想置位时发现新数组的第六个元素已经是1了,这说明这次的数据肯定和以前的数据存在着重复。这 种给新数组初始化时置零其后置一的做法类似于位图的处理方法故称位图法。它的运算次数最坏的情况为2N。如果已知数组的最大值即能事先给新数组定长的话效 率还能提高一倍。

欢迎,有更好的思路,或方法,共同交流。
8、怎么在海量数据中找出重复次数最多的一个?

方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。
9、上千万或上亿数据(有重复),统计其中出现次数最多的钱N个数据。

方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用第2题提到的堆机制完成。
10、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。

方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10 个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一 个。
附、100w个数中找出最大的100个数。

方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。

方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w*100)。

方案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的 要大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依次循环,知道扫描了所有的元素。复杂度为O(100w*100)。

致谢:http://www.cnblogs.com/youwang/

 

第二部分、十个海量数据处理方法大总结

ok,看了上面这么多的面试题,是否有点头晕。是的,需要一个总结。接下来,本文将简单总结下一些处理海量数据问题的常见方法,而日后,本BLOG内会具体阐述这些方法。

下面的方法全部来自http://hi.baidu.com/yanxionglu/blog/博客,对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎讨论。

一、Bloom filter

适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集

基本原理及要点:
对于原理来说很简单,位数组+k个独立hash函数。将 hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不 支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。

还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数 个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集 合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。

举个例子我们假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。

注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数)。通常单个元素的长度都是有很多bit的。所以使用bloom filter内存上通常都是节省的。

扩展:
Bloom filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。

问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?

根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿*8大概是340 亿,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些 urlip是一一对应的,就可以转换成ip,则大大简单了。
二、Hashing

适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存

基本原理及要点:
hash函数选择,针对字符串,整数,排列,具体相应的hash方法。
碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法,opened addressing。

扩展:
d-left hashing中的d是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做T1和T2,给T1和T2分别配备一个哈希函数,h1和h2。在存储一个新的key时,同 时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。这时需要检查T1中的h1[key]位置和T2中的h2[key]位置,哪一个 位置已经存储的(有碰撞的)key比较多,然后将新key存储在负载少的位置。如果两边一样多,比如两个位置都为空或者都存储了一个key,就把新key 存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。

问题实例:
1).海量日志数据,提取出某日访问百度次数最多的那个IP。
IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。
三、bit-map

适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下

基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码

扩展:bloom filter可以看做是对bit-map的扩展

问题实例:
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。
四、堆

适用范围:海量数据前n大,并且n比较小,堆可以放入内存

基本原理及要点:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前 元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较 小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。

扩展:双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。

问题实例:
1)100w个数中找最大的前100个数。
用一个100个元素大小的最小堆即可。

 

五、双层桶划分—-其实本质上就是【分而治之】的思想,重在“分”的技巧上!

适用范围:第k大,中位数,不重复或重复的数字
基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后最后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子。

扩展:
问题实例:
1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。

2).5亿个int找它们的中位数。
这个例子比上面那个更明显。首先我们 将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第 几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。

实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受 的程度。即可以先将int64分成2^24个区域,然后确定区域的第几大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里 的数的个数只有2^20,就可以直接利用direct addr table进行统计了。
六、数据库索引

适用范围:大数据量的增删改查

基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
七、倒排索引(Inverted index)

适用范围:搜索引擎,关键字查询

基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。

以英文为例,下面是要被索引的文本:
T0 = “it is what it is”
T1 = “what is it”
T2 = “it is a banana”

我们就能得到下面的反向文件索引:

“a”:      {2}
“banana”: {2}
“is”:     {0, 1, 2}
“it”:     {0, 1, 2}
“what”:   {0, 1}

检索的条件”what”,”is”和”it”将对应集合的交集。

正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序 频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档 指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。

扩展:
问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。
八、外排序

适用范围:大数据的排序,去重

基本原理及要点:外排序的归并方法,置换选择败者树原理,最优归并树

扩展:

问题实例:
1).有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。
九、trie树

适用范围:数据量大,重复多,但是数据种类小可以放入内存

基本原理及要点:实现方式,节点孩子的表示方式

扩展:压缩实现。

问题实例:
1).有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序。
2).1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?
3).寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。
十、分布式处理 mapreduce

适用范围:数据量大,但是数据种类小可以放入内存

基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。

扩展:
问题实例:
1).The canonical example application of MapReduce is a process to count the appearances of
each different word in a set of documents:
2).海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
3).一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?
经典问题分析
上千万or亿数据(有重复),统计其中出现次数最多的前N个数据,分两种情况:可一次读入内存,不可一次读入。

可用思路:trie树+堆,数据库索引,划分子集分别统计,hash,分布式计算,近似统计,外排序

所谓的是否能一次读入内存,实际上应该指去除重复后的数据量。如果去重后数据可以放入 内存,我们可以为数据建立字典,比如通过 map,hashmap,trie,然后直接进行统计即可。当然在更新每条数据的出现次数的时候,我们可以利用一个堆来维护出现次数最多的前N个数据,当 然这样导致维护次数增加,不如完全统计后在求前N大效率高。

如果数据无法放入内存。一方面我们可以考虑上面的字典方法能否被改进以适应这种情形,可以做的改变就是将字典存放到硬盘上,而不是内存,这可以参考数据库的存储方法。

当然还有更好的方法,就是可以采用分布式计算,基本上就是map-reduce过程, 首先可以根据数据值或者把数据hash(md5)后的值,将数据按照范围划分到不同的机子,最好可以让数据划分后可以一次读入内存,这样不同的机子负责处 理各种的数值范围,实际上就是map。得到结果后,各个机子只需拿出各自的出现次数最多的前N个数据,然后汇总,选出所有的数据中出现次数最多的前N个数 据,这实际上就是reduce过程。

实际上可能想直接将数据均分到不同的机子上进行处理,这样是无法得到正确的解的。因为 一个数据可能被均分到不同的机子上,而另一个则可能完全聚集到一个机子上,同时还可能存在具有相同数目的数据。比如我们要找出现次数最多的前100个,我 们将1000万的数据分布到10台机器上,找到每台出现次数最多的前 100个,归并之后这样不能保证找到真正的第100个,因为比如出现次数最多的第100个可能有1万个,但是它被分到了10台机子,这样在每台上只有1千 个,假设这些机子排名在1000个之前的那些都是单独分布在一台机子上的,比如有1001个,这样本来具有1万个的这个就会被淘汰,即使我们让每台机子选 出出现次数最多的1000个再归并,仍然会出错,因为可能存在大量个数为1001个的发生聚集。因此不能将数据随便均分到不同机子上,而是要根据hash 后的值将它们映射到不同的机子上处理,让不同的机器处理一个数值范围。

而外排序的方法会消耗大量的IO,效率不会很高。而上面的分布式方法,也可以用于单机版本,也就是将总的数据根据值的范围,划分成多个不同的子文件,然后逐个处理。处理完毕之后再对这些单词的及其出现频率进行一个归并。实际上就可以利用一个外排序的归并过程。

另外还可以考虑近似计算,也就是我们可以通过结合自然语言属性,只将那些真正实际中出现最多的那些词作为一个字典,使得这个规模可以放入内存。

ok,以上有任何问题,欢迎指正。谢谢大家。本文完。

海量数据处理常见面试题

2016年5月27日 评论已被关闭

海量数据处理常见面试题

http://itindex.net/detail/55626-量数-面试

1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 

方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 

s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。 

s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为)。这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 

s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 

方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。

2. 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。 

方案1: 

s 顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。 

s 找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。 

s 对这10个文件进行归并排序(内排序与外排序相结合)。 

方案2: 

一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。 

方案3: 

与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。 

3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 

方案1:顺序读文件中,对于每个词x,取,然后按照该值存到5000个小文件(记为)中。这样每个文件大概是200k左右。如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,知道分解得到的小文件的大小都不超过1M。对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件。下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。 

4. 海量日志数据,提取出某日访问百度次数最多的那个IP。 

方案1:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。 


5. 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。
 

方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。 

方案2:也可采用上题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。 


6. 海量数据分布在100台电脑中,想个办法高校统计出这批数据的TOP10。
 

方案1: 

s 在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。 

s 求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合起来,共1000个数据,再利用上面类似的方法求出TOP10就可以了。 


7. 怎么在海量数据中找出重复次数最多的一个?
 

方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。 

8. 上千万或上亿数据(有重复),统计其中出现次数最多的钱N个数据。 

方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用第6题提到的堆机制完成。 


9. 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?
 

方案1:这题用trie树比较合适,hash_map也应该能行。 


10. 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
 

方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一个。 

11. 一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。 

方案1:首先根据用hash并求模,将文件分解为多个小文件,对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理,找出最终的10个最常出现的词。 

12. 100w个数中找出最大的100个数。 

方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。 

方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w*100)。 

方案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的要大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依次循环,知道扫描了所有的元素。复杂度为O(100w*100)。 

13. 寻找热门查询: 

搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。 

(1) 请描述你解决这个问题的思路; 

(2) 请给出主要的处理流程,算法,以及算法的复杂度。 

方案1:采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。 

14. 一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到个数中的中数? 

方案1:先大体估计一下这些数的范围,比如这里假设这些数都是32位无符号整数(共有个)。我们把0到的整数划分为N个范围段,每个段包含个整数。比如,第一个段位0到,第二段为到,…,第N个段为到。然后,扫描每个机器上的N个数,把属于第一个区段的数放到第一个机器上,属于第二个区段的数放到第二个机器上,…,属于第N个区段的数放到第N个机器上。注意这个过程每个机器上存储的数应该是O(N)的。下面我们依次统计每个机器上数的个数,一次累加,直到找到第k个机器,在该机器上累加的数大于或等于,而在第k-1个机器上的累加数小于,并把这个数记为x。那么我们要找的中位数在第k个机器中,排在第位。然后我们对第k个机器的数排序,并找出第个数,即为所求的中位数。复杂度是的。 

方案2:先对每台机器上的数进行排序。排好序后,我们采用归并排序的思想,将这N个机器上的数归并起来得到最终的排序。找到第个便是所求。复杂度是的。 

15. 最大间隙问题 

给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。 

方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法: 

s 找到n个数据中最大和最小数据max和min。 

s 用n-2个点等分区间[min, max],即将[min, max]等分为n-1个区间(前闭后开区间),将这些区间看作桶,编号为,且桶的上界和桶i+1的下届相同,即每个桶的大小相同。每个桶的大小为:。实际上,这些桶的边界构成了一个等差数列(首项为min,公差为),且认为将min放入第一个桶,将max放入第n-1个桶。 

s 将n个数放入n-1个桶中:将每个元素分配到某个桶(编号为index),其中,并求出分到每个桶的最大最小数据。 

s 最大间隙:除最大最小数据max和min以外的n-2个数据放入n-1个桶中,由抽屉原理可知至少有一个桶是空的,又因为每个桶的大小相同,所以最大间隙不会在同一桶中出现,一定是某个桶的上界和气候某个桶的下界之间隙,且该量筒之间的桶(即便好在该连个便好之间的桶)一定是空桶。也就是说,最大间隙在桶i的上界和桶j的下界之间产生。一遍扫描即可完成。 

16. 将多个集合合并成没有交集的集合:给定一个字符串的集合,格式如:。要求将其中交集不为空的集合合并,要求合并完成的集合之间无交集,例如上例应输出。 

(1) 请描述你解决这个问题的思路; 

(2) 给出主要的处理流程,算法,以及算法的复杂度; 

(3) 请描述可能的改进。 

方案1:采用并查集。首先所有的字符串都在单独的并查集中。然后依扫描每个集合,顺序合并将两个相邻元素合并。例如,对于,首先查看aaa和bbb是否在同一个并查集中,如果不在,那么把它们所在的并查集合并,然后再看bbb和ccc是否在同一个并查集中,如果不在,那么也把它们所在的并查集合并。接下来再扫描其他的集合,当所有的集合都扫描完了,并查集代表的集合便是所求。复杂度应该是O(NlgN)的。改进的话,首先可以记录每个节点的根结点,改进查询。合并的时候,可以把大的和小的进行合,这样也减少复杂度。 

17. 最大子序列与最大子矩阵问题 

数组的最大子序列问题:给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大。 

方案1:这个问题可以动态规划的思想解决。设表示以第i个元素结尾的最大子序列,那么显然。基于这一点可以很快用代码实现。 

最大子矩阵问题:给定一个矩阵(二维数组),其中数据有大有小,请找一个子矩阵,使得子矩阵的和最大,并输出这个和。 

方案1:可以采用与最大子序列类似的思想来解决。如果我们确定了选择第i列和第j列之间的元素,那么在这个范围内,其实就是一个最大子序列问题。如何确定第i列和第j列可以词用暴搜的方法进行。

Linux下使用rsync最快速删除海量文件的方法

2016年5月12日 评论已被关闭

Linux下使用rsync最快速删除海量文件的方法

http://88fly.blog.163.com/blog/static/12268039020136510535657/?suggestedreading&wumii

Linux下使用rsync最快速删除海量文件的方法
1、先安装rsync:
yum install rsync
2、建立一个空的文件夹:
mkdir /tmp/test
3、用rsync删除目标目录:
rsync –delete-before -a -H -v –progress –stats /tmp/test/ log/
这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。
选项说明:
–delete-before 接收者在传输之前进行删除操作
–progress 在传输时显示传输过程
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
–stats 给出某些文件的传输状态

你该跟你的老大聊点什么?

2016年5月5日 评论已被关闭

你该跟你的老大聊点什么?

今天,知乎《北美码农的包子铺》专栏里,提到了,跟老板 1 on 1 聊天时讲什么的话题,文章是站在一个员工的角度讲的。

正好,最近我在做绩效面谈,我想站在 leader 或者说 mentor 角度讲讲同一个问题。这样未免有些恬不知耻,也不能涵盖所有的情况,但是我觉得说不定还是能给新人一些参考。

逻辑思维,我只看过一期节目,但是一直印象深刻,就是讲我们这个时代的人,应该怎么自处,在这一期节目中,罗胖提到了“U盘型人才”,以及“手艺人”的概念。我深以为然。大体意思就是说,你在这个时代应该像一个U盘一样,有自己独特的功能,而且极其专业化,到了任何一个企业,插上就能用。这个话,有好几层意思,一个是说“专业”,有自己独特而且强大的技能,所以又叫“手艺人”;还有一层意思就是说,聘任关系,相比从前,表现出了更多的不稳定性,人才随时可以从一个企业“拔出”,然后“插入”到另一个企业。

我自己的感悟就是,确实如此。我自己也是一名员工,我被雇佣,就是因为我有一些特殊的能力,企业需要这个能力,所以企业愿意买单,而如果我不想丢掉饭碗,就应该表现好我自己的能力,确保自己不要失去竞争优势。而其实,我也并不怕企业解雇我,因为从某种程度来讲,我其实也算个手艺人,可以靠出卖手艺过活,恰恰当前的市场环境,还蛮需要我这样的手艺人的。

在这种环境下,企业和员工到底是什么关系呢?我经常跟我的同事讲我所认同的一种观点,包括我的上级领导,也包括我的晚辈同事,那就是,员工和企业的关系,合作多于从属了。雇员在一个企业任职,现在的原因已经变得比以往复杂多了,物质丰裕了,很多年轻人,并不单纯为了一份薪水就死心塌地的工作,他们有些人甚至完全不缺钱。

这种情况,我视为是一种进步,因为人与人在变得越来越平等,至少是人格上的平等,国内很多比较优秀的私企,早就已经做到了,比如腾讯内部,称公司为 Tencent Party,称同事为同学,对领导也可以直呼其名。

雇员与企业更倾向于合作了,那么领导和下属的关系有什么变化呢,我觉得,领导对于下属来说,应该更向服务型的角色转变了。协调好资源,帮助下属解决好问题,让他们开开心心工作,得到成就感和成长,尽可能帮助他们得到一些薪水以外的东西,就是领导的责任了。

回归我们文章的主题,与老大也即领导,聊点什么好呢?我觉得,既然是合作的关系,一次比较成功的合作,应该是双赢的,双方应该互有好处才算是 Win-Win。若想谋求更好的双赢,首先就要搞清各自的诉求,有什么要求,一定要摆在桌面上,掌握到下属的诉求,领导是可以更加有针对性地辅导与激励,这个在“北美码农”的文章里也有异曲同工的撰述。一方面你要尽可能清楚地表达你自己的诉求,另一方面假如你对公司方面的诉求有迷惑,一定要讲清楚,大的公司,会有内宣部门负责传播企业的愿景和价值观,我觉得这很好,可以随时帮助员工把握住自己做事原则,但是很多中小企业,未必有精力或者资源去整这个东西,没整不代表没有,每个老板,必然心中都有个愿望的,要设法搞清楚这个。与老大沟通时候,去询问这个问题,就是很好的时候。

各自清楚对方的诉求,才能更好的让双方利益最大化,比如,你想要更多的荣誉,更多成就感,更多的成长锻炼,而企业想要更好的产品,更多的销售,更高的效率,如果,一个企业还算有良心,在达到了目标的时候,是会有所表示的,这就是双赢了。

你大概觉得我很不实际,竟讲虚的,不提最重要的工资问题。确实,还是有很多人,更想要的是加薪。而我的理解是,跟你谈话的这个人,比较悲剧的是,他往往并不能直接决定你的工资。提这种要求是不成熟的。如果你稍微接触一点这里的事情,就明白我所言不虚。因为,如果市场经济是一个真命题,那么,员工作为市场上一种资源,其实,其价格是市场决定的。市场会对每一种规格的人才定价,如果你进公司的时候,谈好了薪水,应该就是在市场基准的前提下,磋商了一个价格。那么市场是如何定价的呢?稍有经济知识便明白,市场使用供需定价。可能并不公平,可事实就是如此,这也是市场能做到资源优化配置的原理,效率低了点,但确实有一定效果。

明白了这个原理,我想,你就可以不用提出加薪这种非常令人难堪的话题。很多企业采用秘薪制,你的 leader 可能都不知道你薪水几何,也没法知道是高还是低,没法对你感同身受,也很难有直接的方法帮到你。而且,相信我,这是一个非常难以启齿的话题,会给你和你的 leader 都非常大的压力。

难道加薪就完全无望么,我觉得也非如此。因为知道了工资的原理,那就可以利用这个原理。既然价格是供需决定的,那改变供需就行了——物以稀为贵。这就又回到了文章开头讲到的,“U盘”,“手艺人”的问题。所以,本质就是一个如何将自己变得稀缺的问题,答案就是掌握更强大的技艺或者说能力。在任何行业,高级人才的供给都是稀缺的,所以,你要尽快升职,方法就是提升自己的能力。熬年限或许也会有用吧,但是我认为,效果渺茫,原因我也懒得分析了。

很多人,希望通过跳槽来加薪,我想,这是很糟糕的办法,因为,我自己面试过很多工作了8年的家伙,每家公司工作1年,做了8次一样的事情,这种人在我眼里,跟1年经验差不多,但是有着一个工作8年的人的预期,其境况有多糟糕,碰壁的痛有多深沉,你大概也能猜到吧。所以,当你想跳槽的时候,判断依据,最好是因为能得到更大的提升和锻炼,而不是仅仅是因为加薪,加薪是果,反果为因是愚蠢的。多啰嗦一句,我一个师弟去创业了,我问,收入没有了,你不怕么?他说,创业可能可以赚大钱,最不济,还能锻炼能力,如果能力变强了,按照我现在的低廉的薪资,以后两三年轻松能赚回来,我听了被深深震撼并感动,这就是知道自己要什么,也沉的住气的人,这种人必然会成功的,如果不是现在,也是不远的将来。

以上就是我个人一点思考,希望对大家有帮助吧~

 

分类: Linux运维技术面试 标签:

全栈工程师会是未来的发展趋势吗?

2015年10月27日 评论已被关闭

全栈工程师会是未来的发展趋势吗?

http://dev.yesky.com/279/35894279.shtml

  最近,网上很流行一个词:全栈(Full Stack)工程师,也可以叫全端工程师,无论是前端知识,还是后端架构你都要了解。甚至有些调皮的程序员这样理解全栈工程师:全栈工程师=屌丝战斗机=系统+网络+研发+dba+架构+安全=没女朋友、拿一份工资做三份事情的典型、每个站长都是一个全栈工程师,每个站群的站长都是超级全栈工程师。

以前,软件工程师最在意的是成为某个领域的专家或者高手,如今,随着软件技术的发展以及需求的变化,尤其是越来越多的程序员出来自己创业,由于各种条件限制,许多技术上的问题不得不亲力亲为地去完成,因此,很多程序员慢慢地就练就了精通多门技术的本领。

52de108fc600c

  该截图来自 知乎网

  这不,就有位程序员在知乎上提问:“ 怎样成为全栈工程师(Full Stack Developer)?,在OSCON会议上,一名Facebook的工程师说他们只聘请“全栈(Full stack)”的程序员。”此话题一出,引起了大家的热烈讨论。许多经验丰富的工程师纷纷在下面留言,讨论成为全栈工程师的价值在哪里,大家是否需要成为全栈工程师,笔者就知乎上的精彩回答进行了整理,不妨一起来看下:

Cat Chen:

既然原文是说,Facebook工程师说Facebook只招Full Stack Engineer,那我就来说说Facebook Engineer都是怎样的人。

我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就一点也不碰。Facebook 的工程师,级别越高就需要保持越大的影响力。如何创造更大的影响力,就是寻找当前杠杆效应最明显的问题来解决。有些问题你解决了的话,投入进去的时间每小时能换回来一千美元;有些问题你解决了的话,投入进去的时间每小时能换回来一百万美元。然而哪些问题更值得解决,这是动态的,往往还存在衰减效应。如果现在性能瓶颈在后端,你做了一个季度两个季度优化后,瓶颈就已经不在后端了,你再优化下去衰减效应就会越来越明显。等瓶颈变成前端了,你是不是就说因为你不懂,所以不愿意碰?那就相当于寄望于公司有个前端很懂性能优化的人来解决,但如果公司没有这样的人那就没有人来解决了。

Facebook的众多海报当中,有一张写的是「任何一个Facebook 的问题,都不是别人的问题」。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。如果你是个专门做数学模型的博士,加入Facebook 原本是打算做搜索结果优化的,结果发现这不是最急需解决的问题,JavaScript 性能才是最需要解决的问题,你怎么办?如果你以为 Facebook 需要的是你做数学模型的经验,那你就错了。Facebook 需要的是你完成博士学位的学习能力。你从来没做过JavaScript并且觉得JavaScript很恶心?正确的做法是立即在网上买几本JavaScript入门的书连夜看完,然后着手分析性能瓶颈并且解决。在你完成手动优化后,你还可以思考一下能否把这做成自动化,例如说在代码提交时分析JavaScript语法树并且指出可能成为性能瓶颈的地方,又或者说从用户浏览器那里收集性能数据扔到Hive然后再从中分析产生瓶颈的特征。这些都可能涉及到一些你没有做过也没有学过的东西,但问题摆在那里你就需要去解决,而无论这要求你去钻研什么。这就是我所说的学习能力。

 顾鹏:

设计、后台开发、前端开发、移动开发、运营维护、PS、文案… 好像都会了,这算Full Stack Engineer了么?

不,这只是踏上成为Full Stack Engineer的第一步。你知道目前只是每个stack都懂一点,离senior或者expert还差得远,而要每个stack都做到极致,需要大量的时间和精力。精力有限,产品开发紧迫,力不从心啊,这条道路也太孤独,因为你不需要与任何人进行协作。难道要把一些stack的任务交给别人做么?这样算是放弃成为Full Stack Engineer么?

不!这不是。什么是Engineer?Engineer的本质工作是设计,开发出应用于大众的产品。

一个真正的Full Stack Engineer,他从生活中发现问题,洞察需求,他设计解决方案,并开发出初始版本的产品。为了达到目标,他愿意去学习任何领域的技能和知识。同时他不追求一个人完成所有工作,如果有人可以比他在某方面做得更出色,便会十分热情的邀请他们加入。

最终他的职位也许不再是Engineer,他不再设计UI,不再写代码… 他的工作不再是设计/开发一款应用/产品,因为他有更大更重要的任务要做——design and building a team or a company which builds great products。

而这时,社会给了他们另一个称呼——创业者。尽管众人已忘记他们engineer的身份,但在他们骨子里,内心深处,自己始终都是一个engineer。当他们需要从头再来时,他们毫不犹豫从设计开发产品做起。Nikola Tesla,Ferdinand Porsche,Henry Ford,Jack Dorsey,Mark zuckerberg,Elon Musk… 细数那些改变了或正改变世界的创业者,他们大多数是engineer背景,热衷于设计创造。他们学习技能和知识,不是为了成为某个领域的专家;而是因为那些 是完成自己目标所需要的。

 李楠:

Full Stack Developer在国内不被接受的一个主要原因是公司缺乏稳定的T线(技术职位晋升路线)。很多有才华的人写了几年代码后去做了管理。今天的网络相关技术,聪明又能持续学习的人,在三年之内可以在一个领域做到很高的水准。那么如果你做五年,十年甚至十五年呢?我认为成为Full Stack Developer是很自然的选择,而且可以跟随最顶尖的技术。

Full Stack Developer的核心并非否定团队和协作,而是更多的体现在架构设计,快速原型和TroubleShooting方面。随着今天的分层越来越清晰,平台和语言越来越有特点,更加全面的技术人员可以根据不同的语言搭建整个架构。

Full Stack Developer并非杂而全——Facebook也不会雇庸手。他要求的是一种更加全面的深入。 一方面,他是技术人员不断学习的结果。另一方面,他也是对自己事业的一种责任。

kubisoft:

既然叫工程师,就是应该负责技术的,而不只是写代码。

各方面的技术,各方面的技术架构。比如,关卡编辑器里面的图层该怎么搭,如何定义?美工PS出来的图片应该是什么规格?这些都是技术架构,都是工程师要去做的。工程师应该帮美术做好图,做好动画;帮策划做好关卡,填好数据;这才是工程师。所有跟技术相关的东西,包括Photoshop的使用细节,3dmax的使用细节,都是工程师需要去搞定的。美术只是在工程师做好的基础上让它更漂亮更好看,策划让它更好玩。

如果只局限在自己的代码中,就只能是程序员。如果只关心客户端而不关心服务器,就无法对技术负责,就只能是一个程序员。每一个实际问题,都有可能涉及各方面的技术。举个例子来说,做格斗网游,要做出良好的打击感,你就不仅要关心渲染技巧,还要关心美术特效,还要关心网络,关心服务器应该传送过来哪些数据,还要关心哪些东西是对玩家有用的必须表现出来的东西…当你的关注重心从代码转移到具体实际的问题的时候,就成为了一个工程师了,继续努力下去,就很容易变成全能的工程师。

知乎上的匿名用户

首先我觉得好的开发者,即使不是全栈,也要融会贯通多种技术。我从来不认为一个只专精一种技术的人有可能成为好的开发者,即使是C,即使是汇编。(当然其实反过来看,那些大神们哪个不会搞点其他的?比如几个做服务器端开发的大神居然不懂服务器管理?)

然后从广度和深度的组合看,我认为好的开发者大概有两种类型:

手术刀

代码专家。

(来自《人月神话》)

手术刀是业务驱动的,最需要全栈的人;他们的核心价值在于:懂业务,技术全面,都能拿的起来,而且能选择最合适的技术。代码专家是技术驱动的,即使不够全栈也可以用,但是技能树点的越多当然有好处。

下面要讲的是创业逼出来的全栈,对于创业团队而言,手术刀更加重要,代码专家要依靠各种开源组织的贡献,或者临时聘请。创业的最大需求技能是整合资源的能力,找合适的人做事的能力。

所以我说的,是说对于我,种子期,天使期,最重要的都是我自己作为手术刀,而不是资源整合者。

全栈工程师不是为了工作本身,是为了方便实现自己的梦。

如果不是创业,我的价值可能也就是个2w 多工资的架构师或者技术经理,这个价格远远对不起我这13年的付出。一个真正的全栈工程师,目标只有一个:创业。

看了上面的回答,你是否知道了如何成为一名全栈工程师呢?关于该问题的更多讨论,欢迎大家访问知乎讨论页。(以上内容来自知乎网)

随着工作经验的逐年增加,程序员/软件工程师所接触的技术领域会越来越广泛,无形中就会对某个技术有所了解,对于上进、想闯出一番天地的程序员而言,他们非常乐意并且会主动去学习这些技术,这样,自然而然的就学会了多门技术,精通多种语言。

许多人都在做年终总结和新一年的规划,许多程序员都希望自己在新的一年里能做出更好的产品、学到更多知识、进一步提升自己的技能和综合能力,这或许也是全栈工程师成为热门的原因之一。那么,这是否也说明,要想在软件开发领域走的更远,就必须掌握更多的技能,成为一名全栈工程师呢,这会成为未来程序员的职业趋势吗?大家不妨一起来讨论下。

学习c++的五十条忠告

2015年10月15日 评论已被关闭

学习c++的五十条忠告

http://blog.csdn.net/educast/article/details/38353245

1.把C++当成一门新的语言学习;

2.看《Thinking In C++》,不要看《C++变成死相》;

3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;

4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;

5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;

6.会用Visual C++,并不说明你会C++;

7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;

8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;

9.看Visual C++的书,是学不了C++语言的;

16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;

18.学习编程最好的方法之一就是阅读源代码;

19.在任何时刻都不要认为自己手中的书已经足够了;

20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;

21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;

22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;

23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;

24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;

25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;

26.请看《程序设计实践》,并严格的按照其要求去做;

27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;

28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;

29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;

30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;

31.学习编程的秘诀是:编程,编程,再编程;

32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;

34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;

35.把在书中看到的有意义的例子扩充;

36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;

37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;

38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;

39.C++语言和C++的集成开发环境要同时学习和掌握;

40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;

41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;

42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);

43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;

44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;

45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;

46.记录下在和别人交流时发现的自己忽视或不理解的知识点;

47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;

48.保存好你写过的所有的程序——那是你最好的积累之一;

49.请不要做浮躁的人;

50.请热爱C++!

七个对我最重要的职业建议(译文)

2015年10月8日 评论已被关闭

七个对我最重要的职业建议(译文)

http://www.ruanyifeng.com/blog/2015/08/git-use-process.html

作者: 阮一峰

日期: 2015年9月18日

Nicholas C. Zakas 是全世界最著名的 JavaScript 程序员之一。

两年前,他写了一篇长文,回顾自己的职业生涯,提到七个对他来说最重要的建议。

bg2015091801

我读完很受启发,决定做一点摘录。你可以先读下面的精简版,再去读全文

===============================

七个对我最好的职业建议(精简版)

作者:Nicholas C. Zakas

译者:阮一峰

原文网址:https://www.nczonline.net/blog/2013/10/15/the-best-career-advice-ive-received/

一、不要别人点什么,就做什么

我的第一份工作,只干了8个月,那家公司就倒闭了。我问经理,接下来我该怎么办,他说:

“小伙子,千万不要当一个被人点菜的厨师,别人点什么,你就烧什么。不要接受那样一份工作,别人下命令你该干什么,以及怎么干。你要去一个地方,那里的人肯定你对产品的想法,相信你的能力,放手让你去做。”

我从此明白,单单实现一个产品是不够的,你还必须参与决定怎么实现。好的工程师并不仅仅服从命令,而且还给出反馈,帮助产品的拥有者改进它。

二、推销自己

我进入雅虎公司以后,经理有一天跟我谈话,他觉得我还做得不够。

“你工作得很好,代码看上去不错,很少出Bug。但是,问题是别人都没看到这一点。为了让其他人相信你,你必须首先让别人知道你做了什么。你需要推销自己,引起别人的注意。”

我这才意识到,即使做出了很好的工作,别人都不知道,也没用。做一个角落里静静编码的工程师,并不可取。你的主管会支持你,但是他没法替你宣传。公司的其他人需要明白你的价值,最好的办法就是告诉别人你做了什么。一封简单的Email:”嗨,我完成了XXX,欢迎将你的想法告诉我”,就很管用。

三、学会带领团队

工作几年后,已经没人怀疑我的技术能力了,大家知道我能写出高质量的可靠代码。有一次,我问主管,怎么才能得到提升,他说:

“当你的技术能力过关以后,就要考验你与他人相处的能力了。”

于是,我看到了,自己缺乏的是领导能力,如何带领一个团队,有效地与其他人协同工作,取到更大的成果。

四、生活才是最重要的

有一段时间,我在雅虎公司很有挫折感,对公司的一些做法不认同,经常会对别人发火。我问一个同事,他怎么能对这种事情保持平静,他回答:

“你要想通,这一切并不重要。有人提交了烂代码,网站下线了,又怎么样?工作并不是你的整个生活。它们不是真正的问题,只是工作上的问题。真正重要的事情都发生在工作以外。我回到家,家里人正在等我,这才重要啊。”

从此,我就把工作和生活分开了,只把它当作”工作问题”看待。这样一来,我对工作就总能心平气和,与人交流也更顺利了。

五、自己找到道路

我被提升为主管以后,不知道该怎么做。我请教了上级,他回答:

“以前都是我们告诉你做什么,从现在开始,你必须自己回答这个问题了,我期待你来告诉我,什么事情需要做。”

很多工程师都没有完成这个转变,如果能够做到,可能就说明你成熟了,学会了取舍。你不可能把时间花在所有事情上面,必须找到一个重点。

六、把自己当成主人

我每天要开很多会,有些会议我根本无话可说。我对一个朋友说,我不知道自己为什么要参加这个会,也没有什么可以贡献,他说:

“不要再去开这样的会了。你参加一个会,那是因为你参与了某件事。如果不确定自己为什么要在场,就停下来问。如果这件事不需要你,就离开。不要从头到尾都静静地参加一个会,要把自己当成负责人,大家会相信你的。”

从那时起,我从没有一声不发地参加会议。我确保只参加那些需要我参加的会议。

七、找到水平更高的人

最后,让我从自己的经历出发,给我的读者一个建议。

“找到那些比你水平更高、更聪明的人,尽量和他们在一起,吃饭或者喝咖啡,向他们讨教,了解他们拥有的知识。你的职业,甚至你的生活,都会因此变得更好。”

(完)

20条Linux命令面试问答

2015年9月27日 评论已被关闭

20条Linux命令面试问答

http://os.51cto.com/art/201502/464741.htm

wKiom1TPyy_Ci0L7AABkKx51mLo445

问:1 如何查看当前的Linux服务器的运行级别?

答: ‘who -r’ 和 ‘runlevel’ 命令可以用来查看当前的Linux服务器的运行级别。

问:2 如何查看Linux的默认网关?

答: 用 “route -n” 和 “netstat -nr” 命令,我们可以查看默认网关。除了默认的网关信息,这两个命令还可以显示当前的路由表。

问:3 如何在Linux上重建初始化内存盘镜像文件?

答: 在CentOS 5.X / RHEL 5.X中,可以用mkinitrd命令来创建初始化内存盘文件,举例如下:

  1. # mkinitrd -f -v /boot/initrd-$(uname -r).img $(uname -r)

如果你想要给特定的内核版本创建初始化内存盘,你就用所需的内核名替换掉 ‘uname -r’ 。

在CentOS 6.X / RHEL 6.X中,则用dracut命令来创建初始化内存盘文件,举例如下:

  1. # dracut -f

以上命令能给当前的系统版本创建初始化内存盘,给特定的内核版本重建初始化内存盘文件则使用以下命令:

  1. # dracut -f initramfs-2.x.xx-xx.el6.x86_64.img 2.x.xx-xx.el6.x86_64

问:4 cpio命令是什么?

答: cpio就是复制入和复制出的意思。cpio可以向一个归档文件(或单个文件)复制文件、列表,还可以从中提取文件。

问:5 patch命令是什么?如何使用?

答: 顾名思义,patch命令就是用来将修改(或补丁)写进文本文件里。patch命令通常是接收diff的输出并把文件的旧版本转换为新版本。举个例子,Linux内核源代码由百万行代码文件构成,所以无论何时,任何代码贡献者贡献出代码,只需发送改动的部分而不是整个源代码,然后接收者用patch命令将改动写进原始的源代码里。

创建一个diff文件给patch使用,

  1. # diff -Naur old_file new_file > diff_file

旧文件和新文件要么都是单个的文件要么都是包含文件的目录,-r参数支持目录树递归。

一旦diff文件创建好,我们就能在旧的文件上打上补丁,把它变成新文件:

  1. # patch < diff_file

问:6 aspell有什么用 ?

答: 顾名思义,aspell就是Linux操作系统上的一款交互式拼写检查器。aspell命令继任了更早的一个名为ispell的程序,并且作为一款免费替代品 ,最重要的是它非常好用。当aspell程序主要被其它一些需要拼写检查能力的程序所使用的时候,在命令行中作为一个独立运行的工具的它也能十分有效。

问:7 如何从命令行查看域SPF记录?

答: 我们可以用dig命令来查看域SPF记录。举例如下:

  1. linuxtechi@localhost:~$ dig t TXT google.com

问:8 如何识别Linux系统中指定文件(/etc/fstab)的关联包?

答:

  1. # rpm -qf /etc/fstab

以上命令能列出提供“/etc/fstab”这个文件的包。

问:9 哪条命令用来查看bond0的状态?

答:

  1. cat /proc/net/bonding/bond0

问:10 Linux系统中的/proc文件系统有什么用?

答: /proc文件系统是一个基于内存的文件系统,其维护着关于当前正在运行的内核状态信息,其中包括CPU、内存、分区划分、I/O地址、直接内存访问通道和正在运行的进程。这个文件系统所代表的并不是各种实际存储信息的文件,它们指向的是内存里的信息。/proc文件系统是由系统自动维护的。

问:11 如何在/usr目录下找出大小超过10MB的文件?

答:

  1. # find /usr -size +10M

问:12 如何在/home目录下找出120天之前被修改过的文件?

答:

  1. # find /home -mtime +120

问:13 如何在/var目录下找出90天之内未被访问过的文件?

答:

  1. # find /var \! -atime -90

问:14 在整个目录树下查找文件“core”,如发现则无需提示直接删除它们。

答:

  1. # find / -name core -exec rm {} \;

问:15 strings命令有什么作用?

答: strings命令用来提取和显示非文本文件中的文本字符串。(LCTT 译注:当用来分析你系统上莫名其妙出现的二进制程序时,可以从中找到可疑的文件访问,对于追查入侵有用处)

问:16 tee 过滤器有什么作用 ?

答: tee 过滤器用来向多个目标发送输出内容。如果用于管道的话,它可以将输出复制一份到一个文件,并复制另外一份到屏幕上(或一些其它程序)。

  1. linuxtechi@localhost:~$ ll /etc | nl | tee /tmp/ll.out

在以上例子中,从ll输出可以捕获到 /tmp/ll.out 文件中,并且同样在屏幕上显示了出来。

问:17 export PS1 = ”$LOGNAME@hostname:\$PWD: 这条命令是在做什么?

答: 这条export命令会更改登录提示符来显示用户名、本机名和当前工作目录。

问:18 ll | awk ‘{print $3,”owns”,$9}’ 这条命令是在做什么?

答: 这条ll命令会显示这些文件的文件名和它们的拥有者。

问:19 :Linux中的at命令有什么用?

答: at命令用来安排一个程序在未来的做一次一次性执行。所有提交的任务都被放在 /var/spool/at 目录下并且到了执行时间的时候通过atd守护进程来执行。

问:20 linux中lspci命令的作用是什么?

答: lspci命令用来显示你的系统上PCI总线和附加设备的信息。指定-v,-vv或-vvv来获取越来越详细的输出,加上-r参数的话,命令的输出则会更具有易读性。


via: http://www.linuxtechi.com/20-linux-commands-interview-questions-answers/

作者:Pradeep Kumar 译者:ZTinoZ 校对:wxy

[评论]全栈工程师到底有什么用

2015年9月26日 评论已被关闭

[评论]全栈工程师到底有什么用

http://digi.163.com/14/0116/10/9IN26JNS00162OUT.html

最近国内外都在流行一个词叫Full Stack,中文翻译过来叫全栈工程师,也叫全端工程师。微博上很多专业人士都在讨论全端工程师,有赞有毁的。我对全端工程师的定义是:掌握多种技能,并能利用多种技能独立完成产品的人。打外比方,全栈工程师就是一个能独立盖一幢10层小洋楼的人,而普通工程师,则是可以和一群人盖一幢摩天大楼的人。

至于要掌握哪些技能,我觉得这个要跟从事的行业与技术方向有关,做互联网的和做软件的是不一样的,即使是做互联网的,后端也可以分为很多种技术流派。

8/2定律在哪都适用,全栈工程师就是掌握20%常用技能的人,但这20%的技能会有80%的几率被用到,剩下那80%不常用的,让我们Google吧。

有人说,全栈工程师在中国已经很多年了,他们叫站长。这个说话有点靠谱但又不那么靠谱,我自己也做过站长,深知作为一名站长需要掌握很多种技术。不靠谱的是,很多站长其实并没有真正写过多少代码,而是熟练利用一些建站软件来建站。

全栈工程师的价值

有人说了,你再牛逼,你懂五种技术,你能干五个人的活吗?全栈工程师并不是说一个人能干几个人的活,而是要从多个方面来看这个问题。

全局性思维

现代项目的开发,很少说只用到一两种技术的,特别是移动互联网大潮下。随便一个互联网项目中用到的技术,就会需要用到后端开发、前端开发、界面设计、产品设计、数据库、各种移动客户端、三屏兼容、restFul API设计和OAuth等等,一些比较前卫的项目,可能会用到Single Page Application、Web Socket、HTML5/CSS3这些技术,还有像第三方开发像微信公众号微博应用等等。

Web前端也远远不是从前的切个图用个jQuery上个AJAX兼容各种浏览器那么简单了。现代的Web前端,你需要用到模块化开发、多屏兼容、MVC,各种复杂的交互与优化,甚至你需要用到Node.js来协助前端的开发。

所以说一个现代化的项目,是一个非常复杂的构成,我们需要一个人来掌控全局,他不需要是各种技术的资深专家,但他需要熟悉到各种技术。对于一个团队特别是互联网企业来说,有一个全局性思维的人非常非常重要。

像如果是我经手的项目,我肯定会注意到网页优化,也会考虑到API来兼容各种客户端,更会考虑到三屏兼容的问题。不会说项目中完全使用AJAX而不顾SEO,也不会为了功能性而忽略访问速度,我会很好的把握这个平衡,因为我知道它们的权重与实现成本。

沟通成本

项目越大,沟通成本越高,做过项目管理的人都知道,项目中的人力是1+1<2的,人越多效率越低。因为沟通是需要成本的,不同技术的人各说各话,前端和后端是一定会掐架的。每个人都会为自己的利益而战,毫不为已的人是不存在的。< p=””>

而全栈工程师的成本几乎为零,因为各种技术都懂,胸有成竹,一不小心自己就全做了。即使是在团队协作中,与不同技术人员的沟通也会容易得多,你让一个后端和一个前端去沟通,那完全是鸡同鸭讲,更不用说设计师与后端了。但如果有一个人懂产品懂设计懂前端懂后端,那沟通的结果显然不一样,因为他们讲的,彼此都能听得懂。

创业公司

对于创业公司来说,全端工程师的价值是非常大的,创业公司不可能像大公司一样,各方面的人才都有。所以我们需要一个多面手,各种活都能一肩挑,独挡多面的万金油。对于创业公司,不可能说DBA前端后端客户端各种人才全都备齐了,很多工作请人又不饱和,不请人又没法做,外包又不放心质量,所以全端工程师是省钱的一妙招。虽然说全端工程师工资会比一般的工程师会高很多,但综合下来,成本会低很多。

全栈工程师的困境

我讲技术有两个发展方向,一种是纵向一种是横向的,横向的是瑞士军刀,纵向的是削铁如泥的干将莫邪。这两个方向都没有对与错,发展到一定程序都会相互溶合,就好比中国佛家禅修的南顿北渐,其实到了最后,渐悟与顿悟是一样的,顿由渐中来。

如果一个公司不太懂全栈工程师的价值,那么全栈工程师的地位将会很尴尬,说得不好听一点,全栈工程师就是什么都会,都么都不会。曾经有一次面试,对方问我很基础的问题,我答不上来,我能做出产品,也知道什么是怎么一回事,我也不会犯那些错误,但我就是答不上概念,要考倒我非常容易。所以在应聘面试的时候,有些时候会吃亏,你可能会不如哪些在某一方面钻得很深的人工资拿得高。

由于经常在各种技术穿梭,我会经常忘记代码的语法和一些API,所以我经常需要去查API甚至查语法,我觉得没有Google我几乎没法工作。这在某些人的眼里,是技术不够的表现。我记的只是一个Key,一个如何找寻答案的索引,而不是全部,人脑不是电脑,我不可能要求我能记下所有的东西。

有一次面试官问我一个问题,我说我不知道,但我猜大概是如此这般,对方问我,你为什么这么猜,我说凭直觉,对方笑了笑没说话。面试完后我一查,果然和我猜的差不多。没错,我就是凭直觉,但这种直觉和女人的直觉不一样,这种直觉是技术上的直觉,是你过去技术经验累积的一个反射。

我不是一个非常专业的Web前端,也不是一个非常专业的Node.js开发工程师,更不是一个非常专业的iOS开发工程师。用人单位会问我,你到底是专业做哪一个方面的,我为什么要给你这么高的工资?

有什么资格来谈全栈工程师

我应该算是一个全栈型工程师了,行业经验已经超过10年。独立做过不少产品,也带过不少项目,经过的产品包括桌面端、Web产品、移动端产品,Web端涵盖前端与后端,移动端主要做iOS和混合开发。

熟悉Web前端,对MVC/模块化开发有实战经验,熟悉CoffeeScript、Grunt、RequireJS、Handlebars等等,自己写过小型的Javascript框架,一个项目中的JS代码超过一万行。熟知网页优化,知道如何让网页变得更加快速。也略懂SEO,知道什么样的URL和代码会更讨好Spider。

熟悉Node.js,有几个项目都是基于Node.js的,目前发布有开源的Blog程序Purelog,在NPM上有多个模块发布。熟悉混合开发,过去我曾经有超过一年的时间是在研究Hybrid技术,多个App基于混合开发技术,也有开发类似于PhoneGap的解决方案。对HTML5在手机上的表现颇为熟悉,挖过很多的技术坑,如白屏问题,Sqlite问题,滚动条问题,硬件动画加速、点击延时问题等等。

会做设计,熟悉Photoshop,所有的产品不管是Logo还是界面全都是自己做的设计,虽然在资深的设计师眼里不值一提,但在工程师队伍中算是比较另类了。

熟悉Objective-C,有两年以上的iOS开发经验,在App Store上有约十款App。熟悉服务器的一般性操作,自己有VPS并运行多个网站,虽然配置服务器经常要去Google。

早年曾经做过一年的Delphi,也曾做过几年的ASP.net,虽然这些技术我目前已经放弃,完全转向*nix平台,但累积下的经验是在的。多年的项目管理经验,曾在三个公司担任过项目经理,累计项目管理经验超过4年。在多个科技门户发表过技术和评论文章。

为什么我会成为全栈工程师

我相信很多全栈型工程师会和我一样,是因为要创业才成为全栈型工程师的。我有一颗创业和做产品的心,而且我又是一个不愿意麻烦别人的人,有些人擅长整合资源,空手套白狼,但我显然不是这种人,所以我只好自己做了。

在经历过两次孤独的创业之后,我发现我并不是一个适合独立创业的人,所以,我成为了一个全端工程师。我最初是做ASP,后来自己创业写客户端用Delphi,然后写了三年的ASP.Net,2010年的时候因为公司需要开始做iOS开发。Web前端是一直自己在做,项目中的的Javascript基本都是我自己在做。

我热爱写代码,热爱重复发明轮子,热爱新技术,我想这也是我成为一个全栈工程师的重要原因。

于我自己来说,我觉得全端工程师的乐趣要比一般工程师来得多,因为你知道一个产品的形态,你可以去设计一个产品,你是从全局的视野来做事情,你得到的成就感会更多一些。

许维的锤子发布会笔记——建议从事销售和营销的朋友阅读

2015年9月19日 评论已被关闭

许维的锤子发布会笔记——建议从事销售和营销的朋友阅读

http://www.evilsec.com/thinks-in-chuizi-release.html

文/明道副总裁许维

昨天没头没脑的发了一句“我要是不买个锤子,我就对不起老罗。”今天晚上跑到安福路话剧中心对面的马里昂吧咖啡,要一杯茶,打开电脑,好好跟大家解释一下我到底为啥要买锤子。

外行看热闹,内行看门道。作为一个从事销售工作的人,自然要看的是他如何进行一场产品演示,幸运的是,这场锤子手机的发布会堪称经典。网友戏称听了一场“相 声”,这可不是一场简单的逗逗乐子的相声,整个相声是经过精心策划、编排的,哪里有包袱、哪里有掌声、哪里应该停顿一下、哪里应该卖卖关子,都经过了非常 精密的设计。老罗绝对是一个销售天才,他对于产品卖点的包装、对于用户需求的把握、对于观众情绪的控制、对公司价值观的阐释都堪称世界级水平,就凭这一 点,他赢得了我发自心底的尊敬,我觉得我必须要买一台锤子。

我是边看发布会边做笔记的,一共记了9条,分享给大家:
1、重新定义游戏规则

洗脑(请允许我用这个不是特别好的词,因为找不到更合适的)不是靠喊口号,这件事情需要坚实的逻辑基础和论证过程。老罗开场做的第一件事情是什么?重新定义游戏规则。

他先是罗列了许多手机厂商的卖点,什么四核、八核,2100万像素,HI-FI音质、跑分天王……然后他用嗤之以鼻的态度告诉你,这些东西都是低层次的竞争手段,他们是因为无法打造好的用户体验,所以用简单粗暴的参数来进行市场营销,这就好比一个女孩子无法用气质征服男人,于是亮出三围尺寸一样。

普通的竞争对手,会跟你在规则以内竞争,跟你比拼参数高低。高段位的竞争对手,就像老罗这样,直接修改规则。你不是说你那啥牛逼吗?我告诉你,那啥根本就没意义!恐怖的是,消费者还真的相信。这招够高。

2、说人话

做销售的谁都知道要跟客户说人话,但真能做到的,其实没有几个。老罗非常懂得这一点,他在展示硬件参数时,先用术语把参数写出来,然后自嘲自己也搞不懂,PPT画面切换,人话出来了:“量产的世界最好的CPU”(大意如此)。

做产品出身的营销人,最爱犯不说人话的错误。因为自己对产品太懂行了,就总觉得别人也跟自己一样,于是满口喷术语,人家听不懂还觉得人土鳖。亲,你是做生意呢,还是做学问呢?

3、信息透明

在99%的企业那里,“商业机密”就好像是姑娘的胸罩一样,你稍微要掀开来看看她就大嘴巴抽过来了。其实关于这一点,我一直没太想明白,企业害怕的到底是什么呢?如 果你怕对手知道了秘密就超越你,那只能说明你的竞争门槛太低了。如果你怕客户知道了不买你,那是不是说明你赚的是黑心钱?

当99%的企业都拼命遮掩的时候,那1%公开透明的企业哪怕啥也不做,他都具有巨大的信用优势。老罗把他如何搞定JDI显示屏,如何搞定富士通的拍摄解决方案,如何搞定Ammunition设计公司背后的故事原原本本、详详细细的讲了一遍,他做的其他厂商其实也做了,但是别人都不讲,那他讲出来大家就会觉得他特别靠谱。

不管你信不信,反正我是信了。

4、身段低

在演讲过程当中,“考虑到我们是一个小厂……”这句话就像电影里面的重复蒙太奇一样,出现了N次, 每次出现以后都伴随着一个小故事。我太喜欢这个桥段了,这句话一下就把公司和消费者之间的距离拉近了。以往,品牌往往喜欢把自己包装成非常高大上的模样, 一副我很屌、你们都来膜拜我吧的样子,还说什么“粉丝经济”。这年头,大众媒体都走下神坛了,品牌还端着就是自欺欺人了。

就像老罗在最后说的,买卖是一件公平的事情,你情我愿,没有谁求着谁的事情,不是说你是消费者你就是上帝,大家其实都是平等的。

5、逼格高

身段低,那是一种态度。逼格高,那也是一种态度。虽然锤子科技是一个小厂,但是它的产品图片逼格是世界级的,Ammunition的Robert给他们做背书拍的那段video是世界级的。嘴上可以谦虚,做事绝不能含糊,这才能赢得尊敬。

6、从具体的使用场景出发

老罗最喜欢的环节是演示软件,因为这里他发挥的空间最大,他能够和其他品牌的差异化越大。在这个环节,我“哇”了好几次,我在笔记本上记下来的就有:抢拍功能、定时发短信、录音打小旗、屏幕整体下拉、定时静音、短信添加到日程、日程设置的图标化、截屏裁切。

一个产品对消费者有没有价值,不在于它价格多低,不在于它用了什么材料,不在于它的技术多么先进,只在于它对消费者有没有用处。用处越具体、解决的痛点越明确,产品就越好卖。我们怎么把excel卖给一个人?如果我们说excel可以做公式运算、可以生成图表、可以写程序,消费者估计听了一头雾水。正常的卖法应该这样:“老兄你是做财务的是吧?你看我这就有一个模板,你把数字往里边一填,不用你算,结果全都自动出来了,每天能给你节省5个小时时间。”

7、定价策略

定价不是越低越好,当然也不是越高越好。老罗自己都用PPT引用了网友对他的嘲笑,一个国产手机要卖3000块,脑子进水了?这个定价确实不低,但定价是否成功的关键不在于它的绝对值,而在于消费者是不是认为它值那个价,这个时候,就看品牌如何做出合理的解释了。

老罗的解释是:我们不做高性价比的手机,因为一分价钱一分货,低价格背后是对产品的妥协,我不想妥协(你看顺道又输出了价值观);我们也不做奢侈品,我们只 做品质上不妥协的产品。解释合理吧?很合理。而且这个解释的言外之意是:买锤子的人,既不是那些只关心价格的屌丝,也不是那些买奢侈品手机的冤大头,而是 那些真正在意用户体验的理性用户。

8、自问自答,打消疑虑

经过前面2个小时的演示之后,价格也揭秘了之后,就该进入到成交环节了。这时候消费者已经对产品产生了欲望,但仍然有一些“小小的障碍”会妨碍他们立刻下单,这个时候就要进入到“打消疑虑”环境了。

你们在等待4G版本吗?我告诉你,4G其实不要等了,没意义的。

3000块仍然觉得贵?没关系,我们和招商银行合作,可以24个月分期付款。

新厂商的售后和客服怎么样?别担心,作为一个砸过西门子冰箱的公众人物,你觉得我敢售后不好吗?

一个英语培训学校的前校长,如何领着一群前英语老师做出一个手机?我怎么可能领着一群英语老师做手机呢?神经病啊。我们的CTO是前moto的三大产品经理之一钱程博士,我们有200位工程师。

几个自问自答之后,你还不敢买锤子手机吗?

9、价值观输出

如果说前面2个多小时,老罗仍然是在产品层面在进行营销,那到最后这一段,就升华到价值观的层面了,昨晚一过10点,朋友圈里就反复出现“我不是为了输赢,我就是认真”这句话。为啥大家要转发这句话?一定是因为这句话触动了我们心中那块柔软的地方,那就叫做共鸣吧。

还有一句话没有获得很多的转发,但也让人感受到了老罗作为一个资本家的坦诚和追求:“处心积虑的靠改善人类生活来获取利润”。

至此,一个完美的产品演示胜利完成了。

挑出这个产品演示之外,我还想再补充几个我的观点:
1、老罗卖的是手机吗?

如 果老罗仅仅是在卖一部手机,那就无法解释我昨天预定锤子手机的行为,因为我根本不缺手机(为此还和老婆小小的争论了一番)。我买的,其实是对认真做事的人 的一种肯定。为什么我要肯定他?因为我在他身上寻找到了共鸣,我自己获得了一种精神上的体验。而且,我觉得使用锤子手机本身,也是在通过它向外界传递一种 信号:我是用锤子的人,我既不是屌丝,也不是土豪,我就是一个认真的人。

其实所有商家都应该好好想想这个问题。如果你卖的仅仅是某种产品的使用价值,那么你就只能赚一个原材料的钱(据说国内手机厂商的利润率只有1%)。如果你卖的更多,那么你就能赚更多。比如说——

Roseonly卖的不是玫瑰花,是对爱人的在乎;

无印良品卖的不是东西,是一种朴素、自然、健康的生活方式;

明道卖的不是一个协同软件,是一种互联网时代的办公解决方案;

百达翡丽卖的不是手表,是家族的传承;

EMBA卖的不是课程,是同学圈子。

2、老罗是不可复制的。

如果你看了我前面总结的9条,然后很高兴的说:“哈,我知道了老罗成功的秘密,我也要模仿一下。”那就too simple,sometimes naive了,老罗是不可复制的。

商业好玩就好玩在这里,几乎所有成功的商业案例都是不可复制的。我们可以事后进行总结,但那只是时候诸葛亮,同样的方法换一个人用,就不奏效,即便是同一个人,换一个时间、换一个地点,可能也不奏效。

品牌的不可复制性,是对品牌最好的保护。你可以复制我的产品,你可以复制我的模式,但是你永远复制不了我经历的苦难,所以你永远无法变成我。

3、销售员的价值应该得到尊重。

虽然老罗自己一直在强调工匠精神,但真的只有锤子手机讲究工匠精神吗?魅族也讲究,moto也讲究,htc也讲究,但是为什么我们感受不到他们的工匠精神?因为他们没有一个像老罗这么能吹的好销售员。

其实,乔布斯也是苹果最大的销售员。设计不是乔布斯做的,技术不是乔布斯做的,凭什么乔布斯做老大?因为他能把东西卖出去。所以,千万别被老罗真的忽悠了,光有工匠精神是远远不够的,你还得有一个非常能吹的销售员帮你把好的东西卖出去,好的销售员,应该获得应有的尊重。

好啦,就写到这里吧。那些内心有点阴暗的朋友你们不用猜了,我写这篇文章没收锤子科技的钱,老罗也不认识我,我自己是真金白银的花钱买了锤子手机的,有截图为证。这台手机,是对一个认真做事的人的真心致敬。

谁才是高手?中国程序员的迷惘!

2015年9月18日 评论已被关闭

谁才是高手?中国程序员的迷惘!
http://blog.csdn.net/ccrong/article/details/8116572
我认为有些人的观点错了。错得一塌糊涂。
对于这个问题,我的基本观点是:任何实践都是理论的载体或表现形式。而理论也是由实践上升而来的。两者是辨证的。今天,我们只关注它的前一部分:任何实践都是理论的载体和表现形式。
我不是想故弄玄虚,但真理的外表看上去往往就是这么奇形怪状、难以理解。让我来给你解释一下吧。
比如:战争是军事理论的实践,也是它的表现形式。战争的胜负取决于指挥者军事理论的掌握程度(别给我举赵括这类“纸上谈兵”的反例,他们根本算不上掌握了军事理论,充其量只算是“背”下了军事理论。“掌握”和“倒背如流”这是两个概念。)

1、VC、VB、Delphi …… ,你该学哪个?
具体到编程而言,我要告诉你:任何一种计算机语言,都是计算机科学理论的载体或表现形式。C++很神吗?Java很酷吗?它们差距很远吗?是的。但从理论的层面上讲,它们没有区别,都是“面向对象”理论的一个具体形式而已。
现在的程序员们被发行编译软件(通常我们将其称为“系统软件”)的商家不断推出的产品搞得眼花缭乱,头痛欲裂。不断地跟在新语言后面跑,这条路还没跑到头,那边的“新路”又鸣锣开张了,于是再跟着跑……渐渐地有些人开始感叹:学海无涯、学无止境,或什么“程序员是青春饭,过了三十别想干”……
在此我不得不叹息:中国的教育真是一种“形而上学”的教育。早在高中时代我们就学过“辨证唯物主义”的基本理论:做事情要抓主要矛盾。这一条恐怕谁都知道,却鲜见谁能在实践中把这一理论运用得“炉火纯青”的。把这一理论运用到编程上来讲就是:
理论是主要矛盾,语言是次要矛盾,学会了理论,再具体到学一种语言时,你只不过是在进行某种消遣而已。
现在学VC的普遍看不起学VB的或学Delphi的。但如果一个用Delphi的人,在需要写web程序时,用TCP/IP做了一个构架,嵌入到应用程序中;而另一个用VC的人却只会把一个又一个的组件拖来拉去的做些个“例子程序”的翻版。你说他们两个谁历害?Delphi和VC谁历害?
真应了这样一段话,问:纽约好还是上海好?答:有钱哪儿都好,没钱哪儿都不好。上海的富人并不比纽约的富人少多少的优越感,而纽约的乞丐也不比上海的乞丐多多少幸福感。
现在你还会说学VC的人就一定比学Delphi的人水平高、“钱景”好吗?

2、“浅薄”绝不该是中国程序员的性格特征!!!
想问一句:中国程序员这么多,你们真地把基础理论学好了吗?别用你现有的编程经历告诉我:编程不需要数学,不需要数据结构,不需要编译原理…… ……说话得负责任,您知道吗?我之所以发表这篇文章,就是因为再也看不下去这种在中国编程界漫延的歪理邪说了!邪教害死的是人的个体,你们害死的是中国软件业的未来!如果再让这种理论继续毒害编程新手的思想,中国将在计算机领域失去民族的尊严!!!
请问,操作系统、编译软件、数据库系统…… 这些被称为“系统软件”的东东,中国有几样拿得出手的产品?也许是我孤陋寡闻,据我所知:我们国家一件像样的也没有。
不错,我们是有一些网站的股票在西方上市了,我们是有一些人被国外公司请去做高级职员了,我们也有一些人把西方的官方网站给黑了……但是,我们用的编译工具是谁的产品?我们微机里装得是谁做出的操作系统?我们的程序跑在谁的芯片上?
爱之深,恨之切。我爱的是中国,但我痛恨不是中国,而是在中国编程界普遍流行的“浅薄”和“自以为是”,这是我们民族软件业的一颗毒瘤!
是的,现在编程方面快速入门的书满天飞,让程序员的门槛越来越低。我这个外行就得益于这个“低门槛”,跑了进来。但进来后,我们就不能再这样浅薄下去了——我的兄弟们!
用他国提供的工具做几个网站,写几个应用程序,弄出几个病毒…… 是振兴不了民族软件业的。顺便说一句:我尊敬求伯君,但我不认为金山公司和其系列产品配得上被称为“民族软件业”的大旗,相对这个称号,它差得太远了。
…… ……
写flash 软件的人会认为用flash做动画的人比他历害吗?Adobe公司真的认为考取Adobe证书的人是“人才”吗?MSCE、MSCD…… 通过这类考试得到微软徽章的人,在微软眼里是“人才”还是“义务推销员”?持这类证书以及其他一些大软件公司认证的人,你们还在以为自己是“中国软件业的精英”而感叹“怀才不遇”、工资太少吗?
醒醒吧,朋友。别再用编程不需要理论的话来自欺欺人了,别再用自己的浅薄来教导别人像自己一样浅薄了。我想问问那些称数学、数据结构等基础课程对编程没用的人:
请你们搞清一个概念:是这些理论“没用”,还是你们“没用到”;是你们“没用到”,还是你们的水平根本“用不到”;是你们“不需要用”,还是你们根本“不会用”?
举个例子,操作系统中的工作调度,若工作优先权相同,用什么方法进行调度?当然是“先到先做”——这就是数据结构中“队列”的应用。你们说“用不到”,只怕是因为到目前为止还没机会接触这类“高端编程”的挑战吧?这样的话,那就算了,挣你的钱去,但别再来这里误人子弟,吹嘘什么优秀的程序员不需要理论。
是谁说系统软件发展的黄金时代已经过去了?Linux不就是在MS操作系统雄霸多年的情况下一举成名的吗?中国难道就找不到这样一个机会?不,如果我们的程序员克服了现在的浮燥与急功近利,我们一样可以在“系统软件”这一软件业的“高端”树立自己的品牌!所以请看下面——

3、年轻人应该有宏伟的志向。
用别人的产品做自己的东西,你永远只是个“高级客户”,成不了真正的开发者。不管你用他国的系统软件开发出多少好的产品,挣了多少钱,只要人家一升级、或一推出新产品,你口袋里的银子连同最后一条小裤叉也会被剥夺得一干二净。你,只不过是一个高级打工仔。
我希望打算进入编程界的朋友们,特别是现在还很年轻的朋友,能有一个比较高的志向。更希望已经进到这行的朋友们能有以“振兴民族软件业”为己任,力争成为中国软件业的“旗手”。
我不赞同方东兴把微软骂得一无是处。更不赞同年轻人学他那样,一赌气而拒绝用微软的产品,拒绝Windows、拒绝VC 、拒绝IE ……
我认为方东兴只是个狭隘的民族主义者。他看到了中国软件业民族的一面,却不愿承认我们落后的一面。毫无根据的“自尊”等于自取灭亡。清朝末年,我们的科技并不落后于西方多少,但我们过分“自尊”的“大国思想”却使我们失去了向其他国家学习的机会。当我们嘲笑西方人的蓝眼睛、大鼻子的时候,他们的坚船利炮,却把我们“央央大国”的皇帝、太后打得满世界逃难。慈禧太后被打得满地找牙的时候,不得不说出“量中华之物力,博与国之欢欣”的龌龊话,此时,她“大国皇太后”的自尊何在呢?前面自尊过了头,事后必遭报应。这报应一持续,就是几百年,直到现在。难道我们还要继续闭门造车,再走老路吗?
我们现在承认微软比我们强,向微软学习,并不等于我们永远要跟在他后面跑!在我们低下头的时候,我们就应该想到,何时能再抬起这颗高贵的头颅!!!而且是“一定”!!!!!自尊不是错,错是错在“太盲目”——妄自尊大,你就要和慈禧一样被打得满地找牙。做为一个大国,一个明智的民族,我们不能讳疾忌医。
年轻人,志当存高远。相信我,当你以民族振兴为己任的时候,封王称帝、富贵荣华,都只不过是千秋伟业的一个副产品。在这个尊重知识、崇尚科学的年代,志向高远的人,永远不必担心自己的“钱途”。
不必讳言,我承认我当初进入编程领域不完全出于兴趣,也有“钱途”方面的考虑。但就好像当年参加八路的战士当中,有些只是报着能吃上军粮或打鬼子报家仇的思想入伍的,但后来却学习了马列,提高了觉悟,转为以兴国救民为目标一样,当我一步步深入到这行以后,当我决定考研并慢慢提高了认识以后,我的目的变了。我觉得应该有个更高的人生目标,更高志向和追求来支持我的行动。这个目标就是:为民族软件业尽一把自己的力。
真心希望你与我同行。

4、几点建议:
建议大家耐下心来先学好理论,然后再选择具体的工具或语言。不过,在所有这一切开始以前,先打好C语言和汇编基础。
能不能得道,就看你在见到别人做出一些花里胡哨的东西时,是不是能坚定信心、耐住寂寞、抵御诱惑了。
一个和我一起学习C语言的人,学完就直接开始玩VC,而我则潜下心来学了些C++和理论方面的东西。早早地,他就能仿照书上用VC做些界面似的东西在我面前炫耀,可后来,当我基础理论的学习告一段落,做个图书管理程序卖了800大洋时,他还只是停留在做“例子程序”的水平上。现在我们谈论起编程,深度早已不可同日而语了。他起跑领先,却落在了后面。
我不敢自以为是,只是想用这个亲身经历告诉大家:学编程,决不可心浮气燥。
5、结束语
我的话触到许多人的痛处,而且由于写时心中气愤难平,有些出言不逊,可能要遭人骂了。不过,既然写了,就不怕骂。因为:以上所言全是忠告,识不识货,就看您的眼光了。

好人修电脑的十五条准则

2015年9月17日 评论已被关闭

好人修电脑的十五条准则
http://www.dadclab.com/archives/3893.jiecao
当了多年好人学到了很多经验,总结了一份准则。

1、首先请记住这一条:永远不要尝试用过电话或是文字解决某个问题,对方很有可能连控制面板是什么东西都不知道,对方造作的步调永远不会跟你所思考的画面同步!你永远懒于解释给他们听!如果电话里能解决问题,还要那么多电脑维修店和售后干啥?

2、修电脑不会给你带来妹子,只会给你带来好人卡,更多的电脑问题和浪费大把人参。

3、在接活之前先判定自己是否具备该问题的维修能力,并向对方表明自己可能无法完全解决问题。

4、对于电脑之外的其他设备,做到尽量不维修,毕竟这不是专场,并劝说对方拿到售后去维修,专门的问题留给专门的售后去解决。

5、接到求救电话,一定要问清楚对方有什么事,出了什么问题,告诉对方目前自己所在的位置,然后商定维修时间和预计维修耗时,并准备相关需要的软件以及工具。

6、既然要当好人,修电脑、装系统、处理问题是肯定的,如有条件一定要自行封装一个XP/WIN7系统,随身写道一个移动存储设备放置软件库,并不是对方家里肯定能上网并且是高带宽或者是有驱动备份,这会节约你一半以上的维修时间。(如果你想在妹子家里消磨时间交流感情除外)

7、对电脑外观的检查永远是第一位的,很多时候出现的问题都是比较弱的问题,看看设备线路是否连接正常,是否通电,相关设置是否正确。

8、好好询问哪些东西需要备份,那排对方说漏了也要自行将其做好备份,要不然就准备恢复软件继续浪费大把人参。

9、不要评论对方机器的配置。

10、不要纠结于名词。

11、没有绝对好用的杀毒软件,当对方问起时要坚定回答自己的机子都是裸奔,杀毒完全靠手工。

12、除非有自己的信息员和渠道,否则不要帮比人买组装电脑,这是一件吃力不讨好的事情。除了问题后反而容易让对方有推卸责任的目标。

13、不要反感以下两句话:

1.我的电脑又出问题了。

2.过来帮我看看吧。

这两句话会伴随你很久很久。

14、电脑高手==万年好人、随叫随到的免费电脑维修工,要习惯这个名头。

15、不要害怕指责,因为你无法逃避。

—EOF—

嘛,看完完全感觉。。肉疼。。

这就是传说中“高手”的宿命啊~~

如何成为某个领域的顶级高手?——一万小时练习法

2015年9月13日 评论已被关闭

如何成为某个领域的顶级高手?——一万小时练习法

http://blog.sina.com.cn/s/blog_65f2d7050100vvsg.html

加拿大畅销书作家麦尔坎·葛拉威尔在《异数》一书中指出:“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。只要经过1万小时的锤炼,任何人都能从平凡变成超凡。”他将此称为“一万小时定律”。

一万小时是什么概念?那大约是每天练习三小时,风雨无阻,连续十年。葛拉威尔引述大量研究数据表明,世界上不论任何行业,当你具备基本技能后,最终能否出类拔萃,成为专家、权威、大师,只有一个因素最重要,那就是练习、练习、再练习,最低限度是一万小时。

随着畅销书《异类》的流行,“练习一万小时成天才”这个口号现在是尽人皆知。也许仍然有不少人相信那些不世出的天才必有天生的神秘能力,但科学家通过大量的调查研究已经达成共识,那就是所有顶级高手都是练出来的。不但如此,最近几年的科学进展,人们可能第一次拥有了一个关于怎样炼成天才的统一理论。

好消息是除了某些体育项目对天生的身高和体型有特殊要求之外,神秘的天生素质并不存在,也就是说人人都有可能成为顶级高手。早在20多年以前,芝加哥大学的教育学家 Benjamin Bloom 就曾经深入考察过120名从音乐到数学多个领域内的精英人物,发现他们幼年时代没有任何特别之处。后人的研究更证明,在多个领域内,就连智商都跟一个人能不能达到专家水平没关系。

有个匈牙利心理学家很早就相信只要方法得当,任何一个人都可以被训练成任何一个领域内的高手。为了证明这一点,他选择了一个传统上女性不擅长的项目,也就是国际象棋。结果他和妻子把自己的三个女儿都训练成了国际象棋世界大师,这就是著名的波尔加三姐妹。这个实验甚至证明哪怕你不爱好这个领域,也能被训练成这个领域的大师,因为三姐妹中的一个并不怎么喜欢国际象棋。

而坏消息是成为大师需要长时间的苦练。每天练三小时,完成一万小时需要十年时间,但这只是达到世界水平的最低要求。统计表明对音乐家而言,世界级水平要求的训练时间是十五到二十五年。但最关键的并不是练习的时间,而是练习的方法。

天才是怎样炼成的?中国传统思维比较强调一个“苦”字,冬练三九夏练三伏,甚至是头悬梁锥刺股。而近代生活条件越来越好,人们则开始强调一个“爱”字,说兴趣是最好的老师,强调寓教于乐,“哈佛女孩”的家长们纷纷写书,介绍自己的孩子如何一路玩进名校。

很多励志故事和流行的成功学书籍最爱强调的似乎是“顿悟”,认为一个人之所以不成功是因为他没想通,他没有认识到真正的自己!好像一旦一个人顿悟到了真正的自己,他就会非常简单地在本来应该属于自己的领域成为天才人物。一个销售员可能认为真正的自己其实是个小说家,一个医生可能认为真正的自己其实是个画家 — 唯一的问题是他们从来没有写过小说或者画过画 — 但他们认为他们距离“真正的自己”只有一步之遥,一旦尝试了就会爆发天才。

所有这些关于成功学的个人经验和励志故事都不科学。假设一个成功人士做过一百件事,包括参加演讲比赛,衣着有个性,听英文歌曲,最喜欢的颜色是绿色等等,他会非常自得地把这一百件事都写进自传,没准还要加上女朋友的影响。然而其中真正起到决定性作用的可能只有四件事,问题是他和读者都不知道是哪四件。

科学家不信励志故事,他们只相信调查研究。在过去二三十年内,心理学家们系统地调研了各行各业内的从新手,一般专家到世界级大师们的训练方法,包括运动员,音乐家,国际象棋棋手,医生,数学家,有超强记忆力者等等,试图发现其中的共性。他们的研究甚至细致到精确记录一所音乐学院的所有学生每天干的每一件小事,用多少时间做每件事,父母和家庭环境,来比较到底是什么使得那些音乐天才脱颖而出。

现在这项工作已经成熟了。2006年,一本900多页的书,The Cambridge Handbook of Expertise and Expert Performance,出版。这是“怎样炼成天才”研究的一本里程碑式的学术著作,此书直接引领了后来一系列畅销书的出现,包括格拉德威尔的《异类》,Geoff Colvin 的 Talent is Overrated,和 Daniel Coyle 的 The Talent Code 等等。科学家们不但证明了高手是练出来的,而且通过考察各个领域最好的训练方法的共性,总结了一套统一的练习方法,这就是所谓“刻意练习”(deliberate practice)。

过去多年来,训练方法是不断进步的。比如说作曲,假设一名普通学生使用普通训练方法六年时间能达到的水平,另一个学生使用新的训练方法三年就能达到,那么我们可以说这个新训练方法的“有效指数”是200%。统计表明,莫扎特当时的训练,他的有效指数是130%。而二十世纪的天才也许没有莫扎特有名,但其训练水平都能达到300%到500%!十三世纪的哲学家培根曾经认为任何人都不可能在少于30年之内掌握数学,而现在的学生十几岁的时候已经学到多得多的数学,教学方法进步了。事实上,我们今天在所有领域都比过去做得更好,体育世界纪录被不断打破,艺术家们的技巧也是过去根本无法想象的。

训练方法重要性的另一个体现是“天才”的扎堆出现,比如曾经有一个时期俄罗斯对女子网球,韩国对女子曲棍球,更不必说中国对乒乓球的的绝对优势。更进一步,哪怕你这个国家传统上并不擅长这个项目,只要有一名教练摸索掌握了科学训练法,那么他就可以带出一代绝世高手,比如中国花样滑冰教练姚滨。人们经常感慨中国十多亿人居然找不到11个足球天才 — 如果天才是天生的,那么十多亿人必然足以产生很多天才,但天才是练出来的,而中国缺乏有效的练习环境,人口再多也比不上欧洲小国。

刻意练习

首次提出“刻意练习”这个概念的是佛罗里达大学心理学家 K. Anders Ericsson。这套练习方法的核心假设是,专家级水平是逐渐地练出来的,而有效进步的关键在于找到一系列的小任务让受训者按顺序完成。这些小任务必须是受训者正好不会做,但是又正好可以学习掌握的。完成这种练习要求受训者思想高度集中,这就与那些例行公事或者带娱乐色彩的练习完全不同。“刻意练习”的理论目前已经被广泛接受,我们可以总结一下它的特点。

1. 只在学习区练习

科学家们考察花样滑冰运动员的训练,发现在同样的练习时间内,普通的运动员更喜欢练自己早已掌握了的动作,而顶尖运动员则更多地练习各种高难度的跳。普通爱好者打高尔夫球纯粹是为了享受打球的过程,而职业运动员则集中练习在各种极端不舒服的位置打不好打的球。真正的练习不是为了完成运动量,练习的精髓是要持续地做自己做不好的事

心理学家把人的知识和技能分为层层嵌套的三个圆形区域:最内一层是“舒适区”,是我们已经熟练掌握的各种技能;最外一层是“恐慌区”,是我们暂时无法学会的技能,二者中间则是“学习区”。只有在学习区里面练习,一个人才可能进步。有效的练习任务必须精确的在受训者的“学习区”内进行,具有高度的针对性。在很多情况下这要求必须要有一个好的老师或者教练,从旁观者的角度更能发现我们最需要改进的地方。

只在学习区练习,是一个非常强的要求。一般的学校课堂往往有几十人按照相同的进度学习知识,这种学习是没有针对性的。同样的内容,对某些同学来说是舒适区根本无需再练,而对某些学生则是恐慌区。科学教学必须因材施教,小班学习,甚至是一对一的传授。真正高手训练与其说是老师教学生,不如说是师傅带学徒。

一旦已经学会了某个东西,就不应该继续在上面花时间,应该立即转入下一个难度。长期使用这种方法训练必然事半功倍。2004年的一项研究表明,大学生的学习成绩和他们在学习上投入的总时间没有直接关系,关键是学习方法。

2. 大量重复训练。

从不会到会,秘诀是重复。美国加州有个“害羞诊所”(The Shyness Clinic),专门帮助那些比如说不敢和异性说话的人克服害羞心理。这个诊所的心理学家不相信什么心理暗示疗法,什么童年回忆之类,他们相信练习。他们认为使人害羞的并不是事情本身,而是我们对事情的观点。怎么治疗恐女症?做法是设计各种不同难度的场合,从在房间内集体对话到直接跑到大街上找陌生美女搭讪,安排接受治疗者在一个疗程之内跟130个女人聊过天。

这种把不常见的高难度事件重复化的办法正是MBA课程的精髓。在商学院里一个学生每周可能要面对20个真实发生过的商业案例,学生们首先自己研究怎么决策,提出解决方案,最后老师给出实际的结果并作点评。学习商业决策的最好办法不是观察老板每个月做两次决策,而是自己每周做20次模拟的决策。军事学院的模拟战,飞行员在计算机上模拟各种罕见的空中险情,包括丘吉尔对着镜子练习演讲,都是重复训练。

在体育和音乐训练中,比较强调“分块”练习。首先你要把整个动作或者整首曲子过一遍,看专家是怎么做的。然后把它分解为很多小块,一块一块地学习掌握。在这种训练中一定要慢,只有慢下来才能感知技能的内部结构,注意到自己的错误。在美国一所最好的小提琴学校里,甚至有禁止学生把一支曲子连贯地演奏的要求,规定如果别人听出来你拉的是什么曲子,那就说明你没有正确练习。职业的体育训练往往是针对技术动作,而不是比赛本身。一个高水平的美式足球运动员只有1%的时间用于队内比赛,其他都是各种相关的基础训练。

反过来说如果没有这种事先的重复训练,一个人面对不常见的事件往往会不知所措。统计表明工作多年的医生通过读X光片诊断罕见病症的水平反而不如刚毕业的医学院学生 — 因为很少遇到这种病例,而在医学院学到的东西早就忘了。最好的办法其实是定期地让医生们拿过去的旧X光片集中训练,而不是期待在工作中碰到。

3. 持续获得有效的反馈。

传道,授业,解惑,老师和教练最大的用处是什么?也许对一般人来说小学老师最大的作用是激发了他学习的兴趣,教会了他什么东西,曾经有过传道授业解惑。而真正的高手都有很强的自学能力,对他们而言,老师和教练的最重要作用是提供即时的反馈。

一个动作做得好与不好,最好有教练随时指出,本人必须能够随时了解练习结果。看不到结果的练习等于没有练习:如果只是应付了事,你不但不会变好,而且会对好坏不再关心。在某种程度上,刻意练习是以错误为中心的练习。练习者必须建立起对错误的极度敏感,一旦发现自己错了会感到非常不舒服,一直练习到改正为止。

从训练的角度,一个真正好教练是什么样的?John Wooden 是美国最具传奇色彩的大学篮球教练,他曾经率领 UCLA 队在12年内10次获得 NCAA 冠军。为了获得 Wooden 的执教秘诀,两位心理学家曾经全程观察他的训练课,甚至记录下了他给球员的每一条指令。结果统计表明,在记录的2326条指令之中, 6.9%是表扬,6.6%是表示不满,而有75% 是纯粹的信息,也就是做什么动作和怎么做。他最常的办法是三段论:演示一遍正确动作,表现一遍错误动作,再演示一遍正确动作。

与外行想象的不同,最好的教练从不发表什么激情演说,甚至不讲课,说话从不超过20秒。他们只给学生非常具体的即时反馈。所有训练都事先进行无比详细的计划,甚至包括教运动员怎么系鞋带。他们仿佛有一种诡异的知道学员在想什么的能力,即使是第一次见面能指出学生在技术上最需要什么。他们是绝对的因材施教,源源不断地提供高度具有针对性的具体指导。

获得反馈的最高境界是自己给自己当教练。高手工作的时候会以一个旁观者的角度观察自己,每天都有非常具体的小目标,对自己的错误极其敏感,并不断寻求改进

4. 精神高度集中。

刻意练习没有“寓教于乐”这个概念。曾经有个著名小提琴家说过,如果你是练习手指,你可以练一整天;可是如果你是练习脑子,你每天能练两个小时就不错了。高手的练习每次最多1到1.5小时,每天最多4到5小时。没人受得了更多。一般女球迷可能认为贝克汉姆那样的球星很可爱,她们可能不知道的是很少有球员能完成贝克汉姆的训练强度,因为太苦了。

科学家们曾经调查研究了一个音乐学院。他们把这里的所有小提琴学生分为好(将来主要是做音乐教师),更好,和最好(将来做演奏家)三个组。这三个组的学生在很多方面都相同,比如都是从8岁左右开始练习,甚至现在每周的总的音乐相关活动(上课,学习,练习)时间也相同,都是51个小时。

研究人员发现,所有学生都了解一个道理:真正决定你水平的不是全班一起上的音乐课,而是单独练习:

- 最好的两个组学生平均每周有24小时的单独练习,而第三个组只有9小时。

- 他们都认为单独练习是最困难也是最不好玩的活动。

最好的两个组的学生利用上午的晚些时候和下午的早些时候单独练习,这时候他们还很清醒;而第三个组利用下午的晚些时候单独练习,这时候他们已经很困了。

最好的两个组不仅仅练得多,而且睡眠也多。他们午睡也多。

那么是什么因素区分了前两个组呢?是学生的历史练习总时间。到18岁,最好的组中,学会平均总共练习了7410小时,而第二组是 5301小时,第三组 3420小时。第二组的人现在跟最好的组一样努力,可是已经晚了。可见要想成为世界级高手,一定要尽早投入训练,这就是为什么天才音乐家都是从很小的时候就开始苦练了。

人脑的学习原理

现代神经科学和认知科学认为,几乎没有任何技能是人一出生就会的。哪怕是对简单物体的识别,把东西抓取过来这些简单的动作,也是婴儿后天学习的结果。一个人一出生的时候根本不可能预见到将来自己需要什么技能,基因不可能把一切技能都用遗传的方法事先编程,那样的话太浪费大脑的存储空间。最好的办法是不预设任何技能,只提供一个能够学习各种技能的能力,这就是人脑的巧妙之处。基因的做法是先预设一些对刺激的基本反应和感觉,比如看见好吃的东西我们会饿等等。这些基本的反应需要调动的神经较少。但对于更高级别的技能,比如演奏音乐,需要协调调动很多神经,就必须靠后天学习了。

人的任何一个技能,都是大脑内一系列神经纤维传递的电脉冲信号的组合。解剖表明拥有不同技能的人,其大脑的神经结构非常不同,比如出租车司机大脑内识别方向的区域就特别发达。也就是说与计算机不同,人对于技能的掌握是在大脑硬件层次实现的。

而最近有一派科学家认为,髓磷脂是技能训练的关键,它的作用是像胶皮把电线包起来一样,把这些神经纤维给包起来,通过防止电脉冲外泄而使得信号更强,更快,更准确。不管练习什么,我们都是在练习大脑中的髓磷脂,就好像把一堆杂乱无章的电线被排列整齐变成电缆。直到2000年新技术允许科学家直接观察活体大脑内的髓磷脂之后,髓磷脂的作用才被发现,而且一直到2006年才第一次被在学术期刊上说明。科学家认为髓磷脂是脑神经的高速公路,提高信号传递速度,并且可以把延迟时间减少30倍,总共提速3000倍,甚至可以控制速度,想慢就慢。

人脑之中分布着大量“自由的”髓磷脂,它们观测脑神经纤维的信号发射和组合,哪些神经纤维用的越多,它们就过去把这一段线路给包起来,使得线路中的信号传递更快,形成高速公路。这就是为什么练习是如此重要。

髓磷脂理论可以解释很多事情。比如为什么小孩常会犯错?他们的神经系统都在,也知道对错,只是需要时间去建立起来髓磷脂的高速网络。为什么习惯一旦养成不容易改变?因为所谓“习惯”,其实是以神经纤维电缆组合的形式“长”在大脑之中的,髓磷脂一旦把神经包起来,它不会自动散开——

改变习惯的唯一办法是形成新习惯。

为什么年轻人学东西快?因为尽管人的一生之中髓磷脂都在生长,但年轻人生长得最快。最激进的理论则认为人跟猴子的最显著区别不在于脑神经元的多少,而在于人的髓磷脂比猴子多20%!解剖表明,爱因斯坦的大脑中的神经元数量是平均水平,但他拥有更多能够产生髓磷脂的细胞。

谁愿意练习一万小时?

看了钢琴家郎朗的传记之后,可能很多人会怀疑是否真的应该让孩子接受这样的苦练。实际上,顶级运动员都是穷人家的孩子。不练这一万小时,一定成不了高手,但问题是考虑到机遇因素练了这一万小时也未必成功。

这就是兴趣的作用了。如果说有什么成功因素是目前科学家无法用后天训练解释的,那就是兴趣。有的孩子似乎天生就对某一领域感兴趣。感兴趣并不一定说明他能做好,就算不感兴趣只要愿意练,也能练成。兴趣最大的作用是让人愿意在这个领域内苦练。

不论如何,刻意练习是个科学方法,值得我们把它运用到日常工作中去。显然我们平时中做的绝大多数事情都不符合刻意练习的特点,这可能就是为什么大多数人都没能成为世界级高手。天才来自刻意练习。

from  http://www.folo.cn/user1/20140/archives/2011/93276.html

本科毕业5年拉开差距的原因

2015年9月7日 评论已被关闭

本科毕业5年拉开差距的原因
http://blog.csdn.net/lxpbs8851/article/details/7961710
工作生活任务创业
有人工作,有人继续上学,大家千万不要错过这篇文章,能看到这篇文章也是一种幸运,真的受益匪浅,对我有很大启迪,这篇文章将会改变我的一生,真的太好了,希望与有缘人分享,也希望对有缘人有所帮助!看完之后有种“相见恨晚”的感觉,特别激动,希望大家好好的珍藏这篇文章,相信多年以后,再来看这篇文章,一定有不同的感觉。
正如”打工皇帝”唐骏说:”我觉得有两种人不要跟别人争利益和价值回报。第一种人就是刚刚进入企业的人,头5年千万不要说你能不能多给我一点儿工资,最重要的是能在企业里学到什么,对发展是不是有利……”
人总是从平坦中获得的教益少,从磨难中获得的教益多;从平坦中获得的教益浅,从磨难中获得的教益深。一个人在年轻时经历磨难,如能正确视之,冲出黑暗,那就是一个值得敬慕的人。最要紧的是先练好内功,毕业后这5年就是练内功的最佳时期,练好内功,才有可能在未来攀得更高。
出路在哪里?出路在于思路!
其实,没有钱、没有经验、没有阅历、没有社会关系,这些都不可怕。没有钱,可以通过辛勤劳动去赚;没有经验,可以通过实践操作去总结;没有阅历,可以一步一步去积累;没有社会关系,可以一点一点去编织。但是,没有梦想、没有思路才是最可怕的,才让人感到恐惧,很想逃避!
人必须有一个正确的方向。无论你多么意气风发,无论你是多么足智多谋,无论你花费了多大的心血,如果没有一个明确的方向,就会过得很茫然,渐渐就丧失了斗志,忘却了最初的梦想,就会走上弯路甚至不归路,枉费了自己的聪明才智,误了自己的青春年华。
荷马史诗《奥德赛》中有一句至理名言:”没有比漫无目的地徘徊更令人无法忍受的了。”毕业后这5年里的迷茫,会造成10年后的恐慌,20年后的挣扎,甚至一辈子的平庸。如果不能在毕业这5年尽快冲出困惑、走出迷雾,我们实在是无颜面对10年后、20年后的自己。毕业这5年里,我们既有很多的不确定,也有很多的可能性。
毕业这5年里,我们既有很多的待定,也有很多的决定。
迷茫与困惑谁都会经历,恐惧与逃避谁都曾经有过,但不要把迷茫与困惑当作可以自我放弃、甘于平庸的借口,更不要成为自怨自艾、祭奠失意的苦酒。生命需要自己去承担,命运更需要自己去把握。在毕业这5年里,越早找到方向,越早走出困惑,就越容易在人生道路上取得成就、创造精彩。无头苍蝇找不到方向,才会四处碰壁;一个人找不到出路,才会迷茫、恐惧。
生活中,面对困境,我们常常会有走投无路的感觉。不要气馁,坚持下去,要相信年轻的人生没有绝路,困境在前方,希望在拐角。只要我们有了正确的思路,就一定能少走弯路,找到出路!
成功的人不是赢在起点,而是赢在转折点。
不少刚刚毕业的年轻人,总是奢望马上就能找到自己理想中的工作。然而,很多好工作是无法等来的,你必须选择一份工作作为历练。职业旅程中的第一份工作,无疑是踏入社会这所大学的起点。也许你找了一份差强人意的工作,那么从这里出发,好好地沉淀自己,从这份工作中汲取到有价值的营养,厚积薄发。千里之行,始于足下,只要出发,就有希望到达终点。
起点可以相同,但是选择了不同的拐点,终点就会大大不同!
毕业这几年,我们的生活、职业等都存在很多不确定的因素,未来也充满了各种可能。这个时候,必须学会选择,懂得放弃,给自己一个明确的定位,使自己稳定下来。如果你不主动定位,就会被别人和社会”定型”!
可以这么说:一个人在毕业这5年培养起来的行为习惯,将决定他一生的高度。我们能否成功,在某种程度上取决于自己对自己的评价,这就是定位。你给自己定位是什么,你就是什么。定位能决定人生,定位能改变命运。丑小鸭变成白天鹅,只要一双翅膀;灰姑娘变成美公主,只要一双水晶鞋。
人的命,三分天注定,七分靠打拼,有梦就”会红”,爱拼才会赢。只要不把自己束缚在心灵的牢笼里,谁也束缚不了你去展翅高飞。
现实情况远非他们所想的那样。于是,当优越感逐渐转为失落感甚至挫败感时,当由坚信自己是一块”金子”到怀疑自己是一粒”沙子”时,愤怒、迷茫、自卑就开始与日俱增。
其实,应该仔细掂量一下自己,你是否真是金子?是真金,手中要有绝活,才能上要有过人之处才行。一句话:真金是要靠实力来证明的,只有先把自己的本领修炼好了,才有资格考虑伯乐的事情
每颗珍珠原本都是一粒沙子,但并不是每一粒沙子都能成为一颗珍珠。
想要卓尔不群,就要有鹤立鸡群的资本。忍受不了打击和挫折,承受不住忽视和平淡,就很难达到辉煌。年轻人要想让自己得到重用,取得成功,就必须把自己从一粒沙子变成一颗价值连城的珍珠。
天有下雨与日出,人生高峰与低谷。
莫为浮云遮望眼,风物长宜放眼量。
只要拂去阴霾,就能亮出朗朗晴空。如果你在工作上有些不如意,要相信自己不会一直处于人生的低谷期,总有一天能冲破重重云层。告诉自己:我并没有失败,只是暂时没有成功!只要在内心点亮一盏希望之灯,一定能驱散黑暗中的阴霾,迎来光明。
的确,论资历,他们是不折不扣的职场菜鸟,业务涉及不深,人脉一穷二白,在工作中经常碰壁。他们的压力并不一定都像千钧大石,而是像大雨来临前的天色,灰色低沉,明明有空间,却被灰色填满每个缝隙,只能等待大雨倾盆之后的晴空。
“起得比鸡早,睡得比狗晚,干得比驴多,吃得比猪差。”这是很多刚刚毕业的人喜欢用来调侃自己生活状态的话。虽然有点儿夸张,但是,他们中的很多人的确一直都被灰色心情所笼罩–心里永远是多云转阴。记得有位哲人曾说:”我们的痛苦不是问题本身带来的,而是我们对这些问题的看法产生的。”换个角度看人生,是一种突破、一种解脱、一种超越、一种高层次的淡泊与宁静,从而获得自由自在的快乐。
一位哲人说:”人生就是一连串的抉择,每个人的前途与命运,完全把握在自己手中,只要努力,终会有成。”就业也好,择业也罢,创业亦如此,只要奋发努力,都会成功。你是不是准备把生命的承诺全部都交给别人?
毕业后这5年,是改变自己命运的黄金时期。在最能决定自己命运时,如果还不把握,那你还要等到什么时候呢?我的人生我做主,命运由己不由人。
不要活在别人的嘴里,不要活在别人的眼里,而是把命运握在自己手里。
别说你没有背景,自己就是最大的背景。美国作家杰克·凯鲁亚克说过一句话:”我还年轻,我渴望上路。”在人生的旅途中,我们永远都是年轻人,每天都应该满怀渴望。每个人的潜能都是无限的,关键是要发现自己的潜能和正确认识自己的才能,并找到一个能充分发挥潜能的舞台,而不能只为舞台的不合适感到不快。要客观公正地看待自己的能力,结合自己的实际情况和爱好冷静选择,尽可能到最需要自己、最适合自己的地方。
在人力资源管理界,特别流行一个说法,即”骑马,牵牛,赶猪,打狗”理论:人品很好,能力又很强的,是千里马,我们要骑着他;人品很好但能力普通的,是老黄牛,我们要牵着他;人品、能力皆普通的,就是”猪”,我们要赶走他;人品很差能力很强的,那是”狗”,我们要打击他。
我想,刚刚毕业几年的你,一样胸怀大志,一样想成为一匹被人赏识、驰骋沙场的千里马吧?那么,就好好沉淀下来。低就一层不等于低人一等,今日的俯低是为了明天的高就。所谓生命的价值,就是我们的存在对别人有价值。能被人利用是一件好事,无人问津才是真正的悲哀!
能干工作、干好工作是职场生存的基本保障。
任何人做工作的前提条件都是他的能力能够胜任这项工作。能干是合格员工最基本的标准,肯干则是一种态度。一个职位有很多人都能胜任,都有干好这份工作的基本能力,然而,能否把工作做得更好一些,就要看是否具有踏实肯干、苦于钻研的工作态度了。
在能干的基础上踏实肯干。
工作中,活干得比别人多,你觉得吃亏;钱拿得比别人少,你觉得吃亏;经常加班加点,你觉得吃亏……其实,没必要这样计较,吃亏不是灾难,不是失败,吃亏也是一种生活哲学。现在吃点儿小亏,为成功铺就道路,也许在未来的某个时刻,你的大福突然就来了。
能吃亏是做人的一种境界,是处世的一种睿智。
在工作中并不是多做事或多帮别人干点儿活就是吃亏。如果领导让你加加班、赶赶任务,别以为自己吃了大亏,反而应该感到庆幸,因为领导只叫了你,而没叫其他人,说明他信任你、赏识你。吃亏是一种贡献,你贡献得越多,得到的回报也就越多。乐于加班,就是这样的一种吃亏。
舍得舍得,有舍才有得;学会在适当时吃些亏的人绝对不是弱智,而是大智。
给别人留余地就是给自己留余地,予人方便就是予己方便,善待别人就是善待自己。
傻人有傻福,因为傻人没有心计。和这样的人在一起,身心放松,没有太多警惕,就能相互靠近。傻在很多时候意味着执着和忠贞,也意味着宽厚和诚实,让人不知不觉站到他一边。傻人无意中得到的,比聪明人费尽心机得到的还多。毕业这几年,你的天空中只飘着几片雪花,这样你就满足了吗?成功需要坚持与积累,与其专注于搜集雪花,不如省下力气去滚雪球。巴菲特说:”人生就像滚雪球,最重要的是发现很湿的雪和很长的坡。”让自己沉淀下来,学着发现”很湿的雪”,努力寻找”很长的坡”。记住:散落的雪花会很快融化,化为乌有,只有雪球才更实在,才能长久。
在毕业这几年里,你要是能做到比别人多付出一分努力,就意味着比别人多积累一分资本,就比别人多一次成功的机会。
什么是职业化呢?职业化就是工作状态的标准化、规范化、制度化,即在合适的时间、合适的地点用合适的方式说合适的话、做合适的事,使知识、技能、观念、思维、态度、心理等符合职业规范和标准。”在每个行业里,都有很多出色的人才,他们之所以能存在,是因为比别人更努力、更智慧、更成熟。但是,最重要的是,他们比一般人更加职业化!这就是为什么我现在能当你老板的原因。一个人仅仅专业化是不够的,只有职业化的人才能飞在别人前面,让人难以超越!”不要以为我们现在已经生存得很安稳了。对于毕业5年的人来讲,一定要认清即将面临的五大挑战。

一、赡养父母。
二、结婚生子。
三、升职加薪。
四、工作压力。
五、生活质量。
有的人为生存而雀跃,目光总是停在身后,三天打鱼两天晒网,有始无终。
有的人为发展而奋斗,目光总是盯在正前方,每天进步一点点,坚持不懈。
毕业这几年,不能没有追求和探索,不能没有理想和目标。人生如逆水行舟,不进则退。甘于现状的生活就是不再前行的船,再也无法追上时代前进的步伐。一定要抓紧每一秒钟的时间来学习,要明白学习不是学生的专利。小聪明的人最得意的是:自己做过什么?大智慧的人最渴望的是:自己还要做什么?
小聪明是战术,大智慧是战略;小聪明看到的是芝麻,大智慧看到的是西瓜。
在这个世界上,既有大人物,也有小角色,大人物有大人物的活法,小人物有小人物的潇洒,每个人都有自己的生活方式,谁也勉强不了谁。但是,小聪明只能有小成绩和小视野,大智慧才能有大成就和大境界。小企业看老板,中企业看制度,大企业看文化。
小公司与大企业都有生存之道,没有好坏之分,但对一个人不同阶段的影响会不同。
小公司肯定想要发展为大企业,这是一种目标,年轻人也要给自己的职业生涯制定目标。毕业几年的你,是否经常会怯场或者是感到没有底气?居安思危绝对不是危言耸听!此刻打盹,你将做梦;此刻学习,你将圆梦。在竞争激烈的人生战场上,打盹的都是输家!
每个人在年轻的时候似乎都豪情万丈,什么都不怕,可是随着年龄的增长,每天想着房子、工作、养家糊口这些俗事儿,再也没有年轻时那种敢于”上天探星、下海捞月”的勇气了。是我们改变了生活,还是生活改变了我们?我们的思想越来越复杂,因为有了越来越多的舍不得、越来越多的顾虑,我们总是在徘徊、总是在犹豫。毕业开始一两年,生活的重担会压得我们喘不过气来,挫折和障碍堵住四面八方的通口,我们往往在压迫得自己发挥出潜能后,才能杀出重围,找到出路。可是两三年后,身上的重担开始减轻,工作开始一帆风顺,我们就松懈了下来,渐渐忘记了潜在的危险。直到有一天危机突然降临,我们在手足无措中被击败……毕业这几年,仍然处于危险期,一定要有居安思危的意识,好好打拼,这样才能有一个真正的安全人生!
生于忧患,死于安乐。如果你想跨越自己目前的成就,就不能画地自限,而是要勇于接受挑战。对畏畏缩缩的人来说,真正的危险正在于不敢冒险!
年轻人在社会的重压下,适应能力已变得越来越强,只是他们不自觉地习惯被环境推着走。他们不敢冒险,怕给自己带来终身的遗憾,于是告慰自己:”我对得起自己、对得起家人,因为我已竭尽全力。”其实,人只有不断挑战和突破才能逐渐成长。长期固守于已有的安全感中,就会像温水里的青蛙一样,最终失去跳跃的本能。
经历了这几年社会生活,你应该明白:这个世界上有富也有贫,有阴也有亮,有丑也有美,到底看到什么,取决于自己是积极还是消极。在年轻时学会勤勉地工作,用一种光明的思维对待生活,那么,只要张开手掌,你就会发现,里面有一片灿烂的人生。
把感恩刻在石头上,深深地感谢别人帮助过你,永远铭记,这是人生应有的一种境界;把仇恨写在沙滩上,淡淡忘掉别人伤害过你,学会宽容,让所有的怨恨随着潮水一去不复返,这也是一种人生境界。
学会倒出水,才能装下更多的水。从毕业那天开始,学会把每天都当成一个新的起点,每一次工作都从零开始。如果你懂得把”归零”当成一种生活的常态,当成一种优秀的延续,当成一种时刻要做的事情,那么,经过短短几年,你就可以完成自己职业生涯的正确规划与全面超越。
在职业起步的短短道路上,想要得到更好、更快、更有益的成长,就必须以归零思维来面对这个世界。不要以大学里的清高来标榜自己,不要觉得自己特别优秀,而是要把自己的姿态放下,把自己的身架放低,让自己沉淀下来,抱着学习的态度去适应环境、接受挑战。放下”身段”才能提高身价,暂时的俯低终会促成未来的高就。
年轻人从校园或者从一个环境进入一个新环境,就要勇于将原来环境里熟悉、习惯、喜欢的东西放下,然后从零开始。我们想在职场上获得成功,首先就要培养适应力。从自然人转化为单位人是融入职场的基本条件。一个人起点低并不可怕,怕的是境界低。越计较自我,便越没有发展前景;相反,越是主动付出,那么他就越会快速发展。很多今天取得一定成就的人,在职业生涯的初期都是从零开始,把自己沉淀再沉淀、倒空再倒空、归零再归零,正因为这样,他们的人生才一路高歌,一路飞扬。
在毕业这几年里,我们要让过去归零,才不会成为职场上那只背着重壳爬行的蜗牛,才能像天空中的鸟儿那样轻盈地飞翔。请好好品味一下杰克·韦尔奇说过的一句话:”纠正自己的行为,认清自己,从零开始,你将重新走上职场坦途。” 吐故才能纳新,心静才能身凉,有舍才能有得,杯空才能水满,放下才能超越。
归零思维五大表现:心中无我,眼中无钱,念中无他,朝中无人,学无止境。
年轻人难免带着几分傲气,认为自己无所不能、所向披靡,其实不然,初入职场的新人还是个”婴儿”,正处在从爬到走的成长阶段。在毕业这几年里,一定要让自己逐步培养起学徒思维、海绵思维、空杯思维,具有这样思维的人心灵总是敞开的,能随时接受启示和一切能激发灵感的东西,他们时刻都能感受到成功女神的召唤。

谷歌搜索结果暗藏招聘启事 看懂即是机遇

2015年9月1日 评论已被关闭

谷歌搜索结果暗藏招聘启事 看懂即是机遇

谷歌搜索结果暗藏招聘启事 看懂即是机遇

Re/code中文站 8月28日报道

谷歌是一家充满工程师文化的公司,其通过个性十足的手段,招募全世界最优秀的技术开发人才。而据外媒报道,谷歌还会在高深技术问题的搜索结果中藏匿招聘启事,以求招募优秀的人才。

据美国科技新闻网站Re/code报道,本周二,新加入谷歌的员工罗塞特(Max Rosett)通过一个博客介绍了他加盟谷歌的奇特经历。

罗塞特加入谷歌之前,是效力于网络租赁平台Apartment List的一名数据科学家。

有一天,罗塞特遇到了一个工作中令人挠头的艰深难题,随后他进入了谷歌搜索引擎,输入了他程序语言中遇到的关键词“python lambda function list comprehension”。

在搜索结果中出现了一个奇怪的内容,上边写着:“你在说我们的语言,想接受一次挑战吗?”

罗塞特点击链接,进入了谷歌专用的测试技术人才应聘者的一个网站。罗塞特遭遇了一些开发上的技术难题考试,他顺利通过了考试,随后看到了谷歌人力资源部门的表格。他输入了自己的信息。

三个月之后,谷歌人力资源部门联系了罗塞特,向他提供了一个岗位。

罗塞特表示,谷歌使用了一个相当高超的招聘手段,自己虽然没有向谷歌申请职位或是提交个人简历,谷歌却利用技术人才的搜索关键词定位了招聘对象。在此过程中,谷歌也体现了对技术人才的尊重,以及对对方隐私的保护。

面对媒体的求证,谷歌并未证实是通过罗塞特描述的方式招募优秀的技术人才。

有趣的是,谷歌的一名女发言人给新闻媒体发送了一段代码,请媒体自行破译其中的意思。这段代码的内容是:“/u0050/u0075/u007a/u007a/u006c/u0065/u0073/u0020/ u0061/u0072/u0065/u0020/u0066/u0075/u006e/u002e/ u0020/u0053/u0065/u0061/ u0072/u0063/u0068/u0020/u006f/u006e/u002e”。

经过媒体邀请专业人士进行破译,谷歌这段代码表达的意思是:“Puzzles are fun. Search on”(中文意思是:“技术难题如此有趣,继续搜索吧。”)

腾讯内推【腾讯工作机会内推】

2015年9月1日 评论已被关闭

腾讯内推【腾讯工作机会内推】

http://www.cnblogs.com/mfryf/p/4632830.html

具体职位大家可以去http://hr.tencent.com/position.php看哈。如果觉得比较合适的,可以简历发给我。我帮忙内推,内推比外面投简历机会更大哈!~我的邮箱地址:zfyouxi@gmail.com,是我的马甲哈。我收到简历有无结果都会回复的。

注:只推荐社招的,校招的请走校招流程~
—————————————-0709——————————————————————————

>>>>>腾讯内推之后需要什么流程?大概几天会有电话面试通知呢?

具体的流程就是:内部推荐到某需求方,需求方会电话联系你聊一下。同城的会直接约你过来面试,非同城的电话聊一下。如果合适,进入下一步面试,组长、总监、经理和HR。最少是要过三个人面试的。

大概花的最快的时间:第一天约你过来面试当天面试完成,第二天约组长总监经理HR群面,第三天合适就给你发Offer,第四天你去体验,第五天体检报告出来,第六天入职指引,第七天上班。我想最快最快需要7天时间。

成功和失败的标志是:没人主动、快速的联系你就差不多是不合适了。如果说大概要几天,我个人的操作是,如果这个人的简历合适的化,我会在推荐过来的一分钟后电话就会打过去。

 

内推也是需要去到HR部门的,但如果已经去到项目组长的话,合适就很快会约面试,基本上都是一次过面试。如果合适的话第二天最迟第三天就会谈offer。成功跟失败的标志:如果一周之内没有反馈估计就是不成功了,当然也会有例外,那就是这个职位不合适,可能适合另一个职位,或许2个月甚至半年之后会再有人联系你去面试。以上所说都是普遍情况,不包括个别案例。
—————————————-0626——————————————————————————
技术大佬们快来
————————————————0422——————————————————————
好像米有一个成功的。。。。。有点泄气。很多朋友都很优秀啊.技术类的比较好过吧。不好意思各位,以后技术类的发给我吧。其他市场行政运营等岗位的同学抱歉了。

—————————–328抱歉的更新—————————————————————————

各位朋友,不好意思,自从上周后我还没时间看邮箱。下周一一定会回复大家。因为最近实在太忙了。
这边要和大家反馈下,之前投递的目前除了一个技术类岗位已经成功,大部分都被拒了。有一部分朋友得到了面试(得到面试记得问HR名字和分机号哈,以免她时间长你又没有渠道跟他沟通)。所以我还是建议大家对着职位要求,然后自己往上加一点要求去发申请比较保险哈。祝大家成功。

———————–312更新———————————————————————
谢谢大家相信我给我投简历哈。我都会认真回复的。但是有些同学你直接发简历给我,或者叫我帮你看看你适合什么职位不大合适吧。之前我会回复问你的,但是现在简历太多,所以这些我现在不回复了。请理解。
大家自己认真看工作经历和岗位要求,有的工作经历和岗位要求完全不符合的,或者是工作经验少于要求的,真的不合适哈。
感谢大家。
————————————————————————————————————————
———————–310更新———————————————————————
很多投秘书,财经,运营等岗位的都没有筛选成功。
希望还是工作经验多一点,然后比较有质量的简历我才会内推。
请大家认真看清楚工作要求,年限,证书要求,不然也是造成我们HR的负担。然后我们需要大量的工程师,技术岗位的。

————————————————————————————————————————

各位,内推的意思楼下的一个小伙伴说的很清楚了。我不是HR。公司对伯乐有奖励,而且外面直接投简历的几率也比较小。如果大家觉得条件很符合,而且经验比较丰富,内推是个好的通道。而且我们也可以认识下,就当延伸职场人脉。
所以校招的同学,问我工资,问我其他具体信息的麻烦就不要再问了。

还有有发邮箱的我基本都回复了。如果没有收到回复,麻烦再发邮件提醒下我~
谢谢大家。我觉得这是件利他利己利公司的事儿。但是我觉得没有经验的尽量不要邮件我,内推的话我也要看大家简历的,不然我都没把关也是造成公司同事的工作量。请理解,谢谢。

PS:邮件我的同学尽量把你们要应聘的职位和编号告诉我啊。。。
建议大家把附件改成“姓名-工作年限-申请的工作岗位和编号”,谢谢

———————————————————————————————————–

我是个啰嗦的人。看了下大家的简历,我有几个建议哈,大家可以看看,觉得没必要的也可以忽略哈,只是我个人建议而已:

1、简历模板是不是可以认真一点呢,有些乱码的,直接从招聘网站上COPY下来的。好多没用的信息。
2、请对照招聘信息,把你们最重要的一两个工作经验重点来写。
最好写出:工作内容:1/2/3/4/5
获得奖励:1/2/(这个指的不是说获得什么证书,是可以说比如说你去年一年给公司带来了XX万的收入,或者是一个渠道经过你的优化获得了XX%的回收。数字不一定要精确,但是有数字有说服力一点)
3、跟岗位无关的经历简单写一下。还有工作了以后学校的哪些经历就麻烦不要写了。除非是特别出彩的。
4、简历的名称,上面我写过了。
5、邮件的正文。给我的邮件可以简单点啦。但是如果是直接发送给HR的,我建议邮件正文写的清晰一点。然后*****************最重要的是****************在邮件正文下面直接黏贴一下你重要的工作经历。这样HR看到其实会好很多。
6、给HR的附件建议两个格式,WORD和PDF。PDF是为了防止你wordd排版出现问题,word是因为有的公司要直接导入简历系统解析的。

————————————————————————————————————————–
各位发送邮件给我的,我都已经回复了。内推我也是要把关的哈,所以工作经验低于一年的同学不好意思了。推荐顾名思义还是最好要有经验的,请见谅。

屌丝应该知道的 6 个残酷人生事实(血泪翻译)

2015年3月1日 评论已被关闭

屌丝应该知道的 6 个残酷人生事实(血泪翻译)

http://justjavac.com/other/2014/06/12/6-harsh-truths-that-will-make-you-a-better-person.html

 

原译文标题为:Loser应该知道的 6 个残酷人生事实(血泪翻译),译者(天理难容)没有翻译 Loser, 这个词不难理解——失败者。但是,我把 Loser 改成了「屌丝」。

来自: 天理难容 (Weixu@Rutgers) 2013-01-20 09:24:29

译注:此文转载并翻译自 cracked.com,文章中很大一块其实和拖延症有关的所以发在这里。

【补注1:最初本文发在一个另一个论坛,我用了 loser 这个词来吸引眼球,但转发豆瓣的时候忘记改标题了。现在为了 SEO 的目的我就不修改标题,厚着脸皮继续哗众取宠了。】

【补注2:本文是我看原文后 2 小时粗译出来的。如果觉得译文生涩,可以搜索一下原文标题看原版。感谢大家推荐和关注。现在关注的人多了,我深感责任重大,正准备重新翻译一遍。鉴于最近忙碌的程度,二度翻译遥遥无期】


原文标题:
6 Harsh Truths That Will Make You a Better Person
六个可以让你变得更强大的残酷事实
by David Wong


【补注 by justjavac:我在译文的基础上又做了一些修改,主要是语法和修辞上。感谢「天理难容 (Weixu@Rutgers)」和原作者。】

正文:

如果你的职业道路非常顺利,你的生活美满感情顺利,你可以不用读这篇文章。 祝你一天愉快,这篇文章不是为你写的。 你做的非常出色,我们都为你自豪。

对于其余的人来说,我希望你做一件事情:说出 5 件你引以为豪的事情。 写在纸上也好,或者喊出来也好都可以。 但这里有一个条件:你不可以列出你「是」怎样的人(比如,我是一个温柔的人,我很诚实), 只能列出你「做」的事情(比如,我刚获得了全国象棋冠军,我做的 chili 是全麻省最好的)。 如果你发现很难列出五件事情,这篇文章就是为你所写的。 而且你他娘的肯定一边听一边心里会不舒服。 我的感受是,如果有人在 1995 年的时候跟我讲这些事情就好了。

6:这个世界只关心你能给予什么

我们假设一下你最爱的亲人在大街上被枪击了。 TA 一边失血一边尖叫。 一个路人冲上来说「让一下」。 他仔细检查了伤口并拿出一把小刀准备在大街上动手术取出子弹。

你问他:「你是医生吗?」

他回答说:「不是」

你说:「你知道你要做什么,对吧?你是不是退伍的军医,还是……」

这个时候那个路人感觉有点不快了。 他告诉你说他是一个好人,是一个诚实的人,他上班从来不迟到。 他告诉你说他是一个孝顺的儿子。 业余生活丰富,生活非常富足。 而且~他还说他从不说脏话……

你有点疑惑,说:「这 TMD 和我亲人被枪击躺在马路上有什么关系? 我需要一个可以在伤口上动手术的人!你到底能不能做?」

现在这个路人非常生气了——为什么你就那么自私肤浅呢? 你难道不在乎他的那些优良品德么? 他刚才不对你说他总是记住女友的生日吗? 他有那么多优良品质,你为什么就抓着他会不会外科手术这个事实不放呢?

在那个疯狂的情形下,你会用你沾满鲜血的双手用力摇晃他的肩膀, 大喊道:「废话!你说的那些优良品质都是屁话,因为在当前情况下我只需要一个可以止血动手术的人! 你这个神经病给我滚!!!」

所以,这就是我要说的第一点成人世界的残酷事实: 你其实天天都身处于上述的「当前情况」之中。 只不过换作你是那个喋喋不休的好心路人,而社会上其他所有人都换作成那个流血的伤者

如果你想知道为什么社会对你不屑,或者你为什么从不受到尊重, 这是因为社会充满了【需要某样东西】的人。 他们需要人来造房子,他们需要食物,他们需要娱乐,他们需要人来满足性欲。 你从出生开始就进入了这样的需要解决人们需求的社会系统。

你要么选择学习某种技能担当某样角色满足他人的需要,要么就选择被社会抛弃。 这个社会不在乎你有多么善良,礼貌,无私。 你会变穷,你会没有朋友,你会被遗弃。 但这是不是说我们要刻版、自私呢? 爱和温柔重要吗? 当然了,但前提是这些爱是别人需要的,也是从其他人那里得不到的。

否则的话……

5:别去相信嬉皮士的话 (Hippies are wrong)

【原文此处引用了一段视频。 国内看不了 Youtube。 可以翻墙且听力没问题的可以此处看:http://www.youtube.com/watch?feature=player_embedded&v=8kZg_ALxEz0

对于那些无法看视频的读者,这是一段著名的影院神片 Glengarry Glenn Ross 里 Alec Baldwin 的演讲。 Baldwin 的角色——你会假设是反角——对一屋子的销售员疯狂施压,警告他们说他们都会被解雇, 除非他们可以搞定他们手上的单子。

「好人?关我屁事!慈父?去你妈的!回你的家和你孩子玩去!如果你想在这里工作,给我敲定手上的单子」

非常残酷、粗鲁、甚至有点疯狂。 可是,这恰恰是这个社会对你期望的最诚实的写照。 不同的是,在现实世界里,人们认为那样讲话太粗鲁了对你不礼貌, 于是他们干脆什么都不说眼看着你失败。

这个电影片段改变我的人生。 我如果知道怎么做的话,会把它录成闹钟每天早上叫我起床。 Baldwin 因此还拿了奥斯卡奖,而这个片段是他整个电影唯一出场的场景! 正如前人已经分析过,这段演讲精彩之处在于,一般的人会理解为 「天哪,我要有这么一个混蛋老板会怎样啊?」。 而另一半人却会想「太 TMD 励志了!我现在就想去上班做业务去!」

或者,有一个心理学家写道:「如果当时你在那个房间里,你们中的一些人会明白这是工作, 会从那段演讲里吸收能量,就像一个球队教练冲你大骂一样。 你会觉得‘这家伙太有能耐了’。 而另一些人会非常介意,认为这个老板是混蛋,你没有权利跟我这样说话。」

以上节选自一篇对于「hipster(这个词很难翻译,姑且翻译为非主流潮人)」的批判文章。 文章解释了这些人为什么会难找工作,并指出上述两种不同的态度——受刺激 VS 受激励——很大程度上决定你是否在现实生活中能成功。

比如说,有人会引用搏击俱乐部里的经典台词「You are not your job」。 但事实上,你完完全全就是你的 job(职责)。 当然了,你的职责和你为公司的服务不是一回事请,但其实你只不过是你所有有用技能经验的综合体罢了。 技能是某一个个体能为社会中其他人提供的有用服务。 但别搞错了,你的「职责」——你为他人提供的有用服务——就是你的全部。

这就是为什么外科医生比喜剧作家更受到尊重。 也是为什么机修工比无业潮人更受到尊重。 如果你的死讯能登上新闻,这说明你的工作已经成为了你的标签。 搏击俱乐部里 Tyler 说 You are not your job,但他同时又操办了一家成功的肥皂公司同时成为了社会运动的领导人。 He was totally his job (这句不翻译比较好理解)。

我们再这样理解一下:你还记得 Chick-fil-A 餐厅反对同性恋婚姻么? 不论嬉皮们如何抗议,公司还不是照样卖出了成千上万的汉堡? 这不是说顾客们认可他们,而是因为他们成功地完成了履行了他们的职责——做好吃的汉堡。 这一点才是最关键的。

你不一定非要从心里喜欢这个事实。 我也不喜欢我生日的时候天下雨。 但天还是要下雨。 人们有需求,人们会认可能够满足他们需求的人。 世界就是通过这么简单的机制运行的,谁也改变不了。

如果你抗议说,我不是肤浅的物质主义者,金钱不是万能的,我只能说:「我有说过金钱吗? 说明你没看懂我的要点。」

4:你所做的事情不一定要换成钱,但一定要有益于他人

那么我们换一个非金钱的例子好了。 这个网站(cracked.com)主要面向 20 出头的男性。 我每天都要从邮箱里收到一大堆挫男抱怨女人不愿意接近他们,虽然他们是世界上最 nice 的男人。 我可以解释他们的思路有什么问题,不过最好是让 Alec Baldwin 解释最好。

(译注:此处再次引用上述视频,我真的建议大家去看那个片段!)

在我们说的例子里,Baldwin 就是你生活里那个女神。 他们当然不会像 Baldwin 的角色那样粗鲁直接——社会教育我们不要对别人那么「诚实」—— 但问题是一样的:「你是好人?关我屁事!想在这里工作,就给我搞定工作。」

所以,你有什么感想呢? 你对在书店里遇到的女神每天白日梦意淫,为她午餐不吃色拉感到惋惜。 她 10 年后会成为一个外科医生,你呢?

「什么?你是说除非我找到一个好工作赚大钱否则不可能把到女神?」

不!你的大脑跳跃太快了,因此你可以给自己一个理由认为所有拒绝你的女神都是肤浅自私的。 我在这里就问一个问题:你给予了什么?你聪明么?幽默吗?情趣吗?天才?雄心?创意? 好,那你做什么事情能向这个世界证明自己的优点呢? 不要跟我说你是个好人——这是最起码的。 你的女神每天有三打的男人对她「好」。 用我们上文的例子来说,伤者在大街上流血,你到底会不会开刀?

「我不歧视女人,不歧视种族,不贪婪,不肤浅,也不虐待人!我和那些屌不垃几的男人不一样。」

很抱歉,如果你所能做的事情只不过是你「没有」一堆缺点,就 TMD 给我从伤者身边滚出去! 我们有的是风趣、英俊、事业成功的男人来帮助你的女神。

伤到你自尊了么?有一点?那现在怎样呢? 你想碎碎念呢,还是打算学习怎么去做手术治疗那个伤者? 取决于你。

但你不要去抱怨为什么女神就喜欢找你口中的坏男人。 她们吃这套是因为那些屌不拉几的男人有其他东西可以满足你的女神。 「但我是一个聆听者!」 是吗?你可以坐在女神身边几个小时听她念叨?你猜怎么着? 角落里还有另一个男人可以这样做,他还是吉他高手! 你如果不停地说你是一个好人,就像一个餐厅说他们的卖点是他们的食物不会让你拉肚子一样, 就像一部电影的标题是「This Movie is in English」。

这就是为什么你可以做一个好人但仍然觉得自己是 loser(屌丝)。

3:你恨自己是因为你无所作为

「所以你的意思是要我去买一本教我如何把妹的书么?」

当然不是,除非那本书的第一章是「让自己变成女孩子愿意接近的人」。 因为这一步总是容易被忽略——人们总是问「我怎么能找到工作?」 而不是「我如何成为雇主愿意雇用的人?」; 人们总是问「怎么让女孩喜欢我?」而不是「我怎么成为女孩喜欢的人?」。

对吧?因为后者往往要求你放弃自己喜欢的爱好,注重外表,天知道还要做其他什么牺牲。 你甚至还可能要改变你的天性。

「但是为什么我不能就去找一个喜欢原本的我的人呢?」 答案很简单:人是有需求的。 别忘记我们的例子:伤者在流血,而你所做的只是抱怨找不到会自动愈合的伤口?

【此处插入一段 Youtube 上点击率很高的猥琐街头艺人表演的视频】

每个人看了上面这段视频都会会心一笑。 你能为人们带来笑声么?为什么不呢? 是为什么阻止你穿上猥琐的衣服在街头边唱边甩鸡鸡呢? 那家伙似乎知道赢得掌声的门道……做怪事……总比什么都不做好……

「但是我什么都不擅长!」我有好消息告诉你:如果你尝试反复练习做一件事情, 任何事情,你都可以擅长此事。我小时候可能是全世界最糟糕的作者。 到了 25 岁的时候稍微好那么一点点。 但当我职场失意的时候,我用业余时间写作长达八年,一周写一篇文章,直到它为我换回了钞票。 我花了 13 年时间才能登上纽约时报畅销书榜单。 我大概花了 20000 个小时才慢慢磨快了我拙劣的文笔。

不希望花那么多时间磨练一门技术?那么我有好消息和坏消息告诉你。 好消息是漫长的磨练可以让你慢慢走出困境——我忍受了多年琐碎的办公室工作, 因为我知道我同时在学习一门技能。 人们半途而废是因为要看到结果实在是太漫长了,同时也是因为他们没有意识到「结果」就是过程本身。

坏消息是你别无选择。「想继续在这里工作?——那就给我搞定手里的单子」

从我个人角度出发看,你并不是因为缺乏自信而恨自己,或者是因为别人羞辱你。 你恨自己是因为你【什么都不做】。 连你自己都不能爱「原本的自我」——这就是为什么你很可悲,不断写私信问我如何处理你的生活问题。

自己扳手指算一下:你有多少时间是在消费别人创造的东西(电视,音乐,电玩,网站)而不是生产你自己的东西? 只有你的「产出」才能为你添加作为人的价值。

如果你听到这里听不下去了,并且用你从小听到大的陈词滥调回应说: 「人的内在才是最重要的」,那么我只能说……(接下文)

2:你的内在只有通过所做的事情才能表现出来

在我所从事的行业里,我认识无数有理想的作家。 他们认为自己是作家,他们在聚会上介绍自己是作家,他们拥有一颗作家的热心。 他们只缺乏最后的一步:写点 TMD 像样的东西出来!!!!

是吗?难道「写点东西」就是真正决定谁是谁不是真正「作家」的标准吗?

我的天哪!!!当然是了!

这恰恰是对我以上所说一切最常见的反驳,也是对你生活中批评声音最常见的反驳。 这是你不断对你自己暗示以逃避能帮你改善自我的刻苦工作的理由。 「我知道我的内在是一个很好的人」。 你也会听到人说「我做我自己」。

不要误会我的意思:你的内在非常重要。 一个男人如果为了他的家庭从无到有造出一栋房子完全是因为他的内在是一个好人。 你所做的一切坏事最初是一个坏的念头,萦绕在你脑中,直到最后实施。 同样,做一件好的事情也是一样道理——内在的自我是你成功果实赖以生长的土壤。

但是所有人都应该知道,所有人却都不能接受的事实是:「没有最后的果实,你就什么都不是」

比如你内心非常同情穷人。很伟大。

这会让你最后做什么实事么? 你听到你社区里一些悲剧发生后,你会说「这些不幸的孩子啊,让他们知道我在内心同情他们」吗? 你要这么说我就只好说「fuck you」——给我去真正帮助他们才是真的。

数以千万的人看了那段 Kony 视频(译注:2012 年 Youtube 上很有争议的关于非洲儿童的视频), 所有看过的人都「在心里同情他们」。 那么这么强大的同情给儿童们带来了什么呢?屁都没有! 每天有非洲的儿童死于非命,因为数以百万的我们对自己说关心和行动一样重要。 这是我们内心的一种心理机制,控制着我们大脑里犯懒的那一部分,让我们不断逃避真正去做实事。

有多少人此刻正在想:「她(他)如果知道我是多么有趣的人,一定会爱上我。」 真的吗?你那些有趣的想法有多少让世人知道了呢? 如果你的心上人有一个隐藏摄像机跟着你拍一个月,他们会被录影的内容打动吗? 记住,人们不会读心术,他们只会观察你的行动。

我希望你做的,只不过是用你看别人的标准来看你自己罢了。 你有没有一个烦人的基督徒朋友给别人最大的帮助只不过是「我为你祈祷」? 你觉得烦不烦? 我这里还没涉及到祈祷是不是实际有用呢,他们提供的帮助不需要他们屁股离开沙发就可以做。 他们认为自己思想纯净,但是他们纯净的思想土壤有没有结出果实呢? 他们自己应该比别人更清楚这点——因为我「土壤-果实」的比喻就是从圣经里拿来的。 圣经里耶稣曾经不止一次说过「人们是根据果实来评判一颗树的」。 当然,耶稣从来不会说「想继续留在这里工作,就给我搞定单子」, 但他说「凡不结好果实的树,都要砍下來,扔在火里。」

对以上这些话无动于衷的人,就如同电影里对 Baldwin 无动于衷的业务员一样。(未完)

1: 人的内心其实一直在拒斥进步

人类的大脑是很神奇的。 但你会发现大脑在拒斥进步的时候运转得比做实事的时候还快。 你的意识会通过层层防御机制来排斥任何会让你改变现状的事情—— 问一下对任何事物有瘾头的人就知道了。

所以,到现在,你们中的许多人一边读这篇文章,一边会感觉到大脑在不断提供排斥这篇文章的理由。 从经验上说,这些想法通常是:

有意将任何批评理解为侮辱

他凭什么说我又懒又没用?一个善良的人从来不会这样对我说话! 作者写这些东西只不过是想显示自己有多么优越,让我这个loser对自己生活不满罢了! 等我回复更损人的话给你!

对人不对事

这人有什么资格告诉我怎么活?他自以为自己了不起吧? 不过是网上的一个白痴写手罢了!我要去人肉他,看他有什么丑事可以抖出来。 这人真自以为是,让我作呕

只看语气,不看内容

我会仔细看你的文章,找出一句话,断章取义只讨论那个。

不断修饰你的过去

事情没那么糟糕。 确实我上个月还想自杀呢,但现在我感觉好多了! 也许我只要继续做我现在做的事情,情况会好的。 让我继续给那个女神修电脑,女神总会到我身边的!

认为改善生活的行为总会让你失去自我

哦,那么你是让我扔掉所有的漫画书。 天天去健身房 6 小时? 因为除此之外我没选择了?」

当然还有其他的想法。 记住:【痛苦是会让人感到舒坦的】。 许多人选择拥抱痛苦。 幸福是需要努力的。

还有:勇气。 人们无法批评你根本没有去创造出来的东西,所以人们选择什么都不做来避免批评。

人们很容易双手一叉裤袋批评别人的工作。 「这个电影很傻」, 「这对父母的小孩很皮」, 「那对情侣的感情很糟糕」, 「那个暴发户不学无术」, 「这个餐厅糟透了」, 「本文作者是个白痴」, 我倒不如留一条损的回复让网站开除他——「瞧,我这不「创造」了一些东西么?」

哦,是啊,我忘记提醒你了。 不论你尝试建造或者创造什么东西——诗歌也好,新的技术也好,或者新的感情也好—— 你会立刻发现自己身边多了很多批评家。 这些批评家也许不会当你面损你,但是他们确实在挖苦你: 你的酒鬼朋友不希望你清醒,你肥胖的朋友不希望你苗条,你无业的朋友不希望看到你开始新的职业。

记住,他们不过在表达他们对生活的恐惧罢了,批评别人的工作是自己不作为的另一个理由。 「为什么我要创造什么东西呢,你看别人做的东西都糟透了!」 「我想写小说,不过我要等时机,我可不想写出暮光那样肤浅的东西」。 只要他们永远不动手去做事情,事情就永远是完美的。 或者他们如果真的着手做事情了,他们会故意不努力,让别人认为事情做不好是因为他们不在状态, 「他们真正的潜力是无穷的」,不是你看到的狗屎一样的产品。

往下翻读一下本文的回复——那些很极端的回复,永远都是「Cracked应该炒了这个作者」 「这个自负的白痴应该停止写作」。 所有一切的负面评论潜台词永远都是 「停止创作,如果换我来创作绝对比这个好千倍,你现在得到那么多人气让我自己很没面子。」

不要成为上述的那种人。 如果你是那种人,请不要继续成为那样的人。 这正是人们为什么不喜欢你的原因,这正是你恨自己的原因。

所以,我有个建议:给自己定一个期限,2013 年底,或者从你读本文之后的一年。 当别人跟你说「我的新年计划是减肥15磅」的时候, 我说咱们应该努力去做任何一件事情—— 学习新的技能直到足够有用为止,或者随便选一件事情:学空手道,学跳舞,学陶艺,做一个鸟屋,学习按摩,学一门语言,甚至拍一部A pian,做蝙蝠侠打击犯罪……

关键在于:我不希望你把眼光放在某个过高的目标上,我希望你专注于获得一样新的, 【对其他人有用】的技能和经验。

「我没钱参加烹饪班」。那就 TMD 给我在 Google 上搜索:「如何烹饪」。 我的天,拜托你戒掉这些借口,否则这些借口就要你命了。 (You have to kill those excuses, or they will kill you) (要么你干掉那些借口,要么让那些借口干掉你)

(完)

 

  •  

    分类: Linux运维技术面试 标签:

    九月百度,迅雷,华为,阿里巴巴,最新校招笔试面试十题

    2015年2月28日 评论已被关闭

    九月百度,迅雷,华为,阿里巴巴,最新校招笔试面试十题

    http://blog.csdn.net/whu_zhangmin/article/details/12019959

    本博客自2010年10月11日开通以来,已经帮助了一大批人找到工作,特别是连续三年在每一年的9、10月份陪伴了至少三届毕业生找工作的旅程,包括校招中的笔试面试,今年也不会例外,我会在本博客开通3周年之际一如既往的陪伴大家一起成长。

    本文所整理的全部笔试面试题要么来源于我群内群友们的分享,要么摘自论坛或博客,所有原题均来自网络。虽然本文中整理的绝大部分笔试面试题偏算法(自己特意为之之故),但不论是哪一年的校招,一般说来,笔试偏基础(尤其是选择题部分,涵盖语言,计算机组成原理、操作系统、网络协议、数据库、概率期望等知识),而面试则偏算法,且无论是笔试还是面试,两者都很看重你的实际编程能力,希望大家知晓。

    OK, 本文会尽量保持每天更新一道新的笔试或面试题,直到9月底(更欢迎各位通过微博私信http://weibo.com/julyweibo,或邮箱zhoulei97@aliyun.com提供题目,亦可直接评论于本文下),如果大家对以下任何一题中有任何思路,欢迎评论于本文之下,或show me your code!谢谢。

    九月迅雷,华为,阿里巴巴,最新笔试面试十题

    1. 8月15日,百度2道面试题:
      1、来自《编程之美》的概率题:一个桶里面有白球、黑球各100个,现在按下述规则取球:的
      i 、每次从通里面拿出来两个球;
      ii、如果取出的是两个同色的求,就再放入一个黑球;
      ii、如果取出的是两个异色的求,就再放入一个白球。
      问:最后桶里面只剩下一个黑球的概率是多少?
      2、算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
    2. 9月5日,华为2014校园招聘的机试题目
      通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
      压缩规则:
      1、仅压缩连续重复出现的字符。比如字符串”abcbc”由于无连续重复字符,压缩后的字符串还是”abcbc”。
      2、压缩字段的格式为”字符重复的次数+字符”。例如:字符串”xxxyyyyyyz”压缩后就成为”3x6yz”。
      要求实现函数:
      void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
      输入pInputStr:  输入字符串lInputLen:  输入字符串长度
      输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
      注意:只需要完成该函数功能算法,中间不需要有任何IO的输入输出
      示例
      输入:“cccddecc”   输出:“3c2de2c”
      输入:“adef”     输出:“adef”
      输入:“pppppppp” 输出:“8p”
    3. 9月6日,网新恒天2014校园招聘笔试编程题
      已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。
      点评:老题,参考答案如下

      1. //copyright@July 2013/9/24
      2. void* memcpy(void *dst, const void *src, size_t count)
      3. {
      4.     //安全检查
      5.     assert( (dst != NULL) && (src != NULL) );
      6.     unsigned char *pdst = (unsigned char *)dst;
      7.     const unsigned char *psrc = (const unsigned char *)src;
      8.     //防止内存重复
      9.     assert(!(psrc<=pdst && pdst<psrc+count));
      10.     assert(!(pdst<=psrc && psrc<pdst+count));
      11.     while(count–)
      12.     {
      13.         *pdst = *psrc;
      14.         pdst++;
      15.         psrc++;
      16.     }
      17.     return dst;
      18. }
    4. 9月9日,迅雷2014校招笔试编程题:
      已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
      链表结点的结构类型定义如下:

      1. struct node
      2. {
      3.     int elem;
      4.     node* next;
      5. };

      请完成函数void difference(node** LA , node* LB)
      点评:参考答案或更多题目请参见:http://blog.csdn.net/hackbuteer1/article/details/11482103

    5. 9月10日,美团网2014校招研发笔试哈尔滨站
      1、链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现
      点评:类似编程艺术第1章左旋转字符串,见:http://blog.csdn.net/v_JULY_v/article/details/6322882
      2、一个m*n的矩阵,从左到右从上到下都是递增的,给一个数elem,求是否在矩阵中,给出思路和代码
      点评:杨氏矩阵查找,见编程艺术第23章:http://blog.csdn.net/v_july_v/article/details/7085669
    6. 9月14日,阿里巴巴2014校招笔试哈尔滨站
      1、宿舍内5个同学一起玩对战游戏。每场比赛有一些人作为红方,另一些人作为蓝方。请问至少需要多少场比赛,才能使任意两个人之间有一场红方对蓝方和蓝方对红方的比赛?答案为4场,参考如下图,作者doc_sgl:
      2013092312250523
      点评:其余题目请参见:http://blog.csdn.net/doc_sgl/article/details/11695671
      2、一个有10亿条记录的文本文件,已按照关键字排好序存储。请设计算法,可以快速的从文件中查找指字关键字的记录。
    7. 9月14日,阿里巴巴-系统工程师-北京站
      2013092312304193
    8. 9月16日,创新工场2014校招笔试题
      2013092314005015
      点评:上面第3题还是杨氏矩阵查找,见编程艺术第23章:http://blog.csdn.net/v_july_v/article/details/7085669。既然这么多公司都喜欢考杨氏矩阵查找,那么再给出杨氏矩阵查找一题的扩展:给定 n×n 的实数矩阵,每行和每列都是递增的,求这 n^2 个数的中位数,分析详见:http://zhiqiang.org/blog/science/computer-science/median-algorithm-of-ordered-matrix.html
    9. 9月21日,百度2014校招-济南站
      2013092315164443
    10. 9月21日,腾讯2014软件开发校招-简答题-广州
      2013092410451715
    11. 9月22日,人人校招笔试题
      2013092312371029
      点评:上述第1题寻找满足条件的两个数,见编程艺术第5章:http://blog.csdn.net/v_JULY_v/article/details/6419466;上述第2题见编程艺术第21章:http://blog.csdn.net/v_july_v/article/details/6890054
    12. 9月22日,阿里巴巴北邮站
      2013092314275554
      2013092313475003
      2013092314284195
    13. 9月23日,网易电商部-社招面试
      HashMap与HashTable区别
      点评:HashMap基于Hashtable实现,不同之处在于HashMap是非同步的,并且允许null,即null value和null key,Hashtable则不允许null,详见:http://oznyang.iteye.com/blog/30690。此外,记住一点:hashmap/hashset等凡是带有hash字眼的均基于hashtable实现,没带hash字眼的如set/map均是基于红黑树实现,前者无序,后者有序,详见此文第一部分:http://blog.csdn.net/v_july_v/article/details/7382693
    14. 待续,9月24日中午…

    后记

    算上今年,本博客已经连续整理了4个年头的笔试面试题,从这些笔试面试题中,细心的朋友自会发现,每一年校招的很多编程题屡屡都是编程艺术系列上的原题,故我希望大家掌握的是一类题目的方法,而不是纠结于某一道题的标准答案。

    正因为方法比答案重要,所以编程艺术系列从最容易想到的思路开始讲起,一步步优化,而不是其它题解那样一上来就给你所谓的标准速成答案。

    最后,除了程序员编程艺术系列外,再推荐一些资料、书籍和讲座给大家,供大家参考:

    1. 程序员编程艺术http://blog.csdn.net/column/details/taopp.html
    2. 秒杀99%的海量数据处理面试题http://blog.csdn.net/v_july_v/article/details/7382693
    3. 《编程之美》;
    4. 微软面试100题系列http://blog.csdn.net/column/details/ms100.html
    5. 《剑指offer》;
    6. 我个人举办的专为帮助大家找工作的面试&算法讲座:http://blog.csdn.net/v_july_v/article/details/7237351#t24
    7. 两个程序员面试网站,leetcode:http://leetcode.com/,与careercup:http://www.careercup.com/
        有何见解或思路,欢迎随时评论于本文之下,或show me your code!感谢。

    马尔科夫算法 awk 实现

    2015年2月7日 评论已被关闭

    马尔科夫算法 awk 实现
    之前一直看不懂马尔科夫算法的awk实现。最近学习了awk,基本上能看懂了。C++版的参见这里。

    #!/bin/awk -f

    #markov.awk: markov chain algorithm for 2-word perfixes
    BEGIN { MAXGEN = 10000; NONWORD = “\n”; w1=w2=NONWORD }

    {

    for(i = 1; i <= NF; i++)

    {

    #read all words

    statetab[w1,w2,++nsuffix[w1,w2] ] = $i

    #print “IN”,$i

    w1 = w2

    w2 = $i

    }

    }

    END{

    statetab[w1,w2,++nsuffix[w1,w2] ] = NONWORD #add tail

    w1 = w2 = NONWORD

    for( i = 0; i < MAXGEN; i++)

    {

    #generate

    r = int(rand() * nsuffix[w1,w2]) + 1

    #print “r: “,r

    p = statetab[w1,w2,r]

    if ( p == NONWORD )

    exit

    print p,

    w1 = w2

    w2 = p

    }

    }
    Awk是一个模式—操作对的语言:输入总以一次一行的方式读入,每个读入行都拿来与程序里的模式做匹配,与此同时,对各个成功匹配执行有关动作。这里存在着两个特殊的模式,BEGIN和END,它们分别能在输入的第一行之前和最后一行之后匹配成功。动作是由花括号括起的一个语句块。在上面的 Aw k版本的马尔可夫程序里, BEGIN动作块对前缀和若干其他变量做初始化。随后的一个语句块没有模式部分,这是一种默认方式,意味着这个块将对每个输入行执行一次。Awk自动把每个读入的行分割成一些域 (由空白分隔的词),它们将分别成为$1到$NF。变量NF的值是域的个数。语句:

    statetab[w1,w2,++nsuffix[w1,w2]] = $i

    建立从前缀到后缀的映射。数组 nsuffix记录后缀个数,其元素 nsuffix[w1, w2]记录与前缀对应的后缀的个数。而后缀本身则被做为数组 statetab的元素,如 statetab [ w1,w2, 1],statetab[w1, w2, 2],等等。

    make it simple, make it happen

    分类: Linux运维技术面试 标签:

    程序员生存定律–升华成高手的可能方法

    2015年1月15日 评论已被关闭

    程序员生存定律–升华成高手的可能方法

    http://www.cnblogs.com/daoshi/p/3811201.html

    程序员生存定律这系列的目录在这里:程序员生存定律–目录

    喜欢从头瞄的,可以移步。

    ——————————————————————————

    一旦度过了初始阶段,做过了前面说的那些事情,那么一个人算是基本入行了,接下来的目标就非常简单,要在选定方向上成为高手。高手意味着专业,而在分工无限细化的年代里,专业则是生存、发展好最为重要的一个前提。

    1 高手的定义和养成关键

    我估计如果问100个人“什么样的程序员是高手?”,那答案会有100多个。因为同一个人还可能给高手下不同的定义。

    在这里我们认为,在特定领域里能搞定大部分人搞不定事情的就是高手。从这样一个定义出发,我们会发现在技术人员和销售人员眼里,高手的内涵是有很大差异的。

    纯技术人员更多的关注性能能不能提到极致,并发能不能处理的很好,内存溢出Bug能不能很快搞定,类库的机理熟悉不熟悉等等。而在销售人员的眼里,则在技术外还多看了些东西,比如业务流程熟不熟悉、使用性好不好、能否迅速对应变化、能否在限定工期和预算下搞定任务等。

    考虑到职场和产品销售有着非常紧密的关系,我们这里使用后一个视角,而非是单纯的技术视角。

    有几类本质上很不同的人都会被视为高手,比如说:

    • 能写出很牛的病毒的

    这个不举例子,但当年读过CIH的代码,我是被其精巧给震住了。此外也许搞加密解密的也应该放在这个类别里。

    • 能把一堆3D图形放到64K

    以前专门有个比赛是干这个的,64K大小的EXE能给你放10几分钟很酷的3D动画,第一次见绝对会很震惊。

    • 能迅速调试出问题所在的

    内存泄露、多线程同步这类问题往往让人纠缠很久也搞不定,但就是有人能很快的解决这类问题。

    • 能仅靠几个人就架起高并发网站的

    新兴Web2.0网站如:Flickr,甚至还可以包括Google,在初期往往是几个人搞起来的,这些人名声不显,但绝对是高手。

    • 能主导开发出很牛的产品的

    这个上可以想想UnixLinux的作者等。

    • 能主持大规模软件设计的

    这个往往更有商业价值,我们常说的Martin Fowler应该可以算在这个类别。

    • 能把一种语言研究的特别牛的

    想想各个编程语言的创建者,想想C++的大牛们。当然创建某一门语言的也可以归到这个类别里。

    •  能开辟自己方法论的

    比如搞CMMIWatts S. Humphrey

    • 能写出很牛的书的

    比如:Windows平台下写了Windows核心编程的Jeffry Richard

    • 能写出很牛的算法的

    比如:Donald Knuth

    这个表应该还可以加长很多,单以大家认可这个角度来看确实高手可以从各个方面冒出来。

    不管在那一方面,要想成为上面所描述的高手总是需要学习、思考、实践这些环节,这没什么可说的。但和软件相关的知识其实多如牛毛,完全不像小说里武功秘籍那么稀缺,几乎可以讲满地都是。这就使选择和集中成为难题。

    软件的三个基本特征(技术更迭快、低介入门槛、多内部分野)就像铡刀一样,一旦选择出错,就会把个人的努力切的粉碎,一点价值也留不下来。而与此相对的,则是人的黄金学习时间其实并不多不过是毕业后的10年左右的时间。

    曾经有人希望自己能够从事嵌入式软件的开发,因此给自己买了ARM板,自己在家里花了很多时间来学习并实践相关知识,最终却因为其他的原因进入了一家做网络的公司。这个人等价于被软件的内部分野较多,而彼此间技能流动性较差这样的一个特质斩了一刀,被斩掉的倒不是ARM板,而是自己一年多的辛苦投入。这种情况下强调学的知识将来有用是没有太大意义的,因为还有两刀在等着:如果你三年都不做这个,你今天学到的知识可能会被更迭掉了,同时由于你年纪增长了,可能也不太适合与大批新介入这个行业的人员进行竞争。

    这类事情使软件行业中的成为高手这事变得复杂了。

    为了在成为高手这条路上走的顺畅,事实上有三个关键点:一是要有一张全局性的地图,以便选好方向;二是要知道都有那些坑,好绕开它,免得掉进去。三是要有足够的热情和动力,能坚持走下去。下面将分别从这三个方面来说明成为高手途径和方法,而这种途径和方法会因为具体目标不同而有所微调。

    2 全局性的地图

    清代著名学者曾对知识地图的必要性做过非常精确的表述:

    凡读书最切要者,目录之学也。目录明,方可读书,不明,终是乱读。

    —王鸣盛,《十七史商榷》

    目录即是地图。

    对于软件开发的知识,我更愿意使用下面的的“地图”,这不一定是最合理的,但确实对归纳各种软件开发知识有所帮助。

    • 通用的领域知识
    1. 编程语言(C/C++,Java,C#,Python,Perl,PHP等)
    2. 框架和类库(Struts,Spring,OSGi的某个具体实现,MFC,Boost等)
    3. 平台(Windows API,POSIX,.Net Framework※1,Java API,C/C++ Runtime Library等)。恰如Jeffry Richter所说,大多时候可以从内存机制、线程机制、错误处理、异常处理、组件构建、组件组合等方面来进一步考察一个平台。
    4. 计算机体系结构(CPU指令,虚拟存储等)
    5. 数据库
    6. 实用技巧(调试方法,代码生成器等 )
    7. … …

    ※1 有的时候子类别间的界限并不是很容易界定,其中一个主要原因就是存在着像.Net Framework这样涵盖了过多内容的概念。

    • 概念和逻辑创建和优化
    1. 面向对象分析和设计/结构化分析和设计
    2. 设计模式
    3. 重构
    4. 契约式编程
    5. UML ※2
    6. … … ※2  从形式上来看UML更近似于一种编程语言,但从其目的上来看也许归在这里是更合适的一种选择。
    • 专业领域知识
    1. 图形图像算法
    2. 网络协议
    3. 人工智能
    4. 数值/非数值类算法
    5. 财务知识
    6. 负载均衡
    7. … …

    关于软件的间接知识:

    • 需求开发和描述
    • 估算
    1. 估算法。比如,COCOMO, FP等。
    2. 估算术。比如,使用计数等原始办法。

    • 软件工程和方法论
    1. 轻量型方法论。比如敏捷。
    2. 大方法论。比如CMMI
    3. 综合分析。比如,《人月神话》,《人件》所做的工作。

    随着待解决问题越来越复杂,通用的领域知识中,几种技术往往会组成一种技术Stack,他们更需要被看做一组必须一起掌握的知识,比如:LAMPLinux+Apache+MySQL+Python/PHP)。

    当然上面罗列的远不是全部,这种罗列更多的是展示一种分类的方法。通过对这种分类方法的补充和完善,大多可接触到知识都可以被归入特定的类别,比如说:WinRT可以看做一种新的平台,HTML5则可以看做是一种语言等。

    每个人可以根据自己的情形,参照上面的分类建立属于自己的地图,有点问题没关系,有就比没有要好很多。接下来依据这样的地图就可以选一条自己的线路,持续累积,寻求实践机会,最终就很可能会成为真正的高手。

    而关于增值所需的动力,所要避开的陷阱,将下面陆续提到。

    增值、读书与大局观

    单纯从达成某一目的而言,读书往往非是绝对必要条件。

    秦始皇把书一把火烧了,刘邦项羽一样造反并取得胜利。但读书无疑的可以加速一个人增值的过程,记不得是谁说过:实践无疑是人类最好的老师,但只靠实践来认知世界无疑也是愚蠢的。这是非常精辟的。除此之外,要想培养大局观,那就非读书不可。

    每个人的亲身经历,在大的时空背景中往往只是一个简单的截面,这一截面中绝不会包含可以归纳出所有真理的事实,因此只依赖于自身的实践也就必然限定了一个人的视野。 这一点随着一个人的责任范围变大往往会体现为一种制约和限制。所以培根讲:有实际经验的人虽能够处理个别性的事务,但若要综观整体,运筹全局,却唯有学识方能办到。

    即使从实践来看也是如此,要想培养出一种大局观,那就非读书不可。而大局观往往是成为将帅之才的必要条件。

    具体到软件而言,有一本很有名的书对培养技术的大局观有帮助:《代码大全》。至于专业性较强的书,反倒是可以根据自己的情景比较容易的选择,这里就不提了。

    基于上面这样的一张地图,我们就可以具体的去考虑几条进阶路径。

     路径一:由程序员而架构师

    架构师是一个很火的职位名字,但你很难给它下精确的定义。

    下面所陈述的一切是我个人的理解和体会,我无法保证它和其他人的解释完全吻合。因为架构师,乃至架构设计实在是一种非常模糊的概念,如果你用心去找,可以找到各种定义(甚至IEEESEI的定义也不一致),这就导致你只能参照别人,相信自己。

    本质来讲架构设计也是设计,所以凡是做设计的都可以称自己为架构师。

    当一个系统的规模变大的时候,设计上的决策就具有了特别的价值,并且也越来越需要专门的人来做,架构设计也就越来越像是一种特别的设计。比如说:考虑架构设计的时候,可能需要考虑选用什么样的数据库、选用那个开源框架、选用什么样的硬件平台,这些东西在小规模程序中往往是居于次要地位的。

    假设说一个人已经掌握了一门或几门编程语言、面向对象、设计模式、能够很熟练的写出质量较高的代码,接下来他想成为架构师,这个时候他需要做什么?

    我个人认为,这时候这个人首先要有一个“专业”。这个专业可以是“金融”,“财务”,“电商”,“管理”等等。这是一种属于某一专业的领域知识,而不是编程技术。如果把需求和最终的代码,看成描述同一事物的一体两面,那么设计始终是要架起这两者间的桥梁。而架桥的时候,怎么可能只知道一端而不知道另一端。

    接下来是深化设计所需要的各种通用领域知识(UML、面向对象、性能确保等)。这时和一般所说的设计的一个关键区别是,那就是架构设计要分心思去考虑那些东西用别人的就好了,而那些东西要自己开发。而一般所说的设计技术中,比较侧重自己应该怎么干(面向对象、测试驱动等)。为达成这一目的,就需要对现有技术的优劣有相对比较清晰的认识,比如要能分清楚那些是成熟稳定的技术,那些是处在实验阶段的技术。Pinterest网站就曾经进行过下列这样的架构改进,在这样的改进过程中,不知道各种技术的优劣是代价很大的:

    早期阶段:

    • Rackspace
    • 1 small web engine
    • 1 small MySQL DB

    2011/1:

    • Amazon EC2 + S3 + CloudFront

    • 1 NGinX, 4 Web Engines (for redundancy, not really for load)

    • 1 MySQL DB + 1 Read Slave (in case master goes down)

    • 1 Task Queue + 2 Task Processors

    • 1 MongoDB (for counters)

    • 2 Engineers

    2011/9:

    • Amazon EC2 + S3 + CloudFront

    • 2NGinX, 16 Web Engines + 2 API Engines

    • 5 Functionally sharded MySQL DB + 9 read slaves

    • 4 Cassandra Nodes

    • 15 Membase Nodes (3 separate clusters)

    • 8 Memcache Nodes

    • 10 Redis Nodes

    • 3 Task Routers + 4 Task Processors

    • 4 Elastic Search Nodes

    • 3 Mongo Clusters

    • 3 Engineers

    2012/1:

    • Amazon EC2 + S3 + Akamai, ELB

    • 90 Web Engines + 50 API Engines

    • 66 MySQL DBs (m1.xlarge) + 1 slave each

    • 59 Redis Instances

    • 51 Memcache Instances

    • 1 Redis Task Manager + 25 Task Processors

    • Sharded Solr

    • 6 Engineers

    2012/10:

    • Amazon EC2 + S3 + Edge Cast,Akamai, Level 3

    • 180 Web Engines + 240 API Engines

    • 88 MySQL DBs (cc2.8xlarge) + 1 slave each

    • 110 Redis Instances

    • 200 Memcache Instances

    • 4 Redis Task Manager + 80 Task Processors

    • Sharded Solr

    • 40 Engineers (and growing)

    摘自:

    http://highscalability.com/blog/2013/4/15/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a.html

    这个过程比较真实,大家可以参照着想想如果自己来主导,那还欠缺什么。

    最后一点要说的是,做架构设计已经相对于在做技术管理工作,至少要适当涉猎估算并能做出合适的任务分解,这样一旦日程紧张,则可以通过增加人手等手段来在质量、成本和进度之间进行均衡。

    由于知识面已经扩的比较大,架构师在具体某个专业领域上的深度可能会有所欠缺,比如:在做一款电子消费产品时用到了TTS,但架构师不一定能很好的了解TTS的算法这是CodeGuru的领域。

    架构师所需要达成的最终目标可以形象的描述为:产品经理考虑用户和市场建立了一个模型,那么架构师要能把这东西映射到技术的世界里来。如果是在互联网行业,那么在你的主导设计下要可以做出高并发的网站。换到其他行业也与此类似,从产品的的角度往回看,架构师要能解决和技术相关的所有问题,主导完成商业上有价值的产品或项目的开发工作。实现手段上倒并无限制,可以是购买,可以是组织人员进行开发,只要能平衡短期和长期利益,解决特定的问题即可。

    路径二:由程序员而CodeGuru

    与架构师相对应,在某些智力密集型的程序中,也需要技能高超的程序员,这种程序员往往被称为Guru

    这条路线里,程序员并不把自己擅长的领域扩的太宽,但在指定领域上会挖掘的很深。驱动、字库、图形库、算法库、OCR等都偏向于这一领域。

    假如说,一个程序员在掌握基本语言之后,想往这个方向发展,那么需要的技能和架构师差别很大。比如:一个人如果想往驱动方向发展,那么就需要了解CPU的基本结构、内核调试方式、操作系统中与相应驱动所对应的机制、硬件侧的规格、通讯协议等。

    这时候很可能由于程序规模并不十分庞大,面向对象、设计模式这类东西没有太大发挥空间,而是需要处理的是大量或麻烦或艰深的细节。

    2013年1月,ITeye发布了一条信息说:Intel面向学生免费提供 C++ 开发工具,并简单的介绍了一下是那些工具免费向学生提供:

    • Intel C++ Composer XE,其中包括:
    1.                Intel C++编译器(高度优化的编译器)
    2.                Intel数学核心函数库(高性能数学库)
    3.                Intel线程构建模块(C++任务模型、最流行的C++并行方法)
    4.                Intel集成性能基元(多媒体基元库)
    • Intel Advisor XE(推荐的并行开发建模方法)
    • Intel VTune Amplifier XE(非侵入性的性能分析工具)
    • Intel Inspector XE(先进的线程和内存调试工具)

    看到这张列表,我们可以思考下要开发这类工具需要什么样的程序员。上面这些工具的开发都属于高难度的工作,和开发大规模的MIS系统完全不同,如果不是某方面的专家,基本不太可能负担起相应的责任。而这类领域则正是Guru的天下。

    路径三:由程序员而纯管理

    纯管理工作和技术管理工作可以用是否接触乃至编写代码来区分。纯管理工作往往需要把精力放在预算编制、人员职业路径、考评、度量、流程改善这些工作上。一定程度上讲,这等价于和编程工作说拜拜,当然前提是你得有编程经验,有一些通用领域知识和概念创建乃至逻辑优化的知识,否则的话和程序员没法沟通,进而给工作造成障碍。

    从需要读的书来看,这时候可能要看过PMBOK,《项目管理修炼之道》,《管理的实践》,《基业长青》等等。

    但如果一个人认为想做管理要从PMP开始,那大概是还没太明白管理这项工作的本质。管理本身是一种借势,虽然有技术性的一面,比如要理解挣值曲线这类,但这方面知识其实并没有想的那么复杂至少没有C++11复杂,只要有时间正常智商的人都可以在不太长的时间内掌握。所以如果你想做管理,并使用了和学习C++语言一样的方法,那基本上是偏离了方向。

    抛开机缘这类东西不论,做好管理工作有两点很关键:

    一是要把技术工作做的相对比较好。这好像有点学而优则仕的意味,但大多时候人们更愿意相信“将军起于行伍,宰相拔于州郡”,而不愿意相信单只会耍嘴皮子的人。过度务实的人容易迷失于道路,过度务虚的人则容易飘的太高而丧失根基。管理者正应该身处在这两者之间的一个平衡点。

    二是要能够借势。要情商比较好,能把很多人组织在一起。这个时候要知道那些东西需要规则化,那些东西需要灵活把握。过度偏向规则是教条,过度偏向灵活则是人治,平衡点始终要根据具体人员的状况,工作特质这些不可改变的事情来把握。这有点微妙。但即使程序员这个群体相对简单,但并不能推翻先人后事这类规则。这不知道是不是东方特色,当你想做管理并想推进事情的时候,终究要理清人际上的关系,否则就和可能会欲速则不达。这点会在第五章进一步展开来谈。

    下面我们来看一个具体点的例子,这个例子出自郭致星老师的博客,是一个学员的真实疑问(文字上有修饰),X入职后的现状如下:

    开发部现在26个人。基本组织架构是由开发组、需求组、测试组、运维部四个部门组成。需求组的人收集需求,再通过系统指派给开发组,进行开发。开发组的文档严重缺乏。

    现在公司内有技术总监和开发部经理的岗位。眼下全公司就X一个项目经理,目前是跟着开发部经理,在熟悉一个核心系统,由于没有任何文档的遗留,所以现在是相当于一个开发人员在开发一些实际的功能,一边开发一边熟悉现有系统。

    现在X并没有项目的实际权力,而且整个项目组也只有开发部经理,加上2个开发,再加上1个测试和X共5个人。其中X和其中一个开发都是新来的。

    与此同时,业务部门在搞一些流程,但还没做完,没有在开发部进行实施。工作气氛比较沉闷。技术总监和开发部经理,都是技术型的人,比较偏向技术,平时工作也多偏向于具体执行。

    在使用一个Redmine系统进行项目管理和BUG跟踪。

    这里的系统大部分都类似于产品线制,属于需要长期开发维护的,需求源源不断的来,相应人员也就需要不停的做,没有版本制度,也没有计划和规划。

    系统现在主要的问题是性能问题。

    问题就是在这样的一种环境下,X应该如何开始自己的管理工作?

    这类问题通常并没有唯一答案,但确实有些通行的手段可供参考,最终做不做的好和个人能力乃至环境关联很紧:

    1.了解现有系统的状况,包括规格、代码规模、代码质量、代码内部结构、工作流程、问题所在等。比如说:很可能这类系统缺乏一种整体设计,是靠单纯的增加代码的量堆积出来的,代码冗余非常厉害,数据库的表也创建的比较随意。

    2.了解人员。包括人员的能力水平、工作意愿状况、性格。

    3.了解公司。尤其是公司的运作风格,有的公司偏人治有的公司偏于规则。短期对这类现行秩序要考虑如何顺应,而不是如何改变。

    4.对当前系统的状况和人的状况有所把握后,要对愿景进行描画,比如在功能上做那些改善,对速度做如何改善,目标的高低要适度,要能获得上司和下属的支持。这时候还要能平衡短期和长期目标,既不能长时间投入没有产出,也不能有产出但进步不可见。在这一步骤里最典型的忌讳是急功近利的做超出自己影响力范围的事情。比如:目标与现有人员的能力完全不匹配或者完全不顾及对销售可能产生的影响而单纯的做系统的优化。最理想的情形是,连续达成几个目标,提升自己的影响力。

    5.搞清楚团队成员和公司的的基本诉求,在取得成绩的同时尽可能双赢的扩大自己的影响力,目标是确保团队的执行力。

    6.逐步导入基本流程,使项目上轨道。但流程不能成为成绩的借口。

    7.接下来进一步的规划愿景,看能否取得更大的成绩,比如:挑战是否能做出真正有特色比较优异的产品。

    在不同类型的公司里,对应手段上会有不同。比如在规范性比较强的大公司,第4,5两步的权重就会比较低。在上述这样的场景下,PMP这类书籍中所提到的种种技术手段诚然是必要的,但和人打交道的部分(老板、直属上司、下属)往往会对最终的结果产生更大的影响,这是管理工作与纯粹技术工作不同的地方。

    ——————————————————————————

    关于我自己的各种信息,在左边栏可找到,想了解下写这系列文章的人是不是骗子和大忽悠的可以瞄。

    最后希望感兴趣的支持V众投,感觉上这应该是国内最靠谱的生活购物等的问答社区了吧,都是朋友给朋友做的答案,同时实行一人一号,一人一票制度,想找什么答案关注公众号:vzhongtou(左侧有二维码)就行了。