java学习编程怎样才算是编程高手了?

北大青鸟大学城校区logo 北大青鸟大学城校区
招生简章校园环境师资力量就业明星招生问答软件工程师北京大学学历学员项目联系我们 报名通道

免费在线咨询通道>>

免费在线报名通道>>

北大青鸟报名电话
当前位置:北大青鸟 > 软件教程 > java开发 >

java学习编程怎样才算是编程高手了?

标签:   分类:java开发

1、高手的定义和养成关键

我估计如果问100个人“什么样的程序员是高手?”,那答案会有100多个。因为同一个人还可能给高手下不同的定义。

在这里我们认为,在特定领域里能搞定大部分人搞不定事情的就是高手。从这样一个定义出发,我们会发现在技术人员和销售人员眼里,高手的内涵是有很大差异的。

纯技术人员更多的关注性能能不能提到极致,并发能不能处理的很好,内存溢出Bug能不能很快搞定,类库的机理熟悉不熟悉等等。而在销售人员的眼里,则在技术外还多看了些东西,比如业务流程熟不熟悉、使用性好不好、能否迅速对应变化、能否在限定工期和预算下搞定任务等。

考虑到职场和产品销售有着非常紧密的关系,我们这里使用后一个视角,而非是单纯的技术视角。

高手有很多种类型

有几类本质上很不同的人都会被视为高手,比如说:

能写出很牛的病毒的。这个不举例子,但当年读过CIH的代码,我是被其精巧给震住了。此外也许搞加密解密的也应该放在这个类别里。

能把一堆3D图形放到64K的。以前专门有个比赛是干这个的,64K大小的EXE能给你放10几分钟很酷的3D动画,第一次见绝对会很震惊。

能迅速调试出问题所在的。内存泄露、多线程同步这类问题往往让人纠缠很久也搞不定,但就是有人能很快的解决这类问题。

能仅靠几个人就架起高并发网站的。新兴web2.0网站如:flickr,甚至还可以包括Google,在初期往往是几个人搞起来的,这些人名声不显,但绝对是高手。

能主导开发出很牛的产品的。这个上可以想想unix和linux的作者等。

能主持大规模软件设计的。这个往往更有商业价值,我们常说的Martin Fowler应该可以算在这个类别。

能把一种语言研究的特别牛的。想想各个编程语言的创建者,想想C++的大牛们。当然创建某一门语言的也可以归到这个类别里。

能开辟自己方法论的。比如搞cmml的Watts S. Humphrey。

能写出很牛的书的。比如:windows平台下写了Windows核心编程的Jeffry Richard。

能写出很牛的算法的。比如:Donald Knuth。

……

这个表应该还可以加长很多,单以大家认可这个角度来看确实高手可以从各个方面冒出来。

不管在那一方面,要想成为上面所描述的高手总是需要学习、思考、实践这些环节,这没什么可说的。但和软件相关的知识其实多如牛毛,完全不像小说里武功秘籍那么稀缺,几乎可以讲满地都是。这就使选择和集中成为难题。

只学不用没意义

软件的三个基本特征(技术更迭快、低介入门槛、多内部分野)就像铡刀一样,一旦选择出错,就会把个人的努力切的粉碎,一点价值也留不下来。而与此相对的,则是人的黄金学习时间其实并不多 —— 不过是毕业后的10年左右的时间。

曾 经有人希望自己能够从事嵌入式软件的开发,因此给自己买了ARM板,自己在家里花了很多时间来学习并实践相关知识,最终却因为其他的原因进入了一家做网络 的公司。这个人等价于被软件的内部分野较多,而彼此间技能流动性较差这样的一个特质斩了一刀,被斩掉的倒不是ARM板,而是自己一年多的辛苦投入。这种情 况下强调学的知识将来有用是没有太大意义的,因为还有两刀在等着:如果你三年都不做这个,你今天学到的知识可能会被更迭掉了,同时由于你年纪增长了,可能 也不太适合与大批新介入这个行业的人员进行竞争。

这类事情使软件行业中的成为高手这事变得复杂了。

为了在成为高手这条路上走的顺畅,事实上有三个关键点:

一是要有一张全局性的地图,以便选好方向;

二是要知道都有那些坑,好绕开它,免得掉进去。

三是要有足够的热情和动力,能坚持走下去。下面将分别从这三个方面来说明成为高手途径和方法,而这种途径和方法会因为具体目标不同而有所微调。

2、全局性的地图

清代著名学者曾对知识地图的必要性做过非常精确的表述:

凡读书最切要者,目录之学也。目录明,方可读书,不明,终是乱读。

---王鸣盛,《十七史商榷》

目录即是地图。

对于软件开发的知识,我更愿意使用下面的的“地图”,这不一定是最合理的,但确实对归纳各种软件开发知识有所帮助。

通用的领域知识

编程语言(C/C++,java,C#,python,perl,php等)

框架和类库(struts,Spring,osgi的某个具体实现,MFC,Boost等)

平台(windows API,POSIX,.Net framework※1,javaAPI,C/C++ Runtime Library等)。恰如Jeffry Richter所说,大多时候可以从内存机制、线程机制、错误处理、异常处理、组件构建、组件组合等方面来进一步考察一个平台。

计算机体系结构(CPU指令,虚拟存储等)

数据库

实用技巧(调试方法,代码生成器等 )

... ...

有的时候子类别间的界限并不是很容易界定,其中一个主要原因就是存在着像.Net framework这样涵盖了过多内容的概念。

概念和逻辑创建和优化

面向对象分析和设计/结构化分析和设计

设计模式

重构

契约式编程

uml

... ...从形式上来看uml更近似于一种编程语言,但从其目的上来看也许归在这里是更合适的一种选择。

专业领域知识

图形图像算法

网络协议

人工智能

数值/非数值类算法

财务知识

负载均衡

... ...

关于软件的间接知识:

需求开发和描述

估算

估算法。比如,COCOMO, FP等。

估算术。比如,使用计数等原始办法。

 

软件工程和方法论

轻量型方法论。比如敏捷。

大方法论。比如cmml

综合分析。比如,《人月神话》,《人件》所做的工作。

随着待解决问题越来越复杂,通用的领域知识中,几种技术往往会组成一种技术Stack,他们更需要被看做一组必须一起掌握的知识,比如:lamp(linux+apache+mysql+python/php)。

当然上面罗列的远不是全部,这种罗列更多的是展示一种分类的方法。通过对这种分类方法的补充和完善,大多可接触到知识都可以被归入特定的类别,比如说:WinRT可以看做一种新的平台,html5则可以看做是一种语言等。

每个人可以根据自己的情形,参照上面的分类建立属于自己的地图,有点问题没关系,有就比没有要好很多。接下来依据这样的地图就可以选一条自己的线路,持续累积,寻求实践机会,最终就很可能会成为真正的高手。
加油吧,网络工程师们!

若有疑问请拨打北大青鸟咨询热线:010-80146691或点击免费在线咨询!
  • xml地图 网站地图 招生简章 合作企业 学员项目 联系我们
  • 关闭窗口