前言
看到阿里云发起的这次活动,一下引起了我的共鸣,作为一个非科班生,走上技术的道路,并在技术的道路负重前行,回想起我这一路走来的历程,总想分享出来给大家。道阻且长,行则将至!
我与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天左右,基础这块还是很重要的,一定要踏实学完。现在市面上的学习资料有很多,有视频有文档,讲解的通俗易容,小白也很容易能接受。这块推荐把Alibaba Java 技术图谱的Java语法基础吃透就可以了。这里的核心重点就是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,但由于没有实战过,所以对很多知识都是停留在理论,没有深刻的认识。所以技术学习是一方面,一定得多动手。
三个月后就正式开发起了我们自己的项目,创业的细节我们就不聊了,只说结果最终是创业撑了三年,这三年我几乎是天天都沉迷在技术的海洋中,一有时间就看书,看视频提升自己,并且从一开始就开通了博客,每次学习都会总结分析到博客,至今坚持写博客也有了快6年了,也真实对技术的扎实,后来创业失败,就去工作了。
如何进阶?
从中级开发向高级开发的进阶,一般至少需要两三年的沉淀,而且一般如果自己没有明确的方向,或者没有大佬的指引,靠自己摸索,是需要很长时间的经验积累和深度学习。下面说下高级开发应该具备怎么样的素质。
1、编码能力不用阐述,该会的都得会,熟练应用进攻式编程思想保证独立模块内部逻辑能够正确运行,异常外部依赖有感知,可处理。
2、熟悉的系统设计方法论,对分布式架构设计有初步的经验。
3、熟悉开源框架原理以及核心设计思想与关键实现细节。
4、可基于架构师设定的目标主导小型分布式系统详细设计。懂得CAP的权衡,并基于合理的判断做出技术选型与方案设计。
5、基于业务的核心痛点可给出技术领域内的应对策略。
能掌握到以上,去面试一个公司高开,问题不大了,但是再往上,还得具备一定的管理能力如,能够承担大型项目管理工作,合理拆解与分配任务并通过定期的任务跟进与沟通协作机制保证如期如质交付。具备初步的团队管理能力,会基于团队日常工作的特征设定管理规则与制度,做必要的日常监督,且能够利用OKR等管理工具落实奖惩。可基于所负责的团队短期目标制定规划。
那么要如何才能做到这些,才能具备这样的能力呢?如果培养你的团队?作为TL角度和研发角度,如何思考问题?这里分享下我在自我驱动和团队管理中的一些经验,简单可以整理为以下几个关键字:技术深,业务熟,执行力高,有创新,有owner精神,响应快,为团队做贡献。
技术扎实
作为一个技术人员,技术自然是最重要的,这是自己的手艺,手艺都丢了可想而知。如何提升自己的技术?简单整理如下:
业务熟
技术是为业务服务的,没有业务不会有人为技术买单。这就是互联网的特点。公司领导往往都是懂业务的人,熟业务的价值自然不用多说了。
如何做到对业务很熟?多梳理、多总结、不确定一定要问、多与产品业务沟通和他们一起把他们想要的东西梳理抽象清楚。
执行力
最近在我给兄弟们做分支管理规范的要求(都是一些简单的要求),信息也传达下去了,但是偶尔还是有人不按规范来,作为TL会感到有点心累。我就在想,我们就这么几个人,如果这东西还需要费那么大劲,我们以后做其它重要的事情还如何确保大家都能按要求完成工作呢?更别说以后人多了咋办呢。想来想去,这就是执行力的问题。这是TL角度的思考,其实从研发人员的角度想也很简单,至少要做到以下几点:
有创新
创新好理解,就是去思考工作中、业务中、产品中遇到的方方面面,提出新的想法,并推动落地。落地是创新最重要的点,往往大家都会忽略这一点,其实不落地的想法一毛不值,只有落地了才能称之为创新(创造新的东西)。
创新落地又分为小的工具和系统化的平台。大家应该有感触,小的东西永远只能解决零散的小问题,而且很容易被别人copy,且不容易拿到结果。是的,要有平台化思维,在这方面阿里做的就比较好。大部分创新都可以用平台化
的思维去解决一个面的问题的,而且这个平台是能够带来聚集效应的,可以形成闭环,更容易推广和形成核心竞争力,对自己来说就更容易拿到结果。
有owner精神
一件事或者一个系统的owner,很好理解,就是要对它负责,它的任何东西owner都是第一责任人或者受益人。在工作中TL会指定一些owner,然后由owner来把这件事情彻彻底底的负责起来,做为owner最基本的要求就是这件事情你要负责起来,主动去解决问题(有问题可以找TL寻求帮助),多和TL沟通汇报当前存在的问题和进展。
但是我们这里说的owner精神远不止这些,从研发人员角度来说,可以概括为以下几点:
响应快
7*24小时onCall,互联网行业对研发人员的基本要求。如果你还在怀疑这点,你绝对不是一个合格的互联网研发人员。举个例子:当时在阿里时,团队内对大家的要求是,报警响了(阿里的监控做的特别好),相关人员立马响应(因为阿里的流量太大,响应慢一慢系统可能就挂了),这个前后不会超过5分钟,就在这种情况下,我发现每次一收到报警打开电脑,群里已经有人(那几个刚毕业的小孩)说话了:”XXX问题我在看“,过了5分钟,群里就会看到结论了。包括半夜的报警,我感觉这才叫响应快,TL如果不推崇这种精神那还推崇啥呢?
当然啦,响应速度和精力有关,刚毕业的小孩精力旺盛,生活琐事相对少些。对工作多年有家有室的老程序员来说的确有点为难。但是不管怎样这个意识是要有的,有时间要关注群里的线上问题,并及时响应。线上有报警在条件允许的情况下,要主动迅速的去跟进问题。即使条件不允许,帮忙协调下,群里问问谁有空,打个电话沟通下还是可以的。(这也是owner精神的一种体现)
如果大家都有这个意识,并付诸行动,我相信基于团队的力量做到7*24小时onCall也不是难事。
说完响应快我要强调一下,平时不关注群消息,下班后就再也不露面的同学要注意了,其实这一点你已经损失,”有owner精神“和”响应快“这两条了。你基本已经掉队了(除非你其它点很强)。
为团队做贡献
研发人员是处在一个团队中的,团队中的每一个人都必须是无私的为团队做贡献的,如果把自己与团队分开,处处以个人利益为主,那必然成为团队的坏味,将是被团队淘汰的首选。从研发人员的角度,为团队做贡献可以但不限于以下几个方面:
结语
以上就是我这么多年以来,从技术提升,到软实力提升的一些经验总结,希望能对你有所启发,欢迎提出意见!