有个小伙伴在微信上问我:程序员
我刚工做半年,有时候对于Java的发展方向有点迷茫,Java的范围是在是太广了,我有时候会不知道从哪开始入手,我想问一下,您有什么好的建议吗?微信
我理解这位朋友的问题是:工做中该如何发现本身要学什么,怎样构建本身的技能树。这是一个很是重要的问题,假如你不知道要学什么,那一旦你工做不那么忙时就会以为无聊,只能经过浏览新闻、看小说、打游戏等方式消磨时间消耗本身。这对本身的成长和增值很是不利。因此,此次咱就来聊聊工做中学什么这个话题。网络
根据个人经验,在开发过程当中,有两种学习策略:一种是横向拓展,也能够称之为广度学习;一种是纵向深刻,也能够称之为深度学习。若是能贯彻这两种学习策略,就会慢慢造成程序员最理想的技能结构——T型,即在横向上熟悉足够多的知识和技能,在纵向上又精通某一领域。简单说就是一专多能。框架
广度学习学习
以C++语言为例,若是你作网络方面的开发,就会遇到选择哪一个框架的问题,libevent、ACE、Asio仍是Qt Network?若是你作GUI开发,可能会在Qt、CEF、MFC、wxWidgets、DirectUI之间作个选择。优化
选择和了解的过程,是我的广度学习的过程。你会快速了解每一种框架的优缺点,会搭建环境,会写一些Demo来对关键技术点和需求作验证……最终会根据文档和实验结果来作出实际的选择。这个过程很是可贵,会快速拓宽我的的知识面。建议把每次了解到的技术框架都记录下来,有闲暇时能够进一步学习。设计
即使你不是预研技术方案的工程师,而是别人定方案你来开发,也能够有意地让本身经历这个选择过程,只须要问本身一个问题便可:为何用A而不是B或C?blog
其实不仅仅是大的技术框架选择,小到某个页面要用的某个元素,都会经历选择的过程,有心,就能够用这种以点带面的策略学习到更多。游戏
深度学习开发
大多数时候咱们会使用一门语言和一两种技术框架进行软件产品的开发,此时就是纵向深刻学习的好机会。
对技术框架的学习,大致分三个阶段:
基础开发,主要是了解API、基于API完成应用
熟悉内核及原理,主要是了解框架的设计原理,阅读源码,洞悉内在机理
优化框架,主要是针对框架的已有功能的不足进行完善、优化,或者使用框架提供的机制扩展框架功能,或者对框架进行定制,让它适合特定情境
我以Qt为例画了张图,供参考:
不少时候咱们经历了第一个阶段——可以使用API进行简单开发——以后就跑别的地方去了(工做须要),而后就把这个框架撂那里无论了,而后就一直停留在那个阶段。建议有时间的话梳理下本身用过的技术,挑出当下工做中还在用的那项,往深里钻,去熟悉原理熟悉内核,有可能的话,也能够优化、扩展或定制。唯其如此,才能对一个框架真正掌握,才会有深度,才会在该项技术上造成本身的价值和竞争力。
小结
无论是广度学习仍是深度学习,都是从实际须要出发的,是你工做中要用这门技术你不得不学。明白这点很是关键——你要用到某项技术时才会有学习的动力。因此,最好的学习时机就是一边开发一边学习,白天上班晚上学习,周内上班周末学习——在有明确目标时最有学习动力,在热度还未退却时学习效果最好。
若是你想学习与当下工做内容无关的知识和技能,投资本身的将来价值,那最好的办法是给本身设计一个软件产品(或者参与到别人的项目中),设定一个期限,用你想掌握的技术去完成它。用不到的知识,等于没有,这就是这种说法背后的原理。
因此,没有需求,要创造需求,没有问题,要创造问题,有了需求和问题,学习才更有方向感和目的性,才会有持续下去的动力。若是你能主动创造目标和需求,那你很快就能够创建本身的技能树并让这棵树根深叶茂,你就会愈来愈值钱,也愈来愈能赚到更多的钱。