我很喜欢这么一句话:阅读量决定了学习能力的上限,写作量决定了学习能力的下限。这是因提出“百格计算”1 而闻名的岸本裕史先生说的话,个人觉得这对编程也是适用的。要想磨练编程技巧只有两个途径:一是阅读代码,二是编写代码。

不存在没有读过其他人写的代码的程序员。很显然,也不存在没有写过代码的程序员。越是编程技巧高超的开发者,读过的代码越多,写过的代码也越多。

讨厌麻烦的人比较适合做程序员吗

程序员是个非常有魅力的职业,他们写几行代码就能从零开始创造新的价值。从某种意义上说,这可以称得上是“发明创造”。

大家有时候也会谈论,适合这种职业的究竟是什么样的人呢?提到程序员,大家通常会有理工科大学毕业、宅、喜欢游戏等印象。事实上,在编程开发的前线,文科出身的程序员还是挺多的,也有很喜欢运动的程序员。

如果非要给出一个适合做程序员的条件,

我的第一反应是“讨厌麻烦”这几个字,也就是不喜欢重复机械的工作,希望尽可能地实现自动化。如果某个工作需要花费 30 分钟进行机械重复的操作,程序员可能会为了瞬间完成工作而花费 1 个小时来编程实现。大概就是这种心境吧。

代码行数越多越好吗

在真实的软件开发工程里,现在还有 LOC(Line Of Code,代码行)的提法,也就是根据代码行数来预估或者结算开发费用。当然,要累积一定规模的代码量,就需要投入一定量的时间,从而也就需要花费一定的开发费用。

这种做法还有一种好处,那就是谁都可以很方便地计量,并且给出具体数字,直观而易于交涉。不过事实上,1 行代码可以完成的处理也可以轻易地写成 10 行甚至更多行。

如果这个做法行得通,那软件公司的营业额完全可以用代码行数来计算了,但实际上这种做法不仅催生了大量劣质无用的代码,更为后期维护带来灾难。当然,代码怎么算,算什么也很有考究。是不是计算注释条数呢?每行代码长度怎么规定呢?使用什么编程语言呢?所有这些问题都会因程序员的不同而千差万别。

我觉得作为开发者,无论营业额如何,都应该怀着敬畏之心写出恰当的代码。

那程序员必备的技能又是什么呢?显然,程序员要读写源代码,所以编程语言的基础知识是必需的。面试的时候常常考察的“交流能力”等也可能很必要。

虽然本书讲的是与数学相关的算法趣题,但在实际开发中,数学的应用不会特别多。也许开发游戏的程序员需要具备坐标、旋转等知识,但大部分情况下都有很方便的工具库可以应对。

另外,由于开发的工程不同,需要的技能也会不同。做需求定义的时候,要有能编写易懂的资料的能力;开发测试用例的时候,又需要具备测试方法等技能以及“直觉”。

如果一个学生志在加入 IT 行业,他可能会去考取各种资格证书。不过我希望你们不要只学习编程本身。

一旦进入公司,投身工作之后便会发现,“了解工作内容”是至关重要的一点。

不了解工作内容,当要把承接的需求转变为程序时,开发者就无法和用户沟通。这么一来,或许连功能需求也会不尽明了。一定要注意一点,各行各业有不同的工作内容,如果仅仅在编程上下工夫,很可能会成为“派不上用场”的程序员。

编程语言的选择方式

世界上的编程语言有很多,所有的都学习当然是不可能的。因此从有代表性的编程语言里选出一门作为自己专攻的语言是很有必要的。从事编程工作的人可能有工作环境的限制,在学校学习编程语言的学生也有课程的限制,所以都不能使用指定语言以外的语言。不过,个人学习的时候,还是可以自由选取语言的。

没有一门绝对通用的编程语言,只有在某种环境、某个实现需求的前提下,才存在比较合适的编程语言。如果要实现一个 Web 应用,那么会有更多人选择 PHP、

Java、Ruby 或者 Perl 等,而不是 C。在主机编程领域,至今 COBOL 还扮演着重要的角色。如果追求处理速度, C 语言是一个比较合理的选择,而开发 Android 应用则一般会用 Java。

学习编程的时候,最好不要局限于某一门语言。

到国外去

大家都出过国吗?如果已经工作了,那长时间休假的机会就很少了。很多人即便假期很多,也会选择在家里待着,悠哉悠

哉。

我曾经不愿意出国。一方面觉得网上可以找到景点照片,另一方面,外国景点的商品也可以网购得到。有时候我会觉得,即便待在家里,和去过也没什么分别。不过,实际出国看过之后,我才发现,有很多见闻从网上是无法体会到的。

事实上,这个问题正是受我到西班牙旅行时看见的魔方阵的启发而来的。网上可以搜到魔方阵的事情,对它我也早有耳闻,然而实地亲身体验时,当地那种氛围和风俗人情等又给了我完全不一样的体会。比如,很多在国内时认为是常识的,到这里并不适用;再次认识到了自己的无知;在陌生环境下活动的紧张感;回到家后能感受到祖国的种种好处。

无论网络如何发展,始终还是无法替代“去过”“懂了”或者“见过”这些事实。虽然旅费不菲,但我觉得最终的收获是无法用金钱衡量的。

肯定有很多只有工程师才能感受得到的

东西,所以有机会请一定到国外去看看、去感受。

编程必备的文科和理科素养

提到编程,大部分人觉得是偏理科的。事实上,从事编程工作的并不全是理科技术人员。解决工作问题时,往往需要写不少规格说明之类的文档,这对擅长写文章的文科生而言,无疑是比较有利的。甚至可以说,从“学习语言”这一点来说,可能编程更接近文科的思维方式。

当然,编程在很多场景下也需要数学上的直觉。从宏观上来看,这些场景无外乎“计算”和“逻辑”。Computer 的其中一个译法是“计算机”,可想而知“计算”是多么重要的功能。从功能上来讲,说计算机几乎全是在作计算也不为过。

是“计算机”,可想而知“计算”是多么重要的功能。从功能上来讲,说计算机几乎全是在作计算也不为过。

从这个意义上来看,在“懂得各种各样的计算”“能运用各种公式”方面,显然理科式的直觉更为重要一些。像本题中出现的帕斯卡三角形,可能就是注重规律的偏理科的东西。

而“逻辑”指的就是解决问题时必不可少的逻辑思考能力。即便理解问题本身不难,也需要考虑采取什么样的步骤、用什么样的方法、如何简化问题等。

希望从事编程工作的人不要老想着“我是文科出身的”或者“我是理科出身的”,一定要兼具这两种思维方式。

大家有什么课题的时候,也可以试试“随时随地思考”。有时候我们会从看上去与课题毫无关系的事物上瞬间得到灵感。

太方便了就会懒得记吗

随着手机、智能手机、PC 的普及,越来越多人觉得“已经不会写字了”。我自己也觉得用手写字的机会越来越少了。

不仅仅是文字。十年前开车的时候,副驾驶座上的人还会一手拿着地图帮忙指路。而现在,很多车都安装了导航系统。方便的语音导航功能让我们不再需要费劲去记路线。不仅如此,似乎连方向感都跟着变差了。相比依赖地图的时代,现在似乎记不住那些路线了,或许应该说是“没必要”记了。

电话号码也“没必要”记了。手机普及前,很多人都能记住自己家里的电话号码。因为常常使用公共电话往家里打电话,所以可能是一遍又一遍按数字记住的。不过最近都用手机、智能手机了,只需要从联系人列表里找一下就可以。很多人甚至连家人的电话号码都记不住了。

编程也是这样。前几年代码还都要一行一行用编辑器来写,现在很多情况下都只需要利用输入自动补全功能,从备选的语句里选择一下就好了。这样一来,具体的方法名称等都不再需要记忆。直接使用高级语言里封装好的函数也是其中一个例子。

方便是方便了,但也许环境稍加变化,我们就不会编程了。平时一定要注意,不要只依赖方便的工具环境,还要锻炼应对紧急情况的能力。

多读一读英文网页吧

目前,日文的 n 进制数转换成格雷码的资料很少,不过英文版的维基百科(https://en.wikipedia.org/wiki/Gray_code )上甚至连相关的代码都找得到。或许常常参阅英文网页的人并不多,但代码是世界通用的,所以有时候用英文搜索一下也许就能解决难题了。

日本计算机行业的大部分产品都来自海外,使用手册也大多是从英文翻译过来的。当然,论开发人员的人数,日本远不及海外,所以日文的信息量也与英文的有很大差距。虽然日本也有新技术诞生,很多开发人员也在发布着各种新信息,但与英文相比,差距只会不断增大。

同是英文,读小说和读技术文章需要的词汇量有很大的差异。我读过《哈利波特》的英文原著,因为有很多不懂的词汇,读得很艰难。小说里有不少省略和特殊用辞等,单凭中学和大学里学到的语法并不能完全理解。而英文的技术文章里很多专业术语都有对应地音译为片假名的日文词汇,语法也相对简单。

我们可以从身边的产品使用手册开始读起。比如可以试着读 Windows、

Mircrosoft Office、Mac OS 或者浏览器等的使用手册。因为是平时常用的软件,所以它们的使用手册读起来会顺畅一些。

在编程相关的网页里,Stack Overflow(http://stackoverflow.com/ )是有名的技术问答站点。虽然这个站点也有日文版,但其内容量远远不及英文版。请不要再“因为打开的网页是英文的,所以把它关掉”,尝试读一下英文网页吧。

精通编程所必需的目标

由于日本文部科学省 11 也在推进计算机编程教育,所以学习编程的小孩子越来越多了。暑假的时候,全国各地都有基于 Scratch 等学习环境的编程讲座。

教育类企业也不断开发出面向儿童的编程教材,简单快乐地学习编程的环境正在慢慢地完善。这些学习环境利用的是虚拟角色等,因而视觉上也让人比较容易接受,不过仍然存在一个问题,那就是很难引导大家“进一步”学习。

也就是说,Scratch 等可以让大家觉得“编程是一件好玩的事情”,但无法进一步学习编程的小孩子也不在少数。很多小孩子觉得同样是使用电脑的话,编程肯定

不如游戏好玩。当我问这些小孩子为什么那么觉得的时候,他们说是“没有目标”。本身就“没有想要解决的问题”“没有想要实现的服务”等,因而也就“没有必要”编程。而这也正是编程初学者面临的情况。

“我们开始编程吧!”即使别人这么说,如果没有想要做的事情,那么也就没有动手的动力。如果没有目标驱动,也就没有必要学习新技术了。事实上,很多人都搞不明白“什么是必须要学习的”。这种问题的解决方法可以是试着开发一个小型服务,也可以是试着动手解决一些本书中的简单问题。大家不妨试一试。