前言:
一直在迷茫自己的路怎么走,最近在借鉴一些大佬的方法。整理了此篇,后续会持续的扩展和浓缩。希望最终能浓缩删减成几段。
一. 好奇心
对于程序员来说也是类似,如果你看到新技术,新产品没有像小孩看到新玩具那样两眼放光,没有想赶紧在自己电脑上玩玩的冲动,你就需要仔细考虑下是否真的对软件开发有兴趣?如果根本没兴趣,不要浪费时间,还是趁早转行,有更多有前(钱)途的职业在等着你。
没有好奇心,就不愿意追本溯源,追求技术的本质。
二. 养成计算机的思维方式
相反你只能用计算机能理解的方式,用非常非常低级的计算机语言去告诉它做事情:创建一个类,分配一个固定大小的数组用来存放数据,用一个数(size)来记录数组里存了多少数据。如果数组满了,就需要增大数组,并且把数据从老数组复制到新数组。
这里边有很多很多的烦人的细节需要你去处理,一不留神就会出错---计算机编程就是这样。
养成计算机的思维方式,流畅的把人类语言的需求转化成计算机语言,这是程序员的基本功。
很多人会语法,也懂框架,但是在基本功上却不过关,只能在初级程序员上踏步。
这个基本功的训练就是数据结构和算法,我的经验是多做习题(大学时我把数据结构后面的习题都做了一遍),让这个思维在脑子里固化,以后的编程就可以信手拈来了。
三. 扎实基础,融会贯通
我们大学里都学过计算机组成原理、操作系统、编译原理、计算机网络、数据库、汇编语言,能不能把这些知识融会贯通,打通任督二脉,在我们的脑海里建立一个计算机运算的图景?
把这些知识融为一体,我相信能超越绝大多数程序员。
现在的软件开发封装的层次已经非常高了,只要学会Java就能做一个编程工作了,随着你做的越来越深,越来越专,这些基础的问题就会浮现出来。
更重要的是,计算机软硬件的基本思想在这几十年里其实变化不大,例如缓存,增加抽象层等,有了这么基本的思想的武装,去学习新的东西不但学的快,理解的会更透彻。
四. 要透彻地理解一个技术的本质
Ant给我们的重要启示就是,用XML来描述任务,能极大的扩展语言的能力。但是Ant的问题就是需要程序员处理太多的细节,指定源代码路径,指定编译文件的路径,指定资源文件的路径,指定需要的jar包及其位置,很烦心。
于是Maven出来使用“约定优于配置”的方式解决了Ant的问题。
理解了技术的本质以后就能够触类旁通,就能够快速学习,这在技术更新很快的软件行业尤为重要。
只是学会使用是不行的,不但要知道how,还要知道why。
停下来,思考,才是进步的本质。
五. 要能写漂亮的代码
所谓漂亮代码不仅仅是清晰、易懂、优雅,更要实现功能,没有Bug或者极少Bug。
其实如果代码简单优雅,一般没什么问题。
写出漂亮代码并不容易,需要思路清晰,有良好的编程基础,有优秀的抽象能力,以及对一门语言的熟练掌握。
六. 抽象的能力
现实的需求纷繁复杂,如果架构师不能够把这些乱无头绪的需求抽象成一些“概念”,在概念的层次进行思考,系统根本就无法设计。
但是抽象出概念以后还不够,还要看看这个概念是不是正交的,能不能独立变化,如果不能,考虑下新的概念抽象。
抽象能力的训练没有捷径,就是经验的积累,勤于思考和学习。
七. 功能的完善层次
第一层: 功能能用,不报错。
第二层: 各种输入情况都考虑到,各种用户的需求都能满足
第三层:健壮性,可靠性: 程序中运行中突然断掉了,会有什么影响,可以回退不,可以重复执行不
扩展性:
性能: 当用户量,数据量提升到百万级,千万级会出现什么情况
八. 认真负责的态度
我们组长是个很认真负责的人,无论从业务研究时,每步流程的分析,各种情况的考虑;还是开发中,代码质量的管理(精简,高效,高扩展);还是测试的时候面面考虑到,各种情况的分享;还是发布时,每个步骤的确定,还要自己动手先试下有问题没;在到发现一个问题时,不解决绝不回家的态度。
因此造就了一个业务能解释的清清楚楚,流程图随手画随意讲解。技术随手画整体框架图,功能点。
九. 记笔记的方式
选书: 必须要有作者自己的观点,因为那才以为这理解通透了。嚼碎了的才易消化。
知识点分为了解,掌握,精通
了解的:概念,大概原理,使用场景
掌握(近期不重点):概念,原理(浅层),具体使用,扩展使用,
精通(近期重点):概念,原理(深层,升到java代码的实现,jvm指令等),具体使用,扩展使用,
十. 思考问题的方式
一日,java validator出现异常,追寻错误日志信息,然后度娘检索。得一答案,少jar包。兴冲冲和组长提。组长问了如下问题
(1) 这个是权威性的资料吗 (答曰:百度得的)
(2) 为什么要加(答曰:看代码少依赖)
(3) 加了后对原来的影响(答曰:应该没影响吧)
静思,每条都有问题。第一个我去官方文档去找是另一个答案,果然不权威性的不可靠,比如度娘
第二个就更严重了,连原理都不清楚,谈何办事。这个依赖的功能是什么,为什么么要加这个依赖,甚至之后的延伸,比如自己做个校验,也可以参照,以及这个依赖的其他使用场景等等。懒思害死程序员。
第三个代码是严肃的,尤其是公共组件,牵一发而动全身。不要因为一时脑热,而到生产出问题哭都哭不出来。
一个知识的精华在于它实现的目的,原理。而不是方式。理解了原理那么学习其他想关联的知识也是融会贯通。
顺便延伸,根据需求或者指标做事的永远是低级层次的,无论代码再漂亮,多么高扩展,高可用。因为层次决定了。需要我们在平常中思考每件事的目标,直接的关联,以及可能的延伸,这样遇到一个新的问题时,才可以提出建设性意见,解决问题,高出别人的视野。
警思!