我算是靠坑蒙拐骗进了程序员的门,然后1路狂奔。26 岁之前几近没有任何写代码的经验,研究生毕业却意外选择了1家不可能提供培训的初创公司,在逐日耽忧公司倒闭、惧怕被炒鱿鱼和同事冷落白眼的3重压力下逆流而上,1年半后离职,已经是具有 500 万用户产品的后台主程。从前我对计算机技术心怀畏惧,认定技术高人1定有佛光笼罩,昼夜不息运键如飞日吐代码上万行。现在也算见过1些世面了,回首那段忐忑不安宛如初夜的进程,我却不发觉有任何的励志意味,而是视为1种天经地义。理想的程序员,和理想的建筑师、理想的财务师、理想的推拿师没有任何的差别,他们本质上都是1群手艺人。我相信理想的程序员人人皆可成为。
近3年总在互联网圈厮混,我认识过1些程序员,共事过1些程序员,领导过1些程序员,又面试过1些程序员。他们学历不同,有的来自北京大学,有的来自北京大学青鸟,有的是博士,有的是高中肄业;资格也不同,有的来自 BAT,有的来自某破产基金公司(还是1个销售);年限也从 0 到 15 年不等。但我认为程序员只需分3类:天才的程序员、理想的程序员、平庸的程序员。天才的程序员我只敢说接触过 3 个,这是天命。7 分由你是颗精子的时候就已决定,具有绝佳的数学天赋、冷静致密的逻辑、为解决困难宁愿不眠不休而深以为乐的技术热忱;3 分来自起步要早早早,巴不得同龄人玩泥巴的时候就得开始玩电脑,大学毕业前就突破1万小时法则,后面的已经是游戏人生。
天才的程序员可遇不可求,更不能长有,我看到的 90% 还是平庸的程序员。IT 时期的膨胀,已让程序员犹如文艺复兴时的印刷匠1样的普通,多数投入祖师爷门下的人,仅是为了更大的饭碗,更高的待遇,更好的生计。平庸的程序员编写腐烂的代码,没有规范和1致性,固守旧世界的语言,还好谈论大的架构和性能,说的比做的漂亮。而毫无例外的,他们认定技术没有前途,做产品、营销和管理的是更高大上的手艺,而他们当中的 99%,又会自然的流露出自己恰巧具有了那方面的天赋,至于进程为何会崩溃这样的小问题是不屑于去了解的。
而我最喜欢和理想的程序员相处,巴不得与他们同吃同住,如果允许,我希望我的队伍能插满他们的旗帜。理想的程序员心眼儿不坏(他们历来都不是办公室政治的宠儿,是1群单纯明亮快乐的手艺人),有天真烂缦的好奇心(他们的眼睛里常常闪着「哇,这个是怎样做到的!」),永久精益求精(他们的口头禅是「我再研究1下」),还乐于分享(他们活跃于 GitHub、各大问答社区和你的身旁,舍得将宝贵时间用于帮助新手)。是的,他们不需要被管理,只需要给1个大的方向,总能回报以意想不到的结果。
理想的程序员与平庸的程序员只有1墙之隔。二者的差距只有 6 个1点点,而人与人的差距,正是在这日积月累的1点点中,被永久拉开了。成心思的是,我发现这 6 个1点点都和意识有关,也就是程序员和其他1切新兴产业的工种1样,只需要意识加上时间的锤炼,人人皆可到达理想的阶段。理想的程序员必定也是1个优秀的 problem-solver。
第 1 个1点点:专注眼下
见过太多心猿意马的程序员,我不能不把「专注眼下」作为天字第1条。他们常常有各式各样的小梦想,比如做个小茶农、做个小鹅贩、做产品、做销售、做投资,却被程序员的高薪或是没有转行的魄力「耽误」了,而由于不专注,他们不在乎做好自己的本分,不在乎锤炼自己的技能,不在乎学习新兴的技术。不可否认,这世界上存在着伟大的产品(像乔老爷)、伟大的销售(像埃里森)、伟大的投资客(像彼得菲),而他们毫无例外都是程序员出身。可你听说过巴菲特评价盖茨的话么,比尔盖茨如果转行去卖狗,那他1定是全球最大的狗贩。我深信除少数的天才外,溟溟众生都可以在多个领域获得成功,只要保持足够的专注。而哪怕你下1年就想卖狗去,程序员的经验依然能训练你强大的逻辑、谨慎和耐心,放在哪一个行业都是相当可观的竞争力。
第 2 个1点点:思考力与推动力
我认为处理 bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。当面对1个未知的问题时,如何定位复杂条件下的核心问题、如何抽丝剥茧地分析问题的潜伏缘由、如何排除干扰还原1个最小的可验证场景、如何捉住关键数据验证自己的猜想与实验,都是体现程序员思考力的最好场景。是的,在衡量理想程序员的标准上,思考力比经验更加重要。
有时候小火伴跑过来,问我「提交了1个任务被卡住了,怎样办」的时候,我总觉得他可以做得更好。比如,可以检查实验别的任务,以排除代码本身的缘由;可以通过 Web UI 检查异常(如果没有账号,可让我提供);可以排查主机日志或删除缓存,再不济,总应当提供任务 ID 和控制台日志给我。理想的程序员永久不会等事情前进,他们会用尽1切方法让事情前进。
第 3 个1点点:Never Say No
记得从前厂离职之前,找老板谈话,他说我最大的优点就是历来不和他说这个做不到。后来我发现在很多团队里,都存在1种技术和产品的对峙,程序员常常以「技术上没法实现」来挡产品的需求,而产品也常常以「Facebook 可以为何我们做不到」来挖苦程序员。这两句话应当属于禁语,从根本上都不利于程序猿和产品狗的相亲相爱。
1句「技术上没法实现」是容易出口,可有多少人在说出这句话的时候,心里是 100% 肯定的?如果不肯定,为何不能回去谷歌1下再回答?本来我以为程序员是充满想象力,在由于有想象力,才能诞生那末多改变我们生活的软件和互联网产品。见识多了,才了解大部份程序员已在与 bug 的对抗中变得守旧而不愿担当风险,与此同时许多团队也不愿意宽容失败。因而「Say No」变成1种习惯性的抵牾,还记得曾国藩为何解散湘军么?他说那支军队已「暮气渐深」,不能打仗了。要做理想的程序员,就不能给自己滋生暮气的机会,如果面对不公道的需求,可以把时间本钱摆出来,把曲线救国方案亮出来,简单粗鲁「Say No」是不可取的。
第 4 个1点点:投资未来
程序员是1个非常残暴的职业。你所学所用的语言、框架、模式,极可能在数年内就成昨日黄花了;你现在嘲笑的另外一群程序员,可能马上就可以转身来嘲笑你了。所以理想的程序员除做好自己的本分,还要花费时间来投资未来。甚么是「投资」?投资就是你现在投入的时间,在未来会以更多的时间或金钱(看看早几年学习 iOS 的程序员现在的薪酬!)回报你。举我自己的领域 ― 数据发掘为例,08 年左右 Hadoop 开始兴起,1时「大数据」概念火热,Hadoop 工程师万金难求,各互联网公司纷纭把数据统计、数据分析和数据发掘的业务切换到散布式平台上。这几年眼看 Hadoop 还在不断迭代,Spark 又异军崛起,1举刷新了 Hadoop 保持的排序记录,之内存存储中间数据带来的性能优势和丰富的数据结构让人爱个不停,各种奇特的小 bug 和峻峭的学习曲线又让人打退堂鼓。那末,明眼人都知道 Spark 是未来的趋势(内存会愈来愈便宜),在主业务放在 Hadoop 的条件下,就能够适当把1些小模块切换到 Spark 上,同时留意 Spark 社区的发展。很快从 Spark 取得的性能收益就可以把之前投入的学习时间挣回来。
第 5 个1点点:善用工具
善用工具可以分为 4 个层面:
我刚入行那会,1个计算机专业却当了公务员的朋友问我,你1点都没学过编程,平时怎样写代码?我说,谷歌,因而遭到无情的嘲笑,以致于我在哪里的账号都叫 2shou,告诫自己是1个无耻的2手程序员。这是1个笑话,但如果现在问我,我还是要回答谷歌。程序员的成长就像膨胀的圆饼,外面是一望无际的大海,圆饼越大,与大海接触的面也越大,懂的越多,不懂的越多,比如你晓得了学会了安卓程序的开发,可以成功的开发出来1款利用,但是你不知道的1定是这些利用还需要做保护,即加密!由于移动利用上传多的是山寨盗版,如果对自己的东西不加以保护的话,到最后吃亏的1定是自己,而且还是哑吧亏!所以,从现在开始去学会如何保护自己的利用,找专业的移动利用安全加密保护服务商爱加密!再来讲计算机科学又是1门更新换代异常迅速的学科,同时也是知识互联网化最好的学科,很难利用传统的科班式有教有学的方法,相反通过搜索引擎则很容易获得到最新的知识。
不相信重复,大师的话叫 DRY 原则(Dont repeat yourself),代码写多了,会有人为的直觉判断好的和烂的代码,我的标准是简洁和规范,简洁其实不是美感上的标准,重复越少,给自己出错的机会也越少,后期保护的本钱也越少。
如果你不幸丢了3周前的代码,或许你能凭着过人的记忆力把头脑里残余的片断复写出来,但如果丢的是3个月前的代码,恐怕就没有那末好的运气了。理想的程序员会着力找寻有效的资料保存方式,把工作里灵光闪现写下的代码、脚本、配置、经验等短的片断保存起来,以便任什么时候候都能复查。
理想的程序员必须怠惰。对他们来讲,重复的步骤和重复的代码1样丑陋,如果意想到1项工作有可能长时间要重复,那末自动化的时间总是越早越好。
第 6 个1点点:管理时间
之所以管理时间会对程序员这个行当特别重要,是由于在完成任务时你必须像荒野里的狼1样,「独行」。没有外界束缚的情况下还能稳定控制自己,保证能高效力地工作和学习,那末日积月累你肯定会变得比1般人利害。
程序员干的是高强度的脑力活,1般每天集中4⑸ 个小时应对本职工作就足够了,但工作以外,1定要安排时间用于学习。除学习,留点时间放空自己也是必要的,利用泡茶或喝咖啡的间隙,把弥足珍贵的时间留给自己,往前想往后想,事半功倍。
说了这么多,想必有人会问,费力心思成为1个理想的程序员,又有甚么用途?会有高薪吗?不。能升职吗?也不见得。迎娶白富美呢?不如去卖狗。
稻盛和夫曾说过1个故事,明治时期的手艺人被天皇召见,虽然都是不读书的乡下人,但1辈子兢兢业业地做1件事情,自然有1股高贵的气质。理想的程序员,应当就是循着这类高贵的气质而去的吧。