很多同学曾经问我,该学习什么技术,怎么样去学习技术?其实每当我听到这个问题,我是无比纠结。这是一个无法回答的大问题,这种话题可以吹上几年,并且每个人都是独特的,方法只能借鉴不可复制也。下面说说个人学技术的一些感悟,也许全都是错的,但是我就是要写出来。(不喜欢看长文章的同学请直接看结尾总结那段即可)
一、学习技术的目的
我们学习技术往往是带有功利心的,哪怕你用技术来玩,也是一种目的嘛。所以,每当你问别人,该学习什么技术的时候。先问一下自己想要做什么。举一个例子,一个上了大学java课程的同学跑过来问我,我应该如何学习,要学什么东西?
我会反问他一个问题,你以后想去开发安卓亦或者是开发网站,还是说想搞游戏。只要他回答出这个问题,我也知道如何回答了,假设这个同学选择了网站开发。
我会说,你想办法用java实现我用浏览器看到hellow world!这几个单词,在实现之前就别问我要学什么。因为我告诉这同学,你要学servlet,filter,listener,接着学ssh框架,学习数据库,学nosql,学模板引擎,我相信他会抛更多的问题并且被吓呆了。
如果这同学抱着解决问题的心态学习,一切迎刃而解(不得不感谢当年没有一个人带我,让我自学变得现在这么拥有这么野路子的技术)。
我们要明白一件事情,我们要学习的技术都是为了解决特定的问题。我们来看看一个java工程师为什么会学习那些技术,下面用上面出现的同学A举例(不喜欢看故事的请跳开下面的小故事,这个故事仅仅是说技术仅仅是为了解决问题)。
1、同学A听了我说的话,写出了hello world!然后我叫他,访问各种url,输出不同的内容。他学习如何用xml配置servlet。然后他为了现实接收html的表单数据,就去学习如何接收get和post参数。为了识别用户登录信息,又知道了要学习session。为了动态输出html页面,又学会了jsp。
2、同学A学会最简单的jsp之后(页面混杂java代码,循环输出字符串等),然后发现print字符串太恶心,然后发现jstl标签可以不用写print字符串,整个页面优雅了。
3、同学A又遇上一个问题,他很多页面在未登录的情况下,要跳转到登录页面,然后他只好每个函数写一个if处理。写多了,人都受不了,这个时候,发现filter可以一个函数处理,赶紧去学一下,完美。
4、同学A又抛问题了,他说要统计当前在线用户数,咋办呢?一查资料,原来listener可以监听session创建和删除。那么全局一个计数器,事件触发修改计数完美。
5、同学A遇到一些需要保存用户数据的地方,然后屁颠屁颠的跑去学习如何使用如何操作数据库。
6、同学A这个时候,又来骚扰我了。他问为什么很多企业招聘要ssh框架,为什么要用这些框架呢,又要怎么学?首先,我们来看看struct2提供了什么功能(搜索引擎搜一下就知道了)?过滤器,国际化,更强悍的标签。再看看hibernate,让我们不用写sql了,可以防止sql注入。最后看看spring,什么IOC,AOP。我们该怎么学呢?我们只需要出于安全性,方便性,可维护性的目的用这些技术实现我们要实现的需求即可,用不到的,不用急着学习。
故事到此为止。。。
二、我怎么知道有什么好技术啊?
看了上面这个又长又不好看的小故事,也许你会忍不住骂我,我怎么知道有什么好技术来更好的实现需求呀!别急给三个路子你瞧瞧:
1、请跟一个商业项目从开始做到一个阶段完成(请参与团队开发那种,要商业性质的或着面向用户的)。
相信我,一次下来你就已经可以应付绝大部分工作了。为什么我不叫你自己搭一个博客,自己折腾几个课程设计来学习呢?因为那些只是玩具,相信你也不会有多大动力写,也不跟实际挂钩。
面对用户的项目,你可以真实接触到错综复杂的情形,才能经历真正的需求。之所以选择团队开发,因为可以给一个机会学习别人会的技能嘛(本人就是因为队友使用docker,rabbitmq等,从而才知道有这种东西)。
2、请看别人总结的技术图谱,站在巨人的肩膀上嘛,网络一大堆总结,如何寻找就看自己机缘巧合了。
3、问一些前辈,了解一些有用技巧(我虽然不是前辈,但是我做过架构,带过技术团队,并且乐于分享,前提你私信我或者是我微信好友)。
三、不要为了用技术而学使用技术
我的一个非技术师兄曾教导我:切勿为了炫技而使用技术。请记住:
技术是为了解决问题的
例如,我们搞活动,需要提供一个简单不变的宣传页面给运营。本来我们简单写一个html静态页面即可。但是,我们为了炫技。上vue,上ssh框架做一个管理后台给运营修改页面。我的天,这样子既拖工期,又浪费精力。
我们再看看一些高级一点点的技术,例如异步处理,使用消息中间件(rabbitmq,kafka等)。我们真的要用到这些技术吗?同步真的就无法解决性能问题吗?消息中间件就不能简单的redis代替吗?
很多人吐槽企业的系统技术渣,用的是十年前的技术。但是请看看,他们的系统是不是运行得十分平稳。你用新的技术,往往出了问题,社区都还没有给出解决方案呢。
总之一句话,用什么技术,学什么技术请按实际需求出发,我们需要的是最简单最高效的实现方法。
四、学技术前请看看他的发展史
很多人在看技术书的时候,看到历史就跳开了,也包括我。但是这种做法让我们多走了弯路,别以为那些书写写历史是为了凑字数,我们读历史可以知道它为何会出现,因为存在即合理(就像我写文章,只要你有所收获,这件事情就是合理的)。
例如,我们看看数据库技术的发展历史。我们就明白为什么要用数据库,为什么要使用某种数据库引擎,主从技术何时使用等等。
当我们知道技术是为了技术什么问题而生的时候,我们就知道我们把它用于何处,所以我们经常问的一句话是,该技术适用场景是什么?而缺点又是什么?
五、理解技术的原理比学会使用重要
就像当你了解http协议之后,你就明白cookie是怎么工作,你也知道单点登录是如何实现,也懂得浏览器缓存的各种实现方式。
当你知道了原生js,你就明白jquery能做的东西,不会jquery也可以实现。自己也可以造一套像vue那样子的前端框架。
我的一个建议是:请尝试造轮子,只有造轮子才会真正理解技术的原理,别被那些不要重复造轮子的言论欺骗了,看看大公司们造了多少轮子。如果你沦为只会用轮子的人,某一天用得特不爽的轮子,你也只能含着泪来用。
六、技术要广了解,而精一门即可
我们来看看浮躁的前端领域,反正我是怕了,前端为何要学这么多东西?es5,es6是什么玩意?vue,React ,Angular 又是什么?webpack,grunt 等。然后还有less,scss。当然前端还在学nodejs,厉害呀,全栈工程师。
人精力是有限的,上面那堆东西肯定有人都玩得很熟,但是这种技术人有多少呢?作为一个普通人,可以了解每一种技术的入门用法,熟练掌握一种用于日常开发即可。
请记住,它们仅仅是你拿来解决问题,挣钱养家的工具而已(我会php,java,golang,会vue,也会linux,redis,mongodb,mysql,rabbitmq,docker,特别会python和服务器部署,所以别人愿意把我作为技术顾问,虽然我写文章不太行,但是解决技术问题还是挺溜的)。
七、不要以为阅读收藏了一堆网上的热门文章就能提高技术
看100篇文章还不如实践一次,别以为看了什么高并发架构文章,看了什么前端最佳实践,你就可以写出多么优美的系统,反正一到实际就会发现文章仅供参考。再说收藏文章这一事情,收藏真的只是收藏,看看你收藏的文章多久没回顾就知道了。
正确的做法是,阅读文章后做总结,最好是有机会实践。看了本文也一样,你就吸收你认为有用的观点就好,别的请忽略。
普通人跟大牛的差别是,大牛凌晨两点还在技术攻关,普通人可能在愉快的玩着游戏。
八、学技术我们其实在学什么这个问题的答案
- 请为了解决问题而寻找一种技术,且为了解决问题而学习
- 技术永远是一种工具,请让业务驱动你学习技术
- 请学会造轮子,如果不造轮子请确保你有改轮子的能力
- 请学会技术的底层原理,这也是为什么大牛对于什么技术都手到拿来的原因
- 阅读技术文章或者技术书籍之后请总结,然后尝试实践之。
- 所谓的高级技术就是低级技术组装而成,所以请学会底层技术。
总结:
学技术就是学习解决问题的方法,入门跟大神的区别仅仅在快速想到解决方案的效率(本文完)