坦白说回答都太片面了。。。

这也和现在分工越来越细有关吧。。。作为中国最早一批计算机专业的毕业生,从那个本科还软硬不分的年代,经历了整个互联网的辉煌。

虽然不再写代码了,但是还是常年管理有 coder 的团队,简单总结一下对程序员水平影响最大的几个能力吧。

1 快速原型的能力

快速原型是一切的基础。没有快速拿出可以迭代的最小可用化产品的能力,其他都是扯淡。

也许大团队还可以混混,但是无论是盖茨, Linus 还是 Hotz ,无论经历了多少代,你会发现这些最顶尖的传奇程序员中,快速原型的能力从来没有失传。

社交网络电影里,扎克伯格也完美的演示了,虽然 idea 都差不多,

但是在快速原型面前,

他有钱有团队有技术的同学,

也一样是战五渣

2 选择和搭建高效架构的能力

原型一时爽,迭代愁断肠。

程序员经历了多年需求变更和 debug 的毒打之后,其中高水平的,会在这方面有不小的进步。(所谓适应技术迭代,无非是这个能力下一个小小的基本功而已。。。)

需求变更和 bug 都是不可避免地,重构也时不时发生,这时候用敲键盘的速度去对应,已经不是高水平的表现了。

如何选择数据库,服务器架构,搭建业务中间层,规范大家的通讯协议?如何解耦整个项目,确保大家协同并且独立,能更快,更低成本的对应必然发生的变化?

高水平老炮,必然在这方面会积累非常多的经验教训。

3 完整和透彻理解原理的能力

计算机世界的所有基础不是 01,而是最简单的几个电路。如果计算机科班出身,那么会对整个计算机世界有着更加深刻的了解。

这时候无论是代码水平,还是架构能力,尤其是 debug 的方式,都会不一样

原理理解不透彻的程序员,往往会得出一些很傻的解释,比如几乎不会有人给今天非科班的程序员讲解什么叫线程的锁死,因为默认系统和框架能避免。但是只要是代码就不可能完美,在面临这种问题的时候,理解原理的程序员更容易正确理解和快速解决问题。

而很多软件的性能问题,其实用硬件考虑往往有意想不到的解决方案。。scalable做好了,海量服务器面前,性能甚至可靠性都不是关键。而长期的软件优化,可能还不如一颗 FPGA 来的痛快。

所以我一直认为,计算机专业的本科训练,对于程序员来说是必须的。

4 Trouble Shooting 能力

debug 是每个程序员的基本能力,但是我有幸做过几年 Trouble Shooting :他和 debug 的区别在于,需要在真实服务器的运行时定位,分析,处理和最终解决问题

而这需要考验你从基本技术细节,到系统架构,业务逻辑,计算机世界的基本原理,现实世界的抗压能力等全面的知识和经验。

能用比较短的年限胜任这种岗位的 coder ,一定都是高水平的。

那么你对他唯一存在疑问的,就是他的项目管理和组织能力了。

5 项目管理和组织能力

这个就很难说是纯粹程序员的能力了。但是和技术仍然有很大的关系

架构选择,技术业务方案的解耦合,scalable设计等等,都对项目管理的进度能管理好的项目规模决定性的影响。

我不看好非 coder 出身的软件项目管理者,这是最大的理由。(当然也要承认,从以往的经验看,往往非 Coder 出身的项目管理者,对需求有更好的控制力,这也的确相当重要。。。甚至更加重要。。。