范文一:程序员的素质
程序员的素质
白杨
2010-12-01
众所周知,软件和硬件工程师个体间存在巨大的生产力差异:经常有一个人一两天就能做好 的事情另一个人花一两个月也没能做到同样好。
Apple 创始人史蒂夫 ·乔布斯曾在《 In the Company of Giants》一书中接收采访时提到:“一个最优秀的人完成工作的能力能抵 50到 100个一般水平的人” 。而软件工程领域也经常提 到最好和最差的程序员之间的生产力差异超过 1000倍, 因为如果一个程序员产出的代码中包含 了很多 bug ,需要其它程序员花费大量时间去修正,那么他的生产力是负值。
在世界名著《人月神话》中,作者也明确地提出了类似的观点:“最优秀和一般的软件工程 实践之间的差距是非常大的,可能比其他工程领域中的差距都要大……” 。
除了团队组织和项目管理等行政方面的问题;以及语文、数学、逻辑思维和形象思维等个人 基础素质以外,到底是哪些专业素养导致了程序员个体间的巨大生产力差异呢?本文尝试以由浅 到深、由易到难的顺序来讨论程序员的个体素质。
1. 基本技术素养
基本素养包含了每个程序员都应当牢固掌握和充分理解的技能和知识。基本素养中又可以分 为前景知识和背景知识两种。
前景知识 :今天的程序员主要通过使用编程语言书写代码来完成软件开发活动,前景知 识则特指程序员对其使用语言的掌握程度。这里所说的“掌握”并不是仅仅能够写出合 法的代码就行了,而是对语言中各种实现细节的深度掌握。
如果一位程序员未能透彻掌握他正在使用的程序设计语言,那他写的程序就一定会或早 或晚地出现一些至少在他看来有些“莫名其妙”的问题,比如:应用程序时常莫名其妙 地崩溃、经常发生资源泄露、或是执行过某些操作时性能差的离谱等等。
以 C++语言为例:正如大部分 C 程序员都能毫不费力地将任意 C 源码“肉眼翻译”成伪 汇编码那样,一个合格的 C++程序员也应当可以做到将任意 C++源码“人脑编译”为对 应的伪汇编码。但现实的情况是由于 C++新增了模板、虚函数、 RTTI 、虚基类、异常等 大量高级特性,以至于能够真正透彻掌握 C++语言的程序员很少。
除非完全不使用前文中列出的那些 C++高级特性, 仅把它作为一个 “稍好的 C ” 来使用。 否则,对于任何一个职业程序员来说,贸然地使用一种尚不了解其底层(编译器或 VM )
实现细节的语言特性是一件很危险的事。
类似的例子同样适用于其它语言。不管是编译型的(如:C/C++)还是解释 /虚拟机型的 (如:PHP 、 Java 以及 JavaScript )程序设计语言,它们都有一些需要程序员事先透彻理 解和掌握的实现细节。
背景知识 :透彻地理解和掌握至少一门编程语言对任何一位职业程序员来讲都是很重要 的基础素质,但仅仅做到这点仍然是远远不够的。想要产出具备现实意义的产品,还需 要具备足够的背景知识。以下,我们将背景知识分成“公共背景”和“领域背景”两类, 分别进行讨论。
公共背景 :公共背景包括了几乎每个程序员都需要掌握的知识。 从操作系统原理、 编译原理、数据结构、离散数学、计算机组成原理、网络原理等理论性知识到各 种接口和实际环境的运行时 API (例如:对 C/C++来讲通常是操作系统 API ,对 JavaScript 来讲通常是浏览器提供的 API )都是作为程序员必不可少的基础。
领域背景 :领域背景中包含了与具体问题域相关的背景知识,这些知识并不是每 个程序员都需要掌握的,但对于涉及该领域的开发人员来讲却必不可少。
例如:对于要实现音频编辑器的程序员来说,至少具备起码的声学背景; MIDI 编曲软件的作者需要乐理和和声方面的知识; OCR 软件的作者则要学习模式识别 和图像处理方面的理论等等。
2. 思维的条理性和连贯性
对于一个程序员来说,从产品的设计之初到其中组件的逐一实现完成乃至最后的联调。整个 开发周期从始至终都需要保持清晰的条理和连贯的思维。以下准则有助于帮助程序员在开发过程 中始终保持思维的条理性和连贯性。
3W 准则 :我想每个程序员都应该遵循 3W 准则,即:每次在开始编写代码之前,都应 当先搞清楚 What 、 Why 、 How 三个问题。其中“ What ”指我们要做什么,也就是用户 的需求。 “ Why ”表示为什么我们要做这件事,这是对需求和架构的更深层理解。很多时 候,只有充分了解了“为什么”以后,我们才能更好地完成设计(例如:使用更合适的 算法和构架,以及在架构中预留恰当的接口等等) 。最后“ How ”从设计层面指明了应当 以何种架构、哪些模式和算法来最终构建出产品。
值得指出的是, 3W 准则不但适用与对系统进行整体分析和设计,同样也应当利用在模 块或组件等粒度更细的层面上——在开始着手编写一个组件前,应当事先搞清楚这个组 件的功能(What ) ;需要在何处使用它、为什么需要用到它、它的典型用例和工作上下 文(Why ) ;最后是使用何种架构、模式和算法来实现它(How ) 。
本质上讲,需求分析和总体设计的意义就是在系统的层面上回答以上三个问题。总体设 计使开发人员能够对待开发的产品在整体上有一个比较清晰的了解,知道当前正在实现
的组件处于系统中的什么位置。
在着手实现一个组件前,如果程序员能先在组件的层面上搞清楚这三个问题,那么他就 可以在一个目标、动机和实现方式都很清晰的状态下开始工作。进一步说,在开始工作 之前,清楚的知道自己要做什么以及如何完成手上的工作对于任何行业的从业人员来说 都是非常重要的。遗憾的是,相当多的程序员好像并不这么认为。
时刻保持清晰的逻辑 :3W 准则让我们在动手前就清楚自己要做什么以及如何做。但在 具体实践的时候我们还需要随时清楚自己正在做什么?之前几步分别做了哪些事?以 及之后几步还要干点啥?只有时刻了解自己“刚才” 、 “现在” 、以及“将来”要做的事 情,才能随时保持思维连贯和条理清晰。
以恰当的层次进行思考 :太高的层次过于抽象,而过低的层次容易让我们揪住某些细节 问题不放。在合适的层次思考才能够最有效地想出恰当的解决方案。什么层次才算“恰 当”没有简单的定论,这取决于产品的规模和正在解决的问题。但是在碰到棘手问题的 时候换个层面来重新考量往往能够事倍功半。
3. 高效的产品维护
软件产品的日常维护主要包含排错、 Workaround 、功能变更、架构重构等活动。对于新手来 说,花个几天时间找“臭虫”实属常见(有句顺口溜说的好:“锄禾日当午,不如 coding 苦,对 着 C++,一调一下午……” ) 。提高产品维护的效率就在很大程度上提高了程序员的生产力(因为 有更多的时间编写新代码) 。
多年的经验显示,以下要点对于提高产品维护效率、以及提高产品质量都有着不可忽视的作 用:
编码规范 :编码规范对于软件品质的影响怎么强调都不过分。程序代码作为一种文档, 首先是供人类阅读的。好的编码规范能够有效地降低错误率、提高可读性、以及极大地 曾强代码的可维护性。换个角度来看,代码只写一次,但却需要断地进行阅读、理解、 修改等维护工作。 没人愿意接手维护一大堆完全看不懂的代码 ,在书写时始终遵循一套 完善的编码规范则可以在很大程度上缓解这些问题。
编码规范对程序品质和可维护性方面的影响就像鞋对人类的影响一样 :都属于效果巨 大,但跟没体会过的人很难描述清楚的事情——真是谁用谁知道。这可能也是为什么那 么多公司都在强调它,同时那么多程序员却又不重视它的原因所在——光脚的不怕穿鞋 的!
错误处理和日志 :优秀的错误处理和日志记录方式能节省大量排错时间,同时揭示产品 改进的重要线索。在另一本世界名著《 Code Complete》中,作者凭借其多年的软件行业 经验以及 NASA 、 IBM 等各大组织的长期研究报告得出结论:“ 在绝大多数项目中,最 大规模的活动就是调试以及修改那些不能正常工作的代码……消除软件缺陷实际上是 最昂贵且最耗时的软件工作 ” 。
这方面牵扯到的技术和技巧太多太杂,以至于没有办法给出一个总结性的描述。因此, 这里只能以日常维护场景为例,举一个简单的例子:
试想一下, 你有一个可以向系统 syslog 、 网络 syslog server、 磁盘文件、 Event Log Service等等各种日志目的实时发送日志消息的记录器,它能够工作在调用线程或独立的线程 /进程中,就算进程崩溃它也能够捕捉到足够详细的错误信息,即使整个系统崩溃了也不 会丢失重要的日志消息。
与此同时,你所有组件中的任何操作发生错误时,都会准确地将该操作的错误信息、操 作过程中产生错误的模块信息、 该模块调用的底层平台 API 以及这个 API 返回的错误信 息等等的各级出错详细信息都按照层次结构如实地记录到日志中。在这样的环境中,无 论是排错还是调优是不是都会点单很多呢?
正如前文所述,日志记录和错误处理是个很大的话题,足以著书立说。这个例子也只是 揭示其冰山一角,从一个小小的侧面来反映一套优秀的日志记录和错误处理机制对排错 和性能分析之类的活动有多大帮助。
环境和工具 :熟练掌握开发编辑、分析统计、调试跟踪等工具。优秀的开发、分析、和 调试环境可以节省大量时间。尽量避免在不熟悉或者较“艰苦”的环境下分析和调试程 序。
当然,有时也会有一些不可避免的情况出现。比如:程序的最终目标平台是基于 MIPS 架构的 NetBSD ,但开发人员最熟悉,各类工具最齐全的开发环境确实 x86平台下的 Windows 系统。对此,我们的解决方案是:实现一套与跨平台的 ,这个支 持框架向上封装所有平台相关的功能,为上层应用提供统一的,平台无关的 API 。然后 使用该支撑框架在 Windows (x86) 环境完成应用的开发、 分析和调试工作, 然后在 NetBSD (MIPS )平台上重新编译并发布。
其它因素 :产品维护的成本还会受到很多其它因素的影响。比如在设计之初以 3W 原则 精心衡量过的方案可以避免很多后期不必要的变更;比如重用已经经过验证的可靠组件 不但节省了开发成本,而且也避免了重新实现产生的缺陷;再比如经验、设计思想和品 味对设计产生的影响等等。
4. 标准化和重用
标准化本质上就是为重用做准备。 想要拥有大量标准的可重用组件需要长时间的积累。 当然, 我们这里提到的“标准化”并不仅仅是指 ISO/IEC之类的国际标准或者 GB 之类的国家标准。实 际上,小到公司甚至是个人也可以有自己的内部标准(其实编码规范就属于这种内部标准之一) 。 C++之父 Bjarne Stroustrup曾经说过:产品开发就是重用已有标准组件、 实现新的标准组件、 然后 将它们粘接起来的过程。
想要自己实现一套完备的标准组件库当然需要长时间的积累,但如果利用其它人已经实现的
现成库呢?我们知道,当今的开源时代,能够免费取用的第三方功能库数不胜数。但是使用第三 方库的成本也不低。具体表现在几方面:首先,要用好它,你需要阅读大量代码和文档;其次, 掌握一个库不光是会使用即可,一旦把它用到自己的产品里,那么当它发生问题时你要修正、当 它不满足要求时你要修改和重构、当它缺少功能时你要添加……也就是说,一旦在自己的产品中 使用了一套第三方库,那么维护它就是你的义务,而要维护一大堆代码,前提是你需要先读懂这 些代码。最后,第三方库的架构和品质不一定满足你的要求,而且这个问题可能到最后才会被发 现。
例如:由于架构的限制, Windows IOCP机制无法被在 Boost 库 asio 组件良好地支持。如果 你的产品使用了 asio 组件,并且在开发的最后阶段才考虑需要提供针对 Windows 平台的支持, 那么你将会面临艰难选择。再比如:你需要一套跨平台 C/C++框架,但 Boost 、 Mozilla NSPR、 Apache APR、 GNU Common C++ 等均无法满足你的需求(举个最简单的例子:他们都支持对线 程设置 CPU 粘滞属性)这也使你面临两难的选择:是选择其中一个库,大规模的修改它以满足 你的功能需求,并且忍受这个实现从架构到编码规范中所有你看不顺眼的地方,同时还要日复一 日地将官方补丁合并到你自己的私人分支。还是索性从头开始建立自己的库?
当然,无论你如何选择,这些代价都是值得的。因为我们知道, 程序员的生产力基本等同于 他在单位时间内产出的有效代码行数与其中每行代码平均表达能力的乘积。 即:
生产力=有效代码行数×每行代码的表达能力
大量使用标准组件不光获得了由于组件被反复使用因而比较成熟的优点,而且也使得每行代 码的平均表达能力大大提高(比如:标准组件通过成千上万行代码封装好的一个功能,使用一行 代码即可调用) ,这就使得程序员的生产力能够以乘积的形式增长。
5. 经验和设计思想
经验和个人品味是永远也无法被替代的。 Stroustrup 曾说:任何一个成功的产品中都必然充斥 着其作者的味道。这话虽然有一定夸张的成分,但也不可否认,设计者的经验和品味会极大地影 响产品的最终品质。而设计思想其实是来自于经验的总结和升华,当然其中也糅合了个人的品味 与喜好。因此,设计思想只有成熟和幼稚的区别,而成熟的设计思想之间很难有好坏之分——成 熟的思维各有各的老练之处,但所有人幼稚起来则是大同小异的。
6. 人品(态度)
这标题看起来有点怨天尤人的意思。但我们这里提到的人品既不是传统上的“忠孝礼义仁智 信” ,也不是现代网络用语中“运气”的意思。这里主要是指程序员的责任感和追求完美的态度, 还有乐于与人交流的生活方式。窃以为缺乏这几样东西的人无论如何都不可能成为真正优秀的程 序员。
总结
写完以后发现此小文中的各小节有一节更比一节短的趋势。本文开头说各小节是以由浅到 深、由易到难的顺序来排列的。写完后再看又何尝不是从具体到抽象的排列呢?前面说的都是比 较具体的技术技巧和知识,容易说出个 1234。 而越到了后面哲学色彩就越浓厚,评判标准也越主 观,自然也就越发难以表达清楚了。
范文二:程序员必备素质
程序员必备素质
程序员虽然是高薪职业,但是高回报必定以为着多付出。程序员必备素质是成为一个优秀员工的必备素质。人前光鲜亮丽,享受着人人羡慕的待遇,但是背后的辛苦也不是每个人都能承受的,程序员工作繁重,为了赶一个项目经常加班至凌晨,代码枯燥无味。沉重的压力必须要找到合适的释放方式,所以,程序员必备素质显得格外重要。
如果缺乏优秀的程序员必备素质,即使成为一名程序员,也会在低层徘徊,前进道路很艰难,而且职业前景多少会受影响,甚至会面临半路转行的尴尬境地,所以,大家非常有必要学习程序员必备素质。
程序员必备素质一、学会独处
学会独处也是心灵放松的一种方式,因为不但它会影响也会影响你思考,也会影响你和他人(包括家人)之间的互动。所以,你需要一段平静的时间,远离生活中的各种喧嚣,忘记烦恼,忘记工作,忘记一切。
可以定期为自己空出一个独处时间段,可以让周围的人和事儿从你的世界中消失,为自己营造一个轻松的环境,做点自己喜欢的事情,比如躺在沙滩上晒太阳,看一看休闲书籍等,也可以可以锻炼身体等。
程序员必备素质二、保持健康的饮食习惯
健康的饮食习惯可以帮助程序员调整更好的身体状态,更好的进入工作状态,不过这对有些人特别是程序员而言很难做到。但是,持久的疲倦感会让人觉得精疲力尽,而这可能会对我们的工作产生负面的影响。
所以工作辛苦的程序员应该多吃富含铁、蛋白质和碳水化合物的食物,大大改善生产力水平,延迟每天疲倦感的到来。每天一定要吃早餐,这都会带给你幸福美好的感觉和满满的能量。还要多吃点水果。
程序员必备素质三、设置目标,然后实现它
定期为自己设置目标并努力实现它,因为每完成一个目标就能为自己带来成就感,不但能为自己增加自信,还可以帮助自己进步,提升整体生活水平。经过研究,这对程序员来说是一个很有效的方法。
所以,程序员应该好好想想要做什么事情,然后制定自己的目标,并付将目标转化为实际行动,会感觉自己特别棒。
所以,程序员必备素质是成功的重要因素。
范文三:程序员素质
程序员应具备哪里素质?
程序员应具备的素质
1:团队精神和协作能力
把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linus这样的天才,也需要通过组成强大的团队来创造奇迹,那些遍布全球的为linux写核心的高手们,没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财,但是一旦进入一些大系统的研发团队,进入商业化和产品化的开发任务,缺乏这种素质的人就完全不合格了。
2:文档习惯
说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子,良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30,的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。
3:规范化,标准化的代码编写习惯
作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。
有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂,这种叫嚣只能证明他们自己压根不配自称程序员。代码具有良好的可读性,是程序员基本的素质需求。 再看看整个linux的搭建,没有规范化和标准化的代码习惯,全球的研发协作是绝对不可想象的。
4:需求理解能力
程序员需要理解一个模块的需求,很多小朋友写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件,操作系统和开发环境上,而忽视了本身代码的性能考虑,有人曾经放言说写一个广告交换程序很简单,这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的,对于这样的程序员,你给他深蓝那套系统,他也做不出太极链的并访能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才有可能有心得。
5:复用性,模块化思维能力
经常可以听到一些程序员有这样的抱怨,写了几年程序,变成了熟练工,每天都是重复写一些没有任何新意的代码,这其实是中国软件人才最大浪费的地方,一些重复性工作变成了熟练程序员的主要工作,而这些,其实是完全可以避免的。
复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代
码工作中去。
一些好的程序模块代码,即便是70年代写成的,拿到现在放到一些系统里面作为功能模块都能适合的很好,而现在我看到的是,很多小公司软件一升级或改进就动辄全部代码重写,大部分重复性工作无谓的浪费了时间和精力。
6:测试习惯
作为一些商业化正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师程序员就可以不进行自测;软件研发作为一项工程而言,一个很重要的特点就是问题发现的越早,解决的代价就越低,程序员在每段代码,每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题最早的发现和解决,这样对整体系统建设的效率和可靠性就有了最大的保证。
测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责,可惜在很多公司这成了唯一的测试任务,实际上还差的远那;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试,但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求,有针对性的进行相关测试并尽早发现和解决问题,当然这需要上面提到的需求理解能力。
7:学习和总结的能力
范文四:程序员素质
作一个真正合格的程序员,应该具有的素质。
1:团队精神和协作能力
团队精神和协作能力是作为一个程序员应具备的最基本的素质。 软件工程已经提了将近 三十年了, 当今的软件开发已经不是编程了, 而是工程。 独行侠可以写一些程序也能赚钱发 财,但是进入研发团队, 从事商业化和产品化的开发任务,就必须具备这种素质。 可以毫不 夸张的说这种素质是一个程序员乃至一个团队的安身立命之本。
2:文档习惯
文档是一个 软件系统 的生命力。 一个公司的产品再好、 技术含量再高, 如果缺乏文档编 写习惯,知识就没有继承,公司还是一个来料加工的软件作坊。作为代码 程序员 ,必须将 30%的工作时间写用于 技术文档 。没有文档的 程序员 势必会被淘汰。
3:规范化的代码编写习惯
知名软件公司的代码的 变量 命名、 注释格式, 甚至嵌套中行缩进的长度和函数间的空行 数字都有明确规定, 良好的编写习惯, 不但有助于代码的移植和纠错, 也有助于不同技术人 员之间的协作。 一些所谓的高手甚至叫嚣高手写的代码一般人看不懂, 我只能说他不是一名 合格的程序员。
4:需求理解能力
程序员要能正确理解 任务单 中描述的需求。 在这里要明确一点, 程序员不仅仅要注意到 软件的功能需求, 还应注意软件的性能需求, 要能正确评估自己的模块对整个项目中的影响 及潜在的威胁, 如果有着两到三年项目经验的熟练程序员对这一点没有体会的话, 只能说明 他或许是认真工作过,但是没有用心工作。
5:模块化思维能力
作为一个优秀的程序员, 他的思想不能在局限当前的工作任务里面, 要想想看自己写的 模块是否可以脱离当前系统存在, 通过简单的封装在其他系统中或其他模块中直接使用。 这 样做可以使代码能重复利用, 减少重复的劳动, 也能是系统结构越趋合理。 模块化思维能力 的提高是一个 程序员 的技术水平提高的一项重要指标。
6:测试习惯
测试是 软件工程 质量保证的重要环节, 但是测试不仅仅是 测试工程师 的工作, 而是每个 程序员 的一种基本职责。 程序员 要认识测试不仅是正常的 程序调试 , 而要是要进行有目的有 针对性的异常调用测试,这一点要结合需求理解能力。
7:学习和总结的能力
程序员 是很容易被淘汰的职业, 所以要善于学习总结。 许多 程序员 喜欢盲目追求一些编 码的小技巧, 这样的技术人员无论学了多少语言, 代码写起来多熟练, 我们只能说他是一名 熟练的 代码民工 , 他永远都不会有质的提高。 一个善于学习的 程序员 会经常总结自己的技术 水平, 对自己的技术层面要有良好的定位, 这样才能有目的地提高自己。 这样才能逐步提高, 从 程序员 升级为 软件设计师 、 系统分析员 。
作为高级程序员, 乃至于设计师而言, 除了应该具备上述全部素质之外, 还需要具备以 下素质:
1、 需求分析 能力
2、 整体框架能力
3、 流程处理能力
4、 模块分解能力
5、 整体项目评估能力
6、 团队组织管理能力
1,激情
我曾经遇到许多“职业程序员”,他们从事 IT 是因为觉得这是一种职业,他们只在工 作时间编程, 除非送去培训否则他们不会学习新东西, 这不是好的程序员。 我认为一个好的 程序员总是对编程充满激情, 而且好的开发者会做一些编程工作即使这没有报酬。 激情是一 个优秀程序员的重要指标。
2,自学好学
编程领域始终发展变化着, 不出一年有些新技术就变成了老技术, 这并不是说好的程序 员要对所有新技术跟进, 但有些却对学习任何新技术都没有兴趣。 他们通常在学校学习了编 程, 然后工作后单位安排学什么就学什么。 如果在招聘中你听到“让我培训一个星期我就会 胜任这个工作”那不要雇佣他。 实际上, 真正优秀的程序员始终谈论着你所不知道的新技术, 向人们解释为什么你必须用这个技术,哪怕没有听众听得明白,哪怕他自己也不明白。
3,聪明
聪明包括很多因素, 情绪和社会交际只是其中之一。 好的程序员绝不木讷, 他们是最聪
明的人,他们中的许多善于交际,健谈、兴趣广泛。
4,隐性的经验
好的程序员通常有自己的私人的一些研究、 爱好、 项目, 而这些是他们不写在简历上 (通 常觉得不值得写 ) ,但表现出来却可能恰恰是他的潜能、深度和后劲所在。
5,技术多样性
由于好的程序员喜欢学习和涉猎新技术,所以一般来说超过 22岁的都熟知很多新技术, 而且对多种技术的长短有 “强烈”的个人意见 /见解,喜好尝试新鲜技术。
6,资格证书
资格证书并不是识别真正程序员的方法, MCSE 、 SCJP 说明不了什么,它们只是让别 人认识和获取的,顶多代表这个人在某个技术有一定的知识。
原文作者在文末写道:以上所说的标准并不是绝对的, 因为有些优秀的程序员确实不符 合上述,而有些 bad 程序员却符合了。但相信这些对大多数真正的程序员都适用。
总结而言,优秀的程序员通常有一下特点:
对技术充满激情
将编程作为一种爱好
如果你允许会滔滔不绝地跟你谈论技术
有过个人的开发经历(与 4意思相同)
坚持认为某种技术最好
如果让他用他认为不好的技术他会非常别扭
聪明、健谈、兴趣广泛
在大学和工作前就开始接触程序
考试说明 编辑
1、 考试要求:
(1) 熟练掌握基本算法和数据结构,用 C 语言编制程序;
(2) 掌握 数据结构 、程序变速器和操作系统的基础知识;
(3) 了解软件工程、数据库、多媒体和网络的基础知识;
(4) 掌握数制、机内代码及其算术运算和逻辑运算的基础知识;
(5) 了解计算机的 体系结构 和主要部件的基础知识。
2、 通过本级水平考试的合格人员能按照软件设计说明书编制程序,具有相当于助理 工程师
的实际工作能力和业务水平。
3、 本级水平考试范围包括两个模块:模块 1——程序编制能力 (考试时间为 150分钟) ; 模
块 2——基础知识(程序员级)考试时间为 120分钟) 。题型为:单项选择题十多项选择 题。
考试范围 编辑
模块 1:程序编制能力
1.1按照 软件设计 说明书,能熟练使用下列程序语言编制程序
1.1.1C (美国标准)
1.2理解给定程序的功能,能发现程序中的错误并加以纠正
1.3具有良好的程序编制风格
1.4基本算法
1.4.1查找、更新、排序、合并及 字符 处理
1.4.2迭代 、插值、数值积分、矩阵计算、议程求解和搜索求解
1.5程序编制方法
1.5.1分支、循环、 子程序 (过程和函数) 、 递归
1.5.2输入输出和文件的处理
模块 2:基础知识(程序员级)
2.1软件基础知识
2.1.1数据结构基础
数组 、记录、列表(list ) 、 队列 、栈(stack ) 、堆(heap ) 、树和 二叉树 的定义、 存储 和操作
2.1.2程序语言基础知识
·汇编、编译、 解释系统 的基础知识
·程序语言的 数据类型
·程序语言的控制结构
2.1.3操作系统基础知识
·操作系统的类型和功能
·操作系统的层次结构和进程概念
·作业、 处理机 、存储、文件和设备等管理的基础知识
2.1.4软件工程基础知识
·软件生命周期各阶段的任务
·结构化分析和设计方法
·面向对象基本概念
·软件开发工具与环境基础知识
2.1.5数据库基础知识
·数据库模型
·数据库系统的结构
·SQL 的使用初步
·常用 数据库管理系统 的知识
2.1.6多媒体基础知识
·多媒体基本概念
·常用图象文件
·简单图形(线段和圆)的计算机图示
2.2硬件基础知识
2.2.1数制及其转换
·二进制、十进制和十六进制等常用数制及其相互转换
2.2.2机内代码
·原码、补码、反码、移码
·定点数与浮点数的机内表示
·ASCII 码及 汉字编码 等常用的编码
·奇偶校验码、 海明码 、 循环冗余码 (CRC )等常用校验方法 2.2.3算术运算和逻辑运算
·计算机中的二进制数运算方法
·逻辑代数的基本运算和逻辑表达式的化简
2.2.4计算机的体系结构和主要部件
·中央处理器 CPU 、 存储器 和输入 /输出设备
·总线结构、 指令流 和数据流
2.2.5指令系统
·常用的 寻址方式
·指令的格式、分类及功能 ·指令的执行过程
2.3网络基础知识
2.3.1网络的功能、分类与组成 2.3.2网络协议与标准
2.3.3网络结构与通信
2.3.4网络的安全性 2.3.5Client-Server 结构 2.3.6Internet 和 Intranet 初步
范文五:PHP程序员等级素质模型
PHP 程序员等级素质模型
初级 PHP 程序员(T1)
素质模型 :能够完成基本的 LNMP 系统安装,简单配置维护;能够做基本的简单系统的 PHP 开发;能够在 PHP 中型系统中支持某个 PHP 功能模块的开发。
1.Linux :
基本命令、 操作、 启动、 基本服务配置 (包括 rpm 包、 源码包安装文件, 各种服务配置等) 。
2.Nginx :
能 够 安 装 配 置 nginx+php, 知 道 基 本 的 nginx 核 心 配 置 选 项 , 知 道 server/fastcgi_pass/access_log 等基础配置信息,能够让 nginx+php_fpm顺利工作。
3.MySQL :
会自己搭建 mysql ,知道基本的 mysql 配置选项;知道 InnoDB 和 MyISAM 的区别,知道针对 InnoDB 和 MyISAM 两个引擎的不同配置选项; 知道基本的两个引擎的差异和选择上面的区别; 知道 MySQL 字段类型,知道如何选择 MySQL 的字段类型;能够纯手工编译搭建一个 MySQL 数据库且配置好编码等正常稳定运行。
4.PHP :
基本语法数组、字符串、数据库、 XML 、 Socket 、 GD/ImageMgk图片处理等等;熟悉各种跟 MySQL 操作链接的 api (mysql/mysqli/PDO), 知道各种编码问题的解决; 知道常规熟练使用 的 PHP 框架(ThinkPHP 、 Yii 、 Yaf 等) ;了解基本 MVC 的运行机制和为什么这么做,了解不 同的 PHP 框架之间的区别; 能够快速学习一个 MVC 框架。 能够知道开发工程中的文件目录架 构, 有基本的良好的代码结构和风格, 能够完成小系统的开发和中型系统中某个模块的开发 工作。
5. 前端:
了解 HTML/CSS/JS 等相关基础知识,知道什么 web 标准, div+css的 web/wap页面模式, 知道 HTML5和 HTML4的区别;了解一些基本的前端知识和 JS 框架(jQuery 之类的) ;了解 一些基本的 JavaScript 编程知识。
6. 系统设计:
能够完成小型系统的基本设计,包括简单的数据库设计,能够完成基本的:浏览器 -> Nginx+PHP -> 数据库 架构的设计开发工作。
中级 PHP 程序员(T2)
素质模型 :能够随时随地搭建好 LNMP 环境,快速完成常规配置;能够追查解决大部分遇到 的开发和线上环境的问题; 能够独立承担中型系统的构架和开发工作; 能够在大型系统中承 担某个中型模块的开发工作。
1. Linux:
在第一阶段的基础上面, 能够流畅的使用 Shell 脚本来完成很多自动化的工作 (数据库备份 等) ;会简单的 awk/sed/perl 操作,能够完成部分文本处理和数据统计等工作;能够安装 大 部 分 非 特 殊 的 Linux 程 序 (包 括 各 种 库 、 包 、 第 三 方 依 赖 等 等 , 比 如 Memcached/MongoDB/Redis/Sphinx之类的) ;了解基本的 Linux 服务,知道如何查看 Linux 的性能指标数据,知道基本的 Linux 环境下的问题跟踪等。
2. Nginx:
在第一阶段的基础上面, 了解复杂一些的 Nginx 配置; 包括多核配置、 events 、 proxy_pass, sendfile/tcp_*配置,知道超时等相关配置和性能影响;知道 nginx 除了 web server,还 能够承担代理服务器、 反向静态服务器等配置; 知道基本的 nginx 配置调优; 知道如何配置 权限、编译一个 nginx 扩展到 nginx ;知道基本的 nginx 运行原理(master/worker机制, epoll ) ,知道为什么 nginx 性能比 apache 性能好等知识。
3. MySQL/MongoDB:
在第一阶段的基础上面, 在 MySQL 开发方面, 掌握很多小技巧,包括常规 SQL 分析、性能优 化(group by/order by/rand优化等) 、索引优化;除了能够搭建 MySQL ,还能够冷热备份 MySQL 数 据 , 还 知 道 影 响 InnoDB/MyISAM性 能 的 配 置 选 项 (比 如 key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_ trx_commit等) ,也知道这些选项配置成为多少值合适;另外也了解一些特殊的配置选项, 比如 知道如何搭建 mysql 主从同步的环境,知道各个 binlog_format的区别;知道 MySQL 的性能追查,包括 slow_log/explain等,还能够知道基本的索引建立处理等知识;原理方 面了解基本的 MySQL 的架构 (Server+存储引擎) , 知道基本的 InnoDB/MyISAM索引存储结构 和不同 (聚簇索引, BTree , B+Tree) ; 知道基本的 InnoDB 事务处理机制; 了解大部分 MySQL 异常情况的处理方案(或者知道哪儿找到处理方案) 。
4. Redis/Memcached:
在大部分中型系统里面一定会涉及到缓存处理,所以一定要了解基本的缓存;知道 Memcached 和 Redis 的异同和应用场景,能够独立安装 Redis/Memcached,了解 Memcahed 的一些基本特性和限制,知道 PHP 跟他们的使用结合; Redis 了解基本工作原理和使用,了 解常规的数据类型, 知道什么场景应用什么类型, 了解 Redis 的事务等等。 原理部分, 能够 大概了解 Memcached 的内存结构(slab 机制) , redis 了解常用数据类型底层实现存储结构 (SDS/链表 /SkipList/HashTable)等等,顺便了解一下 Redis 的事务、 RDB 、 AOF 等机制更 好。
5. PHP:
除了第一阶段的能力,安装配置方面能够随意安装 PHP 和各种第三方扩展的编译安装配置;
了 解 php-fpm 的 大 部 分 配 置 选 项 和 含 义 (如 max_requests/max_children/request_terminate_timeout之类的影响性能的配置) ,知道 mod_php/fastcgi的区别; 在 PHP 方面已经能够熟练各种基础技术, 还包括各种深入些的 PHP , 包括对 PHP 面向对象的深入理解 /SPL/语法层面的特殊特性;在框架方面已经阅读过最少一 个以上常规 PHP MVC框架的代码了,知道基本 PHP 框架内部实现机制和设计思想;在 PHP 开发中已经能够熟练使用常规的设计模式来应用开发 (抽象工厂 /单例 /观察者 /命令链 /策略 /适配器 等模式) ; 建议开发自己的 PHP MVC 框架来充分让开发自由化, 让自己深入理解 MVC 模式, 也让自己能够在业务项目开发里快速升级; 熟悉 PHP 的各种代码优化方法, 熟悉大部 分 PHP 安全方面问题的解决处理;熟悉基本的 PHP 执行的机制原理(Zend 引擎 /扩展基本工 作机制) 。
6. C/C++:
开始涉猎一定的 C/C++语言,能够写基本的 C/C++代码,对基本的 C/C++语法熟悉(指针、 数组操作、 字符串、 常规标准 API ) 和数据结构 (链表、 树、 哈希、 队列) 有一定的熟悉下; 对 Linux 下面的 C 语言开发有基本的了解概念,会简单的 makefile 文件编写,能够使用简 单的 GCC/GDB的程序编译简单调试工作;对基本的网络编程有大概了解。
7. 前端:
在第一阶段的基础上面,熟悉基本的 HTTP 协议(协议代码 200/300/400/500,基本的 HTTP 交互头) ;条件允许,可以在深入写出稍微优雅的 HTML+CSS+JavaScript,或者能够大致简 单使用某些前端框架 (jQuery/Angular/React/RequireJS/BootStrap之类) ; 如果条件允许, 可以深入学习 JavaScript 编程,比如闭包机制、 DOM 处理;再深入些可以读读 jQuery 源码 做深入学习。
8. 系统设计:
能够设计大部分中型系统的网站架构、数据库、基本 PHP 框架选型;性能测试排查处理等; 能够完成类似:浏览器 -> CDN(Squid) -> Nginx+PHP -> 缓存 -> 数据库 结构网站的基本 设计开发维护;能够支撑每天数百万到千万流量基本网站的开发维护工作。
高级 PHP 程序员(T3)
素质模型 :除了能够完成基本的 PHP 业务开发, 还能够解决大部分深入复杂的技术问题, 并 且可以独立设计完成中大型的系统设计和开发工作; 自己能够独立 hold 深入某个技术方向, 在这块比较专业。 (比如在 MySQL 、 Nginx 、 PHP 、 Redis 等等任一方向深入研究)
1. Linux:
除了第二阶段的能力, 在 Linux 下面除了常规的操作和性能监控跟踪, 还能够使用很多高级 复杂的命令完成工作(watch/tcpdump/starce/ldd/ar/gdb/sar/free等 ) ;在 shell 脚本方 面, 已经能够编写比较复杂的 shell 脚本来协助完成很多包括备份、 自动化处理、 监控等工 作的 shell ;对 awk/sed/perl 等应用很熟练,能够随意操作控制处理文本统计分析各种复 杂格式的数据; 对 Linux 内部机制有一些了解, 对内核模块加载, 启动错误处理等等有个基 本的处理; 同时对一些其他相关的东西也了解, 比如 NFS 、 磁盘管理等等; 了解 Linux 集群、
负载均衡、容灾、数据同步等等。
2. Nginx:
在第二阶段的基础上面, 已经能够把 Nginx 操作的很熟练, 能够对 Nginx 进行更深入的运维 工作,比如监控、性能优化,复杂问题处理等等;深入学习过 Nginx 工作原理部分,主要表 现在阅读源码开始,比如具体的 master/worker工作机制, Nginx 内部的事件处理,内存管 理等等; 可以进行 Nginx 扩展的开发; 同时对 Nginx+Lua有一定程度的了解, 使用 Nginx+Lua开发过相关程序。
3. MySQL/MongoDB:
在第二阶段的基础上面, 在 MySQL 应用方面, 除了之前的基本 SQL 优化, 还能够在完成一些 复杂操作, 比如大批量数据的导入导出, 线上大批量数据的更改表结构或者增删索引字段等 等高危操作; 除了安装配置, 已经能够处理更多复杂的 MySQL 的问题, 比如各种问题的追查, 主从同步延迟问题的解决、跨机房同步数据方案、 MySQL 高可用架构等都有涉及了解;对 MySQL 应用层面,对 MySQL 的核心关键技术比较熟悉,比如事务机制(隔离级别、锁等) 、 对触发器、分区等技术有一定了解和应用;对 MySQL 性能方面,有包括磁盘优化(SAS 迁移 到 SSD ) 、服务器优化(内存、服务器本身配置) 、除了二阶段的其他核心性能优化选项 (innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_loc k_wait_timeout等) 、连接池软件选择应用,对 show *(show status/show profile )类的 操作语句有深入了解,能够完成大部分的性能问题追查; MySQL 备份技术的深入熟悉,包括 灾备还原、对 Binlog 的深入理解,冷热备份,多 IDC 备份等;在 MySQL 原理方面,有更多 了解,阅读源码了解 MySQL 的工作机制,比如主从同步(复制)技术的源码学习,或者某个 存储引擎(MyISAM/Innodb/Memery)的源码学习理解。 MongoDB 层面,能够做一些线上的数 据分析处理的操作,核心是要更好的深入理解 RMDBS 和 NoSQL 的不同场景下面的应用。
4. Redis/Memcached:
在第二阶段的基础上面, 能够对 Redis/Memcached进行更深入的应用。 因为 Memcached 不是 特别复杂,需对内存管理部分,阅读过源码或熟练掌握其原理; Redis 部分,做过一些复杂 的数据结构的应用 (zset 来做排行榜排序操作 /事务处理用来保证原子性在秒杀类场景应用 之类的使用操作) ;熟悉 aof 等同步机制的原理,可设计一个高可用的 Redis 应用架构和集 群。
5. PHP:
作为基础核心技能, 需要在第二阶段的基础上, 有更深入的学习和应用。 从基本代码应用上 面来说,能够解决在 PHP 开发中遇到 95%的问题,了解大部分 PHP 的技巧;对大部分的 PHP 框架能够迅速在一周内上手使用, 并且了解各个主流 PHP 框架的优缺点, 能够迅速方便项目 开发中做技术选型; 在配置方面, 除了常规第二阶段会的知识, 会了解一些比较偏门的配置 选项(php auto_prepend_file/auto_append_file) ,包括扩展中的一些复杂高级配置和原 理 (比 如 memcached 扩 展 配 置 中 的 memcache.hash_strategy、 apc 扩 展 配 置 中 的 apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection之类的) ; 对 php 的 工作机制比较了解, 包括 php-fpm 工作机制 (比如 php-fpm 在不同配置机器下面开启进程数 量计算以及原理) ,对 zend 引擎有基本熟悉(vm/gc/stream处理) ,阅读过基本的 PHP 内核 源码(或者阅读过相关文章) ,对 PHP 内部机制的大部分核心数据结构(基础类型 /Array/Object)实现有了解,对于核心基础结构(zval/hashtable/gc)有深入学习了解;
能够进行基本的 PHP 扩展开发,了解一些扩展开发的中高级知识(minit/rinit等) ,熟悉 php 跟 apache/nginx不同的通信交互方式细节(mod_php/fastcgi) 。
6. C/C++:
在第二阶段基础上面,在 C/C++语言方面有更深入的了解,能够完成中小型 C/C++系统的开 发工作;除了基本第二阶段的基础 C/C++语法和数据结构,能够掌握一些特殊数据结构 (b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工作中需求;在系统编 程方面,熟悉多进程、多线程编程; 多进程情况下面了解大部分多进程之间的通信方式,能 够灵活选择通信方式 (共享内存 /信号量 /管道等) ; 多线程编程能够良好的解决锁冲突问题, 并且能够进行多线程程序的开发调试工作;同时对网络编程比较熟悉,了解多进程模型 /多 线程模型 /异步网络 IO 模型的差别和选型,熟悉不同异步网络 IO 模型的原理和差异 (select/poll/epoll/iocp等 ) , 并 且 熟 悉 常 见 的 异 步 框 架 (ACE/ICE/libev/libevent/libuv/Boost.ASIO等)和使用,了解大部分 C/C++后端 Server 开发中的问题(内存管理、日志打印、高并发、前后端通信协议、服务监控) ,知道各个后 端服务 RPC 通信问题(struct/http/thirft/protobuf等) ;能够更熟络的使用 GCC 和 GDB 来开发编译调试程序,在线上程序 core 掉后能够迅速追查跟踪解决问题;通用模块开发方 面,开发过一些通用的工具或库(比如异步网络框架、日志库、内存池、线程池等) 。
7. 前端:
深入了解 HTTP 协议(包括各个细致协议特殊协议代码和背后原因,比如 302静态文件缓存 了, 502是 nginx 后面 php 挂了之类的) ;除了之前的前端方面的各种框架应用整合能力, 前端方面的学习如果有兴趣可以更深入,表现形式是,可以自己开发一些类似 jQuery 的前 端框架,或者开发一个富文本编辑器之类的比较琐碎考验 JavaScript 功力;
8. 系统设计:
系统设计在第二阶段的基础之上, 能够应用掌握的经验技能, 设计出比较复杂的中大型系统, 能够解决大部分线上的各种复杂系统的问题,完成类似 浏览器 -> CDN -> 负载均衡 ->接 入层 -> Nginx+PHP -> 业务缓存 -> 数据库 -> 各路复杂后端 RPC 交互(存储后端、逻辑 后端、 反作弊后端、 外部服务) -> 更多后端的复杂业务;能够支撑每天数千万到数亿流量 网站的正常开发维护工作。