(1)什么是真正的编程能力?
知乎上曾经有人问过,什么是真正的编程能力,答案有很多,比较有代表性的观点有这几种:
第一种观点是,编程就是数据结构和算法,第二种观点是编程能力就是系统集成能力,第三种观点是从软件工程的角度出发,分析建模能力和写高质量代码(可维护性,扩展性等),还有一种观点是很抽象的解决问题的能力。
其实每一种看法都有他的道理和逻辑,但是总是让我觉得不够全面,最近一段时间重读《深入理解计算机系统》,看到推荐序里上海交大软件学院院长的一段话对我很有启发,我尝试来说明一下我的观点。
计算机系统本身就是分层次的,不同类型的软件开发对编程能力的要求是不一样的,但是核心的共通点在于抽象。我们可以把计算机中的抽象能力分为三类,第一种是问题抽象,强调的是软件工程师作为沟通机器世界和现实世界的桥梁,需要具备的将现实问题转换和翻译为计算机中的软件抽象的能力,也就是软件工程中所谓的“需求分析”和“建模”,更细化就是运用主流的面向对象的方法来做总体设计。
第二类就是数据抽象,核心是对数据结构和算法的选择和模块化设计(高内聚低耦合,可维护,可扩展等)。数据结构和算法的选择强调的是对设计的决策,你作为一个软件工程师,需要选择符合要求,时间复杂度和空间复杂度都尽量好的数据结构和算法,让软件能有比较好的工作效率,要能达到这样的效果就需要不同数据结构的适用范围和效率都有比较好的掌握。模块化设计则是考察一个软件工程师两方面的能力,一是能否合适的控制复杂度和二是代码质量如何。
最后一类就是系统抽象,核心在于学习和理解系统对程序的支持和制约。计算机系统本身是分层的,第一层是硬件和指令集组成的,我们可以把它称为汇编虚拟机,第二层就是操作系统提供的虚拟机,核心在于进程,虚拟内存,文件三个抽象,以及系统调用,第三层就是编程语言提供的虚拟机,这一层通常都是用软件来模拟硬件,并设计了指令集来达到良好的可移植性,比如最典型he的的Java,第四层是我自己的一种看法,其实就是开发软件所用的框架,框架也为开发者提供了封装好的接口和软件抽象,同样具有系统的特征。
那么系统抽象为什么重要?我之前也比较困惑于学习底层原理究竟有什么用,最近重读《深入理解计算机系统》有了一些更深的体会。从一个使用者而非构建者的角度,理解学习底层的意义在于,了解系统对程序的支持和限制,以及对程序正确性和效率上的制约。简单举例子,为什么两个大数相加之和在计算机中有时候会是负数,就是CPU加法器的局限性,不了解这种局限性就可能会导致bug,再比如高级语言都提供了一组使用方便的数据结构和容器,而他们的底层实现对他们的效率影响巨大,如果不了解,就不可能在选择决策时做出最优解。所以至少来说,作为一个写应用程序的软件工程师,你至少对使用的框架有源码级的理解和掌握才能确保高效和准确的使用它。
(2).程序员是否是一个好职业?

知乎上对程序员这个职业的看法,有两种比较极端的观点,第一种是劝退:程序员就是青春饭,三十五岁不转管理前景惨淡。第二种观点是劝进,穷就学计算机,前景光明,年入几十万。

这两种观点其实都隐含了一个很微妙的看法,可能也是共识——计算机相对来说是理工科里面比较简单的,自学计算机是可能的,自学其他更难的工科,比如飞行器设计可能么?所以一方面因为简单,所以容易变成青春饭,另一方面因为简单,所以才能有大量的非计算机专业的人成功转行。

如果这两种观点都是正确的,那么程序员这个行业究竟是怎么样的?我们可以大概猜测一下:假设一个人是非计算机专业,他18岁左右上大学,22岁左右大学毕业,大学期间或者毕业之后决定转计算机,途径可能是自学,可能是培训班,也可能是考研计算机专业,取个平均24岁入行,到35岁之前有十年的工作时间,假设工资能到每年平均二十五万,十年时间大概赚250万,然而同时软件行业发达的城市集中在一二线城市,房价高生活成本高,这两百五十万扣去花销,十年之后基本也不剩多少钱,如果上面第一种观点是正确的,三十五岁不升管理就失业,基本就是中年危机开始了,推论就是学计算机前途好就是伪命题。如果三十五岁不升管理不会失业,推论就是程序员不是青春饭。

那究竟哪种说法是对的呢?我觉得是受几方面的推力影响,第一是人口老龄化带来的劳动力压力,决定了有经验的程序员不会被轻易淘汰。第二是技术进步带来的人和软件的竞争压力,就像随着工厂自动化淘汰了低端工人,随着软件业各种基础设施(云计算平台,软件厂商)和开源软件逐渐成熟,绝大多数程序员的工作谈不上太高的技术含量,对于大多数没有太多用户的公司,也不用考虑什么优化和效率,只用完成基本功能,这事实上就是一个向下的压力。第三就可能更加虚无一些,假设未来新的技术带来新需求,能够让程序员这个行业保持高薪的同时,还能容纳下更多的人,程序员也就能一直繁荣下去。

目前我们可能就刚好处于这样一个转折点,移动互联网带来的红利已经逐渐耗尽,云计算大数据这些几年前还是概念的东西,已经成为日常生活的一部分,而新的技术比如:区块链,深度学习,vr逐渐冷却,并没有能成为预期的新增长点,另一方面5G,物联网,无人驾驶似乎已经开始走向成熟,可能成为新的经济引擎。
所以结论呢,就是没有结论,谁也不能准确预测未来。最后引用我写过的一段话作为结尾:

洪流已至,无法逃避,勇士请拔剑高歌。

所以,勇闯新世界

更多推荐

【随笔】编程能力和程序员