This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
<audio id="audio" title="01 | 初心:为什么成为一名程序员?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/8f/d1/8fdd89aa34c4b5980503dcf42568fdd1.mp3"></audio>
在走上程序的道路前,你不妨先问问自己成为程序员的初心是什么。回首往昔,我似乎是阴差阳错地走上了这条路,正因初心未明,所以早期的路上就多了很多迟疑和曲折。
人生路漫漫,在专栏的第一个模块里,我会和你讲讲自己走上程序道路的故事,希望这些故事能够给迷茫或者奋进中的你以启发。在人生的不同阶段里,我都喜欢做“复盘”,一方面审视过去的自己,另外一方面思索未来的方向。现在看来,这些有节奏的复盘也给我自己留下了深深的印记,也让我在某些关键节点的决策更加坚决。
## 首次接触
说起我和程序的渊源,大概可以回溯到二十多年前。
那时我还在读初中二年级那是四川一所少数民族中学硬件条件不是太好。那是1995年国际友人赞助赠送了学校几台苹果 II 代电脑。作为学校成绩名列前茅的学生,在比较重视分数排名的背景下我还算有点 “小特权”。这点“小特权”就是可以接触这批电脑,所以在那时我为了搞懂怎么 “玩” 这些电脑去学了下 BASIC 语言,然后在上面编程并在单调的绿色屏幕上画出了一些几何图形。
当时还挺有成就感的,一度畅想将来要考清华的计算机专业。可能,那时觉得清华就是最好的学校,而计算机和编程是当时的最爱。然而,实际情况是上了高中以后学习压力大增,再也没时间去 “玩” 这些电脑了,光应对考试已然应接不暇,渐渐就忘了初中那时的想法。
现在回想起来第一次接触程序的时候,感觉它们还算是好 “玩” 的,有一种智力上的挑战,但当时也不太可能想到十年后我将会以此为生,走上程序之路。
彼时,初心未有。
## 选择专业
对我们80后这一代人高考算是人生第一次重要的选择了吧。
我那时高考填志愿,都是在考试前进行。高中三年,我都再没接触过程序了,早已忘记当年的想法。高考前,当时觉得自己对物理最有兴趣就填报了南京大学的物理系,应该也考虑过清华什么的,但没什么信心。
关于兴趣有一个有趣的说法:“往往并不是有兴趣才能做好,而是做好了才有兴趣。”高中后可能觉得当时物理学得还不错,所以就有了兴趣,并在填报高考志愿时选择了物理专业。
后来高考的结果,一方面信心不是很足,另一方面单科数学发挥也失常。南大的物理系没能上成,落到了第二志愿东北大学,调剂成了机械工程专业。这是一个随机调剂的专业,着实让我无比苦闷,学了一年后,我非常清楚,我并不喜欢这个专业,也看不清未来的职业前景。
再回首时你总会发现,有些最重要的人生路径选择,就这么有点 “无厘头” 地完成了。在面临人生重要路径的选择时,当时只考虑了兴趣,如今看来也没那么靠谱。应该多听听众人的看法,参考前人的路径,最后再自己做出决定。人生路径还是需要自己来主动、有意识地掌舵的。
彼时,初心已有,但却是混乱的。
## 转换专业
机械专业煎熬了两年,迎来了第二次选择专业的机会。
在我读完大二的时候国家开始兴办软件学院新开软件工程专业。我当时在机械专业也会学一门编程课C 语言。那时对 C 语言比较感兴趣,而对专业课机械制图则完全无感,所以当机会出现时就义无反顾去转了专业。
新专业面向所有非计算机的工程专业招生,但有一个门槛是:高学费。当时,机械专业一年学费四千多点,而软件工程本科一年一万六,学费读一年就抵得上别人读四年了,这对一个工薪家庭的压力不算小。
总之我就是这么阴差阳错地又绕到了计算机专业这条路上。作为一门新开专业软件工程相对计算机专业更偏应用对接企业用人需求。可见当时2002 年)整个 IT 行业已经面临人才缺乏的问题,国家之所以新开软件工程专业,恐怕也是经济规律在发挥作用,平衡供需两端。
于我而言,转换专业算是时代给予的机遇,我在懵懂中做出了一次正确的选择。当时并不明了,但如今回顾却是如此清晰:面对新开的软件工程专业,其实表明了一个信息,这个行业发展很快,前景很好。
人生路很长,走了一段,也需要时不时重新审视当前的路径是否适合,是否无意错过了前途更好的岔路口。
我如今会感到庆幸没有错过这个路口,当时的确是没想过从机械专业换到软件工程会有更好的发展前景,但就是这样,我绕绕弯弯、曲曲折折地入了行,成为了一名程序员。
彼时,初心虽已不乱,但依然未明。
## 转换行业
人的一生面临很多重要选择,除了高考选专业,我想转行也是其中之一。
入行后,一路走来也碰到过很多从其他行业转行成为程序员的人。曾经在招聘面试时碰到过两个程序员,他们一个是毕业于中医药大学,在药房工作两年后转行并干了 3 年;另外一个主修环境工程专业,在该行业工作 9 年后才转行程序员,并在这行干了 5 年。
那时我就在想,为什么他们都要转行做一名程序员呢?也许,客观上来说,行业的景气度让程序员的薪酬水平水涨船高。需求的持续上涨,吸引着更多的人进入,这也是经济规律。但主观上来说,可能我们也没有想好为什么就要转行成为一名程序员。
我转换到软件工程专业,毕业后顺利进入程序这行。早期一开始就是为一些传统行业公司写企业应用程序,提供 IT 服务,完成一份合同。工作五年后,我才渐渐明白,同样写程序,但为不同的行业写的程序价值真是完全不同。因此,我选择了切换到电商互联网行业来写程序。
而这一次的选择我很确定的是,至少我模糊地看到了这条路的前景,并坚定地在众多选项中排除其他路径。转行,不同的跨度,代价或大或小。但不转变就没代价吗?不见得,因为有时不做选择的代价可能更大。
此时,初心才算渐渐明了。
## 心明行远
在成长的路上,我先后经历了换专业、换城市、换行业。
去年底2017我适时地驻足回顾了一下从进入大学到如今这些年的学习、工作和成长经历。其中有一些重要的时间事件节点我把它们连接起来就成了我们大多数人的成长线。下图是我过去18年的成长线
<img src="https://static001.geekbang.org/resource/image/13/37/139a061b33fd0d711136c2846ff90c37.png" alt="" />
在这张图上选专业、换专业、换城市、换行业这几个重要的人生选择点我都用红色字体标记了。把过往的18年浓缩到一张图上后我就清晰地看出了趋势在切换行业之前初心未明成长的路上起起伏伏波动很大也因为不成熟的选择带来过巨大的落差感。
在工作的前几年,图上也有一段快速的自然成长期。因为这时我们就像一张白纸,只要是在认真地做事儿,总是能成长。这段时期,心其实是乱的,但因为忙而充实,也获得了很多成长,但它的问题是:这样的自然成长期有多长取决于你所做事情的天花板,所以才有了后面的一次切换城市带来的落差。
切换了行业,一路走到现在,前路不尽,心已明,行将远。
为什么成为一名程序员,初心若何?有人有天赋,有人凭兴趣,有人看前景。也许,你上路之初还未曾明了,但在路上不时叩问内心,找到初心,会走得更坚定,更长远。
闭上眼睛,你可以试着问自己走上程序道路的初心是否已经明了呢?欢迎给我留言,我们一起分享和讨论。

View File

@@ -0,0 +1,82 @@
<audio id="audio" title="02 | 初惑:技术方向的选择" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1b/57/1bfe6b9e7fe2b85d80e98e4619180e57.mp3"></audio>
初入职场或还在校的同学想必都会有些共同的疑惑,比如:“到底我该选哪个技术方向?”“现在该学哪门语言?”“未来 Java 语言的发展趋势如何?”这些问题的本质其实都是技术的投资决策问题,也即现在我该把时间精力花在哪个方向上,未来的收益才可能最大。
这个问题并不好回答,因为这个问题的本质和 “我现在应该投资哪只股票” 一样。没有人能回答好这个问题,我觉得最好的做法就是:从投资的出发点而非终点来选择一条路径。
至于这样选择的路径是否能在未来获得很好的收益,这是没法预测的。但选择技术方向和选择股票不同的是,只要你在这条路径上持续努力、学习与进步,基本可以保证能和 “大盘” 持平而不至于有亏损,但是否能取得超过 “大盘” 的收益,其实是看运气的。
## 选择语言
选择技术方向,从某种意义上讲就是选择语言。
虽然有一些流传的说法,类似于:“语言并不重要,必要的时候可以在各种语言间自由切换。”但实际情况是,能做到自由切换的前提是你得对一门语言掌握到通透之后,再学习其他语言才可能触类旁通。
计算机程序语言虽然很多但种类其实有限。2018 TIOBE 程序语言排行榜见下图上的前三位Java、C、C++),本质上其实是一类语言。但大部分人只能选择去熟悉并通透其中一种,因为这些语言背后都有庞大的生态圈。
<img src="https://static001.geekbang.org/resource/image/42/b2/423fa1e1fa8047f88b0d06061b6df8b2.png" alt="" />
要做到通透,只熟悉语言本身是远远不够的,其实是要熟悉整个生态圈。而三门语言中最年轻的 Java 都有二十多年历史了,足够你耗费数年时光去熟悉其整个生态圈,而且目前其生态圈还处在不断扩张的状态,展现出一种蓬勃的生命力。
那么,要是我来选,我会如何选择语言呢?我会选择那些展现出蓬勃生命力的语言。
但其实十多年前我只是凑巧选择了 Java它就像是被潮水推到我脚边的漂流瓶顺手捡了起来。没想到居然蓬勃地发展了十多年还没见衰退迹象。
那时的 Java 刚诞生不过七八年,和今天的 Go 语言很像。Go 语言在排行榜上的位置蹿升得很快,而且在云计算时代的基础设施上大放异彩,号称是:易用性要超越 PHP而性能要超越 Java。
那么在 Java 之前我学的是什么?是 Visual Basic、ASP 和 Delphi / Object Pascal。我想今天不少年轻的程序员都未必听过这些语言了。但神奇的是在 TIOBE 的排行榜上VB 加了个 .NET 排名竟在世界最广泛的 Web 语言 PHP 和JavaScript 之上。而十五年前我用的 Delphi / Object Pascal 居然落后 JavaScript 也不远,且远高于 Go、Objective-C力压 Swift。
这些老牌语言还值得学吗?当然不值得了。因为它们早已进入暮年,没了蓬勃的生命力。但为什么排名还这么高?也许是因为它们也曾有过蓬勃生命力的热血青春,留下了大量的软件系统和程序遗产,至今还没能退出历史的舞台吧。
美国作家纳西姆·塔勒布(《黑天鹅》《反脆弱》等书作者)曾说:
>
信息或者想法的预期寿命,和它的现有寿命成正比。
而编程语言以及由它编写的所有软件系统和程序,本质就是信息了。换句话说就是,如果你想预测一门语言还会存在多久,就看看它已经存在了多久。存活时间足够长的语言,可以预期,它未来也还可能存活这么长时间。当然这一论断并不绝对,但它更多想说明越是新的语言或技术,升级换代越快,也越容易被取代。
这一点在 Delphi 这门语言上已经得到了体现,进入二十一世纪后,这种编写 C/S 架构软件的语言,居然还存活了这么久。
## 选择回报
选择技术方向,选择语言,本质都是一种投资。
我们为此感到焦虑的原因在于,技术变化那么快,就怕自己选了一个方向,投了几年的时间、精力,最后却被技术迭代的浪潮拍在了沙滩上。
按上面塔勒布的说法,越年轻的语言和方向,风险越高。一个今年刚出现的新方向、新语言,你怎么知道它能在明年幸存下来?所以,考虑确定性的回报和更低的风险,你应该选择有一定历史的方向或语言,也许不能带来超额的回报,但最起码能带来稳定的回报,让你先在这个行业里立稳脚跟。在此基础上,再去关注新潮流、新方向或新技术,观察它们的可持续性。
有一句投资箴言:“高风险未必带来高回报。”在选择职业方向的路上,你甚至没法像分散投资一样来控制风险,所以选择确定性的回报,要比抱着赌一把的心态更可取。看看当前的市场需求是什么,最需要什么,以及长期需要什么。
比如,今天技术的热潮在人工智能、机器学习、区块链等上面,这是市场最需要的,而市场给的价格也是最高的。所以,你应该投入这里么?先别头脑发热,看看自己的基础,能否翻越门槛,及时上得了车吗?
世纪之初,互联网时代的到临,网络的爆发,你会写个 HTML 就能月薪上万。上万,似乎不多,但那时北京房价均价也才 5000 多啊。2010 年左右,移动互联网兴起,一年移动开发经验者的平均待遇达到了五到十年 Java 开发的水平。如今,你只会 HTML 基本找不到工作,你有五年移动开发经验和有五年 Java 开发经验的同学,薪资待遇也变得相差不多了。
关于技术,有一句流行的话:“技术总是短期被高估,但长期被低估。”今天,在人工智能领域获得超额回报的顶级专家,实际数十年前在其被低估时就进入了这个领域,数十年的持续投入,才在如今迎来了人工智能的 “牛市” ,有了所谓的超额回报。所以,不妨投入到一些可能在长期被低估的基础技术上,而不是被技术潮流的短期波动所左右。
技术的选择,都是赚取长期回报,短期的波动放在长期来看终将被抵消掉,成为时代的一朵小浪花。
## 选择行业
搞清楚了语言、技术方向和回报的关系后,最后做出选择的立足点通常会落在行业上。
当你问别人该选什么语言时,有人会告诉你,你应该学习 JavaScript因为这是互联网 Web 时代的通用语言,到了移动互联网时代依然通用,而且现阶段生命力旺盛得就像再年轻十岁的 Java。也有人告诉你也许从 Python 开始更合适,语法简单,上手容易。还有人告诉你,现在学 Java 找工作最容易,平均工资也蛮高。这各种各样的说法充斥在你的耳边,让你犹豫不决,左右为难。
一个问题就像一把锁,开锁的钥匙肯定不会在锁上。否则这个问题也就不是问题了,太容易就解开了,不是吗?所以,选择什么语言通常不在于语言本身的特性。
选语言,就是选职业,而选职业首先选行业。
先想想自己想从事哪个行业的软件开发;然后,再看看:这个行业的现状如何?行业的平均增速如何?和其他行业相比如何?这个行业里最好的公司相比行业平均增速又如何?最后,再看看这些最好的公司都用些什么样的技术栈和语言。如果你想进入这样的公司,那就很简单了,就选择学这样的技术和语言。
这样选择是不是太功利了?选择不是应该看兴趣么?注意,这里选择的前提可不是发展什么业余爱好,而是为了获得安身立命的本领,获得竞争的相对优势。而兴趣,就是这件事里有些吸引你的东西,让你觉这是 “很好玩” 的事。但有个通常的说法是:“一旦把兴趣变成了职业也就失去了兴趣。”因为,职业里面还有很多 “不好玩” 的事。
兴趣能轻松驱动你做到前 50%,但按二八原则,要进入前 20%的高手领域,仅仅靠兴趣就不够了。兴趣给你的奖励是 “好玩”,但继续往前走就会遇到很多 “不好玩” 的事,这是一种前进的障碍,这时功利,也算是给予你越过障碍所经历痛苦的补偿吧。
以上,就是我关于技术方向选择的一些原则与方法。无论你当初是如何选择走上技术道路的,都可以再想想你为什么要选择学习一门编程语言,学习编程的一部分是学习语言的语法结构,但更大的一部分,同时也是耗时更久且更让你头痛的部分:学习如何像一个工程师一样解决问题。
有时这样的选择确实很难,因为我们缺乏足够的信息来做出最优选择。赫伯特·西蒙说:“当你无法获得决策所需的所有信息时,不要追求最优决策,而要追求满意决策。”定下自己的满意标准,找到一个符合满意标准的折中方案,就开始行动吧。
而停留在原地纠结,什么也不会改变。
最后,亲爱的读者朋友,你当初是如何选择技术道路的呢?欢迎留言分享。<br />

View File

@@ -0,0 +1,128 @@
<audio id="audio" title="03 | 初程:带上一份技能地图" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/60/92/60c703b75acc4d4bdb0d955bb273cb92.mp3"></audio>
程序世界是一片广阔的大地,相比我十多年前进入这个世界时,这片大地的边界又扩大了很多倍。初入程序世界难免迷茫,要在这个世界立足、生存,并得到很好的发展,应首要具备怎样的技能呢?未来的程序之路,先给自己准备一份基本的技能地图,先有图,再上路。
在程序的技能地图中,需要先开启和点亮哪些部分呢?回顾我过去的经历并结合现实的需要,可以从如下两个不同程度的维度来说明:
- 掌握
- 了解
掌握,意味着是一开始就要求熟练掌握的硬技能,这是生存之本。而至于掌握的深度,是动态的,倒是可以在行进过程中不断去迭代加深。了解,相对掌握不是必需,但也需要达到知其然的程度,甚至知其所以然更好。
## 一、掌握
上路之初,需要掌握的核心生存技能有哪些呢?
### 1.开发平台
开发平台,它包括一种编程语言、附带的平台生态及相关的技术。在如今这个专业化分工越来越细的时代,开发平台决定了你会成为什么类型和方向的程序员。比如:服务端、客户端或前端开发等。其中进一步细分客户端还可以有 Windows、Mac、iOS 和 Android 等不同的平台。
**编程语言**
语言的选择基本决定了开发平台的性质但有些语言可能例外C++、JS、C# 等,这些语言都可以跨多个平台。但即使你选的是这些语言,基本也会归属到某一类平台上。好比你选了 C++,如果你去做了客户端开发,就很少可能再去用 C++ 写服务端程序了。
关于语言的选择前面我已经写过了选择的逻辑便不再多说。但选择了语言我们不仅仅是熟悉语言自身的特性还需要掌握支撑语言的平台库。Java 若仅从语言特性上来说,有其优点,但其瑕疵和缺陷也一直被吐槽,要是没有 JDK 强大的平台库支撑,想必也不会有今天的繁荣。
**平台生态**
与语言平台关联的还有其技术生态以及各种技术框架的繁荣程度。这些平台技术生态的存在让使用这门语言编程完成特定的任务变得容易和简单得多。Java 的生命力除了 JDK 的强大支撑,实际还有其平台生态的繁荣,也起了决定性的作用。
在选择了开发平台后,除了语言和平台库之外,其生态体系内主流的技术框架和解决方案也是必选的掌握内容。
### 2.常用算法
在学校学习的算法,基本是解决各种计算机科学问题的通用方法。
还记得在学校时看过一本算法经典书《算法导论》。刚又把这本书的目录翻了出来过了一遍,发现已经忘记了百分之七、八十的内容。因为忘记的这部分内容,在过去的十多年工作中我基本都没机会用上。那么掌握算法的目的是为了什么呢?
有时候你可能会觉得学校教科书上学习的经典算法,在实际工作中根本就用不上。我还记得考研的时候,专业考试课就是算法与数据结构,在考卷上随手写个排序、树遍历手到擒来。但到研究生毕业去参加腾讯校招面试时,让在白纸上手写一个快排算法,我被卡住了,自然也就没通过。因为好久已经没有进行这样的练习了,而在研究生阶段一年期的公司实习工作场景也没有这样的需求。
那么为什么还要学习这些经典算法?
算法,表达的是一个计算的动态过程,它引入了一个度量标准:时空复杂度。当我回思时,发现这个度量标准思维在工作十余年中一直在发挥作用。如今,几乎所有的经典算法都能在开发平台库里找到实现,不会再需要自己从头写。但结合工作实际的业务场景,我们需要去设计更贴合需求的算法,而只要是算法它都受到时空复杂度的约束,而我们只是在其中进行平衡与折衷。
学校教科书的经典算法,是剥离了业务场景的高度抽象,当时学来有种不知道用在哪里的感觉;如今回头结合真实的业务场景需求再看,会有一种恍然大悟之感。
### 3.数据结构
数据结构通常都和算法一起出现,但算法表达的是动态特性,而数据结构表达的是一种静态的结构特性。大部分开发平台库都提供了最基础和常用的数据结构实现,这些都是我们需要熟悉并掌握的,包括:
- 数组 Array
- 链表 Linked List
- 队列 Queues
- 堆栈 Stacks
- 散列 Hashes
- 集合 Sets
另外,还有两种数据结构不属于基础结构,但在现实中有非常广泛的直接映射场景。
- 树 Trees
- 图 Graphs
每种结构都有各种变体,适用于不同的场景,甚至很多时候你还需要会组合不同的结构去解决一些更复杂的问题。
## 二、了解
需要了解的内容比需要掌握的更广泛,但了解了这些方面会让你更高效地协作并解决问题。
### 1.数据存储
不管你写什么样的程序系统,估计都离不开数据存储。数据是一个业务系统的核心价值所在,所以怎么存储不同类型的生产数据,是你必须要了解的。如今广泛流行的数据存储系统有下面三类:
- SQL 关系型数据库MySQL、Oracle
- NoSQL 非关系型数据库HBase、MongoDB
- Cache 缓存Redis、Memcached
每一种数据存储系统都有其特定的特性和应用场景。作为程序员,我们通常的需求就是最有效地用好各类数据存储,那么按了解的深度需要依次知道如下几点:
- 如何用?在什么场景下,用什么数据存储的什么特性?
- 它们是如何工作的?
- 如何优化你的使用方式?
- 它们的量化指标,并能够进行量化分析?
这 4 点虽不要求一开始就能掌握到一定程度,但你最好一开始就有这个层次思维,在日后的工作中不断去迭代它的深度。
### 2.测试方法
为什么我们做开发还需要了解测试?
测试思维是一种与开发完全不同的思维模式。有一种流行的开发方法论叫 “测试驱动开发TDD它的流行不是没有道理的。在写代码的时候用测试的思维与方式提供单元测试去审视和检测代码也就是说明确要开发某个功能后先思考如何对这个功能进行测试并完成测试代码的编写然后编写相关的代码满足这些测试用例。
开发与测试这两种相反视角的切入维度,能真正长期地提高你写代码的效率和水平。
### 3.工程规范
每一种开发平台和语言,估计都有其相应约定俗成的一些工程规范要求。最基础的工程规范是代码规范,包括两个方面:
- 代码结构
- 代码风格
像 Java 这么多年下来,逐渐形成了一种基于 Maven 的代码组织结构规范,这种约定俗成的代码结构规范省却了很多没必要的沟通。有时候,同样的内容,有更规范的结构,其可阅读性、理解性就能得到提升。
而至于代码风格,相对没那么标准化。但为了写出更清晰、易读的代码,我们至少要坚持自己写的代码具有某种一致性的风格。另外,除了风格问题,也可以借助静态代码检查工具来规避一些新手爱犯的低级错误,而老手也可以通过这些工具来找到自己的认知与习惯盲点。
### 4.开发流程
在开发流程方法论上,敏捷基本已经横扫天下,所以我们至少要了解下敏捷开发方法论。
虽然敏捷方法论定义了一些参考实践,但它依然是一组非常松散的概念。每个实践敏捷的开发团队,估计都会根据自己的理解和摸索建立一整套逐渐约定成型的开发流程规范。而为了和团队其他成员更好地协作,估计每个新加入团队的成员都需要了解团队演进形成的开发流程规范。
先了解,再优化。
### 5.源码管理
既然我们生产代码,自然也需要了解如何管理好代码。
在我的从业经历中,源码管理工具经历了从 CVS 到 SVN 再到 Git 的变迁。Git 诞生的背景是为 Linux 这样超大规模的开源项目准备的,自然决定了其能应对各种复杂场景的源码管理需求。所以,你至少要了解 Git并用好它。
当工具变得越来越强大时,工具背后的思想其实更重要,对其的理解决定了我们应用工具的模式。而对源码进行管理的最基本诉求有以下三点:
- 并行:以支持多特性,多人的并行开发
- 协作:以协调多人对同一份代码的编写
- 版本:以支持不同历史的代码版本切换
最后,我把以上内容总结为如下一张图:红色区域相对更小而聚焦,是需要掌握的部分,要求深度;蓝色区域的部分更广而泛,需要广度。<br />
<img src="https://static001.geekbang.org/resource/image/2b/f4/2b4179c8ab8f4b60d2632060f1451df4.png" alt="" />
以上就是我回顾走过的路径后,觉得需要具备的一份基础技能图。十多年后,这张图上的每一个分类都出现了新的技术迭代,有了新的框架、算法和产品等,但它们并不过时,依然可以为你的技能点亮之路提供方向指引。也许,你程序生涯的第一个一万小时你就会花在这张图上了。<br />

View File

@@ -0,0 +1,111 @@
<audio id="audio" title="04 | 初感:别了校园,入了江湖" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b0/8f/b0528ee7996e097c34cb5ea4590f918f.mp3"></audio>
每年七月,盛夏,一种火辣兼有闷润的热,但在这份热辣中也有一丝略显冰凉的愁绪。一批刚毕业的学生,将要告别校园,进入职场:一个新的江湖。
一到毕业季,就会经常看到一些转发给新入行程序员的“老司机”指南,老实说,这些指南不少都是金玉良言。当年我毕业新入行时可不像现在有这么多发蒙解惑的“老司机”指南,所以坑都没少踩,若说有什么坑没掉进去,那一定都是因为运气。
当毕业生们看到前路如此多坑时,其实也不必有太大的心理压力,毕竟成长之路不可能是轻松的。我也是这样一路走过来的。所以,这篇就不写关于坑的指南了,而是分享一些我的故事和感悟,给刚踏上征程的你或你们吧。
## 重剑无锋
作为一名新入职的程序员,首要之事就是配备一台电脑。
这个时代基本都是标配笔记本了,近年公司给配的电脑都很不错了,程序员全是高配大屏的 Macbook Pro 了。遥想我第一份工作,领到的是一个二手华硕笔记本,应该是上一个离职的前辈用了好几年的,这也是我的第一个笔记本电脑。
程序员就应该配笔记本电脑,为什么必须是笔记本电脑?不可以是台式机吗?笔记本电脑之于程序员,就像剑之于剑客。剑客的剑是不应该离开身边的,稍有风吹草动,听风辨器,拔剑出鞘(程序员一声不发就掏出笔记本开始写代码)。
当招程序员时,若来者不问公司配备什么笔记本,一般也就属于大多数的普通程序员啦,不太可能是那种 “不滞于物,草木竹石均可为剑” 的独孤求败级高手。
但也会有少数人问公司配什么笔记本电脑的,当对公司提供的笔记本感觉不满意时,就会要求是否可以自备笔记本电脑,而由公司给予补贴。
后一类同学,对环境、工具和效率是敏感的,我觉着就会比前面那类要强,当然我没有具体统计数据,也是纯凭感觉。
我毕业那年,腾讯来学校招聘,本科年薪六万,硕士八万,博士十万,都是税前。那时我心中最好的笔记本应该还是 IBM 的 ThinkPad T 系列,最差也得 10000+ 起的价格吧。但现在年薪十万在一线的北上广深算相当普遍了吧?而笔记本还是一万,所以能买到很不错的笔记本已经不是什么难事了。若现在的公司再在程序员的 “剑” 上琢磨省钱那绝对是得不偿失了。
我的第一个二手华硕笔记本相比现在的超薄轻快的笔记本,那绝对算是相反的厚重慢了。所以我把它称为 “重剑”,和独孤前辈不同的是,他老人家是先用轻剑,再用重剑,而我是先用重剑,然后越用越轻了。
但只是一年后我换了公司,这把 “重剑” 就还了回去。到了第二家公司,入职后才发现公司不配笔记本电脑,全是台式机。你看,当年我就是那种没问公司配什么电脑的普通程序员,考虑那时确实台式机占据主流,并且笔记本还属于一般程序员至少要两三个月工资才能买得起一台趁手的奢侈品范畴,我也就忍了。
新入职没多久,熟悉了公司环境和老同事交接过来的一个旧系统,公司派我出差去客户现场开发调试。我满心以为出差至少得配个笔记本吧,但组长过来说我们这边出差都带台式机的。然后我看看组长一脸正气不带开玩笑的表情,再看看桌上台式机硕大的机箱和 17 寸的 CRT 显示器,瞠目结舌。
“显示器也要带去?” 我问。  <br />
“噢,显示器可以让公司 IT 部给你寄过去,但主机箱要自带,因为快递很容易弄坏。” 组长说。  <br />
“好吧…”
对话结束,我立马奔去广州太平洋电脑城,花了之前一年工作攒下来的一万块中的七千,买了一台只有 ThinkPad T 系价位零头的 R 系笔记本,之后这把 “剑” 陪伴了我五年。
初入职场的同学,既然选择了某个公司,最大的因素除了薪酬外,想必每个人都还有这样或那样的在意点。当年我最不满意的就是笔记本这个问题,但从工作第二年开始我一直都是自备笔记本工作,持续多年,没花多少钱,但少了很多折腾和不便。
再后来我挣得稍微多了些就又自己换了大内存加固态硬盘SSD的 Mac。刚换上 Mac 就惊喜地发现,以前一个 Java 工程编译打包下要 50 多秒,在 Mac 下只需要 20 秒了。考虑写程序的这么多年,每天我要执行多少次编译打包命令,虽然每次节省的时间不多,但总体来看它大大提高了我的效率。
为什么我要单独谈谈笔记本这件小事?因为这是我们程序员每天使用最多的工具,如果你不在乎你的工具,可能你也就不会在乎你的时间和效率。
## 野蛮生长
现在的公司基本都会给新入职的同学配备一个老员工,俗称 “导师”。
导师制的主要目的是帮助新员工迅速熟悉公司环境和融入团队中。这个初衷自然是没问题的,只是因为导师制其实不算正式的规章制度,更多是一种文化上的强制介入,但很多时候又没有绑定任何利益机制,所以它的效果实际上和个体差异有很大关系。
我觉着新入行的同学,尽量不要去依赖此类导师制。我并不是否定这种机制,而是提醒你不要形成心理依赖,觉着面临问题时,总是有人可以询问和帮忙。职场的第一个台阶就是形成独立性:独立承担职责的能力。这和协作没有冲突,团队协作可以算是履行职责的一种途径和手段。
就以简单的问问题为例,如果只抱着获得答案搞定自己的事情为出发点,一次、两次也就罢了,长此以往是不可行的。因为通过你问出什么样的问题,就可以看出你对这个问题做出了怎样的探索与思考,以及让你困惑的矛盾点在哪里。有些人就喜欢不假思索地问些 Google 都能够轻易回答的问题,形成路径依赖,虽然最终搞定了问题,但换得的评价却不会高,特别要省之戒之。
当你能够问出 Google 都不容易回答的问题时,这可能才是你真正走上职业程序员的开端。
知乎上有个问题:“普通人到底跟职业运动员有多大差距?”里面有个回答,以篮球运动为例给出一个生动的评分体系。假如巅峰时的迈克尔·乔丹算满分 100那么国内顶级的球员巅峰时的易建联可能刚刚及格得分在 6070 之间,而大部分业余选手基本就在 0.10.N 之间波动了。
幸运的是程序员这个职业不像运动员那么惨烈,借用上面的评分标准,假如把奠定计算机行业基础的那一批图灵奖得主级别的程序员定义在 90100 分档,那么我们很多靠编码为生的程序员基本都在 110 分档间分布,而业余的只是写写 Demo 的程序员可能就是在 0.10.N 之间了。
所以,进入职场后,你需要先把得分从小数提高到整数,再持续努努力提升到两位数,搞不好就成了行业某个垂直细分领域小有名气的专家了。
都不需要及格的分数,程序员就能获得不错的成就感和回报。只需要是巅峰者的十分之一或二十分之一,基本就能超越身边绝大多数人了。望着遥远的巅峰不停地去靠近,翻越身前脚下的一座座小山包,然后不知不觉就超越了自己。
总之,应像野草一样野蛮而快速地生长起来。
## 青春有价
青春,到底是无价,还是有价?
电影《寒战》里面有个情节,劫匪劫持了一辆警方的冲锋车和五名警员,勒索赎金时让警方自己算一辆冲锋车及其装备外加五名警员的性命值多少钱。然后电影里一阵眼花缭乱的计算得出了最终价格,大约九千多万港币。
后来采访导演问是怎么个算法,导演如是说:
>
五个警员,若不在事件中死去,由现在到退休期间的十多二十年任职的每月薪酬、房屋及子女医疗津贴、加上假设退休前的职位升迁,香港市民平均年龄以男方 79 岁,女方 85.9 岁的生存上限而计算的长俸,并加上冲锋车流动武器库内的价值、冲锋车本身的车价及保险等最后算出来的总值。
按这么一算,其实一生值不了多少钱啊。
年轻时候嘴边爱唠叨一句话叫:青春无价。其实从我们挣到第一份工资开始,人生就是有价的了。而最黄金时段的青春就在毕业后的十年内,这是大部分人心理和心智走向成熟的阶段,但这十年的价值从市场价格衡量来看是十分有限的。
对于2018 年的毕业生, BAT 三家给出的年薪大约二十万左右,换算到月上每月接近两万了。而另外很大一部分进不了 BAT 三家的毕业生可能平均拿不到那么高,但估计在一线城市一万是差不多的。这样一算,未来十年你觉得能挣多少钱?
喜欢从静止的视角看问题的人一算大概一年十来万,十年也就一百多万,这个收入相对目前一线城市的房价,还能安居乐业吗?
另外思考一个问题:你能在十年后做到相比刚毕业时稳定收入增长十倍吗?也就是说现在月薪一万的人,十年后能月入十万吗?难,非常难。不信我们下面仔细算算。
我们回到用动态的视角看前面那个问题,你持续学习,努力工作,年年涨薪 20%(注意我说的是年年,这很不容易,也许你会说跳一次槽就可能翻倍,但你能年年跳槽翻倍么),十年后你年的收入将是十年前的 6.2 倍,离十倍还有距离,但换算为年薪也有七八十万了。所以要想靠加薪加到月入十万真的是一件极难的事情,而且即使做到了也离我们心中的无价青春,还差很远吧?
认清了这个现实我们明白了这十年的青春是十分有价的。所以这时有人说了要去创业才有可能突破。前两年2015都在鼓励万众创业但真实的现实是你要给目前的万众创业者一个稳定的七八十万年薪80%+ 的创业者表示就会放弃创业了,这数据是来自 TOMsInsight 深度观察文《互联网乱世之下,那些人才流动中的心酸和无奈》对 100 个创业者的抽样调查。<br />
<img src="https://static001.geekbang.org/resource/image/cf/23/cfdf0449e59441880c7ad00cf1bfbd23.png" alt="" />
那么持续努力的学习还有意义吗?我只是说你很难做到每年加薪 20%,但是却可以做到每年比去年的自己多增长 20% 的知识、见识和能力。而关于知识、见识和能力的积累与相应价值的变现,理论与现实的对比可能如下图,纵坐标:年薪(单位万),横坐标:工作年限。<br />
<img src="https://static001.geekbang.org/resource/image/d3/87/d3670ff4ab9b16b316c63522bcf5ff87.png" alt="" />
现实不太可能因为你的能力每增长 20% 就会立刻体现在你的收入上。现实有两种可能:一种存在一个拐点让你的积累获得相应的价格体现,另一种也可能不存在这个拐点,停留在某个水平位。其中拐点就是我们现实中常说的机遇吧。
无论怎样,要想获得拐点出现的机遇,可能你也只能持续努力地积累下去。
关于人生的选择,从来都是 All In可没有股票那种分批建仓的办法写到这里想起了曾经在网上记录下来的几句话现分享给你
>
<p>我不停的擦拭手中的利剑,不是因为我喜欢它,也不是因为它能带来安全,只是因为,每当下一次冲锋的号角响起时,我能够迅速拔出,纵横厮杀,直至战斗结束,不让自己倒下。<br />
……<br />
生活在这样的时代,与其被迫上场,心怀恐惧,不如主动征伐,加入时代的滚滚大潮当中,去见识一下时代的风采,写下自己的故事。</p>
这个江湖会有你的故事吗?
在这里我分享了一些我刚入江湖的故事,那你有怎样的精彩故事呢?欢迎你留言,和我一起分享。