固阳音箱协会

如何快速掌握一门新的技术

中睿IT服务2019-01-09 15:01:33

点击上方蓝字“中睿IT服务”一起玩耍

        网络时代,获取信息的渠道变的更多,也更便捷。然而在汪洋如海的知识里,如何能找到自己的方向,这需要一些技巧。


        新的技术,往往是之前的一些技术,发生了一些突破,创新后变成了一种新的概念,描述,然而本质不会改变,我们要找寻的便是,通过网络零散的知识,如何快速形成自己的学习计划。


        很多人遇到新的知识,总是显得焦虑、不得章法,导致迷茫慌乱,反反复复地没啥进展,时间成本很大,却收效甚微。究其原因,在于没得思路,不知该如何去学习。


        一个新的知识出来,首先要看的是它是什么,它能做什么,对你而言你是要致力于这个方向,还是只是浅尝辄止?每个人的精力有限,有时要学会借力打力,见招拆招。而不是自己奋力先自行修炼,认为自己可以出山,才出关道士下山。


        如今知识爆炸时代,如果门门都去掌握,肯定是不现实的。如此就要去关注自己感兴趣的方向,然后深入将核心掌握,然后抽离出来模型,放入实践中进行验证,完成自己的一套知识体系。


        举个例子,手机系统,抛开其他先做一个模型,手机组成为硬件,驱动,软件。经历过单片机,嵌入式开发版的人来说,拿到一些板子,外接一个LCD,然后自己去照着手册,编写驱动程序,封装一些接口,让做应用软件的人员,直接使用调试好的这些接口,来完成功能实现。


        当开发复杂的应用时,要做多任务,但显示界面没有一套UI库,于是开始找开源的系统,比如μC/OS II 和uclinux等一系列的系统便涌了出来,解决任务,进程创建,调度现场保护等等,让我们可以快速使用多任务而不用关注太多细节;多进程,完成更加复杂的事情,界面控件,响应,再借助别的GUI系统,比如wxwidget和 qt等等来完成搭建我们的界面库,将其移植过来配合我们的系统,来实现绘制,响应。


        关于操作系统,GUI的内部实现,我们可以不必深究,但必须了解其机理和懂得操作系统的大致实现进程的方式,比如构造一个PCB表,构造堆栈控件,线程切换保护现场模式。要能够自己打通,形成自己的一套概念


        技术千变万化,却万变不离其宗。脚本语言出现了那么多,实质还是一个解析器。按照约定,去读取解析然后执行。然后我们把这个约定叫做语法,把解析叫做语法分析。将很多东西进行一句话总结。一句话模型,是自己先对某个知识,形成一个简单的概念,然后顺着这个方向,去细化知识,理解实现原理,然后回过头来,加深一句话的总结,做到心中有数。


        在刚接触一个新的知识的时候,首先要做的是,搜索概念,了解它是干嘛的,然后去看下大家都用它在做什么。然后看下它是否能解决你的诉求。距离SDL框架来说,第一件事便是了解,它主要解决什么?它主要解决图片的渲染,就是如何将一帧画面显示在各个平台。用它来做个图库肯定是可行的。想用它播放视频,既然它就是图片显示,那视频解码出来就是一帧图片,如果借助其他的库将视频解码出来,拿过来让SDL去显示,就可以播放视频了。于是就找到了ffmpeg+SDL组合来完成视频播放器。


        那么它做游戏可以吗?可以。想做复杂的,比如有地图文件,物理碰撞,粒子炸弹效果,界面GUI,我们发现SDL本身没有,所以要用它就需要移植。有人会说,何必呢?有一些现成的游戏引擎,支持的很好了。比如cocos2d和libgdx,开发游戏来说更加方便,快捷。确实如此,那么我们用SDL的意义在哪呢?其实SDL要做的很简单,比如你开发了一个游戏,比如之前是在一个特定显示器的,然后自己想移植到PC上或者ios或者android来玩,那么你要做的就是事件匹配,触摸匹配,以及绘制匹配,而这些SDL已经帮你做好了,你就可以参照SDL的官方文档将游戏移植过来了。


        回到主题,我们怎么快速的掌握一个新的知识呢?


        首先,官网介绍。官网会将它的用途讲解出来。这个概念,你要快速形成模型来决定是否需要学习,短时间内是否能够掌握。不必勉强不擅长的一味逞强去学习,到头来自己迷茫,也没啥收获。比如学习手写识别,做过一些demo,但是识别率比较低,而自己尝试了下,发现这个领域,自己是没法短期突破,因为不着思路,所以就要退出,说明这个方向不适合自己,就不要瞎去研究。当然,如果你有的是时间、须要研究,那就另当别论了。


        从开始的技术流,看到什么都去学下,导致很多东西都是略知皮毛,导致都没深度,没有深度,意味着没有竞争优势。某个方向,发展成自己的优势,尤为重要。技术流是做技术的核心竞争,但不可太过零散,要做到收放自如,哪些必须掌握,哪些可以一笔带过,哪些需要研究一番,抓住主干,切不了细枝末节都牢牢抓住。当然,如果就是专攻此方向,那就另说。


        学会整理、鉴别、快速搜寻答案。比如开发应用第三方库,网上有很多对比,MPchart和hellochart,但hellochart比较简单,并且它能解决诉求,于是就尝试快速上手了。但开发完城后,使用时发现做的很多地方比较死板,让开发的人员用起来比较别扭,这个就是时间问题了。如果觉得自己是长线要做图表的,那就每个都看看,找到更适合自己的为止。


        很多开源的都是需要简单调试的,于是快速找出可以使用的为止,调整小的问题,需要有能力阅读代码完成修改。例如说greendao,一个非常好用的三方数据库方案,在使用的时候发现不能创建两个实例,也就是不能有两个db文件被创建,有很多人开发,想账户和应用数据想独立存储,放在两个db里面,那么可以确定greendao做不到,因为它的单例模式不允许,它的很多内容用了一个全局变量。想做成两个db请换其他开源库,如果不是必须要两个db,那可以做两个table来解决此问题。


        要有能力解决问题,开源库会磨炼技术,提升定位,以及修改问题的能力。


        看完官网的介绍,觉得满足自己的需求,那么就可以继续阅读,主要看下它的wiki或者示例、效果。自己搭建环境调试,看下是否能够完成,如果过程中发现不是太好,就需要重新去找别的项目,不需在此过多纠结。


        学完demo发现适合,那就研究下它的基本开发套路,能够形成一个简单轮廓,向自己的目标靠近。如果途中出现问题,要能够从它的文档中找出问题点,当然首先先百度,google搜索,去甄别答案。


        如果找到一个开源项目,发现有些功能受限,比如glide,客制化时发现它的加载图片功能不够,于是需要研究代码。


        阅读代码,最好是带着一个问题去阅读,比如某个方法,我想扩展下,觉得它的返回,或者回调里面信息不够,然后去追踪,分析,定位。这里需要强调的一点是,不要盲目一路去追代码,学会总结,不要被一些细枝末节的代码导致迷失方向,比如一个方法就是比较一个点是否在矩形区域内,如果不是必须研究算法,那么我们就只关注这个返回值的判断地方。对于有些宏,case项,可以看看枚举值,对于理解会有所帮助;播放一个音频文件,发现有个case有一个枚举,TYPE_MP3 那么就可以去看看这个都有哪些枚举,就能知道这里都支持哪些格式的播放;如果有些枚举上有个宏控,那就知道这个功能是需要配置,有可能没有开启。


        代码阅读的技巧太多,甚至每个人自成一套,只要努力去阅读,失败后总结,便会有自己的一套学习方法。


        学习完后,做了demo,文档看了一堆,终于解决了问题。于是就可以很欢快的将它纳入自己的知识贮备。但如果这个项目后续会多次使用,那么要研究它便是迟早的事情了。需要花费大量的时间,快速整理出来学习思路,照它的demo,跟踪代码,理解,掌握。然后能够打通,同时不会陷入细节里面。


        到这里已经完成了新的技术的认识,后续便是是否想继续挖掘,学习,那就要不断的穿梭在代码,文档之间,同时借助搜索引擎来扫除理解的一些障碍。


        例如需要理解一些android的概念,linux操作系统,虚拟机,surfaceflinger,AMS服务,binder通信机制,以及jni等等,概念先行,会将整体框架搭建起来,了解自己将来的的学习轨迹,并能够知道自己当前走到哪里了,是否还需要继续。再例如view.post,我们学到message.post则可以结束了,同时需要贯穿一下放入消息池中,从哪里取出,消费的。也就是handle message 和looper的关系。


        思考,总是需要有所突破。不能每次都沉浸在别人研究的结论上,在别人的结论上,继续深入挖掘,才能变成自己的独特的见解,比别人多走一步,有自己的总结,以及更深更透彻的理解,这才是真正的收获。


        当经历了数次语言的演变,就能透彻的理解演变的背后,往往跟随着科技的进步。从之前的斤斤计较,对于内存,硬盘,以及堆栈区域大小,跳转空间限制等等,到现在不需太多关注,编译器优化,已经能够做更加高效便捷了。


        追求效率和品质,永远是在制衡,到达一个平衡即可,切勿过度导致顾此失彼得不偿失。现在的开发,若非实时要求非常严格,必须精准的计算执行时间,平时开发基本对于效率不会过度追求,对于计算排序算法不会太过较真,只为在容忍的时间内解决问题即可。


        学习,在于有目标和有技巧地去掌握。有计划学习并找到自己喜欢的课题时,请牢记深入学习。如果自己不喜欢,却比较流行,那就学个demo了解背景,做到知晓即可。


        开发应用,很多时候不做研究,拿来即可合入项目。如果是偶然开发,风险可以稍后推延,做到大致心中有数;如果是长线开发,比如公司,团体,那么初次使用,可以不做过多计较。如果第二次继续使用,则需要注意,我们需要研究下代码评估风险,做到心中有数,对于开源库的优点、缺点、适合场景等等做出基本判断。


        学习永无尽头,能有一套自成体系的学习方法,比之熟练掌握几种语法,要有优势的多。因为知识不断在迭代更新,手握自己的渐变陈旧的技术,却无力快速适应新的知识体系,理论,那么,技术革新的车轮,则会毫无情面的碾过你,连同你所经历的岁月。

欢迎长按二维码识别关注

中睿IT服务

        一家真正有软件外包团队的高端IT培训机构

        致力于为企业客户打造成熟的信息化技术团队

解决企业信息化所遇到的最棘手问题,互利共赢!


Copyright © 固阳音箱协会@2017