感谢有这样的机会,能和大家一起来聊聊开发者的那些事儿。
其实程序员危机是一个真实存在的问题。也有人说是互联网行业的下滑或者互联网行业已过了风口等等。我在这儿主要谈的是 PHP 程序员的危机,而这种危机多半来自于丰富的语言种类和公司对语言的选择上。
尤其是近几年非常火热的人工智能,机器学习等等,还有推上风口的 python。这多少会带动一些人盲目跟风。其实开发工程师对自己知识体系的扩充和转型都需要有一个明确的目标。跟风是一件比较危险的事情,转型也不同于丢掉自己所有的东西。我想通过程序员的诞生和程序员的成长来讨论,究竟该如何选择。
我将从以下几个方面来说明:
- PHP 程序员的现状;
- 什么导致了程序员的分层;
- 高级工程师需要达到的要求;
- 程序员如何快速成长;
- PHP 程序员渴望的蜕变;
- 干货,你需要的转型路线;
- 总结。
PHP 程序员的现状
现阶段大部分 PHP 程序员都比较迷茫,初级 PHPer 觉得这个行业难,中级 PHPer 大都想通过学习来提升自己,但往往会陷入今天追这个技术明天追那个技术的一种情况,高级 PHPer 大都有了自己的知识体系,部分在架构的位置。
程序员对自己的行业认识是非常重要的,也就是职业生涯规划。这是一个比较难的问题,因为要对自己的职业有所规划,首先要充分了解行业。这一点和当初为什么选择做程序员有很大的关系。
一般来说,如果你很难熬过开发生涯的入门期,可能说明你不适合这个行业;如果你无法通过蜕变期,你可能就不会有太大的成就。
每个人开发生涯的入门各有不同,一部分人是对于这个行业感兴趣自己心中也有一个目标,虽然没有清晰的职业规划,但至少会有一个该领域的偶像。还有一部分人是经过三、四个月的培训进入这个行业的。
我之前用重庆互联网学院中某家培训机构(YMSD)的数据分析过,在这部分培训进入行业的学生中 2 年后还在这个岗位继续发展的学生仅仅占有 20%。也就是说 80% 的学生花钱花时间只是做了回陪跑员。这也从侧面说明,如果我们进入这个行业,除了期望让自己能够挣到很多钱,也必须对以后的发展有个预期。
一般来说,通过培训入行的开发人员在工作中会走得非常艰难,因为他们没有技术路线的体系目标,而在线下培训机构中接受的是一味地模仿,非常缺乏创新能力。而且据我所知,大部分线下培训机构的课程体系至少和企业场景脱节 5 年。所以这部分程序员更应该努力改变自己的现状,明确自己的处境。
什么导致了程序员分层
程序员分层是一个非常明显的问题,在公司里直接的体现就是同一类程序员的职位差别非常大或者薪资待遇非常大。
导致这种分层的原因是什么?
第一类原因就是程序开发者的工作年限。
其实工作年限也不是一个非常重要的因素,确实在之前的面试中,我们遇到过工作年限只有一年但是非常优秀的开发者。但凡是使用求职软件时就会发现,几乎所有的职位描述里都有一个指标——工作经验年限。
为什么有这个东西呢?因为公司招聘人员与众多求职者逐一沟通是非常耗时间、精力的,所以工作年限就是第一道门槛。
- 一般 1-3 年工作经验是一个层次,在北京一般薪资范围是 10-20k 之间;
- 3-5 年又是一个层次,在北京薪资范围是 15-25k;
- 5 年及以上又是多个层次。
当然,1-3 年的工作经验也可能获得 3-5 年工作经验一样的薪资待遇,这个主要看实力,我们的 Chat 也主要是讨论这一部分的因素。
在之前的小节我已经说了程序员大概分为科班出身和半路出家的两类,我并不是说科班出身的就一定会比半路出家的优秀,这完全是两回事。只是科班出身表示他的知识面更广一些,所以其他人也应该注重知识面和基础功。
在这次 Chat 中我并没有把问题指向到某一个语言,因为作为开发工程师太注重语言往往会成为自己的绊脚石。
追语言的人
经常遇见这样的问题:和开发的朋友一起聊天,上回见面说在学习前端技术,一个月后见面又说在学习 Python,说还是 Python 好用。再过一个月见面又说在研究 Go 语言,说 Go 语言以后一定是潮流。这一类人我把他们称之为 ‘追语言的人’。
记得不要盲目追随一门语言,因为你掌握任何一门高级语言后,对于语法的入门来说都是非常快的,而且现在的语言的语义化非常友好,我们学习及接触都非常容易。其实我们最需要了解的是语言的特性。
比如说很多人想学习机器学习都去学习 Python 等,那我们需要思考的是为什么会选择 Python 语言,还有 R 语言、Java、JavaScript、C、C++、Scala 等。它有什么优势?
这样思考,当公司遇到其他比当前更为复杂的场景时,你就能知道这种特点的场景应该用什么样的语言及技术栈来解决。你对开发的认识就上升到了另一个层面。
自娱自乐的人
有种人就是重复的做同样的事情觉得很有成就感的,这样虽然没有大错,但是会导致我们停滞不前。
经常能听见有人这么说:我们公司事情少,做完就没事干了,很无聊。其实这就说明他放弃了自己成为更优秀的程序员的机会,学习是进步的阶梯。就算当前你们公司没有用这个技术,你也应该利用空闲时间去学习。
其实导致程序员分层的主要原因就是学习的习惯。为什么这样说?因为导致分层的最直接原因是知识面,而知识面的形成需要不断学习,学习的效率也很关键。之前我从很多人口中听到他们抱怨技术主管的技术水平不如他们。这也是两个层次程序员不同的表现吧,因为看待问题的角度不同,没能将解决问题和提供方案两者的关系搞清楚。
程序员如何快速成长
我们主要是探讨,抛砖引玉。
首先我们要看到的字眼是成长。
我之前带过一个程序员,他也是做了一年的开发了。我让他通过 User-Agent 来判断用户是不是在微信中访问的,结果他问我什么是 User-Agent。大家别觉得可笑,其实不知道的人大有人在,为什么呢?因为他们只注重于自己的 CURD 能力了。我不是说 CURD 不好,只是因为 CURD 就像了解 User-Agent 一样只是基础。
对于开发人员来说了解计算机网络方面的知识非常重要,计算机相关专业毕业的都学习过计算机网络这门课程。非计算机专业也没有关系,最基本的 http 请求报文和相应报文的结构都应该了解一些,这些都是基础。
之前我在培训机构机械化时,我让学生背诵的面试题中还有 mysql 的 InnoDb 和 MyISAM 引擎的区别,每当看到学生回答一个支持事务一个不支持事务,然后看着领导高兴到想笑的表情时,我就想笑。
支持事务是一个区别,那我不需要支持事务,我使用 InnoDb 的引擎又有什么问题呢?所以我觉得脱离场景谈知识点往往是程序员被归为底端序列的最直接原因。
以上只是一个例子,只是说明学习也需要分场景。学习语言也是一样的,我们要想想为什么不用当前的语言而要再选择一种新的语言。比如为什么不用 PHP 做机器学习?可能说到这个问题很多人就想笑,‘PHP 是世界上最好的语言’(因为喜爱所以容我自黑一下)。
但是我们再来严肃的思考这个问题,请你思考一下。很多学习机器学习的人也是被潮流推着走,别人都学习 Python 来做及其学习那我也要学习 Python。当然人生苦短,你学习 Python 的选择是没有错的。在追着 Python 跑中不乏有一些 C、C++、Java 程序员。
引用别人经常说的一句话 “几年前一帮人叫苦连天的说 Java 要死了但是 Java 死了吗?” 别再看着语言杞人忧天了,你更应该学会的是选择语言。
当然招聘网站上,企业所需的程序员需掌握的语言种类,也是一部分程序员学习的方向。企业在选择一个语言的时候考虑的因素非常多,包括了之前项目所使用的语言情况、迁移的成本、人员培训成本、语言所耗费的硬件成本、人员沟通成本,最主要的是能否解决当前遇到问题的,以及解决问题需要耗费的时间。
所以快速成长需要我们自己有主见地分场景来仔细探究技术细节,需要有极强的学习能力。
PHP 程序员渴望的蜕变
我同事的观点是这样的:PHP 程序员转型发展有两个方向,一个是更深层次的后端开发,可以熟悉 Go 或者 Java 语言然后找家这些语言相关的公司。例如在做 PHP 开发时很少有人去了解异步,协程,多线程等问题。另一个是转向前端,前端也是一个竞争非常大的区域,而且前端需要学习的东西并不比后端少。
可能有些人说我要做全栈工程师,我和同事一致的观点是,别做一个样样都会,但样样都理解不深刻的全栈工程师。
当然在这儿要给那些非常缺乏安全感的程序员说一声。PHP 并不会死。
当前新浪、神马搜索、百度等公司都有使用 PHP 的场景而且设置了 PHP 的职位时,小公司就更不必说了。在中小型、短平快的业务中,PHP 依旧是首选。因为 PHP 刚开始的特性就是快速的开发网络应用。你要追逐其他的语言也不是不可,但是基础一定要别忘了慢慢打牢靠。别让自己的知识体系成为一个虚胖的胖子。
另外,可能每个程序员都想赶快投入到人工智能和机器学习中。如果你还是想当这个领域的码农,那你可以看网上的各种文档教程来学习,像 TensorFlow 这种向外提供的 api 也比较多。如果你想在这个领域发展,还是得首先把那些经典算法搞清楚。
干货,你需要的转型路线
根据程序员开发工作所处的产品层面,程序员分为两类,分别是前端工程师和后端工程师。现在对开发工程师的分类更繁多了。我就从前端和后端这两类中给大家分享。
其实 PHP 处于一个奇特的位置也是一件好事。有人说 PHP 是前端语言,有人说 PHP 是后端语言。这个界限也不是那么明显,解决表现层工作的语言我们一般说是前端语言,主要看用 PHP 来处理什么层面的问题。
在你考虑转型之前,PHP 应该已经让你具有这些知识。
首先是 MVC 模式的理解,这个不难,但是要懂得从这一出发点去扩展。例如 MVVM、MVP 模式等等,要能够明白它们之间的区别,但是理论往往是比较单一的东西,记得要结合项目区理解。
还有一个需要掌握的知识就是 http 请求和响应,其实这个知识是我们一直在用的但是很多人都搞不明白,例如我们经常用浏览器的开发者模式在 Network 中点击某个请求就可以查看请求的 header。
如下图:
然后就是面向对象的思想,对面向对象,大家褒贬不一,尤其是越来越多的人对于函数式编程的推崇。其实两者各有优点,我们需要的是真正的理解面向对象所带来的优势和不足。希望 PHP 能让你理解各种类型的变量以及使用方法。
PHP 中有四种标量类型,分别为 boolean、integer、float、string;三种复合类型,分别为 array、object、callable; 两种特殊类型,分别为:resource、NULL,当然还提供了一些伪类型。
如果你掌握了以上的内容,那你在转型的道路上可能更为轻松一些。
首先来说说向前端的转型。
如果要向前端转型,js 是必须要学习的。但是学习到什么程度呢?js 要学到什么程度也是大家最迷茫的一个问题。很多人可能会不断地啃 js 的语法。但是对于 js 这种知识点非常繁杂的东西,如果一直陷在语法中就得不偿失了。
其实最主要的还是前端的思维。在掌握了 js 的一些基本类型操作,包括字符串、数组、对象、json 的处理后,就可以去看看 vue.js 或者 react 这样的框架。推荐大家从 vuejs 开始,比较简单,容易入门。当然 html 和 css 的基本用法还是需要了解的。在学习的过程中看别人的项目非常重要,可以去 github 搜索 vue.js 的一些项目,看看别人是怎么实现的。
另一种转型方向是转向服务端开发。
你需要选定一种比较常用的服务端开发语言。java 也好,go 也好,其他选择也非常多。从入门开始,如果有基础的程序员一定不要从厚厚的语法基础开始学习,因为这个过程非常浪费时间。在了解了最基本的语法后就可以开始选定一个框架来学习,在学习中发现问题,再回过头来学习语法。
在这儿选择非常多,我不具体说明了,只给大家一个建议。
很多程序员比较看好的是 go 语言,确实 go 语言相对其他语言来说简单,工程化中可靠,而且有着天然的开发标准,goroutine 给服务器开发带来好处。在国内,七牛云很早就使用 go 语言了,现在很多大的公司也开始使用 go 语言解决部分问题。
由于人工智能和 python 的优势,很多人是走 python 路线的,但是如果走 python 路线,就请做好向数据挖掘、处理和计算的方向走。语言的选择见仁见智,最简单的依据就是看公司的需求程度。
在深入服务端开发的路上需要了解的知识非常非常多,比如性能优化。很多人提到 redis 就是一句话,当做缓存来使用。这就是我前面提到的业务场景的问题,说明你所理解的业务场景太单一了,导致对于知识的认知不够。
当然还有通讯机制的问题,相信很多人都非常陌生这些技术 MQ、Cron、RMI、RPC。我列举这些不是让大家马上买几本书去学习。记住,在你想要去学习某个技术之前,一定要先创造一个场景。
程序员最需要的,也是每个程序员最缺乏的,就是交流。大家需要和其他程序员多交流、多交换意见,这样很有利于自己的成长。
总结
互联网行业不是一个进入就可以高枕无忧的行业,你需要不断地学习,提升自己。
想要进入这个行业的准程序员们也不要泄气,你要找到正确的方法和途径。很多线下的培训机构都稂莠不齐,请慎重选择。如果你学不会在网络中找资料,那就说明有问题了。因为现在网络资源这么发达,找资料是比较容易的。
PHP 程序员不需要有太大的语言本身的危机感。
快速成长的关键是要对自己有一个正确的认识,不盲目跟风。注意根据场景来学习,能够思考并解决场景中遇到的问题,解决或优化瓶颈问题。这个过程中也是一个很好的学习过程。