Java程序员的两项通用能力

工作这几年来,经历了很多。从小白到中级(手机里有一款叫中国象棋的游戏,里面给对弈中电脑水平分为小白、菜鸟、新手、入门、初级、中级、高级、大师、特级大师,编程我暂且按照这样来区分)。

学校教给我的是从小白到入门(当然也不乏某些学霸直接跳过这些成为高级甚至大师级别,就大多数普通人来说都是从小白到入门)。

但每个人从小白到入门的过程是不一样的。有的人是天资聪明,也有的人是基础牢固(如果你数理化很不错,那么学编程也是一件很容易的事情),还有的人是勤奋苦练(我觉得我就属于这一类的)。

后来毕业后的第一份工作让我成为一名初级程序员,经过几年的磨练后,算是成为一个中级程序员。

为什么是”算是”而不是”是”?

按照年限来说,一年初级,三年中级,五年高级。那么我达到了三年,刚好是中级。

三年的中级,让我有了独立开发网站的能力。

独立开发网站的能力包括哪些?

  • 需求理解、需求分析、数据建模。
  • 前后端开发能力(包含开发过程中的问题解决)。
  • 运维能力(写一个项目部署到Linux服务器、搭建各种软件环境和安装各种软件、监控服务器(CPU、内存、硬盘、软件运行是否正常)、线上问题排查等)。
  • 测试能力(功能测试、性能测试(压测))。
  • 一定的项目管理能力。
  • 技术选型和框架搭建能力。
  • 二次开发能力。
  • “抄”能力。

但三年的中级并未让我感到多么的高兴,因为于我而言还有很多要学习的,远远还没达到我心目中的”中级”。

不过有一点我还是很庆幸,因为这三年以来我还是处于不断成长当中。并没有将一年的工作经验重复三年。

这三年当中,给了我很多教训,也让我思考很多,于是便有了今天这篇文章。

回归正题,作为Java程序员,我觉得有两项通用能力,这两项通用能力,如果让大家来说?

有人会说:

  • 编码能力(点(算法)、线(设计模式、组织代码)、面(框架和学习、理解和应用)、体(操作系统、计算机网络、编译原理等))
  • 业务能力(理解需求或问题能力、沟通和协调资源能力、预估和安排计划能力、调研和解决问题能力)

也有人会说:

  • 学习能力
  • 解决问题能力
  • 沟通能力

我今天所说的两项通用能力,不是沟通,也不是学习,也不是解决问题。而是深入理解Java和数据库。

因为在我看来学习能力、解决问题能力、沟通能力这些,是一个人无论工作也好还是上学也罢,必需的能力(就好像穿衣吃饭是必需的,无时无刻我们不在学,不仅仅是工作也包括生活,无时无刻我们不在解决问题,不仅仅是工作也包括生活,无时无刻我们不在沟通,不仅仅是工作也包括生活)。

如果一个人22岁工作(上了四年大学),按照60岁的退休标准,职业生涯长达38年。

另外作为IT来说,就国内这个环境,大多数程序员不可能一辈子都是程序员(有人干了几年干不动了转行了,有人走向管理层,有人继续搞技术)。

同时程序员也不一定60岁退休,也许50岁或者40多岁。那么怎么算,至少20年。

20年时间,世界会发生天翻地覆的变化。人不学习很难适应社会。

学习的目的可以理解为两个方面,一个是不想被世界淘汰,另一个方面是不被解雇(工作是为了生存,也是为了生活,但是老板雇佣你来是解决问题的而非制造问题)。

社会是共同生活的人们通过各种各样社会关系联合起来的集合(这样看来沟通是必不可少的)。

为什么说Java和数据库是Java程序员的通用能力?

我的理由如下:

第一、熟练掌握并深入理解一门编程语言决定你能走多远。

第二、任何商业应用软件都需要存储,而且数据库是最多的,而其中SQL能力是基础,也是最重要的一个。

为什么说熟练掌握并深入理解一门编程语言能决定你能走多远呢?

第一、当你熟练掌握一门编程语言时,接下来你去学其它的编程语言,你会发现是一件非常容易的事情(因为编程语言有很多共通之处)。

第二、学习和使用该编程语言相关框架也是一件非常容易的事情。

那么最难的是什么?是理解,理解这门编程语言。

理解包含两个方面,一个是浅度,另一个是深度。

作为一个Java程序员,说真的,我对Java至今都处于浅度方面的理解而非深度(对于深度,我觉得读懂源码是必要条件)。

同时我也觉得不少人和我一样处于浅度理解。浅度理解并不影响实际开发工作的展开(但有些时候却成为生产宕机或突发问题的原因,我曾经的一个代码问题就把生产环境搞乱了),也不影响学习任意的框架或其它。

其实,我很痛恨浅度。因为浅度是一件很有危害的事情。原因如下:

  • 程序是由算法和数据结构组成,而开发软件中你不一定会用算法,但是数据结构是必不可少的,如字符串、链表、数组、哈希、堆、栈、树等
  • 看似代码写的没问题,但如果不理解对应的方法(源代码),可能会出问题(面试常考的一个,也是Java开发中用的最多的,如equals和==,你不理解写的就会出问题)
  • 数据最终会存入数据库,但也会从数据库中拿出来展示,展示过程中不管你是XML还是JSON,你都需要用到数据结构(Java相关的如String、Array、List、ArrayList、LinkedList、Vector、Map、HashMap、Set等,Java程序员们一定不陌生)
  • 某些时候宕机的原因并不是因为用户多了,而是代码写的有问题(不仅仅是逻辑问题,也是写的方法有问题。举个例子,在创业公司开发智能酒店项目时,曾有段时间频繁宕机,为此我临时写一个shell脚本监控着,如果宕机,自动重启,为了保障能用,只得如此了,最后某天仔细排查,发现就是一段代码问题,代码问题反映的不仅仅是逻辑,也是对这门编程语言的深度理解)

我们延伸一下,回到个人职业生涯上看:
浅度等同于不深入,不深入意味着普通和平庸,普通和平庸意味着可替代性很强。可替代性很强就意味着很容易被替换。这也就解释了为什么程序员会有中年危机(不仅仅是程序员这一行,其它行业也是通用的)。

那么我们如何避免浅度而更好的深度呢?

我的导师,给了我一个很好的意见,这里我分享给大家。
就是从读一些自己常用的代码开始(如String、ArrayList、HashMap、FastJSON等相关的)。因为常用,避免陌生感,同时因为常用读起来也就是更有意义。同时也可以参考相关的优质博文,看看前人是如何深入理解的,不过在看前人写的之前,自己必须要有自己的意见(因为这代表着你思考过)。

接下来我也会写相关的源代码理解文章。写的目的也是希望自己不再是一个”API搬砖工人(这里我就不用码农了)”。

也许有读者朋友疑惑,为什么数据库也被我列为Java程序员的两项通用能力之一呢?

以MySQL为例,我对于INNODB和MyISAM(单单一个InNODB没有真正的弄懂)、索引原理、视图和触发器、存储过程和游标等,仅仅是了解而非真正弄懂。

虽说即便不懂,也能正常进行简单业务、较复杂业务、复杂业务的CRUD。丝毫不影响业务开发。但是不真正弄懂的话,会成为真正高级Java开发工程师的瓶颈,到时候即便年限到了5年,理所当然成为一名高级研发工程师,但是实力并未达到,等到去面试的时候,一问三不知,最后可能会被面试官说:五年的工作经验,连这都不知道,怎么好意思要这么高的薪资呢?

我之前公司一个领导T哥曾对我说过,深入掌握Java和数据库对于一个Java程序员是非常重要的,因为无论你到那家公司,这两项都是必需,而非所谓的业务能力(每家公司的技术栈相差不是特别大,业务相差是比较大的,但对于程序员而言,业务知识不一定要求你精通100%,最多也就是20%~30%左右,业务知识通常可迁移性不是特别强,比方说,你从外包到自主创业公司或者是从创业公司到其它行业公司都可以,没有什么限制,当然了,金融方面可能对业务知识方面要求高一些)。

其实仔细想来,这些年开发过的CRM、OA、ERP、CMS、智能酒店和门锁、物联网云平台、电商、编程平台、教育平台等项目(其中也包括二次开发),排除其中的编程语言(因为有用到Node.js、Python、PHP等),基本上数据库都是共性,而且用的都是MySQL。仔细在从另外一个角度来看,一个项目从0到1,最终上线投入运营使用,包含高可用、高并发、高性能等,都与数据库紧密相关,因为这考验着你的数据库设计是否合理,一个设计不合理的数据库,会无限增大成本(服务器的投入,为了保证”三高”,最简单的办法就是加机器,不断的加机器,但如果设计的合理,机器可以加少点,加少点同时也意味着降低企业成本,当然也不排除一些公司盈利不错,盈利不错,意味着这些成本可以不忽略不计)。

再回过头来,即便是数据库也有值得深入研究并掌握的?

以MySQL为例,我首推INNODB。因为INNODB存储引擎是用的最多的。
同时还有一点十分重要,那就是SQL能力(包含能够写复杂的SQL、优化SQL、知道如何加索引等)。基本上可以说,如果你的SQL能力不错,那么工作效率和工作质量将会上一个档次或者高好几个档次。以Java的三层架构,数据访问层、业务逻辑层、视图层(又称UI层),其中的数据访问层就考验你的SQL能力,业务逻辑层依赖于数据访问层(SQL能力),如果你的数据访问层写的不好有问题,那么自下向上都会受到影响,关于一点我深有体会过(曾经也深受其害)。

最后,我的这些年的经验教训告诉我Java程序员的两项通用技能是深入理解Java和数据库(多次强调过,希望大家不要舍本逐末,追求所谓的新技术,技术是日新月异的,而底层是不变的,把握这个不变,就足以应对万变)。因为这些是你无论到那家公司都需要的通用能力,相反我觉得框架并没有那么重要,而且熟练使用一门框架并不是很难。任何编程语言和框架,最难的就是深入理解而非简单使用(不仅仅是Java,其它语言也是一样通用的,深入理解一门编程语言和数据库,无论到哪你都能战无不胜)。

文章目录
  1. 为什么是”算是”而不是”是”?
    1. 独立开发网站的能力包括哪些?
  2. 回归正题,作为Java程序员,我觉得有两项通用能力,这两项通用能力,如果让大家来说?
  3. 为什么说Java和数据库是Java程序员的通用能力?
  4. 为什么说熟练掌握并深入理解一门编程语言能决定你能走多远呢?
  5. 那么我们如何避免浅度而更好的深度呢?
  6. 也许有读者朋友疑惑,为什么数据库也被我列为Java程序员的两项通用能力之一呢?
  7. 再回过头来,即便是数据库也有值得深入研究并掌握的?