`
hizhangqi
  • 浏览: 89503 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[程序员]多些时间思考 少写些代码

 
阅读更多
[程序员]多些时间思考 少写些代码
2011-10-25 09:53 | 487次阅读 | 来源:酷壳网 【已有1条评论】发表评论

关键词:程序员 | 作者:陈皓 | 收藏这篇资讯

导读:作者陈皓在微博上说过这样一段话:“聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30%–50%的时间是在忙碌着编码,调试和测试。聪明的老板也会让团队这样做。而愚蠢的老板,愚蠢的程序员会拿出来100%-150%的时间来忙着赶进度,返工,重构,fix大量的bug…所以,越差的团队一般会越忙,而且还忙不完。”文中作者就此观点进行阐述。

文章内容如下:

在现在这个浮躁的时期,再加上敏捷咨询师们念的歪经,他们让人感觉上就像是软件产品是可以在很短的时间内高质量的完成的,这令那些管理者们很兴奋,就像巴甫洛夫的条件反射实验中的狗看到了肉就像流口水那样兴奋。他们使用TDD,快速迭代,不断重构,持续集成直至持续部署的方法在进行软件开发。

软件开发真是这样的吗?难道不需要花时间去思考吗?对此,有些观点在Todd的《“品质在于构建过程”吗?》以及《Bob大叔和Jim Coplien对TDD的论战》中谈到过了。我只想想表达下面的观点:

•软件的精髓在于设计,设计是一件很费大脑的事件。对于软件来说,设计没有完美的,它总是一件需要取舍需要权衡的事,比如:时间换空间,空间换时间,TCP或UDP,同步还是异步,数据冗余还不冗余等等。那怕是一个小小的observers模式是pull方式还是push方式都需要仔细讨论。这些的东西需要时间和做前期尝试。
•TDD、快速原型和迭代可能会对软件和团队产生负面影响。在一开始,你需要花很大的精力来让你的软件从无到有(做过软件的人都知道,从零开始写代码是很痛苦的事),但是因为你没有想好,先做再说,所以,后期你会面临更多的质量问题而让你需要花更多的时间精力。当然,那些咨询师会让你用持续集成和持续部署这样的方法。但我想告诉你,这并不解决你软件设计的缺陷。举个例子——TDD、迭代、原型只关注功能性需求,其不会关注非功能性需求,比如性能问题,高可用性问题,系统维护问题(模块的耦合问题),等等。而这些问题往往都可以让你的软件设计重新来过。
•重构是恶梦,重构应该越少越好。当你维护一个复杂的系统时你会知道重构是一件多么恐怖的事情(参看《重构代码的7个阶段》)。如果一开始没有想好,你要面临的不单单是re-design, re-architect,还要面对时间和人力成本的增加,最难的是你还要面对的是团队士气因为不断的rework而逐渐低落并产生厌倦和懈怠情绪。
所以,如果你能有多一些时间去和客户讨论一下需求和未来可能的变化,去调查一下实现的技术难点和细节,去和其他有经验的人讨论并推敲一下架构和设计,去思考设计上的缺陷,那么,你的coding会变得非常地直,直到你一眼就看到尽头,你的测试案例也会写得非常地好,你会几乎不需要重构,于是,你会在未来少写很多代码,从而你的软件开发会越来越轻松,直到技术开始换代。

我现在在做的项目,花了几乎4个月的时间来做设计,在这个过程中,我们反复思考、讨论和权衡若干种实现方法,并尽可能地穷举所有的场景和细节以及未来可能的变化(那怕是那些简单的模块),有个模块被重写了至少三次,每次都是写到一半就被推翻重写,我们整个团队不断地在和其它团队讨论,并在对系统不断地认识中对系统进行简化和优化,并力求达到完美。现在看来,没有贸然使用Scrum是明智的。

这就好像我们修路造桥一样,我们需要花大量的时间勘测地形地质,分析数据,思考可能出现的各种问题(各种自然灾害),评估不同的设计方案,而不是先尽快建好再说。

所以,多一些时间,不是让你多做几次迭代,多完成几个模块,而是可以让你少写一些代码,更快的交付一个更好的产品。

我相信你会有很多疑问,下面是我觉得你可能会有下面的一些观点,让我一条一条来回复:

•首当其冲的一定会是项目的deadline,或是那种你没有活语权的项目。比如做那种“甲乙方合同式的项目”,我把这种项目统一认为是“外包项目”,在这种项目性质下,你很难有话语权。对此,我觉得,1)作为乙方的你还是应该和甲方在项目计划上争取一下,晓之以情,动之以理。2)如果不行,只能在时间、需求范围和质量上做一个权衡。另外,在这种情况下你要找一个方法,把你的压力和痛苦分担给用户和领导。(找到这个方法的前提需要你找到用户和领导他们害怕什么,嘿嘿)
•过度设计和纸上谈兵。有人说会不会设计太多,造成过度设计,或是在设计上花太多的时间。这有可能。我上一家公司的一个项目团队就花了1年多的时间来不停不停的开会和做设计,结果release的时候还有1000多个bug。这个问题的原因是,这个团队的设计是在纸上谈兵,开会是开神仙会,讨论的设计都是浮云。所以,设计并不是讨论和思考,还需要去尝试,我认为当你的设计完成的时候,你的骨干核心代码都基本完成了。
•我的团队成员水平太差,不会思考。首先,先恭喜你找到一堆码农,当然,这不怪你,这是中国教育和大环境的问题,让人不会思考。对于这样的情况,我有两个建议,1)量力而行,使多大的碗就吃多少饭。2)鼓励思考,那怕那些想法很不靠谱,因为如果不开始,那么将永远不会思考。
•必需使用快速迭代。很多公司都在强行上敏捷,他们希望产品越快release越好,而没有充分的时间思考和讨论。对于这种项目,我的建议是,1)找有丰富经验的人来做。2)迭代过程中力求架构和程序逻辑的简单,简单,再简单,力求代码间的高内聚,低耦合。不然,重构的时候你就好玩了。
•创业团队必需要快。做得快就是做得好吗?很多时候,不是谁快谁就能笑到最后的。这样的例子太多了。第一个做出来的人并不一定就会占领市场,其很有可能会成为先驱。
•有钱的公司才会让团队用更多的时间去思考。错了,你们没有见过有钱的公司,有钱的公司可以招一堆干不成活的人,可以把事搞乱了再新来过,甚至可以把做失败的项目换个名字再重新立项。这些真正的有钱的公司只求快,只求人多,不怕做错决定。像我们这些没钱的人,干什么事都是小心翼翼地,生怕做错决定。
文章出自:酷壳网

分享到:
评论

相关推荐

    为什么程序员不擅长估算时间

    程序员不擅长估算时间是软件开发领域的一个普遍现象,这涉及到多个因素。首先,软件开发的复杂性和不确定性使得准确预测时间成为一项挑战。编程任务往往涉及众多未知因素,比如需求的模糊性、技术难题的出现、代码的...

    程序员代码面试指南(左程云):IT名企算法与数据结构题目解---源代码

    通过阅读和理解《程序员代码面试指南》中的源代码,读者可以提高自己的编程能力,增强对算法的理解,同时也能提升自己在面对实际问题时的思考和解决方案构建能力。无论是对于正在找工作的应届毕业生,还是寻求职业...

    为什么我们程序员写不出好代码? - 文章 - 伯乐在线1

    1. **会议**:频繁的会议打断了程序员的连续思考,当他们从会议中抽离出来,需要时间重新调整状态进入编程思维,这会影响工作效率和代码质量。 2. **电子邮件管理**:应对无休止的邮件通信同样耗费精力,长时间的...

    程序员的经验.doc

    在软件开发的世界中,程序员的经验是历经无数代码行与项目挑战所铸就的宝贵资产。经验丰富的程序员往往在技术深度、解决问题的能力以及与团队的协作上有着独到之处。本文将详细探讨程序员成长过程中的关键经验,以及...

    看图说话:为什么不能打断正在工作的程序员?

    然而,一旦被打断,他们不仅需要花费额外的时间来重新集中注意力,而且在很多情况下,还难以恢复到被打扰之前的工作状态和思维模式。 具体来说,被打扰后,程序员需要重新激活大脑中处理当前任务的认知资源,这包括...

    卓有成效的程序员 新版下载

    1. **时间管理**:书中强调了时间对于程序员的重要性,提出了有效的时间规划技巧,如使用番茄工作法来集中注意力,避免多任务并行导致的效率降低。同时,提倡定期休息以防止过度劳累和保持创新思维。 2. **代码优化...

    惹恼程序员的十件事 IT人事必看

    2. **被打断的工作流程**:程序员在编写代码或思考复杂问题时,需要高度集中注意力。频繁的打扰会破坏他们的思维连贯性,可能导致工作效率大幅下降,甚至需要从头开始构建思路。因此,尊重程序员的专注时间是非常...

    程序员面试全攻略

    《程序员面试全攻略》是一本全面指导程序员求职过程的实用指南,旨在帮助程序员们在竞争激烈的IT行业中脱颖而出,成功找到理想的工作。这本书涵盖了从准备简历、与猎头接触,到面试技巧和程序设计能力的提升等多个...

    软考初级程序员真题

    - **2010-2011年**:这段时间的真题可能更注重实践应用,不仅有基础理论题目,还会有实际编程题,要求考生能够编写出符合逻辑、运行正确的代码。值得注意的是,2010和2011年的答案仅是个人答案,考生在参考时应对比...

    如何像python程序员一样思考

    《如何像Python程序员一样思考》覆盖了计算机科学中的多个核心领域: 1. **编程基础**:从最基本的变量、数据类型到函数、循环等,本书提供了全面的介绍。 2. **数据结构与算法**:详细解释了数组、列表、字典等...

    作为一个程序员的最基本要求

    在学习过程中,不应止步于程序能运行,而是要思考如何写出更高效、可维护的代码,并对遇到的问题进行深入探究。 再者,熟练的编程调试技巧是程序员日常工作中不可或缺的技能。学会阅读和理解编译器的错误信息,能够...

    程序员成长的烦恼.pdf

    程序员作为IT行业中的核心角色,肩负着将复杂的业务需求转化为计算机可识别的代码的重任。他们在职业道路上的每一步成长,都伴随着技术、思维、团队协作等多方面的挑战。本书《程序员成长的烦恼》对程序员成长过程中...

    程序员偏爱的壁纸

    【程序员偏爱的壁纸】这一主题,其实涵盖了程序员文化、审美倾向以及个人工作环境的个性化装饰等多个方面。在IT行业中,程序员作为一个独特的群体,他们的喜好和兴趣往往与他们的职业特点密切相关。这些壁纸不仅仅是...

    程序员笑话大全.docx

    程序猿往往认为写文档是繁琐的工作,但同时也意识到没有文档的代码同样难以维护。 2. 编程学习路径:描述中的读书历程反映了程序员从基础到高级,再到理论与实践结合的学习过程。从基础语言到高级编程,再到编程...

    程序员专用表情包

    这些表情包可能包含了程序员们常见的工作场景,如面对复杂代码时的困惑、解决问题后的喜悦、加班熬夜的无奈以及对新技术的热衷等。它们不仅能够帮助程序员们在日常交流中增加趣味性,还能增进团队间的沟通与理解。 ...

    献给所有想当程序员的朋友

    因此,我们要多动手实践,多写代码,通过实践来检验我们的学习成果。同时,也可以参与到一些开源项目中去,这样不仅能够锻炼我们的编程能力,还能够让我们接触到更多的编程高手,从而更快地提升自己。 当然,我们在...

    多些时间能少写些代码

    作者陈皓在微博上说过这样一段话:“聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30%–50%的时间是在忙碌着编码,调试和测试。聪明的老板也会让团队这样做。而愚蠢的老板,愚蠢的程序员...

    程序员读24史

    这不仅能够提升个人的文化素养,也能够让他们在处理问题时有更多的全局观和长远思考。 其次,历史是人类经验的积累,程序员通过学习历史,尤其是那些历史教训,可以借鉴过去的经验来应对现在和未来的问题。比如,...

    写给初学者:Java程序员工作总结.pdf

    对于刚起步的程序员来说,不要仅仅局限于编写代码的工作,应逐步拓展技能,这包括但不限于需求分析、数据库设计、文档编写以及项目管理等方面。在职业生涯的早期,初级程序员的主要任务是学习和适应,随着经验的积累...

    几款程序员特色服饰收藏

    他们需要的服饰既要有足够的舒适度,又要能适应长时间的静坐,同时还不能影响到大脑对代码的思考。这些需求促成了程序员特色服饰的产生。这类服饰中,以T恤衫最为流行,它们不仅提供给程序员足够的自由活动空间,更...

Global site tag (gtag.js) - Google Analytics