陈皓(左耳朵耗子)这个月去世了,心梗,47岁。近来越来越多出事儿的程序员们,初次听到这个消息倒不是特别惊讶。虽然作为一个乐于真诚分享的技术牛人,曾经深深得启发过很多人,但是自5月15日爆出消息以后,从这两周趋势可以预见,很快大家就会淡忘的,但是他的很多想法是值得留下来被更多人看到。对我来说他最好的作品是博客: 酷壳 。从2011年看到他那篇的《程序员练级攻略》开始,曾经认真关注了他的博客好长时间。直到后来他开始创业了,博客的质量有些下降了。人走了以后,这些数字遗产也不知道能保留多久,还是自己整理一下留下来更靠谱一些。
如何完成早期的技术积累?
很多人觉得我已经完成了自己的技术积累,已经开始探索马斯洛需求层次理论上层的事情了。是这样子。
很多人知道我的时候,我已经有点名气,我已经去了阿里、亚马逊,反正稍微有点成就。所以你并不知道我刚开始出来是去了工商银行,他们给我分了套房子。我父母是下岗工人,每个月两个人加起来就 200 块钱工资,我是 600 块钱,我们一家三口 800 块钱。但当时,我不要了,全部都不要了,我要出去到上海做外包。到上海的时候我拿 1500 块钱的工资,租房 900 块钱,然后一顿饭要吃 15 块钱,你们算一算,一天的生活费我只够吃一顿饭,而且我还得自己做饭。公司说出差一天有 30 块钱的出差补贴,而且出差还管饭,所以我必须得出差。一出差,我的收入就好很多。那时,我无时无刻都在想着,我要去更好的地方。那时候我们封闭开发,周一到周六全部待在开发中心,家都回不去。即便这样我也要去学习,周日我也要出去面试,去改变自己。因为那种没有技术含量的事情,我知道再做 100 次,也依旧没有任何未来。老实说,我跟那些外包公司极度不和,我跟老板吵架,我甚至跟甲方的行长吵架你们相信。因为我把事情做完了以后就在那看书,那个行长过来说,大家都在这外包,你为什么要在这看书?我说我看的又不是闲书,我看的是技术书籍,你凭什么不准看?你安排活给我做就好了,你管我看不看书?我就跟他吵架。
后来我选择职业或者工作的时候,我宁可被公司开掉,也要去做有价值的东西,我从一开始的初衷就是这样子。并不是说今天功成名就了,我才这样选;而是我一直都在这么选,所以我才会有今天的成就,大家要理清楚这里面的因果关系。你不这么选,你永远不可能成为这个样子,明白吧?现在我做公司也类似,有些项目我不接就不接了,我要接项目的话,也可以把自己做成一个外包公司,一年也有几个亿,但是有什么意义呢?我设想是十几个亿的事情。
刚才有人跟我说我做的事情太大了,有点不可能。这就对了,因为绝大多数人都不敢想,他们想一想就觉得这事不可能,就离开了,所以我没有太多的竞争对手,明白吗?因为绝大多数人都不 敢想,他们一想他们觉得我做不到,就傻掉了,他们自己就给自己思维框架里面就设了一座墙,因为连尝试他都不敢尝试。至少我敢尝试,失败了又能怎么样呢?反正我不会后悔。我未来老了以后,四五十岁看我这段时间我至少试过失败、至少试了一个牛逼的事情。那你们呢,自己的人生你连试都不敢试,想都不敢想。人,最可怕的是不敢想。不好意思,讲得稍微有点激动。
别限制了自己
做有价值的事。这个世界对计算机人才的要求是供不应求的,所以,不要让自己为自己找各式各样的借口,让自己活在“玩玩具”、“搬砖”和“使蛮力加班”的境地。其实,我发现这世界上有能力的人并不少,但是有品味的人的确很少。所谓的有价值,就是,别人愿付高价的,高技术门槛的,有创造力的,有颠覆性的……
扩大自己的眼界,开放自己的内心。人要变得开放,千万不要做一个狭隘的民族主义者,做一个开放的人,把目光放在全人类这个维度,不断地把自己融入到世界上,而不是把自己封闭起来,这里,你的英文语言能力对你能不能融入世界是起决定性的作用。开放自己的心态,正视自己的缺点,你才可能往前迈进。你的视野决定了你的知不知道要去哪,你的开放决定了你想不想去。
站在更高的维度。面的维度会超过点的维点,空间的维度会超过面的维度,在更高维度上思考和学习,你会获得更多。整天在焦虑那些低维度的事(比如自己的薪水、工作的地点、稳不稳定、有没有户口……),只会让你变得越来越平庸,只要你站在更高的维度(比如: 眼界有没有扩大、可能性是不是更多、竞争力是不是更强、能不能解决更大更难的问题、能创造多大的价值……),时间会让你明白那些低维度的东西全都不是事儿。技术学习上也一样,站在学习编程语法特性的维度和站在学习编程范式、设计模式的维度是两种完全不一样的学习方式。
精于计算得失。很多人其实不是很懂计算。绝大多数人都是在算计自己会失去多少,而不会算会得到多少。而一般的人也总是在算短期内会失去什么,优秀则总是会算我投入后未来会有什么样的回报,前者在算计今天,目光短浅,而后者则是舍在今天,得在明天,计算的是未来。精于计算得失的,就懂得什么是投资,不懂的只会投机。对于赚钱,你可以投机,但是对于自己最好还是投资。
勇于跳出传统的束缚。有时候,跳出传统并不是一件很容易的事,因为大多数人都会对未知有恐惧的心理。比如:我看到很多人才都被大公司垄断了,其实,有能力的人都不需要加入大公司,有能力的人是少数,这些少数的人应该是所有的公司share着用的,这样一来,对于所有的人都是利益最大化的。这样的事现在也有,比如:律师、设计师……。但是,绝大多数有能力的技术人员是不敢走出这步。我在2015年到2016年实践过一年半,有过这些实践,做“鸡”的比“二奶”好多了,收入也好很多很多(不好意思开车了)……
庄子说过几句话:
- 井蛙不可以语于海者,拘于虚也;//空间局限
- 夏虫不可以语于冰者,笃于时也;//时间局限
- 曲士不可以语于道者,束于教也。//认识局限
别自己墙了自己,人最可悲的就是自己限制自己,想都不敢想,共勉!
技术学习的基本思路
- 不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。
- 回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。
- 一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。
- 一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。
需要特别重视基础知识!
我一直强调要学好基础底层技术。两个原因,第一,你得知道原理,知道某个技术它是怎么运作的。不要着急,有的人可能会说今天学了也没什么用,你还是要坚持学,因为你慢慢会发现,很多东西都是相通的。
第二,当遇到一些比较难解的问题时,你学到的这些知识就会派上用场。这些难解的问题会让你跟别人拉开差距,懂基础和不懂基础的人,他们的思考完全是在两个层面。不懂基础知识的人,他就在那瞎搞,这里试一下,那里试一下。运气好,碰巧解决了,但也不知道怎么回事。而懂基础的人,他可以很快理解大概是怎么回事。
我举个例子,Linux 操作系统有时候我们会感觉写硬盘很慢,但我想说,写硬盘其实不慢,因为它有 Page Cache。你写硬盘,其实也是写在操作系统的内存,然后内存在一点点换页换到硬盘上。很多中间件,比如 RocketMQ、Kafka,都会使用到 Page Cache 技术。只要 Page Cache 玩得好,那系统性能也会不错。
还有像 TCP 原理。有些时候网络连接会闪断。从 a 节点到 b 节点,中间经过了很多设备,你怎么排查故障?如果你懂原理,那就会容易些。第一,你先看看 TCP 的状态,如果是 time wait 的话,那就是我主动断开连接;如果是 close wait 的话,那就是对方主动断开连接。你看状态就能有一个基本的判断。
第二,如果没有看到连接建立的话,你需要使用抓包的方式,像什么 tcpdump、wireshark 之类,用这些工具,就能很快定位问题。如果你不懂基础知识,那你很可能就不知道怎么使用这些工具。而没有这些工具,解决那些问题,你估计就得使用蛮力了。
如何选择技术?
每次直播的时候都有人来问我一个问题:我该不该从 .NET 转 Java、该不该从 Java 转 Go。我不直接回答这个问题。我不知道这个问题背后的思维方式是啥,就是 .NET 怎么样?或者说 .NET 转 Go 怎么样?我不知道你为什么想问这个问题,你想从我这边得到什么样的答案?想转就转呗。是不是你需要有个人帮你坚定想法,还是需要有人告诉你一个答案,你才去做这个事情?我觉得你不要把人生的一些决定寄托在我身上,你自己的决定最好自己做。
但是,我跟大家说一下,我之所以能够做成今天这个样子,就是我随时都在追逐一些我觉得是主流的技术,它是未来技术。就像我在阿里追 Docker,惹了 3 个团队。但是我一点都不后悔,为什么呢?因为我今天的很多想法都是因为我去用了这个技术我才会有。包括我学 Java 也是一样,我始终都觉得我必须要靠上主流。说得俗一点,就是你必须要去风口,这个风口猪都会飞。但是,要看那个风口是不是个短暂的风口,千万不要去找短暂的风口,你要去找长风口,风可以吹一辈子的。因为你是猪,你是没翅膀的,你必须要一直有风吹着你才能飞;否则的话,你飞不起来,因为你没翅膀。你不是鸟,没风都能飞,绝大多数人跟我一样都是猪。所以你需要站在一个天天都有风吹的地方,比如说你选对了计算机专业,这就是一个风不停地吹的地方。过去也好,今天也好,未来也好,整个世界都是被一堆程序员驱动,就是这些写代码的人在改变着未来。
所以今天这个风口是没啥问题的,那问题就是你有没有站在这个风口里面的主流的技术上。比如说,我觉得主流技术就是 Java,你又没去学 Java。你看那么多公司,有多少公司在用这个技术?这个技术可以干什么?我用了它我就不会失业,对吧?Go 语言也上来了,你是不是也要去看一下?满世界都是 Linux,你怎么可能不学呢?所以就这个意思。现在都是手机,都是移动互联网,所以你也得要去了解一下。包括云原生很火,大数据也很火,这些都需要我们去看一下。但是像区块链这些东西,你就扪心自问一下,区块链是不是所有公司都在用?没有用就让那些猪在天上再飞一会,指不定哪天风停了呢。但是,今天那些很强劲的风已经刮了十多年、二十年了,你为啥不去呢?那些只刮了一两天的风,你要小心,因为你没翅膀,飞上去以后,风停了你就会摔得很惨。那些刮了十几二十年的风,你还没站上去,要赶快站上去。
语言学习
我很早就总结过:Java 适合做业务层,Go 适合做中间件、Rust 适合做系统层。很多公司业务层也都在用 Go 写,我觉得没啥问题。是这样,业务层 Go 可以写,你拿 Node.js 也能写业务层,我以前都是拿 C 语言写业务层,所以你拿什么东西写都可以。
Go 语言写业务层,我觉得天然有一个好处就是 Go 没有太多乱七八糟的东西,它特别适合写面条代码。所谓的面条代码就是这个业务流程长啥样就怎么写,不需要任何抽象,这些代码也懒得重用,我直接写就好。国内的很多 Go 语言开发者,我觉得可能有 80% 都是从 PHP 转过来的,因为太适合写面条代码了。
但是,当你的架构变得越来越大、越来越复杂,里面一定要有一个框架的。比如 MVC 框架。为什么你发现 Java 代码写不烂,因为它有框架保证。但 Go 语言代码我看烂的就有一大堆。另外,服务越来越多,你开始要运维,做配置中心、服务治理那些中间件,但这方面,你会发现 Go 语言可用的不是很多,而 Java 那边成熟的一大堆。
所以,早期的项目,你用什么语言都行。假如说我们把场景分成 0 到 1、1 到 10、10 到 100,我今天跟大家说, 0 到 1 你爱用什么语言用什么语言,随便你用,Rust、Swift、Kotlin 随便什么,C 语言都行,你要用汇编写业务代码,我觉得都没问题。但是 1 到 10,你开始要尊重两个东西。第一个你的开发速度要快,第二个你的稳定性、性能这些要保证因为要扩展用户,这个时候,你就必须得选一些工业化的语言。像 PHP 可能就有点受不了,Go 语言或者 Java、Ruby、Python 这些都还可以,因为生产力各方面都还可以。但是如果 10-100 的话,哎呦,我估摸着只剩 Java。所以,关键是你公司在哪个阶段。
有时候我们上网一看,哇,大量都是 Java 不行、Java 反人类、Java 太啰嗦,但是你可以看看,说的那些人他们可能都在小公司哈哈哈,因为他的业务场景的确不需要用 Java,他说的是对的。或者是那些独立开发者,都是从 0 到 1,他爱用啥就用啥,自己舒服就好。但是你看那些大公司,银行、电商、电信,只要是这种有交易型的用户公司,包括哔哩哔哩所谓的自己用 Go,但是他做电商,你看他用啥,还是用 Java。Java,跑不掉的这个事情。
怎么才能学得快?
我之前说我学 Go 语言大概一两周时间就能够学会。但很多同学说自己已经是 Java 程序员,要学 Go 语言可能用半年时间都搞不定。我跟大家讲一个故事。我以前刚去上海的时候买不了书,只能在书店里面看书。我就把书店当成一个图书馆,看完后我会做笔记。我希望大家都有一种写作或者做笔记的习惯。
以学编程语言为例。你学一门编程语言,总是要把它抽象成一棵知识树。因为刚开始你学各种各样的语言,会发现,这个语言也有这几块东西,那个语言也有那几块东西。比如说,一个语言,它必然会有变量、分支,还有循环,这是它最基本的逻辑结构,所有语言都应该有的。然后更高级一点的特性,它也有一些数据结构,还有数组、字符串,再高级点比如泛型,还有面向对象的多态,还有一些类库等等,这些都必须得要有。没有这些东西的话,这个语言是挺难用。
所以我学一个新的语言,我就会把这个语言照着我的框架来套。这个语言有哪些分支逻辑、哪些声明变量,多线程是怎么玩的、面向对象多态怎么玩的等等。我就照着套,半天或一两天就套完了。这个语言也就学会了。所以,首先你有一个大的语言框架,新语言跑不出这个框架范围,然后你把语言特性往框架里面套就好了。你学得多了,你未来就会越学越快的,因为你会自己总结。这就是学习的一个过程,当你有了一个系统的知识树以后,然后你去填充这个树,把它全部填满了,你自然就学会了。
但是,我学 Rust 语言就没那么快,虽然 Rust 我也在套,但套完以后,准备上手写点东西的时候,就发现挺复杂。我讲一下我学 Rust 遇到的问题。首先,Rust 有所有权、生命周期、借用(借用就是引用)、共享各种各种乱七八糟的概念。我写代码,要共享内存。但是 Rust 不支持共享,一个变量赋值给另外一个变量,所有权就转移了。但是我偏要实现共享,然而共享就要用引用,引用就要玩生命周期,我就去写 Lifetime ,写 Lifetime 又要写多线程。多线程里面必须得用闭包,我就要在闭包里面玩共享变量,闭包里面我就要用 Lifetime …… 完蛋了。这个代码,我调了 3 天都没调通,编译我都编译不出来。我到 Stack Overflow 上问了这个问题,两天以后有人告诉我答案了。我看那个语法,哎呀,我都崩溃了,我是绝对不可能自己想得出来的。所以我想说为什么 Rust 门槛有点高,当我想去干一件事情的时候,我却发现我干不出来。所以我觉得它不是很成熟,学习门槛太高。
教育问题
我感到我们在校的学生正如“为什么中国的网页这么烂”中所说的——他们习惯于获取大量的知识,而从不对这些知识进行思考和总结。问题不是我们知道多少东西,问题是我们在获取这些知识的时候会不会去思考这些知识后的东西?比如:为什么会有这么多经典的数据结构,数组,链表,树,哈希表,图这些数据结构主要用来解决什么样的问题,他们的优势和劣势是什么?没有思考过,就不算真正的懂,没有思考过,你将无法应对万变的问题,没有思考过,你将成为书呆子。
多多实践而不是研究。编程不是在实验室做科研搞理论啊,计算机这本就是一个实践性很强的的学科啊,这不是数学,这需要你多多的实践啊。我们不要真以为读的是——计算机科学(Computer Science )就是搞理论的了,这里面需要很多很多的Engineering的工作。(我实在是很难想像,居然有这么多人写一般难度的程序居然会是那么痛苦的事)
我在我的新浪微博(@左耳朵耗子)里说的,我们不要以为做过项目,会写程序,我们就是程序员了。如果你只是在按部就班地写代码,你就是Coder,江湖叫“码农”,不要把自己当成“码农”,我们一定要对自己的代码,自己的设计不停地反思和总结,并精益求精,写程序本来就是一件有价值的事,这就像写篇作文人人都会写,但并不是人人都能把文章写好。编程和写作都是一样的,这都是在搞创作啊。想做“码农”还是想做“程序员”?自己决定吧。
我们的教育的确很“废柴”,但这不是我们成为“废柴”的原因。如果我们的学习还停留在“别人给我什么我就学什么”的被动学习阶段,那么你真的不懂怎么是学习。虽然,我们的学校里并没有教你什么是“Version Control”,什么是“Coding Style”,什么是“Refactory”,什么是“Code Review”,什么是“Unit Test”,也没有告诉你一些经典的设计的和架构,等等,等等,但是这是什么年代了?这个时代不是像我上学那时——学校机房里上机用的电脑连内存和硬盘都没有,用5寸的低密软盘面对绿色显示器的286,上网还要“猫”,而且贵的要死(一小时22元),而且网上什么都没有时代了。我们身边有很多很多优秀的人,网上有很多优秀的文章,书店里也有很多不错的书,而且我们的软件开发日趋成熟,如果我们还学不好的话,那么我们就是在犯罪!
五个方法成为更好的程序员
好的程序员并一定是技术强的程序员,而是那些可以在不完美的工作环境下保证软件质量和工作效率的程序员。下面是是五个程序员可以在这种不完美的情况下做得更好的观点(它们都和语言和技术没什么关系,只不过是一种你的工作行为,能够和所有的行业相通),这五个观点也许可以让你成为这样的好程序员。
寻找不同观点:程序员好像并不喜欢技术上有异见的人,他们特别喜欢争论各自的技术观点。但是,他们忽略了不同观点的价值。任何事情都有好有坏,我们应该学会在不同观点中学习和平衡。这样才会更多的了解编程和技术。要经常在做事之前问自己和别人,这么做对不对?做完事后问自己,还可不可以改进?努力去寻找别的不同的观点或方法。程序员应该经常上网,经常和同事讨论不同的实现方法,不同的技术观点,这样才能取长补短。然而,在实际工作中,我发现程序员们并不喜欢互相请教,因为请教的人怕别人看不起他,而被请教的人总是先贬低对方的能力,哎……(参看《十个让你变成糟糕的程序员的行为》),如果有这样的文化氛围的话,那也没有关系。上网吧,网上的人谁也不认识谁,可以尽情地问一些愚蠢的问题。呵呵。总之,一定要明白,如果某些事情只有一个观点,那么你一定要怀疑一下了,没有观点和技术方案的比较,没有百花齐放的情况,你就无法知道是否还有更好的东西。真正的和谐不是只有一种声音,真正的和谐而是在不同的观点声音下取长补短,百家争鸣(参看《十条不错的编程观点》)。否则,你永远都不会接受到新的观点,也就无法进步和成长了。
千万别信自己的代码: 在任何时候,一定要高度怀疑自己的代码。很多时候,错误总是自己造成的。所以,当出现问题的时候,要学会review代码中所有的可疑点,千万别觉得某段代码很简单,可以略过。事实证明,很多疏忽大意都是在阴沟里翻的船,都是那些很低级的错误。在查错的过程中,切忌过早下结论,切忌四处乱改(参看《各种流行的编程风格》),停下来,想一想,会是哪儿的代码有重大嫌疑,然后查看一下代码,捋一捋程序的逻辑(参看《橡皮鸭程序调试法》),调试并验证一下程序的逻辑和变量在运行时是否是正确的。很多时候,对于那些难缠的问题,最后解决了总是因为我们开始认真回头审视所有的代码。只有对自己的代码保持着高度的怀疑,这样我们才会想着如何让其运行得更好更稳定,也会让我们在单元测试中下更多的功夫,这样才能更能在那忙碌的环境中节省时间。相信我,在集成测试中fix bug的成本要比在单元测试Fix bug的成本大得多的多。一个简单的例子就是memory leak。程序员对自己的程序需要有忧患意识,这样才会越来越成熟,而自己的能力也会越来越强。
思考和放松: 做事前多想一想,这样做事的时候就不会不顾此失彼,手忙脚乱,一旦事情一乱,你的心情也会更乱,于是,事情也就会更乱。最后,你只得重写,这种事情太多了。而且,在工作中要学会享受,要学会放松心情,我并不是让你工作的时候聊QQ,我只是说,有时候,心态过于紧张,压力过大,你的工作成果反而更不好,从而又反过来造成新一轮的焦虑和紧张。我个人认为,思考和放松是可以完美统一的,思考其实就是一种放松,停下来,休息一下,回头看看走过的路,喝口水,登个高,看看过去走的对不对?总体是个什么样?总结一下,然后看看前路怎么样好走,这会你才会越走越好,越走越快。好的程序员都不是那种埋头苦干的人,好的程序员总是那些善于总结成败得失,善于思考,善于调整,善于放松的人(参看《优秀程序员的十个习惯》)。不然,我能看到的情形是,你很快地把事干完,回到家刚坐下来,老板或是客户就打电话来告诉你你的程序出问题了。总之,深思熟虑,动作会很慢,但是你可以保证你工作成果的质量,反而能让你更多的节约时间。
学习历史,跟上时代: 如果你是从十年前开始编程的,那么,今天的这门语言或是技术会有很多很多的改进和改善。你以前开发一个功能或函数,今天早已被集成时了语言中,而且做得比你的版本要好得多。以前你需要100行代码完成的事情,今天只需要1行代码。这样的事情在未来还会发生,所以,今天的你一定要学会如何跟上时代。但是,你也不要放弃历史,我现在看到很多程序员对一些现代的语言和技术使用的非常好,他们可以很容易地跟上时代。但不要忘了,计算机世界的技术更新和技术淘汰也是非常猛的。所以,你一定要学习历史,这些历史不是产商的历史,而是整个计算机文化的历史(参见《Unix传奇》)。只有通过历史,你才能明白历史上出现的问题,新技术出来的原因,这样才能够对今天的这些新的技术更了解,也才能明白明天的方向在哪里。学习历史和跟上时代都是相当重要的。使用新型的技术,停下来接受培训,可以让你工作得更快,更高效(参看《未来五年程序员需要掌握的10项技能》)。而学习和总结历史,才会让你在纷乱的世界中找到方向。
积极推动测试活动: 只有测试才能证明软件可以正常工作,只有测试才能保证软件的质量。无论什么产品,都需要经过或多或少的测试。测试地充分的产品或模块,你会发现其质量总是那么好,测试的不充的产品,质量总是那么次。德系汽车,日系汽车质量怎么样,关键还是在于怎么去测试的,测试的是否充分。所以,在你开发软件的过程中,如果你说你的程序写地好,质量高,那么请你拿出实实在在的测试报告。在整个软件开发过程中,做为一个好的程序员,你应该积极地在各个环节推动项目组进行测试活动。不要以为技术需求阶段和设计阶段不需要测试,一样的,只要你要release什么,release的这个东西都需要进行测试。技术需求怎么做测试?用户案例就是测试案例。在软件开发的整个过程中,保证产品质量有时候比实现需求更重要,尤其是那些非常重要甚至人命关天的产品。
程序员练级攻略
(1) 启蒙入门
- 学习一门脚本语言,例如Python/Ruby
- 用熟一种程序员的编辑器(不是IDE) 和一些基本工具
- 熟悉Unix/Linux Shell和常见的命令行
- 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)
(2) 进阶加深
- C语言和操作系统调用
- 学习Java
- Web的安全与架构
- 学习关系型数据库
- 一些开发工具
(3) 高级深入
- C++ / Java 和面向对象
- 加强系统了解
- 系统架构
再说说工作的事
我比较同意的”第一份基本决定了近几年或者一辈子你在哪个行业发展”,但又有一点点不是很同意。因为我毕业的时候,在银行混了两年,然后又去一个国企业呆了2年。所以,第一份工作并没有影响我的职业。但是,我必需承认——当我从银行出来的时候,我落后了,落后了还很多,我花了近5-6年的时候才把这个差距追了回来。
所以,我有几个观点想告诉大家:第一份工作并不决定你的人生。因为你可以在2年内换工作。但是你头四年的做的事会对你的职业有影响。这里,我有两个案例分享一下。(我不用说太多了,相信大家自己能体会)
一个是我的同学70后,他以前是程序员,干了5/6年后不想干了,想转行,结果转不了,因为他的工作经历让他很难转行了,他问了一下自己是否愿意和那些刚毕业的80后拿一样的工作一起竞争,最后他自己都不愿意。后来,他去读了MBA,现在还做IT,现在做一些业务咨询方面的工作。不能算失败,但是时间浪费了。还有一个是我的同事,她CS专业毕业想做程序员,但最后为了进一个好的公司只能做QA,现在4年多了,她很想很想做dev,但是却抱怨工作没有给她这样的机会,4年多的QA经验让她很难成为Dev了。我从她做QA一年的时候就在和她说,如果你想做Dev,你就要有技术储备,多和dev在一起工作,QA又怎么样,如果我能读Dev的代码,我总有一天会成为Dev的。事实证明,她对技术并没有太多热情。现在也只能得过且过了。
如果你觉得自己在技术有自信有热情,而且已经有一些成绩了,我强烈建议你去IT公司中锻炼,越尊重技术的的IT公司越好。就像打球一样,只有和比你厉害的人一起玩,你才会得提高。如果你对技术的热情一般,也没有太多的自我价值的追求,也不想拼搏,而且对吃大锅饭不反感,对没有激情的工作不反感的话,那么,你应该去事业单位,当个公务员,走走常规则的人生,养养老也不错。这里,我多说一句,根据中国的现在国情来看,如果你有自我价值的诉求,你要去大城市,去好的公司,走体制外的路线,如果你又不想来大城市 ,只想呆在地方的话,那么,我个人非常建议你走体制内的路线,在地方,只有体制内的路线是最好的。
千万别去一些没有前途的小公司(要去小公司你得看看这个公司的人和业务),很多不起眼的小公司现在都变大了,能和一个公司一起成长是相当难得的(我现在就特别想要这方面的经历),现在这个社会,与其去那些很难成长为大公司的小的很不规范的公司,还不如自己创业。(更新2011/4/26:@islet8 回复中的观点可能比我的更好——“我觉得第一份工作能尽量进大公司的确是有好处的,能够帮你建立起一套规范的、成熟的工作习惯了思维方式,经过一两年(在激情还没被磨灭之前)再挑一个靠谱的、能赌上自己前途的小公司(比如同事朋友等推荐过去的或是他们联合创立的)一起成长一遍,无论公司的成败,对个人来说,那都是成功了”)
人生选择的三个问题
2011年的年底,我问了我自己三个问题:
- 每天早上醒过来的时候,我会为什么感到兴奋?是什么在驱动着我去开始新的一天?
- 现在的经历有没有让我有这种兴奋的感觉?这种让我充满力量和期待的感觉?
- 有没有浮燥,有没有得到认可?身边的人的认可?但更重要的是自己是否对自己认可?
大公司和小公司的权衡
其实无论大公司也好,小公司也罢,只要你用心观察都能学到东西,但你不用心什么都学不到。
大公司最大的问题就是一个萝卜一个坑,你就只能干你那一小个环节,你就是他的零件。所以很多人觉得大公司里面学不到东西,反而在小公司里可以做一个面的事情,能学得更多。其实不是。到大公司里面,我觉得有三个东西是可以学得到的。 第一,组织管理。大公司组织的运作方式、体系化的管理方式,怎么调动那么多人来完成一个事;或者一些思维方式,为什么他要做这个而不是做那个。这是大公司跟小公司不一样的地方,因为大公司有资源,可以去试错,试过很多很多错误。每一个东西都是可以让你思考。第二,怎么挣钱,大公司怎么挣钱的。第三,大公司里面的一些高手是怎么工作的。因为大公司里我觉得应该是有这个世界上最好的人。比如这个世界上最好的运营、最好的产品经理、最好技术人员,都在阿里、亚马逊、谷歌这样的一些公司。所以你进去要去找大公司里面那些聪明的人,跟他学,就像你打羽毛球下象棋一样,你必须要找高手学。就这三个东西,在大公司里面我觉得是最有价值的。
996 没有成长怎么办?
“毕业两年,现在公司里头都是 996,日常的业务需求做不完,感觉自己在这个公司没有什么成长,学习也没有多少时间,是不是应该考虑换工作了。”
对于这个问题,我想问,大家想过没有,你找工作的目的是啥?任何事情我们都得回到目的上,如果找工作的目的是为了找碗饭吃,不让自己饿死的话,那 996 这些我觉得都顺其自然就好,因为这是让你不饿死的一条路。如果你找工作的目的是为了实现自我价值,那假使现在的公司不能帮你达到这样的目标,你就应该勇敢寻找能够帮你达到目标的公司。比如,我以前是在银行里,从甲方跑出来,房子都不要了,我就是为了实现自我价值,所以我选择公司的标准就是这个公司可不可以帮助我实现自我价值。这是互相成就的一个事,我跟我的团队的员工也是这样说的:你成就我,我成就你,这是双向的事情。
所以我觉得换不换工作问题在于,你得问一问自己,你想要什么?如果你想要的是提升自我,那就应该去找能够成就你的公司。那些公司也会问你,你能成就我啥?这就是一个相互交换的过程。当我们不断去索取的时候,我们也需要给予。我贡献价值,反过来,我希望公司也能给我价值。这是互相交换。大家都是在签合同,是雇佣关系,而不是什么劳动关系,不是说是我为你工作,我就是你的人,不是卖身关系,这是个相互合作的关系。所以,如果不能达到目的,我建议你不要去,公司也需要很好的人。好的机会从来都是给好的人,不会给不好的人。
挑战无处不在
- 只要你想,挑战是无处不在的。那怕是你现有的觉得无聊的东西,只要你想做到极致,那怕是一个简单的功能(比如用户登录的功能)也会让你充满挑战。
- 观察身边的事物,去思考,去调查,举一反三,这才是你成长的源泉。不要把你的成长推给客观原因。
- 我的软件开发的三重门中说过,第三重门是解决实际问题,让你的业务处理更为的智能,更为地强大。我不知道为什么这一两年,我们的圈子里所有的人都在关注着“云”,“海量数据处理”,“高性能架构”这样的东西,尤其是那些性能调的高性能的东西并不很难,而这些更为实际问题更有挑战性,也更有前景。
没有时间怎么办?
这个事情我是这样想的,你得管理时间。有时候向下管理,有时候向上管理。
向下管理就是管理自己的时间。我们现在有点不好,有手机随时都会来通知,一会就被打断。如果你的时间总是被打断的话,利用效率是不高的,所以不要被打断。你说我们公司里面还有什么钉钉群这些东西,就很可怕的事,反正管理好自己时间。一般来说我喜欢专注做事情,在阿里有些时候我也害怕被打断,我就跑到别的办公区里工作,把手机直接静音,然后一个小时以后再出来回复一波。
然后第二个,向上管理。比如说是这个事情本来就是得一个星期才能做完的,他就要让你两三天做完,你要自己接了,就不要怪别人。该跟他斗争的还是要斗争,但是斗争是要有资本的。没资本的话,就比较麻烦。对于类似的事情,我的思路是我可以辛苦,我可以加班,我肯定会努力做。欲先取之,必先予之。等到领导对你、公司对你有比较大的依赖的时候,你就可以跟他谈任意的条件,因为他很害怕你跑了。这就是资本。
但沟通的时候,也不要太直。我在外企里面学到的一个方法叫 Never Say No。他说和用户沟通的时候,你永远不要说不,这事我做不到。你要说 Yes,但永远是有条件的 Yes。比如这种情况下我能做到,那种情况下我做不到。你给我更多的时间,我能做得到,你给我那么短的时间我做不到。或者说在那么短的时间内我只能交付你半成品,你要不要?就是我永远都可以给你做出来东西,但是总是有代价的,总是有条件的。为什么要这样呢?别人把球传给你,问你能不能做?我们技术人员比较实在,好像只能回答“能做”还是“不能做”,那你就被 PUA 了,知道吧?你知道你被 PUA 是什么概念?被 PUA 就说是你进入了别人的环境里面,它营造了一个空间,把你扔进来,按照他的逻辑,就问你,给你一个答案,你能干还是不能干?那无论你的答案是能还是不能,你都是被 PUA 的。
你要反 PUA 的话,必须得把他拉到我们喜欢的角度来,把这个压力推回去,给他一系列的条件:
- Option 1 :我可以再按时完成,但是质量别想。
- Option 2 :你给我足够的时间,我保质保量全部交付。
- Option 3 :我还是按你这个时间,但是你必须砍掉一些需求。
三个 Option 传回去,就反转了,因为这个逻辑是你的。他这时候就要痛苦地做选择了。到底选 1、2 还是 3?因为每个选择他都要付出一些东西,那就让他去选,不要剥夺他的选择权,不要硬杠,你把选择权传给他,表面上你是在很好的交流,实际上你在 PUA 他。
我给大家再举一个例子,当时从阿里出来的时候,因为工作居住证的一些问题,所以我需要阿里给我赔偿,但当时他们就很可怕地说:你是不是要敲诈我?律师团队这么说。我一想我敲诈多大的罪啊?要把我抓到监狱里!因为我要求的那个数是比他要赔偿我的更多一些,所以我说:第一个我不要钱,一分钱不要。既然你也认这个事的话,你给我写个道歉信,盖上阿里巴巴的公章就好。第二个是按你说的赔偿,你不用给我道歉,你告诉我这个钱的事由是什么样子,然后盖上盖公章,不然你说我诈骗,我可不敢要了这个钱。也就是说你给我赔偿这个钱,必须说明这个钱是用来干什么的,然后盖上你的公章,不然我以后说不清楚。第三个是这些都不需要,然后我们就签个协议,按照我的要求给我。他们自己肯定不愿意出具我可以拿出去说的这么一个证明嘛,对吧?也就是说要反向 PUA,选项给对方,选项永远都说可以干的,但是你要有条件。小胡同赶猪,我给你了 5 条路选,但是你肯定不会选那 4 条路,你只会选这条路,因为那 4 条路他自己就去盘算了,就这样子反向 PUA 就是反过来给他更多的选项。好,这些都是这些我教大家的,不单单是管理时间了,哈哈哈。
编程能力与编程年龄
这些年来的对于外企和国内感受—— 国外牛B的IT公司的工程能力并不见得比国内的要强多少,但是国外那些NB的IT公司的架构和设计能力远远超过国内的公司,最可怕的是,那些有超强架构和设计能力的“老程序员们”还战斗在一线,这些战斗在一线的老鸟的能力绝对超过100个普能的新手。
对年轻程序员的感受——国内新一代的程序员们太浮燥了。老实说,对于大多数人来说,如果你没有编程到30岁,你还不能成为一个“合格”的程序员。所以,并不是编程编到30岁就玩完了,而是编程编到30岁才刚刚入门。这些不合格的程序,整天BS这个不好,那个不好的,而且喜欢速成,好大喜功。
我是一个奔四的人了,编程就像登山一样,越往上爬人越少,所以,在我这个年纪还有想法,对编程还有热情的人不多了,基本上都是转Manager了。其实,什么职位,Title都是虚的,公司没了什么都没了,只有技术才是硬通货。而且,越是这个年纪还在玩编程玩技术的人,其实其经验和能力都是比较强的,都是中坚力量,如果还有其它这个年纪和我一样的人,求交往。
35 岁危机
我在一些群里,40 岁程序员的群,然后还有些 35 岁以上程序员的群。我觉得那些群我连一天都不想看,太无聊了,里面就是各种八卦,我不知道为什么这些中年人天天都喜欢聊八卦,今天看见这个社会热点又怎么样,那个热点又怎么样。
我觉得是这样的,不要觉得 35 岁、40 岁会是一个坎。我今天也在写代码,有句话是这么说的:“人不是因为变老了才没有热情,而是因为没有热情才会变老。”
有的人说我老了,我学不动了。不是的,因为你学不动,你才变老了;不是你老了,你才学不动。这个世界上有大量这样本末倒置的因果关系的逻辑,如果你学得动,或者你还对这个事情充满憧憬,有想法,愿意去奋斗的话,70 岁你都不老。
像我今天这个样子,我也不觉得我老。我觉得很多年轻人可能还不如我,他们在 20 多岁、30 多岁,可能就已经放弃了自己的人生,我今天还没有放弃。所以, 35 也好, 40 也好,不用去想这个数字的事。
面对人生
现在的我,即不是左派也不是右派,我不喜欢爱国主义,我也不喜欢崇洋媚外,我更多的时候是一个自由派,哪边我都不站,我站我自己。因为,生活在这样的一个时代,能让自己过好都是一些比较奢望的事了。
《教父》里有这样的人生观:第一步要努力实现自我价值,第二步要全力照顾好家人,第三步要尽可能帮助善良的人,第四步为族群发声,第五步为国家争荣誉。事实上作为男人,前两步成功,人生已算得上圆满,做到第三步堪称伟大,而随意颠倒次序的那些人,一般不值得信任。这也是古人的“修身齐家治国平天下”!所以,在你我准备要开始要“平天下”的时候,也得先想想,自己的生活有没有过好了,家人照顾好了么,身边有哪些力所能及的事是可以去改善的……
穷则独善其身,达则兼济天下。提升自己,实现自我,照顾好自己的家人,帮助身边的人。这已经很不错了!
什么样的人干什么样的事,什么样的阶段做什么样的选择,有人的说,选择比努力更重要的,我深以为然,而且,我觉得选择和决定,比努力更难,努力是认准了一个事后不停地发力,而决定要去认准哪个事是自己该坚持努力的,则是令人彷徨和焦虑的(半途而废的人也很多)。面对人生,你每天都在作一个一个的决定,在做一个又一个的选择,有的决定大,有的决定小,你的人生的轨迹就是被这一个一个的决定和选择所走走出来的。
我在24岁放弃了一房子离开银行到小公司的时候,我就知道,人生的选择就是一个翘翘板,你要一头就没有另一头,选择是有代价的,你不选择的代价更大;选择是要冒险的,你不敢冒险的风险更大;选择是需要放弃的,因为无论怎么选你都会要放弃。想想你老了以后,回头一看,好多事情在年轻的时候都不敢做,而你再也没有机会,你就知道不敢选择不敢冒险的代价有多大了。选择就是一种 trade-off,这世上根本不会有什么完美,只要你想做事,你有雄心壮志,你的人生就是一个坑接着一个坑,你所能做的就是找到你喜欢的方向跳坑。
所以, 你要想清楚你要什么,不要什么,而且还不能要得太多,这样你才好做选择。否则,你影响你的因子太多,决定不好做,也做不好。就像最前面说的一样,你是激进派还是保守派,你是喜欢领导还是喜欢跟从,你是注重长期还是注重短期,你是注重过程还是注重结果……等等,你对这些东西的坚持和守护,成为了你的“三观”,而你的三观则影响着你的选择,而你的选择影响着你的人生。
价值取向
下面是一些大家经常在说,可能也是大多数人关心的问题,就这些问题,我也谈谈我的价值取向。
挣钱。挣钱是一个大家都想做的事,但你得解决一个很核心的问题,那就是为什么别人愿意给你钱?对于挣钱的价值观从我大学毕业到现我就没怎么变过,那就是我更多关注的是怎么提高自己的能力,让自己值那个价钱,让别人愿意付钱。另外一方面,我发现,越是有能力的人,就越不计较一些短期得失,越计较短期得失的人往往都是很平庸的人。有能力的人不会关心自己的年终奖得拿多少,会不会晋升,他们更多的关心自己真正的实力有没有超过更多的人,更多的关注的是自己长远的成长,而不是一时的利益。聪明的人从来不关心眼前的得失,不会关心表面上的东西,他们更多关心的是长期利益,关心长期利益的人一定不是投机者,一定是投资者,投资会把自己的时间精力金钱投资在能让自己成长和提升的地方,那些让自己可以操更大的盘的地方,他们培养自己的领导力和影响力。而投机者在职场上会通过溜须拍马讨好领导,在学习上追求速成,在投资上使用跟随策略,在创业上甚至会不择手段,当风险来临时,投机者是几乎完全没有抗风险能力的,他们所谓的能力只不过因为形势好。
技术。对于计算机技术来说,要学的东西实在是太多,我并不害怕要学的东西很多,因为学习能力是一个好的工程师必需具备的事,我不惧怕困难和挑战。我觉得在语言和技术争论谁好谁坏是一种幼稚的表现, 没有完美的技术,Engineering 玩的是 Tradeoff。所以,我对没有完美的技术并不担心,但是我反而担心的是,当我们进入到一些公司后,这些公司会有一些技术上的沉淀也就是针对公司自己的专用技术,比如一些中间件,一些编程框架,lib库什么的。老实说,我比较害怕公司的专用技术,因为一旦失业,我建立在这些专用技术上的技能也会随之瓦解,有时候,我甚至害怕把我的技术建立在某一个平台上,小众的不用说了,大众的我也比较担扰,比如Windows或Unix/Linux上,因为一旦这个平台不流行或是被取代,那么我也会随之淘汰(过去的这20年已经发生过太多这样的事了)。为了应对这样的焦虑,我更愿意花时间在技术的原理和技术的本质上,这导致我需要了解各种各样的技术的设计方法,以及内在原理。所以,当国内的绝大多数程序员们更多的关注架构性能的今天,我则花更多的时间去了解编程范式,代码重构,软件设计,计算机系统原理,领域设计,工程方法……因为只有原理、本质和设计思想才可能让我不会被绑在某个专用技术或平台上,除非,我们人类的计算机这条路没走对。
职业。在过去20多年的职业生涯中,我从基层工程师做到管理,很多做技术的人都会转管理,但我却还是扎根技术,就算是在今天,还是会抠很多技术细节,包括写代码。因为我心里觉得,不写代码的人一定是做不好技术管理的,因为做技术管理有人要做技术决定,从不上手技术的人是做不好技术决定的,另一方面,我觉得管理是支持性的工作,不是产出性的工作,大多数的管理者无非是因为组织大了,所以需要管人管事,所以,必然要花大量的时间和精力处理各种问题,甚至办公室政治,然而,如果有一天失业了,大环境变得不好了,一个管理者和一个程序员要出去找工作,程序员会比管理者更能自食其力。所以,我并不觉得管理者这个职业有意思,我还是觉得程序员这个有创造性的职业更有趣。通常来说,管理者的技能力需要到公司和组织里才能展现,而有创造力的技能的人是可以自己独立的能力,所以,我觉得程序员的技能比管理者的技能能让我更稳定更自地活着。所以,我更喜欢“电影工作组”那样的团队和组织形式。
打工。对于打工,也就是加入一家公司工作,无论是在一家小公司还是一家大公司工作,都会有好的和不好的,任何公司都有其不完美的地方,这个需要承认。首先第一的肯定是完成公司交给你的任务(但我也不会是傻傻地完成工作,对于一些有问题的任务我也会提出我的看法),然后我会尽我所能在工作找到可以提高效率的地方进行改善。在推动公司/部门/团队在一技术和工程方面进步并不是一件很容易的事,因为进步是需要成本的,有时候,这种成本并不一定是公司和团队愿意接受的,而另外,从客观规律上来说,一件事的进步一定是会有和现状有一些摩擦的。有的人害怕有摩擦而忍了,而我则不是,我觉得与别人的摩擦并不可怕,因为大家的目标都是基本一致的,只是做事的标准和方式不一样,这是可能沟通的,始终是会相互理解的。而如果你没有去推动一个事,我觉得对于公司对于我个人来说,都是一种对人生的浪费,敬业也好,激情也好,其就是体现在你是否愿意冒险去推动一件于公于私都有利的事,而不是成为一个“听话”、“随大流”、“懒政”的人,即耽误了公司也耽误了自己。所以,我更信仰的是《做正确的事情,等着被开除》,这些东西,可参看《我看绩效考核》,以及我在Gitchat上的一些问答。
创业。前两天,有个小伙来跟我说,说他要离开BAT要去创业公司了,说在那些更自由一些,没有大公司的种种问题。我毫不犹豫地教育了他一下,我说,你选择这个创业公司的动机不对啊,你无非就是在逃避一些东西罢了,你把创业公司当做是一个避风港,这是不对的,创业公司的问题可能会更多,去创业公司的更好的心态是,这个创业公司在干的事业是不是你的事业?说白了,如果你是为了你的事业,为了解决个什么,为了改进个什么,那么,创业是适合你的,也只有在做自己事业的时候,你才能不惧困难,才会勇敢地面对一切。那种想找一个安稳的避风港呆着的心态是不会让你平静地,你要知道世界本来就是不平静的,找了自己的归宿和目标才可能让你真正的平静。所以,在我现的创业团队,我不要求大家加班,我也不鸡汤洗脑,对于想要加入的人,我会跟他讲我现在遇到的各种问题以及各种机遇,并一直在让他自己思考,我们在做的事是不是自己的事业诉求?还可不可以更好?每个人都应该为自己的事业为自己的理想去活一次,追逐自己的事业和理想并不容易,需要有很大的付出,而也只有你心底里的那个理想值得这么大的付出……
客户。基于上述的价值观,在我现在创业的时候,我在面对客户的时候,也是一样的,我并不会完全的迁就于客户,我的一些银行客户和互联网客户应该体会到我的做的方式了,我并不觉得迁就用户,用户要什么我就应该给什么,用户想听什么,我就说什么,虽然这样可以省着精力,更圆滑,但这都不是我喜欢的,我更愿意鲜明地表达我的观点,并拉着用户跟我一起成长,因为我并不觉得完成客户的项目有成就感,我的成就感来自客户的成长。所以,面对客户有些做得不对有问题有隐患的地方,或是有什么做错的事,我基本上都是直言不讳地说出来,因为我觉得把真实的相法说出来是对客户和对自己最基本的尊重,不管客户最终的选择是什么,我都要把利弊跟客户讲清楚。我并不是在这里装,因为,我也想做一些更高级更有技术含量的事,所以,对于一些还达到的客户,我如果不把他们拉上来,我也对不起自己。
在我“不惑之年”形成了这些价值观体系,也许未来还会变,也许还不成熟,总之,我不愿跟大多数人一样,因为大多数人都是随遇而安随大流的,因为这样风险最小,而我想走一条属于自己的路,做真正的自己,就像我24岁从银行里出来时想的那样,我选择对了一个正确的专业(计算机科学),呆在了一个正确的年代(信息化革命),这样的“狗屎运”几百年不遇,如果我还患得患失,那我岂不辜负活在这样一个刺激的时代?!我所要做的就是在这个时代中做有价值的事就好了!这个时代真的是太好了
References:
- 左耳朵耗子的话
- 左耳朵耗子的话音频
- 谈谈我的“三观”
- 别让自己“墙”了自己
- 对程序员职业的一些建议
- 给程序员新手的一些建议
- 软件开发的“三重门”
- 挑战无处不在
- 三个事和三个问题
- 多些时间能少写些代码
- 做个环保主义的程序员
- 《REWORK》摘录及感想
- 五个方法成为更好的程序员
- 编程能力与编程年龄
- 这多年来我一直在钻研的技术
- 程序员练级攻略(2018) 与我的专栏
- 程序员技术练级攻略