程序员的核心能力

程序员要掌握的知识,要具备的能力实在太多,多得头发都不够掉。

大体有两大方向。一是对工具的熟练掌握,如操作系统、网络、IO、编程语言等;另一个是用代码为现实问题生成解决方案的能力,这其中最重要的是抽象能力。

前一个方向是很容易意识到的,很多现象可以说明这一点,比如,世面上介绍如何使用语言、框架的书汗牛充栋;比如,很多人眼里进这一行的门槛是上1个月的语言培训课。

工具的意义不容否认,为此我还写过一篇《工具优先》。但工具的生命周期其实很短,从个人发展角度看,把过多时间投入到半衰期很短的事物上,并不划算。我入门时接触的是Pascal, BasicScript, ASP, IIS,不知道现在还有没有人用这些。很多程序员也赶时髦,本来写java的,golang流行了,python流行了,学!本来搞业务开发的,大数据火了,机器学习火了,学!打的旗号自然很鲜明:持续学习。几次之后,却怅然若失,貌似没一个是拿得出手的,不过是低水平重复,换个工具,继续做原来的事而已。充其量效率提高了,但效率型工作是可替代性最强的,被其它人替代,被机器替代。

一颗上进爱学习的心,怎么就被辜负了呢?因为核心能力没有提升。人的能力好比电子围绕原子核旋转,大部分情况下处于巡航状态,在这过程中不断积蓄能量,始终向核心方向用力,就会跃迁到更高级轨道(这里指更靠近核心的轨道,实际电子是更远离核心的道)。“一万小时理论”和“10万行代码理论”只片面强调了量,如果没有聚焦核心,刻意练习,只能是低水平重复,甚至轨道降级。

核心是抽象能力。这个世界的运行,有讲逻辑的,也有不讲逻辑的。程序员要处理的事是讲逻辑的那部分,因为你所依赖的计算机是讲逻辑的,要让它意气用事,感情用情,目前还很困难。通过抽象,我们识别并保留逻辑部分,抛弃其它内容,然后用计算机语言翻译、实现这个逻辑,进而解决问题。

抽象这个词,本身就挺抽象的。到底什么是抽象?

抽象是去除多余和细节。比如下面这个标志,一看就懂是座拱桥,但并没有显示拱桥的幅度、宽度和长度,因为这些数据对于你意识到这是一座拱桥并没有帮助。

什么是多余信息,取决于目的。考虑地铁换乘图,其目的是告诉乘客该搭哪条线,在哪里换乘,所以保留了结构关系:站点的分布,以及线路的汇合点,但忽略了物理关系:站点的地理位置、相对距离,甚至扭曲了线路的方向。而如果是开车用的导航图,则必须保证比例尺和实际情况一致,方向也不能有差错,以免误导。

抽象是建立模板或蓝图。不少公司里有邮件模板、文档模板、PPT模板、报销单模板,等等,它们规定好了结构、风格,并留出一个个空白,使用的时候填空就好。模板描述不变的内容,变量则延迟到使用场景中确定。Java编程时,经常要应用各种设计模式,其实质是通过抽象,固化不变的,封装变化的。比如,很常用的模板方法,流程和步骤无论什么场景都不变,已经在父类写好了,将具体场景的方法在父类里声明,但延迟到子类实现,封装的是方法实现。又比如,创建对象时,不常写new Tesla(),而是运用简单工厂模式,写成TeslaFactory.create(),因为对象的创建是易变的。与其在特斯拉多一个型号时,把所有new的地方都改一遍,不如在create方法里集中改。

总之,抽象是应对变化,或者说寻找不变性的手段。既可以是不同事物之间的不变性,也可以是同一事物不同历史时间的不变性。虽然这里讲的是编程,但其应用远不止于此,看看贝索斯是怎么说的:

我常被问一个问题:“在接下来的10年里,会有什么样的变化?”……但我很少被问到“在接下来的10年里,什么是不变的?”我认为第二个问题比第一个问题更加重要,因为你需要将你的战略建立在不变的事物上。

有了上面的解释,便不难理解面向对象编程的原则:依赖接口而不是实现,依赖抽象类而不是具体类。它让代码的适应性更强,将来少改代码,少出错。同时,做一些参数设定时,更加有理有据,而不是trial and error。线程池大小怎么定?不用关心具体工作,分析阻塞和非阻塞的时间比例,应用Amdahl’s law搞定。队列大小怎么定?不管究竟放的是什么,确定你期望的排队时长,用Little’s law算下。

世面上鲜有讲如何培养抽象思维的书,设计模式一类的,算搭一点边,但那是人家抽象的结果,而不是关于抽象的方法。也许我们在运用这些模式,或浏览一些工具和类库的代码过程中,偶有灵光一现,能从这些结果中反推作者的设计思想和精妙之处,毕竟它们也是抽象的结果。

学习使用工具时,如果多个心眼,留意为什么有这个工具,做了什么取舍,工具于你将不仅是效率意义。做业务开发时,如果不是简单地翻译需求,多想一层,哪里易变,哪里不易变,如何隔离变化,再简单的开发,于你也有精进意义。

抽象的层级可以有很多,能做多少层级的抽象是一种能力,而判断需要多少层级的抽象则是一种艺术。

地上一个猴,树上七个猴,一共有几个猴?1+7=8,一共八个猴,用数字符号代替猴子,这是第一层。从对象到数字,大多数人对此熟悉到甚至没有意识到这是一种抽象。再进一层,则有些困难了,当初我理解“加速度”这个概念,就费功。不光是数量,还有结构的抽象,关系的抽象。当然,它们离我们都很远……

可是,真的很远吗?当大部分人在关心如何写程序时,有人开始研究如何用程序写程序,当大部分人在关心如何看书、学习时,有人在教别人看书、学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容