unity3d就业前景 知乎_unity3d教程知乎 - CSDN
  • 问题原文:我是一个C#初学者,想问个问题,我以后是该往WP开发方向走呢还是学习Unity3D往游戏开发,哪个更有前景呢,个人感觉未来几年iOS,WP,Java会三足鼎立,WP现在有潜力,但是U3D现在做游戏也很有发展空间,望...

    问题原文:我是一个C#初学者,想问个问题,我以后是该往WP开发方向走呢还是学习Unity3D往游戏开发,哪个更有前景呢,个人感觉未来几年iOS,WP,Java会三足鼎立,WP现在有潜力,但是U3D现在做游戏也很有发展空间,望大神值点或者评论。谢谢。

    首先申明我现在不是大神。O(∩_∩)O~

     

    我的回答:

    好好想一想你自己想做什么?现在很多人选择哪一行是因为薪资。如果你看薪资,现在u3d是领先的,前景也非常好。但是你要准备加班的心理准备,游戏行业很累,通宵加班是常有的。unity的深入也是很难的。

    如果你选择unity一定要想一想,自己到底喜不喜欢游戏,这一点对你以后干这一行有很大影响,否则你不能一直保持对游戏行业的高度灵敏感和热情,之后又要转行,那就更痛苦了。

    你既然是一个C#初学者,最先要紧的不是选择wp还是unity,而是把C#基础打扎实,这个很重要,只有把基础打牢了,做哪个都不是问题!做的精,不论wp还是unity薪资也不是问题。

    我现在从事unity3d游戏,以前也考虑过是做wp还是unity,但还是选择了unity。wp我没有经验,可以告诉你一点unity的。上周刚从搜狐畅游面试回来,面试问的我一些C#委托、渲染管道、3D图形学、NGUI机制原理、TCP、UDP协议和unity3d一些基本知识等方面的问题,如果想从事unity3d方面的新手可以先从这几方面入手,好好研究研究。 这几天准备写一个搜狐畅游的面试总结。

    楼主你现在一定先把C#学好,其他的不要想,选好后就不要动摇了,否则挑来挑去发现2年3年一晃就过了,发现自己什么经验都没有。谨记,选择wp还是unity3d一点都不重要,重要的是你能不能抛弃薪资利益,在你选择的路上坚持2年!

    如果你好好学完C#基础以后还不能选择,就学laughing哥抛个硬币吧。字就选unity3d,花就选wp。

    祝君好运,选择好以后告诉我,一起交流C#技术。

    http://www.zhihu.com/question/22954615

    展开全文
  • 作者:谭草头乙链接:https://www.zhihu.com/question/52036177/answer/226200121来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。什么是游戏引擎,什么是虚幻引擎(Unreal Engin 4...
    作者:谭草头乙
    链接:https://www.zhihu.com/question/52036177/answer/226200121
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    什么是游戏引擎,什么是虚幻引擎(Unreal Engin 4)?

    游戏引擎是由多个子系统共同构成的复杂系统,它几乎涵盖了游戏开发过程中的所有重要环节,是游戏开发的流程核心。 UE(Unreal Engin)是目前世界最知名授权最广的顶尖游戏引擎,占有全球商用游戏引擎80%的市场份额。自1998年正式诞生至今,经过不断的发展,虚幻引擎已经成为整个游戏界--运用范围最广,整体运用程度最高,次世代画面标准最高的一款游戏引擎。 UE4是美国Epic游戏公司研发的一款3A级次时代游戏引擎。它的前身就是大名鼎鼎的虚幻3(免费版称为UDK),许多我们耳熟能详的游戏大作,都是基于这款虚幻3引擎诞生的,例如:剑灵、鬼泣5、质量效应、战争机器、爱丽丝疯狂回归等等。   其渲染效果强大以及采用pbr物理材质系统,所以它的实时渲染的效果做好了,可以达到类似Vray静帧的效果,成为开发者最喜爱的引擎之一。

    UE4能做些什么? UE4不仅涉及主机游戏、PC游戏、手游等游戏方面,还涉及高精度模拟,战略演练,工况模拟,可视化与设计表现,无人机巡航等诸多领域。

    总而言之,行业里游戏的IP不是一款引擎能够左右的,但另一个决定性要素:画面,却必须依靠虚幻4这样过硬的引擎作为支持,这也必定是未来的发展趋势,也是如今人才缺口大的重要原因之一。

    UE4的优势

    作为后起之秀,UE4在虚拟现实游戏开发者界大出风头,其强大的开发能力和开源策略,瞬间吸引了大量VR游戏开发者的目光。目前,大量以UE4开发的VR游戏已经登陆各大平台,而VR爱好者的普遍评价都是虚幻4引擎游戏在游戏画面和沉浸体验方面要明显优于Unity3D 游戏。

    UE4画面效果完全达到3A游戏水准,光照和物理渲染即便在缩水的状况下也足以秒杀Unity蓝图系统。UE4让游戏策划不用再写劳神费力编辑代码,其强大的材质编辑器实在让开发者们大呼德玛西亚,各种官方插件齐全也让开发者不用在自编第三方插件并担心兼容接口问题。更重要的是针对虚拟现实游戏,UE4为手柄、VR控制器提供了良好支持。而UE4提供的各种游戏模版,让其与Blueprint配合做原型甚至比Unity更快。

    UE4的就业前景如何?

    去年9月份, VRSTAR发布的数据显示,全球VR从业者分布来看,美国的人才最多,占比40%,需求占全球48%;相较之下,中国的VR人才仅有2%,但是需求却占全球18%。

    需求量大,但人才短缺严重。首先熟悉UE4(虚幻引擎4)的技术很是紧缺。我们知道,VR游戏如果要很好的效果的话,基本上都会选择用UE4开发,而国内跳过了主机游戏时代,能够使用UE4的人很少,U3D的反而多些。接下来是美术,一定需要有技术美术,因为虚幻引擎是一个集成化的开发环境,内部有各种各样的编辑器,材质、粒子、关卡、动画,编译器非常多,所以需要有技术美术来做这个事情,还要关卡美术,最好具有一些技术背景,才能做起来更快更方便。最后,策划也需要完全变换思维,不能用传统的游戏设计思维是设计游戏。

    因为人才匮乏,也催生了一些专门培养VR人才的教育机构。不同课程时间和内容,不同的学费标准。学费大概在2万-2.5万之间,课程时间一般是5到6个月,如果学的好、有点基础差不多4个多月就可以就业。有些培训机构也包就业。那些零基础的从培训教育机构毕业后,有些VR开发工程师的转正后薪资在5-10k,比传统手游要高1k-2k左右。对于初入社会的就业人士来说这也是还不错的待遇。

    如果有求职者有意从事这方面的工作,不妨多了解和学习这方面的知识,武装自己。



    什么是Unity3D引擎?

    Unity是目前全国最专业的游戏引擎,能够创建实时、可视化的2D和3D动画、游戏,被誉为3D手游的传奇,Unity3D可以创建虚拟的现实空间,让你在虚拟的世界里尽情发挥,使心灵得到释放。

    游戏开发迅速崛起,发展为独具特色前景广阔的行业,市场需要Unity3D技术作为支撑的游戏,企业需要Unity3D技术开发人才。因此,Unity3D技术人才的需求量也会越来越大。

    Unity 3D是目前最火的专业游戏引擎

    Unity 引擎占据全功能游戏引擎市场45%的份额,全世界有6亿的玩家在玩使用Unity 引擎制作的游戏

    Unity 3D引擎占据全功能游戏引擎市场45%的份额,居全球首位

    Unity 3D开发人员占有比例为47%

    注册开发人员3.3M

    Unity 3D全球用户已经超过330万人,中国区的开发者数量已成为全球第一

    Unity引擎制作的游戏吸引了全球600M玩家,87亿次下

    VR开发者更爱U3D?

    U3D引擎的开发公司Unity在近日获得了DFJ Growth高达1.81亿美元的C轮领投,DFJ Growth则是知名风投公司DFJ之下的一个部门,他们曾在2014年获得了4.7亿美元的融资,公司的高管舒勒表示DFJ Growth将在未来的几年集中关注科技领域,对Unity的投资也是风投计划的一环。在获得资金之后,Unity可能将会加速U3D引擎在虚拟现实领域的布局。

    事实上,在VR相关的游戏引擎公司方面,并非只有Unity收获了融资。虚幻4引擎的开发商Epic Games曾在2012年收获了腾讯3.3亿美元的注资,而陷入危难的Crytek也在去年与亚马逊达成了战略合作,将他们的CRY引擎以5000到7000万美金的价格授权给了亚马逊,亚马逊随后则开发出了支持虚拟现实内容研发的Amazon Lumberyard。

    在这三个主流引擎之中,Unity 3D普及最广。凭借较低的技术门槛与收费,以及对跨平台的优良支持,U3D获得了一大批拥护者,今年的GOOGLE I/O大会上他们就宣布平台已经坐拥550万开发者。

    产品特点

    U3D的目标是结束诸如AutoDesk、Catia、UG、Pro-E和其它软件公司开发的专有的3D图形格式,用所有的用户都可以使用的一种标准格式来取代它。在保留绝大多数功能的前提下,无须专有程序即可打开,或在互联网进行3D视图的浏览和操作。换言之,U3D就是让3D文件能够象JPEG文件一样流行和易于使用!

    这种标准将使3D更容易结合到网络浏览器、手机浏览器等其它应用程序中,使3D图像能够更广泛地普及,从而促进对更快的处理器和图形芯片的需求。

    2005年,Adobe在业界率先发布了Acrobat 3D,即在Acrobat现有的基础上加入对3D物件的支持。从 Adobe Acrobat 7.0开始,Adobe的PDF格式支持在文档中嵌入3D内容。这些3D内容以“Universal 3D” (U3D)格式保存在PDF文件中。

    如何学习?

    第一步首先了解unity3d的菜单,视图界面。这些是最基本的基础,可以像学word操作一样,大致能明白有几个菜单,几个基本的视图,各自起什么作用的就可以了。当然还要了解人物基本的比例和结构。

    第二步理解场景里面的坐标系统,输入系统,简单的向量概念。Unity3D的坐标系统及向量概念如果不理解清楚,不理解世界坐标,局部坐标的关系,即使一个简单的移动,缩放,旋转的几行代码,也会困惑你半天。

    第三步学习创建基本的场景的一些基本概念:游戏对象,组件,脚本。在界面上分别体现在层次视图,项目视图及属性视图,要理清楚彼此之间的关系。

    第四步学习资源导入方面的一些基本元素:网格,材质,贴图,动画等。

    第五步学习脚本的生命周期,Start,UpDate,ONGUI这些基本的方法。了解,预制,时间,数学等常用的类及相关方法。理解游戏对象,组件,脚本彼此之间的关系。

    第六步进一步学习摄像机灯光,地形,渲染,粒子系统,物理系统等等,这些每一个深入进去都是一个很复杂的主题。

    第七步一些更高级的概念:向量的加减法点乘叉乘,光照法线贴图,内存管理,图形优化等等。Unity3D入门容易,真的要精通,那是相当难的。

    U3D的行业前景如何?

    Unity是当今最专业的手游开发引擎,并没有之一

     在10大游戏市场(美国、中国、韩国、日本、英国、加拿大、巴西、德国、俄罗斯语台湾)中,Unity是最为普及的开发工具。随着时代的进步,高端的主机游戏在未来一定也会出现在移动设备中。Unity引擎的规划十分符合未来的发展,这也无疑增加了众多unity青睐者的信心。

      手机游戏引导游戏产业主流的今天,大部分游戏玩家都希望能有更多更好玩的产品出现在他们眼前,广大的市场需求也导致了我国内的游戏设计、游戏开发人员极度紧缺,手游人才供不应求。

    相信手游人才必将会势为各大运营商、服务商以及开发商们相继争抢的热门对象,另外,如今我国政府也在游戏产业上的态度也是大力支持的,我国的信息产业部、国家科技部早已将游戏产业列为IT领域的重点扶持对象。

    现在最火爆的《王者荣耀》就是用Unity3D开发的,暴雪的《炉石传说》客户端也是用Unity3D开发的,《神庙逃亡》、《球球大作战》等等都是用U3D开发的。

    U3D现如今的手游市场份额已经占据到85%!同时其跨平台的优势,对于端游和页游也势不可挡!后期的体感游戏也必将是U3D的领地!现如今U3D人才稀缺,从业人员薪资高,正是进入这个朝阳行业的最佳时间!

    展开全文
  • 1.计算机前景广。 2.门槛低。 3.现在是信息革命的红利时候,许多与信息技术相关的行业秩序还没形成,新人有许多机会;等互联网从新兴行业的位置下来,变成传统行业后,新人就很难有机会通过从事这个行页变富上升...

    先不说安利一波网址
    https://www.zhihu.com/question/49097006

    说计算机好的:

    1.计算机前景广。
    2.门槛低。
    3.现在是信息革命的红利时候,许多与信息技术相关的行业秩序还没形成,新人有许多机会;等互联网从新兴行业的位置下来,变成传统行业后,新人就很难有机会通过从事这个行页变富上升阶级;
    越是新兴的行业,新人越有机会,新秩序没形成,需要有人去定义新秩序;
    旧秩序中老一辈的人更有相关经验,相关资历,相关人脉,还有大量资金,老一辈的人不退位,而且行业增长进入瓶颈期,新蛋糕还没出现,那么什么都没有新人凭什么上位?
    乱世出英雄,为啥?因为乱世中旧的秩序被打破,新的秩序还没形成,乱世中新人就有很多机会上位。比如朱元璋就从最底层到了最高层,如果秩序井然时,根本就不可能。
    4.完美的是人,永远不是专业
    5.市场需求大,不容易学

    说不好的:

    1.高负荷的持久工作,不进则退的文化模式;
    例如996的工作制度,总能遇到新问题。学习不仅需要天赋,还需要时间。

    2.计算机红利已过,并不理想的就业前景
    许多自由职业者抢饭碗;开发的软件越来越多,越来越容易操作。

    3.拉低情商
    不像金融,聊天聊各种期货,贸易,股票,潜规则等等。而计算机就只能聊各种bug。

    4.没社会地位
    不管是老师,医生还是城管,哪怕薪资比程序员低,但是以后三十来岁后,程序员除了有钱外,一无是处,甚至连钱都不一定比其他人多。

    我个人认为

    1.计算机行业的红利过了,或者说大不如前了。表现有许多:

    • 体制越来越完善,前人已在这条路上走了十来年;
    • 渐渐民用,功能越来越便捷,就好比微软开发了windows xp,再开发一个windows 7也不过是锦上添花;
    • 工具越来越好,使用门槛越来越低;程序员的工作不再是操作工具,而是开发工具。

    2.但是不意味计算机行业就已经过时了,表现也有许多:

    • 学习计算机还是特别困难的,计算机学生还是不可替代的 。虽然许多培训机构嚷着三个月包会,但是重新学一门专业的难度可想而知,所以顶多蜻蜓点水一般点到即止,或者直接教工具使用。
    • 学习计算机的学生学习能力强,重新学一门专业可以更快上手。因为学的技能就是掌握信息,可以比其他学习的人,更快更全学习。
    • 虽然大部分体制完善了,但是还有许多 新“蛋糕”产生,届时就各凭本事了。

    3.我个人认为计算机专业的前景还是有的,比如说

    • 把计算机当成一门计算与其他各行业相融合,好比英语一般。这样就比其他人更有竞争力,更不可替代;
    • 通过利用信息差的优势,给一大批涌入计算机学科来淘金的人,供“水”。这样可以赚大量钱;
      争取当老师。这样就有社会地位。

    4.凡事都怕比较,所以说计算机差不能光说差,也需要说比谁差;说好也不能光说好,也要看比谁好。如
    哲学专业:研究各种哲学历史和哲学思想,还有马克思主义等等;学好后能使人明辨是非、做事进退有据、还能增强修养。使人能有一个强大的自我 ,有了强大的内心,那么那个人不论经商、还是为官都能如鱼得水;但是如果学不好的话,可以什么也没收获;
    经济学:学习经济学的规律和行业知识;学好后能使人在高层次的商业活动中把握先机,提前部署;如果没学好的话,可以只能当个小职员或者会计什么的;
    法学:学法、完善法;学好后当法官或者律师;好像应该就业没大问题,就看薪资高不高了;
    教育学:教人知识;感觉和法学一样
    文学:文学作品赏析和写作;学好后可以出口成章,创作各种佳作;学不会就和学哲学学不好的一样,没什么看到的本领;
    史学:学习历史、发现历史;可以鉴宝;学不好的话依靠国家、依靠研究所了,或者转行;
    艺术:这个我就不清楚了,学好后就可以创作艺术了;学不好的话就只是会一点皮毛了;
    理学:把握科学道理;虽然大部分可能溅不起大的波澜,但是一旦有大的发现那就会给社会带来翻天覆地的变化;
    工学:这个太广了,可以有一技之长;
    农学:研究生物为主:植物、动物、细菌等等;学好后可以更好的种田、养鱼等等,甚至还可以移民火星;
    医学:制药、用药、买药;学好后可以救生病的人、可以美容美白、可以强身健体等等;
    军事:加强国力;

    5.最后说一下,我所认为的计算机大学生的核心竞争力

    • 首先第一点自然是编程的能力;(毕竟学的核心就是这个)
      一方面(理论方面)是对于数学、数据结构、计算机组成原理、操作系统、计算机网络等的深入了解;另一方面(应用方面)是对于C语言、C++语言、Java语言、安卓开发的使用;
      比能力更重要的是思维,编程能力好的人,通常思维更周密、更有创造力,这样的人做人做事也格外优秀。
    • 当然除了编程还有一些附加的学习内容,如ps修图、pr剪视频、3dsmax来建模、sql做数据库、maya做动画、unity3d开发游戏等,还有用OpenGL学习计算机图形学、用opencv学习图像处理、用D3D学习三维游戏;除此有软件工程等等内容。
      不过这些都能被替代,不能作为核心竞争力。
    • 除了编程外,我觉得第二点就是掌握信息和学习的能力;这种能力是一个超越者所需要具备的能力;

    6.总之,因人而异,但是我觉得计算机专业很完美。

    展开全文
  • 程序员的成长课

    2019-07-05 10:04:31
    内容介绍 知道和做到之间有一道鸿沟,要想跨越它,你不但要努力,还要讲究方法。《程序员的成长课》不仅传授知识,更教给读者如何做好。《程序员的成长课》中的理念、方法、工具可以指导读者更好地看清定位及发展...

    内容介绍

    知道和做到之间有一道鸿沟,要想跨越它,你不但要努力,还要讲究方法。《程序员的成长课》不仅传授知识,更教给读者如何做好。《程序员的成长课》中的理念、方法、工具可以指导读者更好地看清定位及发展方向,设计未来。如果读者不知道选择什么技术栈来学习,困惑于怎样在技术上持续精进,想转技术管理却没途径,想有章法地为跳槽加薪做准备,或者想转型却不知道自己除了技术还能干什么,建议认真读本书,它提供的方法和工具可以帮助读者很快找到答案。

    《程序员的成长课》适用的读者:所有程序员,IT 相关专业的学生、教师、培训机构学员等。

    作者简介

    安晓辉,资深开发者。拥有十余年开发与管理经验,经历过软件开发工程师、研发经理、项目总监、研发总监等岗位。著有《 Qt on Android 核心编程》《 Qt Quick 核心编程》《你好哇,程序员》《解忧程序员》等图书,电子工业出版社优秀作者。

    知乎优质答主,关注者过万。知乎 Live 讲者,设计开发了面向开发者的知乎 Live 专题“程序员的成长课”。个人 Live 被参与超过2万次。 CSDN 知名博主,粉丝超过2万人,2014年、2015年两届博客之星,博客阅读量500多万次,排名100以内。职业规划师,对程序员的职场发展与个人成长具有浓厚的兴趣,通过订阅号“程序视界”、CSDN 博客、知乎专栏、在行、分答、值乎等渠道,以文章、咨询、问答等形式提供各种生涯服务,超过50万人受益。

    购买纸质版请点击这里

    本书内容

    前言

    作为一名普通的程序员:

    • 你想买一套房子,不想再租住在远离公司的偏僻地带每天通勤 4 个小时上下班
    • 你想买一部车子,可以周末开着去山里转转,看看红叶听听鸟鸣
    • 你想买衣服时去窗明几净微笑服务的商场而不是每次都找一个不知名姓的小二网购经济适用款
    • 你想每年出去旅游 10 次 8 次,今天在苏梅岛潜水明天在魁北克吃枫糖
    • 你想每年给爸爸妈妈 5 万块的生活费,让他们露出欣慰的笑脸

    这些想法不能实现,会经常性地带给你痛苦。这种痛苦,会随着你工作时间的增长而加深,渐渐变成你生活的底色——你的底色原本简单明快,现在幽暗阴郁。

    实际上,这些所谓的痛苦,有 90% 都可以通过钱来解决。前提是:你的价值能够不断提升,赚钱速度超越需求膨胀。消除了这些痛苦,幸福感就有生长的环境,就不那么容易被淹没。

    可是作为普通的程序员,你却发现瓶颈一个接一个地扑过来。做技术,不知道怎么做到持续精进、怎么坚持;转管理,又不知如何开始。结果还没等想明白呢,半载一年就过去了,蓦然回首,好像自己的能力没怎么提高,薪水增速却越来越跑不过通货膨胀了。

    有时候你觉得开发工作越来越吃力,转型的呼声越来越高,却不知道如果离开开发岗位自己还能干什么。看着别人可以选择当自由职业者,或者能实现财务自由,内心羡慕,然而转过身却只能叹息:自己的路,究竟在哪里?

    仔细想想,你就会发现,要搞定这些事情和问题,只要能赚到更多的钱就可以了!

    这个结论很俗吗?

    不,现实正是如此!

    对于大部分开发者来讲,工作和生活的诸多烦恼,其实都源自于:怎么赚到更多的钱。

    要想赚到更多的钱,就要回到问题的原点,想想个人赚钱的本质是什么。

    个人赚钱的本质是——出售时间!对吗?

    从出售时间的角度来看:

    个人收入=每天可售时间数量×单位时间价格×单位时间出售次数

    在这个公式里,有三个要素,简单描述就是:

    • 每天可出售的时间数量
    • 单位时间价格
    • 同一份时间的出售次数

    结合开发者的具体情况,可以找到多种提升收入的方式。参考下表:

    enter image description here

    或许你知道所有这些方式甚至知道更多,但是,怎么做到呢?

    这是个大问题!

    知道和做到之间有一道鸿沟,要想跨越它,你不但要努力,还要讲究方法。

    这本书不会承诺“看完本书就能快速赚钱”,不提供任何安慰和幻觉,它只是一本工具书,仅仅是发出一份邀请,让你看到有一些方法可以用来分析自己、帮助自己去有效选择和提升,但最终你是否可以用书里的理念、方法、工具指导自己的工作和生活,则取决于你的认真程度和执行力!

    所以,如果你愿意付出努力让改变发生,那么我们现在开始一起行动!

    本书共有8章。

    第1章,介绍如何选择技术方向,我们结合技术成长三阶段模型,讨论在入行、构建技能树、技术转型、团队技术方案选型等常见场景中如何选择适合自己的技术,提高增值的效率。

    第2章,讲述如何在技术上持续精进,着重讨论如何在工作中将持续提升自我能力和价值落在实处。为此我们引入了个人对标管理法,让你从优秀的同行者、一般性规律、技术自身的深浅层次和软件项目指标四个方面出发,找到随时随地可以引领自己前进的小目标、小台阶,再配合职业目标的指引,小步快跑,日有寸进。

    第3章,探讨了开发者无法回避的发展方向——技术管理。从开发者到管理者,不是职位序列自然发展的结果,而是一种转型,且并不适合所有人,因此我们提供了一些工具和方法,让你自测一下,看看自己是否适合。如果你发现自己很想试试管理路线,可以接着看走向技术管理的4种常见方式,然后了解怎样为成为管理者做准备。从概率上讲,成为管理者后,可以通过团队实现更大的产出,也会因此赚到更多的钱,你的未来会有更多可能性。

    第4章,讨论了技术管理新人面临的18种常见挑战,比如角色适应、委派任务、激励他人、冲突管理、一对一谈话等。如果你刚刚升任管理者,一定会碰见这些挑战,翻翻本章提到的应对策略,会对你有所帮助。

    第5章,介绍了开发者在跳槽时常见的 8 个问题。比如什么时候跳槽好、依据什么跳槽、选大公司还是小公司、去北上广深等一线城市还是找个小地方享受生活等。这些问题会给你触动,引发你思考自己的选择。

    第6章,讨论了如何针对匹配度来优化你的简历。最关键的要点有两个,一是一个岗位一份简历,二是分析目标职位的要求,针对要求呈现你的价值点。你能注意到这两点,就可以大大提升简历的通过率,为自己赢得机会。

    第7章,如何在跳槽时获得想要的薪水,这恐怕是每个人都关心的话题。其实从你决定应聘这家公司职位的那一刻就开始涉及这一点了,核心要点是匹配度。所以,从简历优化到了解公司、产品、部门、职位,再到了解目标岗位薪酬区间,你都要围绕匹配度做准备。如何准备?这一章提供了流程、框架和方法。

    第8章,转型,也许有一天,我们会离开软件,想要去做别的事情。那么你还适合做什么?想做什么?如果你“拔剑四顾心茫然”,可以看看这里的人、事、物模型和发现职业方向的5步法。只要你做好准备、花些精力,就可以找到适合自己的转型方向。这一章还讨论了转型时如何准备目标职业所需的知识、技能,并提供我和我的朋友们实践过的最佳方法:双职业策略。

    在正文之后,有一个附录,是我个人分类总结的书单,对开发者的综合素养提升大有助益。

    第1章 如何选择技术方向(上)

    努力只有在方向正确时才有价值。

    开发者选择技术也是如此。假如你阴阳差错选择了一门过时的技术或者在当地没什么单位使用的技术,你在找工作时就会不断受挫,即便你找到了工作,也会忧心自己的发展前景。

    • 你刚进入软件开发领域时,需要选择适合你和市场的技术才能更好地就业。
    • 你做了一两年技术工作,开始构建自己的技能树(知识图谱),需要选择与你现有技术相互补充、1+1>2的技术来学习和运用。
    • 你的技术能力慢慢在团队里凸显出来,成了先锋官,有新的项目、新的产品时,你总是被赋予探索技术方案的角色,可是一着不慎,你选择的技术就可能导致整个项目的失败。
    • 你使用 C++ 语言做了5年开发工作,越来越觉得这门语言不适合自己,想要学习一种新技术作为自己以后的主要开发技术,很担心再选错——因为你做开发的黄金时间,加起来也不过三四个5年。
    • 你成为技术负责人或者研发经理,需要决定团队的技术图谱,需要为团队承接的新项目选择技术方案,要考虑哪些因素呢?

    所有这些问题,我们都会在本章讨论,我们会找到选择技术方向时要考虑的各种因素,然后结合特定的场景,看看你在选择时需要考虑哪些因素。

    通过本章的学习,作为个人,你会掌握怎么选择一个适合自己的技术方向,好的方向会让你越来越有竞争力,越来越值钱;作为团队的一员,你会知道在为某个项目选择技术时该如何综合考虑,在风险、成长、代价之间进行权衡。

    1.1 技术成长三阶段模型

    为了更好地选择技术方向,我们先来介绍一个模型,我给它取了个名字,叫“技术成长三阶段”,如图1-1所示。

    enter image description here

    图1-1

    我们在一个专业领域内的成长,基本上都会经历三个阶段:

    • 专项能力的提升
    • 技能体系的构建
    • 融合创新

    1.初级阶段:专项能力的提升

    专项能力提升阶段是初级阶段,你为了做事情,必须先具备某些基础能力,比如从事软件开发工作,你要学会某种语言、某个 IDE、某种技术框架。

    如果你刚刚从学校毕业开始做开发,或者刚刚从别的跑道转换到开发领域,那么你就处在这个阶段。这个阶段最重要的就是提升专项能力,让自己能够迅速搞定一些别人安排给你的事情,体现出你的价值。

    这个阶段持续的时间长短因人而异,可能会是1~3年。如果超过3年还没有进入下一个阶段,那么你的成长速度就需要提升了。

    2.中级阶段:技能体系的构建

    这是中级阶段,你拥有了一组技能,围绕某个方向构建了自己的知识图谱,能够用自己的方式来解决问题。比如你使用 Java 语言做后台方面的开发,你的技能体系可能由 Java、MyBatis、Spring、SpringMVC、Netty、MySQL、Python、Linux 等组成。此时你在团队中,应该已经可以独立负责某个模块,能够完成模块的设计和开发工作,也能够指导初级阶段的同事进行开发。

    你可能需要2~3年,经历2~3个项目才能慢慢构建起自己的技能树,然后还会在这个阶段待上1~2年,不断练习你的技能体系中的各项技能。所以当你能够拥有一棵强大的技能树时,距离你刚从事开发工作可能有5~8年了。

    假如你超过这个年限,用过的技术还是散乱的,东一榔头西一棒槌,不能有机组合在一起,那么你的开发经验和能力,肯定大大落后于你的工作年限。换句话说,你可能把一年工作经验学到的知识、技能机械地重复了几年,没有获得应有的成长。

    3.融合创新

    这是高手阶段,你具有了丰富的实践经验,具备了T型知识结构,形成了自己的思维框架和解决问题的框架,能够融合不同领域的知识,组合各种资源,创造性地解决各种问题。

    进入这个阶段非常重要的一种标志就是,你遇到问题,不再从下而上去思考(即从技术实现细节来考虑问题好不好实现、拿技术去裁剪问题或重定义问题),而是从实现细节跳脱出来,站到更高的层面,自顶向下去思考、去分析,先运用框架、逻辑去分析真正的问题是什么、问题的目的、问题的现状、如何去解决。搞明白这些之后,你才会沉降到技术层面去考虑实现的选择,而且实现时,你也不会拘泥于某种技术,而是什么技术合适就用什么技术(你的目的不是“用 Java 或 Redis 解决问题”,而是“解决问题”)。简单说,就是你走出了被技术束缚和塑造的过程(前两个阶段),可以反过来回到问题本源来思考了。

    在这三个阶段中,我们都会遇到选择技术方向的问题。比如在初级阶段,入门时要选择,发现某种技术不适合自己时要重新选择;在中级阶段,我们要选择某些技术来构造我们的技能树,或者要做技术转型,需要重新选择技术方向;再比如在高级阶段,我们往往会负责产品的技术方案探索与选型,免不了要选择技术方向,甚至在这个时候,我们个人也可能会在技术方向上转型,必须有所选择。

    所以,我们根据成长阶段的划分,挑选了下面几个可能需要选择技术方向的时机,分开来讲在这些时机怎么选择技术方向。

    • 入行
    • 构建技能树
    • 技术转型
    • 方案选型

    但在展开之前,我们需要先通盘梳理一下选择技术方向都需要考虑哪些因素。

    1.2 选择技术方向都要考虑哪些因素

    我们先来看看选择一种技术可能会考虑的因素,然后看看在每个选择时刻运用哪些因素。

    1.就业机会

    这个因素,考虑的是哪种技术更容易就业,需要结合特定地区、特定行业来看,因为你找工作是面向地区和行业的。

    这中间又有两种典型的策略,热门的和冷门的。比如 Java 和 JavaScript 是典型的热门语言,你可以选择学习它们;再比如汇编语言、R 语言、Scala 语言、Qt 框架就没那么热门。

    热门和冷门是相对的,根据开发者多少、市场需求而定。

    2.自我感觉的难易程度

    比如我当年就在 Java 和 C 语言当中选择了 C 语言,因为《The C Programming Language》比《Java 2核心技术》薄得多,面向过程的语言也比面向对象更容易入门(对我来讲)。

    难易程度与人相关,所以最好的方法,就是把你感兴趣的语言,都学学试试,可能每种语言花上一到两个星期,你就可以做出判断。

    3.兴趣

    很多人做开发可能是出于某种兴趣,比如对游戏感兴趣就做游戏开发,对智能手机感兴趣就做 APP 开发,对电子商务感兴趣就做前端开发。

    当你喜欢某一类产品时,这类产品往往可以关联到技术。比如你喜欢做手机游戏,那么可能会选择 Unity 3D 或者 Cocos 2d-x;如果你喜欢樊登读书会这种学习类 APP,可能会选择 Java、Android、Objective-C、Swift 等。

    4.薪水高低

    大多数人选择技术的出发点是工作和未来发展前景,而选择工作时一定会把薪水作为参考因素,而且是非常重要的因素。所以我们在选择技术时,也可以考虑某种技术对应职位的薪水高低。

    要了解这一点,可以去看各种薪酬报告,如100 offer 每个季度都会有类似的报告出来,拉勾网也会发布互联网职场生态白皮书,你用“互联网人才流动报告”“开发者薪酬报告”或者“互联网薪资调查”为关键字搜索,能搜到很多这类报告。

    通过报告,你可以看到使用不同语言的开发者的薪水差异。图1-2是我从100 offer 2016年春季互联网高端人才流动报告中截取的。

    enter image description here

    从图1-2中可以看出不同编程语言所关联职位的平均年薪差异。

    5.技术在将来的发展前景

    你肯定不愿意看到这种情况发生:选择了一门技术,结果1年后它就没人用、没市场了。所以我们在选择时就要考虑这一点,做一些判断。

    选择技术时存在两种考虑:一种是选择稳定的、经典的技术,一种是卡位将来的市场缺口,选择将来可能需要用到的技术。

    前者考虑的是林迪效应,即:对于不会自然消亡的事物,生命每增加一天,则可能意味着更长的预期寿命。用林迪效应来看开发技术,一项技术存活的时间越久,其预期剩余寿命就越长。比如 C 语言(1967年诞生),存活了几十年,可能还会存在几十年。所以你可以选择像 C、C++、Java 这些经典的编程语言,它们流行了几十年,还将流行几十年。

    回顾历史,经典技术都是从新技术发展来的,展望未来,一定也有一些现在的新技术会发展成将来的经典技术。如果你能抓住它,就可以享受它带来的技术红利。

    要抓住可能成为经典技术或热门技术的新技术,就要应用卡位策略。

    卡位策略是指看到某种技术会在未来具有稀缺性,非常有价值,选择提前介入,让自己在未来具备竞争优势。比如2007年 Google 发布了 Android Beta 操作系统的 SDK,就有人预见到 Android 开发需求将会爆发,果断学习 Android 开发;比如现在 VR、AR、机器学习、深度学习,其实都还没出现普适性的应用,但是将来一定会出现,此时学习相关技术,将来一定会占据先机;再比如2009年大数据概念兴起,如果那时选择 Hadoop、Scala 等技术,你现在可能就很值钱了。

    运用卡位策略时,有两种方式。

    一种卡位方式是根据市场需求和未来预期,就像图1-3所示,左下角是我们现在看到的现状,某些需求处在萌芽期,但是将来可能爆发。这个需求对应的产品、服务可能会用到某种技术,甚至这个需求本身就是由技术驱动的。这时候,你就可以分析从现在抵达将来可能需要用到的技术,提前做准备。

    enter image description here

    图1-3

    还有一种卡位方式,是根据技术本身的发展程度来说看。采用高德纳曲线(参考 http://www.gartner.com/technology/research/methodologies/hype-cycle.jsp),如图1-4所示。

    enter image description here

    图1-4

    图1-4(来自 https://stateofdev.com/)展示了机器学习相关的三种技术:OpenAI、TensorFlow、Watson。从曲线可以看出,OpenAI 处于成长期,TensorFlow 处于成熟期,而 Watson 的地位正在受到挑战。如果你现在要选择一种机器学习框架,TensorFlow、OpenAI 是比较好的选择。

    6.你接触的人的推荐

    我们是否选择某种技术,和我们看到的可能性有非常大的关系。只有看到它,它才会进入你的选择范围,如果你看不到它,它再牛,对你也没意义。

    比如我2005年自学编程,面临两个选择:C 或者 Java。我知道 Java 的存在就是因为读研同学的推荐,而 C 语言,则是当时大唐电信做开发的同事推荐的。我再没考虑其他编程语言——因为我根本不知道还有什么编程语言。

    你看到的可能性,限制或决定你的选择。

    7.相近性

    当我们已经掌握了一些技术,要学习新技术时,就可以根据一种技术是否和自己已经掌握的技术比较接近来选择。相近的技术,学起来会更容易上手。

    8.互补性

    和相近性类似,互补性也常用在拓展我们技术能力的情景下。它指的是,有一些技术可以和你已经掌握的技术互相补充,组合在一起,形成更完整、更系统的技术图谱,给你带来更大的竞争力。

    9.团队的技术图谱

    我们所在开发团队的技术图谱,也可能会影响我们的选择。比如我们基于 CEF 开发浏览器,团队以 C++ 为主要开发语言,如果自己本来会 C++,再学习 JavaScript,就可以在 JavaScript 与 C++ 衔接这部分起到关键作用,从而具有特殊地位。

    1.3 入行时怎么选择技术方向

    在做选择之前,应该先想想自己的目标,根据目标选择技术,是更理想、更靠谱的。

    为了明确自己的求职目标,可以问问自己下面的问题:

    • 在哪个城市工作
    • 想在哪些行业、领域发展
    • 想去什么样的公司
    • 想做什么产品

    当你能够勾画出工作目标的大概轮廓时,对应的技术方向就会浮现出来。

    比如你特别喜欢使用蘑菇街或者美丽说买衣服,尤其喜欢商品展示页面,那么你的目标可以是到美丽联合集团做电商前端开发岗位……此时学前端开发对你来讲可能就是合适的选择。

    比如你特别喜欢上海,又喜欢用爱奇艺看视频,对视频类产品很感兴趣,那么你的目标可以是到上海爱奇艺做视频产品开发……此时学习 C++、FFmpeg 等技术可能有助于你实现目标。

    当你有目标时,学习会更有动力,效率也会更高。

    一个公司是否选择你,取决于你本身和公司招聘需求的匹配度,而不是某个技术本身是热门还是冷门的。所以在初入行选择技术方向时,一定要先考虑你将来准备做什么(城市、行业、公司、产品),针对你的目标来选择技术。

    当然你可能在想做开发时并没有明确的职业目标(你不孤单,大多数人都是如此),此时你考虑的是这些因素:

    • 就业机会
    • 薪水高低
    • 难易程度
    • 他人推荐
    • 兴趣

    考虑就业机会,有热门、冷门两种策略。热门还是冷门,可以通过各种排行榜看出来,也可以通过在招聘网站挖掘相关职位信息来判断。

    选择热门技术,比如 Java、JavaScript、C++ 等,一定有很多机会,看起来你能接触到更多的公司、职位,这会在心理上给初入行的你一种安慰。但并不能说你找到合适工作的概率就很大,因为具体到每个职位,招募方都是选择和自己的需求更匹配的求职者。在这个前提下,因为竞争者众多,且其中有很多有经验的选手,用人单位有更大概率找到比你更匹配他们的需求的开发者,所以你作为初学者可能常常过不了简历关,或者过了简历关又过不了面试关,往往会面临更大的求职压力。

    选择冷门技术,机会可能相对较少,但是竞争者也会比较少,而且机会相对确定。比如在西安,如果你以 Qt 来求职,那么常见的公司可能就有广联达、诺瓦电子、和利时、有智等公司。你可以仔细斟酌它们的招聘要求,运用心力打造自己的某个亮点,认真地准备简历、笔试、面试等环节,极有可能获得想要的工作。

    从心理和统计意义上讲,当你没明确目标时,选择当地需求比较旺盛的技术来学习,是相对稳妥的。至于哪种技术需求量大,到智联、51job、猎聘、拉勾等网站,以地区、技术为条件来搜索职位,看结果多少,就能大概判断出来。

    当你这样选择技术方向时,也能够降低他人推荐中携带的个人主观性对你最终选择的影响。

    薪水高低这些信息,可以通过招聘网站、行业薪酬报告等来获得,后面我们在介绍工具时会讲到,在“如何在跳槽时获得想要的薪水”那一章会展开介绍。

    要想知道自己能不能学会某种技术,最好去试试看、做做看。现在网上有很多免费的学习资源可以利用,我建议初入行的你,根据兴趣和他人的推荐,得到一个技术清单,每一种都摸索、感受一下,然后决定选择哪一种。

    对开发者来讲,自主学习能力是非常重要的,这一关一定要过,这也是我建议读者先自己摸索学习的原因。当你自己学到了一些东西,想找人带或者加速的时候,可以寻找私教或者培训结构。

    我了解到有这些资源:

    • http://tutorialspoint.com,各种入门教程,基本上你能想到的语言和技术框架,这里都有。赞,图文为主,英文版。
    • http://www.w3school.com.cn/,网站开发相关技术和教程,非常全。赞。
    • 慕课网(http://www.imooc.com),有很多免费的课程,Java、C、PHP、Python、Android都可以找到。
    • 网易云课堂(http://study.163.com),有很多免费课程。
    • 中国大学 MOOC 网(http://www.icourse163.org/),也有很多。
    • http://codepad.org/,在线代码编辑与调试。
    • http://ideone.com/,在线代码编辑与调试。

    如果你选择的技术能够和你感兴趣的产品、服务关联起来,那么你学习时会更有动力。所以也请考虑这一点,从你感兴趣的产品、服务出发,找找看它们是使用什么技术实现的,整理出一个清单,帮助你去选择。

    1.4 构建技能树时选择技术方向

    再来看一下成长阶段模型,如图1-5所示。

    enter image description here

    图1-5

    当我们过了专项能力提升的初级阶段之后,就应该开始构建自己的技能体系了。在为搭建技能树而选择技术时,通常考虑下面两个原则:

    • 相近原则
    • 互补原则

    1.相近原则

    相近原则指和你当前所用语言、技术框架比较接近的其他语言和框架。

    比如你使用 C 语言,可以学习 C++、Lua、OC、FFmpeg、OpenGL。比如你使用 C++,可以考虑 Qt、CEF、Apache C++ Standard Library、Libsourcey、WebRTC、WTL 等。比如你用 Java 开发,可以学习 Scala、Groovy/Grails、MyBatis、Hadoop 等;比如你用 Python,可能对 Django 或者 TensorFlow 感兴趣。

    2009年到2014年,我个人一直在用 C++ 和 Qt Widgets 做互联网视频盒子,后来发现 Qt 里出了新的界面框架 Qt Quick,我就去学习,在学习的过程中,我发现 Qt Quick 内置了 Google V8 引擎,QML 支持嵌入 JavaScript 语言来脚本化应用,这引起了我的兴趣,就买书学习了 JavaScript。在这里,我学习 Qt Quick 和 JavaScript 就符合相近原则:Qt Quick 和 Qt 是关联的,JavaScript 和 QML 是关联的。

    2.互补原则

    互补原则指那些能够组合在一起完成特定任务的技术。比如你学习 Scala,可能就会用到 Akka;你学习 Node.js,可能需要学习 MongoDB、AngularJS 等。比如你使用 PHP,那么可以扩展开来,学习 Linux、Apache、MySQL,合起来是 LAMP,搭建网站的经典组合。

    我们的流媒体系统中有个视频搜索功能,它的实现分为前台和后台。

    前台在机顶盒、手机等终端呈现,你输入一个首字母、全拼、混频或者汉字,可以搜索到对应的电影、电视剧、演员等信息。

    后台面向前台提供的搜索服务,是用 C++ 结合 MySQL 实现的。要实现全网范围内的搜索,我们就需要能够跟踪各个视频网站的视频动态,一开始有个同事用 C++ 和 HTML 来爬取常见的视频网站,后来发现一旦网站结构有变动,修改和验证就特别麻烦,于是就学了 Python,用 Python 来做爬虫,获得原始视频信息,进行初步的结构化处理,然后再入库。

    我这位同事学习 Python,就是互补原则的应用。这也是我们在做后台开发工作时的常见做法:静态语言做核心业务开发,动态语言负责编译流程、自动化部署、系统资源监控、日志分析、非核心业务处理、测试工具等工作。

    第1章 如何选择技术方向(下)

    1.5 技术转型时的方向选择

    做了几年开发工作之后,你很可能会面临技术转型。通常有两种情况:

    • 有新技术、新市场出现,你想试试
    • 你掌握的技术的应用场景萎缩,前景黯淡,你想跳出来

    2017年4月25日,在行约见过我的一位朋友 W 突然给我打电话,说他要做一个 Offer 选择,很急。

    原来北京有一家在人工智能方向创业的公司愿意给他 Offer,要他明天答复。他老婆、孩子在西安,父母也不愿意他抛家舍业去北京。另外现在所服务公司有一个他可以负责新项目的机会。凡此种种,令人纠结,无法决断。

    我想起 W 之前通过在行约我的话题“聊聊程序员职业规划那些事儿”,也是聊如何学习人工智能,意识到这是他真正想要尝试的方向。

    在电话里,我问了 W 一些问题,将他面临的情况简化到3个问题:

    • 有多想做人工智能
    • 老婆是否真的愿意支持他去北京,关于他到北京工作后,老婆对家里的负担是怎么看的
    • 如何在异地经营家庭关系

    2017年5月21日我在微信上问 W:“北京人工智能那个机会,你后来怎么决定的?”他说:“我已经入职两周了,感觉还不错,每天都在进步。”

    这就是一个典型的技术转型案例,W 从企业服务外包方向的开发,转向了人工智能,用到的语言、技术框架、SDK、算法等,全都换了。

    W 这个转型,正是第一种情况:因强烈渴望参与到新技术、新市场当中去而主动转型。这是积极的选择,方向明确,不需要考虑那些选择因素,因为自己的明确目标,已经决定了要用什么技术,所要做的,就是抓紧一切时间去学习目标技术,了解目标市场,寻找机会进入那个市场。

    第二种情况的转型,即被迫做技术转型,就需要考虑比较多的因素,与入行时选择技术方向类似。所以,请先回顾一下我们在那里分析的薪水、就业前景(热门/冷门)、兴趣、难易程度、他人推荐等因素。

    有经验的开发者做技术转型时,通常有三种情况。

    1.在原有技术的基础上做关联转型

    比如从 Android 开发转向使用 Java 做后台,这是2016年、2017年很多开发者在移动端遇冷时的选择,因为有关联性,转型相对还是比较容易实现的,推荐先在公司内寻找机会。

    2.抛弃原来所用技术

    比如一直用 C#,转换为 Go。这相对较难。

    我认识一位朋友,做了10年 C# 相关的开发工作,决定转用其他语言,找工作时,别人总是劝他不要放弃在C#相关技能栈上的积累,劝他继续用 C# 做开发,他拒绝了十几家这样的公司,为的就是不再用 C#。

    在用人单位看来,这位朋友放弃 C# 是极不明智的,因为他已经做得很好,技术积累的价值都在这个方向上。反过来,我们自己也会这样想问题,你在一个方向沉浸得越久,就越难放弃它去尝试新的方向并以新的技术方向作为自己的主方向。

    3.卡位

    这个时候卡位市场缺口,学习将来稀缺的新技术是非常不错的选择。而且在这个阶段,也必须积极主动去探索,最好每年给自己定一个学习某种新技术的目标,在工作之外完成它。

    要实现这种过渡,一个现实的策略是:一边工作,一边学习。

    我个人一直用 C++ 做开发,2013年 Android 系统在网络机顶盒普及,我们也开始做 Android 视频盒子。我为了学习 Android 开发,就给自己安排了一些与 Android 相关的任务,在工作中完成了对 Java 语言和 Android 开发框架的学习。这就是合理利用当下工作中的机会来实践新技术的案例。

    你在实际的工作中,可能也存在这样的机会。要勇于去尝试,不要怕多花时间和精力。

    如果你在工作中无法应用新技术,可以利用业余时间。比如下班后的几个小时,早起的一两个小时,周末的两天,都可以用来学习新技术。前面我们提到的W为了向人工智能方向转型,买了不少书,还在网上买了很多课程,利用业余时间学习算法、框架,并且自己做一些小练习。

    如果你觉得自己很忙,老婆、孩子、父母、朋友都要管,还有各种娱乐也会占用你不少时间,那就测量一下,记录你一周的业余时间都干了什么。数据出来后,你就可以分析,看看哪些事情可以不干,哪些事情可以采用更有效率的方式来干。分析之后,你就能找到时间来学习。

    1.6 方案选型

    当你构建了自己的知识图谱、能够胜任比较复杂的工作后,在团队中就会越来越重要,就有机会参与到新项目、新产品、新服务的方案选型中来。

    做方案选型时,目标是得出现实可行、成本可接受的方案,需要综合考虑各种因素。

    1.某种技术适合解决某类问题

    很多开发者容易犯“拿着一把锤子看什么都是钉子”的错误,用自己熟练的语言、技术来解决一切问题。比如我喜欢 C++ 语言,就会琢磨怎么用 C++ 语言来做 Web 服务器,甚至动态 Web 页面也要用 C++ 来生成;我喜欢 Qt,就曾认真考虑过用 Qt 来做 APP,支持 Android、iOS、Windows Mobile 等平台。

    这是典型的被技术塑造、束缚的案例。

    实际上,很多技术都有它比较适合的应用场景,比如说 Java 天生就适合用来做企业应用、服务端应用;C 语言离底层就是近,在自动化控制、系统底层、驱动、单片机等领域是无冕之王;R 语言被广泛用在大数据分析上……

    我们在为新产品、新服务、新项目选择技术方案时,一定要跳出自己已经掌握的技术,首先站在问题域去考虑,想想这个问题到底是什么、哪种技术更适合问题场景,这样才能选择好方向,后期开发、维护才会更顺利。

    2.新技术的成熟度

    有的开发者喜欢新技术,什么新用什么,把公司的项目、产品当作新技术的试验田,而不考虑试错的代价。这对个人来讲固然可以积累经验,但对公司来讲,往往是一种灾难。

    所以,我们在做技术方案选型时,一定要考虑这种技术有没有顶级公司支持、有没有知名产品。假如什么都没有,那么最好先不要用,或者先在非核心业务上应用。

    举个例子,很多人都觉得 Rust:

    • 比 Go 好
    • 比 C++ 好
    • 比 C 好
    • 比 ×× 好

    可是如果让你负责一个要求高并发的服务端应用,你会选择它吗?你能找到一个使用 Rust 的重量级的后端应用吗?你能找到一个大型软件公司(除 Mozilla 外)在使用它吗?

    3.生态

    2014年我负责组建一个团队做互联网彩票,合伙人在邀请我加入前,先找了个小伙伴做后端。这个小伙伴学习能力、编程能力、解决问题的能力都超强,他熟悉 Java 后端开发、熟悉 Scala,熟悉 PostgreSQL,还能做 Android APP 开发,C# 也可以。

    这个小伙伴为我们的后台选择的技术栈是 Scala + Play + Akka + PostgreSQL。Scala 发展了几年,也有 Twitter 这样的公司在使用,应该是比较成熟的。

    但当时我们在西安,真的很难找到一个了解 Scala 语言的开发者!我花了几个月时间才联系到一个懂 Scala 的小伙伴,可他还不愿意来。最后我只好自己学、安排公司的其他小伙伴学。

    这就是最大的问题——没有一个良好的生态。此时

    • 找不到合适的人来做开发
    • 找不到合适的框架来使用
    • 遇到了问题找不到交流的人

    非常痛苦。

    4.团队的技术图谱

    我们做方案选型时,也要考虑团队已有的技术积累。

    比如你的团队原本是做机顶盒的,主要使用C、C++和汇编语言,现在因为卖产品的缘故,需要做一个简单的电商的后台,由你负责。

    你会选用什么技术来做?C、C++、Python、Ruby、Java、Scala 还是 Go、Rust?

    你会招募一个小伙伴,还是要你现有的成员学习后端开发?

    假定你想让现有的成员学习电商网站开发(很多中小公司都会这么搞),那么选择什么技术栈?Python + Django 还是 Ruby on Rails?

    如果我是负责人,恐怕会选择 Python,因为它与 C 语言更亲近,而团队里的小伙伴都熟悉 C 和 C++。

    5.技术引入的成本

    引入一种新技术的成本,包括:

    • 学习成本
    • 招聘成本
    • 时间成本
    • 机会成本

    学习成本是引入任何新技术都必须要负担的,就看新技术对你的团队成员来讲学习难度如何。前面讨论团队技术图谱因素时引入的例子——嵌入式团队做电商站点,使用 Python + Django,学习成本可能会较低;使用 Java + Spring + SpringMVC + MyBatis,学习成本就会高很多。

    考虑学习成本,要结合现有技术积累来分析。

    为了新技术要招募新的开发人员时,就会产生招聘成本,招聘的成本包括笔试、面试、时间、新成员与团队成员磨合等,成本非常高。

    时间成本主要是指引入一种技术,从学习到产出结果之间的时间周期。这个时间周期分为两部分:验证周期和产品化周期。

    所谓验证周期,指你通过了解该技术的适用场景、测试关键技术特性、构建 DEMO 等手段来验证该技术对你的产品的可行性所花费的时间长度。这个周期,从几周到几个月不等。

    所谓产品化周期,指过了验证周期,使用该技术把产品做出来的时间长度。可能是从零开始做,也可能是在验证周期内搭建的 DEMO 的基础上来做。

    如果验证周期内你做了一个产品 DEMO,简化实现了产品的大部分功能,项目的相关干系人就会大概率地错误评估产品化周期——他们会认为 DEMO 已经出来,产品化指日可待。也许只要一周、两周、最多一个月,这就是他们的想法。而实际上,你的 DEMO 仅仅是最小化验证可行性,简化了功能,忽略了异常,各种功能之间也没有按产品化所需的逻辑链接起来,总之它离一个产品还有十万八千里,你要想产品化,其实和没有 DEMO 时花费的时间差不多——从零开始需要10个人月,有了 DEMO,可能需要9.5个人月,事实就是如此。

    机会成本有两层含义:

    • 你可能选错了技术,导致后期开发、维护成本高昂;
    • 很可能另一种技术更适合你的产品或服务,而你已经在不那么适合的技术上投入了太多,改弦更张的代价太高,导致你很难回头。

    举个例子,2013年,你们公司要做一个 Web IM 产品,支持文字、图片,声音、视频等形式的聊天,希望它能在各种浏览器上都可以使用,能无缝集成到客户的电商网站上。

    考虑到各种浏览器的历史版本兼容问题,你选择了使用 Flash 来实现,经过测试,在 IE、FireFox、Chrome、Opera、360安全浏览器、搜狗、QQ 浏览器、猎豹等浏览器上都可以正常使用,考虑到电商网站主要通过桌面计算机访问,所以最终你们采用了 Flash 的方案。

    可是后来移动互联网快速发展,iPhone、iPad 用户很多,默认浏览器是 Safari;Android 手机星火燎原,内置浏览器也不支持 Flash。使用这些设备的用户无法使用你们的 IM 产品,导致集成你们 IM 产品的电商公司不断投诉你们。这时你才发现,再想换到 WebRTC 或者其他技术框架,已经很难了——因为你们前端用 Flash 技术,后端用 Wowza,音视频传输用 RTMP,和 Flash 技术栈深度绑定了。

    1.7 工具推荐

    这里推荐一些工具或者方法,你可以使用它们来判断某种技术的状况,决定自己是否选择。

    1.Stack Overflow

    Stack Overflow 的开发者调查:http://stackoverflow.com/insights/survey/2016。更改最后的年份,比如将2016年修改为2015年,即可查看对应年份的调查结果。这个结果里有开发者最喜欢的语言、最想要学习的语言、开发者年龄分布、Stack Overflow 上的热门技术等,很有参考意义。

    比如2016年最流行的技术如图1-6所示。

    enter image description here

    图1-6(来自 Stack Overflow)

    哎,JavaScript,前端还是热啊。

    比如2016年 Stack Overflow 上的热门技术,如图1-7所示。

    enter image description here

    图1-7 (来自 Stack Overflow)

    哇,JavaScript、JavaScript……

    比如最被热爱的技术,如图1-8所示。

    enter image description here

    图1-8 (来自 Stack Overflow)

    需要提请注意,Stack Overflow的统计结果受样本范围和数量影响很大,仅供参考。比如Rust最被热爱,并不代表它未来就可以获得大面积应用,也不代表它的生态很快就能完善,很快就会出现杀手级应用。

    2.TIOBE 编程语言排行

    TIOBE 编程语言排行:https://www.tiobe.com/tiobe-index/。会有 TOP 20 编程语言及 TOP 10 的走势曲线。比如现在 T0P 20 语言,如图1-9所示。

    enter image description here

    图1-9 (来自 TIOBE 网站)

    看到了吧,很多人黑 C#、黑 C、黑 C++,但是它们依然排在前几位!有时小圈子的热烈讨论会遮蔽事实的真相——新生的、非主流地位的语言更容易引起开发者的讨论,这些频繁的讨论,会让人误以为这些新语言很热、很火。

    再看看 TOP 10 语言多年的走势曲线,如图1-10所示。

    enter image description here

    图1-10 (来自 TIOBE 网站)

    3.技术热门度曲线

    全球最大的 IT 咨询公司高德纳提出了一个“技术热门度曲线”模型,把一门技术的发展过程分为启动期、泡沫期、低谷期、爬升期和高原期5个阶段。https://stateofdev.com/ 这个网站根据高德纳的模型,做了各种开发技术的曲线(部分曲线的阶段划分和描述与高德纳的技术热门度曲线模型有所区别)。

    机器学习框架的曲线,如图1-11所示。

    enter image description here

    图1-11 (来自 stateofdev 网站)

    可以看到,TensorFlow(Google)已经处于成熟期,OpenAI(诸多硅谷大亨联合建立,开源非盈利组织)在成长期,而 Watson(IBM),正在被挑战,快要进入衰退期。那么如果我们要做出选择的话,可能会优先选择 TensorFlow 或者 OpenAI 来学习。

    后端开发语言的技术热门度曲线,如图1-12所示。

    enter image description here

    图1-12 (来自 stateofdev 网站)

    前端框架的发展阶段曲线,如图1-13所示。

    enter image description here

    图1-13 (来自 stateofdev 网站)

    4.GitHub

    GitHub 也有一些统计数据,说明各种语言、技术在 GitHub 上的活跃程度,可以登录这里查看:https://octoverse.github.com/。另外,你也可以自己在 GitHub 上按关键字(比如 Qt)来搜索,看某种技术是否有很多的项目,以此来判断技术的活跃度,如图1-14所示。

    enter image description here

    图1-14 (来自 GitHub)

    5.招聘热度挖掘

    像智联、51job、猎聘、拉勾、100offer、大街网等招聘网站,都是很好的技术需求数据来源,你可以用某个关键字(比如“Java开发工程师”)来搜索,看相应的招聘需求是否旺盛。

    6.薪酬报告

    以“互联网人才流动报告”“开发者薪酬报告”“互联网薪资调查”“程序员薪酬报告”“互联网薪酬报告”等为关键字在百度搜索,就可以搜到拉勾、智联等网站发布的互联网人才薪酬报告,可以根据这些内容了解某些岗位的薪资状况。

    如果你想了解特定地区、特定岗位的薪水状况,也可以到猎聘、拉勾等网站上去,按地区搜索目标岗位,很多岗位都会给出薪水范围,多看一看,就能了解到平均水准。

    图1-15所示是我在猎聘网上搜索西安地区的C++开发岗位得到的结果。

    enter image description here

    图1-15

    图1-16所示是我在拉勾网上搜索西安高新区、有3~5年经验的 C++ 开发工程师得到的结果。

    enter image description here

    图1-16

    可以看到,现在很多公司在招募人才时都会提供薪水范围,这是因为它可以大大提升匹配成功率,节省公司和应聘者双方的成本。

    第2章 如何在技术上持续精进(上)

    作为开发者,工作2~3年后,往往会感到迷茫:能够使用一种或者几种技术解决一些问题了,却觉得自己停滞了,不知道接下来怎么办。于是我们有时羡慕做管理的,觉得他们轻松,地位高,赚钱多;有时又羡慕技术大咖,觉得他们能搞定别人搞不定的问题,像神一样会发光,可是回看我们自己,到底是接着做技术还是转管理呢?如果选择做技术,接下来该怎么精进?如果不做,又该怎么转型?这都是问题,每日煎熬着我们。

    我有十几年的开发和管理经验,对于开发者的各种迷茫,深有体会。一般来看,开发者的迷茫分两个层面:

    • 方向上的迷茫,即自己到底是否适合做开发、是否要继续在开发的路上走下去。
    • 执行层的迷惑,即自己继续做开发,该怎么找目标、学点什么、学到什么程度、如何能持续精进。

    本章就从这两方面来展开,先讲如何确认自己要继续做开发还是转管理,这部分会提供一些方法(比如工作的三种分类、成就感来源等),让大家能够自我觉知和判断;然后我们会沿着开发这条线继续前进,看看如何在技术上持续精进,这部分最重要的是对标管理法及其四种典型标杆;再接下来会讲怎样设定有效目标,找到下一步行动;最后,我们会介绍四个习惯,让精进成为你自身的一部分。

    先给出本章的思维导图,方便对照阅读和快速抓取要点,如图2-1所示。

    enter image description here

    图2-1

    2.1 做开发还是转管理

    我们的假设是:你已经走在软件开发的道路上了,做了一段时间软件开发,1~2年,或者3~5年,对接下来该继续做开发还是转向技术管理产生了困惑。

    在此前提之下,有三种方法可以帮助你进行判断:

    • 工作的三种维度;
    • 成就感来源;
    • 未来的样子。

    1.工作的三种维度

    根据交互对象不同,工作可分为三类:

    • 数据和信息处理;
    • 人际互动;
    • 事务型操作。

    假如你发现自己更愿意围绕着人际交互来做事情,希望自己的工作中大部分时间都在和人打交道,那么你可能更适合做管理、销售、市场、客服、咨询师等方面的工作。

    假如你发现自己更愿意做操作性的工作,比如修理电脑、组装电脑、搭建局域网、修理汽车等,那么软件开发工作可能不太适合你,运维或者网管也许和你更匹配。

    假如你觉得信息很迷人,很享受与信息和数据之间这种确定性、一致性、可预期性较高的互动方式,也很享受通过组织、修改、整合、创造信息来解决问题这种工作方式,那么你现在正在做的开发工作,基本上和你的偏好是吻合的——因为开发者偏重于和数据、信息打交道,以信息和数据为输入,也以信息和数据为输出。

    2.成就感来源

    2015年年底创业失败,我决定找一家单位上班。彼时我35岁,在很多人眼里这个年龄的程序员已经要被淘汰了。我面临的选择是:做开发还是做管理。

    从2009年开始我就在做技术管理工作,这时比较传统的做法是,找一个研发经理的职位来做(当时有几个不错的机会),一来职业生涯有延续性,二来薪水也高。可是我后来选择了到全时云商务做开发工作,让很多朋友大跌眼镜。

    我为什么这么选择?其中的关键点是:我觉得亲力亲为解决问题更有成就感。

    回顾我多年的开发和管理经历,我发现在我写作《Qt Quick 核心编程》时,在我一周7天不休息,加班加点重构智能机顶盒播放器时,感觉最为充实,最有意义。而在我做管理工作时,带领团队完成了某项任务,自己也没什么特别的感觉,即便有一些兴奋感和成就感,也很快会被委派任务、一对一谈话等事情淹没。

    所以我思来想去,决定做回开发工作,这样我更能感受到意义和价值,更有成就感。

    每个人的成就感来源都不一样,假如你像我一样,成就感在于自己动手解决具体的技术问题,那么开发工作就更适合你;假如“领导和管理别人、通过别人完成工作、看到别人成长”让你更有成就感,那么管理工作适合你。

    实际上这一点和前面介绍的“工作的三种分类”是类似的。你越倾向于做人际互动类的事情,就越适合做管理工作,你越倾向于和数据、信息交互,就越适合做开发工作。

    可以遵循下面的步骤寻找成就感来源:

    • 回顾你做过的事情,找出那些让你情感反应强烈的,记录下来。
    • 分析你的情绪底色,是快乐、高兴、振奋、愉悦、充实等积极情绪,还是沮丧、灰心、挫败、失落、空虚、失望等消极情绪。
    • 挑选出带给你强烈积极感受的事件,它们就是你的成就感事件。
    • 分析成就感事件,看看它们用到了什么知识、技能、软能力,看看在这些事件中,你印象深刻的交互对象是什么(数据、人、事务)。

    可能有的朋友会说,即便有这4个步骤,也判断不出自己的成就感来自哪里,不怕,第8章——转型——还有更简洁的方法可以帮到你。

    3.未来的样子

    问自己两个问题:

    • 一直做开发,我会变成什么样子?
    • 如果转向管理,我会变成什么样子?

    在你的身边找比你大5岁、8岁、10岁的开发者,看看他们的工作状态、生活状态、个人风貌,是不是你想要的,或者反过来,是不是你讨厌的。

    假如看到他们你觉得看到了自己的未来,这个未来你无论如何无法接受,那么,很可能软件开发并不是你的长久之道,你可能要考虑技术管理岗位。

    那就在你的身边找管理者,看看直接上级,看看其他部门的经理,看看其他公司的管理者,找5个以上的人出来,观察、了解、搜集他们的工作状态、生活状态、个人风貌等方面的信息,看看这样的人是不是你想成为的,或者反过来,是不是你讨厌的。

    假如你也很讨厌你能接触到的这些技术管理者,那么,可能这条路也不是你的长久之道。你的未来应该在别处。你可以考虑转型,那么请去看第8章的内容。

    2.2 找到激励你前进的动力

    你之所以愿意做软件开发,一定是有原因和目标的。比如:

    • 它可以带给你丰厚的薪水和优裕的生活;
    • 它能让你成为自己想要的样子;
    • 它可以不断给你挑战;
    • 它让你有成就感;
    • 它能让你获得认可;
    • 它让你觉得自己有价值。

    ……

    请问一问自己为什么要做软件开发,找到几个理由,记录下来。

    它们会帮助你渡过后面会遇到的倦怠期。

    进入软件开发领域后,你从对什么都好奇、积极学习,慢慢变成机械地完成领导分配的任务,3~5年后就可能会感到无聊、困惑、迷茫,丧失前进的动力,进入倦怠期。

    这个时候,你对工作的态度是“差不多就算了”,干什么都没心思,开始思考朝九晚五打卡上班有何意义,整个人陷入“有事不想做、没事又无聊”的倦怠之中,更谈不上什么技术精进了。

    这是一种危险的状态,要让自己走出来,有两个方向:

    • 为你的工作重新赋予意义。
    • 为你的工作引入变化。

    具体可以像下面这么做,想想你之前记录的做开发的理由,问自己几个问题:

    • 这个理由是否还存在?
    • 为什么这个理由还在但是无法激励我了?是不够量化,不够可视化,还是太遥远?
    • 有哪些新的工作内容可以去尝试?
    • 有哪些新的职位可以去尝试?
    • 有哪些新的方法、工具可以提升开发效率?
    • 当下,软件开发对我的意义在哪里?
    • 三五年后,我会变成什么样子?
    • 我希望自己变成什么样子?
    • 该怎样才能变成我想要的样子?

    做软件讲究迭代,讲究热更新,我们个人也是一样的,要不断自我探索和更新,找到技术在不同阶段对自己的不同意义,只有找到开发工作对个人的意义所在,你才可能有动力去精进。如果你觉得做不做开发、做好做坏无所谓,那么你铁定是无法持续精进的。

    2.3 学习型心态

    所谓学习型心态,指的是:有主动学习的意识,时刻以学习的眼光和心态来看待发生在自己身上的事情。

    举个例子,作为开发人员,你做完了一个功能,展示给领导看,结果他说你做出来的东西根本不是他们想要的,简直一无是处。这个时候,你会怎么办?

    一个选择是怼回去,大家吵一架,然后不欢而散,甚至因此和领导不睦,最终觉得领导太没水平,此地无法发展,离职。

    另一个选择是坐下来分析:

    • 哪里不对?该怎样调整才符合需求?
    • 这个“不对”是在何时被引入的?
    • 以后如何避免开发过程中的走样?
    • 沟通机制是否存在问题?如何改进?

    后面这个选择就是积极主动的选择,是面向解决问题的,是学习型心态的开发者会采取的方式。他们会考虑自己怎样去改进、怎样能达成目标、通过这件事自己能收获什么。

    作为软件开发人员,其实有很多提升自己的机会和方式,而最终你能不能提升,除了要看你是否有内在动力,还要看你是否拥有学习型心态。

    2.4 技术精进之道

    做了各种铺垫,我们终于可以开始介绍精进的方法了。

    对标管理法

    在专业领域成长的一般模型如图2-2所示。

    enter image description here

    图2-2

    模型中有三个要素:

    • 现状
    • 目标
    • 执行计划

    每个人都可以评估自己的现状,自己在做什么、用什么技术、技术达到了什么程度、拿多少薪水、是什么职级、是否被领导认可、与人协作是否顺畅……有很多维度,静下心来思考一下,在纸上列一列,就能得出自己当下的状态。

    而目标则很可能随着旧目标的达成而消失,或者随着日复一日的编码、Debug、交付而褪色,或者随着每个月的薪水蒸发掉。一旦我们失去目标,就会陷入迷茫,被动工作,进而慢慢失去竞争力。

    所以,要想日有寸进,必须要在日常的开发工作中找到努力的目标。这非常关键——很多人就是因为没有目标而放任自己随波逐流、被动工作,最终变得庸常而被组织淘汰。

    因此我们引入原本用于企业的对标管理法,帮助自己在日常工作中找到贴合自己的目标。一旦我们找到目标,对比现状,就可以找到差距和前进方向,有了方向,就可以制定计划,稳步前进,获得提升。

    图2-3是实践对标管理法指导个人成长的基本过程。

    enter image description here

    图2-3

    以下解释来自百度百科:

    对标管理,由美国施乐公司于1979年首创,均将其视为现代西方发达国家企业管理活动中支持企业不断改进和获得竞争优势的最重要的管理方式之一,西方管理学界将对标管理与企业再造、战略联盟一起并称为20世纪90年代三大管理方法。

    对标管理是指企业以行业内或行业外的一流企业作为标杆,从各个方面与标杆企业进行比较、分析、判断,通过学习他人的先进经验来改善自身的不足,从而赶超标杆企业,不断追求优秀业绩的良性循环过程。

    所谓“对标”就是对比标杆找差距。推行对标管理,就是要把企业的目光紧紧盯住业界最好水平,明确自身与业界最佳的差距,从而指明工作的总体方向。

    在针对个人运用对标管理法时,可以从4个方面来寻找标杆:

    • 优秀的人
    • 一般性规律
    • 技术本身的知识层次
    • 项目指标

    接下来我们就从这4个方面展开,看看怎么寻找我们的目标。

    1.从优秀者身上找目标

    我们身边一定有人在某方面做得比自己好,比如:

    • 张三的设计文档写得结构合理、条理清晰;
    • 李四的 UML 图表画得准确;
    • 王五对 ES6 标准掌握得好;
    • 赵六擅长做代码管理;
    • 钱七的架构设计能力超群,对产品的架构如数家珍;
    • 毛八每天上班前都会列出要完成的三件事,每天下班时都会总结;
    • 胡九学习新技术特别快,总是在项目组中担任技术预研角色。

    ……

    别人做得好的方面,都可能是我们努力的方向。我们要用善于发现的眼睛,找到身边人的突出之处。

    在向优秀者对标时,下面的问题清单可以帮助我们有序、系统地分析标杆:

    • 他在什么事情上做得突出?是怎么做到的?
    • 他有哪些知识、技能是我不具备的?
    • 他有哪些提升效率的工具?
    • 他有哪些好的工作习惯?

    举个例子。

    袁大每天都能准时下班,工作还完成得很好。你对这一点很感兴趣,就暗中观察他是如何做事的,发现他过一段时间就会翻看一下纸质笔记本,或者用笔在本子上记录点什么,还有,每天下班的时候,他都会在本子上写点东西。

    于是你跟他聊天,发现他每天下班前都会在笔记本上记录今天完成了什么、遇到了什么问题、明天做什么。还了解到他每天都会早到半个小时左右,利用这段时间规划一天的工作。

    后来你明白了,袁大培养了一个“早规划晚回顾”的工作习惯,通过这个习惯,保证每天都有几件重要的事可做,每天都有目标、有节奏,这样就可以不慌不忙地工作。

    于是你就会思考:袁大的习惯是否可以成为我的习惯?

    这个时候,你就找到了一个提升的方向:培养每日完成三件事的习惯。一旦你养成这个习惯,习惯的力量就会帮助你集腋成裘,完成从量变到质变的过程。

    再举个例子。

    你发现组里的袁二,排查 Bug 特别厉害,像一休哥一样,点点头沉思一下,就可以说出问题所在。即便是别人的代码引入的 Bug,他也可以很快找到原因——只需要翻翻代码,和对方聊几句。

    为什么袁二这么牛?

    你向他请教,发现他做到了以下几点:

    • 对业务特别熟悉,非常清楚某个业务到底是什么,用户在软件上怎么使用这个业务。
    • 对业务逻辑和代码的映射关系特别熟。
    • 爱看代码,所有人的代码他都看。

    好了,正好你总是被 Bug 困扰,往往一个 Bug 能让你愁烦一个星期,这下是不是有努力方向了?

    2.一般性规律

    所谓一般性规律,指的是那些通用的、可以指导我们在什么时候做什么事情的规律。

    举个例子,舒伯的生涯发展阶段理论就是一般性规律,男大当婚女大当嫁也是一般性规律。

    对于开发者来讲,要关注专业能力成长的一般性规律,即技术成长三阶段。如图2-4所示。

    enter image description here

    图2-4

    在技术领域内的成长,基本上都会经历三个阶段:

    • 第1阶段,专项能力的提升,这是初级阶段,你为了做事情,必须先具备某些基础能力,比如你要学会 Python、Visual Studio、Vue.js、TensorFlow 或者 MyBatis 等。
    • 第2阶段,技能体系的构建,这是中级阶段,你拥有了一组技能,围绕某个方向构建了自己的知识图谱,能够用自己的方式来解决问题。比如在 C++ 这个方向上,你用 C++、Qt、OpenGL、Libevent、FFmpeg、WebRTC 等组成了自己的知识图谱,可以胜任流媒体方面的产品开发。
    • 第3阶段,融合创新,这是高手阶段,你具有了丰富的实践经验,具备了 T 型知识结构,形成了自己的思维框架和解决问题的框架,能够融合不同领域的知识,组合各种资源,创造性地解决各种问题。此时你跳出了具体的技术束缚,站在了更高的层面,用底层认知和思维来指导你的工作。

    对开发者来讲,若拥有一年左右经验,多数人处在第一个阶段——专项能力提升的阶段,熟悉某种编程语言,可以完成别人安排的一个小模块的开发。

    若拥有三年及以上的经验,就应该进入第二个阶段了。当你在某个技术方向上构建了技能体系后,就可以完成相对复杂的工作,可以独立做一些事情,甚至可以辅导初级开发者来完成工作了。这个时候,你往往已经是团队里富有生产力的成员了。

    若有五年以上开发经验,应该进入融合创新阶段,能够独当一面,可以独立完成特定项目的评估、设计、技术方案选择等事情。此时你往往是团队里的技术领袖或者技术管理者,具有比较大的影响力。

    假如一个开发者干上八年十年,还到不了第3个阶段,可能就需要考虑通过其他方式来提升自己的竞争力,保住自己在团队中的位置。

    这个模型更适合应用开发人员,对于做基础研究(比如音频算法、图像处理算法等)的开发者,在第3阶段,可能在他所在领域内钻得更深,成为专家。

    我们了解了技术成长的三个阶段,就可以结合自己的工作情况,判断自己当下处于哪个阶段,该做什么事情了。

    比如你做了2年 PHP 开发,可能你处于从第1阶段向第2阶段转型的过程中,此时提升的方向,就可以考虑和 PHP 相关的技术栈,比如了解 HTTP 服务器是如何和 PHP 整合在一起的,再比如了解数据库、操作系统,这样你就可能会定下掌握 LAMP(Linux/Apache/MySQL/PHP)或者LNMP(Linux/Nginx/MySQL/PHP)技术栈的目标。

    3.技术本身的知识层次

    一门编程语言、一个技术框架,其本身的知识层次也会有深浅,在学习时,也存在先后顺序和一般性规律。从这个角度讲,技术本身的深浅层次也可以用于个人对标管理。

    一般来讲,学习一门技术时,有三个阶段:

    • 第1阶段,基础开发,了解 API,基于 API 开发应用。
    • 第2阶段,熟悉内核及原理,主要是了解框架的设计原理,阅读源码,洞悉内在机理。
    • 第3阶段,优化框架,主要是针对框架已有功能的不足进行完善、优化,或者使用框架提供的机制扩展框架功能,或者对框架进行定制,让它适合特定情境。

    我比较熟悉 Qt,Qt 这个应用开发框架,三阶段的划分可能是图2-5所示这样的。

    enter image description here

    图2-5

    多数技术框架,通过分析,都可以划分出类似上面的知识层次和学习阶段。

    以此作为对标的标杆,就可以弄明白每个阶段应该达到什么程度,还可以定位自己处在哪个阶段,当前阶段的任务有没有完成,接下来该学什么。

    4.项目指标

    开发者的工作往往是由一个又一个项目串起来的,每个项目都会有预期结果,都会界定怎么样才算是完成,然后会有一系列的指标用于衡量项目做得怎么样,比如 Bug 率、延期时间、并发用户数、持续运行时间、单元测试覆盖率、安全性等。

    我们在做项目时,就可以用这些指标来要求自己,这样每个项目都有目标,都可以制定一些策略,帮助自己来实现这些目标。

    很多开发者其实不太关心交付时间、Bug 率、冒烟测试通过率、并发用户支持、内存占用、CPU 占用、电池消耗等问题,往往是做完了,能跑,觉得就可以了。

    以这样的态度来应付开发任务,其实损失最大的是自己,因为你白白失去了锻炼和提升的大好机会。

    如果以项目指标来要求自己,把项目指标分解到开发工作中,并且在开发过程中贯彻执行,收获一定比被动完成任务多得多。

    举个简单的例子,如果你用 Java 开发一个电商类的 Android App,内存占用就应当是你关心的一个指标,否则你的应用就会经常出现 OOM 错误,严重损害用户体验,导致用户大量卸载,最终影响产品的市场。

    如果你把内存占用作为重点考虑的指标,一定会考虑如何使用图片预缩放、重用、解码格式、缓存等策略来优化内存占用,你甚至会自己设计一个图片缓存池或者特殊的 ListView 来专门处理用户快速浏览商品时巨大的内存消耗。

    你有了这样的考虑,做出来的 APP 肯定比你从未考虑过内存占用问题而做出来的稳定得多。

    拿来即用的自我提升方法

    前面介绍了如何从4个方面寻找目标提升自己,只要你遵循那些策略,付出一些努力,就可以找到适合自己的提升策略。

    下面给出一些经过验证切实有效的提升策略,你可以拿来直接用。

    • 尝试用同一技术的不同模块或 API 来实现,能让你更了解所用技术。
    • 看看你正在用的技术,想想你处在三个层次的哪一层,找到继续提升的空间,去学习、实践。持续这么做,能让你从泛泛的了解、基础的使用,进阶到熟悉、精通。
    • 了解和当前所用技术相关的技术,可以拓展你的知识图谱。
    • 尝试用不同的技术来实现,能加深对问题的理解,也能淬炼新的技术。
    • 看看别人用的技术点、技术栈,尝试了解,能拓宽你的视野。
    • 看看同一项目内他人的设计和代码,有助于理解整个项目。
    • 尝试新的设计,能加深对问题的理解,更能锻炼自己的架构和设计能力。
    • 看看整个项目的需求、设计文档。不要局限于自己负责的模块,这样可以提升全局观和系统观。
    • 迭代式重构老代码,迭代式重构可以解决时间不够用的问题。
    • 阅读优秀源码,看到好的,思考好在哪里,琢磨自己怎么做到,这样你就会日有寸进,终至千里。
    • 参与开源项目,参与开源项目比阅读开源代码的要求高得多,你要能够理解已有的代码,找到你可以做贡献的地方(issue、feature 等),你的代码要符合该项目的规范,还会被项目 owner 或其他成员 Review,这些都是非常大的挑战,能让你快速成长。
    • 写作技术博客,有利于写作、逻辑思考、讲授、设计等能力的提升,也有利于系统化你的知识。最好的学习方式是输出。
    • 讲给别人听,锻炼讲授、演讲、沟通、归纳总结、逻辑思考等能力,对知识的内化与系统化也很有帮助。当你能够把一个知识点讲到别人也能听明白时,你就是真明白了。
    • 与优秀的人和团队在一起,镜像神经元会让你自动学习优秀者的做事方式,所谓“见贤而思齐焉”。
    第2章 如何在技术上持续精进(下)
    第3章 成为技术管理者(上)
    第3章 成为技术管理者(中)
    第3章 成为技术管理者(下)
    第4章 技术管理新人面临的挑战(上)
    第4章 技术管理新人面临的挑战(中)
    第4章 技术管理新人面临的挑战(下)
    第5章 跳槽8问(上)
    第5章 跳槽8问(下)
    第6章 简历优化指南(上)
    第6章 简历优化指南(下)
    第7章 如何在跳槽时获得想要的薪水
    第8章 转型(上)
    第8章 转型(下)
    附录 A 私房书单

    阅读全文: http://gitbook.cn/gitchat/geekbook/5a3b26e89ba9580e1eaa587c

    展开全文
  • 从2008年发布的第一个JavaFX版本开始,在这几年里,断断续续的利用业余时间进行JavaFX的学习和开发,也怀有用JavaFX进行游戏开发的想法。  不过目前决定暂时减少JavaFX游戏开发相关的内容,仅仅将JavaFX作为一个...
  • 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 游戏引擎是由多个子系统共同构成的复杂系统,它几乎涵盖了游戏开发过程中的所有重要环节,是游戏开发的流程核心。 UE(Unreal ...
  • 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 之前就有想过写一篇关于这个问题的长文,因为还有工作,慢慢写了有两天,很多观点都会带有个人知识水平的局限性,如果有说错的地方,请大方的指出来,或者您...
  • 技术美术 之 开端

    2020-04-28 10:08:59
    本文内容 了解TA,内心诉求 职业要求 成长路线 一、事情始末 过去一个月左右的时间,把毕设论文的主要内容写了,剩下实验部分。在做毕设的同时,我也思考了很多关于自己将来的职业道路的问题。...
  • Day02.计算机基础&Python概述&第一个Python程序 一、软件开发的常识 1.什么是软件 一系列由特定顺序组织起来的计算机数据或者指令 常见的软件: ​ 系统软件:windows,Linux,mac os ​ 应用软件:QQ,一系列...
  • 书签备份

    2018-05-14 20:56:49
    <!DOCTYPE NETSCAPE-Bookmark-file-1><!-- This is an automatically generated file. It will be read and overwritten. DO NOT EDIT! --><META HTTP-EQUIV="...text/h...
1
收藏数 9
精华内容 3
关键字:

unity3d就业前景 知乎