热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

少编码多思考:代码越多问题越多

大约一年前,我曾编写过一些PHPWeb编程守则——MicroPHPManifesto。但我发现各个语言之间有一些共同的编程/编码规则,这或许是我在熟悉各种类型的编程语言后的一些收获吧

下面是我总结出来的一些规则,并且在实际中应该牢记于心。

学习语言而不是框架

我喜欢PHP、Python和Javascript,喜欢用他们做些东西。但我却不是Symfony、Django、jQuery开发人员。

我认为这有很大的区别。一个人很有可能成为一名jQuery程序员而非Javascript,也有可能成为Django程序员而不是Python。在实际应用中,的确存在许多有价值且非常实用的工具和框架,但如果我仅知道如何使用一个框架,我想表达的观点是在工作上只使用合适的工具其实会给任务带来一些限制,你可以查看一下,看看你用的工具,看看你用的框架。以我的经验来看,一些复杂的全栈(full-stack)框架并不是非常合适的工具,尤其在灵活性和性能方面都不是太好。

集中精力学习一门语言会让程序员变的更加灵活。全栈式复杂框架可以帮助我快速的构建某个产品,但当我需要一个不属于框架范围内的解决方案时,它反而会变成一种伤害。我经常会采用“plug和pray”方法进行开发,当我发现某个库或插件可以满足需求时,我就会把它们应用到产品里。这样可能会使应用程序快速推出,但在以后的道路上会留下很多障碍。

此外,学习全栈框架和学习新语言一样复杂。它们通常都有复杂的体系结构和术语,并且有些部分并不适用于其他框架和工具上。当然框架也有许多好处,但前提是你必须要懂这门语言,然后才能理解其真正的工作原理,所以我宁愿花时间学习更多关于语言本身的东西,并且把所学的技能应用到其他语言或者库上。

构建小模块

有些小型的单元代码是很好很讨程序员们喜欢的,因为越小越容易理解且很难把它弄的很糟,所以限制编写冗长复杂的代码是非常重要的。

所以有目的的构建一些小模块——尽可能的接近需求目标。它们应该是独立的块,单纯地解决某方面问题,但是把它们结合起来时,就可以解决许多大型的、复杂的问题。

像这些简单的模块代码修复起bug来也会非常容易。因为这些单独的块通俗易懂,一看就会知道其用途。如果模块是自我包含的,那么测试起来会更加简单。

代码越少越好

套用Biggie Smalls的一句话:“代码越多,问题也就越多”。

谁都喜欢管理少的代码。估计大家都有过这样的体会,当审查一个功能模块的代码时,如果代码很多很乱,第一印象肯定不好,相反,如果该模块代码简洁明了,你会非常愉悦。更通俗点讲就是代码越多,管理起来也就越困难:搜索代码库的时间会变长、查看文件导航也需要较长的时间、跟踪执行也会变的困难等。

你是否发现,代码审查、还有你使用的工具,很大程度上都是用来减少代码量的。那些庞大的库和长代码似乎会溢出人们的大脑缓冲区。当我在追踪一段较长的源码或执行跳跃好几个源文件的功能时,我会感到很苦恼。这就是为什么我会喜欢给语法进行着色的编辑器,并且保持一致的空格对我也非常有帮助。

除了喜欢管理较少的代码外,我还支持开发者们尽量简化代码。程序员要为应用程序所使用的代码,不仅仅是自己编写的部分负责——甚至是这些应用里的每行代码。这也就意味着要替这些应用里出现的bug或者安全漏洞负责。

你会在程序中使用自己不理解的代码吗?这并不表示我从不使用他人的代码——坦白说,世上有许多优秀的程序员,但是在应用他人代码的时候,你必须理解代码,因为应用程序里的每行代码都很重要。在编码时千万不要忘记思考,编写最少代码的背后应该是多思考,这样就不会给自己带来不必要的麻烦。

编写简单、有用可读的代码

编写容易理解的代码,少编码多思考,这样完成一个功能就会很快,生产力就会得到提高。

当然,我也希望代码是可验证的。并且我一直认为简单、模块化的代码是更容易被测试。

代码应具备的另一特征就是可读。代码应简洁明了,语义清楚。在编写代码时,我会思考其他程序员在第一眼看到它的时候会花多长时间来理解。或者一两个月后我自己能一目了然吗?正如大家熟知的那句编程谚语:任何一个傻瓜都会写出能够让机器理解的代码,只有好的程序员才能写出人类可以理解的代码。当我试图发现它们工作原理的时间越少,做的事情就会越多。

但是很少有人能坚持这些规则,如果我说是,那么我肯定是在撒谎。有时候我也会很懒惰,甚至由于时间限制,我会编写一些复杂的、难以理解的代码或者使用没有审查的库来实现某个功能。想要在短期内编写简单、清晰的代码会很困难——它需要更多的纪律和不断的技术评估。特别是那种对时间敏感的项目,实行起来将会更难。

但是,当你花时间和精力去做的时候,你会发现功夫不负有心人——不仅仅对自己有帮助,还会给其他团队成员带来很多益处。


推荐阅读
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
  • 学习一门编程语言,除了语法,最重要的是学习解决问题。很多时候单凭自己的能力确实无法做到完美解决,所以无论是搜索引擎、社区、文档还是博客&# ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Request对象和Response对象request:(请求)当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。Djang ... [详细]
author-avatar
技术小白
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有