精华内容
下载资源
问答
  • 心理,再谈好代码

    2010-09-29 14:55:00
    ,再谈代码 什么代码才是代码?这真是个老得能拔掉牙齿的话题。吧,那让我们再在这刮沙尘暴的无聊时光里重复一次。的代码要是易读的代码、要做到职责分 离、要做到单一职责、要有高的执行效率.......
    
    

    什么代码才是好代码?这真是个老得能拔掉牙齿的话题。好吧,那让我们再在这刮沙尘暴的无聊时光里重复一次。好的代码要是易读的代码、要做到职责分 离、要做到单一职责、要有高的执行效率....

    等等,等等,这才抽象了,太书面化了。我只是一个菜鸟,刚写代码几年,也没念过什么书,能不能说得通俗易懂一些?

    好吧,我停下来,想,这真是个难缠的家伙。我说,这样吧,我推荐几本书你去看吧,《重构》熊节最近再版了,建议你去买一本。恩,等等,有个省钱的招,去图 灵俱乐部讨论组注册下,蹭赠书也很爽,哈哈。

    可是,你还没告诉我什么代码才是好代码呢?知道你也没什么好答案,我自己来说好了。

    省略掉此时我内心花花的汗水,下面是菜鸟的叙述:

    1.一致
    我发现自己有轻微的强迫症,当我碰到以下代码时,我就会冲动。
    冲动前代码:
    def imgName
    if(XXX){
       imgName="meigui"
    }else{
       imgName=""
    }
    冲动后代码:
    def imgName=XXX?"meigui":""

    尽管两段代码功能一致,但一旦我发现出现冲动前代码时,我就会感到不舒服,感到难受,就好像看到阅兵正步走不齐一样。方法名也是一样:
    冲动前:
    def testXXX(){}
    冲动后:
    def should_XXX_when_XXX(){}

    变量亦是如此:
    冲动前:
    def imgNode=resouce.adoptTo(Node)
    冲动后:
    def node=resouce.adoptTo(Node)

    总之,我不愿意看到同一个事情有两种实现方式,如果功能类似,那么不管是逻辑还是变量、方法名,我会强迫一致,整齐划一。

    关于一致,从调试代码的角度看,零星的不一致比大量的不一致更加糟糕,因为这时大部分地方的一致性会令人麻痹大意。在实现查询分页功能时,我们有这样一行 代码:
    nodeIterator.size
    这行代码的意思是获取查询结果的总数,大部分情况下它工作良好,但是在一种特殊情况下它返回了-1。这对我当时几乎是灾难性的,因为调试过程中我们始终相 信这行代码的行为一致,结果是花费了一个下午才找到这个问题。

    2.简洁
    我喜欢短的代码,对我而言,短的程序总是比更长一些的代码容易理解,小学时学课文就已经这样了,一看到大段的段落我总是会晕过去(特别是文言文,首先我就 对自己理解这段文字失去了信心)。这里要提到注释,即是这些注释明确是为了提高代码的可读性,也会增加我阅读代码的困难,所以我不会在方法里的任何位置添 加注释,撑死在个别方法声明前添加,并且这种情况也尽量避免,如果这个类确实包含了重要的不易理解的算法,我也只会在类声明前添加注释。

    关于自然语言,有一个基于经验的结论被称为Zipf定律,即:自然语言中最常用到的单词,其长度会趋于最短。

    我写代码的时候,能够简写尽量简写,例如,变量名,imageNode,我一定会写成imgNode;方法名procedureXXX,我一定会写成 procXXX,和讨厌大段代码一样,我非常讨厌命名很长的方法名和变量名,尽管这些名称这么长是为了更好的增加可读性,但可读性不是这样增加的。

    在我的第一份代码工作里,我们使用拼音来命名方法和变量(还好,没有包括类名),我讨厌这种命名方式的原因并不是因为我的语文老师不好以至于我前后鼻音不 分,而是这种写法根本排除了简写的可能性,甚至,为了避免歧义,有时不得不变得更长。

    3.联觉和顺序
    关于记忆,人类有两种重要的记忆能力:联觉和顺序记忆。

    关于联觉,一个例子是:你总可以一眼记住一个人的脸,比如范冰冰,尽管我到现在也不清楚她到底是单眼皮还是双眼皮,也不清楚她到底是厚嘴唇还是薄嘴唇。

    那么,在代码里,这里的表现就是局部,即一个功能的所有相关代码都集中在一个地方。我最讨厌的代码是这样的:最开始我打开一个文件,在阅读的过程中,我发 现一个不清楚的方法,于是我按下ctrl并点击鼠标,于是我跳到另外一个文件;接下来,在阅读另外一个方法里,我再次发现了一个不清楚的方法,于是我再次 按下ctrl并点击鼠标,哇哈,新的文件打开了....如此反复,终于当我打开最后一个文件时,我发现IDE的文件条里已经密密麻麻的排满了好几排文件, 于是,我移动鼠标,右键,弹出一个关闭菜单,我选择了close others,瞬间,哦米拖佛,整个世界清静了,但是,等等,我最初是打算干嘛来着?

    所以,请把所有相关联的代码都集中在一个地方,求您了。哦,对了,能不用接口请不要用接口,总会碰到这样的情况,打开好几排的文件,接口文件占了一半,我 靠,少几个接口会死啊。对了,这可能是您的一致性心理在作怪,对不起,对不起。

    关于局部,一个范例同样与调试有关,在很久之前的一次调试中,我们始终找不到一个变量错误的原因,因为在这段代码里,根本找不到任何错误,很久以后,终于 发现,这个变量竟然是个全局变量,嘿嘿,告诉你吧,这个变量在servlet里,04年的时候,网上很火的一篇文章,标题就是:不要在servlet里使 用全局变量!

    关于顺序,最典型的例子出现在高中化学里,我总也不能瞬间说出第12、13个化学元素是什么,我通常会这样记忆:氢氦锂铍硼碳氮氧氟氖钠镁铝硅磷,啊哈, 第12个元素是镁,第13个元素时铝,合起来就是--美女!

    所以,在代码里,请将互相调用的方法按顺序摆放,方法1先调用了方法2,那么请将方法2紧放在方法1后边。我讨厌这样的配置:打开方法1,发现其调用了方 法2,点击方法2,编辑器里的滚动条瞬间从最上端滚到最下端,紧接着,滚动条又从最下端滚动到中间,再接着,又是最下端,接着,归零到最上端....人生 经不起这样的大起大落,真的,那得要多么大的心脏啊,麦蒂才有过那么一次,13秒....

    还有,知道为什么goto为什么那么臭名昭著了吧。

    4.自然
    使得代码具有轻松的表达方式,同时把错误率降到最低,一种最重要的方法就是代码变得“自然”,即向自然语言靠拢。因为代码并不仅仅是与机器交流的,更重要 的是,需要在人之间交流。

    机器语言到高级语言,面向过程语言到面向对象语言,jdbc到hibernate,java到动态语言,这些都促使代码变得更加自然。

    Ruby里有个不起眼的特性,就是方法调用不用再写括号,这一特性是如此的微不足道但是却被很多人津津乐道,原因就是它更加自然,更加贴近我们的自然语 言。于是,我看到,我的同事晓娜,在groovy里,一遍遍的将她力所能及的括号去掉。

    此外,程序语言和自然语言是有区别的,除了不能在代码里利用感情词抒发情感之外(我想,如果可以,一定会看到很多的冯特),程序语言没有口语。很少看到程 序员之间这样交流,来吧,我们来说段代码(当然也有,徐昊就可以,哈哈),他们更多的会使用白板和笔或者直接是编辑器。所以,结束招聘时是否需要笔试的争 论吧,我真为那些不经过笔试就直接招人的公司感到羞愧,因为他们根本就不懂程序语言。

    此处省略华丽的分割线。

    此文谢谢我们项目组WGSN的激烈讨论,谢谢讨论中徐昊的精彩点评。

    展开全文
  • 先声明一下,本文不聊ISSUE中的七七八八,也不聊代码是否写的,更不聊是不是跟蔡徐坤有关之类的吃瓜内容。仅站在技术人的角度,从这次的代码泄露事件,聊聊在代码的安全管理上,通常都需要做哪些事来预防此类事件...

    先声明一下,本文不聊ISSUE中的七七八八,也不聊代码是否写的好,更不聊是不是跟蔡徐坤有关之类的吃瓜内容。仅站在技术人的角度,从这次的代码泄露事件,聊聊在代码的安全管理上,通常都需要做哪些事来预防此类事件的发生。同时,大家在阅读本文的时候,也可以深入思考下,自己团队是否也存在类似的问题,经过这次的事件,是否有必要针对性的做一些优化。

    最小权限

    “最小权限”原则是我们在学习Linux用户管理时候经常被提到,并且被反复强调的内容。该原则是指每个程序和系统用户都应该具有完成任务所必需的最小权限集合。赋予每一个合法动作最小的权限,就是为了保护数据以及功能避免受到错误或者恶意行为的破坏。

    在代码的安全管理上,“最小权限”原则同样适用。但是,从此次的代码泄露内容中可以看到,这一点做的并不好,一起来看看源自泄露代码的README介绍:

    从说明中,可以知道这是一个后端项目的大仓库,每个业务线都通过文件夹的方式管理自己的业务模块。那也就是说,每个业务模块的人都是可以看到这个大仓库的。继续看README最后的负责人信息:

    可以看到这个大仓库中包含了非常多的业务模块与相关负责人信息。

    由于Git的权限管理都是对整个仓库的,无法精细化到具体的文件夹。换言之,对于这个大仓库的访问,其实是有非常多的人员可以拿到全量代码的,而其中有大部分代码可能并不是自己业务线的内容。可见,这个仓库的内容,对于代码自身的保护上,并没有做到最小权限控制。所以,当出现代码泄漏的时候、对于泄露范围就很难控制。可能一个小环节的过失,就会导致非常大的泄漏灾难。

    配置分离

    配置与代码的分离,自云原生应用的流行开始,就一直被反复的强调。将配置内容隔离开之后,赋予代码的将仅仅是逻辑,对于各种与环境相关的敏感信息都应该被剥离出去,这就使得代码中将不再含有各种环境信息和敏感信息。同时,这么做也可以轻松的实现多环境的不同配置,这种实现方式与我们传统通过构建工具来实现的多环境是完全不同的。只有在严格分离了配置之后,才真正的可以实现:一次构建,多处运行的目标。基于构建工具实现的多环境部署,实质上多次构建,多处运行的结果,每个环境运行的介质只是上都不是同一个程序。

    为什么要强调这一点呢?同样的,我们看看从网络上流出的一段代码片段:

    如果这段代码是真实存在的话,那么配置管理和安全意识上确实就做得非常差了。

    所以,对于配置中心的建设,大论大小团队,从安全角度上来说,都是非常重要的。何况在目前有大量开源配置中心的大背景之下,做到配置分离,是一件性价比非常高的事。如果做到这一点,那么即使代码有流出,对于重要密钥、数据库账户密码等等敏感信息也不会被泄露。

    外部监控

    任何与安全相关的内容,都少不了监控。事前的所有策略,最终都有可能被一一击破,留给我们最后的一道防线就是在事件发生之后马上得将其堵住,以防止问题的扩大,而造成更大的损失。

    在笔者知道这件事的时候,距离代码上传已经有6小时之久了。各类技术讨论群中几乎也都是相关信息的八卦。几乎每一次刷新页面,都是几百Star的增长。虽然处理的速度不能说快,但是没过多久,与之相关的仓库都开始无法访问。至于,是不是有做代码泄露扫描的监控,我们不得而知。因为,在扫描告警之后,对于代码的扩散控制,作为B站来说,本身是被动的,还是需要Github等仓库运营方来完成。所以,这中间到底哪一步慢了,我们无法考证。

    不过这些都不重要,这里主要强调一点,除了管理上的防护之外,必须留一手外部监控,以快速的发现泄漏并采取措施。这块可能大部分开发人员不太了解,这边我就稍微提一下。做一下这个是不是很费劲?

    对于很多中小团队来说,可能本身就没有什么人力去做这件事,那么是不是就没办法了呢?实际上,很多安全服务商,甚至一些大型互联网公司都有提供这样的产品服务,比如携程的Github Scan:

    如果说,你连买这类产品的钱都不想出,那么顺手推荐一个开源项目可以参考一下:Github leaked patrol

    最近,欢迎留言交流,说说大家所在团队对于代码的安全性都是如何做的?用了什么商业服务?或是用了什么开源软件?欢迎一起分享学习与进步!

    展开全文
  • 其实不是,我能看懂代码中的每一句话,并没有我不认识的语法,但连在一起就不懂为什么作者要这么安排代码了。 后来我渐渐有了一些想法,代码是程序员给计算机的命令,是作者思考过后的产物,但思考的过程却没有体现...
        

    自我开始编程以来,我一直觉得读别人的代码的难度,要几倍于自己写代码。一直以来我都很困惑,难道是我技艺不精,所以读别人的代码很困难么。

    其实不是,我能看懂代码中的每一句话,并没有我不认识的语法,但连在一起就不懂为什么作者要这么安排代码了。

    后来我渐渐有了一些想法,代码是程序员给计算机的命令,是作者思考过后的产物,但思考的过程却没有体现在代码上,这就好比一道数学题,只有一个最终答案,所有的计算过程都被省略掉了,自然难以理解作者的意图。一段代码一开始写出来,后来发现存在问题,陆陆续续地改过好几版是很常见的事情。最终版本中可能每个小的细节,都是作者花了很多时间试错的结果,但这个试错的过程并没有直接地体现在代码上。

    另一方面,代码中往往存在一些「隐含前提」,例如假定函数的参数已经在传入之前被以某种方式处理过了,这个假定很可能与另一个文件的某行代码有关,这种联系很难引起阅读者的注意。当然,好的设计可以缓解这个问题,但很难被彻底地解决。

    代码的历史会被保存在版本控制系统里,但说实话,按我的经验,很少真的有人去翻版本历史,因为正确地使用版本控制工具相比起写代码是一项比较不受重视的技能,在这种情况下翻历史是非常耗时的。当然,有些人会将一些细节以注释的形式添加到代码中,但注释也只能承载很小的一部分信息,因为维护注释也是一项很高的成本,我个人一向是反对添加注释来解释代码的。

    所以阅读代码实际上并没有看上去那么轻松,为了彻底理解一段代码,很有可能你需要付出和编写这段代码差不多的努力,来了解这段代码的历史和前提。

    前面提到的是阅读「好的代码」的情况,比如大多数活跃的开源项目,如果是面对质量较差的代码情况就更为糟糕了。

    所以我的观点是,读代码绝对不是一种好的学习方式,我认为学习一项技术应当先阅读书籍,然后尝试自己实践,最后再参考代码质量较高开源项目。

    对于大多数项目而言,可能从未把「供他人学习」当作目标,只有当你自己实践过,积累了一些经验并且也遇到过一些困难的时候,你才能读懂代码并且从中学到解决问题的技巧。而在开始实践之前,最好的知识来源是书籍,因为书籍的内容是经过精心的安排的,最高目标就是供他人阅读。

    https://jysperm.me/2015/02/reading-code/

    展开全文
  • 什么写了几年代码什么长进

    千次阅读 热门讨论 2017-03-01 00:00:15
    我作为一个小程序员,写了4年多代码,每年写代码都是一个感觉...后来这段经历给我的印象非常深刻,从此我对如何写好代码有了新的认识。第二次我觉得就是最近在这家公司,我因为在这家公司非常闲,所以有很多时间看一些

    我作为一个小程序员,写了4年多代码,每年写代码都是一个感觉。虽然也经常拜读先贤的经典著作,然而并没有起到什么实际的作用。我个人觉得写代码长进最大的两个阶段:第一次是在北京中关村工作,跟同事一起完成一个任务,同事经常对我的代码进行重构,我也经常在一边学习观看。后来这段经历给我的印象非常深刻,从此我对如何写好代码有了新的认识。第二次我觉得就是最近在这家公司,我因为在这家公司非常闲,所以有很多时间看一些人录制的视频教程,他们编写代码的风格对我产生了潜移默化的影响,后来在公司写代码时,学会了思考。

            最近我听了一个词说菜鸟写的代码就跟面条似的,很长。相反,我觉得高手写的代码应该是三明治式的,可以随意添加口味。在这里我觉得站在一个较高的角度看待这个问题,我需要思考:为什么写代码长进这么慢。根据我个人的经验我觉得有以下可以去努力的地方:

             1、多看别人写代码。我觉得那句话特别对:善于站在巨人的肩膀上。善于把别人的经验当成自己的经验,这样才能快速成长。今天看了别人写了一个内部类,没准哪天你自己不由自主的也能写一个内部类,所以多看对于扩展视野非常重要。

             2、积累一定的代码量。没有代码量,还是洗洗睡吧。

            3、代码就是在应对变化中体现美的。我身边很多程序员非常害怕需要改变,程序员又需要改动代码整理逻辑。我觉得需求不变的项目是不存在的,我们正式在改变需要这种看似困难的情况下,体现出我们代码以不变应万变的能力。

           4、善于思考。只有思考了,沉淀出来的东西才是自己的。我们都听说过什么扩展性,高并发等高大上的东西,到底这是什么呢?如果你经过努力仍然没有弄明白,请不要放弃,继续保持好奇,总有一天你会恍然大悟。

          总结:代码之路就是一个程序员成长之路。只有不断前进,才知道路在何方。

    展开全文
  • 如何阅读和学习开源代码

    千次阅读 2017-10-05 11:56:13
    但是经常有些人拿到开源代码以后不知道如何下手,这里分享一下我的一些经验。 1.拿到代码以后编译运行它,了解它干什么的,实现了功能。 2.从入口点开始阅读,按照流程,了解这个软件是怎么运行起来的。 3....
  • 关于代码一些问题

    2020-12-01 16:57:35
    这样就更不存在什么代码精简与否的问题了。 更糟糕的是,这样的代码会带来诸多问题。代码的可读性首当其冲,在这样的代码压缩下,不仅其他读者看不懂代码,UP自己过几个月之后再来阅读代码...
  • 一、为什么要阅读源代码?       很多作家成名之前都阅读过大量的优秀文学作品,经过长期的阅读和写作积累,慢慢的才有可能写出一些好的、甚至是优秀的文学作品...
  • 努力学习编程?...将应用程序创意转换为实际代码需要一些练习。 为了弥合你希望应用程序执行的操作和需要编写的实际代码之间的差距,可以使用伪代码什么是伪代码? 伪代码是一段代码或算法的纯文本.
  • 学习python有什么好的用处可以做一个偷懒的程序员。Python代码少,开发快。python中“类”有什么用?为什么要使用类?类,里面可以写实现一些功能的代码。类可以减少代码的复用。你搜“面向对象”,自己去理解吧,这...
  • 但是经常有些人拿到开源代码以后不知道如何下手,这里分享一下我的一些经验。 1.拿到代码以后编译运行它,了解它干什么的,实现了功能。 2.从入口点开始阅读,按照流程,了解这个软件是怎么运行起来的。 3.从整体...
  • 虽然说语言,Bug 修到老。但是行走技术江湖,学习多门语言防身,依然是每个奋战在一线程序员的必备功课。那么,编程语言究竟应该怎么?这个问题大概比“救女友还是救老妈?”更值得关心,毕竟一门编程语言会...
  • 很多同学在学习了一段时间之后甚至会怀疑学习语言的用处,因为总是写不出东西,只会写一些简单的打印代码。(推荐学习:Python视频教程)这个叫做geekcomputers/Python的项目很的回答了一个问题,就是学习pytho...
  • 很多同学在学习了一段时间之后甚至会怀疑学习语言的用处,因为总是写不出东西,只会写一些简单的打印代码。(推荐学习:Python视频教程)这个叫做geekcomputers/Python的项目很的回答了一个问题,就是学习pytho...
  • 什么好学生,不好编程?

    千次阅读 2020-06-05 11:09:55
    答:一些好学生,写不了代码;而一些“差学生”写程序却很厉害。这个问题,我在很多大学都遇到过。以下,谈谈我的观点。(本文仅表达个人观点,无意冒犯) 第一,“学生”的学习方法,不适合编程。 很多...
  • 请参阅flutter官网学习的flutter布局及其他一些flutter基础知识的示例代码。 大部分都提示注释了,单击指定dart文件的main方法上的Run(IDE有相关插件),可以运行查看效果。 放在其他地方比较杂乱每次都翻官网也...
  • 推荐5款强大且免费的Python IDE给...到底哪一款,主要取决于个人习惯,有的人会说Python完善的配置、零配置很,可是也会有一些开发者认为vim更。个人使用习惯固然在Python开发工具的选择过程中扮演者举足轻重...
  • 2 找个案例,最好规模小些,但有前后端,比如ssm或spring boot,运行通后看效果,结合效果看关键代码,如果是一些书,还会有解释。这里的关键点是先调通,这就很不容易。 3 然后积累些学习项目经验,去小公司找实践...
  • 程序猿声代码黑科技的分享区一、前言很早之前就想写这篇文章了,由于各种不可描述的原因拖延到了现在,今儿就把坑给填上吧~前排提示:小伙伴们可以收藏下这篇文章哦,说不定那天你们就用上了。因为真的是很干货哦!...
  • 一些学习css的地方

    2010-08-27 09:30:00
    如果你还有什么怀疑,进入这个站点,好好看看里面的代码!The Web Developer's Network:css的有力资源站,里面的应用都非常实在!Official Cascading Style Sheets Level 2 Specification:想学好css?来这里看...
  • 从八月份开始自学C语言,懵懵懂懂的学习了一些语法,会初步使用指针与函数。也接触了一些基本算法,如排序算法中的桶排序、快速排序、冒泡排序,深度优先搜索,简易贪心、栈、队列、枚举算法等等。 经过两个月的刷题...
  • HaspMap底层代码学习

    2017-12-12 16:44:45
    最近在微信工作号上看到一篇文章,忍不住推荐一波,供大家学习,关注这个微信号还是能一些东西的,下面微信工作号文章的地址 什么是HashMap 众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个...
  • 第一个部分就是为大家介绍了Python的所有基本概念还有一些常见的扩展库的介绍,包括经常会使用到的列表、字典、代码测试等等基础内容。 第二个部分就是实践部分,大家都知道项目实践经验有多么的宝贵,这本书在第二...
  • “我能看懂代码,但是让我自己写却写不出来”,这样的话在我刚开始的时候自己也说过,但后来会写代码之后,会发现这样的说法是没过脑子的,也没有仔细去探究一下根本原因是什么,“能看懂”这样的说法可以说是记忆,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,057
精华内容 1,622
关键字:

学什么代码好一些