前言
看到阿里云发起的这次活动,一下引起了我的共鸣,作为一个非科班生,走上技术的道路,并在技术的道路负重前行,回想起我这一路走来的历程,总想分享出来给大家。道阻且长,行则将至!
我与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 技术图谱https://developer.aliyun.com/graph/java?spm=a2c6h.21459105.J_6527992900.1.5bb27009KBIz9P的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角度的思考,其实从研发人员的角度想也很简单,至少要做到以下几点:
- 按要求做事,研发人员心理要有杆称,做一件事情,自己要很清楚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文章、专利提报);
- 内推,帮助团队推荐优秀的人才;
- 提升团队效率,通过创新性工具为团队解决效率或者其它问题;
结语
以上就是我这么多年以来,从技术提升,到软实力提升的一些经验总结,希望能对你有所启发,欢迎提出意见!