程序员似乎是天生带有撕逼属性的群体,最经典的论战大概是围绕编辑器和编程语言的。例如「vim和emacs谁才是最好的编辑器」「PHP是不是世界上最好的语言」「Java和C++程序员哪个工资高」如此问题,年年反复。
技术的不断更新迭代,每年又会有新的技术加入到这个撕逼大战中来,比如「openstack」「docker」「Go」「Rust」等等,所以战争永远不会停息。而程序员们的撕逼和选择焦虑,也永远不会停歇,会随着新的目标的出现,延续着这些战火,像宗教一样传承给了一代一代的信众。
大概二十年前开始, 先是Java然后是C#就一次次被抬上C++替代者的位置, 以至于今日的Go/Rust/D/Dart/Swift的信众都宣称要替代C++, 但是C++在市场依然承担着极其重要的位置。这些新品种的大多数都昙花一现,只有有强大商业推动和布道的才在特定领域成为佼佼者,比如Python/Ruby/Go/Swift。他们在某些领域占领了市场,并服务者各种流量水平的服务。也正式这些新技术的出现,降低了程序员的准入门槛。
「没有目标」对于一个学习者来说是件可怕的事情,选定目标后,并站好阵营,在撕逼大战中维护自己,大概也不是一件太坏的事情。最坏的事情是一直在「目标选择」的焦虑中反复循环,一直在学习却一直在半途而废。大学时代,我曾经在选择「vim」还是「emacs」上焦虑了很久。最初的我的选择是「emacs」,因为用它编程似乎看起来「更酷」。花了大量的时间配置各种插件和快捷键,反复折腾,然而最终我并没有像黑客一样在黑色的屏幕上「啪啪啪」地快速编程。同样的经历在它的宿敌「vim」身上遭遇了一遍。而我真正熟练使用「vim」则是工作后有大量在开发机上编程。
然而,又有大量的人却本末倒置执迷于「撕逼」本身,享受着工具带来的「虚荣感」。有一种似乎使用这些工具就「更牛」的错觉。没有「Maccbook Pro」和「HHKB」的程序员,大概和他们是没有太多共同语言的。他们对此津津乐道,为了在工具链的配置上让自己看起来更加「Geek」一点,他们劳心劳力,甚至不惜奋斗在「撕逼」第一线,大概是非要跟用「Thinkpad」「Windows」「Visual Studio」的人分出个高低来不可。争论当然不止是工具链本身,就连「缩进」是使用「2个空格」还是「4个空格」亦或是「一个Tab」,就有不同的大牛支持着不同的阵营。在知乎上就有轮子哥和老赵为首的微软党,也有整天以黑微软为乐「30岁了找了份Java开发工作月薪两万没过试用期被开除」的老赵真爱粉, 实在是欢乐极了。
选择编程语言则是更难的事情,有些派系认为底层的技术才是最根本的东西,所以他们大概会支持「C/C++」甚至「汇编」;有些派系则认为时代在进步,一切旧时代的产物终将被抛弃,他们热衷于新技术;还有些派系则认为背后的编程思想和计算机科学理论是最根本的而语言并不重要。大概是中国人从小就没有自己「做决定」的习惯,人生中的大多数选择都是父母和学校已经安排好的。面对这种选择,「焦虑」和「恐惧」可想而知,我们需要别人的首肯和支持。然而各种理论和学习路线都有「大牛」支持的情况下,这件事就变得更难了。
我大概同意「更重要的是背后的编程思想和计算机科学的基础理论」这个观点,然而我并不反对对新技术的学习和尝试。「因循守旧」是可怕的,对于日新月异的技术领域尤其。对于一个新人来讲,选择任何一个编程语言或者技术方向,进行大量的实践和探索,都足够你找到一份谋生的工作。对于一个有经验的工程师,这种探索也是有益的,有助于我们吸收不同的设计思想和技术,思维也始终保持在时代的前沿。同时,加上过往积累的经验有助于我们判断他能否替代我们产品中的某些模块,能否提高生产力和性能。
这几年开源社区大量优质的项目完善了互联网产品开发的各个环节的工具链,这也是为何这几年市场上突然出现了大量所谓的「全栈工程师」的基础。然而我从不认为能同时写安卓「app」,「Javascript」写前端页面,「Ruby」写服务端的人就是「全栈工程师」。一个优秀的工程师当然不该只掌握一门语言和一个工具, 但是也不必追求「全栈」。一个服务端工程师的最基本的目标应该是做出高性能高并发高可用性的后台服务,这就需要了解除了编程语言以外的诸多模块比如缓存/消息队列/应用服务器/负载均衡等, 而不是什么都不求甚解时便去抢前端程序员的饭碗。当然,许多前端程序员也做着「JS」一统前后端江湖的美梦。我想,首先在自己核心的领域上获得核心竞争力是更重要的事情,之后再去拓展线路,才会得到应有的收益。
「拖延症」则是目标选定后的另一个「大敌」,这几年我一直想在github上写出自己高star的项目来,然而这个计划一直被拖延着。甚至,已经有几个学弟在我的建议下,在github中创造了很多有意思的项目,并因此获得许多关注和工作机会。当然,一件事情如果没有持续的驱动,大概是很难完成的。
对的,我只是说说,好多事情我也没做好。
工作后每天都忙于琐碎的事情,工作或者生活,都不会思考了。最近开始学习tiny叔在公众号中写一些自己的思考, 搜索微信公众号「stackpush」或者「靖难」可以找到我。
1楼 @brambles 欢迎指教, 学得确实不多, 也不够深.
我一直做的是推荐系统和搜索架构两个方向, 所以比较关注数据科学和AI, NLP相关的研究, 这几年的成果非常多, 有很多突破性的实验结果. 我自己感觉到几乎不能停止对新的研究成果的学习, 否则很快就跟不上了. 各种分布式计算框架的出现, 还有GPU的性能和体系结构进步, 对我们实践中算法的改进帮助也很大, 很多以前得不到的结果现在可以快速算出来.
同时在基础设施和架构以及运维方面, 也有很多新技术出现, 可以替代旧技术并提高生产力和性能, 这方面我关注少一点.我们公司比较变态, 喜欢自己造轮子, 基于这些最新的思想做了很多内部的基础设施, 非常先进.比如百度最新在内部推广的Matrix和bigflow.
所以我的感受是「日新月异」,必须保持学习,才能跟上时代步伐。
不过可能我工作也才3年, 看不到本质的东西,欢迎讨论.
上一条已经更新。我感觉变化最快的是数据科学、CV、AI技术、基础设施和架构,这几块也是对我工作影响比较大的。十年前的架构和基础设施,已经完全不能满足现在的流量水平。虽然百度也热衷于改进架构和基础设施,改进分布式计算框架等,但是大体上感觉比google还是要落后5年以上, 所以我个人以为我们必须学习最新东西来提升我们的服务,在实践中也是这么做的。
日常所用的基本的算法和数据结构、系统的体系结构、编程范式,大体是没什么变化的。但是实际业务场景中使用的应用技术,则是变化非常快的。
但我以为未来的程序员分工会更专业化和精细化, 这几年也明显有这样的趋势, 我们也大量招聘许多细化研究方向的工程师, 纯粹的feature developer可能会是比较低端的工种.