导航:首页 > 程序命令 > 程序员提交代码不自测

程序员提交代码不自测

发布时间:2025-09-13 05:48:07

‘壹’ 如何做好一个大头兵

如何做好一个大头兵

作为互联网行业的大头兵,即干活的主力,主要负责执行,不承担系统架构业务和团队管理,对应到公司层级,大概对应阿里的P5-P6、字节1-2和2-1。要做好这一角色,需要掌握一系列技能和方法,以下从需求对接、技术方案、代码实现、测试和上线、闭环收尾等方面进行详细阐述。

一、需求对接

  1. 来自产品的需求

    排期问题:产品往往希望需求能迅速上线,但开发需评估实际情况,合理提出排期问题,避免盲目承诺导致无法按时完成。

    需求不明确问题:对于模糊或一句话的需求,务必与产品沟通清楚需求背景和关键交付物,确保理解一致后再开发,避免返工。

    技术可行性问题:若产品提出不切实际或成本过高的需求,需与技术leader或产品沟通,探讨替代方案。

  2. 来自技术leader的需求

    技术改进类:如性能优化、稳定性建设等,需按技术leader的指导执行,确保技术方案的落地。

    调研类需求:明确调研目标,及时记录和同步信息,确保调研结果对业务有实际帮助。

  3. 来自用户的需求

    若直接接到业务需求,需及时与产品、PM和leader同步,确保工作得到认可,避免默默付出却未被看见。

  4. 自己给自己找事干

    发现项目改进点时,不要盲目动手,应向上汇报,由leader判断或排期解决,避免产生新的问题。

二、技术方案

三、代码实现

四、测试和上线

五、闭环收尾

结语

做好一个大头兵,不仅需要在技术上不断精进,还需要在沟通、协作和汇报等方面不断提升。通过精准对接需求、制定并落实技术方案、高效实现代码、严谨测试和上线、及时闭环收尾,你将能够在团队中脱颖而出,成为值得信赖和依靠的主力军。

以上内容涵盖了程序员日常工作的绝大部分环节,希望对你有所帮助。

‘贰’ Java开发人员应当具备的哪些基本素质

1、积极,主动性:要主动的去学习,主动的去发现问题,跟进问题,其实很多技术类的问题都不是问题了。这个放在第一位的素质。
2、有风险提前抛出来:做项目肯定有风险,没有风险项目也就没有挑战了。需要每个开发同学能够主动的发现风险,并提出规避方案,如果没有规避方案,那提出来也行。
3、区分主次,合理规划:对于系统中的功能进行核心/非核心、主流程/非主流程、高优先级/低优先级的划分。优先完成出核心、主流程、高优先级的部分。避免铺地毯式的一步一步的逐步推进。
4、新的想法打算用在项目中的,自己提前搞demo验证过:有些同学,包括我自己,都会尝试一些新东西,例如新框架,新的工具等。但是有个前提,不要在项目开始或者进行中的时候才考虑用新东西试一下,项目一般都是有时间限制要求的。项目一般有预研阶段,这个时候,如果有新的想法,可以尝试做一些例子。为啥要这样呢?因为新东西有学习成本,这个倒是其次,有些新东西有坑在里面,因为这个世界没有银弹的方案。
5、主动承担没人负责的模块:有些模块的划分,可能没法划分到具体的人,因为可能是两个模块衔接的,这时候,如果时间允许,建议开发同学主动的承担一些没人负责的模块。例如两个模块的衔接、整体页面的安全方案考虑、单元测试的集成、持续集成等。
6、自己负责的部分完成之后帮助其他同事:项目内部人员的技术素质可能是参差不齐的,有些东西可能熟悉的人几个小时就能搞定,有的可能需要一天时间,这个时候,如果你熟悉一个模块,而另外一个同事不熟悉,你就可以帮助一下了。
7、代码注释充分:由于我们参与的大多是业务项目,有个特点就是复杂。这时候,就需要有充分的注释,当然是非常必要的环节才加。至于一看就能懂的,那就没有必要添加了。
8、代码自测充分,高质量的完成自己负责的模块:这个必须提一下,开发同学代码编写好了之后,需要提交给测试同学进行测试,有时候测试还分几轮。这时候,bug的情况体现了代码的质量,而质量的保证,除了经验和代码review之外,还需要自己完成一些自测的事情。尤其是主流程必须有,还有就是自己觉得一些边界的条件下。自测充分之后,后续bug就少,返工就少,讨论问题就少,省了很多时间的。
9、畅通的沟通氛围:项目中有各个角色,沟通必不可少,讨论过程中,注重沟通的方式,要做到对事不对人。
10、重构:写代码就像写文章,不是一蹴而就的。需要反复的修改和重构。当你发现代码重复、类结构不合理的时候,或者自我对代码感觉不太好的时候,就去重构。
11、编码前充分设计:编码前宁可多花时间进行方案的详细设计,千万不要一接到需求就进行编码。提前进行详细设计,会缩短编码的时间,也会降低bug的发生。
12、学会换位思考:一个项目是需要多方协作的,不同的人必然会有不同的想法,因为大家的知识积累以及经验积累肯定不一样,在大家想法不一致的时候,可以更多的是做个换位思考,先理解对方的观点,了解这个观点背后的原因,然后再来反观自己的想法,同时在互相理解的基础上,做事情的默契和结果也会有很大的提升;
•在协助中多一些换位思考,多站在对方的角度思考和理解问题,最后大家在协作中能够实现共赢;
•开发功能之前站在用户的角度去思考,假如你作为业务用户,你对这个功能会有什么样的需求。
13、责任心:这个放在最后,其实并不是说排名在最后,这个我认为也是很重要的,试想一个没有责任性的人写出来的代码,别人能信得过吗。写代码前要进行深度的思考。写完后要对自己的代码进行充分的测试。上线前需要反复确认自己的代码有没有问题

‘叁’ 怎么样才算是真正合格的程序员

作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具有的素质。
1:团队精神和协作能力把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linus这样的天才,也需要通过组成强大的团队来创造奇迹,那些遍布全球的为linux写核心的高手们,没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财,但是一旦进入一些大系统的研发团队,进入商业化和产品化的开发任务,缺乏这种素质的人就完全不合格了。
2:文档习惯说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子,良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。
3:规范化,标准化的代码编写习惯作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。
有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂,这种叫嚣只能证明他们自己压根不配自称程序员。代码具有良好的可读性,是程序员基本的素质需求。
再看看整个linux的搭建,没有规范化和标准化的代码习惯,全球的研发协作是绝对不可想象的。
4:需求理解能力程序员需要理解一个模块的需求,很多小朋友写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件,操作系统和开发环境上,而忽视了本身代码的性能考虑,有人曾经放言说写一个广告交换程序很简单,这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的,对于这样的程序员,你给他深蓝那套系统,他也做不出太极链的并访能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才有可能有心得。
5:复用性,模块化思维能力经常可以听到一些程序员有这样的抱怨,写了几年程序,变成了熟练工,每天都是重复写一些没有任何新意的代码,这其实是中国软件人才最大浪费的地方,一些重复性工作变成了熟练程序员的主要工作,而这些,其实是完全可以避免的。
复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代码工作中去。
一些好的程序模块代码,即便是70年代写成的,拿到现在放到一些系统里面作为功能模块都能适合的很好,而现在我看到的是,很多小公司软件一升级或改进就动辄全部代码重写,大部分重复性工作无谓的浪费了时间和精力。6:测试习惯作为一些商业化正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师程序员就可以不进行自测;软件研发作为一项工程而言,

‘肆’ 开发人员不固定容易造成哪些问题

1.程序编写不能有逻辑性,传承性,导致程序前后冲突,臃肿,运行缓慢
2.不能形成BUG list历史
3.缺少自测:开发人员缺少自测主要是太过于自信,对自己开发的软件下不了手也是很多开发人员的通病,开发人员往往过于自信,认为自己开发出的功能应该没有问题,导致测试力度不够;
4.缺少沟通:有效的沟通可以避免很多问题的发生,也可以避免重复劳动,便于开发的顺利进行;通过与开发经理之间的沟通,可以学到很多敏捷开发的方法,少走很多弯路;通过与开发人员之间的沟通,可以了解很多相互借鉴的地方,互相充补,并且还可以了解公用资源,避免工作冗余;通过与设计人员之间的沟通,可以学到很多设计理念,有助于更深入的理解需求设计等;但沟通不能流于形式,要达到应有的目的,在我们开发过程中,经常会遇到需求分析人员编写的需求文档设计人员看不懂、设计人员编写的设计文档开发人员看不懂、开发人员编写的软件测试人员看不懂,这些都是无效沟通的结果;例如:开发过程中有时会发现,有些开发人员遇到不明白的问题,他不去问、不去跟其它同事交流,而是自己闷头去想,等问题想明白了,代码也写完了,却发现原来自己写的功能或某个函数公用库里已经有了,直接拿来调用就可以,这样不仅浪费了时间还做了无用功。
5.只解决问题不思考问题:开发人员在处理问题时可以用“兵来将挡、水来土掩”来形容,能及时无误的解决问题,还不能算是好的开发人员,好的开发人员还应该善于思考、总结,在解决完问题的情况下,分析问题出现的原因,在那个阶段出现的,由什么原因引起的,并总结出在以后的开发过程中如何避免的方法,保证在同一阶段不会再犯类似的错误,这样才能算一名合格的开发人员;例如:开发或维护过程中有时我们会遇到比较棘手的问题,跟踪调试半天才会有结果,最终把问题解决掉,问题解决后,有些开发人员会去分析问题的原因及解决方法,而有些开发人员则认为万事大吉,就怕再提起该问题,更别说再去分析了;在我们现实的开发或维护中,会发现很多不足,有时只顾着处理问题,而忽略了分析问题,治标不治本,虽然问题解决了,但对开发人员的成长意义不大,所以开发人员要多思考、多研究。

‘伍’ 一个成功的程序员需要具备哪些素质

程序员是一种技术工作.在IT的发展中有相当重要的地位.从底层硬件通讯协议的建立. 到数据传输层的处理.到操作系统的建设.到数据库平台的建设.一直到应用层上各种数 据营销平台的搭建.程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大 的贡献.
中国有很多精于编码的人.但是中国软件行业.尤其是网络应用开发方面误区很大.很难形成有规模的软件开发力量和产品能力.不但比美国差距甚远.和印度相比也是颇有不 如.这些问题不是在于中国程序员的智商和工作努力状况.也不是在于国家和民间对开发 的投入程度.而是很大程度上.有一些对技术.对程序开发.对项目设计方面的思想误 区.这些误区.导致了软件行业的产品化能力不足.缺乏规模化和大型复用系统研发能 力.可以说.改变认识误区.是解决软件行业小作坊模式和个体英雄模式所带来的局限性 的重要工作.
中国有很多小朋友.他们18.9岁或21.2岁.通过自学也写了不少代码.他们有的代码写的很漂亮.一些技术细节相当出众.也很有钻研精神.但是他们被一些错误的认识和观点左右.缺乏对系统.对程序的整体理解能力.这些人.一个网上的朋友说得很好.他们实际 上只是一些Coding fans.压根没有资格称为程序员.但是据我所知.不少小网络公司的 CTO就是这样的coding fans.拿着吓人的工资.做着吓人的项目.项目的结局通常也很吓人.
一.程序员基本素质
作一个真正合格的程序员.或者说就是可以真正合格完成一些代码工作的程序员.应该具有的素质.
1:团队精神和协作能力
把它作为基本素质.并不是不重要.恰恰相反.这是程序员应该具备的最基本的.也是最 重要的安身立命之本.把高水平程序员说成独行侠的都是在呓语.任何个人的力量都是有 限的.即便如linus这样的天才.也需要通过组成强大的团队来创造奇迹.那些遍布全球 的为linux写核心的高手们.没有协作精神是不可想象的.独行侠可以作一些赚钱的小软 件发点小财.但是一旦进入一些大系统的研发团队.进入商业化和产品化的开发任务.缺 乏这种素质的人就完全不合格了.
2:文档习惯
说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子.良好的文档是正规研发流程中 非常重要的环节.作为代码程序员.30%的工作时间写技术文档是很正常的.而作为高级 程序员和系统分析员.这个比例还要高很多.
缺乏文档.一个软件系统就缺乏生命力.在未来的查错.升级以及模块的复用时就都会遇 到极大的麻烦.
3:规范化.标准化的代码编写习惯
作为一些外国知名软件公司的规矩.代码的变量命名.代码内注释格式.甚至嵌套中行缩 进的长度和函数间的空行数字都有明确规定.良好的编写习惯.不但有助于代码的移植和 纠错.也有助于不同技术人员之间的协作.
有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂.这种叫嚣只能证明他们自 己压根不配自称程序员.代码具有良好的可读性.是程序员基本的素质需求.
再看看整个linux的搭建.没有规范化和标准化的代码习惯.全球的研发协作是绝对不可 想象的.
4:需求理解能力
程序员需要理解一个模块的需求.很多小朋友写程序往往只关注一个功能需求.他们把性 能指标全部归结到硬件.操作系统和开发环境上.而忽视了本身代码的性能考虑.有人曾 经放言说写一个广告交换程序很简单.这种人从来不知道在百万甚至千万数量级的访问情 况下的性能指标是如何实现的.对于这样的程序员.你给他深蓝那套系统.他也做不出太 极链的并访能力.性能需求指标中.稳定性.并访支撑能力以及安全性都很重要.作为程 序员需要评估该模块在系统运营中所处的环境.将要受到的负荷压力以及各种潜在的危险 和恶意攻击的可能性.就这一点.一个成熟的程序员至少需要2到3年的项目研发和跟踪经 验才有可能有心得.
5:复用性.模块化思维能力
经常可以听到一些程序员有这样的抱怨.写了几年程序.变成了熟练工.每天都是重复写 一些没有任何新意的代码.这其实是中国软件人才最大浪费的地方.一些重复性工作变成 了熟练程序员的主要工作.而这些.其实是完全可以避免的.
复用性设计.模块化思维就是要程序员在完成任何一个功能模块或函数的时候.要多想一 些.不要局限在完成当前任务的简单思路上.想想看该模块是否可以脱离这个系统存在. 是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用.这样就能极大避 免重复性的开发工作.如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到 这些问题.那么程序员就不会在重复性的工作中耽误太多时间.就会有更多时间和精力投 入到创新的代码工作中去.
一些好的程序模块代码.即便是70年代写成的.拿到现在放到一些系统里面作为功能模块 都能适合的很好.而现在我看到的是.很多小公司软件一升级或改进就动辄全部代码重 写.大部分重复性工作无谓的浪费了时间和精力.
6:测试习惯
作为一些商业化正规化的开发而言.专职的测试工程师是不可少的.但是并不是说有了专 职的测试工程师程序员就可以不进行自测,软件研发作为一项工程而言.一个很重要的特 点就是问题发现的越早.解决的代价就越低.程序员在每段代码.每个子模块完成后进行 认真的测试.就可以尽量将一些潜在的问题最早的发现和解决.这样对整体系统建设的效 率和可靠性就有了最大的保证.
测试工作实际上需要考虑两方面.一方面是正常调用的测试.也就是看程序是否能在正常 调用下完成基本功能.这是最基本的测试职责.可惜在很多公司这成了唯一的测试任务. 实际上还差的远那,第二方面就是异常调用的测试.比如高压力负荷下的稳定性测试.用 户潜在的异常输入情况下的测试.整体系统局部故障情况下该模块受影响状况的测试.频 发的异常请求阻塞资源时的模块稳定测试等等.当然并不是程序员要对自己的每段代码都 需要进行这种完整测试.但是程序员必须清醒认识自己的代码任务在整体项目中的地位和 各种性能需求.有针对性的进行相关测试并尽早发现和解决问题.当然这需要上面提到的 需求理解能力.
7:学习和总结的能力
程序员是人才很容易被淘汰.很容易落伍的职业.因为一种技术可能仅仅在三两年内具有 领先性.程序员如果想安身立命.就必须不断跟进新的技术.学习新的技能.
善于学习.对于任何职业而言.都是前进所必需的动力.对于程序员.这种要求就更加高 了.
但是学习也要找对目标.一些小coding fans们.他们也津津乐道于他们的学习能力.一 会学会了asp.一会儿学会了php.一会儿学会了jsp.他们把这个作为炫耀的资本.盲目 的追逐一些肤浅的.表面的东西和名词.做网络程序不懂通讯传输协议.做应用程序不懂 中断向量处理.这样的技术人员.不管掌握了多少所谓的新语言.永远不会有质的提 高.
善于总结.也是学习能力的一种体现.每次完成一个研发任务.完成一段代码.都应当有 目的的跟踪该程序的应用状况和用户反馈.随时总结.找到自己的不足.这样逐步提高. 一个程序员才可能成长起来.
一个不具备成长性的程序员.即便眼前看是个高手.建议也不要选用.因为他落伍的时候 马上就到了.
具备以上全部素质的人.应当说是够格的程序员了.请注意以上的各种素质都不是由IQ决 定的.也不是大学某些课本里可以学习到的.需要的仅仅是程序员对自己工作的认识.是一种意识上的问题.

‘陆’ 如何编写高质量的代码

1. 打好基础
写出高质量代码,并不是搭建空中楼阁,需要有一定的基础,这里我重点强调与代码质量密切相关的几点:
掌握好开发语言,比如做Android就必须对Java足够熟悉,《Effective Java》一书就是教授大家如何更好得掌握Java, 写出高质量Java代码。
熟悉开发平台, 不同的开发平台,有不同的API, 有不同的工作原理,同样是Java代码,在PC上写与Android上写很多地方不一样,要去熟悉Android编程的一些特性,iOS编程的一些特性,了解清楚这些,才能写出更加地道的代码,充分发挥各自平台的优势。
基础的数据结构与算法,掌握好这些在解决一些特定问题时,可以以更加优雅有效的方式处理。
基础的设计原则,无需完全掌握23种经典设计模式,只需要了解一些常用的设计原则即可,甚至你也可以只了解什么是低耦合,并在你的代码中坚持实践,也能写出很不错的代码。
2. 代码标准
代码标准在团队合作中尤为重要,谁也不希望一个项目中代码风格各异,看得让人糟心,即便是个人开发者,现在也需要跟各种开源项目打交道。标准怎么定是一个老生常谈的话题,我个人职业生涯中经历过很多次的代码标准讨论会议,C++, C#, Java等等,大家有时会坚持自己的习惯不肯退让。可现如今时代不一样了,Google等大厂已经为我们制定好了各种标准,不用争了,就用这些业界标准吧。
3. 想好再写
除非你很清楚你要怎么做,否则我不建议边做边想。
你真的搞清楚你要解决的问题是什么了吗?你的方案是否能有效?有没有更优雅简单的方案?准备怎么设计它,必要的情况下,需要有设计文档,复杂一些的设计需要有同行评审,写代码其实是很简单的事情,前提是你得先想清楚。
4. 代码重构
重构对于代码质量的重要性不言而喻,反正我是很难一次把代码写得让自己满意、无可挑剔,《重构》这本书作为业内经典也理应人人必读,也有其他类似的教授重构技巧的书,有些也非常不错,遗憾的是我发现很多工作多年的同学甚至都没有了解过重构的概念。
5. 技术债务
知乎上最近有个热门问题《为什么有些大公司技术弱爆了?》,其实里面提到的很多归根结底都是技术债务问题,这在一些大公司尤为常见。技术债务话题太大,但就代码质量而言,我只想提一下不要因为这些债是前人留下的你就不去管,现实是没有多少机会让你从一个清爽清新的项目开始做起,你不得不去面对这些,你也没法完全不跟这些所谓的烂代码打交道。
因此我建议各位:当你负责一个小模块时,除了把它做好之外,也要顺便将与之纠缠在一起的技术债务还掉,因为这些债务最终将是整个团队来共同承担,任何一个人都别想独善其身,如果你还对高质量代码有追求的话。
作为团队的技术负责人,也要顶住压力,鼓励大家勇于做出尝试,引导大家不断改进代码质量,不要总是畏手畏脚,停滞不前,真要背锅也得上,要有担当。
6. 代码审查
我曾经听过一些较高级别的技术分享,竟然还不时听到一些呼吁大家要做代码审查的主题,我以为在这个级别的技术会议上,不应再讨论代码审查有什么好,为什么要做代码审查之类的问题。同时我接触过相当多所谓国内一线互联网公司,竟有许多是不做代码审查的,这一度让我颇为意外。
这里也不想多谈如何做好代码审查,只是就代码质量这点,不客气地说:没有过代码审查经历的同学,往往很难写出高质量的代码,尤其是在各种追求速度的糙快猛创业公司。
7. 静态检查
很多代码上的问题,都可以通过一些工具来找到,某些场景下,它比人要靠谱得多,至少不会出现某些细节上的遗漏,同时也能有效帮助大家减少代码审查的工作量。
Android开发中有Lint, Find bugs, PMD等优秀静态检查工具可用,通过改进这些工具找出的问题,就能对语法的细节,规范,编程的技巧有更多直观了解。
建议最好与持续集成(CI),代码审查环境配套使用, 每次提交的代码都能自动验证是否通过了工具的代码检查,通过才允许提交。
8. 单元测试
Android单元测试,一直备受争议,主要还是原生的测试框架不够方便,每跑一次用例需要在模拟器或者真机上运行,效率太低,也不方便在CI环境下自动构建单元测试,好在有Robolectric,能帮我们解决部分问题。
单元测试的一个非常显着的优点是,当你需要修改大量代码时,尽管放心修改,只需要保证单元测试用例通过即可,无需瞻前顾后。
9. 充分自测
有一种说法:程序员最害怕的是他自己写的代码,尤其是准备在众人面前show自己的工作成果时,因此在写完代码后,需要至少跑一遍基本的场景,一些简单的异常流。在把你的工作成果提交给测试或用户前,充分自测是基本的职业素养,不要总想着让测试帮你找问题,随便用几下就Crash的东西,你好意思拿给别人吗?
10. 善用开源
并非开源的东西,质量就高,但至少关注度较高,使用人数较多,口碑较好的开源项目,质量是有一定保证的,这其中的道理很简单。即便存在一些问题,也可以通过提交反馈,不断改进。最重要的是,你自己花时间造的轮子,需要很多精力维护,而充分利用开源项目,能帮助你节省很多时间,把精力专注在最需要你关心的问题上。

‘柒’ 系统程序员,主要学会那些技能,如何做好一个系统程序员,需要注意事项有哪些

程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立, 到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数 据营销平台的搭建,程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大 的贡献。 中国有很多精于编码的人,但是中国软件行业,尤其是网络应用开发方面误区很大,很难形成有规模的软件开发力量和产品能力,不但比美国差距甚远,和印度相比也是颇有不如。这些问题不是在于中国程序员的智商和工作努力状况,也不是在于国家和民间对开发的投入程度,而是很大程度上,有一些对技术,对程序开发,对项目设计方面的思想误区,这些误区,导致了软件行业的产品化能力不足,缺乏规模化和大型复用系统研发能力,可以说,改变认识误区,是解决软件行业小作坊模式和个体英雄模式所带来的局限性 的重要工作。 中国有很多小朋友,他们18,9岁或21,2岁,通过自学也写了不少代码,他们有的代码写的很漂亮,一些技术细节相当出众,也很有钻研精神,但是他们被一些错误的认识和观点左右,缺乏对系统,对程序的整体理解能力,这些人,一个网上的朋友说得很好,他们实际 上只是一些Coding fans,压根没有资格称为程序员,但是据我所知,不少小网络公司的 CTO就是这样的coding fans,拿着吓人的工资,做着吓人的项目,项目的结局通常也很吓 人。 程序员基本素质: 作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具 有的素质。 1:团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linus这样的天才,也需要通过组成强大的团队来创造奇迹,那些遍布全球的为linux写核心的高手们,没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财,但是一旦进入一些大系统的研发团队,进入商业化和产品化的开发任务,缺 乏这种素质的人就完全不合格了。 2:文档习惯 说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子,良好的文档是正规研发流程中 非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级 程序员和系统分析员,这个比例还要高很多。 缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇 到极大的麻烦。 3:规范化,标准化的代码编写习惯 作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩 进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和 纠错,也有助于不同技术人员之间的协作。 有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂,这种叫嚣只能证明他们自 己压根不配自称程序员。代码具有良好的可读性,是程序员基本的素质需求。 再看看整个linux的搭建,没有规范化和标准化的代码习惯,全球的研发协作是绝对不可 想象的。 4:需求理解能力 程序员需要理解一个模块的需求,很多小朋友写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件,操作系统和开发环境上,而忽视了本身代码的性能考虑,有人曾经放言说写一个广告交换程序很简单,这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的,对于这样的程序员,你给他深蓝那套系统,他也做不出太极链的并访能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经 验才有可能有心得。 5:复用性,模块化思维能力 经常可以听到一些程序员有这样的抱怨,写了几年程序,变成了熟练工,每天都是重复写 一些没有任何新意的代码,这其实是中国软件人才最大浪费的地方,一些重复性工作变成 了熟练程序员的主要工作,而这些,其实是完全可以避免的。 复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投 入到创新的代码工作中去。 一些好的程序模块代码,即便是70年代写成的,拿到现在放到一些系统里面作为功能模块 都能适合的很好,而现在我看到的是,很多小公司软件一升级或改进就动辄全部代码重 写,大部分重复性工作无谓的浪费了时间和精力。 程序员应具备的素质中 6:测试习惯 作为一些商业化正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师程序员就可以不进行自测;软件研发作为一项工程而言,一个很重要的特点就是问题发现的越早,解决的代价就越低,程序员在每段代码,每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题最早的发现和解决,这样对整体系统建设的效 率和可靠性就有了最大的保证。 测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责,可惜在很多公司这成了唯一的测试任务,实际上还差的远那;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试,但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求,有针对性的进行相关测试并尽早发现和解决问题,当然这需要上面提到的 需求理解能力。 7:学习和总结的能力 程序员是人才很容易被淘汰,很容易落伍的职业,因为一种技术可能仅仅在三两年内具有 领先性,程序员如果想安身立命,就必须不断跟进新的技术,学习新的技能。 善于学习,对于任何职业而言,都是前进所必需的动力,对于程序员,这种要求就更加高 了。 但是学习也要找对目标,一些小coding fans们,他们也津津乐道于他们的学习能力,一会学会了asp,一会儿学会了php,一会儿学会了jsp,他们把这个作为炫耀的资本,盲目的追逐一些肤浅的,表面的东西和名词,做网络程序不懂通讯传输协议,做应用程序不懂中断向量处理,这样的技术人员,不管掌握了多少所谓的新语言,永远不会有质的提 高。 善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有 目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足,这样逐步提高, 一个程序员才可能成长起来。 一个不具备成长性的程序员,即便眼前看是个高手,建议也不要选用,因为他落伍的时候 马上就到了。 具备以上全部素质的人,应当说是够格的程序员了,请注意以上的各种素质都不是由IQ决 定的,也不是大学某些课本里可以学习到的,需要的仅仅是程序员对自己工作的认识,是 一种意识上的问题。 那么作为高级程序员,以至于系统分析员,也就是对于一个程序项目的设计者而言,除了 应该具备上述全部素质之外,还需要具备以下素质: 第一,需求分析能力 对于程序员而言,理解需求就可以完成合格的代码,但是对于研发项目的组织和管理者, 他们不但要理解客户需求,更多时候还要自行制定一些需求,为什么这么说呢? 一般而言,进行研发任务,也许是客户提出需求,也许是市场和营销部门提出的需求,这时候对于研发部门,他们看到的不是一个完整的需求,通常而言,该需求仅仅是一些功能上的要求,或者更正规些,可能获得一个完整的用户视图;但是这都不够,因为客户由于非技术因素多一些,他们可能很难提出完整和清晰,或者说专业性的性能需求,但是对于项目组织者和规划者,他必须能够清醒认识到这些需求的存在并在完成需求分析报告的时候适当的提出,同时要完整和清晰的体现在设计说明书里面,以便于程序员编码时不会失 去这些准则。 程序设计者必须正确理解用户需求所处的环境,并针对性做出需求的分析,举例而言,同样一个软件通过ASP租用方式发布和通过License方式发布,性能需求可能就是有区别的,前者强调的是更好的支撑能力和稳定性,而后者则可能更强调在各种平台下的普适性和安 装使用的简捷性。 第二,项目设计方法和流程处理能力 程序设计者必须能够掌握不少于两到三种的项目设计方法(比如自顶至下的设计方法,比 如快速原型法等等),并能够根据项目需求和资源搭配来选择合适的设计方法进行项目的 整体设计。 设计方法上选择不当,就会耽误研发周期,浪费研发资源,甚至影响研发效果。 一个程序设计者还需要把很多功夫用在流程图的设计和处理上,他需要做数据流图以确立 数据词典;他需要加工逻辑流图以形成整体的系统处理流程。 一个流程有问题的系统,就算代码多漂亮,每个模块多精致,也不会成为一个好的系统。 当然,做好流程分析并选择好项目设计方法,都需要在需求分析能力上具有足够的把 握。 第三,复用设计和模块化分解能力 这个似乎又是老调重谈,前面基本素质上不是已经说明了这个问题吗? 作为一个从事模块任务的程序员,他需要对他所面对的特定功能模块的复用性进行考虑,而作为一个系统分析人员,他要面对的问题复杂的多,需要对整体系统按照一种模块化的分析能力分解为很多可复用的功能模块和函数,并针对每一模块形成一个独立的设计需求。举个例子,好比是汽车生产,最早每辆汽车都是独立安装的,每个部件都是量身定做的,但是后来不一样了,机器化大生产了,一个汽车厂开始通过流水线来生产汽车,独立部件开始具有一定的复用性,在后来标准化成为大趋势,不同型号,品牌甚至不同厂商的汽车部件也可以进行方便的换装和升级,这时候,汽车生产的效率达到最大化。软件工程也是同样的道理,一个成熟的软件行业,在一些相关项目和系统中,不同的部件是可以随意换装的,比如微软的许多桌面软件,在很多操作模块(如打开文件,保存文件等等)都是复用的同一套功能模块,而这些接口又通过一些类库提供给了桌面应用程序开发者方便 挂接,这就是复用化的模块设计明显的一个佐证。 将一个大型的,错综复杂的应用系统分解成一些相对独立的,具有高度复用性的,并能仅 仅依靠几个参数完成数据联系的模块组合,是作为高级程序员和系统分析员一项最重要的 工作,合适的项目设计方法,清晰的流程图,是实现这一目标的重要保证。 第四,整体项目评估能力 作为系统设计人员,必须能够从全局出发,对项目又整体的清醒认识,比如公司的资源配置是否合理和到位,比如工程进度安排是否能最大化体现效率又不至于无法按期完成。评估项目整体和各个模块的工作量,评估项目所需的资源,评估项目可能遇到的困难,都需要大量的经验积累,换言之,这是一种不断总结的累计才能达到的境界。在西方一些软件系统设计的带头人都是很年长的,比如4,50岁,甚至更老,他们在编码方面已经远远不如年轻人那样活络,但是就项目评估而言,他们几十年的经验积累就是最重要和宝贵的财富。中国缺这么一代程序员,主要还不是缺那种年纪的程序员,而是那种年纪的程序员基本上都是研究单位作出来的,都不是从专业的产品化软件研发作出来的,他们没有能积累 那种产品化研发的经验,这也是没有办法的事情。 程序员应具备的素质下 第五,团队组织管理能力 完成一个项目工程,需要团队的齐心协力,作为项目设计者或研发的主管人,就应当有能 力最大化发挥团队的整体力量,技术管理由于其专业性质,不大同于一般的人事管理,因 为这里面设计了一些技术性的指标和因素。 首先是工作的量化,没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码 行数可以计算的,因此要求技术管理人员需要能真正评估一个模块的复杂性和工作量。 其次是对团队协作模式的调整,一般而言,程序开发的协作通常分为小组进行,小组有主 程序员方式的,也有民主方式的,根据程序员之间的能力水平差距,以及根据项目研发的 需求,选择合适的组队方式,并能将责权和成员的工作任务紧密结合,这样才能最大发挥 组队的效率。 一个代码水平高的人,未必能成为一个合格的项目研发主管,这方面的能力欠缺往往是容 易被忽视的。 综上可以看到,作为一个主管研发的负责人,一个项目设计者,所需要具备的素质和能力并不是程序代码编写的能力,当然一般情况下,一个程序员通过不断的总结提高达到了这种素质的时候,他所具有的代码编写能力也已经相当不简单了,但是请注意这里面的因果关系,一个高水平的项目设计者通常已经是代码编写相当优秀的人了,但是并不是一个代码相当优秀的程序员就可以胜任项目设计的工作,这里面存在的也不是智商和课本的问题,还是在于一个程序员在积累经验,逐步提升的时候没有意识到应当思考哪方面的东西,没有有意识的就项目的组织和复用设计进行揣摩,没有经常性的文档习惯和总结习 惯,不改变这些,我们的合格的项目设计者还是非常欠缺。 另外,为防止有无聊的人和我较真,补充一点,本文针对目标是作商业化的软件项目和工程,那些科研机构的编程高手,比如算法高手,比如图象处理高手,他们的工作是研究课题而非直接完成商业软件(当然最终间接成为商业产品,比如微软研究院在作的研究课题),因此他们强调的素质可能是另外的东西,这些人(专家),并不能说是程序员,不 能用程序员的标准去衡量。 最后补充一点东西,一个软件项目研发的设计流程是怎样的呢?以通常标准的设计方法为 例,(不过笔者喜欢快速原型法)。 第一个步骤是市场调研,技术和市场要结合才能体现最大价值。 第二个步骤是需求分析,这个阶段需要出三样东西,用户视图,数据词典和用户操作手 册。 用户视图是该软件用户(包括终端用户和管理用户)所能看到的页面样式,这里面包含了 很多操作方面的流程和条件。 数据词典是指明数据逻辑关系并加以整理的东东,完成了数据词典,数据库的设计就完成 了一半多。 用户操作手册是指明了操作流程的说明书。 请注意,用户操作流程和用户视图是由需求决定的,因此应该在软件设计之前完成,完成 这些,就为程序研发提供了约束和准绳,很遗憾太多公司都不是这样做的,因果颠倒,顺 序不分,开发工作和实际需求往往因此产生隔阂脱节的现象。 需求分析,除了以上工作,笔者以为作为项目设计者应当完整的做出项目的性能需求说明 书,因为往往性能需求只有懂技术的人才可能理解,这就需要技术专家和需求方(客户或 公司市场部门)能够有真正的沟通和了解。 第三个步骤是概要设计,将系统功能模块初步划分,并给出合理的研发流程和资源要求。作为快速原型设计方法,完成概要设计就可以进入编码阶段了,通常采用这种方法是因为涉及的研发任务属于新领域,技术主管人员一上来无法给出明确的详细设计说明书,但是并不是说详细设计说明书不重要,事实上快速原型法在完成原型代码后,根据评测结果和 经验教训的总结,还要重新进行详细设计的步骤。 第四个步骤是详细设计,这是考验技术专家设计思维的重要关卡,详细设计说明书应当把具体的模块以最’干净’的方式(黑箱结构)提供给编码者,使得系统整体模块化达到最大;一份好的详细设计说明书,可以使编码的复杂性减低到最低,实际上,严格的讲详细设计说明书应当把每个函数的每个参数的定义都精精细细的提供出来,从需求分析到概要设计到完成详细设计说明书,一个软件项目就应当说完成了一半了。换言之,一个大型软 件系统在完成了一半的时候,其实还没有开始一行代码工作。 那些把作软件的程序员简单理解为写代码的,就从根子上犯了错误了。 第五个步骤是编码,在规范化的研发流程中,编码工作在整个项目流程里最多不会超过1/ 2,通常在1/3的时间,所谓磨刀不误砍柴功,设计过程完成的好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心的,也许一个小模块的问题就可能影响了整体进度,让很多程序员因此被迫停下工作等待,这种问题在很多研发过程中都出现过。编码时的相互沟通和应急的解决手段都是相当重要的,对于程序员而言,bug永远存在,你必须永远面对这个问题,大名鼎鼎的微软,可曾有连续三个月不发补丁的时候 吗?从来没有! 第六个步骤是测试 测试有很多种: 按照测试执行方,可以分为内部测试和外部测试 按照测试范围,可以分为模块测试和整体联调 按照测试条件,可以分为正常操作情况测试和异常情况测试 按照测试的输入范围,可以分为全覆盖测试和抽样测试 以上都很好理解,不再解释。 总之,测试同样是项目研发中一个相当重要的步骤,对于一个大型软件,3个月到1年的外 部测试都是正常的,因为永远都会又不可预料的问题存在。 完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落,当然日后少 不了升级,修补等等工作,只要不是想通过一锤子买卖骗钱,就要不停的跟踪软件的运营 状况并持续修补升级,知道这个软件被彻底淘汰为止。 写这些步骤算不上卖弄什么,因为实话讲我手边是一本《软件工程》,在大学里这是计算机专业的必修课程,但是我知道很多程序员似乎从来都只是热衷于什么《30天精通VC》之类的,他们有些和我一样游击队出身,没有正规学过这个专业,还有一些则早就在混够学 分后就把这些真正有用的东西还给了老师。 网上现在也很浮躁,一些coding fans乱嚷嚷,混淆视听,实际上真正的技术专家很少在网上乱发帖子的,如笔者这样不知天高地厚的,其实实在是算不上什么高手,只不过看不惯这种对技术,对程序员的误解和胡说,只好挺身而出,做拨乱反正之言,也希望那些还 沉迷于一些错误人士的coding fans们能认真想想,走到正途上,毕竟那些聪明的头脑还 远远没有发挥应有的价值。

阅读全文

与程序员提交代码不自测相关的资料

热点内容
挂机脚本命令 浏览:47
vhdl编程软件 浏览:106
sparkjava编程 浏览:997
私活给源码吗 浏览:509
如何在虚拟机里安装服务器 浏览:841
vs2022如何编译c语言 浏览:75
自学数控车床编程 浏览:195
服务器地址一般在哪找 浏览:328
北京bgp服务器租用云主机 浏览:130
android美化ui 浏览:69
我的世界卖东西服务器指令是什么 浏览:651
违抗命令罪 浏览:208
空间加密对方不能进去 浏览:194
pycharmpython路径 浏览:376
pythonrestful接口测试 浏览:166
linux中的查找命令 浏览:5
程序员提交代码不自测 浏览:774
凯恩帝数控编程软件 浏览:87
我的世界指令方块命令是啥 浏览:128
日剧命令 浏览:332