究竟是专精一块技术方向,做到深耕其中所向披靡; 还是谋求什么都能略懂一点的广度,成为一个全方位的人才? 关于上述问题 不知道大家是否有相同的困扰 以下是几位阿里前辈结合他们自身在小厂和大厂的经历故事,给大家分享一些他们在技术人员成长中对于【精】和【广】的选择观点,希望能够对大家有所帮助。 01应用算法立青 更早地认识自己和自己的方向,能更快地帮助我做出成绩。 我想先撇开这个具体的问题,谈一谈一个程序员的技术发展和职业规划。 写代码这件事绝大多数人在喜爱的同时,更多的都是当做一个职业来做的,当然也确实有一部分人真的完全当做爱好。 例如前段时间的新闻,HashiCorp的创始人MitchellHashimoto:顶级凡尔赛CTO辞职:写代码才最快乐!管理只会影响我搞研发; 著名的Linux创始人Linus大神也是出了名的热爱编程。 对于这样的追求(土豪),抛弃功利热爱编程,我觉得在编程上完全可以喜欢什么方面就追求什么方面。 是广泛的发现兴趣探索兴趣,还是在一个方向上深入挖掘都没有问题,大可以今天做前端,明天搞开发,后天攒算法,一人搞定全栈。 但是对于绝大多数人来说,编程更多的是职业发展道路上一个立身的手艺,在众多专业技术方向上挑了一个自己比较喜欢和热爱的。 程序员的发展和众多职位的发展一样,每个人都希望自己能够往上走:更专业,更能在职场上发挥自己的作用和影响力,从单兵作战做小事,到带队做大一点的事,再到影响一个领域,影响一个行业。 这样的发展单单靠自己各方面都懂,都有涉猎,恐怕是不行的。刚毕业的应届同学可以靠自己的知识储备做自己的标签,久经职场的同学必须靠自己在某些领域做出的成绩做自己的军功章。 所以我们越早在某些方向做出自己的成绩,对自己的成长和发展是越好的。 我本人是做算法的,算法领域有很多大牛在学校期间就已经找准了自己的发展方向,并做出了成绩,例如caffe作者贾扬清大神,Taichi作者胡渊鸣等等。 他们的成就就需要及早的找到自己的方向不懈的努力亿点点的天赋对我们绝大多数人来说更需要及早的找到一个热爱的,希望精通的方向并做出成绩。 我自己的经历其实不是好的榜样,我抱着做机器人的梦想本科学的机械,在学校的时候对什么都感兴趣,既参加过机器人大赛,参加过结构设计大赛,也和同学做过热力学相关的一些机械设计; 一个比较有意思的经历是,当时在学校还做过一个上天失败的小卫星。 当时学校的微小卫星研究所发射了一颗皮星(体积很小的卫星)之后,在学校办了一个小卫星的比赛,我们做了一个模拟卫星太阳能电池片自动追踪阳光的卫星模型,在答辩前熬夜完成了,然而在最后测试的时候由于线的固定太过粗糙,在运动中扯掉短路了,把电路都烧了万幸留下了视频支持最后的答辩。 对我后来职业选择影响比较大的是临毕业用Kinect做了一个姿态识别控制无人机飞行的项目,初步接触了视觉算法的一些知识。 后来研究生就真正的开始做起了机器人的方向,也是研究生时期做的控制算法和视觉算法的经历让我走上了程序员的道路。 在这个过程中自己也是对机器人领域中的SLAM方向产生了兴趣,自己恶补了一些知识,并靠着这些最后走上了这个方向的职业。 一方面我觉得自己如果能早一些找到自己的方向并且积累起来一些成果,肯定对自己的发展是要好很多的,但是另一方面每个人也确实需要一个认识自己的过程,但这个过程我想还是越快越好。 在这个过程中,我们自己的技术发展就像是一棵树,我们尽可以无限的去展开自己的枝叶,多了解一些不同的方向和知识,但一定记住这是为了让自己的枝头长得更高。 02中国科学院大学研究生导师刘俊明 首先,经过多年的发展,当前程序员的概念边界已经有了很大的扩展,程序员也划分成了很多种类型,不同类型的程序员对于技术能力的要求也有所不同。 对于从事应用场景开发的程序员来说,知识的广度比较重要,这样能够快速适应不同场景下的开发任务,而对于专注技术平台研发的程序员来说,专业精度更重要。 当前的IT互联网行业正在经历从消费互联网向工业互联网覆盖的过程,程序开发任务以技术平台为分界线分成了两大类,一类任务是基于各种技术平台来完成行业场景的落地应用。 比如基于云计算平台、大数据平台和人工智能平台完成的各种行业场景开发,这一类开发任务的整体数量是非常大的,而且在工业互联网的推动下,未来大量的行业企业都需要基于技术平台来完成创新。 另一类程序员则专注于各种技术平台的研发,包括云计算平台、大数据平台、物联网平台、人工智能平台等,而且在工业互联网的推动下,技术平台也在不断细化。 有的企业会在云平台的基础上做PaaS类平台,有的企业会基于大数据平台做行业大数据平台等等,这同样需要大量的程序员。 通常情况下,我们把基于技术平台做行业落地应用的程序员称为应用级程序员,而从事技术平台研发的程序员称为研发级程序员,二者的专注点是不同的,开发方式和团队合作方式也有一定的区别。 应用级程序员对于知识的广度要求更高一些,毕竟在技术落地应用的过程中,需要考虑到大量的技术细节,这些技术细节虽然难度不算大,但是涉及到的技术却比较杂。 相对于应用级程序员来说,研发级程序员则更专注于平台的各种系统级功能,而系统级功能往往有很高的性能要求,所以就需要程序员对于操作系统和算法都有较深的理解,而且平台研发的团队规模往往都很大,每个程序员只需要关注一个点就可以了。 03有鱼科技技术总监 专精有专精的发展方向,广度有广度的发展方向。 看你喜欢和适合。 专精需要选好方向,语言,前后端等,如果选错了就麻烦了。 选好了之后就往深了学吧,越深越厉害。 比如选择前端,vue,js,做UI库。如果能够专精到可以做UI库,甚至做vue这类的架构,那你还愁啥。 广度,一般是往项目经理,产品经理方面发展。 因为你知道的多,可以选择适合当前项目的框架,类库,开发方式,组合方式等。 对人员的能力也会有比较准确的了解,然后合理搭配,控制项目进度,沟通各个部门的衔接配合等。 前景都不错,看你自己适合哪个方向。 04移动开发临境 不要把自己当做业务研发的工具人。 这个问题没有标准答案,角度不同,得出的结论会大相径庭。前不久刚从小厂跳到阿里,简单聊下我自己的感受。 小厂会更偏重于业务,因此我们更多的是在实现业务方的需求,日常的研发工作也少有接触特别难或者深的内容。 这个阶段不是说基础不重要,但深入学习基础知识可能对你业务研发不会有特别明显的提升。 曾有段时间我为了学习算法知识跑去刷leetcode,刷完两三百题后陷入了迷茫。 这些刷题获得的算法知识在大部分的业务场景中不太能用上,虽然它对于在编程中边界条件判断、减少低效代码确实起到了一定的帮助,但相较于投入的时间来说性价比略低。 同样道理,学习操作系统、计算机网络、计算机组成原理能让你对整个计算机体系有一个更深层次的认识,但工作的人不比在校生,时间比较有限,如果你不是一个特别特别自律的人,投入时间没有看到明显产出很可能会中途放弃。 如果想要在工作的同时更深入学习一些计算机基础知识,可以从你正在做或者感兴趣的性能优化入手。 不少性能优化手段背后都伴随着深入的知识,比如之前不少大厂分享的针对iOS二进制重排优化冷启动的内容。 学习过程中一定会碰到自己不了解的知识,一点点去积累,会比盲目的抱着一本砖头书直接啃更容易坚持。 另外,如果是业务研发,请一定锻炼自己对业务的理解程度,不要只停留于需求来了做完就完了,把自己当业务的工具人没有对个人成长没有益处。 最后,和大家分享一句我和喜欢的话:书上没有知识,书上只有信息;知识是在特殊的工作和行动中运用信息的能力。共勉。 最后 程序员要精还是要广,并不是一个有着标准确定答案的选择题。 精于基础,广于工具,熟于业务,永远保持进步和学习的心态,希望各位都能找到最适合自己的技术成长路径。 你怎么看呢? 今天的内容觉得有用的话就 收藏分享 给需要的人吧!