简评:作者 Bruce Eckel 是编程界的大牛,著有大名鼎鼎的《Thinking in C++》和《Thinking in Java》。本文是他对程序员(尤其是新手)的忠告,教你如何开启变成职业生涯。

大家总是问一个错误的问题:「我应该学习 C++ 还是 Java?」在本文中,我将告诉大伙儿:对于选择编程生涯真正需要关注的是哪些问题。

请注意,这篇文章的目标读者并不是那些已经做出自己选择的人。(对于这些人而言)你会继续自己的编程生涯,而不管别人会怎么说。因为它已经渗透到你的血液中,你已经无法摆脱。你已经知道答案:C++、Java、Shell 脚本、Python、还有其它一大堆的语言和技术,你都理所当然地会去学习。甚至有可能你才仅仅 14 岁,就已经知道好几种不同的语言。

问我这样的问题的人可能来自其他行业,或者来自诸如 Web 开发之类的领域。他们知道 HTML 是一种类编程语言,而且想尝试构建某些更大型的应用。但我特别希望,当你在问这个问题时,你已经意识到了想要在计算机领域取得成功,你需要掌握自学能力,而且永不停息。

在这个领域做得越多,我越觉得软件开发比任何行业都更接近于写作。我们从来不知道是什么造就了优秀的作者,我们只知道什么时候我们会喜欢某个人的文字。编程不是一种工程,仅需要把东西从入口倒进去,然后再转动手柄。把软件开发看成确定性的,是一个诱人的想法。因为这个想法,人们总想搞出一些工具来帮我们开发出想要的软件。但是我的经验告诉我,事实并非如此——人的重要性远高于流程。而软件是否运行在一部精确的机器上已经越来越不重要了——这犹如测不准原理对人类的影响。

我的父亲是造房子的,小时候我偶尔会帮忙打下手,放放砖块之类。他和他的木工告诉我,他们是为我好才让我干这些活——这样我就不至于走入这个行业。事实确实是这样。

我们不妨把软件开发比作盖房子。造房子的人当然不可能完全一样。这些人里面有:混凝土工、屋顶工、管道工、电工、砖瓦工、水泥工、瓦片工、搬运工、粗木工、细木工。当然,还有工头。每个工种都需要相应的技能,这些技能都需要花时间和精力去掌握。跟软件开发一样,造房子也是一个「建立 / 推翻」的过程。如果你想很快地获得回报,你可能从搬运工和砖瓦工开始做,这样的话,你无需太多的学习曲线就可以获得回报。当需求很多时,你的工作会很稳固,甚至收入也可能提升——如果没有足够的人手的话。但是,一旦行情不妙,木匠甚至工头就可能把砖瓦工一脚踢开。

当互联网刚刚兴起时,仅仅是花一点时间学习 HTML,你就可以得到一份薪水丰厚的工作。但是当形势惨淡时,对于技能的要求更高了——HTML 程序员(就像搬运工和砖瓦工一样)第一个被抛弃了,而拥有更高技能的程序员则留了下来。

我想说的是:除非你准备活到老学到老,不然的话,不要进入这个行业!编程看起来似乎是一个高收入而又稳定的工作。但要做到这一点,唯一的途径是:始终让自己更有价值。

当然,你总能找到例外。总有那么一些人,仅仅学了一门编程语言,就可以胜任留在一个岗位上,而不需要增长他的技能。但他们只是幸免于难而已,他们最终无疑是很脆弱的。为了不让自己变得脆弱,你需要持续的提高自己,通过阅读、加入用户组、参加研讨会...... 你学得越深入,你就越有价值,也就意味着你有更好的职业前景,可以配得上更高的薪水。

另一个方法是:先大致了解这个领域,找到最适合你的地方。打个比方:我的兄弟对软件很感兴趣,也入了这行,只不过他的工作是安装、维修、升级电脑。他总是一丝不苟,所以当他把电脑搞好,一定会很完美——不光是软件,连电线都会被仔细地捆好。他总是生意兴隆,远超出他的精力所能及。他甚至都不用担心 .com 泡沫的崩溃。显然他的饭碗不容易被抢走。

我在高校里待了很久,甚至还在 UCLA(加州大学洛杉矶分校)进修博士学位,后来又幸运地终止了。我说「幸运」是因为我不再喜欢呆在学校,而我之前在高校待了那么久,只是因为我很享受它。但我所享受的,基本上是不务正业的东西——艺术和舞蹈课,在校报工作,还有一小撮计算机课程(之所以说计算机课程「不务正业」,是因为我本科是物理专业,研究生才是计算机专业)。虽然我在学术上远谈不上卓越(有意思的是很多当时也许不会接受我这个学生的学校现在却用我的书做教材)。我真的很享受作为学生的日子,当我完成博士课程,也许会以一个教授的身份终老一生。

但就如现在看到的,我在学校里最大的收获恰恰来自我那些「不务正业」的课程,它们拓展了我的思维,使之超越了「我们已经知道的东西」。在计算机领域中,你总是为某种目标而编程。你对目标了解得越多,你就做得越好。我遇到过一些欧洲的研究生,他们需要结合其它专业领域来搞编程,他们的论文需要解决这个专业领域的特定的问题。

了解编程之外的领域,将会极大得提高你解决问题的能力 就如同多学几种编程语言将极大地提高你的编程技能)。很多时候,我发现仅仅学习计算机专业的学生,比那些(除了计算机之外)拥有其它背景的学生,在思维上有更多的局限性。因为后者有着更严谨的思维,也不那么容易想当然。

有一次我组织了一次会议,其中一个议题是「理想的应聘者有哪些特征」:

  • 把学习当成生活方式。比如:你应该知道不止一种语言,没有什么比学习一门新语言更能让你开阔眼界了。
  • 知道如何获取知识
  • Study prior art
  • 善用工具
  • 学会把事情简化
  • 理解业务
  • 为自己的错误负责。「我就是这样的」是不能接受的托词。能找到自己的失误。
  • 成为一个领导者,善于沟通和激励。
  • 搞清楚你在为谁服务
  • 没有绝对正确的答案(更好的方法总是存在的)。展示并讨论你的代码,不要带着感情因素——你的代码并不等于你本人。
  • 明白完美是渐进的

适当尝试一些冒险——尤其是能令人感到害怕的冒险。当你尝试之后,将体会到出乎意料的兴奋。(在冒险的过程中)最好不要刻意去计划某个特定的结果。当你过于注重结果,你往往会错过那些真正有价值的问题。我的冒险往往是这样开始的——「我们先做些试验,看看它会把我们带到什么地方」。

或许某些人会对我的回答感到失望,并回复我说:「是的,这很有趣也很有用。但我到底应该学什么?C++ 还是 Java?」我再重复一次:并不是所有的问题都有一个唯一的简单的答案。问题的关键不在于选择某个编程语言,然后掌握之。问题的关键在于:持续学习,并且很多时候,有不止一个选择。相信我所说的,你的生活会更精彩!

原文:A Career in Computing

编程大牛 Bruce Eckel 对新程序员的忠告的更多相关文章

  1. 致诸位新程序员:来自Chuck Jazdzewski慈父般的忠告

    记住这几句话,学无止境.(Never stop learning.)沟通至关重要.(Communication is critical.)履行承诺,胜过交付.(Under promise, over ...

  2. 编程范式(Programming Paradigm)-[ 程序员的编程世界观 ]

    编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO思想的普及,范式(Paradigm)以及编程范式等术语渐 ...

  3. 「编程羽录」上线,程序员必备的这些技能你能get到嘛?

    大家好,我是小羽. 好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章. 会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全 ...

  4. Mistakes I Made(as a developer)...大龄程序员的忠告...(部分转...)

    在2006年,我开始了编程工作.当意识到来到了十年这个重要的时间关口时,我觉得有必要回顾一下这十年间所犯下的错误,做一做经验总结,并且给正在这个职业上奋斗的人们提出我的一些忠告.开发行业变化得很快,我 ...

  5. 一个BAT老程序员的忠告!

      一.在中国,你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你更不要认为那些从事市场.运营的人,没有前途. 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的 ...

  6. Python高效编程技巧实战 实战编程+面试典型问题 中高阶程序员过渡

    下载链接:https://www.yinxiangit.com/603.html 目录:   如果你想用python从事多个领域的开发工作,且有一些python基础, 想进一步提高python应用能力 ...

  7. Bjarne Stroustrup对C++程序员的忠告

    转自:http://blog.csdn.net/adm_qxx/archive/2007/05/20/1617488.aspx  第1章 致读者  [1] 在编写程序时,你是在为你针对某个问题的解决方 ...

  8. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  9. Win8 WinRT将替换Win32 API程序员何去何从?

    win8 新引入了称为WinRT的核心API.支持使用C/C++..NET或JavaScript来开发Metro风格的应用.这些应用自动获得硬件加速和高级电源管理的功能.现有的Silverlight和 ...

随机推荐

  1. Spring的Cache注解

    Spring的Cache注解如下所示: @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置.在这里@CacheConfig(cacheNames = "users&quo ...

  2. C语言结合汇编开发系统内核

  3. 使用透明flash+背景图片制作绚丽页面

    关键代码: <div style="width: 469px; height: 303px; background-image: url('https://images0.cnblog ...

  4. jQuery的基本事件

    1.用法 <!--jquery通过bind()这个方法来为元素绑定事件,可以传三个参数,type.data.fn--> <!--type表示一个或者多个事件的名称--> < ...

  5. JavaScript事件 DOMNodeInserted DOMNodeRemoved

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定交互的瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码. 13.1 事件流 ...

  6. <!DOCTYPE html>的重要性!

    噩梦开始的源头:之前写html或者jsp页面,从来不注意doctype的声明,也不太明白doctype的作用. 直到最近碰到了一个非常奇葩的bug:某一个页面在IE7和8,Chrome,ff等下正常, ...

  7. Debian 如何使用测试版更新软件包到最新的版本

    #vim /etc/apt/sources.list 将版本代号替换成 testing 然后更新,应可以安装最新的软件包了.

  8. [Training Video - 1] [Selenium Basics] [Install Selenium IDE]

    Download and Install Selenium IDE

  9. gitweb配置

    基于ssh的git服务器搭建可浏览:https://www.cnblogs.com/wswind/p/10373881.html 安装gitweb和apache yum -y install gitw ...

  10. 布局xml文件不能预览

    原因:xml文件里,有一些值没有设置属性. 如: <LinearLayout                           android:layout_width="fill_ ...