DàYé首席路 | 10.24条程序员生存法则

笔者曲健,1024生人,天选程序员,浆糊人送外号“大爷Dà Yé”,目前在奥琪科技担任首席架构师一职。

彼得德鲁克的经典之作《卓有成效的管理者》里提到,知识管理者必须学会自我驱动、自我管理,而动力取决于工作是否卓越有效,是否有所成就。程序员就是典型的知识工作者,本文就是细数一下程序员的生存之道,或者说自驱之道。

00 优雅的命名

程序员生存法则Number One, 无出其右者,且不接受挑战。

务必记住,程序员的第一武装不是格子衫不是脱发,是代码! 如果把代码比喻成人体,那么逻辑(指令)是经脉,数据是气血,而命名就是穴位。

大家想想在阅读代码的时候,不管是变量名、方法名、类名还是系统名,都是用于辅助理解逻辑/功能的特别重要的标识。我可以负责任的说:程序员命名能力的高度基本决定了他/她未来的高度。命名绝不仅是名字本身,它更可映射出作者的思维框架、知识外延、逻辑推理、语言能力、创造力、想象力等等,所以是不是瞬间拔高了?

可以参见我之前关于取名技巧的一篇文章《IT范儿 | 你是个会取名儿的人么?

DàYé啰嗦

# 长点心好好补补英文,程序员阅读各种英文文档需要词汇量自不必说,如果你每次命名都需要翻译软件,不自知的取最生僻的那层含义,或者各种拼写错误,往大了说特别容易引入BUG,往小了说实在丢人丢份。

# 同一代码块/层级/工程中一定不要出现过于相似的名字。由于相似导致写逻辑的时候把自己整乱的大有人在!每每评审看到这种代码吾必痛心疾首。

userVo, userDTO, userBo, userPo…
userAddedList, userAddedLists…
getUsers(), usersQuery(), getUserList()…

# 切不可文不对题,切不可“百转千回”。何意?比如说判断一个人是否是注册会员,变量名被定义成了 notRegisteredUser,大家想想在写各种if条件组合的逻辑判断时会有多酸爽。

01 想清楚再动手

我经常跟团队的人强调慢动手脑先行,可惜能领悟到精髓的人真心不多,其余的通常会以项目进度为由,将“先码起来”列为第一要务,殊不知灾难就是这么悄然来临。

书法看筋骨,代码亦如此。

代码的“筋骨”无非就是分层、结构、逻辑、抽象、封装、模式…曾经大行其道逢人必谈,到现在感觉都没什么人提起了的GoF 23种设计模式,其实就提供了23种“筋骨”范例,大家依葫芦画瓢就行。

代码没有编译成机器码之前,都是给人读的。业界戏称的衡量代码好坏的指标就是“阅读该代码时说脏话的次数”,我们骂的通常就是代码“筋骨”。

要“想清楚”就是想办法练好“筋骨”。TDD测试驱动模型的话,考虑应该怎么设计逻辑控制?DDD领域建模的话,考虑应该怎么建立领域实体?BDD老板驱动的话,考虑迅速翻翻老板以前写过的代码、说过的话、下过的KPI,当然这是玩笑。

曾有多少次,我们怀着一颗要求完美的心,骂着前人写的狗屎一样的旧代码,不得不妥协着项目压力,不断降低着那条曾经的标准,敲出自我放逐的同样狗屎一样的新代码,附上那句可能永远无法兑现的“以后重构”的承诺,最终进入一个不断偿还他人和自己技术债的死循环里…

DàYé啰嗦

经典的《Java编程规范》里开篇总则里的“第一次就做对”,听起来轻飘飘的一句话,背后深意满满。带脑子有思考的编码,想第一次能做对都不是那么容易,别说没动脑的了。这里罗列一些身边实际发生过的错误行为模式,供君一品:

# “初期没多少数据量的,我循环着一条一条Insert没什么问题,等哪天数据量大了,我再考虑批量插入吧!” 请问批量插入很难么?还需要以后?

# “这个代码是我从另一个项目里拷贝过来的,他那边运行的一直没有什么问题。” 然后某一天出现了内存泄漏,因为两个项目的流量完全不对等,不求甚解不动脑,搬砖型码农这里体现的淋漓尽致。

# “为了测试环境方便联调,易于排障,我每个关键点都打印了Info日志。” 实际上打印的都是无脑的不携带任何参数线索的trans begin/trans end类日志,在分布式日志平台里看到的各种无法上下串联的孤岛日志,我常常边心疼着磁盘存储和索引计算成本,边碎碎念着这些系统真的可以做好线上运维排障么?

# “某些逻辑点我hardcode了一些代码,用来触发某些特殊逻辑分支方便测试,等上线的时候这些我都会删掉。” 等真的上线了,这些hardcode被带上去的不在少数。

# “系统有兜底的全局异常拦截器,就算有些异常没catch, 最终也会被拦截器包装成标准报文返给前端的,所以有些类似空指针异常我就无视掉了。” 结果就是APP用户不胜其烦的看到各种“系统未知异常”的弹窗。

# “Service层就是简单的数据库CRUD,Business层这么多业务逻辑,保证数据一致那就让事务的边界扩大一些,直接把事务管理放到Business层不就完事了。” 结果就是事务里面包裹了各种耗时数据IO、逻辑计算甚至更耗时的RPC调用,导致事务整个被拉长,资源被锁住的时间也加长,最后就是各种阻塞直至雪崩。

02 动手能力

东北大兄弟说:能动手就别BB。

程序员的基本工作除了前面说的动脑,紧接着就是动手了。这里需要做一下澄清:基础的编码仅仅是动手能力的一部分,而真正的动手能力远不仅于此。

身为一个程序员,可以搭建一个完整的网站,可以开发一个桌面效率工具,可以编写一个Excel的VBA脚本,可以根据官方文档部署和定制开源系统,可以根据API实现自动化偷懒…

以上才是我想说的动手能力。

大家都知道人和动物的区别是“使用工具”,而程序员群体是更加需要善用工具、甚至创造工具的一类人。当然不要本末倒置,使用工具不是目的只是手段,是为了提高效率、保证质量、降低成本等的手段。

那么最牛逼的工具是什么唻?

Quora有个回复很带感:“A web browser, with Google as its default opening page.” 一个默认打开首页是Google的浏览器。

隐晦的表达了我们程序员很多时候是面向搜索引擎编程的尴尬…

程序员应该跪谢这位大神,Larry Tesler, 就是他发明了Copy&Paste。

这是如此伟大的一项发明,如此的基础和常用,以至于大家好像都忽视了它的巨大能量。

DàYé啰嗦

# “代码的搬运(Copy&Paste)”绝对不是动手能力,“搜索”却是。因为优秀的程序员必然善用搜索引擎、具备良好的搜索技能。

参见我之前的一篇推文《技术人如何高效搜索

# 承认Copy&Paste是个伟大的发明,但是我还是建议能不用就不用,能手敲就手敲,除非是严重影响工作效率不得不C&P。历史上由复制黏贴引起的BUG还小么?

# 熟练IDE、操作系统、常用软件的一些快捷键。不使用快捷键,就和手机不用手势一样。先不说了,WIN+L锁屏,泡个程序员红茶去。

03 提问的艺术

image

程序员骨子里的孤傲时常会把自己定位成一个问题终结者,提问题似乎与此格格不入。我到现在都没太想明白这种孤傲源自于哪里,也可能是知识工作者特有的清高。其实吧,大家日不离手的搜索引擎,不就是一种另类的提问么?

卜学良 子曰

亮子的中心思想是个Why,Why的表现是,搞不懂就问人,搞得懂就答人,没有人懂还可以问神…要懂得推理要心存怀疑,要充满好奇要巨细靡遗,要打破砂锅问到底。

Come on everybody!

全套流程建议的第一步是先把自己的问题明确化,并耗费一定的精力去研究琢磨,直到卡滞;第二步是不耻上问/不耻下问, 敢于开口去提问,不要怕丢人,面子相对于知识不值一提;第三步将自己的问题、自己研究的发现等等一并列出,给解答者一个完整的上下文和尽可能多的线索,以节省双方的大量时间;第四步,不管最终是否解决,可以基于解答者给出的方案或者方向,自己在想其他办法去深挖,补齐自己的只是短板。That’s it.

心理专家亚瑟·阿伦有个著名的让陌生人快速熟悉的“36问”,就是好问题的模板,节选几个:

1、如果可以跟世上任何人共进晚餐,你会选择谁?
2、你会想出名吗?以什么样方式出名呢?
3、在打一通电话之前,你会先排演要在电话中说什么吗?为什么?
4、你心中最完美的一天是做哪些事呢?
5、你上一次唱歌给自己听是什么时候?上一次唱给别人听又是何时?
12、如果你明早一觉醒来发现自己获得了某种能力,你希望是什么能力?
30、你上一次在别人面前哭是什么时候?上一次自己哭是什么时候?
36、 说一个个人问题并询问对方的处理意见,让对方向你反馈,你对这个问题所表现出的态度。

DàYé啰嗦

以下的反面教材大家耳熟能详:

# 以他的能力和水平完全可以帮我解答这个问题,为什么他不肯帮我?

帮你是情分,不帮是本分,没有什么理所应当。程序员群体大部分时候是和谐互助的,当然前提是你的问题问到点上、足够清楚、有挑战、礼数到位或者红包打头阵,否则参见下面的细分场景。

# “大神救命啊,我用这个框架老是启动不起来。我可是严格按照手册一步一步来的!”

然后就没有然后了。你的详细线索呢,你怎么排障的呢,你有初步的怀疑对象么?这种卖惨式发问只会给人一种感觉:你自己压根没分析过!我的时间可不是浪费来解决你分内事情的。

#“字符集是UTF8的Mysql5可以存储emoji表情么?”

这种简单的问题要不自己去试,要不去搜,顺便把这块相关的知识点都去阅读一下。你指望某个人给你个答复的同时,还能把整个知识点给你解释一番?

# 劈头盖脸的一堆问题怼出来,没有停顿、没有组织、没有循序渐进。

散弹枪式的发问极容易引起他人的反感,因为你把别人当成了答题人,而不是有来有往的虚心求教。适度且有节奏的发问才是王道。

# 发问前礼貌性的确认对方是否有时间帮忙,发问后不管是否解决都要表示感谢,礼数一定要到位。不要整成一次性买卖,毕竟因为一次不礼貌导致未来可能再难得到帮助,得不偿失。

# 有些人眼花缭乱的问题描述完全不在点子上,解答人若善于引导和抽丝剥茧,能从源头上帮忙解决,若只是纯粹的一问一答,那答案可能压根帮不上忙,因为问题本身的方向就错了。这种体现逻辑洞察能力或者沟通能力,下面会提到,要做到“直抒胸臆”不简单。类似的场景在程序员和产品经理之间也时常发生,聊的牛头不对马嘴,双方都找不到中间的那个契合点,冲突也就难免。

04 逻辑推理

image

程序员日常编码80%的工作除了想变量的命名,就是在写逻辑分支。而日常非编码80%的工作就是理解需求或设计架构,都需较要强的逻辑思维。

先玩个游戏:估算下中国有多少程序员(不严格定义边界)?

https://octoverse.github.com

基于GitHub的2018年度数据报告,目前一共3100万注册用户,20%美国本土用户,中国是仅次于美国的GitHub大户,打个八折,算出中国注册用户500万(无视不同程度的水分)。

https://www.idc.com/getdoc.jsp?containerId=US44363318

再按照IDC估算的全世界2200万左右软件工程师,按比例折算下中国码农群体 500万/1.4≈350万。

本人宣称对中国码农群体350万这个虚数负责到2019年年底。

参考链接:
世界人口(77亿):https://www.worldometers.info/cn/
中国人数(13亿,就业人数7.7亿):
https://www.ceicdata.com/zh-hans/country/china

以上是个典型的考察逻辑推理能力的小例子。《超级思维》这本书里面有更多奇奇怪怪的逻辑题目,都是让你感觉无从下手的。

其实,在拿到一个即使简单如APP登录的需求时,作为知识工作者的程序员就也需要展现出自身强大的逻辑推演能力,抽丝剥茧,将需求抽象为领域模型或者转化为系统设计。这方面有大量的方法论,比如奥卡姆剃刀,比如WBS,都不重要。重要的是你一定要沉心静气,不能是闷头苍蝇似的一通乱撞。要找到最适合自己、最适用当下的那个方法。是砍掉枝叶先看主干,还是抽丝剥茧层层拆解,都是逻辑推理的一种体现罢了。

DàYé啰嗦

APP登录过程究竟发生了什么,或者应该发生什么,是我面试时经常用来考察一个人逻辑思维能力的题目。除了是人都知道的用户名密码校验还有什么呢?

# 用户名的长度区间是什么?

# 用户名支持的字符集是什么?存储会乱码么?

# 密码的长度区间是什么?字符组合是什么?

# 密码的加密方式是什么?如何确保传输通道不会被中间人劫持?

# 用户名/密码是否含有非法字符(代码注入)、政治敏感、低俗不雅的文字?

# 密码最多可以输错多少次?超过后账户禁用多久?

# 是否支持用户多终端登陆?如果支持的话,账户在A终端被禁用后,在B终端的已登入态是否被踢出?

# 用户在终端的登录有效时长如何考虑的?

# 登录的错误提示有很多种,用户名不存在、密码错误、账户禁用,还有哪些?

还有很多没展开,如手机号/邮箱绑定,短信/邮件验证码验证,常用设备管理等等,可以继续推演下去,但是如果能在面试的压力环境下,有条不紊的罗列出用户名、密码、安全、状态、话术、用户体验面等等这些维度上的思考,那基本上没毛病。真实情况是不少人在这些维度上跳来跳去,没有条理性、延续性,想到哪儿是哪儿,只能说明逻辑推理上有所欠缺。

05 时间规划, 要事优先

我们身边不乏这种人:每日忙忙活活,勤勤恳恳,乐于助人,看起来是公司里最敬业爱岗的那个。实情却是大量任务一旦堆积到他手里就失去了进度,甚至因为同时赶很多任务,导致高优先级任务的质量不达标。这类人的典型问题就是做不好时间规划,分不清轻重缓急。

爱因斯坦老头的相对论告诉我们,时间是相对的。同样的每天8小时,有序、有效和高效的使用了这8小时的产出,可以比无序、无效和低效的产出高出2倍不止。核心点是什么呢?

DàYé啰嗦

# 让时间的无效流逝产生罪恶感

理解前先举个栗子。小时候暑假的前半段基本都是瞎玩,最后一周疯狂的写作业,连吃饭都觉得在浪费时间,如果吃饭的时候还在看电视,那时的罪恶感爆棚,时刻觉得我的作业还在等着我…所以明白了么,产生罪恶感的前提是我的任务是有优先级的,加上自己的责任感,一旦高优先级任务阻滞了,而我还在浪费时间在某个无意义的事务上,就会及时叫醒自己,阻止自己的继续浪费。

# 好记性不如烂笔头

曾几何时公司里的笔记本还是用来记事的,现在好像成了用来涂鸦的了。一般开会我都会要求大家都带笔记本,无他,我就是不信你的脑子记得住会议上的所有要点或者决议;而日常项目中有些重要的事项或者节点也都应该记录下来,项目上线前翻一翻确认自己没有遗漏;等等。当然上面说的这些你可能有其他的工具来实现,殊途同归罢了。

# 请学会拒绝

烂好人这种事情在职场基本是行不通的。因为你好,你的事情就会多而杂;因为你好,你的事情就都是高优先级;因为你好,流程规范就容易违反;因为你好,时间一长就成了理所当然,这事将永远粘着你;因为你好,任务积压到你手里,任务最终延期交付,你得背锅;因为你好,你就再也拒绝不了别人了,因为“雷锋”是不会也不该拒绝他人,会一直被道德绑架在十字架上。

06 心向自由, 遵纪守法

人是生而自由的,却无往不在枷锁之中。

– 卢梭 《社会契约论》

人生而自由,清高的程序员更加的心向自由。不喜欢西装革履,不喜欢一板一眼,不喜欢上班打卡,不喜欢规章制度…

每家公司都制定了各种各样的制度、规范、流程,这些东西经常被视为洪水猛兽,枷锁镣铐。只有不成熟的人才会把自由放在嘴边,成熟的人怎么会不知道

自由是要付出代价的!

  • 上班时间是自由弹性的,结果可能是开敏捷站会的时候少一个人更新进度,因为你没来,这个代价谁来支付?

  • 生产上线可以随意发挥,上挂了再上一次呗。如果一个面向C端用户的产品,你确定要让用户承担无法使用、公司承担损失用户的代价么?

  • 数据权限是自由的,这样查数据方便多了,谁来承担数据被导出打包卖的代价?

  • 开发私接需求,不走那套评审、设计和进入迭代的繁琐流程,测试不知道这块的回归内容,上线后出问题才发现,这个代价谁承担?

选择了自由,必须承担代价,也同时选择了责任。没有责任的自由只是小孩子过家家。所以在感觉自已被约束了之前,先扪心自问,自己是否有能力消解跳出框架的风险,是否有担当承担自由之后的代价。

07 羞耻心

image

有羞耻心的程序员才有资格清高,因为羞耻心是你的底气。一个成天写一堆低级bug毫无羞耻的程序员凭什么清高?自己首先会耻于不完美,做到无可挑剔,当然可以清高。

剖开羞耻的表层,本质其实是程序员对于自身的高要求。程序员对自己没有要求,和咸鱼有什么分别。这里还没要求程序员主动去提升自己这个层面,就是靠错误的羞耻感驱动自己提升这一层,很多人做的都不够好。出现BUG无所谓,上线失败问题不大,这是自我放逐到了如何野蛮的地步了?

DàYé啰嗦

现在的互联网应用相对企业应用,可以更快更轻更容错,给年轻人一种错觉好像出点错没什么大不了的,也导致现在的年轻程序员对于BUG, 对于生产环境没有太多的敬畏心

而从做企业应用那个年代出来的程序员,对于这些都是谨小慎微,一点点小错都了不得,感觉要死了,这或多或少与不同时代的程序员文化有关。

# 只要是BUG就是丢人的,不是拿来自黑和一笑而过的。

# 代码被评审出一堆意见来是丢人的,重复犯错更丢人。

# 系统上线漏了个配置是丢人的,就算你前面的开发测试再完美,最后临门一脚没做好,前功尽弃不羞耻?

# 系统上线后的问题都是客户报障的,自己的监控不到位,告警处理不到位,永远是落后客户一步,自己的系统自己HOLD不住,羞耻么?

# DaYe自己对于有些异常如NPE、越界、类型转换,一旦抛出来会觉得特别羞耻,会捶胸顿足为何写这部分代码的时候没有考虑清楚。你会么?

08 同理心

image

同理心Empathy,简单来说就是换位思考,懂得倾听,设身处地的共情共感。也是情商EQ理论里的专有名词。我觉得程序员在同理心方面做的奇差,也是程序员画像“智商高情商低”的口实之一。

程序员思维特别擅长把任何交流转换成技术语言来表述,程序员说的口沫横飞,其他人一脸懵逼。不会说“人”话这一点,一直是程序员的硬伤,缘由大概是大部分时间跟电脑打交道,导致的达尔文式退化吧。

程序员会说“人”话,境界必然升华。因为你若能把程序思维包装成一种非技术人也能听懂的语言,说明你已经脱离了程序员固有的思维框架,可以对等的用对方的语言来直接交流。就像我们在英语对话中,过程是对方的英语通过耳朵进入脑中,先转换成中文,然后想好中文的回答,再翻译成英文,最后用嘴说出来。都知道这是不对的,但碍于英文水平渣渣,臣妾确实办不到屏蔽中文切换环节,直接英文输入输出这种最优秀的交流方式。

当程序员开始用技术来碾压或者嘲笑对方的无知,这时候的交流一定会出现争执和冲突。要求我们立马停顿且站在对方的立场想事情,确实有点强人所难,但是我们可以从一个第三方不相干的人的立场来看这次交流,尽量保证客观,可能会发现另一种思路。

特别程序员在面对BUG和线上故障时的第一反应,通常也不是站在对方立场,而是下意识的抗拒。前线一线商务人员密切关心故障进度,一定会时不时的催促,而程序员思维这时经常会丢出来的一句话是“在处理呢,别催”,如果站在对方的角度来表述“我们已经找到问题的症结了,还需要大约一刻钟的时间,走个紧急审批流程,已在着手修复了,请再耐心等待一下”,将我们的努力过程表达出来,再给一个可期的未来时点,会好一些么?

09 近距离榜样的力量

有人说“我的偶像是Linus Benedict Torvalds”,这个事情对你当前的职场可能并无太多益处。因为Linus人家底子硬,可以怼天怼地怼上帝,而大部分愚钝的我们还差得远…

所以我标题里的重点是“近距离”和“榜样”。也就是在你当前职场环境下,离你最近的最容易效仿和咨询的那个榜样型人才,才是你需要当下尽全力追逐的。

比如自己的代码在最近几次评审里老是被提出很多评审意见,傻的程序员没感觉怎么样,每次提多少改多少,下次可能还犯;聪明的程序员会每次做好总结,保证下次不会再犯;而智慧的程序员,会直接找评审人聊聊他心目中的好代码的标准,找公司的代码规范checklist,翻阅有优秀编程能力同事的代码,反复的学习和实践,主动推动自己往下一个Level演进。

不管是技术、业务、产品还是管理,除非你一骑绝尘,公司范围内在你视野里已经Nobody了,否则每个维度都会有自己可以对标的对象,务必虚心求教,刻苦训练。

我不知道程序员是不是很容易看不上公司内部的一些分享课程,经常因故缺席。然而在收集想听什么课程的时候,又说分享少,最好请外面的一些大神来讲讲课啥的。我一直断言,有这种想法的程序员就不是为了知识,而只是为了有个接触所谓大神的机会,甚至最后能加个好友就有吹嘘资本了。且不说有些所谓的大神很水,就是真正的大神讲的那些干货,你先确定自己能接得住么?根基不稳、眼高手低,所以别怪DaYe啰嗦,先找近前看得见摸得着的对象,试试超过他看看?

10.24 拥抱开源

现而今很多国际顶级的开源技术都是国人搞出来的,不仅让世界看到了国人的技术能力,也让国内的信息化水平有了质的飞越。

开源这个大宝藏用不好,就是可耻的浪费。我经常提醒团队在造轮子之前可以先去开源社区,找找灵感找找思路,千万别一头扎进去,写出来一个残次品没人愿意用。

反过来,开源对于程序员还是比较神圣的一种认可,所以我也会推动团队做一些开源方向的努力。当团队在开发一个内部系统,被安上一个开源的KPI之后,大家的专注力和自我要求都会加强N个档位,毕竟谁也不想开源一个让人嗤之以鼻的软件,执行力、羞耻心和荣誉感会无限爆棚。

以上,是我心目中程序员安身立命的几条黄金法则。有人可能会说,扯了那么多,竟没提程序员的基本功,其实基本功就藏在这10.24条里了,自己去发现吧。

THE END

DàYé首席路 | 模仿之道

image

笔者曲健,1024生人,天选程序员,浆糊人送外号“大爷Dà Yé”,目前在奥琪科技担任首席架构师一职。

二零一八留不住,朱颜辞镜花辞树。

鄙人平素喜偶厌奇,以致现在对2019仍避之不及、兴致索然,更羞愧的是原本想对2018之前人生做的总结也憋到现在…

人这一生,有人从上半场甚至一开场已策马扬鞭绝尘而去,而有人混沌半生却依然摸索不到那道门。不才无甚特长唯虚活三十余载,终究有些人生阅历(通俗点叫失败经验)可与君分享一二。今儿咱们就说道说道“模仿”这件事。

# 谨”守”模仿天性

模仿是人类默认出厂设定能力之一,生而为人,始于“模仿”。父母的语言语态、行为举止都会成为孩子的模仿对象。孩童会因模仿到大人的一招半式而洋洋自得,成人却因“行与他人雷同之事”顿感不自在甚至羞耻,根源上还是把模仿对标成了另一个概念:

山寨!

山寨更多的是一种抄袭甚至剽窃,与作为有效学习手段的模仿不可同日而语。

这段充满刚正之气的名言论述是讲课用的。实情却是,模仿的第一步往往就靠无脑复制,严重点说就是抄袭。

如同没人会说孩童“山寨”成人,毕竟如此就有降维打击的嫌疑。在成人的世界里,很少有人会承认自己在低维空间,本就同维,我模仿你岂不掉价?更可悲的是一旦开始模仿,就很难不被人扣上山寨的帽子。

日货曾几何时是“质量过硬”产品的代名词,殊不知日本就是抄袭鼻祖。始自隋唐时代,日本已经开始大面积抄袭中国文化,一如茶道、剑道、花道等日本八道都是汲取中国文化后形成的自己特有的道,这些大家基本都知道的且抛开不谈。就说近代,二战后的日本经济萧条,百废待兴,为了重振经济,山寨成了日本选择的一条捷径。巧克力、漫画、家电、相机以及汽车等等,日本全部山寨过。而日货有如今的地位,与其后续一系列的改革创新、科技教育等手段是分不开的。

有兴趣可以搜索一下日本CopyCat视频,看完你会发现国内的那些极品山寨康帅博、大个核桃、农民山泉、粤利粤…大家山寨水平都不过尔尔。

image

而德国曾经也好不到哪去。1887年,德国制造”Made in Germany”耻辱性的进入了英国的商标法条款,被英国人用来区分“英国制造”的优品和”德国制造”的劣品。那时候的德国也是各种仿制和山寨,不过也仅仅过去十几年,德国人就把”德国制造”这顶代表耻辱的帽子摇身变成了金字招牌的代名词至今。您看,随便掀个底儿,抄袭黑历史俯拾皆是,谁也就别笑话谁了。

DàYé自述:

职业生涯冷启动菜鸟期通常会伴随着各种不期而遇的迷茫。当你这也不会那也不会,这也想学那也想学的时候,迷茫、无助或者焦虑就随之而来。还好黑夜给了我黑色的眼睛,我踏踏实实的用来找寻光明。

最开始使用VB6、PROC 编码的我,鬼使神差的选择了JAVA高手、TOP ? 程序员作为模仿对象(当时的我执着地确信Web应用才是未来趋势,也真是眼光毒辣*),列举如下,不一而足:

特别说明:下述文字只是对本人当时的模仿行为进行陈述,并不代表它们是正确的,请自行甄别。

$ 编程风格:学习并效仿高手的代码风格。我的代码洁癖就是这段时间养成的,见不得格式乱、忍不了没灵魂。没有注释没有异常处理没有日志没有”断句”一口气写几百上千行的代码,注定是没有灵魂的流水账;

$ 工欲善其事必先利其器:NetBeans/ JBuilder/ Eclipse/ MyEclipse之间的各种IDE鄙视(那时候还没有Intellij IDEA啥事),高手用什么自己就用什么,无须纠结高手纠结过的;

$ 理论知识:购买并阅读高手推崇的一切好书,虽然很多没啃完,但是读书绝对可以加速知识体系的构建进程。现在很多IT培训机构流水线上组装的“速成”产品,就特别容易出现知识残缺、根基不稳,陷入盲目/机械/重复劳动的泥潭,却以为这就是常态的码农形态;

$ 热点趋势:RSS(上古神器之一)订阅高手推荐的各类源站:技术热点/大神博客/业界资讯…学习成长路绝对不能闷头行进,必须学会抬头看路认清大势;

$ 动手能力:身为程序员不会搭建网站,不会做GUI小应用,不会 Excel 公式,不会搜索,不会 番羽 土啬 … 比小姐姐让你拆机箱擦个灰都不会还要恶劣。 现在很多程序员应该没见识过以前的企业应用本地环境的搭建、启动、部署和测试,那叫一个繁琐(现在对IBM WebSphere的那套产品仍旧心有余悸),曾经有些人从入职到离职都不知道这一套环境怎么运作的,安心做一名”流水线工人”。

$ 程序员的高傲:提交的代码被任何人读起来都应该是优雅的;交付给测试的功能点一定是自己反复验证过的,出现低级BUG丢不起那人;敬畏生产环境,上线脚本/配置/变量/步骤/困难全都罗列的一清二楚,上线失败如同过掉门将面对空门将球打飞,可笑又可耻。

$ 装逼套路:能用命令行绝不用图形界面,能用快捷键绝不用鼠标,IDE必须黑色主题,桌面墙纸必须个性,案头必备一本英文原版书(就算垫显示器),必须**盲敲数字键**(别笑,我不认为现在程序员有多少可以做得到或者做得6)

image

Google -> Creative Desktop Wallpapers

题图:浏览器选项里没有IE, So Chrome Or FireFox?

总之,在编程起步的这段模仿路上,从例行工作到三余读书,从照搬仿效到习惯养成,从实际行为(形)到思想境界(神),其实你会发现这模仿本身也是个成长的过程,只是这路不是你自己摸索的而是踩着前人的脚印。您再看,这个过程缘何我模仿的自得其乐?因为我把自己视作孩童,放低身段,**自降一维,**只求成长。

好的模仿必须找到对的对象

通常大部分人选择的模仿对象通常无非是自己的偶像、长辈、老师或者业界权威、KOL等等。有些模仿并不一定具有特别明确的目的性,就像有多少人因为乔丹篮球之神,23成为了自己的幸运号码。除此之外的大部分模仿一定带有某些目的性,所以一旦选错模仿对象,为此承担的成本可能会无比巨大。靠谱的“选择模仿对象”的过程应该是这样的:模仿者有能力对自身的基础优劣指标有基本的认知,知晓被模仿者的哪些特质、行为或能力是无害的、有益的、榜样的和相当一段时间内自己想要努力追逐的,双方综合评估后可得Yes Or No。

榜样 VS 偶像
就模仿而言,我希望是榜样的力量,而不是偶像的力量,这两者有本质区别。榜样是你还没达到但是想成为的人(或人的某种特质),偶像是你想接近但是不想成为的人。马云说过类似的话,”我没有偶像只有榜样”。大家可以品一品其中意味。

爱因斯坦有个经典的“司机”的故事,说爱因斯坦的司机长期陪着他各地演讲,听多了也就倒背如流了,就像灵山上听佛祖讲道瞬间成精的妖怪似的,自告奋勇申请代爱因斯坦去讲一堂课,结果这哥们确实滔滔不绝、有模有样的演讲完全程。最后不巧有个听众问了一个深入的相对论问题,这司机当然答不出来,却还算机敏地一指坐在后排的爱因斯坦说“这个问题很简单,我的司机就可以回答”。这个例子就是典型的对自身、对模仿对象都评估不足,对大部分的我们来说,爱因斯坦都绝对算不上一个对的模仿对象,因为我们穷究几辈子可能也踩不上他老人家几十年前走过的路…

模仿是个刻意练习的过程

刻意练习、一万小时定律我们都耳熟能详。写代码的手感和语感有时就是冥冥之中方可得,没有大量的实战,寄希望于看个视频读个文章就掌握,这种虚妄犹如似近实远的高山,看似咫尺实则天涯。

你还记得第一个 Hello World 带来的那种芥末味直冲脑门的欣喜么?然而写一万个小时的Hello World并不会让你有什么进步,刻意练习不是刻意重复,你必须从大量枯燥无趣的“有效”练习中寻求成长,其中的寂寞可以击退众多求进之人。

总结一下,住模仿这个人类本能,无须刻意割裂,在没有找到属于自己的路之前,模仿绝对是条不错的捷径。而标题中的“谨”字就是表达谨慎选择模仿对象之意,选对了就是成功捷径,选错了可能就是不归路。进入赛道就必须让自己跑起来并持续坚持。

# “破”除复制牢笼

如果把上阶段的“守”比喻成机械复制、没有自我的“无我”蛮荒过程,那么“破”就是要找到“自我”的文明养成过程:养成技巧、养成思考、养成创新以及养成习惯等。除此之外,这个阶段也要找出三个经典人生哲学的答案:

  • 我是谁? – 自我认知

  • 我在哪儿? – 自我定位

  • 我要去哪儿? – 目标规划

image

自我认知Self Awareness

自我认知指的是对自己的洞察和理解,包括自我观察和自我评价。好的自我认知,能清楚勾画出自己的性格、优点、弱点、潜能、思想、情绪和动机;做不到就容易成为别人口中的没有自知之明之人,而有些人终其一生确也无法认清自己。

自我认知会随着个人的阅历、思想、环境等不断变化,所以不是要求大家即可就看懂自己(当然也不可能),而是要掌握这项技能,让自己不断从中受益,所谓吾日三省吾身即是此意。自我认知严重影响着个人的成长、处事方式、情绪管理,比如: 看不到自己的优点就容易自卑,进而做事畏手畏脚;高估自己就容易傲慢,无法听取别人的意见而独断专行;内向型更适合主攻技术性事务,外向型更适合业务性事务,如此等等。

业界有不少可以对个人进行性格测试的方法论,也是一种自我认知的途径(不过更多的场景是Leader对团队,企业对员工的测试)。比如MBTI职业性格测试,9型/16型人格测试,DISC性格测试,NASA 4D人格测试

自我定位Self Positioning

自我定位相对于自我认知来说,多了一个锚定物。此锚可以是自身或者他人的技能、薪资、岗位、职级、性格甚至背景,以此来分析定位自己所处的位置,是初级能力还是高级能力,是业务开发还是架构开发,是不善言辞还是能说会道…

自我定位和自我认知可视作基本相似的评估行为,只是认知是相对抽象的评估,而定位需要给出相对具体的位置线。

目标规划Goal Planning

在没有认清自我的前提下设定的任何目标都是无源之水无本之木,那么目标一定是因人而异的。那么问题来了,现而今知识共享、知识付费的时代,知识可以是听来的、看来的,大家表面看起来都很上进,购买各种课程学习,目标都是成为懂业务、懂技术、懂产品、懂管理、懂投资的共产主义社会全方位发展的全能型人才,只是,这种快餐路径拿来的知识真的被你吸收了么?你应该持一下怀疑态度…另外,这种“形而上学”得到的知识我把它定义为“口腹知识”,就是只能用在聊天打屁时口若悬河滔滔不绝,落地实施时除了懵逼还是懵逼。区别于经过咀嚼消化后被充分吸收的“心脑知识”。

回归本文主题,要在模仿学习中找寻自我,必须思考、挑战、辨别、领悟,直到知识技能融入己身,为我所用。

DàYé自述:

当意识到初期的机械式模仿最多也就是把自己变成别人影子的那一刻,我开始思考如何逃离机械式模仿带来的快感舒适区。因为盲目效仿实在不需要付出额外的心力,只须跟紧步伐,不费吹灰之力就可以逼近甚至赶超模仿对象,多可怕的错觉。

为了跳出行为和思维的双盲区,我是如此行之:

$ 个人标签:所有的模仿行为通过思考改进,形成个人风格,打上个人标签。简单如大家都写的注释,我一定是把时间、作者和备注说明用特殊符号拼接的行列分明、整整齐齐、强迫症般的赏心悦目,并没有为此多耗费什么时间却得到了不同的代码阅读体验和个人风格;同样是用IDE, 记住绝大部分的快捷键,引入更高效的插件,能高效辅助你达成目的的手段才能称其为工具,否则只能算作器具

$ 知其然知其所以然:获得一项技能其实没什么了不起,闻道有先后罢了。技能是否真正掌握的评判标准很简单:可以把这项技能轻松传授给别人。别以为这个标准很简单。可以举重若轻把知识讲出来的人,绝对是吃透了背后原理机制的;反之当一个人讲的东西不够深刻浮于表面甚至闪烁其词,那他一定自己都是半吊子。

//等式判断时,先写常量,再写变量的写法很常见。
//到底有何好处呢?还是zhuangbility而已?
if ( 100 == score ) {
    return "一等奖学金";
}

$ 思想边界:或理解为视野局限,一个人是无法想象甚至理解思想边界之外的世界的,这与努力程度无关。当日常工作的80%都是常态脑消耗(重复劳动),不需要启动全部脑力来思索创新,释放的信号就是你的思想边界将要停止延伸。所谓眼界决定一个人生的高度,而我的高度就是从脱离国企陈旧的体系和氛围,拥抱外企的自由开放文化开始的。

以防有人断章取义,需要解释下。我可没有表达外企就一定比国企高。不管国企到外企,还是外企到国企,都是边界的延伸。实际上,我那个年代,软件业的外企确实比国企整体上要正规和先进不少…

当时的外企对我来说就是最大的变化和可操作的最远边界,语言、文化、管理、种族、趋势、认证、体系等等对我来说都是新鲜的也是极具挑战的。面试外企前一年我是一直跟一位美国退休教师老大爷学口语的,入职第一个月仍旧是听的磕巴说的哑巴。幸好我的任务都有书面化的工作清单(请不要怀疑我的英语书面考试能力…考试,我是优秀的),第一个月我完全没怎么说话交流,就纯闷头写代码交任务,因为质量好效率高得了当月的部门优秀…我特么第一次知道纯粹的代码能力也可以被如此重视,擅长什么就尽力安排你做什么,发挥出你最大的价值,那感觉太美妙了。

接下来我从外企回归到体制内就是另一个故事了。大比例的企业应用相比互联网应用,有太多的死板和陈旧,初衷是BAT一类的互联网公司,后来因缘际会得朋友推荐,加入了招行的掌上生活团队,对互联网的技术、业务和产品的玩法才真正有了完整的认识。

你看,我的从国企到外企再到国企,从企业应用到互联网应用,从程序员到架构师,我在不断拓展自己思想和视野的外延。促使我跳出框框的一个重要因素开始是薪水,后来发现是成长性和反脆弱性让我不断的做出转变。

$ 反脆弱性:有一本叫做《反脆弱》(也是黑天鹅一书的作者)的书推荐给大家,里面的观点很是值得玩味。比如公务员相比出租车司机就是脆弱的,考虑公务员40岁失业,和司机40岁面对再就业时截然不同的处境。脆弱的反面不是坚韧,而是反脆弱。一个鸡蛋掉到地上,会碎,鸡蛋在这里是脆弱的;一个纸团掉到地上,不会破,纸团在这里只是坚韧的;一个乒乓球掉到地上,不仅不会碎还可以反弹起来,这个乒乓球就是有反脆弱性。让变化和波动成为促生蜕变的动因,附上此书的一段简介:

《反脆弱》
杀不死我的,使我更强大。
既然黑天鹅事件无法避免,
那就想办法从中获取最大利益。
每一件事情都会从波动得到利益或承受损失。
脆弱是指因为波动和不确定而承受损失。
反脆弱则是让自己避免这些损失,甚至因此获利。

$ 不耻下问:所谓闻道有先后,在一个新的领域实行模仿学习的时候,模仿对象很可能比你小。这种时候一定要放下心里包袱,不能自卑轻易否定自己,更不能自大不屑于模仿求学。刚入掌上生活团队时,对于互联网应用的技术、组件、开源等了解并不全面,而同期入职的比我小的同事,却玩的贼溜,甚至在意识形态上我都感觉落后一个时代。此人江湖号称万真人,因为当时真有点高山仰止之感,让我想到了武学宗师张三丰,我给起的这个绰号深得大家认同也就很快传开了。最终幸好本人的反脆弱性还算强大,持续恶补、持续模仿学习,不然真差点整自闭了。

总结一下,我“思”故我在,第二阶段就是破开框框,找到那个“真我”。

# “离”开一招一式

《倚天屠龙记》截图

上图是张三丰教张无忌太极拳招式后的一句话:
你忘记所有招式,就可以练成太极拳了。”

术和道的纷争软文已然烂大街,简单来说,术谓之技术,道即为道理。我们在长期的学习过程中,获得了大量“术”级别的能力,悟出的“道”却屈指可数。若我们花费大量的时间在技术的纯熟上,而没有沉淀下来领悟内在的运作机制和底层原理,这样是基本没可能练成太极拳的。

从无我到自我,进化成最终的忘我。忘我是一种态度,忘掉给自己带来虚妄成就感的“术”,进入悟“道”的超然境界。雄鹰经受击喙换羽之痛获得重生,即便它早以遨游九天为乐;王阳明格竹龙场悟道创立心学,直逼万物本源,即使之前他早已文武双全;诚然我们无法与圣人相提并论,但仿效其成圣之路,总有可达之处。

image

DàYé自述:

本人目前也在各种悟的过程中,混混沌沌间也无法给出具体的指导意见。要升级为高级别人才,勇于放下“固有成就”的包袱,补齐各维短板,潜心修习方可。说起来简单,悟起来真的不容易。

$ 以结果为导向: 这是很多管理者挂在嘴边的一句话,但是执行者却甚少有理解到精髓的。

譬如

代码异常处都知道要打印日志,除了基本的堆栈信息,业务线索数据也应该打印出来。评审的代码中大家是否经常可见下面示例的第一种写法。道理很简单,结果导向,你打印日志到底为了什么,是为了你单机调试用,还是为了多节点生产排障用?

logger.error("user login failed", e);
vs
logger.error("user " + userid + " login failed", e);

异步消息组件处理消费失败时,一般都有重试机制,对于重试理解的透彻程度可以部分反映你“结果导向”这个道的高度。不展开讲解就列几个问题大家自己去思索:

  • 该消息的消费处理逻辑是幂等的么?这决定是否可以重试

  • 该消息消费失败后,是否有必要重试?有些消息体若必要参数缺失,你重试一万次也不可能成功

  • 该消息消费最终失败,导致的数据不一致怎么处理?有人说在最终失败时再想办法把这个消息持久化存储在某个地方就可以了。

  • 结果导向的问题来了:持久化存储的数据,你会多久去看一次?有主动修复的机制么?如何保证时效性?

    $ 设计模式:设计模式是程序员必修的功课,从背诵到实践到领悟到灵活运行到大道至简。我曾经看到过一个不复杂的微服务系统,被设计的七零八落,这一个helper那一个resolver, 左一个decorator右一个visitor中一个factory, 第一眼看到这个系统就有想躲开的冲动。设计者觉得我能把这么多设计模式融合到一起,是多么了不起的一件事情。殊不知,设计模式就是一种方法论,在你抓耳挠腮不知道怎么组合代码的时候,给你一种思路罢了,你却用来装逼。设计模式绝对不是让你堆砌设计,更不是让你增加系统理解和维护的复杂度。我所崇尚设计的第一原则是简单易懂,能把复杂的事情简单化才叫本事,把简单的事情复杂化就是熊孩子。你想,那些伟人对世界领悟的得多么的透彻,才能将复杂的自然规律抽象为如此简单美妙的一个公式?

image

$ 管理和领导:从字面区分就很清楚,“管理”首先是个戴着竹帽子的“官”,“理”顺事情才能推动团队达成目标;“领导”则更多的是带领和指导团队,通过个人专业能力、人格魅力或者影响力来达成,不一定是权力。所以把自己定位好是管理者还是领导者,使用的方法论也不尽相同。我对自己的定位可能更多的是领导者,因为如果摒弃头衔给团队带来的权势压力,我仍能带领好团队,这才是我想要的团队氛围和协作模式。目前这块仍在悟,等沉淀到一定程度了再跟大家掰扯掰扯。

守破离

“守破离”源于禅学,兴于日本剑道,后被引入各类学科和理论工作中。模仿之道不好架空表述,遂以守破离为引直抒胸臆。本人也是从一名普通程序员一步一步的成长为管理者,其中辛酸同行之人应深有戚戚,而模仿不失为一把神锋利器,只是此招需要慎用,万不可走偏。

盼与君共成长

image

Dà Yé . Me

大爷域名绑定水一贴 ====> DàYé简书小站

  • 我就是你大爷
  • 你大爷就是我
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×