作为一名软件开发者,要追求的,应该是不断地提升自己分析问题把握事物关键点,实事求是地给出切实可行且能“一剑封喉”的优雅解决方案的能力,再提升一点境界,就是要不断提升自己创新的能力(即创造新东西、提出新思路、解决新问题的能力)。 我个人认为,花费大量的时间去"精通"某种语言、某个平台和某些工具,其实是本末倒置。所以,不要追这种"精通”,看上去学富五车很牛逼,其实孔乙己一个罢了。 ----------北京理工大学 计算机学院讲师金旭亮 不知道什么样算“真正的”精通Java。答主编程不少年了,几年前还在 FLAG 工作时 peer review top 10% 的水平,所以厚颜自称较熟练吧。总结下自己现在的状态。(不限于Java,现在工作用Java + Scala + TypeScript,私人项目用 Java + Kotlin, 之前 c++ 什么也写过一堆,对大多语言都通用)。
还是会查API,会去谷歌/StackOverflow。Java生态系统很大,如果用到第三方库,特别如Spring之类要点极多且每版都会调整。强记API不是做不到,实在是没有意义。需要记得每个库都有哪些主要类,每个类提供哪些方向的功能。具体参数,及表现细节依靠查文档。 知道 JDK 内部大致是怎么实现的,能躲开绝大部分明雷。至于一眼看出Byte Code,抱歉做不到。代码调优靠Profiler,纯手动调优不推荐。 一遍编译无Bug做不到,且没有必要。编译器的最大的作用就是查缺补漏,靠人工去一个个文件排查不是不能,实在是浪费时间。一般写码流程如下: 先定大致方向,写初稿。 觉得写差不多了就开始敲编译,靠报错把最后不编译的部分修完。 编译过了就跑测试,看看有没有Break现有功能。 把现有的break修完开始写新测试。这是找Bug的主要过程,通过测试找Bug比靠脑力排查有效率的多。因为你只要写什么样的情况期待什么样的输出。出现意想不到的结果靠Debugger来排查哪里想叉了。 写测试的同时一般会对API设计有新的想法,依靠已写的测试做一两轮Refactoring。 多写多试多改,靠测试把Bug挤完。当别人还在纠结怎么设计完美API怎么一遍写完无Bug时,我们已经改完几稿趟完一堆暗雷可以提交了。 这流程还有好处是测试比较全,写出的东西不会轻易被别人Break。 会把复杂的问题简单化。经常会有新人向我吐槽,隔壁大神好牛,代码美如画,各种技术吊炸天,可惜看不完全懂。不像你的代码,从头到尾简简单单好像也没什么特别绕的东西,写出来就是能用。有经验的程序员会知道项目里大部分同事都是平均水平,你如果挖空心思写出的牛掰代码,可能很多人看不懂,维护起来一定会出错。如何封装复杂的逻辑,用简单的接口藏起烧脑的内容,是程序员走向成熟的标志。 知道Eco System里都有什么开源选择, 不必要的轮子不要造,该造的时候能提供充分的理由说明为什么现有的开源不能满足,必须自己来。 不迷信大开源/大公司项目。使用第三方库会去看源代码,看哪里写的好哪里写的不理想。哪怕Java语言本身也有不少设计缺陷 (Criticism of Java),参考别人的经验教训,认识到现有工具的不足,在自己设计时避免同样的错误。 同意ClevelandAlto说的,认识语言的优缺点,选择正确的工具。不适合用Java时候不要用Java。 一个程序员学习平台分享给你们,让你在实践中积累经验掌握原理。