前言

笔者从事Java开发六年有余,从什么都不懂的小白一路成长到上市公司管理20人的技术leader。管理的团队,虽然人数不算多,但也是对于我这个非科班生这么多年努力的一种肯定。在技术的道路上,我没有走过什么弯路,一切都是按照自己规划的样子在走下去。但对于一个非科班生来说,如果想在技术的道路坚定的走下去,那么一定是艰辛的。大学四年的知识债务,总是要还的。通过这篇文章,相信无论是初入行业的小白,还是职场老手,我从技术提升角度,如何一步一步成长起来,从如何管理角度分享我这么多年以来的经验。希望能对你有所启发,欢迎在讨论区参与讨论。

我与Java的邂逅

时间回到2014年的夏天,浑浑噩噩过完大学四年的我,面临我的,就是那时人们常说的“毕业即失业”,呵呵,像我这样大学就连四级都考不过,四年一次奖学金都拿不到,大一当班长,大二就被辅导员因为不称职被撤职,同学眼中的混子学生,怎么可能找得到工作?毕业季,当大家都在参加各种企业的校招,我却天天在宿舍睡觉打游戏,连实习经验都没有,我拿什么资本去和那些优秀的学生一起去竞聘岗位,所以我把这一些都归功于我的专业垃圾,因为当年被调剂到了这个全国不超过10所学校开设的超冷门专业,我对前途不报任何期待,大一就给自己放弃奋斗想好了借口,专业这么垃圾,就算好好学以后也找不到好工作。所以我很“愉快”的度过了我的大学四年,庆幸的是,脑瓜子倒是挺灵活,平时上课不听,考试前,去读书馆自学两三周,就能顺利通过期末考试,大学没有挂过科。

那么我又是怎么和编程有了交集,又怎么就入了这行呢?虽然大学四年对学业不抱希望,但是我对赚钱乐此不彼,大二开始就没有从家里要过钱,学费生活费都是自己挣的。因为家里的表哥堂哥都是在互联网行业,他们有自己的渠道去帮商家做网络推广,所以平时没事就跟着他们一起兼职做做,利润是真的客观,一直到毕业,除去学费吃喝玩乐的费用,支付宝余额还剩余8万多。因为在跟他们做业务的时候,经常看他们会用一些脚本去做一些采集和自动化的操作,对此非常好奇,后来才知道,这些脚本都是用Python写的。由于强烈的兴趣,我的第一门语言就是Python,平时没事就在宿舍琢磨Python,自学了一段时间,已经可以去写一些简单的脚本了,后来慢慢熟悉,就帮着表哥他们公司去定义一些个性化的脚本,一开始效率低BUG多,尝尝被吐槽,呵呵,遇到的坑多了,经验也就多了。后来在一些众包平台,也自己去接单帮别人写一些脚本,大学几年写的脚本有几十个了,赚了也有好几万,第一次尝到了通过技术带来的甜头,可是靠这个零碎的收入毕竟不是长久之计。在毕业后回来家中,父母也没有催我找工作,只是让我好好想一想,未来到底要干嘛?

毕业那段时间,我想了很久,最终决定,我要考研,跨考计算机专业。我要在技术的道路上走下去,因为每次写代码,当软件成功运行起来的那一刻,我是无比的兴奋。说干就干,毕业后没有上班,而是在家里专心备考,买了很多考研的书,还有计算机专业课,通过那段时间自学的专业课,对计算机世界又有了新的认识,这对于我后来学习Java上手难度容易多了,对技术的思考也更深刻。经过大半年的备考,我成功的......没有考上,哈哈,人生没有那么多鸡汤,并不时努力就有收获,但起码没有遗憾。其实也并不时没有考上,因为当时目标院校是一所985,划线过高,但是有机会调剂,可以调到一个普通院校,但是最终还是放弃调剂了。现在想想后悔莫及呀。

但是我并没有因此与技术道路分道扬镳,就在15年的年初,我们家庭聚会都一起,表哥们问到我考研结果如何,我说:“目标院校没考上,放弃调剂了,问我下一步有啥打算,我说要嘛再战,要嘛就去找个班上。”

他们说这样的,“我们现在成立了一个公司了,我们希望做一个私域流量平台,自己研发,但是呢我们这边就一个懂技术的,公司刚起步,也没那么多钱去招聘开发人员,我看你挺有编程天赋的,你想不想加入我们,咱们一起做?”

我惊喜道:“当然想呀,可是我只会Python呀,你说的那个平台要用什么语言做?”

“后端用Java做,你不会没关系,有老吴(他们团队唯一的开发,是表哥以前的死党,以前在讯飞干过几年开发)可以带着你,你有编程基础,脑瓜子又灵活,上手很快,真好我们公司还在筹备阶段,你可以先跟着老吴学着,老吴很强的一个人,后端前端全能”

听到这里,我已难以按捺住激动的心情,眼角红润:“太好了,我终于有出路了!”这对当时压力巨大的我,就像一个救命稻草,因为即使我再次二战,就算考上,等毕业已经是二十八九岁了,才能开始上班挣钱,对于一个农村娃来说,家庭压力是巨大的,而且父母身体还不好。所以尽早能工作赚钱,是我当时一个迫切的期望。

于是,没多久,我就打包好生活用品之类的,来到了当时他们租的办公场地,在一个不起眼的写字楼里,办公面积不足80平,一开始工作人员只有我、表哥、堂哥和老吴四个人,我带着我大学赚的8万块钱一起入股了这个公司。

到这里,算是正式开始了我的技术生涯。由于有了一些C语言、Python基础和计算机专业知识,对于学习Java来说上手容易多了。

我如何学习Java的

老吴是一个尽职尽责的人,对于技术分享毫不吝啬,就是我的Java启蒙导师,刚去就给我定制了3个月的学习计划,从基础到框架再到Demo,三个月时间必须全部整会,这三个月时间他们做一些前期工作。到时候我们就要进入项目开发阶段,希望我不要拖后腿,有了目标,我学习起来格外卖力。

每天在公司都是在看视频,看文档学习。当时看的视频主要是来自于B站的某马的课程。一边看视频,一边做总结笔记,最后再自己练习。

Java基础这款大概花了10天左右,基础这块还是很重要的,一定要踏实学完。现在市面上的学习资料有很多,有视频有文档,讲解的通俗易容,小白也很容易能接受。这里的核心重点就是Java的数据结构,一定要吃透,理解其本质。

掌握了Java的基本语法,可以尝试去刷一刷算法题,加深对Java语法的熟悉度和数据结构的理解度。了解时间复杂度和空间复杂度。

具备了基础知识,接下来就是要对数据库、Java Web方面的学习,这里也是很重要的一个阶段,学会这里,你就可以通过Java去操作数据库了,可以写一些入门的信息管理系统了。数据库建议把Mysql作为主要学习方向即可,MySQL目前还是现在市面上主流的数据库。数据库这里,你需要掌握SQL语法,MySQL的基本原理,能够熟练编写SQL进行增删改查,能够通过JDBC操作数据库,Java Web方面,你需要对HTML、CSS、JS、Ajax有基本了解,能写出简单的页面,对于JSP、Servlet熟练掌握,对于XML、Filte、Listener有一定了解。

有了以上知识,可以尝试从网上找一些管理系统项目,自己写一写。学到这里,大概需要三周时间,掌握这些,恭喜你,已经入门级别了。上面两个阶段,如果想看一些书籍的话,推荐《Java基础入门》、《Java Web程序开发入门》、《Java Web程序开发进阶》、《Mysql数据库入门》,我当时就是买了这些书,对于小白来说,非常适合入门学习,为了避免广告嫌疑,自己可以在淘宝搜一搜相关的数据就行。

再往下一步就是各种框架、中间件的学习了,有以下知识点,你需要熟练掌握,框架类:Spring、Mybatis、SpringMVC这三个先学完,除了熟练使用这三个框架,还还需要具备,将三个框架集成的能力,尝试使用这三个框架搭建一个简单的web工程,另外你之前需要掌握maven、Git、SVN的使用。有了SSM框架的基础后,希望你继续学习Spring Boot框架知识,因为了解了Spring Boot之后,你会发现,你之前为了把SSM框架集成费了那多精力写的配置文件的问题,在SpringBoot中将不再有烦恼。

到这里你已经具备初级开发者的能力,可以参与开发一个单体项目。但是目前很多公司基本项目都是分布式的,所以至此如果你想在一家中大小公司能够胜任开发岗位,你还需要熟知分布式相关知识。如RPC框架、Spring Cloud相关、Redis、MQ相关、ElasticSearch、分库分表、分布式事务等等,这里面每一个都需要花费大量时间去琢磨,掌握这些你已经达到了一个中级开发的水平。

以上技术点,其实基本涵盖了市面上主流的技术栈,如果你还有余力,可以去了解下大数据相关知识及云原生相关。学到这里花了大概三个月的时间,全职的学习投入,时间不算短也不算长,期间也做过一些简单的Demo,但由于没有实战过,所以对很多知识都是停留在理论,没有深刻的认识。所以技术学习是一方面,一定得多动手。

如何进阶?

从中级开发向高级开发的进阶,一般至少需要两三年的沉淀,而且一般如果自己没有明确的方向,或者没有大佬的指引,靠自己摸索,是需要很长时间的经验积累和深度学习。下面说下高级开发应该具备怎么样的素质。

1、编码能力不用阐述,该会的都得会,熟练应用进攻式编程思想保证独立模块内部逻辑能够正确运行,异常外部依赖有感知,可处理。

2、熟悉的系统设计方法论,对分布式架构设计有初步的经验。

3、熟悉开源框架原理以及核心设计思想与关键实现细节。

4、可基于架构师设定的目标主导小型分布式系统详细设计。懂得CAP的权衡,并基于合理的判断做出技术选型与方案设计。

5、基于业务的核心痛点可给出技术领域内的应对策略。

能掌握到以上,去面试一个公司高开,问题不大了,但是再往上,还得具备一定的管理能力如,能够承担大型项目管理工作,合理拆解与分配任务并通过定期的任务跟进与沟通协作机制保证如期如质交付。具备初步的团队管理能力,会基于团队日常工作的特征设定管理规则与制度,做必要的日常监督,且能够利用OKR等管理工具落实奖惩。可基于所负责的团队短期目标制定规划。

那么要如何才能做到这些,才能具备这样的能力呢?如果培养你的团队?作为TL角度和研发角度,如何思考问题?这里分享下我在自我驱动和团队管理中的一些经验,简单可以整理为以下几个关键字:

技术深,业务熟,执行力高,有创新,有owner精神,响应快,为团队做贡献。

技术扎实

作为一个技术人员,技术自然是最重要的,这是自己的手艺,手艺都丢了可想而知。如何提升自己的技术?简单整理如下:

  • 多学,我们这行最大的特点就是活到老学到老,学习能力正式我们这行的门槛,无论多忙都要经常去学习新的技术,巩固旧的技术。
  • 多做,动手能力是技术能力的最重要的一个部分,学习或者工作中遇到任何问题,去动手做,去用代码验证得出来结论,这样在跟别人撕的时候才有底气嘛。
  • 多思考,凡是要多问个为什么?其实这个很难,经常会问不出为什么。我的方法是,零散的理解之后,可以串起来完整的思考一遍,一环扣一环串起来推演,过程中会发现不清楚的地方,然后想清楚,每个环节尽量的再往深处想,再多想想各个点是要解决什么核心问题,如果不这样做,按其它思路有什么优缺点。
  • 多交流,多和大牛交流这是事半功倍的最好办法,大牛直接给你指点一二的好处自然不用说了。除此之外,你永远不要觉得自己懂了,跟不同人对同一个问题探讨两到三次以后,你会发现这时候你才真正懂了。你可以从中发现别人的思考角度似乎和自己不一样,但是别人的也没问题。交流也不一定是要谁说服谁,其实就是想要知道别人是怎么想的,自己再回去重新梳理一遍,把尽可能多的场景想清楚。

业务熟

技术是为业务服务的,没有业务不会有人为技术买单。这就是互联网的特点。公司领导往往都是懂业务的人,熟业务的价值自然不用多说了。

如何做到对业务很熟?多梳理、多总结、不确定一定要问、多与产品业务沟通和他们一起把他们想要的东西梳理抽象清楚。

执行力

最近在我给兄弟们做分支管理规范的要求(都是一些简单的要求),信息也传达下去了,但是偶尔还是有人不按规范来,作为TL会感到有点心累。我就在想,我们就这么几个人,如果这东西还需要费那么大劲,我们以后做其它重要的事情还如何确保大家都能按要求完成工作呢?更别说以后人多了咋办呢。想来想去,这就是执行力的问题。这是TL角度的思考,其实从研发人员的角度想也很简单,至少要做到以下几点:

  • 按要求做事,研发人员心理要有杆称,做一件事情,自己要很清楚TL是如何要求的,自己这么做是不是符合要求,不符合要求要么改正要么跟TL沟通,确认这样做行不行。
  • 把TL的交代放在心上,互联网公司讲究的是开放宽松的工作氛围,这就必然导致TL不可能每一件事情都像布置任务一样安排给你。更不可能把每一件事情都想清楚了再交代给你。正常情况可能就是在沟通过程中的一句话。可能这件事情并不靠谱,但这不重要,你一定要放在心上,去把他梳理清楚,得出个结论,不管结论是可行还是不可行,至少有个结论。然后如果可行,再去把这件事情做成,那就太完美了。无论如何,那些听完就忘了,过了几天TL想起来又来问一遍,这样反复下去对自己肯定是不利的。

    举个例子,阿里的五新战略,看上去很风光,就拿新物流来说吧,其实在菜鸟内部,从上到下,根本没有人想清楚啥叫新物流,曾经还有个新来的高管直接问马云”什么叫新物流,我们该做什么?“。但是你再想想,你觉得马云能说明白什么是新物流吗?其实他自己也不明白,所以他给这个高管的回答是:”你太不了解我了,我从来不跟下面的人说该做什么的。“。就这么一个看似不着边际的概念,N多的人扎堆在里面思考,梳理,创新,目标就是实现它。至少大家知道,这个方向是对的,只是暂时还没有探索出道路。其实阿里的很多其它的业务都是用这种方式创造出来的,盒马鲜生就是在这种环境下孕育出来的新零售的代表。我理解这就是执行力。
  • 把事情迅速完成,互联网行业的研发应该有个很大的特点,就是计划经常会变,安排给你的活,永远不是你的全部的活。经常会有新的事情插进来。对的就是这样的,计划只是对这件事的最低要求,你不能因为时间还有就慢慢来,你必须用最快的速度完成它,然后剩下的时间去学习和等待可能来的新的任务。

有创新

创新好理解,就是去思考工作中、业务中、产品中遇到的方方面面,提出新的想法,并推动落地。落地是创新最重要的点,往往大家都会忽略这一点,其实不落地的想法一毛不值,只有落地了才能称之为创新(创造新的东西)

创新落地又分为小的工具和系统化的平台。大家应该有感触,小的东西永远只能解决零散的小问题,而且很容易被别人copy,且不容易拿到结果。是的,要有平台化思维,在这方面阿里做的就比较好。大部分创新都可以用平台化

的思维去解决一个面的问题的,而且这个平台是能够带来聚集效应的,可以形成闭环,更容易推广和形成核心竞争力,对自己来说就更容易拿到结果。

有owner精神

一件事或者一个系统的owner,很好理解,就是要对它负责,它的任何东西owner都是第一责任人或者受益人。在工作中TL会指定一些owner,然后由owner来把这件事情彻彻底底的负责起来,做为owner最基本的要求就是这件事情你要负责起来,主动去解决问题(有问题可以找TL寻求帮助),多和TL沟通汇报当前存在的问题和进展。

但是我们这里说的owner精神远不止这些,从研发人员角度来说,可以概括为以下几点:

  • 主动承担一些分外事情, 你要主动去负责一些不在自己负责范围的事情(可能TL还没有指定这件事情的owner是谁)。为什么要这么做?只有这样,你才能让TL看到你拥有可以owner更多的事情的能力,能力提升力,才能获得更多的机会去往下一步发展。只是把安排给你的事情做好,永远只是自己本职工作,不具备晋级下一阶段的说服力。阿里有句话是这么说的:晋升到下一级别的基本要求是你已经在做下一级别的事情,至少做半年以上了。

  • 首任负责制,就是一件事情到你这里了,你不能简单的判断不是你的事情,就不管了。你有责任去分析判断出这件事情的责任人是谁,并找到他,让他接下这件事情之后,你才可以撒手(有些重要紧急的情况还不能撒手,还需要不停的去确认结果,并及时反馈)。

  • 能成事,做事容易,成事很难!一个和尚抬水喝,两个和尚挑水喝,三个和尚没水喝。说的就是这个团队没有能成事的人,如果你是其中一个和尚,你能带头把另外两个和尚组织起来去把水弄回来,这就是你的成事能力。另外两个和尚充其量就是个做事的,但是成事的这个和尚重要性不言而喻。

响应快

7*24小时onCall,互联网行业对研发人员的基本要求。如果你还在怀疑这点,你绝对不是一个合格的互联网研发人员。举个例子:当时在阿里时,团队内对大家的要求是,报警响了(阿里的监控做的特别好),相关人员立马响应(因为阿里的流量太大,响应慢一慢系统可能就挂了),这个前后不会超过5分钟,就在这种情况下,我发现每次一收到报警打开电脑,群里已经有人(那几个刚毕业的小孩)说话了:”XXX问题我在看“,过了5分钟,群里就会看到结论了。包括半夜的报警,我感觉这才叫响应快,TL如果不推崇这种精神那还推崇啥呢?

当然啦,响应速度和精力有关,刚毕业的小孩精力旺盛,生活琐事相对少些。对工作多年有家有室的老程序员来说的确有点为难。但是不管怎样这个意识是要有的,有时间要关注群里的线上问题,并及时响应。线上有报警在条件允许的情况下,要主动迅速的去跟进问题。即使条件不允许,帮忙协调下,群里问问谁有空,打个电话沟通下还是可以的。(这也是owner精神的一种体现

如果大家都有这个意识,并付诸行动,我相信基于团队的力量做到7*24小时onCall也不是难事。

说完响应快我要强调一下,平时不关注群消息,下班后就再也不露面的同学要注意了,其实这一点你已经损失,”有owner精神“和”响应快“这两条了。你基本已经掉队了(除非你其它点很强)。

为团队做贡献

研发人员是处在一个团队中的,团队中的每一个人都必须是无私的为团队做贡献的,如果把自己与团队分开,处处以个人利益为主,那必然成为团队的坏味,将是被团队淘汰的首选。从研发人员的角度,为团队做贡献可以但不限于以下几个方面:

  • 分享,帮助团队其它成员成长,团队内分享新技术和经验;
  • 提升团队影响力,帮助团队提升在外部的影响力( 外部分享,BBS文章、专利提报);
  • 内推,帮助团队推荐优秀的人才;
  • 提升团队效率,通过创新性工具为团队解决效率或者其它问题;

结语

以上就是我这么多年以来,从技术提升,到软实力提升的一些经验总结,希望能对你有所启发,欢迎提出意见!

Java成长之路--一个非科班生的进阶之路的更多相关文章

  1. 一个编程菜鸟的进阶之路(C/C++)

    学编程是一条不归路,但我义无反顾.只能往前冲,知道这个过程是痛苦的,所以我开通这个博客,记录自己在编程中遇到的问题和心得,一是希望可以帮助跟我一样遇到同样问题的人,二是把这作为对自己的勉励及回忆:

  2. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  3. JavaScript进阶之路 初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  4. java 成长之路[轉載u]

    分享总结title: java 成长之路tags:grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒闭.这 ...

  5. java 成长之路

    分享总结 title: java 成长之路 tags: grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒 ...

  6. 4年前端、2年CTO:一个非科班程序员的真实奋斗史

    1.引言   我,Scott,一家创业公司的 CTO. 从业6年却很少写文章,近一年来接触了几十个刚毕业的前端新人,也面试了100多个前端工程师和Nodejs工程师,对于前端发展的这个职业算是有些感触 ...

  7. Java进阶之路

    Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...

  8. JAVA中内部类和同文件非内部类的总结

    java文件的顶层类(即非其它类的内部类),可见范围只有public和非public(包内可见)2种,不能用private或protected修饰.1个Java文件只能有一个public类,且必须与文 ...

  9. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

随机推荐

  1. 【ElasticSearch】给ElasticSearch数据库配置慢查询日志

    给ElasticSearch引擎配置慢查询日志,可以实时监控搜索过慢的日志.虽然ElasticSearch以快速搜索而出名,但随着数据量的进一步增大或是服务器的一些性能问题,会有可能出现慢查询的情况. ...

  2. 『心善渊』Selenium3.0基础 — 2、Selenium测试框架环境搭建(Windows)

    目录 1.浏览器安装 2.浏览器驱动下载 (1)ChromeDriver for Chrome (2)Geckodriver for Firefox (3)IEDriverServer for IE ...

  3. 【学习】自定义view

    自定义控件其实很简单1/2   Canvas的使用 自定义控件其实很简单1/3   Shader与画布的旋转 自定义控件其实很简单2/3   view的测量 自定义控件其实很简单1/4   FontM ...

  4. 26、samba搭建

    26.1.samba介绍: samba是一个网络服务器,基于linux操作系统,用于linux和windows之间数据的共享: Samba是一个能让Linux系统应用Microsoft网络通讯协议的软 ...

  5. 7、Oracle通过客户端(sqlplus)登录认证用户的方式

    select version from v$instance; #查看当前数据库的版本 192.168.31.5:1521/orcl 7.1.操作系统认证: 1.Oracle认为操作系统用户是可靠的, ...

  6. Docker与k8s的恩怨情仇(四)-云原生时代的闭源落幕

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在本系列前几篇文章中,我们介绍了从Cloud Foundry到Docker等PaaS平台的发展迭代过程.今天 ...

  7. IE浏览器 AjaxForm文件上传错误:Stream ended unexpectedly

    错误日志: 1 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet requ ...

  8. 什么样的CRM系统适合以客户为中心的企业?

    我们不难发现,现代的企业非常依赖CRM系统,这是因为20%的优质客户能够给企业带来80%的利润,而老客户的推荐可以带来60%的客户增长.那么,什么样的CRM系统适合企业?随着信息技术的发展,客户开始拥 ...

  9. Mysql:mysql5.7长时间不连接失效问题

    问题 mysql5数据库连接超时问题:待机一晚上后,第二天早上第一次登录总是失败. 查看日志发现如下错误: "com.mysql.jdbc.exceptions.jdbc4.Communic ...

  10. so层反调试方法以及部分反反调试的方法

    1.检测ida远程调试所占的常用端口23946,是否被占用 //检测idaserver是否占用了23946端口 void CheckPort23946ByTcp() { FILE* pfile=NUL ...