有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。
生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。
关于工作
1.积极大胆地谷歌。
你得知道如何有效地组织搜索关键字,查阅别人写的代码,然后合理地用在代码里,从而解决问题。
2.拥抱变化,坚持不懈。
老手程序员在接触新技术时,能欣然接受像个初学者一样处处受挫,并总能在完成工作的同时自学成才。
3.承认细节的重要性。
例如变量和函数的命名、CSS属性的命名、该用哈希还是用数组,以及其他看起来微不足道,但可能对项目有深远影响的事情。
4.承认大多数的“重要决定” 其实并没有那么重要。
一般的开发者经常在技术选型等“重大问题”上陷入唇枪舌战,而程序员老鸟们会避免浪费时间在骂战中。这一点上,他们就像禅宗大师一样(zen-like)。
5.选择合适的工具解决问题。
网上有无数的开源库、工具和框架,让人眼花缭乱。而老手们清楚地知道针对怎样的问题,应该用什么样的工具。
图片源自网络,仅做配文展示
6.明白代码「不值钱」(该删就删)。
你必须习惯于删掉几百行代码来重写程序的某一部分,毫不留情。
7.在评估技术的时候要全面。
例如,我一直在鼓吹Elixir。它语法优美,社区完善,有很大的潜力。但Elixir诞生的时间太短,所以如果要构建复杂的功能,可能会难以找到能帮你提高效率的开源工具。因此,在评估要不要选择使用一项技术时,你得把所有这些因素都考虑在内。
8.学会说“我不知道”。
没有比拒绝承认自己不知道更能浪费一个开发者的时间了。
9.仔细分析错误信息里的线索。
传统教育告诉我们:失败是坏事。报错信息这种东西也经常被跟失败联系起来,然而优秀程序员明白,这些错误消息里其实隐藏着能将你指向最终正确解决方案的线索。
10.了解过早优化和必要的“炫技式” 优化的区别。
老手们清楚在什么时候需要写一些看上去没那么好懂,但会让程序运行更快的代码。
11.每个人都会犯错,为自己的过失负责。
而尤其在团队里,把责任推来推去没有任何意义,因为错误的发生往往不只是一方的因素造成的。
12.成为你所用的开发工具的重度用户。
如果长期在某个开发环境下有相当比例的开发工作,那你应该去掌握使用它的细节。
13.不要接陌生技术领域的私活。
个人做自由职业项目,其中很大一部分挑战就是评估项目时间。不要规划自己未知领域的事情,那会让你处于想当尴尬的境地。
14.学会坦然接受批评。
当你的代码因为各种原因四分五裂时,你需要培养用理性和逻辑的方式来应对(而不是情绪化处理)。
15.同有更多经验的人结对编程。
没有比这个更高效的编程学习方式了。
图片源自网络,仅做配文展示
16.一定要先自己做一遍代码审查。
当你在GitHub上发起一个pullrequest 之前,先把代码当成别人写的,自己先审查一遍。
17.认识到做自由职业的难点不是写代码,而是其余的所有事情。
销售、推广、客户支持,质量保证以及产品管理,所有这些都会花费大量时间。
18.发现并解决更大的问题。
优秀的程序员不拘泥于眼前的问题,而是清楚如何用更长远的方式彻底的解决这一类问题。
19.深入了解一些大型开源项目的核心能让你开发时如虎添翼。
如果你知道如何给你的项目打猴子补丁(MonkeyPatch), 那么你将无所不能。
20.知道什么时候开始回馈。
到了某个时候你需要将你的技能和经验传授给年轻的开发人员,就像你的导师当时教授你一样。
21.能写烂代码。
有时候可以当一当“胶带式程序员”。关键是随着时间推移,你需要弄清楚什么时候可以走捷径,什么时候必须走捷径。这其实是最难掌握的技能之一。
图片源自网络,仅做配文展示
22.像一个领导者(Leader)一样做事,而不是老板(Boss)。
老板是让别人为他工作的人,领导者是人们追随的人。做个领导者。
23.在压力下学习。
你需要知道如何应对像系统宕机而你要负责将它复原的情况,即使一开始你完全没有头绪。
24.“Movefast and break things”别让完美主义阻止你做事。
错误往往是最好的学习机会。所以别把犯错当作失败,而应该把它们当作值得学习的经历,并意识到:正是不断克服和突破这些错误,作为一个程序员,你才能不断成长起来。
关于情绪
1.如果你想做自己喜欢的事、必须付出别人三倍的努力。
大多数人不能把他们的生命,花在他们热爱的事情上,相反,他们按照别人告诉他们应该做的去做。或者他们的父母,城镇居民朋友或者同龄人,建议他们做的事。
或者干脆什么都不追求,但如果你想做你热爱的事,你需要把它看做一种特权,而不是一种期望,这些人并不占大多数。
如果这是你真正想要的,你现在就必须投入努力。
2.愤怒之下总是恐惧。
起初我们认为这是因为一些外部因素,一些我们讨厌的东西,如果我们能克服各种情绪。我们会发现憎恨之下是愤怒的咆哮,当然这是我们已经固执太久的东西,但是在这一切的背后总是恐惧。
对失去的恐惧,脆弱的恐惧。放手的恐惧,但如果你能承认你的恐惧,你会看到它快乐的一面,同时你也得继续前行。
3.我们的日常习惯形成了我们未来的自己。
你今天所做的事,都是在向着明天的你前进。当你一周内重复同样的行动,你就开始触及到变化的表面。当你一个月内重复同样的行动,你就开始注意到细微的差别。当你坚持这样做一年或者两年或者五年,你再也不是从前的自己了,你会完全改变以一种特别的方式。
不要低估每一点力量和每一个小习惯,随着时间的推移重复,无论好坏,你的习惯决定了你最终会成为什么样的人。
图片源自网络,仅做配文展示
4.你的情绪需要练习。
我们谈论学习时,经常会谈论技巧,你练习钢琴或者练习打曲棍棒。但问题是你在情感上也需要练习,你可以练习谦卑,你可以练习宽恕,你可以练习自我意识和幽默,就像你可以很容易地练习愤怒、怨恨、戏剧和冲突一样,在情感上的你是谁是你有意识(或无意识)练习的事情的反映。
不是生来就灰心丧气,只是那种情绪远远超过了你的快乐。
5.成就永远不会像过程那样充实。
设定一个目标,并寻求他人的帮助来完成它是一回事。为了这个目标和它的实现,而牺牲自己和周围的人的幸福,则完全是另一回事。
最终的终点远不值得,过程中的情感耗竭,如果你不能和周围的人一起享受这段旅程,那么最终的目标将变得好毫无意义。
6.努力工作和欢笑并不相互排斥。
建立在前面的基础上,我一直不明白,为什么人们觉得笑意味着不认真对待手头的事情。最好的想法来自于放松,最自由的思想发生在快乐的时刻,人与人之间的联系始终于笑声,而在工作和解决问题时大笑。
就是为新的可能性敞开大门,有些人学不会这一点,他们变得暴躁又衰老。但生活在快乐,而且通常享受乐趣,并不意味着。你没有完成任何事情,相反你可以在开心的同时,做的比你想像的还要多。
关于个人成长
1.思考力和推动力
处理bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。
当面对一个未知的问题时,如何定位复杂条件下的核心问题、如何抽丝剥茧地分析问题的潜在原因、如何排除干扰还原一个最小的可验证场景、如何抓住关键数据验证自己的猜测与实验,都是体现程序员思考力的最好场景。
是的,在衡量理想程序员的标准上,思考力比经验更加重要。
有时候小伙伴跑过来,问我「提交了一个任务被卡住了,怎么办」的时候,我总觉得他可以做得更好。
比如,可以检查试验别的任务,以排除代码自身的原因;可以通过WebUI 检查异常(如果没有账号,可以让我提供);可以排查主机日志或删除缓存,再不济,总应该提供任务ID和控制台日志给我。理想的程序员永远不会等事情前进,他们会用尽一切方法让事情前进。
图片源自网络,仅做配文展示
2.管理时间
在完成任务时你必须像荒野里的狼一样,「独行」。没有外界约束的情况下还能稳定控制自己,保证能高效率地工作和学习,那么日积月累你肯定会变得比一般人厉害。
程序员干的是高强度的脑力活,一般每天集中4-5个小时应对本职工作就足够了,但工作之外,一定要安排时间用于学习。除了学习,留点时间放空自己也是必要的,利用泡茶或者喝咖啡的间隙,把弥足珍贵的时间留给自己,往前想往后想,事半功倍。
3.never say no
很多团队存在一种技术和产品的对立,程序员往往以「技术上无法实现」来挡产品的需求,而产品也往往以「Facebook可以为什么我们做不到」来奚落程序员。这两句话应该属于禁语,从根本上都不利于程序猿和产品狗的相亲相爱。
一句「技术上无法实现」是容易出口,可有多少人在说出这句话的时候,心里是100%肯定的?如果不肯定,为什么不能回去谷歌一下再回答?
原本我以为程序员是充满想象力,在因为有想象力,才能诞生那么多改变我们生活的软件和互联网产品。见识多了,才了解大部分程序员已经在与bug的对抗中变得保守而不愿担当风险,与此同时许多团队也不愿意宽容失败。
于是「SayNo」变成一种习惯性的抵触,还记得曾国藩为什么解散湘军么?他说那支军队已「暮气渐深」,不能打仗了。
要做理想的程序员,就不能给自己滋生暮气的机会,如果面对不合理的需求,可以把时间成本摆出来,把曲线救国方案亮出来,简单粗暴「SayNo」是不可取的。
图片源自网络,仅做配文展示
总之,像生活中的很多事情一样,程序员的工作也是你做的越多,了解的就越多,真正聪明的人,都肯下笨功夫。
那些老老实实做人,踏踏实实做事的人,几十年后回头再看,就会发现这条看似最慢的路,其实才是真正的捷径。
千万不要一键三连,要不然上图女神的笑容会消失