PHP程序员面临的语言选择危机与职业发展转型指南
感谢有这样的机会能和大家一起聊聊关于开发者的事情。实际上,程序员危机是一个真实存在的问题。有人说这是互联网行业的下滑,或者是互联网行业已经过了风口等等。我们在此主要要谈论的是 PHP 程序员的危机,这种危机大多来自于丰富的语言种类以及公司对语言的选择。尤其是在近几年非常火热的人工智能和机器学习等领域。自然也有受到关注的 python。这在一定程度上会带动一些盲目跟风的人。开发工程师在扩充和转型自己的知识体系时,需要有明确的目标。因此,跟风是一个较为危险的时期,转型也不是丢掉所有东西重新学习其他东西,我们需要从程序员的诞生到成长来探讨该如何选择。

好了,进入话题。
PHP程序员的现状
现阶段,大部分 PHP 程序员处于比较迷茫的状态。初级 PHP 程序员认为这个行业有难度。中级 PHP 程序员大多希望通过学习来提升自己,但往往会陷入一种现象,即今天追逐这个技术,明天追逐那个技术。高级 PHP 程序员已经经过了进化,大多有了自己的知识体系,部分处于架构的位置。
程序员生涯中,认识自己的行业很重要,也关乎职业生涯规划。这是个较难的问题,因为要规划职业需对行业有充分了解,这与当初选择做程序员有很大关系。一般来说,如果你难以熬过开发生涯的入门期,那么你就不适合这个行业。如果你坚持不下去蜕变期,那么你就不会有太大的成就。
每个人开发生涯的入门方式各不相同。一部分人对这个行业感兴趣,心中有目标,即便没有清晰的职业规划,也至少会有一个该领域的偶像。另有一部分人经过三四个月的培训后进入这个行业,这些人大多是通过培训机构的电话营销进入的,他们会说三个月后会成为一个全新的自己,月薪过万等。之前对重庆互联网学院中的某家培训机构(YMSD)进行了数据分析。在这部分参加培训后进入行业的学生中,2 年后仍在该岗位继续发展的学生仅占 20%。这意味着 80%的学生花费时间和金钱,最终只是充当了陪跑员。这也从侧面表明,我们进入这个行业,除了期望能赚到很多钱之外,必须对未来的发展有一个预期。一般而言,培训入行的开发人员在工作时会遭遇很大困难。因为他们没有技术路线的体系目标,在线下培训机构接受的只是单纯的模仿,创新能力极为缺乏。并且据我所知,大部分线下培训机构的课程体系与企业场景至少脱节 5 年。所以这部分程序员更应努力去改变自身现状,明确自身处境。
什么导致了程序员分层
程序员存在分层这是一个极为明显的问题。在公司中能直接体现出来的是,同一类程序员的职位有着很大的差别,或者薪资待遇有着很大的差别。那么,造成这种分层的原因究竟是什么呢?
首先第一类原因就是程序开发者的工作年限。
工作年限并非一个极为重要的因素。在之前的面试过程中,我们曾遇到过工作年限仅为一年但极为优秀的开发者。然而,当使用求职软件时,几乎所有人都会发现,其中都有一个指标,即工作经验多少年。为何会有这个东西呢?公司在招聘你之前没有进行过交流沟通,由于逐一与众多求职者沟通非常耗费时间和精力,所以工作年限就成为了第一道门槛。
你即使只有 1 - 3 年的工作经验,也能够获得与 3 - 5 年工作经验相同的薪资待遇。这主要取决于自身的实力。我们的 chat 主要就是讨论这部分因素。
之前的小节提到,程序员大致分为科班出身和半路出家两类。在此要说明的是,并非科班出身就一定会比半路出家的优秀,这两者是完全不同的情况。通常来说,科班出身意味着其知识面更广泛一些,所以其他人员也应当注重知识面的拓展和基础功的塑造。
在本文里,我没有将问题指向某一种语言。因为作为开发工程师,如果过于注重语言,往往就会成为自己的绊脚石。
追语言的人
常常会有这样的情况:与开发的朋友聊天时,此次见面告知最近在学习前端技术,然而一个月后的下一次见面,却又说最近在学习 python ,还觉得 python 好用。接着再过一个月见面,又说最近在研究 go 语言了,并且认为 go 语言以后必定是潮流。这类人我将他们称作“追语言的人”。
自娱自乐的人
有一种人常常会重复做同样的事情,并觉得很有成就感。当然,这样做本身并没有错,但可能会导致我们停滞不前。我们经常能听到有人说:“我们公司的事情少,做完就没事干了,很无聊。”其实,这就表明我们放弃了让自己成为更优秀程序员的潜质,因为学习是进步的必要条件。即使当前你们公司没有使用某个技术,你们也应该利用空闲时间去了解它。
导致程序员分层的主要原因是学习习惯。之所以这样说,是因为导致分层的最直接原因是知识面,而知识面的形成需要持续不断地学习以及提高学习效率。之前很多人都曾抱怨他们的技术主管:“他的 xxx 技术都没我好,还能当主管。”这是两个层次程序员的不同表现吧。他们看待问题的角度不一样,并且没有搞清楚解决问题和提供方案之间的关系。
对于追求语言的人来说,不要盲目地追随一门语言。因为当你掌握任何一门高级语言后,对语法的入门会非常快。并且现在的语言语义化非常友好,我们学习和接触这些语言都很容易。我们最需要了解的是语言的特性。例如,很多人在学习机器学习时会选择 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 的基本用法之后,就可以去了解 vuejs 或者 react 这样的框架。大家最迷茫的一个问题是 js 要学到什么程度。实际上,在掌握了 js 的一些基本类型操作,比如字符串、数组、对象以及 json 的处理之后,就可以去查看框架了。推荐大家从 vuejs 开始,它比较简单且容易入门。当然,html 和 css 也是需要了解的内容,基本的用法都需要知晓。学习过程中,看别人的项目很重要。可以到 github 去搜索 vuejs 的一些项目,看看别人是如何实现的。
有一种方向是往服务端开发转变。当然,需要选定一种较为常用的服务端开发语言,比如 java 或者 go ,当然其他的选择也有很多。要从入门开始,如果是有基础的程序员,一定不要从厚厚的语法基础开始学习,因为这个过程会很浪费时间。在了解了最基本的语法之后,就可以开始选定一个框架来学习了,在学习过程中如果发现问题,再回过头来学习语法。这儿的选择非常多,我们不具体说明,只给大家一个建议。很多程序员看好 go 语言,go 语言相对其他语言简单,在工程化中可靠,还有天然的开发标准,goroutine 能给服务器开发带来好处。国内七牛云使用 go 语言较早,现在很多大公司也开始用 go 语言解决部分问题了。很多人因为人工智能和 python 的优势而选择走 python 路线。然而,如果选择走 python 路线,就需要做好向数据挖掘、处理和计算的方向发展的准备。对于语言的选择,不同的人有不同的看法,但最简单的依据是看公司的需求程度。
在深入服务端开发的途中,需要了解的知识数量极多,像性能优化这类知识就很重要。许多人提及 redis 时,只是简单地将其当作缓存来使用。这正体现了我之前提到的业务场景方面的问题,意味着你对业务场景的理解过于单一,所以对相关知识的认知不够。当然,还有通讯机制方面的问题,相信很多人对 MQ、Cron、RMI、RPC 这些技术都很陌生。当然我列举这些并非是让大家即刻去购买几本书然后开始学习。在你有意愿去学习某个技术之前,务必先要营造出一个场景。
程序员最需要的是交流,每个程序员也最缺乏交流。大家需要与其他程序员进行交流,多交换意见,这对自己的成长很有利。
总结
互联网行业并非是进入之后就能够高枕无忧的。它需要持续地进行学习,并且不断地提升自身。
准程序员想要进入这个行业不要泄气,要掌握正确的方法和途径。很多线下的培训机构质量参差不齐,需慎重选择。如果自己在网络找资料都学不会,那就说明存在问题。现在网络资源很发达,找资料比较容易。
那么PHP程序员也不需要有太大的就语言本身的危机感。
快速成长的关键在于要有自己的认识,不可盲目跟风。要注意根据场景进行学习,能够进行思考,以解决场景中遇到的问题,包括解决瓶颈问题或者进行优化。在这个过程中,同时也是一个很好的学习过程。