第一篇:程序员是这样炼成的12
程序员是这样炼成的(12)-勇于面对开发失败
个人一辈子不犯错很难,作为一个程序员要每天不制造程序错误更难。今天跟大家讨论如何面对失败和错误,大到一个项目的开发失败,小到几行代码中的bug,都是我们在日常开发中经常要面对的问题。
有一家这样小公司,测试部和软件开发部是独立的两个部门,有各自的部门经理。老板总是喜欢给下面的员工施紧箍咒,施加压力,又是能力评估,又事绩效考核,于是某一年,在领导们别出心裁的领导下,公司出台了软件开发工程师的考核制度,制度明确规定:将程序员开发项目和软件的测试一次通过率和项目中的bug个数纳入开发人员的年终绩效考核,由测试部门进行考核和执行。(所谓一次通过率,就是软件提交测试后,一次通过的概率,一次测试就通过的软件/提交测试申请的软件数*100%)新法颁布后,测试部大呼过瘾,软件开发部一片哗然,第一年的过去了,果然“成绩喜人”,全公司的软件一次通过率达到了97%,无数未经测试软件被偷偷发布给了客户。第二年领导们在吸取了第一年的经验和教训后,毅然的修改了考核标准,在统计bug个数的同时融入了代码行数的概念,bug个数/100行代码 *100%来,进行年终考核,第二年过去了,软件开发部门戏剧化的以100行代码0.5的bug数,高效的开发质量给了领导们一个有力的答案。这是一个真实的事故,一个三流的软件公司的开发水平和软件质量已经“超越了”微软和google,我相信现在仍然还有很多公司在进行类似这个的考核。
这样的小公司把软件开发和测试部门独立本身就是一种错误,严重的影响的开发和测试的时间,两个部门相互扯皮,项目进展一拖再拖。
其次,两个部门工作的出发点也错了,两个部门的工作重心是交给客户尽善尽美的软件产品,而不是为了应付考核和被考核。
第三大错特错的是考评制度,一看这样的制度,多半都是事不关己高高挂起的人出的主意,开发软件能一次就通过吗?写出来的代码能没有bug存在吗?公司要提高产品质量,不把注意力放在项目管理人,开发人员的能力培训上,开发规范和文档管理上,想凭借一纸空文,或者员工的主观能动就达到一个“质”的飞越,实在愚不可及!软件工程师在把软件测试N次以后才敢把软件提交测试,几行代码就能完成的完成功能,引用了很多填充行数的无效单元。
最可恶的是,使所有的开发人员,散失了面对失败和错误的勇气!为什么不改面对呢?一面对就要扣工资和年终奖,谁还敢去面对啊?于是,整个开发风气就是:开发人员私下放行软件给客户成风,不经过任何测试。程序员有了错误死有的不承认,有了bug支支吾吾。不但开发水平提升不上去,常见的开发问题还没有被公开和分享解决,导致产品质量严重下降。
大家都应该知道在开发的过程中,越早发现软件的问题,软件就更加的完善。而不是藏着掖着,或者添上一抔土把这个“地雷”埋着,留着让用户踩去吧。正确的心态是:测试人员越早发现我们开发软件中错误,我们应该越高兴,因为不仅可以弥补我们的思维漏洞,让我们的代码更加完美,更加减少了我们挽救这个问题的开销。不敢直面bug的程序员,算不上真正的程序员,如果你没有闯过雷区,没有被炸了个人仰马翻,没有给你留下深刻的教训,那么下次你仍然会不知道代码的隐患在哪?仍然不会学会选择趋吉避凶之道。仍然会被炸的死去活来。
写代码有经验的人,对异常处理都很有一套,知道大概这一块要保护起来,那一块要加一个判断,这里要验证下是否存在或已经被销毁。如果程序员没有很好的对未能遇见的故障做好防御工作,那么产品带给用户的错误提示或者死机,将让客户连杀了你的心都有。记得好多年前,在一个网吧找了一台赛扬上网,打开IE,自动弹出网页,然后就报错系统级的错误了,还无休无止,CPU直接满上,然后死机,当时又好笑又好气,你写个弹窗软件,偷偷弹就算了,代码都没写好,结果害网吧老板重装系统:)
看过武侠的都知道,危难关头,出现异常的时候,才是检测一个真正武林高手水平的时候,平时的舞蹈练剑都是假把式,最多只能算是基本功,补救危局,化腐朽为神奇才能显示技艺的高超。有多少人会记恨千年虫问题是哪个混蛋带给我们的?但是解决千年虫问题软件工程师们都是英雄。所以放心的动手开发
吧,即使你犯了错误,被骂成狗熊,也没有人会记住你。问题被解决后一切释然。
是人都会犯错误,对别人犯错误评头论足的人愚昧。用发布制度来阻止别人放错误的人愚蠢,因为害怕放错误,而畏手畏脚不敢创新和向前的人则更加愚上加愚。错误面前我们要敢于应对:
1、对错自在人心。
当然你发现问题后,请马上提出,不要企图隐瞒问题,越早发现问题,那么损失就越小,抗震救灾有黄金72小时,软件开发也有黄金72小时。我们在解决陈年诟病的时候,通过要花上数倍的时间,来回忆当时的开发心境和设计意图。
2、接受批评。
如果这个问题跟你有关那么就是你的问题,千万别动念头找到一只替罪羊,出现问题后,重要的解决问题,不是秋后算账,更加不要交缠不清推脱问题。
3、向解决的方向前进。
如果你不能马上解决这个问题,那么请你把这个问题向解决的方向推进,如果你无法推进问题去解决,那么请不要让这个问题继续恶化。让大家都知道这个问题的存在。
4、寻求帮助。
请不要让自己的自尊心作祟,拒绝别人的帮助,一个好汉三个帮,放下那所谓的自尊,去听取团队和伙伴的建议。
每个人对错误的处理方式不同,会产生不同的结果,问题处理的好,会使得团队更加信任你,甚至比遇到问题之前,更加信任你,要是处理的不好,不但摧毁了大家的信任,还会让人觉得你难以担任重任。
第二篇:程序员是这样炼成的5
程序员是这样炼成的(5)-海纳百川 做程序员要“海纳百川”,其实就是建议各位要做一个通才。当然做通才是有条件的,我总结了下前提有三:
1.你已经是一个专才。熟练操作学一门像样的编程语言。
2.有稳定的工作和收入支持。
3.想得更多的挑战和机会。
作为项目经理和管理者而言,坦白的说,比较喜欢的还是专才,因为专才听话,你在他知晓的领域划一个圈,他能保证帮你完成任务,而且还不给你添麻烦,专才们在各自的领域的努力才会推动项目前进。那在项目中,通才的表现又如何呢?你给他画一个圈,他会给你考虑到圈子以外的事,甚至跳到别人的圈里子耍弄一番。他就像润滑剂一样,提出很多创新的idea,虽然老是给项目管理者带来不少的麻烦,但是总能让整个项目更加协调。其实项目管理者讨厌他,但又离不开通他,他的鬼点子时常能优化各个结构和模块。更重要的是当管理者被提升,要选择接替者一般是一个会顾大局,协调众多专才的通才。
在所有的项目管理者或者teamlead的心里,肯定都有一种软件工厂的构思或者布局。大意就是整个部门各个人都各施其职,让整个软件开发的过程,就像一个生产工厂一样运转。招来的程序员都是生产线上的工人。他们不需要想太多,照任务单做就是。客户需求就像产品订单一样进来,需求分析师开始根据订单安排我们要生产的产品规格满足客户的需求,系统架构是开始把这些规格加工成工厂生产计划或者价格框架。设计师拿着详细的设计文档来往这个框架里面套,剩下的就交给代码机器人们填充内容,然后到质量工位,检查贴牌,然后出厂。整个过程每个工位都是专才,在领导的构想中,他们每天都只需要做重复的劳动就好了,如果他们想辞职了,也不会带走我们全部的生产机密,更重要的是这样的工人很廉价,找一个替换品不难。但是实际上管理者的春秋大梦很难实现,原因是软件这个产品具有可复制性,也就是软件可以copy.在软件工厂里,生产两个完全一模一样的产品是没有意义的。客户的需求都是很柔性的,每次都会不一样,大大小小的改变是避免不了的,管理者们费尽了心血设计的一套生产流程,竟然只能生产一件产品?(去过生产线的朋友应该都知道,一旦生产的流程有所
变化,线上的工人们基本上都不知道怎么开始干活了,要重新培训上岗,因为他们从来就没有想过,半成品是从哪来的,又是干什么去,一直都在做机械的劳动。)但是我们的管理者们,他们肯定不会罢休焦头烂额,会再一次优化生产流程。到下一个新的产品,又会继续把生长线从头至尾优化一下。某一天管理者突然顿悟,我们为什么每次都手把手的跟每一个人安排任务,每次都亲自设计整个流程,我应该去办公室里面喝喝茶,上上网。这个时候他会想到谁?毫无疑问,肯定不是专门,他需要的是一个能走通每一个环节的通才。
小时候我经常听我老爸说:“不要半桶水,不要什么都懂点,什么都不专”这句话就是用来贬低通才的,在这里我要为通才平凡。我的一个软件项目曾经出了一次事故,整个汽车的生产线面临停产,几次电话支持的效果都不理想,需要一个技术人员立马去现场解决问题。软件用delphi开发在windows平台运行,oracle数据库,通过进口的硬件,用客户的线束跟汽车通信,操作员是个新手,电脑硬件是我们提供的,现场环境恶劣。我思索了每个可能出现问题的可能,客户能提供的有效信息太少,连软件的日志文件都无法取出来(USB端口封闭,车间信息严格保密)。我不可能同时派一个软件工程师,数据库DBA,IT,或者硬件工程师奔赴现场。最后我选择去的是一位软件工程师,他很快找出来原因,是客户的线路没有按照我们的电路图制作,关键线一条线是断开状态。我相信他,不是因为他是我们公司最厉害的程序员的,而是他懂技术领域的比其他人要多。其实在整个项目开发过程,除项目经理外,不可能每个人都会一直忙忙碌碌,无论是程序员,测试员,设计师,架构师,你总会有一段时间无所事事,除非你同时加入很多的项目。希望你能在有空的时候关注下你的同事们在做什么?你能不能帮助下或者学习下。做了这么多年的程序员,我们可能都常有一个共同的担心,这个担心是什么呢?我们一个项目或者我们公司的的关注点,研发的中心开始转移出我擅长的技术领域。我们害怕自己发挥不了作用和特长,害怕我们对公司没有价值,也就是意味着我们涨工资的幅度要比别人小了,或者没有工资加了。其实这个担心还不是最要命的,最要命的是,我们要精简团队的时候,你才发现自己比较单纯,只会测试或者编码,很多平时做其他工作的同事都能做你的替代者,那么你就要被over了。
说了这么多的苦口婆心劝大家做一个海纳百川的通才,大家肯定会问,我觉得我在我的team里面已经算了百事通,万事通了,我应该怎么继续丰富我们的技术领域呢? 夜深了,还没洗澡,我在这里不打算多说了,我请问各位几个问
题,希望可以为你指点方向:
1.你有没有想过在公司里,你计划的职业阶梯的各个领导每天都在干什么吗? 你的boss,你boss’boss…..?(拿破仑不是说过将军和士兵之类的名言….)
2.你知道你的一个组的同事在干什么吗,每天?
3.你知道哪几种操作系统平台,软件开发平台?你会通过别的路径走到罗马吗?
4.软件工程师你知道你要用的数据是哪来的怎么来的吗? 数据库管理员你知道你的数据是去哪里的吗?为什么人家装个oracle一下就搞定,我写了一辈子连oracle的程序连个listener.ora都不会配。
5.程序员知道你开发的软件,打包后是怎么安装注册的吗? 那般客户的是什么折腾你的宝贝软件的吗?
6.有没有约个骂你的杰作的客户出来吃吃饭,听听他的用户体验?
希望我们都能明白自己缺少的是什么?如果程序员想找一份工作,做一个专才足矣,如果想把事业做好你最好做一个通才。
第三篇:程序员是这样炼成的10
程序员是这样炼成的(10)-现在我们能做些什么?
前天在1+1<2里面谈到的那个麻烦今天被解决了,最后还是以AB两组双赢为目,相互合作,两组和二为一,共同完成项目,这个是最好不过的结局了。今天的文章是写给一位网友的,因为他问了我一个问题:“现在我们能做些什么”?
其实我以前也常有这样的感觉:茫然,麻木,不知道自己要做些什么?也不知道自己能做些什么? 有时候一天下来,虽然一直在忙碌不停,但是工作都会自动的膨胀到占满我所有的时间,包括我休息的时间。有时候我常问自己为什么会这样?是我们的项目计划出了问题?还是我们的任务量在增加?都不是,其实是时间在我们身边偷偷的溜走了。我以前做项目的时候有个坏毛病,项目的前80%的时间,被我浪费在所谓需求分析和程序设计上,(实际上没有花这么多时间,花时间在偷懒上了),到了最后的20%的时候,时间已经非常紧迫,这个时候我会发现编程的状态完全不一样。原因是,项目的dead line要到了,我们没有机会拖延时间了,已经没有时间让我拖着熬着不作出决定,没有时间让我去组织无聊的项目会议,没有时间让我去接听一些莫名其妙的客户电话,我更没有时间呆坐在电脑面前思考如何去躲过这无聊的工作,我必须要全力以赴在第一时间完成工作。其实当这个项目完成时,我再回头想想,并不是我在最后的时候“盖茨附体”,“图灵重生”,而是一种危机感和急迫感让我的效率提高了两三倍,让我在一些徘徊犹豫的问题上花费的时间变少了。我相信很多软件工程师都有这样的感触。事实很明显,我们的问题是在于我们能做很多,只是我们都没有做,我们只动嘴,却没有动手。
在我的公司有一个这样的故事,某几位同事负责一个项目,项目的进展一直都不是很理想,不久公司公布半个月后集体outing的消息(就是集体旅游,还是公费),为了保证项目的完成时间,一些项目拖延的员工需要驻守大本营,继续奋斗。本已经被我们放弃的那几位同志,尽然在短短的半个月中,完成了1个月的工作量,提前的把项目完成了。看来小宇宙爆发的威力真的很恐怖,可怜公司测试部的MM们,被那几个家伙拖着天天加班:)。可见,有时候工作虽
然让我们很头疼,但我们不应该把问题高高挂起,或者因为官僚作风,或者以召开分析会,技术评估的名义去拒绝问题,其实很多的困难都可以在我们的日常工作的空隙去完成的,没准是一杯咖啡或者一根烟之后,我们就可以做出选择。程序员应该学会选择和面对。
我们不是不知道我们能做什么,而是我们没有学会面对和抉择,没有想去做。附: 有的朋友问我,为什么每次更新文章的时间都很晚,实在抱歉4-6月我有一个开发项目要完成,周一-周四一般都在加班基本上10点才能抵达小窝,请谅解。
程序员是这样炼成的,每天深夜写作,已经过了十章完成了一半,虽然很累,谢谢一直支持和鼓励我的同事和网友们,我不会半而废的!
第四篇:Java高级程序员是这样炼成的 - 文库课程
Java高级程序员是这样炼成的-文库课程 Java基础篇:J2SE基础入门系列
学习课程:《JAVA语言基础与OOP入门》
您可以学到:
面向对象OOP入门 Java中的实用类与集合 继承与多态、接口...参加课程
本课程由北风网资深讲师凤舞烟老师主讲,通过理论+上机练习的模式,全面细致的讲解了java入门技术,课程涵盖内容包括:Java中的实用类与集合详解、以及Java中的oop思想,课程配合2个项目,进行教学,让学生可在最短的时间内掌握java。22小时18816人已学习
学习课程:《JDK5.0新特性培训》
您可以学到:
泛型类型及继承的使用 枚举的应用 EnumSet和EnumMap 参加课程
JDK是针对Java开发员的产品;自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。
5小时913人已学习
学习课程:《Junit测试驱动开发》
您可以学到:
JUnit4中的注释讲解
HttpUnit TDD思想 参加课程
JUnit是Java语言事实上的标准单元测试库。JUnit的易用性无疑是它受欢迎的主要原因。也许你会这样想:它做的事情不多,仅仅是做一些测试然后报告结果,JUnit应该是很简单的。
4小时867人已学习
学习课程:《ANT使用全攻略》
您可以学到:
Ant属性Ant数据类型 Ant测试和JUnit Ant的结构化构建 参加课程
ANT是使用最广泛的Java项目构建工具,具有跨平台、易于扩展、简单和快速的特点。它伸缩性好,小到个人项目,大到多团队J2ee项目,在各种规模项目中都可一显伸手。并且,最重要的是,它易于掌握。
7小时1033人已学习
Java WEB篇:深入浅出Java web开发之JSP应用系列
学习课程:《深入浅出学Java中级教程》
您可以学到:
JSP语法 BBS项目实战 MVC实例-在线通讯录 参加课程
本课程重点在项目实战培训,主要采用MVC设计模式进行开发。通过本次课程,您能很好地掌握MVC下Web项目设计方法,在JSP+servlet讲解中,主要结合论坛项目,让您通过切实的项目去掌握知识。
33小时5266人已学习
Java框架篇:深入浅出框架实战开发
学习课程:《2013版Struts2.X深入浅出》
您可以学到:
MVC思想简介 Struts2配置 学生信息管理系统实战 参加课程
本课程是2013版Struts2.X深入浅出系列,课程配合一个Strus2实现学生学籍管理实战项目,课程深入浅出,全面解析了Struts2.X的应用,相比市面上的课程,更具有实用性质。
15小时1354人已学习
学习课程:《2013版Hibernate深入浅出》
您可以学到:
Hibernate基本配置以及...ORM之映射关联 Hibernate与struts2的整合 参加课程
2013版Hibernate深入浅出(详解Hibernate3.X及Hibernate4新特征结合学生学籍管理系统),课程全面讲解了Hibernate3.X以及Hibernate4的区别,是目前市面上Hibernate最新的版本,也是目前国内唯一一套讲解完整细致的教程。
18小时3009人已学习
学习课程:《2013版Spring3.0实战开发系列》
您可以学到:
属性注入方式以及模拟...Spring与Hibernate集成 Annotation方式实现...参加课程
本课程是2013版Spring3.3实战开发系列(SSH版学籍管理系统、Ant部署、SSH常见面试题),课程涉及内容包括:控制反转(IoC)、面向切面编程(AOP)、IOC使用的两大关键技术和一个设计模式(与Hibernate类似)。
14小时1021人已学习
Java实战篇:项目实战企业设备点检系统
学习课程:《J2EE平台下的企业设备点检系统》
您可以学到:
需求分析的制作 核心代码的编写方式 数据库设计 参加课程
本课程主要对企业设备点检系统的开发过程进行讲解,企业设备点检系统是根据企业的实际要求和实际需要进行对设备、备件、人员等方面的素质化信息管理平台,它可以为企业解决流程、成本、设备的检修维修等方面的问题。
15小时1503人已学习
查看文档来源:http://wenku.baidu.com/course/theme/java?fr=search
第五篇:程序员是怎样炼成的
在成为程序员的道路上,要经历四个坎坷,让我们用四个境界来标明他们。
【第一境界】掌握一门或者几门编程语言,会模仿例子来实现程序代码,并且让代码在计算机系统中运行起来。达到这种境界的人,还不算真正意义上的程序员。而仅仅是掌握了一种或者几种工具的工匠。他们中的熟练者能够快速模仿现成的例子,以实现自己或用户的软件模块。
第一境界的特质是对语言工具的掌握,在这个境界的高手,会强调自己对语言如何如何的熟练,因此这个境界可以用“知器”来表示。
【第二境界】第二境界里,我们要学习的是分解问题和推理的技巧,学习用逻辑的语言来精确地表达一个命题。在这个境界里,软件工作者掌握的是一种分析具体事物的方法,他们不再一味地模仿,而是开始对一个又一个具体问题思考并尝试用自己的方法来更好的解决。
在这个层次里的“程序员”开始关注解决问题的思路,并且关注分析和推理的数学技巧。他们中的优秀者熟知各种算法善用各种各样的命题推理来分析并解决问题。他们同样善于借鉴前人的例子,但是往往能够根据问题的特点进行有效的改进,并且能够在尝试改进的过程中得到创新的成就感和新的经验。在这个层次里的人,对语言工具的认识比第一境界更加深刻,他们是真正知道如何利用手中语言工具的特点更好地解决问题的人。但是他们并不会强调自己对于语言如何熟悉,也不再热衷于宣扬掌握如何如何多的语言,在他们眼里,语言仅仅是一种工具而已,真正重要的是分析问题的方法。
第二境界的特质是对具体问题的分析,在这个境界的高手,往往善于从具体问题中分析出合理有效的解决方法。因此这个境界用“格物”来表示。(第二境界里有真正对如何用程序来解决问题经验丰富的人,这些人能出色地胜任编码工作,因此我们称他们为Coder,或者初级程序员。)
【第三境界】第三境界里,我们要学习的是抽象思维和找出事物表象后面的规律。在这个境界里,软件工作者不再针对一件一件具体的事物来分析,而是尝试理解事物表象下的本质。在这个层次里的人,开始关注事物的共性,并且逐渐掌握归纳和总结的方法。“模式”开始出现在他们的头脑里。
“设计模式”是软件领域的“三十六计”,是经过抽象总结而归纳出来的真正的思想精华。第三个境界的软件工作者开始接触并且理解“模式”,学会灵活运用模式和抽象思维来解决“某一类”问题。
第三个境界的特质是对事物本质规律的认识,在这个境界的高手,往往能够快速地抽象出问题的本质,从而用最合适的方法来解决问题。这个境界我用“明理”来表示。
达到第三境界的程序员,是天生的设计师,他们对问题的本质的领悟能力帮助他们用优美简洁的代码来解决问题,他们的代码中充满设计思想。他们是真正能够享受到程序设计的艺术魅力并且充满成就感的一群人。这个境界里的程序员真正当得起programmer的称号。
在这个境界之上,依然存在——
【第四境界】第三境界程序员中的极优秀者,并不满足专家的地位和高薪,他们开始向第四境界艰难地前进。第四境界是程序设计领域的最高境界,要达到这个境界,只需掌握一样东西,然而这个东西并不是寻常之物,而是许多人穷尽一生也无法得到的这个世界最为深邃的秘密。这样的东西,叫做“道”。
所谓道,是天下所有规律的总和,是最根本的法则,只要能够了解道,就可以明了世间所有的一切。掌握了“道”的程序员,才是真正的程序设计大师,能够创造出流芳百世的作品。对第四境界的程序员来说,“思想”已经已经不再是很重要的东西,因为他们对程序本质的理解已经超越了问题本身。在他们的代码里,有的只是自然,现实和虚幻的边界都已经模糊,一个完美自治的系统在刹那见诞生,却仿佛从亘古时刻起便存在着、运动着,从简单而质朴的规律中涵盖者世间万物的本质。因此,这个境界,我称之为“成道”。