“给服务器开发的应届生泼冷水”之我见 - 飞龙
原博客:写给那些傻傻的,想做服务器开发的应届生
1
还有一些同学想做大数据分析,如果你写过 MapReduce 程序就不会这么想了。现在的 MapReduce 程序写起来太 easy 了,很多时候简单到你就只需要写一条类似 SQL 的查询就行了。
我知道这些轮子非常易用,然而数据分析远远不是会用轮子这么简单。
传统的数据分析需要借助概率统计的模型,比如参数估计和假设检验,理解他们很简单,甚至你并不需要理解,直接套公式就好了。大数据分析也就是把概统的模型换成了 mapreduce 这样的轮子,其他呢,一点也不变。
但是数据分析需要在数据里面挖掘规律,更本质一点来说,需要决定在各种各样的数据面前,使用哪种算法或者轮子。这一点,我估计没个几年的不断尝试,不会有这样的经验。就像你会写顺序条件和循环三种语句,但是知道什么时候用什么,需要项目经验。
2
刚刚说到服务器端复杂,这带来的结果就是分工与细化。每个做服务器开发的同学,可能只会涉及服务器开发的某一部分的业务逻辑和功能,甚至是某一部分业务逻辑的某一层。比如我在网易邮箱做服务器端开发时,就只是负责 Restful Api 这一层的开发工作。
正是分工与细化使得后端更简单。比如后端负责业务逻辑的就不用管大量用户并发这件事,因为这是架构或者平台支持部门的事。如果一个后端开发者一上来就要和底层打交道,或者处理优化,我想就没有人写后端了。
然而几年之后,由于写应用的人多了,其中有一些经验的人可能会往架构方面转;但如果他去了前端或者别的什么岗位,转起来就会比较困难。
从业务上来说,将复杂的系统拆分,然后每个人做独立的某一块当然是好的。但是对个人来说,服务器端开发却使终是一块迷雾环绕的大山,在这座大山上,你对你走过的路线很熟悉,而那些你没有接触过的服务器端技术,你使终是不清楚的。
首先纠正一点,拆分系统不是业务上的东西,是架构上的。
我想一个优秀的程序员,应该不仅仅满足于学习能够挣钱的东西,在公司中使用的东西。我的意思是,他一定会涉猎底层也是更高阶的知识,比如说所依赖的server和os是什么东西。我所了解的程序员不少都是晚上或者周末看书,那他们完全有时间去了解这些东西。
在计算机领域,一切都是分层的,甚至连计算机本身都是分层的。就算你搞清楚了server和os,底下还有cpu和半导体等着你挖掘。所以千万不要试图精通整个体系,穷其一生也学不完。
3
但是,正因为客户端需要密切和产品经理,UI 设计师打交道,所以他们会频繁接触到产品设计思想和设计思想。这使得客户端的同学更加容易学习和积累编程之外的技能,包括产品和设计的思想以及沟通能力。另外,因为用户的 bug 都是通过客户端反馈,客户端同学还更容易接触到真实的用户。
所以相对于服务器端同学来说,客户端的同学的眼界更宽,由于非技术方面的沟通更多,所以他们的非技术方案的成长也越多。
后端不必前端的非技术因素少。前端有 ui 和 ue 。但是业务逻辑可都在后端。比如一家4s店的处理销售流程软件,业务逻辑肯定在后端,不可能放前端去。就算服务端程序员只参与执行,那他们能够跟产品打足够多的交道了。
一般来说,开发是产品的下游,移动端是服务端的下游。移动端调用服务端的api,所以除了你那点可怜的交互设计,剩下的东西完全取决于服务端的接口怎么设计。实际上移动端是跟服务端打交道,所以才有“前端改接口要请后端吃饭”的桥段。
当然这也不是绝对,因为对于工具类的app而言,移动端才是主导。但是现在互联网公司的app,工具类的恐怕少之又少,大部分是给服务端做个展示层罢了。
再者说,提升非技术能力的最好办法也不是做技术。假如我要提升业务水平,上几门相关的课比什么都强。
4
服务器端的技术长久发展的结果就是,基本上每个业务需求都已经有现成的轮子了。所以做服务器端开发很多时候就是学习各种开源组件的用法,并且熟悉这些组件的一些性能特点和坑。
你以为这很容易吗?其实不是的!这些轮子发展那么多年,已经非常复杂了,光 Spring 就包括非常多的特性,写一本 1000 页的书来介绍它也不为过。如果不是多年的使用,你能搞明白它的各种功能的优缺点吗?如果你搞不明白,遇到问题的时候除了抓瞎还能干嘛?
web应用的框架,说白了,不过mvc而已。服务端的工作,我说的是开发而不是架构,不过curd而已。之前一个框架的学习经验完全可以无缝迁移到之后的框架,甚至可以跨语言迁移。因为都是一个level的东西,设计思想也是一样的。
1000页的书在编程书里面多得是。就算你不搞spring而是搞安卓,都得学java,java的书《java核心编程》两本加起来也得一千四百页了。当初几本1000页的书都都过来了,还怕spring那1000页吗?
5
还有一些应届生觉得自己在学校做过网站,觉得在服务器开发方面有基础,做这方面更顺手。NO!企业里面的服务器开发完全不是你想的那样,基本上大家在学校做网站的经验等于零。
我只是说一个事实,我们这里大二就去实习的不少。如果企业里面的web开发不是平时做项目的那样,我想就没人去了。
事实上,我们学的一般的人不仅能胜任,而且还觉得“对技术提升没什么帮助”。原因见上面一条。
更不要提那些在学校就开始做项目的人了,没听说过他们当中哪个进了公司还不适应的。
那么下面我们就仔细分析一下倒底哪里不一样。
规模。规模只意味着功能的堆砌,web应该从1k行代码到100k行代码,技术复杂度都是一样的。
可用性。你说的是开发,负责大规模并发是架构的事。只要开发不写非常愚蠢的代码就行了,而在review下面写出这样的代码是非常困难的。
可维护性。框架的作用就是强制你高度模块化,来保证可维护性,这个没什么说的。
真是无稽之谈。
我并不是要为web开发者正名。只是作为曾经是这个方向的人,看到这样充满谬误的文章,有些不爽,不吐不快。仅此。