后三组选的多年实战经验的全职高手猥琐三人组给你分析

Sina Visitor System又要上班码代码了?送你一篇开发者高手修炼指南_StuQ_传送门
又要上班码代码了?送你一篇开发者高手修炼指南
斯达克学院
本文为 StuQ 公开课004期——十年实战经验开发者,国家职业规划师安晓辉的 Live《程序员的精进:如何成为高手》主题分享。 Live 围绕什么是高手、成为高手的一般路径、构建自己的知识体系和精进的三个习惯这四个话题展开,结合具体事例,深入浅出的讲述成为高手的精进路径。本文根据 Live 分享内容文字版整理而成。
正文 这次的题目是如何成为高手,题目可能非常吸引人。那么在开始之前,先请大家思考两个问题:1.什么是高手2.成为高手的捷径是什么?
1. 什么是高手 今天我们现将第一个问题:个人能力的三个层次,请大家看下图:这张图片表现了一个人能力的三个层次,在这个金字塔中,金字塔塔尖是“资源”,中间是“应用流程”,底座是“价值观”,它是越往底部越重要。所谓“资源”其实是指像知识、技能、时间、金钱、人脉、天赋等等。对于软件开发而言,比如说你掌握的 Java 语言,Scratch 框架都属于这些资源的能力。处于中间的是应用流程是指你解决问题的方法你的思维框架、分配资源的方式、你怎样进行自我管理等等。应用流程能让我们整合各种各样的资源,寻找到解决问题的策略,更好的来解决问题。也能让我们找到开发产品的思路,能让我们创造出产品,所以这是应用流程,它比资源方面的能力更为下沉也更为重要。这个金字塔的底座是价值观,所谓价值观就是你认为什么是重要的、你要什么你不要什么、你如何做决策,这就是最根本性的。比如说你选择做软件开发,这就是哪些方面的因素你觉得比较重要。比如说你觉得有挑战性、你觉得创造性的感觉非常美好。或者说你愿意在技术方面来建立自己的竞争优势,来建立自己的成就感。现在我们再从另外的方面来看看,我们先看软件开发的一般性流程。这个流程在我刚发的图已经完整的体现了出来。第一部分是基于需求、基于知识技能、工具框架,以这些作为输入,在你的头脑当中需先找到解决问题的方法,先找到了如何构建产品、如何构建服务。在你头脑当中先构建具体的产品服务,然后再进入最后一个阶段,就是你用技术用编码去实现,通过编程把你的产品服务解决问题的策略,最终实现出来。这就是我们软件开发工作者工作的基本的流程。那在这个流程当中,尤为重要的是第二个阶段,也就是你在头脑当中去找到解决问题的方法,你要第一次把产品和服务创造出来,只有你完成了在头脑中或心中创造的这个过程,你才能够用语言、技术去实现。所以从这个角度上来讲,那中间的这一部分所牵涉到的能力更为重要。
成为高手的一般路径 我们要成为高手最重要的是要培养的能力,正是一开始提到的个人能力三个层次中间的:应用流程这块。我今天的Live如何成为高手,我要讲的那是更广泛意义上的成为高手的这样的一些方法、思路,可能不会太涉及某一门具体的语言某一门具体的技术所涉及的细节。从这个角度上来讲,我觉得作为一个软件开发方面的高手。他最重要的能力有六方面:快速学习的能力逻辑思维能力想象力沟通能力目标管理的能力时间管理的能力这些都是非常重要的能力,也都是通用能力。能够帮助我们更好地掌握专业的知识技能,帮助我们把专业的知识技能、技术以及外在的需求整合在一起,最终发现解决问题的方案并实现。现在我们来回答开篇第一个问题:什么是高手。我认为所谓的高手,就是它形成了自己的思维框架。能够快速运用专业知识技能,解决实际问题的人。再给高手下这个定义之后,接下来我们要将第二个话题:成为高手的一般路径。
成为高手的三个阶段: 要想成为高手,一般都会经历三个阶段:模仿阶段在这个阶段我们会向身边的高手学习。以软件开发为例,你到了一个单位你可能会有师父来带,或者你身边有很优秀的开发人员,你会向他们学习,看看怎么工作,看他们怎么编程,看他们怎么解决问题。通过向他们学习来丰富自己。让自己逐渐能独立解决问题。这个时候那你就走出了模仿的阶段。然后进入到第二个阶段也就是融合阶段。融合阶段在这个阶段的你会把你从高手身上学到的做事的方法、解决问题的方法、思考的方式等等,结合你自身后融入到你自身身上去。然后最终找到你自己的解决问题的方式。用你自己的方式来解决问题,这是融合的阶段。到了这个阶段,实际上你已经能够独立的来完成一件事,能承担起责任来了。已经成为了一个合格的、能独立解决问题的软件开发者了。创新阶段你能够很好的应用已知的知识技能解决问题,还能够结合具体的问题,然后再把知识进行创新,或者说是能够把一个领域的知识,迁移到另外一个领域去运用,解决特定的问题后,去提高另外一个领域的效率。还在这个时候那你就有了创新的能力。这是第三个阶段。到这个阶段那就真的成了高手。因为你已经能够整合各种各样的资源来产生新的知识技能了,已经超越了模仿。接下来我们结合具体的技术,来讲一下学习一门技术和一个框架的三个阶段。这三个阶段中第一个阶段是基础开发,也就是说你了解某一个框架的 API,基于它的 API 能进行,通过简单的开发来解决简单的问题。就是第一个阶段。第二个阶段那就是你去熟悉这个框架的内核和原理。了解这个框架本身的设计原理。还有时候你还要去阅读它的源码,去了解它内在的设计和工作机制,在这个时候当你完成了这样的工作之后,你就能够更好地去运用这个框架来解决问题。那第三个阶段是你可能会选择去进一步的学习这个框架,然后去优化框架。针对框架的已有功能的不足,来进行完善优化,或者使用框架提供的机制去扩展框架的功能。再或者你会对框架进行定制,让它适合你特定的情境来解决特定的问题。只有经历了这样三个阶段之后,作为一个软件开发来讲。你才能说是真正的掌握了一门技术。
以Qt应用框架为例 因为我对 Qt 比较熟悉,我们以 Qt 这个应用开发框架为例,来讲一下学习一门技术的三个阶段。第一个阶段基础开发,对 Qt 来讲就是去搭建它的环境,去熟悉它里面的信号与槽,去熟悉它里面的一些容器内库的使用,去熟悉 Qt Widgets 各种各样的控件,去熟悉 Qt Quick。然后用这些去做简单的应用开发。到第二个阶段,你要熟悉内核原理。这个时候你可能就要去了解他的事件循环的原理,然后就分析它的源码,然后可能回去了解它每一种 Widgets 里面是怎样实现的,比如说像 QGraphicsView 它里面怎么去实现。如何才能更高效?这是你熟悉内核的一个过程。经过这个过程之后,你会更了解这个框架,你有可能就会继续往前走进到第三部分。第三个部分就是优化框架。比如说你去优化 Qt Quick 里面的 Js 引擎,或者说你去解决 Table View 它的性能问题。因为 Qt Quick 中 Table View 比较多时,性能会较低。再比如你也会去优化 Qt Quick 中各种手势的精度。比如说在移动终端上,它的精度也有优化的空间。再比如说你可能拓展 Qt Quick 的框架,给 Qt Image 加上新的格式,比方说你拍摄照片它有 Roy 的格式,有可能 Qt 现在就是不支持的,可以写一些插件让他支持等等。当你经历了这三个阶段后,你对Qt的整个框架的了解和运用都会更熟练。现在的我们来回答 一下我们一开始提出来的第二个问题:成为高手的捷径是什么?那答案是:没有捷径。就像我下面的这张图一样,我们要有多努力,才能显得毫不费力。有时候我们看到一些高手解决问题或者拿它来去做开发的时候非常的快。做出的质量很高。但实际上他背后一定经历了我们刚才提到了这样一些过程,付出了很多的辛苦,然后也经历了非常非常多的练习才达到了这样一个程度。
构建自己的知识体系 要想构建自己的知识体系呢,实际上有如下几个步骤:选择一个方向。经历学习实践输出内化这样一个过程,将知识变成你自己的。了解关联技术。在你选择的这个方向上,在你学习的这个知识或者技术方面,它一定有一些关联的方面,然后你去了解他关联的技术知识,在同一个主题内去扩散让你能够有一个体系。形成自己的知识体系。记录你学到的知识记录和你的经验 ,去把你学到的知识经验技术等到串连起来形成你自己的体系。最后一步那就是你还要保持技术迭代更新,因为很多技术的时间是不断的在更新的。比如说 C++ 我们最开始是 C++98,现在已经是 C++11用的比较多了,C++17的标准也已经出来,马上要投入普及和应用了。我刚才发的图是我整理 C++ 时做的图。结合这张图我们来讲讲构建知识体系的过程,选择方向比如说你想选择哪个技术方向,那我们以编程语言为例。你想选择 C++、Java、OC 或 Scala、或 Sharp 等等。选择的方向了其实就决定了你能够建出来什么样的知识体系。但在选择方向的时候,你可以去考虑这门语言在那些行业的应用,有哪些知名的产品还是用这门语言来做的。这个会对你有一些帮助,另外也可以考虑而使用这个语言的行业的平均薪水、收入水平等等。这个也可能会成为你选择的一个理由。总之你需要综合考虑来选择一个方向。一旦你选择那个方向之后,一开始的时候能往往都是学习一些基础的东西。我们以 C++ 为例,你就学习一下 C++ 的基本的语法和面向对象的思想,它的指针,它的多态继承、它的模板库等等。各种各样的这样的一些语言基础知识。然后那接下来就是这个语言围绕着会有很多的类库,比方说网络的话,还有可能有一些 Ace 或者 Light Event,你像 Gui 这里可能会有Qt、有 Cef、有 Mfc 等等,Direct UI 还有很多在这个方向上去学习,然后用相应 C++ 这块的知识和技术去做项目的时候,不断的接触到不同的框架。去学习掌握这些框架,把这些和基础的语言关联起来通过不断的学习,慢慢丰富这方面的知识体系。要注意的一点是不要放过自己曾经用过的东西。比如说你在一个项目当中用到了图像处理方面的内容,但是可能你可能仅仅是做一个灰度或者模糊的这样一个效果,但是你在项目完成之后那应该去想一想我有那些东西没有用到,我用到的这部分是还有没有其他的使用方式等等。有没有其他的实现方式,还要多去想一想,多琢磨琢磨。这样的话你才能够把这个领域的知识和技术能够更好的更有机的组织在一起。当你对某一个领域具了比较广泛的深入了解之后,其实是有另外的一个技巧对深化我们的知识形成体系非常有帮助,就是去输出你的知识。比如说你把你学到的东西讲给你的同事去听、去写些文章、画一些思维导图。能把你的知识做形象化的表达处理。这些都是输出的过程。你在输出的时候,会更加深入了解思考你学到的东西,能够让你这样的知识体系的能够固化下来、也更加结构化。当我们在某一个领域内建立了知识体系数,做的比较深入了。比如说你在Java 或者 Gtoe 方面做了三到五年了,在这个时候能其实你就已经应该是比较熟练了。 到了熟练的时候那你就可以在往广度方面去发展,比如说你可以去了解跟 Java、Gtoe 相关的还有哪些的框架,在哪些行业里有应用。或者有哪些开源的的产品等等。就是来拓展你的广度,最终形成一个梯形的结构。所谓梯形是在某一个方向上掌握的很熟练,能够深入能够用它来解决问题。另外那你也可以在与他相关的这些领域的都有自己的知识有自己的了解。能不能把深度和广度结合起来这个时候那你的整个人能力了就会得到更大的提升。你也能够实现更大的价值。我觉得对软件开发来说,最理想的知识结构就是梯形,也就是广度加宽度。
4. 精进的三个习惯 刻意练习复盘敏捷我今天的最后一个话题是精进的三个习惯,其实习惯的力量非常强大,要想成为高手,一定要养成好习惯。只有依赖习惯的力量,我们才能长期的去学习、实践。然后逐渐成长,最终成为高手。一个开发者来讲了他一般的这样成长的过程来是这样子的,首先在某个方向上不断地学习实践、提升,一段时间后他构建了自己的知识体系,在这个方向上也拥有了结构化的知识体系。拥有了很深的一些经验和技能,能够难产生价值能够解决别人难以解决的问题。到了这个阶段基本上一定能够继续前进,最终成为高手了。在这个过程当中,还有一些方法能够加速它成为高手的过程。这里边那就是我们知道的这三个习惯。1.刻意练习;2.复盘;3.敏捷。
刻意练习 刻意练习有一个最简单的3F原则:Focus、Feedback、Fix it。Focus是指要有目标、你要专注的去做事,方向明确。能够聚焦当下,还要能积极努力的朝着一个 方向去前进。对于软件开发而言,你选定了一个方向之后,要在这个方向持续的积累,只有你做上几年时间,才有可能在一个方向上有比较深厚的积累和成长。Feedback是指的反馈也就是说呢我在学习的时候那你最好能够找一个优秀的开发者让他呢当你的教练或导师,让他及时能给你意见反馈。这样的话就能够知道我学到什么程度还,和别人有什么差距,哪些地方做得不对的。你有了反馈才能够进一步地去改善、去前进。第三个是Fix it,指修正改善。当你从别人那里得到了反馈你要根据反馈来找自己的差距,找改善的这样的措施、然后能真正的去落地去改善,这样的时候你才能不断的进步。这就是3F原则。坚持这个原则,你就可以在学技术的过程中不断前进。在刻意练习时有一点是特别特别重要的,即不断地设定目标。我们当下要实现的目标一定要高于你的能力,要有一点挑战。这样你才会能够提升。这个目标完成再设计另外一个目标。你会不断的设立新的目标,最终形成一个目标阶梯,就像登山一样,经历了这样的过程,才能真正的取得成就。工作当中就应该经常地使用刻意练习的方式。比如说那我们可以把每次机会都当作锻炼,比如你修改 bug,很多人是改完了就完了,这个 bug
不出现就好了。但其实你还有很多可以做,把它当成刻意练习的机会,比如说你要熟悉bug 相关的业务逻辑,熟悉代码逻辑。改 bug 时要从根本来解决。而不是像外科医生那样贴个膏药或者剪掉爱出问题的部分。同时你要考虑以后如何规避出现同样的 bug,还要再想一想还通过解决这个 bug 我得到了什么,我学到什么东西。再举个例子,比如说要增加需求。增加需求或者说你做新产品加入了新的功能,在这个时候那你也可以把它当做一个刻意练习的机会。比如说你可以给自己设定目标。这次我要用不同的技术框架来实现,我上次用了 a 框架了这次我可以用 b。或我上次是某种方式用的 a 框架,这次我换一种方式来用。比如我也可以使用不同的设计模式。再比如说我这次在实现这个需求的过程当中,我还要去做更好的设计。去形成 Um2 里面的类图,比方说像时序图、部署图等等。给自己提出来新的需求新的目标。这样你在实现一个需求的同时就会得到更多的锻炼和成长。
复盘 复盘其实是回顾总结的升级版本。所谓复盘就是你在头脑当中那么对过去的所做的事情了重新过一遍,通过对过去的思维和行为进行回顾反思探究,来实现能力的提升。复盘的关键是推演。通过推演这个工作,复盘就不仅仅是对过去的复制呈现,而是你可以能够进行各种可能性的探讨,然后真正的把你的过去的做过的事,重新思考、推演。然后把复盘和总结从本质上区别分类,把你的经验固化,预知后续的事件,让自己能够更好的成长,将来更顺畅的做事。我们在工作上其实最应该应用复盘。用复盘有这样一些时间节点,比如说我这个项目做完了,这个项目版本发布了。这个时候你就可以去复盘,想一下你会做得好做得不好,那块取得了比较好的进展,为什么?这个原因能不能够固化下来,下次在同样能够做好,像你做这样一些想象设想。你做不好的地方那可以问一问为什么,下一次怎么样去规避,是不是要设计一些流程还是说要有其他的一些策略等等。当你这样去总结你过去做过的项目,做过的事情的时候,那你就能够从中汲取经验,也能够带汲取教训然后以后那就能够做得更好,你每次做事,每次到了一个时间节点都这样去做,把复盘形成了习惯之后,那你就能够不断的成长,而且一定能够和别人区分开来,形成自己的成长路径。我们再举一个简单的例子,我的第一次的 Live 题目是:你适合做开发吗?当时是我第一次讲知乎 Live, 我感觉太好,下来之后呢我马上就在想,我哪里讲的不好,是不是话题有点多,是不是时间卡得也比较紧,可以有些东西呢还没有讲。到后来那还有朋友就跟我反馈问题答的是不是有些少,然后呢提供的这种知识点有点多。那我接下来那我就马上就采取了一些动作。我把Live 当中朋友们提到的问题那都在了出来然后整理成文章然后再一一回复最后那发布到我的知乎专栏,然后来我就对照着朋友们的反馈了,这次来我那么我就做了一些设定。比如说我要更多的回答问题,然后整个主题都形成了一条脉络。通过这样的一些方式,那你对之前做过的事情里边做的不好的地方去改进,制定有针对性的策略来改进来优化,那你现在再做的时候他就能做得更好。另外你之前做的好的地方,那你继续发扬后,也能指导现在做的事情。这就是复盘的意义。
敏捷的习惯。 如果能把敏捷开发的习惯变成我们工作当中做事的习惯,那对我们的成长是非常有益的。在 Scrum 当中有一个每日站会,所谓每日站会就是每天早晨整个 Team 的人都站着开会,每个人都会回答这么几个问题:我昨天完成了什么事,我昨天遇到了什么问题,我今天要做什么事。这三个问题对应的可以转化一下变成我们工作的习惯,比如说你每天早上都问一下自己我今天要做那几件事情,那你每天下班的时候就做一下盘点,我今天完成了那些事情、那些事情没有完成,到什么状态了,我遇到了什么问题,我明天准备做什么事情。当你把早上晚上的这两个习惯坚持下去,那你每天都是有事情可以做的,每天都可以有进展。长久坚持下去会有非常显著的效果。你整个人的效率都会得到很大的提示。这是我们说的三个习惯,一个是刻意练习,它能保证我们更好地 去学习一门技术,另外一个是复盘,它通过回顾总结我们做的事情做的项目,让我们的教训经验等等都能帮助我们后续做事情中做的更好。第三个是敏捷习惯,你可以把敏捷模型当中的某些习惯,比如说每日每日站会,启动会议、计划会议等等,还有些东西都可以转换你的工作方式,提高你的工作效率。这样做到三点你的路就会走的更加顺畅。
问答环节 一个程序员掌握几种语言最好? 我觉得一个程序员开始最好在一门语言上做到比较深入、精通,然后再学习其他语言。这时候学习效率较快,因为你已经有了相关的经验,知道如何应用。这样三到五年后,我觉得一个程序员将会掌握三种左右的语言去做开发。但我认为最重要的不是你掌握了几门语言,而是你怎么样用语言、用技术、用框架解决问题和开发产品。目前我使用Qt开发应用软件,在国企工作两年,只做过一个项目。感觉技术没提高,该如何抉择? 其实你要想提高的话有这么三个途径可以尝试:1. 你可以自己设计一些项目,如设计软件或者参考别人的软件功能自己实现。用你在Qt当中还没用到的那些内库或者 API,这样也能得到锻炼。2. 你可以参加一些开源项目,在Github 上还有很多项目可以去参与。3. 你也可以选择在新的工作机会,那种强度稍微高一些的。这样的话也会有很多的事情做,在做事情的过程当中,在你用 Qt 的过程当中,你的技术能得到不断提高。如何成为AI工程师? 对于AI来讲,其实工程师也分为几类。1. 去实现算法的,比如说像机器学习、神经网络这些方面的一些基础算法。2. 做SDK方面的开发。等到AI发展到一定阶段,一定会有人提供相应的类库出来,那就是需要更多人去开发的时刻了。这部分的工程师做的工作那就把算法形成SDK后提供出来,再对外提供接口。它可以供第三方运用,供更广大的人群使用。3. 应用开发工程师。你去应用AI方面的类库,然后直接拿去做开发。这个时候其实你是不需要去了解具体的算法,别人提供的类库,你能拿去解决实际的问题,你能够使用能够知道他用在什么样的场景能解决什么样的问题,这样就够了。很多人在第二部分熟悉内核和原理上就止步了,在研究内核跟原理方面与什么好的经验和方法呢? 其实我们在学习的时候,很多人到第二部分,在了解这个框架或者技术的比较深层的内核和原理的时候他就比较难进去了。这个时候我的建议有两点:1. 就是从一个具体的点入手。要从你已经用到的那部分入手,比如说你用到了某一个控件或者说你用到了某一个特性,然后那你再跟进去深入了解这个特性本身,与它相关的内容。2. 使用一些更方便的工具,比如说像Source Insight 等这些,它可能对阅读源码较为方便。3. 给自己定一些目标。这个目标那不能太高,可能你伸一伸手手就能够够到了。第一个目标实现了你可以给自己一些奖励,比如说吃一块巧克力或者其他的方式。然后再去实现第二个目标。每个目标那都比前边的稍微高出来一点点。梯度不要太高。如果一下子特别高的话可能就很难达到,也会导致你放弃。通过这样的那些方式,会相对比较容易去跟进去,能够做下去 。PHP 想更进一步提高要去怎么学习? PHP你要想提高的话,首先你得了解PHP相关的技术,比如说他有什么样的框架,能解决什么样的问题。再比如说PHP它是不是要运行在一个HTTP的服务上,它和HTTP的服务之间是怎么去交互的,把这些问题弄清楚后,也会对你有一些帮助。此外,你也可以去找一些使用PHP开发的开源项目,比如说你去Github,以PHP为关键词去搜索一些开源的项目,了解这些项目实现的功能。去看他们的设计、实现都是如何做的。从这些优秀的开源项目上,也会带给你很大的帮助,也能让你学到很多。学习一门语言或技术,自学的时候总感觉吃力以及缺乏自控力。作为职场新人,我是否需要参加培训班? 我们在一开始就提及对一个程序员而言,最重要的能力有两方面。1. 快速学习的能力;2. 解决问题的能力。对于职场新人来讲,首先要自学,比如学语言学技术你可以通过看书、练习、视频学习。去自学,坚持一段时间,看是否能学进去。如果真的学不进去,你再考虑参加培训班。但参加培训班也要抱着自主学习的目的。老师讲过的内容,自己也要不断的去练习,不断地去拓展知识,不断的在实践当中把老师讲过的东西去运用,把这些知识和技能内化为你的经验,这些都需要你自主学习。不管通过哪种方式,一定要找到对自己最有效的学习模式,积极主动的自主学习,自主解决问题。这样才能提升自己。想要为一个类库写插件的话,如何着手,有哪些标准和要求呢? 每个类库都有自己的插件和规范,比如VRC,一个知名的多媒体播放器,它就有自己的插件。它是DRL定义了几个导出的函数,他就用这样的方式再加一个结构体,定义了一个很棒的一个插件。再比如说FFmpeg,他也有插件的机制,能够让用户动态地去增加音频、视频方面的一些 Godeck,你需要了解他们这方面的设计。然后你去看其中的某一个插件的例子,去从他们的源码来看他们是如何实现的,这就能知道若自己要实现的话,将要实现什么样的接口,这个接口将以什么样的形式提供出去,我的插件那应该如何注册到这个类库当中去这个类库在使用的时候才能找得到等等。这些都可以通过两点去学习。1. 通过它的设计文档。2. 已有插件的实现方式。至于说所有这样的插件有没有标准答案。其实是没有统一的标准。每个类库的都不一样。最重要的那你失去了解这个类库本身它的插件框架是什么样子的。然后根据他的框架要求去实现。如何阅读一个很难阅读的开源项目? 如果开源项目比较大的话读起来确实会比较困难。有五个方法:1. 最重要的是要有一个明确的目标,比如说你觉得FFmpeg的源码中你想了解H264的解码,这个就是一个明确的目标。你能找到相应的 Godeck。然后去看他的源码。2. 使用好的工具。比方说像Source Insight的或者是 Stack,它能去做交叉索引,帮助你加快阅读速度。3. 记笔记,比如说你了解了一部分,你就去记下来,或者用UML或其他的一些流程图然后能够把他的里边的调用过程都都会记录下来。你就不会边看边忘,关键点记下来就能在回想的时候串连起项目的流程要点。4. 找到入口。你在阅读的时候要能找到它的入口,比如我们举一个最简单的例子:比如说你从梦函数入口,然后可以调用剪辑去看,这样就比较好阅读。再比如说如果你读的是某一个模块,那就从这个模块的入口去看,不断的去追溯、根据函数调用或者根据数据流程,然后读进去。5. 运用一些debug的工具。比如说你把开源的项目跑起来,然后去Debug,然后看一看他的函数调用的是怎么调用的。如何利用空闲时间提升自己的技能? 一个人空闲时间要想提升自己的技能,首先要有一个目标。你得知道你想提升哪方面的技能,比如你想提升讲课的技能、组织协调能力等等。只有有了目标之后,你才能够将想法落到实处,接下去才会行动。比如你想提升自己的组织协调能力,那你就可以组织同学聚会或者组织线下的技术交流、技术沙龙。如果你有一些爱好,那你也可以去组织具有相同爱好的人在某地举行一些活动,这些都可以锻炼组织协调能力。如果你是技术上的能力想要提 ,那你也可以去设计一个目标。比如说我自己去做一个软件,如记账的软件或是其他方面的能够解决你生活动中某种问题的软件,然后用你掌握的技术将它实现出来。在这个时候能就能够在做的过程当中,提升你的技术能力和在项目方面的管控能力。PHP 三年开发经验的开发者,想学Node.js和Java之一,该怎么选? 我觉得你要选两者中的哪个,取决于他们和你PHP开发的关联度。我理解的PHP它需要依赖一个底层的ATP服务然后才能够真正的运转起来,那你就看你现在在用的PHP语言它的框架,看你在做项目的时候它是和什么样的后端结合的。假如说它和Java Web的一些东西结合的,那你就去学Java。假如说你用的PHP是构建在Node.js 上去组成后端的服务,那就学Node.js 。只有你现在学的东西在你现在的工作当中能够用到。你才能保持学习,才能有机会去练习和实践,才能更好的坚持学习。当然如果两者中有一个是你特别想学的,哪怕用不上也想学,那你可以自己设计一些项目或找一些开源的项目自己练手,自己参与进去,这也算是把你想学的东西应用起来,然后走向熟练,成为一个新技能。请问AI未来前景如何?现在开始入门是否有机会?哪些机会?学习Java要不要报培训班? 我觉得AI前景是非常好的。现在也很热。如果你有数学的基础,现在就可以去学,可以从算法入手,这个以后会非常有竞争力。如果你没有这方面的基础,如果数学和物理比较弱一些,你可以去学习应用方面的开发,你了解AI它有哪些应用场景,有哪些算法,有什么样的类库。你能不能用别人的类库来解决实际的问题,在应用方面做一些开发。这也是一个好的切入点。现在我了解已经有很多好的开源AI的类库或SDK,你可以搜索看,是否可以利用这些资料先接触AI。一个新技术,一个未来会热的技术,越早接触,你建立的竞争力就会越强。如何证明自己能够胜任某个岗位? 其实,要想证明自己能胜任程序员的最好方法就是做东西出来。如果你现在就往程序员、软件开发方面去转,你可以做一些自己的作品,比如说做一个安卓app/iOS app等等。或者如果你是后端可以做一个服务、网站后台等等,前端可以做网页等等。你能自己做一个产品,带着你的产品去面试求职,就能证明你可以胜任这份工作。我在大学前两年都在算法竞赛中,在没有取得很好成绩的时候怎么在最后的一两年中选好方向为就业做准备? 要为就业做准备还是要想自己喜欢什么,你做算法竞赛是因为喜欢算法吗?还是喜欢某一种技术?如果你喜欢算法,即便竞赛没有取得好成绩,也不代表你不能做算法。竞赛和工作时不一样的,工作对算法的要求更偏应用,它是匹配具体问题、具体需求后,会用到的某一种算法。竞赛中应用的算法可能更偏理论。此外,你可以想算法外你还喜欢其他的吗?比如AI、图像处理、大数据等等,如果有喜欢的也可以继续去做准备,还有一两年的时间,你还是可以在其他方面有深入的研究的。学习类库感觉有一种隔在空中的感觉,并不能知道原理,只能积累经验,会遇到很多没有道理的bug。而且并不是可迁移的技能和可深入和扩展的能力? 对从事软件开发的人而言,需要具备几个能力。1. 技术能力和知识。比如说你学了C+ +的类库,那你将来的工作用不到,那有可能C+ +知识本身是不可迁移的,是没有用的。这是你的技术有一部分可能因为工作的变动不再用得上。2. 行业知识、产品业务方面的技能。比如所你做股票相关的工作,你积累的股票相关的知识在你切换到教育领域去做产品之后后,可能就不再有用了。这是行业知识领域的不可迁移。3. 通用能力。比如说你形成的思维方式、做事流程、自我管理能力、时间管理能力、领导力等等,这些都是通用能力。它是可以迁移到任何行业中去的。作为开发人员我们也要经常盘点自己,发现自己具备哪些能力。这样在求职、盘点的时候,看能不能迁移这些能力过去。如果有能迁移的,又是你比较喜欢的 ,这个也是求职的最好机会。对于框架该怎么进行学习? 刚才讲到过,分三个阶段。1.了解基础的API,做一些应用,先用起来。2.把你用到的这些作为切入点,了解它里面的原理,深入到框架里去。3.当你比较熟练的应用框架去解决问题时,可以看看能否拓展框架、优化框架的某个功能。请问老师,学习的知识怎么转化到实践? 最好方式是你用它去解决问题,比如说你学安卓开发,你学了它的框架。只有你去做一个app,去解决某个需求的时候,你才能用起来。比如说你做一个记账的app来记录自己每天的花销,当你有这方面的需求,你学到的知识就能运用起来,在实践中去转化,为你带来价值。如何把Java学的更好? 首先要定义什么是更好,你可以看看身边有哪些人,你觉得他的Java用的比较好然后去看看他都学了什么东西,用了什么框架,是如何解决问题的。这时你就可以以他为目标定下来一个小目标,有了目标之后,接下来就是如何去学的问题。学的时候你可以找到自己的方式,比如看书、学习开源的项目、设计小应用或服务,自己去实现。其次就是要拆分目标,形成一个目标的阶梯。比如说你学Java,就要给自己设计小目标,一个比一个高一点,形成一个目标阶梯。这样你一个一个的去实现,会不断获得成就感、获得激励,从而不断前进。第四点就是根据自己的兴趣设计综合的事例,身边的人遇到了问题,你看是否能抽象出来,通过软件去解决。因为你有实际的、有意义的软件去做,就可以更好的应用自己的技术。电气自动化毕业两年,但是未从事过软件开发,如果想进入这个行业,怎么计划,先自己学习还是进入一个公司跟公司一起成长。 如果原来没有做软件,现在想从事。有几点需要注意:1.想一下你想做那种类型的软件,比如说电子自动化、自动化控制方面的软件。那你可以看看你喜欢那种产品相关的软件,比如跟冰箱相关的还是跟某个设备相关的软件,然后你去了解这种产品是用什么技术做的。比如说他用C语言做的是嵌入式的开发。那你就有了方向,那你去学习C语言,去学习嵌入式。这就是你第一个找方向的过程。找到方向了就可以去选择看看是自己学还是去参加培训。比如说学嵌入式开发,那有可能你去参加一个培训可能会更好一些,因为培训班有更多的设备,有实际的、练手的项目。但不管是那种,你都要有积极主动的学习态度和过程。你能够有自己解决问题的习惯。这样你整个的过程才能更顺一些。因为我对你的情况也不够了解,你可以对照我的描述,看看有没有有能用上的。一般来说,类库的编写是高手程序员的日常积累(对大量过去的业务的抽象),还是类似于开发应用一样是有一个开发目标的? 对于内库的编写分两种情况,1. 我们自己抽象出来的类库。我们自己在开发过程当中的积累、一些技术或者说是有一些方法有一些函数、还有一些类,你发现他有通用的这样的可能。能够在很多的项目当中都应用到,你们的抽象出来成为了类库。2. 专门的公司开发的。一些公司是专门做中间件或者说是做SDK的,比如说环信,网易云信。再比如说像Ping+ +做支付的,其实他们的目的就是做一些中间件,做一些类库方便别人的开发。那他们也是有目标的,然后针对这个目标专门去做开发。在大学期间如何入门算法?在开发项目的过程中用到的算法很复杂吗?比如...开发游戏?干啃算法书数学论证累觉不爱。其实在开发的过程当中的要根据你开发的类型做选择。比如说应用类开发中移动端app UI的开发,可能用到的算法比较少。如果你做游戏又分两种情况,是做游戏引擎,还是基于一个游戏引擎去做开发。如果你做游戏引擎,物理引擎或者特效引擎,对算法的要求就比较高。若你基于一个游戏的引擎比如Cocos2d,那你也其实不需要对算法有太多了解。注意根据你开发类型的不同,对算法的需求也不同。大学期间你像学算法,可以先找一些书看看:算法导论、或其他的大学推荐书目。另外,你最好结合实际的项目去运用,比如说图像处理的算法,你去做锐化模糊,你可以先去做一些小项目出来,通过实践去学习。认真学习完一门语言后,是应该去试着做些实践应用,还是应该去寻找些相关书籍领略? 学习一门语言后,要去做一些实践的应用。比如你把书后的习题都在iDE上去运用,再比如你做一些小应用,小事例,这些事例可以交叉用到几个知识点。不断的丰富,让你的事例变得更复杂,覆盖更多的知识点。这是你学了语法后最终要义。你真正的动手实践后,才能够领会学习的那门语言。想从事AI,请问最好学习什么语言呢,谢谢老师。AI的话有很多语言都可以支持,比如说有一些AI方面开发的库,你可以用Java语言、Python等。我觉得首先你要先去看自己想做AI的哪方面。因为不同的AI的类库、AI的算法,它其实会用到不同的语言来实现。请问老师,如何学习敏捷习惯? 你可先先去看scrum、XP这些开发模型中有哪些方面是方便你迁移到工作当中去。对我而言,scrum中的每日站会、计划启动会议,这些都是可以迁移到工作当中去。
本文系「 StuQ 公开课 」004期《程序员的精进:如何成为高手》直播分享内容文字版整理而成,所涉内容最终解释权归讲师安晓辉所有,禁止私人转载。
点击下方图片即可阅读
听一线专家聊数据挖掘在实际领域中的那些事
直播预告 「 StuQ 公开课 」联合知乎 Live ,为程序员策划的围绕热点技术、实战案例、职场软技能培养、职业成长规划等涵盖多技术领域技术内容的主题 Live。2 月 10 日晚八点,国家生涯规划师、中国职业规划师(CCDM)安晓辉(foruok)将为你带来「 程序员的精进:方向选择与转型 」。Live 将围绕程序员职业发展过程中最重要的事情——方向选择与转型一一展开,涵盖技术通道与大龄程序员的优势、走向技术管理,转型的分类、转型常见问题与应对策略、如何判断自己是否需要跳槽、怎样找到自己的合作等方面。戳「 阅读原文 」,了解更多公开课。
觉得不错,分享给更多人看到
StuQ 微信二维码
分享这篇文章
2月6日 18:59
StuQ 最新文章

我要回帖

更多关于 全职高手第二季制作组 的文章

 

随机推荐