60 岁代码匠的几篇小作文,解决了大多数程序的迷茫(上)
陈德伟 | 译
不熟悉计算机底层原理,我能走多远?30+ 了,会被裁吧?到底学哪门编程语言更有前(钱)途?
……
裁员大潮,行业高度内卷带来的焦虑迫使我们总是重复面对以上问题,它们是否有可解的答案?如果你的答案是“没有”,那我建议你从阅读这篇文章开始。
本文节选自《On Java 中文版 进阶卷》。
我是如何走上编程道路的
这是一条漫长而曲折的道路。在我高一的时候(1971 年),有位异常古怪的代数老师对计算机很感兴趣。他设法获得了一台 ASR-33 电传打字机,这台打字机带有 300 波特的电话耦合器(我学会了如何向它吹口哨并得到响应)。此外,他还弄到了我们高中学区使用的 HP-1000 计算机账户。我们可以创建并运行 BASIC 程序,然后将其保存在穿孔带上。
我被这台机器迷住了,晚上回家后也会编写程序。只要有可能,我就会带着写好的程序来到学校,把它们输入电传打字机。我发明了一个名为 HOSRAC.BAS 的赛马模拟程序,使用星号来代表马的移动(这是在纸上打印出来的,所以需要一点儿想象力)。
我的朋友 Daniel(也是现在帮我设计图书封面的人)有一个兄弟,他有段时间通过向酒吧和餐馆提供弹球机来赚钱。他做过一种老虎机(我现在已经彻底摆脱这种机器了,一点儿也不想碰),还有最早的 Pong 游戏之一(我现在几乎从不玩计算机游戏。也许我是一个没有幽默感的人,但编程看起来远比玩计算机游戏更有趣、更有挑战性)。
我在高中高年级开始接触摄影和新闻工作,并在大学第一年主修了新闻专业。后来我觉得自己已经从学校学到了足够多的知识,就改学了物理。我在加州大学欧文分校获得了物理学学位,并选修了相当多的工程课程。如果我选择特定的工程领域,就可以拿到双学位,但我试图拓宽自己的知识范围,所以本科学位就是“应用物理学”。
作为一名本科生,我零星上了些计算机编程课,足以自娱但没有任何深度。这些课程为我定期提供了相关信息,帮助我巩固了基础,但并没有让我获得真正理解任何东西所需的深度或视角。我区分不了计算机和编译器、解释器(并且对编译器和解释器只有模糊的认知)。对我来说,它们都是从不出错的计算机,语言或操作系统可能存在错误的想法只存在于纯理论上,我从未考虑过这种可能性。
之后,我去了位于圣路易斯−奥比斯波市的加州理工州立大学读研究生,因为,一我真的很喜欢这个地区,二他们接受了我,甚至给了我一份教学工作和奖学金,但最重要的是三我无法想象从事一份比一个夏天还长的工作。我绝对没有准备好进入工作世界。
作为一名物理专业的学生,我研究了太阳能系统。这在当时是一个热门项目(如果在个人房屋或企业工厂中安装太阳能系统,加州会提供税收抵免,因此许多企业应运而生),加州理工州立大学的工程系也允诺为从事该项研究的人提供各种好处。然而,获得太阳能工程学位需要很多年,因为必要的课程安排得并不多。
于是,我参加了学校提供的各种研究生工程课程,并接受了广泛的教育(正如我的习惯一样),包括机械、太阳能、电气和电子工程。我教的课是面向非电气工程专业学生的电气工程导论。因为学校里最常见的研究生工程课程是计算机工程,所以我最终获得了这个学位。我还学习了一些艺术课程、几门舞蹈课和部分计算机科学课程(Pascal 和数据结构)。
在计算机工程的学习中,我终于努力弄懂了处理器的工作原理,并且从那时起一直没有忘记,这就是我所有计算机知识的真正基础。
我的第一份工作是计算机工程师,处理的大多是硬件和相对简单的底层编程。我开始自学 C 语言,因为它似乎是理想的嵌入式系统语言,然后慢慢开始对编程语言有了更多的了解。在某家公司里,我们从源代码构建了自己的编译器,这让我大开眼界。(编译器只是另一种软件!真是无法想象。)
当我去华盛顿大学海洋学院工作时(我的老板 Tom Keffer 后来创立了 Rogue Wave 软件公司),我们决定使用 C++。我用来学习的书只有一本(Stroustrup 的书,不是入门教程),最终不得不通过检查由 C++ 预处理器生成的中间 C 代码来努力地理解语言特性。
这个过程很痛苦,但对我的启发也很大。从那时起我,就一直在使用这种方法,因为它使我能够剖析一种语言并了解其本质。我应该也是从那时起开始学习批判性思维的。
所以我并不是一下子掌握这些概念的。相反,它们随着时间的推移逐渐渗透进来,我所知道的一切都是需要时间来吸收的。如果我现在看起来似乎很容易接受新的概念,那只是因为它是我积累的已知概念的一种变体。在加州理工州立大学的计算机科学研究生课程上(该课程招收拥有非计算机本科学位的学生),学生们过去常说,他们花了一年多的时间才对计算机有所了解,开始理解所学到的知识(而且他们的学习环境还是沉浸式的)。
人们在尝试学习计算机时,往往对自己抱有不切实际的期望——他们听说计算机编程能赚大钱,通常希望能在几周内就找到一份高薪工作。但是最好的学习过程始于对计算机的兴趣,随着时间的推移,你学得越来越多,并且通常会自学。这也是我的主要经历,尽管我在计算机工程方面有很强的基础,但是没有上太多的编程课,而主要是自学。我也一直在学习新事物。在这一领域,学习新事物是职业生涯的重要组成部分。
给年轻人的职业建议
我经常收到寻求职业建议的声音,这里尝试回答一下。
人们问的问题通常是错误的:“我应该学习 C++ 还是 Java?”对于选择计算机相关职业所涉及的实质问题,我在这里尝试阐述一下自己的看法。
请注意,我在这里要沟通的对象,不是你们这些志向已立的人。不管别人怎么说,你都会去学习,因为这是你无法摆脱的“宿命”。你已经知道答案了:C++、Java、shell 脚本、Python 以及其他许多你会学习的语言和技术。即使你只有 14 岁,就已经了解其中的几种语言了。
问我这个问题的人一般来自其他职业。他们也可能来自 Web 开发等领域,发现 HTML 只是有点像编程,所以想尝试构建更重要的东西。我特别希望,问这个问题的你已经意识到,要在计算机领域取得成功,必须学会如何学习,并且永远不要停止学习。
我从事这份职业越久,就越觉得开发软件像写作,而不是别的什么。到现在为止,我们也没有弄清楚如何成为好的作家,但是看到自己喜欢的文章时我们立刻就能意识到它是好的。这不是某种工程,并不是说我们将某些东西放在机器一端然后转动曲柄就可以了。人们很容易将软件视为确定的——我们希望能这样。这也是我们不断推出新工具,来帮助自己获得想要的功能的原因。
但我的经验一直表明正好相反,软件主要是关于人而不是过程的,而且它在确定性机器上运行的事实变得越来越没有影响力,就像海森堡不确定性原理不会影响人类宏观世界的事物一样。
我父亲的工作是建造定制房屋。我在年轻的时候,偶尔会为他工作,主要是做些体力劳动,有时还会搬运石膏板。他和木工师傅告诉我,他们给我这些工作是为了我好——这样我就不会进入这个行业了。的确如此。
所以我打算使用盖房子来比喻构建软件。我们不会认为盖房子的每个人都一样:有混凝土泥瓦匠、屋顶工、水管工、电工、板工、泥水匠、瓷砖安装工、普通工人、粗木工、精细木工,当然还有总承包商。每一类人都需要一套不同的技能,要花费不同的时间和精力来获得。
房屋建设也受到繁荣和萧条周期的影响,就像编程一样。为了尽快获得工作,你可以找一份普通工人或搬运工的工作,这样可以在没有太多学习的情况下开始获得报酬。只要需求旺盛,你就有稳定的工作,如果没有足够的人来做这项工作,你的工资甚至还会上涨。但是,一旦经济低迷,木工甚至总承包商会自己搬运石膏板。
当因特网刚开始蓬勃发展时,你要做的就是花些时间学习 HTML,然后就能找到一份工作并赚到不少钱。但当情况变坏时,我们很快就会发现,技能也是有重要性等级的:HTML 程序员(像普通工人和搬运工一样)会被先行解雇,而高技能的“代码匠”则留了下来。
我在这里想说的是:“除非准备好致力于终身学习,否则不要进入这个行业。有时,编程似乎是一份高薪、可靠的工作,但能确保这一点的唯一方法,就是始终让自己更有价值。”
当然,你也可以找到例外。一些人只学了一种语言,但是有足够的能力或足够精明,所以不用做太多的事情来扩展自己的能力也可以不被解雇。他们是靠运气幸存下来的,实际上还是很脆弱。为了让自己不那么脆弱,你必须通过阅读以及参加用户组、会议和研讨会来不断提高自己的能力。你在这个领域耕耘得越深,就越有价值,这也意味着更稳定的工作前景、更高的薪水。
另一种方式是从总体看待这个领域,找到一个你有天赋的方向。例如,我的兄弟对软件感兴趣,也涉足过软件,但他的工作是安装、修理和升级计算机。他总是一丝不苟,所以当他安装或修理完你的计算机时,你会知道它处于极好的状态:不仅是软件,甚至连电缆也被整整齐齐地捆在一起,不会碍事。他的工作多到做不完,而他也从未注意到互联网泡沫的破灭。不用说,他的工作是外包不了的。
我在大学里待了很长时间,体验了各种生活。我甚至开始在加州大学洛杉矶分校攻读博士学位,不过学业被“仁慈”地缩短了——之所以说“仁慈”,是因为我不再喜欢上大学了,之前在大学里待那么久的原因是我非常喜欢那里。
但我喜欢的是那些偏离轨道的东西:艺术和舞蹈课,为大学报纸写新闻,以及我参加的少数计算机编程课程(我是物理本科生和计算机工程研究生,所以这也算偏离了轨道)。虽然我在学术上远非杰出(令人愉快而讽刺的是,许多没有录取我的大学正在使用我的书作为教材),但我真的很喜欢大学生活。如果读完了博士学位,我可能会选择一条容易走的路,成为一名教授。
但事实证明,我从大学里得到的很多极为有益的收获,来自于那些偏离轨道的课程,这些课程让我的思维超越了“我们已经知道的东西”。我认为在计算机中尤其如此,因为我们总是通过编程来支持其他目标。对该目标了解得越多,我们的表现就越好(我见过欧洲的一些研究生课程,要求将计算机与其他专业结合起来学习,并且毕业论文需要解决其他专业的特定领域问题)。
我还认为,了解编程之外的事情,可以极大地提高我们解决问题的能力(就像了解一种以上的编程语言可以极大地提高编程技能一样)。我曾多次遇到只受过计算机科学培训的人,他们的思维似乎比来自其他背景(如数学或物理)的人更受限制,后者受过更严格的思维训练,并且不太倾向于接受“它在我的机器上可以工作”的解决方案。
在我组织的一次会议上,有一个主题是好的求职者应该有哪些能力。
将学习作为一种生活方式。例如,学习不止一种语言。要看到一门语言的优势和局限性,没有比学习另一种语言更好的方法了。
知道在哪里获得新知识,以及如何获得。
研究现有的技术。
做工具的主人。
学习做最简单的事情。
了解业务知识(阅读杂志。从 Fast Company 开始,里面有一些非常简短而有趣的文章。读过之后你就知道是否还要找其他资料了)。
对错误承担起责任。“它在我的机器上可以工作”不是一个可接受的方案。找到你自己的 bug。
成为领导者:做一个善于沟通和激励他人的人。
你在为谁服务?
没有正确的答案……总是有更好的方法。展示并讨论你的代码,不要带情绪。你的代码代表不了你。
这是一个渐进地走向完美的旅程。
尽你所能去冒险吧——你所经历的最好的冒险通常也是最可怕的,但在尝试时,你会觉得自己比想象中更有活力。最好不要为特定的结果做计划,因为如果执着于结果,往往会错过真正的可能性。我最好的冒险是从“让我们做一个小实验,看看它会把我们带到哪里去”开始的。
有些人对这个答案感到失望,并回答:“是的,这一切都非常有趣和有用。但说真的,我应该学习什么?C++ 还是 Java?”对此,我将重申:“我知道所有的 1 和 0 似乎应该能使一切具有确定性,这种问题应该有一个简单的答案,但事实并非如此。这不是关于做出一个选择并完成它的问题,而是关于持续学习、有时是大胆选择的问题。相信我,这样会让你的生活更精彩。”
To be continued......
评论