对于IT技术岗位来说,大体可以分为两大类:研发和应用。
先说说研发类岗位吧。为什么要研发?主要研发什么?
研发也分为两类,一类是硬件研发,另一类是软件研发。硬件研发主要是专注于电子硬件产品的开发,例如我们常见的键盘、鼠标、手机、音响等硬件产品,所以硬件开发人员就是做这一方面的产品开发研究,其工作主要包括设计原理图、设计电路图、PCB板设计以及功能性、稳定性的测试,最后才是生产。总的来说硬件研发的技术壁垒较高。举个例子,我们要使用洗衣机首先得有洗衣机的硬件部分,如马达、飞轮等,硬件是最基础最底层的东西,不可缺失。
另一类是软件研发岗位。为什么要有这个岗位?为什么会用到软件?因为虽然有了硬件,但硬件暴露的接口功能过于简陋,而且直接用其来实现功能比较繁琐麻烦。计算机刚生产出来只有硬件接口,在硬件级别要实现复杂功能是非常困难的,需要的代价非常大,而且功能是写死在硬件上的,由于固化的原因导致要变换一下功能很麻烦。那怎么办呢?我们考虑到在硬件这一层次上再附加一层更为复杂的逻辑----这个逻辑就是软件。硬件的接口过于底层,需要软件来把接口做得更加人性化、更加易于使用,同时把底层的复杂性给隐藏起来----这就是软件的作用了。但这并不是说软件的复杂性不存在了,只是硬件的复杂性由软件来承接而已,看上去简单但不是真简单。这样一来有个好处,那就是硬件只需要提供最基本的功能即可,而各种复杂功能由软件来实现。举个栗子,铁锅是用来炒菜的,硬件部分只需要有承载食物并导热的功能即可,但我们仍然可以用铁锅来炒出各式各样的菜色。
这里给了我们一个启示:我们所提供的这个工具越接近最终形态,它的适用领域就越窄。计算机也是如此,尽然计算机系统分为硬件系统和软件系统,把硬件保持最原始形态,把其他高级功能皆由软件来实现,这样硬件的通用性就大大提高了。
为了帮助理解,再举个栗子,几乎去饭堂的人是为了吃食物填饱肚子,在这批人中要吃米饭的人、要吃馒头的人等分别又分出了更少的一批人,既要吃米饭又要吃大白菜的人又更少了。食物能提供的功能是填饱肚子,这一功能越简单能满足的人数就越多,既要吃米饭又要吃大白菜能实现的功能越复杂,因此能满足的人数就越少。
计算机也是如此,硬件只是完成最简单的运算操作,并识别一些简单的指令(由CPU接收),而软件把底层硬件封装起来实现更加复杂的功能,例如编辑图像、播放视频、编辑文本、上网......
对于人来说,计算机接口是二进制指令,如果通过机器语言来编程(即对二进制数据进行加工)则代码量太大,实现周期过长,排查难度太大,几乎不能胜任。所以就出现了易于人理解的编程语言。所谓软件就是程序员使用编程语言来写的程序代码,而不是用机器语言(最底层)来实现。
编程语言又分为低级语言和高级语言,所以在编程里由分出了不同的程序员岗位。对于低级语言来说,其中代表是汇编语言,一般由芯片厂商提供,虽然已经开始使用人类自然语言描述了(如ADD,SUB等),但仅仅是把二进制转换成易于人理解的自然语言符号而已,所以汇编语言提供的接口依旧相对简陋一些。相比于机器语言,汇编所使用的代码量已经大大减少了,但对于人而言,汇编的代码量仍然很大。虽然代码量大(相对于人),但性能非常好,机器跑起来非常快,常用于写驱动程序,而早期的Unix系统就是用汇编写的。由于汇编语言跟机器耦合度非常高,适用范围较小,程序员学完汇编后在技能应用上没有普适性,这对于工业培养人才比较不方便,因此就出现了高级语言。
高级语言是比汇编语言更加人性化的编程语言,像C,C++语言是建筑在汇编之上的另外一种语言,代码量少很多。但不管是低级语言(汇编)还是高级语言,虽然人能识别,但机器是识别不了的,因此需要有一个中间层(转换器)作为桥梁,把对方背后的逻辑复杂性屏蔽掉,这样的中间人在汇编语言中叫做汇编器,在高级语言中是编译器,总之就是充当翻译官的角色。高级语言的编译过程包括两个步骤,首先将高级语言转换为汇编语言,再转换成机器语言。
虽然程序员用高级语言写起来代码量少得多,但对于机器而言代码量要大得多。这是因为在编译时要附加大量其他加以说明环境的代码。打个比方,例如到国外旅游时跟老外交流时,身边有个翻译官帮助双方沟通,当老外问到“What kind of books do you read?”时,你回答“《红楼梦》”,那么这时翻译官不仅要跟老外说明你读的书是《红楼梦》之外,还需要介绍大量关于《红楼梦》这本书的背景,这样老外才能理解你读的是什么书,而不至于听成“在红色的楼里做梦”......
总而言之,高级语言写起来容易,但机器跑起来相对较慢。在高级语言里也分成两类:系统级语言和应用级语言。系统级语言如C,C++语言常用于编写操作系统(如Linux,windows)以及对系统性能要求较高的服务类程序(如Oracle,MySQL等),在高级语言里代码量相对较大,在这一方面成材相对困难。
而应用级语言如Java,Python,ruby等就非常接近人类了,但离机器越远了,常用于编写应用程序如ansible,puppet等。其中Java是非常流行的语言,而Python性能比较差,但随着计算机处理能力越来越强,所以Python性能差这一点倒是可以忽略了,所以在近几年Python渐渐流行起来,至少在研发上节省的时间足以抵消系统运行的时间,即投入产出比大。
总结:对于软件研发岗位,程序员的工作就是通过软件的方式让底层机器利用简陋的功能去实现一些列复杂的功能。程序员有多种,跟机器打交道的程序员就使用汇编,写一些关键程序的程序员就使用系统级语言,如果写一些对系统性能要求不高的程序的程序员应该使用应用级语言。
谈完了研发这一类岗位,接下来谈谈应用这一岗位。
所谓应用领域就是把程序员写好的各种应用程序应用好,而对于Linux领域来讲通常称为Linux运维,或者说Linux运维是应用领域的一个分支。Linux运维是做什么的?简单来说就是把建构在Linux生态圈中的各种应用程序应用好。那么如果不采取任何措施的话,日常的运行维护工作是比较繁琐的,这样一来运维人员是不是所有的事情都得自己动手去完成呢?非也。Linux运维人员需要尽可能地以一种编程的视角,把这些管理各种应用的工作让程序来帮助完成。shell脚本编程是其中一种,通过shell脚本编程可以让某些管理工作和应用工作自动完成(即通过程序来完成)。但是shell从本质上不算是一门完整的编程语言,它只是建构在解释器上的让别的程序运行得更好的一种程序逻辑工具而已,要想实现更加复杂的功能需要用到更为专业、更为完整的编程语言了,如Python。例如socket编程是shell编程实现不了的,而Python实现起来容易得多,还有自动化运维工具ansible、云操作系统openstack就是用Python写的。Python是一种非常高级的语言,甚至比Java还高级,除了shell之外,Python几乎是最容易学的。
总结:运行维护就是拿着程序员(研发团队)写好的程序(软件),根据企业的业务需要将其组织起来以满足用户的需求,能完成企业运营需要完成的任务即可。这就是应用岗位的职责。Linux运维是其中的一个分支,对于Linux运维来说发展方向很多,例如深入学习MySQL、NoSQL去做DBA是一个方向,深入学习运维工具、编程语言做DevOps是一个方向,深入学习虚拟化和云计算也是一个方向,深入学习大数据又是一个方向,而架构师是一个大方向,各方面都要能掌握,但底层配置可由其他人员完成。
公司技术部一般由研发团队和应用团队组成,比例大概是5:1到10:1,研发岗位相对更多,但职业风险相对应用大。研发不是运维的最终目的,运维开发工具只是为了使运维更加灵活、更加自动化而已。