程序员的那些反模式

  有鸡汤就有反鸡汤,有模式就有反模式。

  今天,我们来谈一谈程序员的行为中的那些反模式,涉及程序员的日常工作和学习的各个方面。

  这些反行为模式,并不针对某些特定的个人。如果你不幸中招,千万不要懊恼,因为这实在太正常不过了,很多反模式的坑我也是亲身踩过的^-^

  稍微修改几行代码就调试

  对所有程序员来说,这个行为有一点心理上的原因:工程师都喜欢在做完一点修改之后,立即看到它的效果。这是一种诱惑。

  除此之外,这种做法一般多见于新手。

  新手对于敲下的每一行代码都不太有确信的把握,因此需要依靠高密度的调试来一步步确认。当一个老手在项目中首次使用一个新的技术时,情况也与此类似。

  但是,不得不说,这种做法是低效的。

  • 首先,稍微大一点的项目,手动调试一遍都会比较花时间。
  • 更重要的是,不停地中止编码工作来进行调试,很容易打断思路,甚至漏掉一些关键流程。

  更好一点的方式是:动手编码之前,提前想好一个完整功能或模块的关键逻辑,然后一口气敲完所有代码,最后一次性调试所有case。如果有自动化测试+Daily Build系统,一定要充分利用。

  当然有时候难免会碰到不太确认的技术点,这时如果可能的话,更好的方式是单独搭建一个轻量级的、便于调试和验证的工程,来把模糊的技术点系统地摸索一遍。

  通过设置众多断点的方式来学习新项目

  对于刚刚入职一家新公司的程序员来说,首先要做的一件事也许就是学习和熟悉新的项目工程了。于是我们经常看到类似如下的一幕:

  通过设置大量的断点,来弄懂程序的运行流程,这种做法对于小项目来说,其实是没有什么问题的。但对于复杂的大型项目,容易使人陷入细节,造成“一叶障目,不见泰山”的后果。

  而且,在那些大量使用异步和多线程的工程中,断点调试和真实运行的时候往往存在差异。特别是对于一个公司新人来说,这有可能导致他对项目代码的片面理解,甚至误解。

  对个人来说,这种做法也容易养成一种“不调试就看不懂代码”的习惯。这是一种不太有益的依赖症。要知道,相对于我们将要阅读的代码,我们能亲自调试的机会少之又少。

  我的观点是:断点调试是个很不错的工具,但如果把它作为新人学习新项目的主要途径,那么一定要警惕它所带来的弊端。

  只依赖百度来搜索技术问题

  程序员应该使用谷歌还是百度,已经有太多人讨论过了。我觉得在这里不需要再次强调它们在搜索技术问题方面的区别了。

  一般来说,即使你由于环境所限用不了谷歌的话,用一用bing.com的英文版,也是比百度更好的一个选择。

  但这里需要说明的一点是,搜索技术问题,并不是说用百度就肯定得不到好结果。其实,当你想搜索某个固定用法的相关代码参考一下的时候,百度是能很快速地满足你的要求的。但是一定要记住,搜到的代码不要直接拿来就用,一定要从Spec和API Reference的层面找到使用的依据(Spec的概念参见我的另一篇文章《技术的正宗与野路子》)。

  不经意间使用翻译插件

  当你访问英文网站的时候,你的浏览器是否会弹出类似这样的“翻译工具栏”?

  这是现代浏览器智能化的一个体现。但是,对于程序员阅读技术文章来说,还是原汁原味的英文文档表达得更准确。

  所以,如果你的浏览器有这样一个翻译工具栏,那么想办法卸掉它或关闭它。

  阅读英文技术文档,其实对英语基础的要求并不太高。英文技术文档,所涉及到的词汇量很有限,而且一般句式比较简单。之所以有人感到困难,很多时候是一种耐心的缺乏或心理的恐惧。

  对于我们团队内的每个人,我都会这样告诉他:阅读英文技术文档的能力,是一个must;否则,你在技术的路上就很难突破。

  先实现简单的,其它后面再说

  我们总是习惯从擅长的事情出发来决定行为。当一个项目中出现一些复杂的、超出常规的部分时,很多人的选择是先把简单的部分做完,复杂的部分最后再说。

  “最后再说”的意思是,等到项目的后期再来考虑它。这其实是在逃避和搁置矛盾。

  从另一个层面来说,这也是人们趋利避害的一种本能。一种鸵鸟心态。

  到那时有可能已经临近项目截止日期,人们更没有足够的耐心来设想解决方案,而最终只能求助于一些折中,比如降低产品要求。

  在比较坏的情况下,还可能出现由于关键细节没有在开始讨论清楚,从而最后推翻整个设计的情况。

  所以,在项目开始之初,就要优先把那些看似复杂的、有可能超出掌控的产品技术点讨论清楚。实际上,能否把最复杂多变的东西在一开始就考虑清楚,反映了一个团队的综合水平。

  IDE里看不到依赖工程的源码

  我在另一篇文章《技术的正宗与野路子》中已经提到过这个问题。这里我再展开讲一下。

  不管是出于提升自身的目的,还是由于工作需要,我们都需要阅读一些优秀的开源源码。实际上,阅读开源的代码未必非要找一个完整的开源工程,从头到尾地去读。应该从日常工作需要的SDK源码入手,积少成多。

  每个程序员,不管他是用什么语言来编写程序,一般来说都要依赖某个语言的SDK,而且通常它们都是开源的。比如Java的JDK,比如C++的STL,再比如Android SDK。一定要把你的开发环境设置成一点击某个调用的方法就能跳转进源码实现。只有这样,你才能把平常开发的时间利用起来,随时随刻都点过去阅读源码。

  有时候我发现某些工程师用的IDE很高级,各种快捷键用得也很溜,但就是点击不到源代码,这让人很难理解。在这种情况下编程,我会感觉自己像是被蒙上了眼睛一样。

  当然有些程序员面对的是一个闭源的系统,比如iOS程序员,似乎这个方法不太适用。不过闭源的SDK通常注释写得比较详细,至少通过IDE把每个调用的注释都仔细读懂。况且,现在iOS上的Swift的SDK不是也开源了嘛。

  IDE里一点击就看到依赖工程的源码,这个习惯不仅适用于阅读开源代码,也适用于在一个大公司内调用其它团队提供的接口的时候。在任何公司和组织内部,不断加深对于周边系统的理解,不断扩大你的知识边界,永远都是让你从众人中脱颖而出的有效途径。

  懒得阅读前人的代码,因为它们太烂

  当我们有了一点工作经验之后,我们总是会抱怨工程中前人留下的代码太烂,总有一种推翻重写的冲动。

  很多时候,前人留下的代码质量如何,刚接触项目的人是会产生错误印象的。但是,我们要知道,之前的代码作者掌握的信息可能比我们目前看到的要多,我们现在考虑到的和没考虑到的,可能作者都已经考虑过了。

  更何况,编码犹如创作,有人说好就有人说不好。就像最近新获雨果奖的《北京折叠》,有些人觉得是中国科幻的进步,而另一些人则认为这不是一部成熟的作品。作为一名科幻迷,我也在朋友圈里对它进行了批评。对于一部原创作品来说,虽然每个人有坚持自己看法的权利,但我们应该理解,争议是会始终存在的。

  因此,对前人留下的东西,首先应保持敬畏,这样才有可能去了解它。

  即使是前人的代码真的很烂,那么我们在重构之前也应该彻底读通它,以保证在进行代码结构升级的时候不至于丢掉逻辑。

  要知道,读懂别人的代码,是一种更高的能力。

  一有问题就找Leader提问

  爱问问题,通常被认为是一种美德。

  但有一种情况,却可以被认为是懒于思考或不得要领的表现。

  假设你的Leader交给你一个任务:研究某项新技术,并把它用到项目中。很快,你就碰到一个解决不了的障碍。然后你去找Leader请教。

  结果,你的Leader在了解完你的问题之后,反问了你一些问题,比如:“如果换另外一种使用方式会怎么样呢?”,或者,“文档里提到的这个概念,好像跟另一个问题有关,它是什么意思呢?”,再或者,“这个问题到底是怎样产生的呢?它的底层原理你了解过没有呢?”

  这时如果你的回答是“不知道,我还没来得及看”,恐怕你的Leader就会在心里把“不善思考”的帽子扣在你头上了。

  这里其实有点像个陷阱。如果你的Leader问的这些问题你都能回答下来,那其实你多半已经能解决原来的问题了。

  所以,在把你的问题抛给你的Leader之前,要确保你已经充分探索了所有可能性,最好已经有了一些解决思路,只是需要你的Leader来帮你做一些权衡,到底选择哪一条思路。

  轻易说不可能实现

  产品同学们经常会找程序员确认一些想法的可行性,类似下面的对话:

产品同学: 这个地方的数据能否换成像XX软件那样的展示形式呢?
程序员: 不可能。我们服务端的数据存储格式根本不是那样设计的。
产品同学: 那这里的交互能改一改吗?让用户更方便操作一些。
程序员: 不能。我们用的这个控件这里是写死的。
产品同学:这个控件不能改一改吗?
程序员: 改不了,这是一个系统默认控件……

  作为技术人员,当被问及可行性的时候,应该仔细思考,必要的时候做一些调研,然后再给出答案。轻易地给出不可能的答案,可能会限制产品发展的思路。

  实际上,很多的不可能,是局限于现有实现而做出的片面的判断。跳出现有逻辑,很多不可能就能变成可能。

  要知道,许多伟大的产品都是突破了众多的不可能才产生的。而在不可能向可能转化的过程中,旧的技术体系被扬弃,新的开发方式被引入,原有的局限被突破,技术本身也必将经历一场浴火重生的洗礼。

  盯着QQ秒回消息

  在一家公司工作一段时间之后,你负责的东西越来越多,跟你有关的事情也变得越来越多。于是,公司内经常有人在QQ上找你帮忙,或者问你问题。

  每天从一上班开始,你的QQ图标就闪个不停。等你刚刚处理完,正准备编码实现一段算法的时候,QQ图标又亮了。

  同事都夸赞你秒回消息,有求必应。但你的核心开发任务却总是一再拖延。

  这里涉及到一个时间管理的问题。

  这个问题对于一些一线的技术管理人员,尤其严重。一会沟通协调,一会被拉去开个讨论会,再过一会又有人跑过来商量技术问题。疲于应付了将近一天,眼看到了下午五六点钟了。这时终于安静一点了,但你整个人身心俱疲,俨然已经是强弩之末,再也进入不了深入思考的状态了。于是,白天原计划完成的工作,也只能晚上拿回家去开夜车了。

  说实话,这个问题相当棘手。如果你能做到将注意力在不同的事情之间快速切换,我只能说你真的很厉害!这样你在被打断后,就能快速回到原来专注的事情上去。

  而对于普通人来说,类似番茄工作法那样,将时间精细切割,可能会有些效果。前提是你确实能够坚持下来,并在需要的时候保持足够的专注。

  现在我们在教育小孩的时候都知道,专注是一种很可贵的品质,有可能直接关系到他/她未来能取得的成就。但可惜的是,越来越多的成年人正在丧失这种品质。

  前段时间,我安装了微信的Mac版。结果一发而不可收拾,各种群消息不停地蹦出来,简直是专注力的一剂毒药。

  最终,忍痛卸载。

(自己读后的感受:刀刀刺中心窝T_T)

来自:https://kb.cnblogs.com/page/553361/

原文地址:https://www.cnblogs.com/1906859953Lucas/p/9210353.html

时间: 2024-12-07 14:51:51

程序员的那些反模式的相关文章

顶级程序员赢在思维模式,这些区别你注意到了吗?

我相信不同年龄段的程序员对何为顶尖程序员一词有着不同的理解,就像随着编程能力不断的提高,会渐渐有不一样的感悟一样.一般人都不愿意去研究自己不曾接触过的代码,很多人都没有尝试就放弃了.如果你经常去研究你没有接触过的代码,你就会越来越熟悉不同的代码结构和设计模式.现在人们很容易就接触到优秀的开源代码资源,你可以很方便的就下载下来做一些改动或者调试,去研究为什么代码可以这么写. 除了代码之外,很多人对于陌生的工作内容也会感到恐惧.每次换工作的时候,你可能都会遇到新公司的工作内容和以前工作的内容不一样的

阅读思考——被误用的敏捷和阻碍程序员成长的坏习惯

极限编程创始人Ron Jeffries建议开发者放弃敏捷 确实现在很多公司都在误用敏捷,盲目的推进项目的进度,拍脑袋定个乐观的项目进度,然后让开发在指定时间点交东西,最后开发被迫加班.然后项目出问题,市场推卸责任给产品方案,产品方案再推给开发.于是开发不仅要被迫的加班,还要成为背锅侠. 这种敏捷持续下去,优秀的开发会立刻,进而公司也必定受损. 当公司开始采用敏捷时,通常意味着他们正在努力改进工作方式.借助各种不同风格的指导和培训,他们可以提高问题的可见度,有助于高层管理人员和整个公司做出更明智的

程序员客栈携手野狗 体验国内领先的实时后端云协作

近日,国内领先的实时后端云"野狗wilddog"与国内领先的软件众包平台"程序员客栈"达成战略合作,计划通过程序员客栈众包平台发布的开发项目以及依托用户层面庞大的开发者,让更多的开发者免费体验国内领先的实时后端云服务.同时也方便提升程序员客栈用户更多开发体验,此次程序员客栈布局Saas化服务合作,利用软件众包结合第三方开发调用的模式,寻求最大程度的降级技术的开发成本解决方案的战略,同时也使程序员客栈客户多了更多的开发选择. 布局企业Saas服务合作,提升高效开发体验

(转)史上最全的程序员求职渠道总结

转自http://m.blog.csdn.net/blog/foruok/46798495 我前前后后写过多篇与程序员找工作相关的文章,比如程序员跳槽神级攻略,找工作的辟邪剑谱,任性,春节前辞职,程序员该不该考虑初创公司,这些文章都收录在我的漫谈程序员专栏里,它们从跳槽时机.跳槽原因.简历优化等不同侧面讨论了程序员找工作的那些事儿,受到很多人的关注.今天呢,我准备专门分析一下程序员求职渠道,有料是必须的,就算你搜遍互联网深挖全宇宙,也会发现这篇文章将是史上最全.最强.最有针对性的程序员求职渠道分

具有jQuery背景的程序员如何转换为AngularJS思考模式(译)

最近一直在研究angularjs,最大的感受就是它和之前的jQuery以及基于jQuery的各种库设计理念完全不同,如果不能认识到这点而对于之前做jQuery开发的程序员,去直接学习angularjs的话,很可能学了很久还不知道这个东西能用来干什么以及怎么使用,怎么和UI进行结合等问题,在stackoverflow上找到一篇关于这方面的文章,阅读之后颇有收获,在此基础上将它译成中文,以求抛砖引玉大家一同学习. 原问题:假如我熟悉利用jQuery去开发客户端应用,那么我怎么上手angularjs,

黑马程序员_ 利用oc的协议实现代理模式

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用. 在看过李明杰老师的课程后,我对代理模式有了最初步的理解,虽然还很浅显 但是也明白了代理模式的 一些作用跟用法.首先使用代理模式可以降低耦合度.大大的增强了代码的弹性. 举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票 最简单的方式就是 建立一个person类(小明) 一个agent类(代理类) ag

设计模式 模版方法模式 展现程序员的一天

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现.定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座).简单描述一下:本公司有程序猿.测试

程序员如何应对北上广高房价示例解说建造者模式

一.前言 最近北上广的房价蹭蹭的往上涨,如果你不买房房价再高和你一点毛关系都没有:但是大多数的人还是要面临买房子的. 北上广IT创业比重还是相当高的,所以众多的程序员面临着贵如天价的房子,有苦说不出. 无论房价怎么的涨,无论房价怎么的高,我们写程序的要笑对生活:要热爱工作,热爱人民,热爱社会主义,始终拥护党的领导! 扯房子扯的有点远了,我们下面回归今天的重点-建造者模式. 二.基本概念 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不

每个程序员都应牢记的7种坏味道,11种原则,23种模式

(一)7种设计坏味道 1.僵化性: 很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其它改动. 2.脆弱性: 对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题. 3.牢固性: 很难解开系统的纠结,使之成为一些可在其他系统中重用的组件. 4.粘滞性: 做正确的事情比做错误的事情要困难. 5.复杂性(不必要的): 设计中包含有不具任何直接好处的基础结构. 6.重复性(不必要的): 设计中包含有重复的结构,而该重复的结构本可以使用单一的抽象进行统一. 7.晦涩性: 很难阅