软件开发是一种特殊的职业,特殊到有点匪夷所思,行业从业人员的工种分类非常的不稳定, 比如说古时候有C工程师、C++工程师、VB工程师,后来有了Java工程师、.net工程师、php工程师, 再后来又有了前端开发工程师、nodejs工程师、 golang工程师、python工程师什么的, 反正每隔个几年就会莫名其妙的蹦出来几种新的软件开发职业,让一批又一批的人趋之若鹜。然后这些不同的职业却又干着一些相互重叠的事情, 比如说网站,Java、.net、php工程师都可以做;比如客户端软件,C++、VB、Java、.net也都可以做;比如说服务器程序,C、C++、nodejs、golang又都可以做
而且这些使用不同语言做不同类型软件的工程师相互之间还具有排它性, 除了少数情况以外, 假如你想让一个Java网站工程师去开发和维护.net或者php技术开发的网站, 不好意思 ,没门! 反过来也一样。至于理由,用的最多的应该就是“不会”“没兴趣”“学习成本太高”之类的,总而言之,就算这些不同的技术是用来做相同事情的,就算它们在做这些相同的事情时总会用到一些相似的技巧,但它们之间总是有差异的,除非不同的技术在做某些相同的事情时用到的相似的技巧非常的多而且抹平它们之间差异的成本非常的低,否则想要在不同的技术之间平滑的过渡总是很困难的。就拿使用不同的技术做网站这个例子来讲, 技术间相同之处有http相关的内容、数据库使用、服务器原理等,不同之处反正逃不出语言、类库、框架,其实语言就可以把这三项内容给囊括了, 因为它们都属于语言的范畴。语言对于很多开发人员来说就是一坐不可逾越的大山, 或许因为没能力,或许因为没兴趣,或许因为没精力,但是反正就是过不去。
再从另一个角度来分析。 像C++、Java、.net、JS这样可以适应各种应用场景的语言又能派生出许多种职业,如C++客户工程师、C++服务器工程师、Java android 工程师、 Java网站工程师、class="invisible">http://asp.net网站工程师、.net windows客户端工程师、JS前端开发工程师、nodejs服务器工程师,看看这架势, 光一种语言就能造出N种工程师,恐怖。上面我们讲到, 使用不同的技术做同样的事情 ,而这里正好相反, 使用相同的技术做不同的事情。 以这种方式划分的不同种类的工程师,相互之间也具有一定的排它性,但总体来说没有根据技术来划分种类的方式来显有敌意,主动想在不同种类之间过渡的程序员数量也更多,然而,相互之间过渡的成本却一点也不比在不同技术之间过渡来的低。就拿现在最火爆的JavaScript语言来说, 它原来是一种网页脚本语言, 是用来编写网页特效的, 随着互联网的火热发展, JavaScript语言也开始大行其道, 近年来还发展出一种叫nodejs的服务器编程技术,主打高并发高性能, 高并发和高性能啊,逼格多高的技能,掌握了就好像得到了全世界,因此无数开发人员为之疯狂。原本使用JavaScript的前端开发工程师自然也不例外,而且这种技术使用的还是他们看家的语言, 仿佛占尽了先天优势。 然而, 事实上, 真正从网页前端开发过渡到nodejs服务器开发的工程师数量寥寥无几,因为要抹平两者之间差异的成本非常高,换言之它们虽然用的都是JS, 但是实现差异却非常的大。 JS网页特效和nodejs服务器程序的相似之处, 无非就是JavaScript语言, 然而除此之外却再没一丝重叠了。做前端页面时使用的html、css、jquery等等和其它各种框架在写nodejs程序时完全没有一丝用武之地,而且写nodejs时需要掌握的http较深层次的原理、网络通信、数据库技术等每一项技术都不是省油的灯、好啃的软骨头,而这些正是大多数前端程序员未掌握的,因此过渡的成本的确非常的高, 难度非常的大。 再比如说Java技术的使用,Java服务器程序员善于使用服务器、数据库相关技术,而同样使用Java作为开发语言的android应用,开发时却是测重于界面绘制、控件使用、兼容性问题克服等技能,假如服务器程序员想转移阵地,之前储备的绝大多数武器将全部报废,开发新程序战斗力几乎为零, 一切从头开始,这成本不可谓不大, 难度不可以谓不低,没有办法过渡也在情理之中。
在谈如何在不同技术或者开发不同种类软件之间过渡方法之前, 我们先谈谈到底有没有必要去过渡。 如果你是一个一直做Java网站开发的程序员, 毕竟现在IT行业如中午12点的太阳如日中天,或许还不到12点也有可能,从业人员数量巨大,长江后推前流,前浪还没有死在沙滩上后浪又一波波的继续跟上来了, 因此,你使用Java做好网站开发也足够混口饭吃了。假如你能力比较强,资历上来以后, 当个部门主管或者项目经理,之后如果一帆风顺再当个CTO或者对行业了解的足够深刻,自己创业当CEO,然后迎娶白富美, 走上人生巅峰, 那么我除了恭喜你以外,也只能羡慕的流口水, 因为这毕竟只有少数人能做到,他们需要同时具备天资、能力、运气,而这些不是每个程序员都能拥有的。身为一个普通的程序员,如果职业生涯一直使用一种语言做一件事情,如一直使用php做网站, 那我觉得是一件相当枯燥乏味的事情。此外, 工作中总会碰到这样那样的意外,比如说你在使用Java时上级突然扔你一个php网站让你维护;又或者有一个需求使用网站技术已经没有办法满足了,需要一种新类型的程序才能把这个问题解决;这个时候你应该怎么办?当然,你可以搞不定, 因为这不是你的职责范围, 但是我想, 搞定总比搞不定来的强。
如何搞定? 具体一点就是如何使用不同技术开发相同的程序?如使用php、Java开发网站和使用相同的技术开发不同的程序?如使用JS开发前端页面和使得nodejs开发服务器程序,或者使用c#开发网站或者开发windows客户端 。表面上的解决办法就是需要做什么时就学什么。 但是首先,临时抱佛脚肯定是来不及的, 这跟考试是一个道理;其次,软件开发行业的技术万千上万,不同种类的软件也数之不尽,我们的时间有限, 不可能也没必要花大量的时间在这个上面,只有那种没性生活的屌丝和刚毕业的学生狗才会这么去干。 最有效的办法就是学习一系列通用的技术,掌握这些技术以后,使用不同的技术和开发不同类型的软件的成本和难度就会大大的降低,就像张公子学会九阳神功以后妹儿也一把一个准。 那是不是真的有这种包治百病的灵丹妙药或者可以开任何锁的万能钥匙呢? 我想, 肯定是有的。 试想一下,软件开发的一切都是基于计算机的,也就是这块把CPU、内存、硬盘、主板、显示器、键盘鼠标拼起来的积木, 我们只要掌握了它的运行原理,也就意味着我们就是这个虚拟的软件世界的主人, 想干什么就干什么, 想怎么干就怎么干。那么如何掌握这台一屁股就能坐碎但是却牛逼轰轰的不得了的机器吗? 其实很容易,只要把微机原理、操作系统原理、编译原理、数据库原理、算法原理等等各种原理都学一遍,然后包你代码写遍天下无敌手。 看到这里你们是不是特别想骂人, 觉得我说的是人人都知道的废话, 却又没有几个人能做的到。 其实我只是想说, 你们啊上学的时候一定要好好的用功, 只有在那时候你才有这个精力和智力去上这些高冷且难以征服的技能,然后高潮。 毕业以后, 铁定不行了,有心无力!