一,心得体会

第一是 “兴趣”。这也是我认为最重要的一点,一件事情做10年甚至做一辈子,如果没有兴趣的话,我觉得是很痛苦的。兴趣是本能的驱动力,有了兴趣,遇到问题会一直想着怎样去解决,而不是觉得“很难做”;有了兴趣,碰到一个新的东东会觉得很兴奋,而不会觉得是一种负担;有了兴趣,接触到一个东西后就像更加深入的去了解,而不是用过了就不管了。所以我认为如果想在一个行业(不限于软件行业)长期发展并有所提升的话,一定要问问自己是否有足够的兴趣。

我当时之所以换工作,也是因为我对当时的工作内容不感兴趣,因为我更喜欢亲手做出一个产品,而不是找一群人开会讨论然后写个文档就完事了。

第二是“坚持”。《异类》一书中提到一个10000小时理论,我觉得非常有道理,意思就是说如果你想成为顶尖人才的话,一定要积累10000小时以上的训练和经验。特别是在软件开发这个领域,技术又多,技术更新又快,如果没有坚持去积累和提升的话,是很难达到一定高度的。操作系统、数据库、网络、编程语言、设计方法等都要掌握,每个技术点又有很多更细的分类。以编程语言来说,C、C++、Java、PHP、Python等主流的都有10来种,每个语言继续深入的话又有很多内容,例如Java可以列出来的有JVM、IO、NIO、网络编程、反射。。。。。。等等。所以这么多的东东,短时间内快速入门还可以,但如果说21天就精通XXX,那是不可能的,必须经过长时间的积累。其实我现在都不敢说我精通什么,只能说相对周围其他人会精通一些。

第三就是“方法”。掌握正确的方法,能够让我们事半功倍,更快的提升,一些常见的方法我就不啰嗦了,这里特别分享独家秘方:

一个秘方是“写博客”,注意这里不是“看博客”,也不是“转载博客”而是“亲自写博客”。哪样东西你觉得你比较懂了,那么你就写成博客。当你真正去写的时候,你会发现,其实还有很多不懂或者不清楚的地方,这样就会促使你又去学习研究;当你的博客发表后,其他人除了能够从你的博客中学到东西外,也能够帮你发现一些问题或者错误,这样你就更进一步的掌握了;

另外一个秘方就是“链式学习”。形象点说,就是你抓住了一个链条的一个链,然后慢慢慢慢把所有的链都拉出来。举一个很简单的例子:socket sever编程。很多人在编程的时候,都是去搜索引擎搜索一下“socket server样例”,然后对照样例很快就写完功能了。然后呢。。。。。。很多人没有然后了,完成任务就不管了。其实这样做就错过了一次提升自己的好机会。

“链式学习”则不一样,它是这样做的:我通过搜索引擎搜索到样例完成工作后,我会问自己很多问题:样例中的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等

第三个秘方就是“闭环学习”。“链式学习”适合于一组相关联的知识或者技能的学习,而“闭环学习”更适合业务、相互配合的知识和技能的学习。由于软件开发是需要多个团队分工合作的,所以绝大部分人都只负责整个系统或者全流程中的一环,这样导致很多人以为只需要将自己负责部分精通就可以了。其实这样不利于个人的发展,一个原因是自己负责的一般都比较窄,可学习和提升的空间可能不多,另外一个原因是很难设计整体上优秀的方案。

而“闭环学习”则不一样,它是这样做的:了解整个功能或者业务的全流程实现,涉及了哪些模块和系统,每个模块和系统主要负责什么功能,涉及到什么技术,性能怎样,有什么注意点。举一个我做个的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)

其次是“良好的理解能力”。程序员需要将产品人员或者用户用自然语言表述的需求翻译成程序语言。自然语言有一个特点就是通俗但不严谨,而程序语言必须是非常严谨的。如果对产品人员或者用户提出的需求没有很好的理解,即使程序语言写的再漂亮,技巧再高,最后做出来也是一个不符合要求的产品。

记得有一个关于“美女”的笑话:人听到“美女”后的反应是想到“天使面孔魔鬼身材童颜巨乳”,而猪听到“美女”后的反应是“乌克兰大白猪”,猫听到“美女”后的反应是“有着金色光滑皮毛的波斯猫”。如果程序员给了猫一个“天使面孔魔鬼身材童颜巨乳”的美女,猫一定会觉得很难看。

第三是“持续不断的学习”。 软件开发领域设计的知识和技能太多了。从广度上来说,有操作系统、数据库、编程语言、网络、设计等,编程语言又有几十种;从深度上来说,操作系统、数据库、编程语言等都是可以不断深入去学习的。无论你是从事对技能广度要求更高的业务开发,还是从事对技能深度要求更高开发专项系统,都需要不断的学习,这样才能不断的提升自己的能力。

第四是“乐于分享”。如果单纯从个人完成工作的能力来看,可能确实也有很多程序员不爱分享但确实很厉害。但我认为真正优秀的程序员一定是除了自己优秀外,还能让其他人也变得优秀,或者能够贡献优秀的开源项目以降低别人的重复工作。分享的途径有很多种,可以给公司人员做培训,可以写博客,可以贡献开源项目等。

四,面向对象和编程语言

1,对于初学者,你觉得他们怎样才能知道有没有掌握面向对象编程的思想? 

掌握面向对象编程的技能是很容易的,会用Java写个类,写个继承,写个接口,基本上就可以说自己掌握了面向对象编程的技能,如果再加上设计模式和设计原则,基本上就可以说熟练掌握了面向对象编程。

但如果说真正掌握了面向对象编程的思想,我觉得一定是要看是否用面向对象的方式去分析和理解问题。举个很简单的例子:很多人都是用面向过程的方法去分析和理解问题,然后在实现的时候觉得这里可以封装为一个类,那里可以用一个接口,有的地方可以用继承,有的地方可以用抽象类等,这样其实就是用面向对象实现了面向过程。

2,面向对象编程的重要性和适用范围在哪?以及面向对象编程的弊端是什么?

面向对象思想作为应对软件复杂性日益攀升的解决之道提出来的,其重要性在于通过封装的方式将复杂性隔离开来。但面向对象不是“银弹”,不是所有场景都适合应用的,我觉得面向对象特别适合于“容易发生变化”的业务系统开发,例如互联网相关业务、游戏开发、ERP等行业,不太适合底层系统如操作系统、驱动、数据库等开发。

面向对象编程本身我觉得并不存在固有的弊端。比如说有的人认为面向对象增加了类关系设计开销,但这个开销和隔离复杂度带来的收益相比基本可以忽略不计,加上设计模式和设计原则的成熟,设计良好的面向对象方案并不会带来多大的开销;有的人说面向对象带来了更多的复杂性,但这个复杂性主要是语言本身的复杂性,一旦熟练掌握后就不会成为障碍,而且我觉得面向对象更加符合人类的思维特点,是一种“人的思维”,一旦转换后,人其实更加适应面向对象的思维。

3, 面向对象的开发技术流程应该是如何的?与面向过程的开发过程有什么不同?

1. 需求模型

通过和客户沟通,结合行业经验和知识,明确要求客户的需求。

在这个阶段中, 面向对象和面向过程的开发方式没有差异,如果有人认为分析方法不一样,那是因为没有明白需求分析具体的目标是什么,

需求分析的目标就是要准确把握客户需求,和具体的实现技术、开发流程都没有关系。

2. 领域模型

基于需求模型,提炼出领域相关的概念,为后面的面向对象设计打下基础。 面向过程的开发流程中对应的阶段是“功能提取”。

在这个阶段,面向对象和面向过程的开发过程差异就很明显了,面向对象的流程主要任务是从需求模型中提炼“领域类”,而面向过程的开发要求的是从需求模型中提炼“功能的处理过程”。

3. 设计模型

以领域模型为基础,综合面向对象的各种设计技巧,完成类的设计。 面向过程的开发流程对应的阶段是“功能分解”

在这个阶段,面向对象的开发过程要求完成从“领域类”演进到“软件类”,并逐步细化求精,完成最终的软件类设计,而面向过程的开发此时需要做的是将全流程的功能分解为子功能,并细化子功能的具体步骤。

4. 实现模型

以设计模型为基础,将设计模型翻译为具体的语言实现,完成编码。

在这个阶段,面向对象开发和面向过程开发都是使用具体的编程语言来实现各自的设计,流程上没有什么差别,但使用不同的语言来开发的话,效率上是有一定的差别的,

总体来说,面向对象编程语言在语言层面上效率要比面向过程的开发语言效率要高一些。但编程的效率是受很多因素影响的,单纯的语言因素对总体的效率影响并不明显。

总结一下,面向对象的开发流程其实是以“类”来串联整个开发流程,而面向过程的开发流程是以“功能”来串联整个开发流程

4, 从面向过程到面向对象,从设计原则到设计模式,请问常用的设计模式和原则有哪些?

毫无疑问,设计模式就是GoF提出的23个设计模式,其它模式基本都是这些模式的变体或者组合;设计原则就是SOLID原则。 设计模式和设计原则在我的博客专栏《面向对象葵花宝典》都有深入和别出心裁的阐述,大家可以参考。(编者注:李老师在专栏中针对设计模式和原则进行了全面深入的阐述,由于内容较多,这里不再引用,还请移步专栏阅读。)

5, 面试官问应聘者如何理解面向对象,你认为应聘者该怎么说?

首先要了解面向对象出现的历史背景,然后要了解面向对象和面向过程的对比,面向对象的优点缺点等,最后才是面向对象的这些概念、原则、方法。如果谈到面向对象就只知道“抽象、类……”等这些概念,是知其然不知其所以然,在实际中也很难更好的应用面向对象。

这部分内容可以参考我的博客专栏《面向对象葵花宝典》。

李运华老师的一些经典见解收藏相关推荐

  1. 2009 11月21日李兴华老师JAVA学习技术讲座

    为推动JAVA发展,让广大JAVA爱好者了解掌握JAVA/J2EE体系并确立学习方向,在周六特别为大家准备<JAVA开发者之路>技术讲座. 主讲介绍: 李兴华:MLDN魔乐科技 -- JA ...

  2. 李兴华html css,2014MLDN(李兴华老师视频教程)

    资源内容: 2014MLDN(李兴华老师视频教程)|____开发工具          |____ideaIU-15.0.3.exe          |____ideaIU-15.0.2.exe   ...

  3. 阿里P9李运华:架构到底是指什么?

    你好,我是李运华. 2018 年,我发布了<从 0 开始学架构>这门课程,分享了我之前在电信业务和移动互联网业务方面的经验和感悟. 后来,我转岗去了蚂蚁国际,从事更加复杂的支付业务.为什么 ...

  4. java web开发实战经典 源码_李兴华 java_web开发实战经典 源码 完整版收集共享

    李兴华 java_web开发实战经典 源码 完整版收集共享 01f8a7  在  2018-11-07 20:41:33  上传  10.92 MB 第1章 JAVA WEB开发简介 1.1.WEB发 ...

  5. 李兴华java视频在线观看_李兴华Java开发实战经典视频教程_IT教程网

    资源名称:李兴华Java开发实战经典视频教程 资源目录: [IT教程网]010201_[第2章:简单Java程序]_简单Java程序 [IT教程网]010301_[第3章:Java基础程序设计]_Ja ...

  6. 李兴华java实战经典视频_李兴华Java开发实战经典视频教程

    资源名称:李兴华Java开发实战经典视频教程 资源目录:[一品资源网]010201_[第2章:简单Java程序]_简单Java程序[一品资源网]010301_[第3章:Java基础程序设计]_Java ...

  7. 转 李兴华老师的一篇博客

    今天一直在写<Oracle开发实战经典>一书,在写累的时候发现了朋友发送的一篇文章,觉得写的挺对的,就发给大家来看一看,毕竟,这个社会上的人是浮躁的,大多数人看重的只有金钱,只有享受,而缺 ...

  8. 魔乐科技李兴华老师Oracle笔记阅读摘要

    使用户登录密码失效 使用户scott当前登录密码失效,注需要DBA用户操作 SQL>ALTER USER scott PASSWORD EXPIRE; 说明:上述语句操作后,scott用户重新登 ...

  9. 李兴华java开发实战经典---新IO

    1.Buffered缓冲技术基本概述 position,limit,capacity三个变量完成了缓冲区的操作代码 position:表示下一个缓冲区读取或写入的操作指针,每向缓冲区中写入数据的时候此 ...

  10. 李兴华java开发实战经典-枚举

    1.枚举的作用 class Color{private String name;public static final Color RED=new Color("红色");publ ...

最新文章

  1. 项目管理:多项目同时进行如何做好进度管理?
  2. javac 编译与 JIT 编译
  3. scp有证书的传输,压缩,解压
  4. 数据库主键自增插入显示值
  5. HTML中文编辑器 v1.31
  6. pythonsplit函数_Python split()函数如何工作
  7. 主动风险管理:警报如洪水怎么破?
  8. 201671030116 宋菲菲 实验十四 团队项目评审课程学习总结
  9. Arturia V Collection 8 for mac - Arturia系列合成器插件大合集
  10. OpenCL编程基本流程及完整示例
  11. 拓端tecdat|R语言k-means聚类、层次聚类、主成分(PCA)降维及可视化分析鸢尾花iris数据集
  12. Eclipse安装Lombok
  13. Go 通道 Chan 详解
  14. spyder python调试_Spyder如何调试
  15. 分别使用while、do-while和for循环输出1-1000中含有7或者7倍数的整数之和及个数-详解
  16. 任正非:为什么华为选择与西工大合作,而没选清华北大
  17. 改变Dev-C++生成的exe文件图标
  18. 【iOS】—— RunLoop详解
  19. oracle asm磁盘标签丢失导致整个集群和数据库启动失败
  20. 川崎机器人总线通信_川崎机器人:PLC有那些功能?能实现机器人哪些通讯?

热门文章

  1. 如何分辨usb压枪芯片是无后座压枪还是键鼠模拟压枪
  2. MAC终端命令自动补全
  3. BeX5使用疑难总结
  4. iPhone手机屏幕突然变暗该怎么办?
  5. 汉王人脸通正式亮相 让十三亿张脸生动起来
  6. VSCode下载安装教程(Windows 10)
  7. 互联网协议入门(网络分层)
  8. 学习阮一峰老师-互联网协议笔记(IP/UDP/TCP/HTTP)
  9. java 后台接受json参数的几种方式_java后台发送及接收json数据
  10. 手机浏览器哪个好用,UC、多御和QQ浏览器对比