zoukankan      html  css  js  c++  java
  • 基础知识漫谈(1): 想到哪儿写到哪儿

     

    一、想到哪儿写到哪儿

    给公司新员工培训,和网上的新手做交流,我最先强调的都是基础。

    基础有什么用?

    1、节省沟通成本

    有天,java群里来了个新人,上来就提了一个问题:

    “我代码跑不起来,怎么办?”

    这一看就是还没入门,没办法提供具体的信息。

    于是有个有耐心的老鸟出来了,开始了一连串提问:异常栈看一下?有编译期异常吗?贴出你的main函数看看?

    新人收到了问题并且抛出了你都在说什么异常。

    “你还是截图吧。”老鸟说。

    这里涉及到了异常栈,编译期,main函数等等再基础不过的知识,有那么部分毫不客气的新人就说了,为什么你不讲得通俗易懂点儿呢?

    通俗易懂,是需要成本的。

    异常即是程序不期望的异常情况,它处理不了交给程序员自己来处理了。是个再基础不过的数据结构,出现它就说明栈顶的元素,是最后入栈的。那么,看到你出错后控制台抛出的那堆文字没有?贴出来,距离XXXException最近的通常就是最关键的信息。

    你看,就算精简为“控制台抛出的那堆文字”,比较起来,是不是“异常栈”更加节约双方的时间,毕竟以当前IT业界的薪资水准,老鸟可能已经浪费了公司好几十块。

    更何况,可能有人是连“控制台”都无法理解的,这就涉及到了作用2。

     

    2、方便他人界定你的水准

    我见过一份简历,quartz、POI、easyUI、jquery等等,写了一堆。这人自己可能觉着,这些名词高端,厉害,可是呢,看看这份技能表:

     

     

    就暴露出了他的问题,此人并不懂他所说的这些名词是什么。

    至少,一个有基础的程序员就不会写上熟悉xml、json、dom4j技术,也不会把“在线支付”和servletjsp放在同一栏下面。他无需长篇累述自己的技能树多么丰满,合适的内容,合理的排版,本身就代表了他的水准。

     

    3、解决未知的问题

    “有没有例子可以参考?”

    “有没有视频教程可以看?”

    “能不能帮我远程一下?”

    一般来说,挨了这三连怼的老鸟无不火从心起,但凡有例外,要么脾气太好要么姑娘太好看。

    合适的解决方案:搜索关键字->查看文档->阅读源码->询问老鸟关键字->*。

    从来没到过的问题如何解决呢?或者扩展一下,我写的功能,如何适应未来千奇百怪的需求呢?当然,这其实本质还是个码量和阅读量的问题,篇幅和精力都不足够支撑我讲好这个问题,但凡我说好了,那等同我也写完了一本《Effective Java》。

    我把学习分为几个阶段:

    基础理解阶段,你看到一个基础知识点,开始理解它的含义,看到具体的实例能反应出它所对应的基础知识。比如看到Animal cat=new Cat()能反应出它体现了如下知识点:声明、实例化、引用、多态。

    串联阶段,把知识点串联起来,构建出它本源的样子,比如上面的例子,结合JVM相关知识,脑海里出现一张粗略的堆栈图,就像这幅图:

     

     

     

    这样的能力不光可以用于向本源推测,也可以主动的把知识点组合,玩味出新的结构,比如,新需求是“根据配置来产生动物”。

    那么,我们分析会有一个根据配置项来产生动物实例的构建工具。代码可能长下面的样子:

    Animal animal=AnimalFactory.createAnimal(“猫”);

    在createAnimal里,我们对字符串进行if判断,决定到底是new Cat还是new Dog

    事实上,这样的结构已经有人总结在了GoF里。诶,GoF是什么?忘了本段是说什么的吗?

    进阶阶段,具备串联知识点的能力之后,就应当有看到未知技术逆推具体实现的能力。比如hibernate,它的功能是什么?核心在于“实现持久层和数据层的同步”,也就是说,数据表和JavaBeanPOJO的映射。那么,我们来思考,假如从来不存在hibernate类似的ORM框架,要如何实现这个功能呢?

    首先,我们要有和数据库沟通的工具和配置,java可以选用jdbc,数据库相关配置可以使用xml、json、bean任意方式。我们也可以看到,hibernate底层就是jdbc,也有Configuration这个配置入口。

    然后要有种配置方式让数据表和Bean达成统一。为什么?因为它们的信息量不一致,包含的信息是相交的关系,比如,它们都有类似的数据类型(varchar->String),又有互不相融的内容(索引和约束),得出结论,我们需要一个映射工具,来使相交的部分匹配,并且补充缺失的内容。于是,我们可以推论出,hibernate一定有个映射工具(xml和annotation)。

    再后,为了适应多种不同的数据库,每一条语句可能都有不同的表达,比如Oracle有Number(*,*)这个类型,对于mysql就不适用,我们需要设计一个数据库的适配器。在hibernate里,这个部分叫做方言,Dialect。

    经过这样的分析过程,不管是实现新的需求,还是分析未知的框架,都具备了理论上的基础。

    就我个人的见解,达到这个阶段的程序员,才能称之为合格。

     

    小结

    道理说多了,来尝尝鸡汤。

    没有人有义务帮助你。

    乐于助人的老鸟只会帮助有价值的新手,不求反哺,至少要有成就感,是吧?

    本就该在大学搞定的内容,为什么要别人花费自己的青春和公司的人工来为你补习?

    基础是看上去艰涩玄乎,却是能应用在工作里的东西,切勿忽视。我有个高中老师常把一句话挂在嘴边“现在你记住就好,以后你会懂。”有时候我想,要是那时候听了这话,该多好。

     

  • 相关阅读:
    83. Remove Duplicates from Sorted List
    35. Search Insert Position
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    111. Minimum Depth of Binary Tree
    169. Majority Element
    171. Excel Sheet Column Number
    190. Reverse Bits
  • 原文地址:https://www.cnblogs.com/anrainie/p/5606570.html
Copyright © 2011-2022 走看看