程序员等级划分

一 缘由

最近因为找工作的原因,开始规划对自己的下一步发展和职业规划进行了深入的思考.总结自己的职业发展轨迹,想对自己是一步步成长的有个了解,所以就开始思考对目前很常见的对技术人员的初级,中级和高级的划分标准的问题.根据互联网上一些技术大神和职场专家的观点,再结合自己的工作经验.我总结了一些自己对这个问题的看法. 总的来说的话, 我认为可以使用下面这些判断标准:

1)初级技术人员: 功能实现.

2)中级技术人员: 模块级别的设计优化,以及性能优化.

3)高级技术人员: 系统级别的问题的排查, 性能调优, 一定的技术选型能力, 知识与技术的广度和深度, 以及一定的团队管理经验和能力.

4)架构师: 系统架构选型,搭建和优化,以及系统架构的重构.

当然,这样分类的边界并不是特别清楚或固定,但是大体上可以根据这几个标准来判断.

二 初级

对于初级程序员,他们的能力相对弱,决定了他们的关注点是: 业务功能的实现.他们所依赖的技术基础的级别往往是语言的语法规则等.他们平时的迫切任务也主要是拼命地完成上级分配给自己的任务.由于技术基础薄弱,他们通常为了完成任务而疲于奔命.自己手上的事情都来不及完成,所以导致他们没有时间停下了思考或者没有意识去思考.

下面这些问题是大多数初级程序员经常遇到的困惑:

1) apche与tomcat不都是网站服务器吗?为什么公司会同时使用这两个东西啊?(想当年,我刚毕业的时候也是搞不懂这两个东西的区别~~, 往事不堪回首啊, 哈哈……)

2)jsp中直接写java代码不是更加简单直观吗?为什么好像别人都在使用jstl和模板引擎(freemaker,velocity)这些东西啊?

3)不重视使用配置文件,甚至很多参数直接在代码里面写死了.

4)很多技术在宣传的时候往往又吹嘘自己的功能强大,丰富.实际情况是,除了核心功能会经常被使用之外,其实其他的功能都比较鸡肋.或者支持一些插件或模块性的扩展,也敢宣称自己无所不能,其实这类工作对企业和团队要求的投入还是比较大的.在学习技术的时候,这种情况也会让很多初级程序员很困惑.

总结来说的话,初级程序员对技术的认识仅仅停留在功能层面,他们没有足够的视野高度和广度,所以往往看不到这样的现实: 企业是在拼命地追求效率!

在此,有点感触也有些许悲哀: 一个人往往认为自己所看到的就是全部,却没有意识到自己的眼界是存在局限性.

在这个世界,不知道有多少人就活在自己的视野范围内啊! 他们忙碌,自豪甚至小有成就. 但是他们也就那样了,仅此而已.

三 中级

初级人员,随着项目经历的增加,看到了企业和软件系统是怎样的一种存在.尤其是经历过或者意识到重构的初级程序员就进入了中级程序员的行列.我至今无法忘记当我第一次听到了”重构”这个词的时候的震惊程度.入行这几年给我留下类似的这种巨大观念冲击的词语不多,大概有这几个:重现, 重构, 设计模式, 使用场景, 最佳实践, 系统架构等. 重现是软件开发过程中非常基础和重要的策略和原则;重构则是软件产品随着需求的变动和技术的发展经常会面临的问题;设计模式和架构则分别代表模块级别和系统级别的设计的同义词.

理解重构的含义之后,我瞬间明白了我多年的困惑,也精准的描述了我多年的状态.我为什么总是把已开发的软件该来该去?当初写第一行代码的时候怎么就没有想好这些呢?这些都是问题.虽然并不是每个程序员都能明确的意识到这种问题的存在,但是每个人都在被这个问题影响.刚刚认识到重构的时候,一半是豁然开朗,因为知道自己面临什么问题; 另一半则是焦急和渴望,因为迫切的想要找到解决办法.我有一段时间甚至甚至走到了另一个极端——过度设计. 从没有设计意思走到了追求完美的程序,神化设计的方向.

这种状态其实并没有持续多久,因为问题清楚了,答案其实也清楚了. 因为设计模式就天然的和重构联系在一起,这两者的关系是如此的紧密,以至于任何一者出现的地方,你总能看见另一个家伙的影子.设计模式

从这段描述,就能说明中级程序员的典型特点,就是具有一定的设计意识和思想.催生这种思想产生的动力就是:重构.

当然随着技术功底的加强,对于实现功能的任务已经越来越没有挑战性了.中级程序员会逐渐把剩余的生产力投入到软件性能这个层面.随着技术积累和项目积累,对常用技术的认识也就更全面和立体了,而不是像初级程序员那样只看到功能.

四 高级

老实说,我对自己当前的阶段的定位是: 我目前还处在高级程序员的入门口.刚刚跨入这个级别不久.在很多评判的标准上都还达不到或者等待检验.因为还没有完全经历过,所以就不太好谈这个问题.希望自己能够尽快到达这个级别的各个标准. 下面的话只能就自己的理解(而不是切身经历)来谈一谈.

作为高级开发人员的话,工作内容的复杂程度就不再是模块级别的了,而应该是系统级别的问题.随着技术和社会的发展,尤其是互联网的发展,目前的单机软件的地位越来越低.软件行业,可能其他技术行业也是这样,通常是那些最热门的领域,所面对的技术问题最多,因为业务压力和同行竞争对技术的驱动力是非常巨大的,一句露骨的话就是:钱的力量. 就像IT行业,目前最火热的无疑是互联网行业,所以互联网行业所面对的问题就非常的多,高安全,高性能,高可靠等,虽然与其他的领域相比,像人工智能这些领域,互联网的核心技术不一定最复杂,但是其发展速度和面临的挑战确实的非常大的.分布式技术就是应对互联网的这些挑战的最主要的解决方案.分布式技术这几年的发展离不开互联网行业的蓬勃发展.可以说互联网和大数据对分布式的发展起到了很大的推动作用.由于分布式技术的发展和成熟,也导致分布式技术和一些思想被其他IT领域采用,这又对技术人员提出了新的挑战.这样技术和业务就形成了良性的循环.

鉴于当前的行业的技术形态的特点,很多软件能力,就是以系统形式存在.所以,技术人员所面对的很多复杂的问题,都是系统级的问题.这就是为什么说高级程序员的处理的问题的级别是系统级别的.

除了工作或问题的复杂度,高级技术人员还应该在系统级别的性能调优,技术选型能力,知识的广度与深度以及团队管理等方面有扎实的功力. 这也是我目前需要努力的方向!

五 架构师

这个留待以后补充吧.

人的两种状态

今天突然意识到自己有两种状态:被动接受和主动选择。

看电视,看电影,无聊时用手机看看新闻,这些时候自己处于被动接受状态;记英语单词,看专业书籍,编程学习时自己处于积极主动状态。

被动接受状态,也可以称为消极等待状态。此状态时,自己不需要做什么过多思考,也不需要自己做任何艰难的选择。只需要体验,感受,甚至享受(“舒适区”)。

主动选择状态,也可以称为积极主动状态。在这种状态下,需要大量的思考,记忆,做出选择(这是不是所谓的“拉伸区”,或者“学习区”)

读书记之《资本的逻辑:一看就懂的融资实用指南》

书名:《资本的逻辑:一看就懂的融资实用指南》

作者:黄嵩

简介:它以资本为视角,从PE如何选择企业、如何评估企业、如何签订协议、如何退出投资等方面再现了企业融资的全景过程,并对经典融资案例进行了专业解读,揭示了资本的内在逻辑。

点评:这本写得非常通俗易懂,但也不失深刻透彻。在阅读的过程中,我深刻地体会到资本对企业乃至整个商业社会的发展所起的巨大推动作用。

证书

CA证书:一种身份识别机制(即防伪),从技术上看,主要就是一对公钥和私钥。

认证中心(Certificate Authority CA):CA证书的担保人,可以用自己的权威性为其签发给的证书作担保。

根证书:认证中心颁发给自己的证书,是证书链的终结。根证书是未被签名的公钥证书或自签名的证书。

子证书:认证中心给别的企业颁发的证书,可以证明该企业的身份。

证书链(certificate chain):根证书与子证书以及子证书的证书所形成的信任链。

成功五部曲

来源:《万万没想到——用理工科思维理解世界》

作者:万维刚

成功五部曲:

1.刻意练习

2.微小改进(拉伸区)——最重要,最关键,也是最痛苦的一步。但是成长就意味着痛苦,痛苦也是成长过程所必须付出的代价。
3.及时反馈——不要忘记,问问自己实现了哪些改进?
4.高水平重复
5.一万小时

大牛们

王垠,四川大学97级本科毕业,保送到清华大学计算机系直博。期间曾在清华大学计算机系软件工程专业就读,主要进行集成电路布线算法的研究。留学康奈尔大学计算机系,印第安纳大学伯明顿分校。2012年,以一篇文章《对博士学位说永别》再次退学,至此王垠分别于2005年、2006年、2008年分别从清华大学、康奈尔大学和印第安纳大学伯明顿分校退学。

领域:计算机一些深刻的,本质性的思考和见解

主页:http://www.yinwang.org/


顾森,北京大学中国语言文学系应用语言专业07级本科生

领域: 算法,数学

著作:《思考的乐趣》

主页:http://www.matrix67.com/

刘伟鹏,南京大学计算机系硕士毕业,现就职于微软亚洲研究院创新工程中心

领域:学习方法,算法,人工智能

著作:《暗时间》

翻译:

《Imperfect C++ 中文版》
《Exceptional C++ Style 中文版》
《修改代码的艺术》

主页:http://mindhacks.cn/

阮一峰,上海财经大学世界经济博士研究生。主要研究宏观金融、货币政策与美国经济。他本人也是一名IT技术人员,主要关注网站制作。目前就职于支付宝

领域:计算机,javascript

译作:《软件随想录》、《黑客与画家》《异常流行幻象与群众疯狂》《下一个大泡泡》

主页:http://www.ruanyifeng.com/

数据处理场景下的”数据类型”总结

数据处理(任何编程过程)中会遇到的数据类型总体上可分为两大类: 值类型, 结构类型(对象类型,引用类型,结构体)

值类型在形态上大体可分为三类:二进制,数字,字符串

结构类型在形态上也可分为三类:空(null),数组,普通对象

所以我们在进行数据处理相关的编程时,需要对以上各种数据类型一一论证;另一方面我们在学习相关的技术或知识的时候,应该对以上各种数据类型的处理场景检查,这样才能更加全面的学习这种技术或知识。

IT行业的技术类型总结

1.协议

描述:

一系列用于多个对象之间信息交换的规则

例子:

HTTP,TCP

2.编程语言

描述:

一系列语法规则的集合

例子:

C语言,Java

3.架构

描述:

多个子模块之间形成的逻辑接口,其中模块本身是点,模块与模块之间的联系(即存在信息交换)构成线

例子:

分布式架构,MVC[springMVC],SOA[dubbo]