这是我在知乎上关于问题“只会 if, else, 数据库 CRUD 的 Java 程序员如何提高本身?”给出的答案。其实,这应该就是一个关于早期技术人员怎样突破瓶颈的问题。java
做为一个爱好技术的人,咱们最多见的技术入门——或者说技术切入点——就是开发有实际可见结果的应用——由于这个够简单,够有成就感。而不管哪一个平台、框架上面的应用开发在现阶段都逃不开楼主所说的,某个编程语言的学习(Java、Ruby、PHP 等),某个数据库(Mysql、Sqlite、Mongodb 等),再加上楼主不曾说的该框架、平台(Rails、Android、IOS 等)的知识的掌握。linux
编程语言、数据库、应用开发框架——这三个部分构成了早期从事应用开发的程序员的所有。程序员
因此当进行了够多的应用开发后,咱们就每每会产生这样的思考——我会写应用了,可是我以为我学会的技术别人学了也会,个人优点在哪里?我想继续提升,我该怎么走?以及相似于楼主这样更为具体的问题:只会 if、else,数据库 CRUD 的 java 程序员如何提高本身?算法
我以为,一句话能够指点这个阶段的开发人员——向上走,向下走。sql
向上走,指的是进一步学习设计——没错,程序员的工做本质上也是设计(只是咱们好多人都没有意识到):代码设计、算法设计、架构设计等等。之因此以为本身在重复地作事情,是由于你的每次设计都采用了一样的方案——排序?用快排吧;生成实例而且要解耦?嗯,用工厂吧;要提升系统性能、可用性?嗯,用 cache 吧。虽说利用现有的设计方案是设计人员的必经之路,可是若是一次又一次的重复利用相同的方案,你就会以为本身并无提升——虽然对于项目自己来讲是安全、可靠的。在学会了基础的应用开发以后,你就算是学会了最基础的设计方法。而后你要提升,就得继续去学习更为优秀的设计方法:代码设计上,咱们去参考设计模式;算法设计上,咱们去了解针对同一个问题的不一样的解决方案的可用场景以及相应的优劣性;架构设计上,咱们去探索最适合如今咱们应用所处的环境最好的解决方案(听过腾讯一位技术总监的演讲,他们后台的用户数据、关系系统的架构就有本身的选择:例如数据库中的读取尽可能没有用到锁)。总之,学会了基本的应用开发,就能够尝试向上走,走“形而上学”的路子。我想楼主应该已经看出来了,个人建议具体化下来的时候,就是去学习设计模式、算法设计、架构设计(现阶段仅仅了解一下就好,未来在实际状况中去实践的话体会更深)等一系列关于设计的知识。数据库
向下走,指的是去了解系统下面的世界——也就是说,去学习系统的运行机理,“知道机器在干什么”(我最敬佩的 C 语言老师所言)。一个应用程序运行起来,就得有各类支持它的系统——计算机硬件系统、计算机操做系统、编译系统、语言运行时系统。若是不去了解这些“土壤之下”的机制,你就会以为本身写的程序有如空中楼阁,不得其中真谛——譬如,一样能达到目的两条语句哪一个机器执行的效率最高?哪样的代码组织会致使最终程序执行的崩溃?怎样去避免代码中的内存泄漏?——所谓知其然,不知其因此然也。因此,代码要写的明白,咱就得往下走,去了解底层。咱们能够去看看 linux 对于进程的内存、CPU 管理机制是怎样的,从而去优化咱们程序的性能;咱们能够去看看数据库的存储引擎,从而在深入理解以后写出更为高效的 SQL 代码,而且进一步对本身的数据库进行设置、调优;咱们能够去看看 JVM 是怎样进行垃圾回收的,从而避免 java 中恐怖的隐性内存泄漏。楼主向下走,能够去学习操做系统、计算机体系结构、编译原理以及运行时等知识——你会在学习的过程当中对于本身曾经遇到的问题恍然大悟(我就经历过好多回了,每次都高兴不已哈哈)。编程
最后再提最重要的一点——不要把写代码自己做为终极目标,而应该把代码之上、之下的东西弄透。我想,这也是区别代码工人和研发工程师的界限之一吧!设计模式
via 巴赫在编码安全