回顾个人提高之路,我以为有几点能够跟你们分享的:前端
第一是「兴趣」。这也是我认为最重要的一点,一件事情作 10 年甚至作一生,若是没有兴趣的话,我以为是很痛苦的。兴趣是本能的驱动力,有了兴趣,遇到问题会一直想着怎样去解决,而不是以为「很难作」;有了兴趣,碰到一个新的东东会以为很兴奋,而不会以为是一种负担;有了兴趣,接触到一个东西后就像更加深刻的去了解,而不是用过了就无论了。因此我认为若是想在一个行业(不限于软件行业)长期发展并有所提高的话,必定要问问本身是否有足够的兴趣。程序员
第二是「坚持」。《异类》一书中提到一个 10000 小时理论,我以为很是有道理,意思就是说若是你想成为顶尖人才的话,必定要积累 10000 小时以上的训练和经验。特别是在软件开发这个领域,技术又多,技术更新又快,若是没有坚持去积累和提高的话,是很难达到必定高度的。操做系统、数据库、网络、编程语言、设计方法等都要掌握,每一个技术点又有不少更细的分类。以编程语言来讲,C、C++、Java、PHP、Python 等主流的都有 10 来种,每一个语言继续深刻的话又有不少内容,例如 Java 能够列出来的有 JVM、IO、NIO、网络编程、反射。。。。。。等等。因此这么多的东东,短期内快速入门还能够,但若是说 21 天就精通 XXX,那是不可能的,必须通过长时间的积累。其实我如今都不敢说我精通什么,只能说相对周围其余人会精通一些。面试
第三就是「方法」。掌握正确的方法,可以让咱们事半功倍,更快的提高,一些常见的方法我就不啰嗦了,这里特别分享独家秘方:数据库
一个秘方是“写博客”,注意这里不是“看博客”,也不是“转载博客”而是“亲自写博客”。哪样东西你以为你比较懂了,那么你就写成博客。当你真正去写的时候,你会发现,其实还有不少不懂或者不清楚的地方,这样就会促使你又去学习研究;当你的博客发表后,其余人除了可以从你的博客中学到东西外,也可以帮你发现一些问题或者错误,这样你就更进一步的掌握了;编程
另一个秘方就是“链式学习”。形象点说,就是你抓住了一个链条的一个链,而后慢慢慢慢把全部的链都拉出来。举一个很简单的例子:socket sever编程。不少人在编程的时候,都是去搜索引擎搜索一下“socket server样例”,而后对照样例很快就写完功能了。而后呢。。。。。。不少人没有而后了,完成任务就无论了。其实这样作就错过了一次提高本身的好机会。api
“链式学习”则不同,它是这样作的:我经过搜索引擎搜索到样例完成工做后,我会问本身不少问题:样例中的api每一个参数都是什么含义,有哪些注意事项,还有其它API么?为了解决这些问题,我就可能去找本书看,某个编程语言的socket编程;看完之后我知道socket编程的全貌和一些注意事项,而这些是经过搜索引擎搜索的样例中没有的;知道socket编程的全貌后,我又会问本身:操做系统是怎么作的呢? 那我又会去看《UNIX网络编程》,看完后我就对操做系统层面的又掌握更多了;看完《UNIX网络编程》后,我又知道socket是和tcp/ip相关的,那我又会去看《TCP/IP协议详解》。。。。。。浏览器
这样去作就是一条学习链: socket server编程 -> socket 编程 -> UNIX网络编程 -> TCP/IP协议,后面还能够继续不断拓展下去。如此不断的拓展和深刻,一个很小的契机就能初始你学到不少东西,而这些东西在之后的工做中某些时刻就派上用场了。微信
我以前在华为是在Windosw平台上用MFC开发,后来到了UC转为Linux平台开发,用这种方法,大约用了2年就熟练掌握了Linux平台相关的开发技术,包括Linux、MySQL、C++、Java、PHP等网络
第三个秘方就是“闭环学习”。“链式学习”适合于一组相关联的知识或者技能的学习,而“闭环学习”更适合业务、相互配合的知识和技能的学习。因为软件开发是须要多个团队分工合做的,因此绝大部分人都只负责整个系统或者全流程中的一环,这样致使不少人觉得只须要将本身负责部分精通就能够了。其实这样不利于我的的发展,一个缘由是本身负责的通常都比较窄,可学习和提高的空间可能很少,另一个缘由是很难设计总体上优秀的方案。app
而“闭环学习”则不同,它是这样作的:了解整个功能或者业务的全流程实现,涉及了哪些模块和系统,每一个模块和系统主要负责什么功能,涉及到什么技术,性能怎样,有什么注意点。举一个我作个的HTTP的业务样例:从用户点击一个url开始,通过了 浏览器 -> 网络 -> CDN -> Nginx -> PHP -> MySQL -> PHP -> Nginx -> 网络 -> 浏览器,最后呈如今用户面前。我开发的时候只是用PHP开发,但并不仅局限于PHP自己,闭环学习就要求全流程中的每一个环节都要去了解和熟悉,这样你就能够学到了“浏览器、Nginx、CDN、MySQL”等不少知识。
有的朋友可能会问:这样作有什么用呢?其实用处很是大,一个是当出现问题的时候,有了闭环学习掌握的知识和技能,你就知道哪些地方可能有问题,应该如何处理;另一个用处是,当你考虑设计方案的时候,就不局限于PHP自己了,也许某个功能Nginx或者CDN或者前端能作的更好,用PHP实现反而很蹩脚。
一个优秀的程序员应该具有哪些技能和修养?
首先是“快速学习能力”。这里不是说必定要去快速去学习各类各样的新技术,而是说当有须要时,可以快速的学习。不少人开始学新的技术和技能时,一开始就一头扎进去写样例、写Demo、看源码,我认为这不是好的方法,并且比较耗费时间,收效也不明显。
我给你们分享个人4W2H快速学习方法。我在学习新的技术的时候,都是按照这样的步骤去了解的:
1)这个技术能解决什么问题(why)
2)比较适合在哪些场景应用(where + when)
3)这个技术跟我已经掌握的哪一个知识或技能相似,有什么差异、有什么特色、 有什么优势和缺点(what)
4)了解前面的问题后,我才会开始去尝试写写Demo,或者更进一步去应用(How to use)
5)以为有兴趣或者其实现很牛逼的状况下,我就去研究一下原理机制,看看源码等 (How it implements)
其次是“良好的理解能力”。程序员须要将产品人员或者用户用天然语言表述的需求翻译成程序语言。天然语言有一个特色就是通俗但不严谨,而程序语言必须是很是严谨的。若是对产品人员或者用户提出的需求没有很好的理解,即便程序语言写的再漂亮,技巧再高,最后作出来也是一个不符合要求的产品。
记得有一个关于“美女”的笑话:人听到“美女”后的反应是想到“天使面孔魔鬼身材童颜巨乳”,而猪听到“美女”后的反应是“乌克兰大白猪”,猫听到“美女”后的反应是“有着金色光滑皮毛的波斯猫”。若是程序员给了猫一个“天使面孔魔鬼身材童颜巨乳”的美女,猫必定会以为很难看。
第三是“持续不断的学习”。软件开发领域设计的知识和技能太多了。从广度上来讲,有操做系统、数据库、编程语言、网络、设计等,编程语言又有几十种;从深度上来讲,操做系统、数据库、编程语言等都是能够不断深刻去学习的。不管你是从事对技能广度要求更高的业务开发,仍是从事对技能深度要求更高开发专项系统,都须要不断的学习,这样才能不断的提高本身的能力。
第四是“乐于分享”。若是单纯从我的完成工做的能力来看,可能确实也有不少程序员不爱分享但确实很厉害。但我认为真正优秀的程序员必定是除了本身优秀外,还能让其余人也变得优秀,或者可以贡献优秀的开源项目以下降别人的重复工做。分享的途径有不少种,能够给公司人员作培训,能够写博客,能够贡献开源项目等。
程序员如何“挤”出时间来提高本身或在技术上提高本身?
给年轻程序员的几条建议:
打造你的工具箱。工欲善其事,必先利其器。每一个开发者都应该有一把本身的瑞士军刀,在未来漫长的职业生涯中,这些工具能够为你省下宝贵的时间,并帮助你更好的组织我的知识库。举两个例子
一套高效的开发环境
一个信息采集器和一本笔记本
高效的开发环境。咱们能够从编缉器谈起,这里有 IDE vs Text Editor,有 Vim vs Emacs,有 Sublime vs Atom,那该如何选择呢?在作选择以前,咱们先想一想本身的目标。咱们但愿这是一个长期的投资,这款编缉器能被长期使用,在这个过程不断的打磨,使其能完 全适合本身的习惯,最大化编缉效率。若是程序员是侠客,编缉器则是他手中的剑。
信息采集器和笔记本。前者是用来收集别人产生的信息,后者则是收集本身产生的信息。前者一个简单的例子就是浏览器的 Bookmark。你须要能随时将一组有用的信息归档,并在将来的某个时刻快速找到它。后者最直观的例子则是 Mac OS 或是 iOS 自带的笔记本,这里的目的是能随时随地记录你本身的想法。从本质上讲,就是你须要有一套好用的工具来作你的知识库管理(Knowledge management),也能够说是你知识和思想的外部备份。我我的如今是用 Evernote 同时来作信息采集与笔记的。若是有一个好的流程,你也彻底能够用两个工具来分别把这两件事作好。但我建议你花足够多的时间来思考如何组织你的我的知识库。
以上只是两个典型的例子,你须要作的是发现那些你要长期从事的任务(每每不随技术而改变,也不随公司而改变),将完成这些任务所需的工具调整至 最优。再举一个例子,我会留意身边的程序员所用的键盘。只有少部分的程序员会买高端的静电容键盘,好比 HHKB。而在我看来,这明显是一笔很划得来的投资,程序员在工做的大部分时间里都须要和键盘打交道,一个温馨的打字体验是很是有收益的,更况且这类高品 质的键盘都很是的耐用。
开阔你的视野,构建你的技术体系
首先你要给本身设定一个目标,就如同一个公司会设定它的 Vision。
目标要够大,这样你才能看到更多的风景。
目标应该设定在解决哪一类问题,而不是精通哪一类技术。技术只是手段,不是目的。
例如,「我要成为 iOS developer 中的达人」这个目标,就远不如「我要成为前端应用开发的专家」来得有意义。前者学到深处你可能会去钻研 iOS framework 里各类奇技淫巧,然后者你会开始关注视觉与交互设计,研究各平台间的差别与共同趋势。显然,后者更有助于你的我的发展。
最后我建议每一个程序员都应该经营一款本身的产品,它能够是一款 app,一个网站或是一个开源软件。除非你是一个创业公司的早期员工,否则你可能没有机会将全部学到的技术或是理念都付之实践,有不少人想成为全栈工程 师,最快的捷径就是打造一款本身的产品。任何一个设计师都会精心打造本身的 Portfolio,但大部分程序员却不会。当评估一个程序员的 Coding 能力时,我会去看他的 Github 上是否有出彩的项目,惋惜国内绝大部分程序员的 Github 空空如也,或者只有一些很是简单的程序。我建议你们好好经营本身 Github 上项目,这不但能够提升你的声誉,对你未来的求职也很是有帮助。当你报怨求职面试时又被问到各类无厘头的程序题时,有没有想过面试官也很无奈,由于他没有 任何其余方法得知你的 Coding 能力究竟如何。若是每个程序员都有本身的做品,我想程序员的面试会简单许多。
重视沟通能力的培养
当被问到「你学得 Junior Developer 和 Senior Developer 最大的差异是什么」时,我最天然的反应是沟通与文档。沟通包括程序员团队内部的沟通,与其余团队的沟通,与 Manager 的沟通等等。我不认为本身有能力把这些问题很是归纳地说清楚,不过我能够给一条建议,那就是先学会和你的 Manager 沟通,让他来教你其他的部分。许多公司都会设置 Manager 与组员的 1:1,一个有效率的 1:1 应该大部分时间有组员来主导。这须要你在 1:1 以前花足够多的时间来考虑要问的问题,而且最好提早 1 天发给 Manager,让他有机会思考答案。许多人对此不过重视,或者只问很是具体的问题而不是一些开放性问题,这样你很难在你的 Manager 身上学到东西。若是你渐渐懂得如何利用 1:1 的时间,它很会成为你在工做中单位时间投资回报率最高的活动。
累积你的人脉
每一个人都明白人脉的重要性,但实际作起来却不容易。参加一些线下的会议或是活动,多是最直接的扩展人脉的方式之一。惋惜大部分人彷佛只是去听 了一场技术讲座就回家了。固然,这和很多活动的时间安排也有关系,讲座时间排得太满,茶歇时间短,加上有时嘉宾迟到或是没控制好时间,干脆就把茶歇取消 了。而实际上,结识一两个同道中人远比听技术讲座有价值。下次去参加这类会议,不妨给你本身设个目标,好比至少加两个同行的微信。以后维系你的人脉可能需 要花更多的时间,下了班或是周末找你的朋友们喝个咖啡吧!
另外我以为每一个人都须要一个职场导师,他能够是你第一份工做的导师或是 Manager,也能够是你认识的其余前辈。大家须要维系一个很是长期的关系,不止于一家公司,最好贯穿你的整个职业生涯。每当你遇到疑惑时,均可以询求 他的建议,我以为这将是你最宝贵的一笔人脉财富。
寻找发挥你才华的平台
最后也是最重要的一步,找到适合你的公司。作为求职者评估一家公司能够看三个方面
公司的发展前景(大公司的话,看所在部门的发展前景)
你将要加入的团队
薪资福利
因此在面试一家公司的时候,你要意识到面试是双向的,公司在面试你的同时,你也在面试这家公司。面试前你应该对这家公司作足功课,准备好一些有质量的问题,好比指出产品中的问题,询问开发流程或是如何作绩效评估。到时你也能够检验一下你的面试官是否合格。
每次选择公司对以上三个方面都应兼顾,但在职业生涯的不一样阶段,侧重点不一样。好比,在刚刚工做时,加入一个优秀的团队最为重要,他们能够教会你 不少东西,提高你的能力。工做 5 年以后,你须要一个平台施展你的才华,体现我的价值,公司发展前景的重要性迅速提高。当你作出一番成绩,证实了本身的价值以后,逐渐进入收获期,就有了与 公司要价的资格。另外一方面,团队实力对公司的前景也有很大的影响。
对一个刚毕业,初入职场的同窗,一个近几年被问了无数次的问题「个人第一份工做是去创业公司仍是大公司?」个人回答仍旧是「加入一个优秀的团队 最为重要」。
一些知名的大公司,团队的素质是有必定保证,但创业公司则否则,团队素质良莠不齐,因此如我前面所说你须要面试这个团队,作出本身的判断。不过除了团队因素以外,我想提一下毕业生去创业公司的几个好处。首先,在刚毕业的一段时间内,经济压力小,是最自由最能承受风险的时期,而这段时间每每不长,因此应把握好这个去创业公司的黄金时段。其次,全部的学生进入大公司后,都会担任初级职位,某种程度上来说是学校学习的延续,规范有条理,但缺少独立 性和创新性,而这正是中国大部分学生所欠缺的。这方面的能力在一家创业公司能够获得快速锻炼,而在大公司可能要等升到中级职位后才有这方面的机会。我的观点,仅供参考。
步入职场的前 3 年对从此的发展尤为重要,但愿此文能对年轻的程序员们有所帮助。