你是一个努力工作的程序员,还是一个懒惰的程序员?

本文探讨了软件开发中对努力工作与高效成果的误解,通过对比两个团队的工作方式,揭示了表面上的努力可能不代表实际的有效产出。文中引用了G.H.Hardy先生关于高效工作规律的观点,并提出管理者应重视工作成果而非表面的努力程度。

当一个人在完成一件体力工作时,你很容易评估他是否在努力的工作。你可以观察他的物理动作,看他流了多少汗水。你还可以看到他工作的成功:砖墙在砌高,地面上挖的坑在变大。对努力工作的认可和褒奖是人性中非常基本的本能反应。这也正是为什么人们对体力耐力体育活动如此着迷的原因之一。这种对体力上的辛苦工作的本能的赏识,在遇到管理一群技术创造型的员工时,却成了一个麻烦问题。高效的脑力工作者通常会被看作并没有在努力的工作。

早在2004年,我还是一个初级程序员,工作在一家有线电视公司,在一个大型团队中开发财务和供销系统。跟所有的大型系统一样,这个系统由很多的相对独立的模块组成,分别由一些个人或小团队负责。其中模拟电视和数字电视的财务和供销系统几乎完全独立,分别由两个团队开发。

模拟电视开发组决定在早期的微软Biztalk平台上开发他们的系统。由这个公司的4个小伙和微软的一个团队共同开发,并负责产品环境的运行。他们看起来真的工作的十分辛苦和努力。你经常能看到他们加班到深夜或周末加班。每个人都会随时放下手中的活儿来解决正式环境中突现的问题,经常会在一张桌子前一群人围绕着一个小伙,各自说出自己的见解,讨论什么地方错了,应该如何修正。工作气氛永远是热火朝天,每个人都能看到这些——即使只是经过瞟一眼,不仅仅从整个团队讲,而是他们每个人都真的真的工作的很努力。

数字电视供销系统开发团队却是完全的不同。代码几乎是由一个家伙写的,我们就叫他大卫吧。我是一个初级程序员,在团队里做维护工作。起初我在理解他的代码时遇到了很大的麻烦。他的代码里没有很长的过程,通常我的代码会把很多操作放到一起,相反,他的代码里有大量的很小的类文件和只有几行代码的小方法。好几个同事都抱怨大卫把代码搞的过度复杂了。但大卫耐心教导我,建议我去读几本面向对象编程的书籍。他给我讲设计模式,SOLID编程原则,单元测试等知识。很快,我对他的代码开始有了理解,我越研究他的代码,越欣赏这些程序中优雅的设计。这些代码放到产品环境中非常好用,运行稳定的干着它们的工作。这些代码修改起来也相当简单,因此,一些新功能的增加变得轻松容易。单元测试保证了大部分的bug都阻挡到了正式环境之外。

这些做法产生的结果就是,我们看起来完全不是在十分努力的工作。我们5点半准时下班,周末从来没有加过班,我们从来没有发生过一大群人围绕着一个人数小时的讨论正式环境中的错误是怎么发生的场景。在外人看来,我们肯定是被分配了一件相对容易的任务。但事实上,需求都是十分相似的,我们只是更好的设计和实现了这个系统,有更好的支持系统基础架构,特别是单元测试。

管理部门宣称他们要根据员工的工作表现涨薪。当轮到老板跟我谈话时,老板说只给那些工作真的努力的员工涨工资才显的公平。而我们的团队看起来对公司发展的好坏并不太在意——跟那些放弃了自己的晚上和周末的英雄们相比。

这家公司是一个稀有的实验室,你可以将好的软件设计和坏的软件设计、好的团队特征和不好的团队特征的影响效果做一个直接的对比观察。大多数的公司里不可能提供这种比较的机会。你很难说这些挥汗如雨、工作到深夜和周末、坚持冲在灭火第一线的小伙们是为了开发一个真的非常非常复杂的系统而展示了伟大的付出,还是就是一次失败。除非你有能力提供两个团队来竞争,让他们解决同样的问题,可是哪个公司愿意做这样的事情呢。相反,如何看待那些坐在角落里,朝九晚五,看着像是整天上网读什么东西的程序员呢?是他们善于写出强健稳定的代码吗?还是分配的活儿比其他人容易?在常人的眼里,前一个团队的小伙们是在努力的工作,而第二个不是。努力工作值得赞扬,懒惰可耻,不是吗?

我敢断言,表面上看起来工作很努力通常会是一种失败的信号。在高压下,在一个不断被打搅的环境中,软件开发通常是不能干好的。长时间的工作往往不是一个好的方式。有时解决一个难题的最好的方法是停止思考,出去散散步,或更好的,去睡一个好觉,让潜意识帮你解决。我最喜欢的一本书就是20世纪英国数学界领军人物G. H. Hardy先生写的《A Mathematician’s Apology》。在这本书里,Hardy先生描述他的日常规律:上午4小时的工作,下午看板球比赛。他说一天超过四小时的高强度脑力劳动都是无意义的,也是无效率的。

对于那些管理者们,我想说的是,判断一个人要看结果,要看开发出的软件的好用与否,而不是看他们表现的是如何在努力的工作。很反直觉吧,你其实最好不要坐在这些程序员中间,这样能保证你不受传统的、本能上的评判指标的影响,这样你才能对他们的产出有更好的认识。远程工作是特别有效的一种做法,你只能通常他们的产出来评判他们,而不是省事的观察他们是否8小时都坐在办公桌前对着IDE噼里啪啦的敲着键盘或“热心的”围聚在另外一个人的桌前提供着“有效的”建议。

[英文原文:Are Your Programmers Working Hard, Or Are They Lazy? ]

### 技术能力的提升 编程技能是程序员的核心竞争力之一。掌握一门或多门编程语言是基础,但更重要的是理解其背后的原理和设计思想。通过大量实践编写代码,能够加深对语法、算法以及数据结构的理解。此外,参与开源项目或实际开发任务可以帮助积累经验并提高解决问题的能力[^1]。 为了保持技术领先地位,持续学习至关重要。利用在线课程、书籍和技术博客等资源进行自学是一种有效的方法。同时,参加专业培训和行业会议可以接触到最新的技术和最佳实践。与同行交流也是获取新知识的重要途径之一[^2]。 ### 学习与成长的重要性 除了个人努力外,建立一个良好的学习环境同样重要。加入技术社区或者找到志同道合的学习伙伴,可以通过讨论和合作来激发灵感并互相激励。定期回顾所学内容,并将理论应用于实践中,有助于巩固知识并发现不足之处[^3]。 ### 职业态度与职业道德 作为一名优秀的程序员,除了具备扎实的技术功底之外,还需要拥有积极的职业态度。这包括但不限于责任心、团队协作精神以及开放的心态。对待每一行代码都应尽职尽责,确保其质量可靠;在团队中主动沟通协调,促进项目的顺利推进;对于新技术持欢迎态度,勇于尝试并接受批评建议以实现自我超越[^4]。 ### 客户导向和服务意识 理解客户需求并为其提供解决方案是软件开发过程中的关键环节。因此,在日常工作中培养以客户为中心的服务意识非常必要。这意味着不仅要关注功能实现本身,还要考虑用户体验等方面,从而创造出真正有价值的产品。 ### 管理能力的发展 随着职业生涯的进步,很多程序员会逐渐承担起领导角色。这时候就需要一定的管理技巧了。时间管理和项目规划能力尤其重要,合理安排工作进度保证按时交付成果。另外,有效的沟通技巧也不可或缺,无论是向上级汇报情况还是指导下属完成任务都需要清晰准确地表达自己的想法。 ### 实践示例:Python 快速排序算法 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: # 选择基准值 pivot = arr[len(arr) // 2] # 分别存放比基准小和大的元素 left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] # 递归地对左右两边进行快排,并合并结果 return quick_sort(left) + middle + quick_sort(right) ``` 这段代码展示了快速排序的基本思想——通过递归方式将数组分成较小的部分再排序。它体现了良好的编程习惯如注释说明及逻辑清晰性,同时也强调了编写易于维护代码的重要性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值