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

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

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

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

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

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

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

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

  • 需求理解、需求分析、数据建模。
  • 前后端开发能力(包含开发过程中的问题解决)。
  • 运维能力(写一个项目部署到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,其它语言也是一样通用的,深入理解一门编程语言和数据库,无论到哪你都能战无不胜)。

Java程序员的两项通用能力的更多相关文章

  1. Java程序员的发展前景

    不知道什么时候开始,IT业初级程序员的工作性质与进城打工的"农民工"变得如此惊人的相似.很多IT公司的高管认为"人便宜,就是要用到坏掉,然后再找更便宜.更年轻的" ...

  2. 对于长沙互联网发展,一个外来两年Java程序员的所见所感所愿

    惟楚有材,于斯为盛 本文有感于2019长沙互联网求职招聘大会,内容比较多,但都是我自己的一些所见.所感和所愿. 2019年3月的最后一天,参加2019长沙互联网求职招聘大会,看到了很多的招聘企业,也看 ...

  3. 两年Java程序员面试经验分享,从简历制作到面试总结!

    前言 工作两年左右,实习一年左右,正式工作一年左右,其实挺尴尬的,高不成低不就.因此在面试许多公司,找到了目前最适合自己的公司之后.于是做一个关于面试的总结.希望能够给那些依旧在找工作的同学提供帮助. ...

  4. Java程序员应该掌握的10项技能

    这篇文章主要介绍了作为Java程序员应该掌握的10项技能,包括java的知识点与相关的技能,对于java的学习有不错的参考借鉴价值,需要的朋友可以参考下   1.语法:必须比较熟悉,在写代码的时候ID ...

  5. [转] Java程序员学C#基本语法两个小时搞定(对比学习)

    Java程序员学C#基本语法两个小时搞定(对比学习)   对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...

  6. 作为Java程序员应该掌握的10项技能

    本文详细罗列了作为Java程序员应该掌握的10项技能.分享给大家供大家参考.具体如下: 1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知 ...

  7. 网易Java程序员两轮面试,这些问题你能答对几个?

    一转眼,2018 年已经过去了,你是否在满意的公司?拿着理想的薪水? 虽然"钱多.事少.离家近"的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难.但是,有些 ...

  8. Java程序员必须熟知的十项技术

    1.语法 Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令 必须熟悉JDK带的一些常用命令及其常用选项,命 ...

  9. JAVA程序员面试宝典

    程序员面试之葵花宝典 面向对象的特征有哪些方面    1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题 ...

随机推荐

  1. 内蒙古特检院利用物联网/RFID技术提高电梯检测水平

    随着电梯检验工作信息化进程的进一步深入,内蒙古特检院从检验工作中寻找新方法.新手段,为检验员新引入电梯检验手持终端设备,力求提高电梯检验水平,将"电梯安全惠民工程"落到实处. 电梯 ...

  2. 如何设计scalable 的系统 (转载)

    Design a Scalable System Design a system that scales to millions of users (AWS based) Step 1: Outlin ...

  3. 四、CentOS 6.5 上传和安装Nginx

    CentOS 6.5 上传和安装Nginx

  4. php并发加锁

    CleverCode在工作项目中,会遇到一些php并发访问去修改一个数据问题,如果这个数据不加锁,就会造成数据的错误.下面CleverCode将分析一个财务支付锁的问题. 1 没有应用锁机制 1.1 ...

  5. ACM--[kuangbin带你飞]--专题1-23

    专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...

  6. POJ - 2387 Til the Cows Come Home (最短路入门)

    Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...

  7. System.Linq.Dynamic字符串转委托

    以前一直想着有没有一个方法能够把字符串直接转化成函数的,刚好有需求就找了下,还真有. 微软地址:https://docs.microsoft.com/en-us/previous-versions/b ...

  8. Qt编程基础入门之二

    QMainWindow 菜单栏 菜单栏 最多有一个 //菜单栏创建,一个 QMenuBar *menu = new QMenuBar(this); // this->setMenuBar(men ...

  9. Springboot邮件发送思路分析

    毕业设计里需要邮件发送,所以学习,总的来讲,我考虑以下几点, 代码量少,代码简单.配置少,一看就懂,使用 JavaMail 太麻烦了. 异步执行,添加员工之后会发送入职邮件, 多线程处理,设计里有一个 ...

  10. 【杂谈】Disruptor——RingBuffer问题整理(一)

    纯CAS为啥比加锁要快? 同样是修改数据,一个采用加锁的方式保证原子性,一个采用CAS的方式保证原子性. 都是能够达到目的的,但是常用的锁(例如显式的Lock和隐式的synchonized),都会把获 ...