冬练三九、夏练三伏,这样才能练出来真功夫。—— 赵丽蓉
上一篇高效开发的核心,说了贯穿整个编程生涯的高效开发习惯问题。 而还有很多能力,和高效开发的习惯一样,都是在日积月累中慢慢磨炼出来的。 但这些能力,往往初时觉得多余,可当你真的有了这项能力,才知道它是多么得重要。 我将这些,称为编程的 内功 ,希望可以通过我的描述,让很多新手意识到这些内功并非可有可无。
有个常被新手问到的问题:数学不好,能学编程吗? 这事儿怎么说呢,也能学、也不能学:
- 编程对数学基础要求很低,小学数学的程度其实基本就差不多了,否则就不会有那么多小学开始学计算机竞赛的孩子了
- 但数学不好往往意味着你的逻辑思维能力差,而编程对逻辑思维要求很高,因此数学不好编程一般也学不好
那么如何进一步锻炼你的思维能力呢?其实很简单:
- 在纸上写代码,写清楚了再敲进计算机
- 用脑子查bug,找到问题所在了再去修改和验证
长此以往,你的逻辑能力会得到显著的提高,由此可以带来非常多的好处,包括但不限于:
- 代码写完很容易随便调试一点细节就运行通过,而且bug数量非常少且往往不是什么大问题
- 解决bug的思路非常清晰,解决过程几乎不会有什么瞎搞的废操作
这就是为什么,现在编译器的调试系统如此发达,我却依旧强调脱离计算机编程的重要性。
当你成为一个五年、十年甚至更久的程序员时,你会发现环境已经和你刚学编程时有天壤之别。 我不讨论到底是进步还是退步,因为往往同时存在,这取决于你看的角度; 而最关键的,你会发现你手边的工具、依赖的知识、合作的伙伴、所做的业务都已经完全不一样了。 这时候,请问,你的很多经验是不是就没有用了呢?比如:
- 某个IDE的操作方式
- 某种小团体内定下的写代码方式约定
- 某类业务的常用处理逻辑代码
如此一来,你还能留下的那些通用能力就显得极其重要了:
- 对计算机各领域原理性的理解,很多是可以融会贯通的
- 对计算机领域最通用的基本工具、知识的了解,往往是还有意义的
- 对业务处理思路上的经验,在另一类业务中也很容易借鉴
因此,都是十年的程序员,无论是自愿还是无奈,当换到全新领域的时候:
- 通用能力强的,就至少相当于新领域的八年程序员
- 通用能力弱的,就只和新领域的两年程序员在一个档次上
你说,通用能力重不重要呢?
浩如烟海的专业术语,是我曾经比较反感的:
- 明明那么简单的事情,非得起一个名字,我不知道就没法和专业人员交流,这不是没事儿找事儿吗?
- 我知道这样交流会快一点,但就快这么一点,真的有什么意义吗?
可慢慢,我体会到了快这一点究竟有多大意义……因为科技人员的交流是非常艰难的事情。 每个人理解一个事物的思路都不同,但生活中事物就这些,所以大家日常交流根本不需要什么术语,简单描述一下就都知道在说什么了。 但我们也都知道,如果两个国家的人,交流起来就很费劲,因为大家用词、经验、文化差别太大,很难互相理解。 那么科技人员呢?你以为他们是身边的人,实际上交流的时候常常就像两个国家的人,因为:
- 科技知识是浩如烟海的,大家学习的内容、思路都大不相同
- 大家用词、经验也都不一样,甚至思路、判断上习惯都相差甚远
- 而交流的东西,往往都是一些很具体的知识点,还有很具体的思路和做法
所以,有很多很多确定的概念术语,就成了交流的唯一途径。否则,根本难以让两个领域相异、并不熟悉的人相互交流。 因此,对各领域概念有一个清晰的掌握,这成了科技人员交流的核心能力,甚至远远超过了言谈本身。
大楼不是一个人盖出来的,大多数软件也不是一个人能写出来的,所以合作是必不可少且极为重要的。 但因为技术是非常具体的东西,细节太多,所以每个人处理方式都有大大小小无数差别,习惯极为不同。 那么,合作时就需要很多优良品质,包括但不限于:
- 对不同代码风格的适应能力
- 对确定的需求所衍生出无数种做法的接受能力
- 对不同思路的接受能力
- 对不同性格的主观偏见不能带到事情上
等等等等…… 真正合作的时候,你会发现能有一些相同的认知和思路是非常棒的,但不同才是常态。 不能接受不同,你就无法合作 因此,合作绝对是一项能力,而且对个人性格的考验非常大,很多科技人员都在这一点上令人堪忧,希望你我不是其中一员。
说了这么多内功,如何锻炼呢? 这事儿我真的很难一一描述,因为每一个都可以单起好几篇文章来描述…… 就算是身边的学弟学妹,我也只能在日常工作学习中潜移默化地指导,毕竟是思路上的启发,实在是难以精细描述。 我只能提纲挈领地说:你要真的认识到它们的重要性,并且真的重视,去找到适合自己的路线,别无他法。
只是内功,毕竟没什么用。 工作中的核心,还是各领域的专业知识。 那么下一篇,我们就来聊聊:领域专业知识的学习。