不要和一种编程语言厮守终生:为工作正确选择 -pg电子游戏网站

我们程序员在着手一个项目时,需要做的关键决定之一就是选择一种语言,或一组语言,用于实施该系统。这一决定不仅会影响系统的实现,也会影响设计。例如,我们应该使用面向对象的语言还是过程语言?选择什么语言对项目以及作为项目一部分的程序的生命周期有着深远的影响,很多次,我们基于一些非常善变的因素,没有思考太多就去选语言:这语言是我惯常用来实现这类系统的;这语言我了解得最透彻;这是我最喜欢的语言,我很享受于用这种语言编程;等等。

既然这个决定会导致深刻而长远的结果,那么我们是不是在做这个抉择时应该更加务实?很多时候,我们会盲目地偏颇于我们选择的语言。而且,有时候我们之所以不喜欢选择这种语言的原因可能正是为什么我们要选择那种语言的原因。



如果我们能够放开胸怀,坦诚地对待自己持有的偏见,那么我们就可以减轻一些类似在装修时硬要将方钉钉进圆形孔的痛苦。虽然我们没有什么秘诀来为项目选择完美语言,但还是可以遵循一些原则,帮助我们做出一个更好,更合适的语言选择。

没有完美的语言

这一点对任何人,甚至是新手而言,都是在意料之中的,并且我们很多人都愿意承认,“当然,这种语言并不是完美的语言,”但与此同时,我们很多人还是会说,“这语是最好的编程语言”。说一种语言是项目的最好语言的关键是项目的背景,也就是说,最好的语言只存在于一定的范围内。这就是我们的第一条原则:
引用

没有完美的语言:每一种语言都有它的优点和缺点。

例如,许多通常使用运行时语言,如java或python的开发人员,声称c或c 令人透不过气来,会因为关注例如内存管理这类低层次的细节,或关心编译时类型检查的严格粒度,而扼杀分置于开发人员的职责。这是事实,只要我们正在开发的项目不关注看似琐碎的任务,如内存管理或发生在单一循环中的copy-assignment的数量。

相反,如果我们工作在一个项目,或项目的一部分,那么对于代码应该如何高效以及程序的关键性安全的偏见需求是自然而然的,这些看似繁琐的细节可能正是我们正在寻找的粒度水平。在这种新的背景下,java或python的运行时性质似乎过于漠不关心或过于心不在焉。相反,我们希望当内存分配和释放的时候,能够严格控制有多少move-assignment和copy-assignment被执行,并在编译时捕捉尽可能多的错误,而不是让错误渗入运行时(表现为运行时异常)。

虽然在理论上“没有完美的语言”这一点听起来是显而易见的,但是我们作为开发人员的行为通常会背离这个概念:我们说我们知道我们最喜欢的语言是不完美的,但我们还是继续对我们开发的项目使用这种语言,不管它是否适合。此外,当其他的开发人员质疑我们选择的语言时,我们会坚决捍卫我们的选择,而不愿意从他或她的反驳中看见事实的真相。请记住:每一种语言都有它的优点和缺点。了解你掌握的语言的优点和缺点,然后根据实际情况做出选择。

你不喜欢一种语言的原因可能就是你应该使用它的原因

这似乎违反直觉,但有的时候,我们之所以不喜欢一门语言可能正是使用某种语言的原因。还是上面的例子,在我作为一个c 开发人员的经验中,很多时候因为有那么多不同的概念要跟踪(内存管理和对象寿命时间,c 编程三原则等),以致于完成项目的一个简单功能都会变得繁琐不堪。在用c 开发几周之后,使用python,java或另一种“更高级”的语言,简直就像上天的恩赐:但真的是这样的吗?

有时候,可能我们不喜欢一门语言的原因正是我们要使用该语言的原因。如果我正在开发一个驱动程序或一些关键性安全,实时的系统,上面表述的繁琐不堪的原因可能正是这个语言的最大优势。例如,c 提供了一种机制用于表达当对象被复制时被执行的逻辑,这在效率和严谨性井然有序的时候是非常宝贵的。

这可能看上去都很好都很棒,因此我们很难确切指出在某个背景下,某种你看不顺眼的语言可能反而更有帮助。那么,我们该怎么知道哪些你不喜欢的语言是有帮助的呢?这就引出了我们的第二条原则:
对自己要诚实:知道自己为什么不喜欢一门语言,不要教条化自己的憎恶。

例如,在上面那个c 的例子中,我之所以不喜欢长时间地用c 编程,是因为这语言要求思想严谨,否则很容易犯错,就像是被困于丛林中(过多地关注树木,而不是树林这个整体)。这种严谨会妨碍开发人员去质疑,如,“我要在堆栈上或堆上创建对象吗,或者部分在堆栈上,另一部分在堆上?”或“要让这个类可扩展,应该通过模板参数还是通过继承?”等决定。在其他语言中,开发人员只需分别创建一个对象以及使用面向对象的继承就可以完成这些任务,然后进入到下一个功能,因为语言(或者,更准确地说,编译器或解释器)关注这些细节。

但是,如果我对自己诚实的话,我会承认,我之所以不喜欢c 的这些功能,是因为它将表达这些细节的责任归咎于我。在其他语言中,我不仅不需要负责这些细节,而且我也没有责任表达这些细节:它们被抽象远离开发人员。在一个这些细节是必不可少的上下文中,我不喜欢c 的原因正是我应该使用这种语言的原因。

这是否意味着,我们应该愁眉苦脸地使用这些会让我们对这语言恼怒的功能?也没有必要。或许你可以换个角度:不要将这些功能当作缺点,也许我们应该拥抱它们,将它们当作完成任务的必需品。我们不应该说“这真是一个悲剧,”而应该说,“谢天谢地,我居然能用这种语言做到这一点。”请记住:在某些背景下,这些功能将是上天的恩赐,而在其他情况下,它们 才是累赘。至于为什么不喜欢某一门语言的功能,请诚实地告诉自己。

越熟悉其他语言,越好

对于这一点,就是我们要说的第三个原则:
引用
如果你拥有的唯一工具是一个锤子,那么你看每一个问题都像是钉子。

这条规则并不适用于软件工程,但它尖锐地表现了许多软件开发的情况。很多时候,我们选择一种语言,或一种语言支持的工具(如java的jms,python的asyncio,rails的ruby等),是因为我们知道它们存在。如果我们唯一熟悉的语言是java,那么我们会将我们碰到的所有问题都适应到java的上下文中。例如,“我需要为一个通信应用创建一个路由框架。在java中我该怎么做呢?”这就限制了可供我们使用的工具,并人为地限制我们为完成工作选择合适工具的余地。

解决这个问题的方法是扩大你的视野,了解其他语言的的功能和错综复杂之处。正如andrew hunt和david thomas在《the pragmatic programmer》中给出的建议,一个好的做法就是,每年学习一门新的语言。这可不没有听上去那么容易,学习一门语言对不同的人将意味着不同的事情。还有一个衍生问题是,我们对正在进行中的项目往往只会使用这一种语言,从而使得学习的另一种语言显得毫无用处。例如,假设我是一个android开发人员,基本上每天只用java,那么学习c#可能就会显得不合时宜地浪费时间。

不要被假象所蒙蔽。学习其他语言的优势体现在我们能从不同的角度去看问题,并且使用最适合该问题的工具。为了做到这一点,我们必须学习其他语言的相关警告,以及开发人员使用这些语言解决问题的方式。例如,如果一个开发人员想用c 执行元编程,那么他或她可以使用c 中的template metaprogrammming(tmp),但他或她也可以使用java中的反射。理解其他语言是如何解决类似问题的,可以减少我们认为它毫无用处的风险。

再说一个例子,如果我们需要能够改变一个类的运行时特征,那么一个深入熟悉c 错综复杂性的c 开发人员,可能会试图编造一个延伸这个编译时语言的界限的pg电子游戏网站的解决方案。而另一个c 开发人员,由于对java也有一定的了解,就能够说,“我喜欢c ,但java的运行时反射更适合解决这个问题。”

因为有如此之多的编程语言任开发人员择选,因此,优先安排学习什么语言很重要。不妨从当今最流行的语言入手(可参考《most popular languages on github》,《language trends on github》,《the 9 most popular computer languages》,《according to the facebook for programmers》等)。

语言是手段而不是目的

这是第四条,也是最后一条原则,听上去可能最哲学,但也可以说是最重要的:
引用
编程语言是一种手段,而不是目的。

除非你是一个语言标准的作者或是一个编译器的作者,否则你就应该将编程语言当作是一种手段而不是目的,目的是完成项目:最终的目标是要完成项目,而不是使用特定的语言。这并不意味着每个开发人员就无权要求他或她喜欢或不喜欢的语言(实际上,如果我们对自己诚实的话,这些好恶反而能够让我们受惠;参见上面的第二条原则),但我们不应该自欺欺人作出这样的决定,如,“这对我来说是使用该语言这一功能的一个很好的机会”,除非该语言的功能真正适合项目的需求。

重要的是要记住,语言只是表达如何解决手头问题的一种方法:请确保你选择了最能表达解决问题域的语言。

其他需要考虑的地方

下面是一些我们在选择语言的时候,需要补充考虑的地方:

考虑语言如何与其他语言的交互。例如,如果你认定python是完成大部分项目的最好语言,但在你的项目中有一个定义良好的组件,需要极高水平的粒度或效率(更适合用c或c ),这并不意味着你不能在这个项目上使用python。相反,考虑使用python,特定组件用c或c 写,然后使用python c api接口此组件。请注意,要制定这样的pg电子游戏网站的解决方案,我们需要知道python有一个c api;因此,了解最流行语言的这些功能是很有帮助的。

中间件可以允许使用多种语言
。例如,如果有两个必须进行通信的应用程序,如移动设备和一个服务器应用程序,但这并不意味着它们必须使用相同的语言(当然也可以相同,如果你判断认为这是最好决定的话)。如果这个移动设备是一款android手机,而服务器应用程序非常适合作为一个python应用程序的话,那么使用一个消息代理,如rabbitmq,可以让你在通信的同时使用这两种语言:android应用程序可以使用java rabbitmq api,而服务器应用程序可以使用python rabbitmq api。

拥抱其他语言的古怪之处。如果你是一个java开发人员,那么你会使用包来分隔源代码的逻辑单元;如果你是一个python开发人员,那么你会使用python的包结构做相同的事情;如果你是一个c 开发人员,那么你会使用命名空间或前缀的类名(即“dzone_myclassname”)。了解你正在使用的语言的特别之处,并拥抱它们:在罗马,就入乡随俗。否则的话就像是因为你更喜欢单词用意大利语发音,而用意大利口音说德语,这样就显得不伦不类了。当然也有可能一种语言的一个功能长期存在,但是这样的话,其中必有其原因:确保自己明白其中的道理。

译文链接:
英文原文:
翻译作者:码农网 – 小峰
  • 大小: 21.9 kb
来自:
3
1
评论 共 1 条 请登录后发表评论
1 楼 2016-04-04 15:59
php是世界上最好的语言,值得终身厮守

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 在"wpf分页datagrid"中介绍了如何实现分页功能,本文中介绍如果实现右键菜单。点击菜单项age,将age列隐藏,再点击则显示;并实现移动列后,同步显示。 详见:http://blog.csdn.net/qing2005/article/details/7683205

  • 给datagrid加上右键菜单              sunhai   开发工具:microsoft visual studio .net 2003   操作系统:windows xp                 用xml作为datagrid的数据源  代码如下:dim filename as stringdim myxmldataset as new da

  • 按照正常逻辑代码一开始代码实现如下 <datagrid.contextmenu> <contextmenu> <menuitem x:name="merge" header="合并账号" command="{binding mergeaccountcommand}" commandparamet...

  • 最近的一个项目前台使用的easyui,每个界面都有datagrid控件,按照我们的想法,应该做出来的效果是单击选中,双击可编辑,当然右键也应该出现这些菜单按钮,想的挺好,那么该如何实现呢?一开始不知道如何下手,查了一些资料,也走了很多弯路,主要是查到代码以后不知道写在哪里。。导致弄了一天也没有做出来,后来换了一个思路,终于完成了。 首先建一个datagr...

  • winform中datagridview 加上 contextmenustrip 实现右键点击展示菜单,且可以获取数据(在没数据的地方不显示右键菜单,以及右键时焦点进行改变)

  • js实现页面右键菜单

  • 1、页面添加一个div,设置右键菜单显示列表 <div id="rightclickdiv" class="easyui-menu" style="width: 115px;"> <div data-options="iconcls:'icon-edit',name:'001'">编辑</div> <div data-options="iconcls:'icon-remove',name:'002'">删除</div> ..

  • js  (function($) {     var d = $(document).data("func", {});         $.smartmenu = $.noop;     $.noop = function () {         $(this).siblings().removeclass('selected');//单行选择     }     $.fn.smartmen...

  • 1. 2.右键菜单,主要是用onrowcontextmenu:function(e,index,row){}方法来实现 onrowcontextmenu:function(e,index,row){ e.preventdefault();//阻止浏览器默认事件,因为在右键菜单时候,如果不阻止浏览器默认的,浏览器的默认菜单就会弹出 ...

  • onrowcontextmenu,easyui提供了这个方法,来实现右键出现菜单。其中给了三个参数:e,index,row. 大多数人会出现这样的问题,你发现,当你右键的时候,总是浏览器的菜单出现 onrowcontextmenu : function(e,rowindex,rowdata){ e.preventdefault();//阻止向上冒泡 $('#

  • 欢迎大家转载,转载请注明出处! 希望这个笔记对自己和大家有用,但是本人水平有限,如果出错的地方,希望大家指出,多多批评,谢谢! 今天是datagrid框架的冻结列和右键菜单: 废话就不多说了,直接上代码,上面的注释写的挺多的: 先是冻结列代码: frozencolumns: [[ //冻结列 就是指定显示参照列 使其不会出现滚动条 ...

  • 插入右键控件(contextmenustrip) private int index = 0; private void datagridview1_cellmouseup(object sender, datagridviewcellmouseeventargs e) { if (e.button == system.windows.form

  • 如题,很多时候,在datagrid中右键菜单时,当前没有选中行。这就很恶心了对不,如果我是对某一行进行处理,难道还要先用左键选中这一行?博主就被这个恶心了一把,然后在大佬博客帮助下找到了一个方法,(命中测试)。这个的原理是如果在鼠标没有选中某行的情况下进行右键,会判断鼠标位置,然后根据位置找到当前层级,默认选中最高的也就是最外边那一层,也就是我们的“行”。然后根据大佬博客总结了一下代码:

  •  即使是javascript被禁止,这些右键菜单仍然能正常显示。所以,如果你想尊重用户的选择,最好的方法是用javascript来创建这些菜单元素,注入到dom元素里,这样,当javascript被禁止时,这些右键菜单也不显示了。 html5规范里有一个被大家忽略里的好东西,那就是右键菜单。html5里的右键菜单规范显示,程序员可以通过创建简单的html5menu和menuitem标记

  • 原始的右击菜单一次只能选择一项,这个demo更改为弹出框,一次性选择多项。 easyuipg电子游戏网站官网上,datagrid的表头右击菜单用于选择显示或隐藏的列,但是每一次只能选择一个显示或隐藏。原始效果如下: 菜单每单击一次便消失。 因此,我将右击功能更改为弹出对话框,获取表头内容加载到对话框中,设置为复选框,一次性选择显示或隐藏的列。效果如下: 这样比较方便,一次性选择完毕。 代码在我的...

  • 废话不多说,直接上代码,如下。&lt;!doctype html&gt; &lt;html lang="zh-cn"&gt; &lt;head&gt; &lt;meta charset="gbk"&gt; &lt;meta http-equiv="x-ua-compatible" content="ie=edge"&gt; &

  • 需求分析:设计一个自定义菜单,默认是隐藏的。当单击右键的时候,在浏览器中可以打开,进行显示菜单。当点击屏幕任意位置的时候,自定义的右键菜单可以关闭。 设计思路:先是获取菜单元素,通过return false 关闭浏览器自带的菜单。获取鼠标的坐标以及获取当前窗口的宽度和高度,通过math函数的min方法,进行调整宽度和高度。当鼠标再次点击的时候,自定义菜单的样式设置为隐藏。 实现代码: ...

  • //添加鼠标滑过事件 onloadsuccess:function(){ $(".datagrid-row").mouseover(function(){ }); $(".datagrid-row").mouseout(function(){ }); },

global site tag (gtag.js) - google analytics
网站地图