当你搬到一个新城市,不知道最近的便利店在哪。你不会因此自责——毕竟这很正常。你只要打开手机地图就能找到它。等你去过几次以后,很可能就不用借助地图了。
其他地方也是一样,比如最近的餐厅或者健身房——刚开始你可能要用地图导航,等你熟悉了它们的位置就不需要导航了。
你知道怎么找到它们,但你并没有刻意去记每一条马路、每一条可行的路线。还有些地方你去了一次就没再去了。
当你使用一门编程语言调用各种语法时也是一样的。
新的程序员/软件工程师/开发者可能因为没记住足够的语法而感觉很糟。他们发现自己仍要参考文档,于是觉得自己不是一个好的开发者。
以下是他们开始编程之旅时可能有的几个常见问题:
当能记住一些常用语法时,他们可能觉得自己已经成了编程高手。在他们的印象里,能记住多少语法,或者能掌握多少不同的编程语言和框架,就是真正重要的事。
为了说明问题,我们来比较一下不同的编程语言是怎么获取字符串长度的:
seq.length -- JavaScript lists, Java arrays.
seq.size() --- Java sequences,jQuery expressions (deprecated).
len(seq) -- Python.
seq.count() -- Django querysets.
SeqType'Length -- Ada arrays.
length seq -- Haskell.
(count seq) -- Clojure.
sizeof(seq)/sizeof(seq[0]) – C,statically allocated.
strlen(seq) --C, null-terminated.
如你所见,为了获取字符串长度,每一种语言或技术都有自己的语法。这说明,同时记住某个函数的12种版本真的很难。
一个使用过多种编程语言的开发者,不太可能把过去用过的所有语法都背下来。他们甚至可能本来都懒得去学。
语法有那么重要,以至于我必须记住吗?
为了回答这个问题,我们来看看一些资深工程师是怎么说的。
“我是谷歌的团队主管,有超过30年编程经验,但是我仍然需要去查怎么得到一个Python字符串的长度。”——Tim Dierks
“我写了将近8年的Objective-C,仍然需要用谷歌去查objc的block语法。”——Lukas
“我是将Node.js部署在商用飞机上的人。然而我现在还是不懂.substr()和.substring()的区别。甚至写这句话的时候我还得查一下‘substring’的大小写规范是啥样。”——JP
“我是Phunware的安卓主管。不借助StackOverflow我就没法去读一个输入流。”——Jon
“我是纽约时报的GDE工程师,也是主管,我不懂什么是np。我应该懂吗?”——Mike
“在12年的JavaScript开发中,我总是被substr()和substring()弄糊涂,总是需要到网上来确认。”——Faisal
“我写了6年JS,我仍然需要去查不用fetch或者jQuery的话怎么做AJAX请求。”——Dominik
“我从1979年就开始码代码了,我仍然得查java.lang.String的用法,一直如此!”——Tim Bray
“我写了255行代码,其中包括一个可以运行的服务器和一个客户端。我在谷歌上查询了23次,大多数时候被引到StackOverflow、Netty 4 网站、GitHub和JavaDocs上。你算一下,平均每10行代码就有1次查询!“——Umer Mansoor
“假如我告诉你我用谷歌查什么,你一定会把这当成‘证据’,证明我不是‘真正的’工程师。”——Erica
“我经常把O(n)以及诸如此类的东西混在一起。尽管我能写出一个for循环,谷歌也用得很溜。”——Scott
这些坦诚的话应该能给你勇气——你不必为记不住每一个语法细节而感到羞愧。
可能很多初级开发者都担心这点。但事实是,你真的不需要记住所有的东西。
甚至技术招聘人员也不关心这些。下面是谷歌的那位工程师主管对此的回应:
问:“假如我又要被谷歌面试一次,我能要求编程面试搞成开卷,好让我得以通过吗?“ 答:“我经常告诉应聘者们,我并不在乎任何IDE可以帮助你完成的事情。”
下面的引述来自Hacker News网站,是对“有经验的程序员会经常用谷歌吗?”话题的评论:
我不光经常用谷歌,我甚至用它来搜我自己过去写的东西。好多次我搜一个编程时遇到的疑难,结果在Stack Overflow上找到了我自己写的回答。如果这个回答特别古老,以至于我已经完全忘记了,我甚至会想,“哇,这个天才讲起话来跟我很像!”又或者“这个笨蛋根本不知道他在说什么!”。
几个月前,我在Facebook的一个群里看到一个资深开发者的帖子,里面提到当招聘人员问他有没有某项技术的经验,而他并没有时,他回应道:“那不过是又一种工具。”
意思是说,我过去可能没有机会用到它,但我有信心能学会。我不需要花上几个月才能用它工作。我可能只需要几个小时来读文档,然后边干边学更多,而不是先把所有的东西背下来。
这就好像当你启程前往目的地时,你不会指望一路绿灯。你会通过当前的绿灯,然后在碰到红灯时停下来,等到绿灯亮了再继续行驶。
今天,我们不断有新的编程语言、新的框架,已有的语言和框架也会有相当大的改动,这样一来,记住语法不但是困难的,而且也没那么重要了。正如一位评论者在这篇博文下方精辟地指出的:
“杰出的工程师懂得如何提出好的Queries。然而,面试官们期待的却是行走的活字典。"