程序员的代码行数越少越好?

有些人可能会认为,应用程序中的代码行越少,就越容易阅读。这句话只有部分正确,我认为代码可读性的度量标准包括:

  • 代码应具备一致性

  • 代码应具备自我描述性

  • 代码应具备良好的文档

  • 代码应使用稳定的现代功能

  • 代码不应过于复杂

  • 代码的性能不能有问题(不要故意编写速度过慢的代码)

如果减少代码行数会影响到上面任何一条,那么就有问题。实际上,基本上减少代码行数都会影响到上面的标准,因此总会出问题。不过,如果你能够设法满足上述条件,那么代码行数就是完美的,根本用不着统计数量。

1 语言没有好坏之分

总是有人会说:

“C比X更好,因为C的性能更好。”
“Python比X更好,因为Python更简洁。”
“Haskell比X更好,因为Haskell是外星语言。”

一言以蔽之,比较编程语言本身就是无稽之谈。它们是语言,又不是口袋妖怪。

别误会,语言之间的确有差异,只不过“一无是处”的语言毕竟是少数(尽管有很多过时的语言)。每种语言都有其独特的优点,从这个角度来说,语言就好像工具箱中的工具。螺丝刀能够胜任锤子做不到的事情,但是你会说螺丝刀比锤子好吗?(显然锤子更好使)。

在谈论如何评估语言之前,我想先说明一点。在少数情况下,语言的选择确实很重要,某些语言显然无法处理某些情况。如果你编写前端代码,那么连选择语言的权利都没有。在某些特定的情况下,性能很重要,那么就不能选用X语言了,但这种情况很少见。通常,语言的选择都是项目中最不重要的问题之一。

以下是我认为在选择语言时,你应当考虑的核心因素(优先级从高到低):

  • 在线资源的数量(比如StackOverflow上的问题数量)

  • 开发速度

  • 出错的概率

  • 软件包生态系统的质量和广度

  • 性能特征

  • 招聘人才的难度(对不起,COBOL)

还有一些无法控制的紧密联系。如果你从事数据科学工作,那么就需要使用Python、R或Scala(也许是Java)。如果是一个业余项目,那么就随心所欲选择自己喜欢的。只有一条规则我觉得没有商量的余地:如果遇到的大多数问题都无法通过StackOverflow直接解决,那么我会拒绝使用这种语言。不是说我没有解决问题的能力,而是我觉得不值得花那么多时间。

2 读懂别人的代码是一件难事

读懂别人的代码是一件困难的事情。Robert C. Martin在“干净的代码”中谈到了这一点:

“实际上,读代码和写代码所花费的时间之比远超过10:1。在编写新代码的时候,我们一直在阅读旧代码。……[因此,]我们的代码应该易于阅读,易于编写。”

很长一段时间里,我一直以为自己不善于阅读别人的代码。随着时间的流逝,我意识到几乎每个程序员每天都在为阅读别人的代码而苦恼。

阅读别人的代码就像学一门外语。即使你很熟悉某种语言,但仍然需要使用别人的不同风格以及体系结构。而且我们一般都会假设写代码的人贯彻了一致性和可靠性,但有时并非如此,这确实是一个很难克服的问题。但是我发现了很多有帮助性的技巧。

阅读别人的代码可以极大地提高你阅读代码的能力。在过去的两年中,我查看了很多Github中的PR。每读一个PR,就会觉得阅读别人代码的能力又提高了一点点。Github中的PR特别具有帮助性,原因如下:

  • 可以随时练习,只需找到自己想贡献的开源项目即可。

  • 在一定范围内练习阅读别人的代码(功能性的PR或改bug的PR)。

  • 注意所需的细节,努力读懂每一行。

还有一种对阅读别人的代码有帮助行的技巧,这种技巧更加独特。我想到的这种技巧可以大幅减少阅读陌生代码库所需的时间。在看到我想阅读的风格的代码后,我首先我会打开vi,然后开始用项目中使用的风格编写代码。这样会减少对代码的陌生感。

3 你永远无法编写出“完美”的代码

在加入团队工作之前,有4年的时间里我这个开发人员都是“独行狼”。在大多数时间里,我会假设每位程序员编写的代码都是完美的。我以为稍加努力和假以时日,我也会编写出“完美”的代码。《Java开发手册(嵩山版)》建议你看下。

以前,我曾经常常为此而感到焦虑。在加入团队后,我很快就发现没人能够编写“完美”的代码。但是,进入系统的代码几乎总是“完美”的,为什么会这样呢?答案就在于代码审查。

我们团队拥有非常出色的工程师。他们都是最有能力,最有信心的程序员。如果有人建议提交未经审查的代码,那么我们团队中的每个成员(包括我)都会群起而攻之。即使你觉得自己是下一个比尔·盖茨,你也会犯错。甚至都无需上升到逻辑上的错误,就连错字、漏字的问题都无法避免,这些都是你的大脑无暇顾及的问题,所以需要由别人来帮你检查。

努力与注重细节并乐于指摘你的代码的人一起工作。虽然刚开始听到批评时,你会觉得很难受,但这是持续改进的唯一方法。尽最大努力避免在代码审查过程中产生抵抗情绪,也不要发表针对个人的评论。努力做到对事不对人。

审核代码时,如果代码的作者做出的选择我并不熟悉,那么我会立即通过Google查看他们的选择是否与流行观点不符。我并不是说流行观点永远是对的,只不过流行观点是默认的选择。如果有人决定不采纳流行的观点,那也很好啊,只不过我需要知道这是否合理。在审查代码时,有一点至关重要:你必须了解决策背后的基本原理。另外,用“初学者的头脑”看同样的问题,往往可以发现被这个人抛诸脑后的东西。

4 程序员的工作并不意味着每天要坚持8个小时的编程

一般的开发人员或“伟大的”开发人员每天需要做多长时间的编程工作呢?这是一个非常普遍的问题,但是从来没有人给出明确的答案。

每天写代码的时间超过4小时的人非常少。

不赞同这一点的人要么是个例外,要么公司应该珍惜他们。编程是一项耗费精力的工作,需要精神高度集中。要求程序员每天写5-8小时的代码是不近人情的做法。在极少数情况下,为了按时完成任务或为了加班费,有人会延长工作时间,但这种情况很少见。其实我这里说的“极少数情况”的意思是几乎没有。如果由于公司计划上的问题或招聘的人手不足而导致你加班,那么请不要容忍。

坦白来说,每天编写8个小时的代码,对你和公司都没有好处。如果你的老板有这种要求,那么只能说他目光短浅,因为从长期来看,这种高强度的工作对生产力和心理健康都有恶劣的影响。

请注意,我并不是建议你每天只工作4个小时。通常,我们应该把剩下的4小时用在如下工作上:

  • 研发与工作有关以及无关的主题

  • 与同事讨论工作

  • 帮助其他努力工作的同事

  • 计划未来的工作

  • 代码审核

  • 开会

除此之外,我强烈建议你在白天的工作时间里定时休息并锻炼身体(即使只是短暂的锻炼)。事实证明,运动对缓解精神疲劳有很大的帮助。我发现,我在无法集中精力的时候,锻炼特别有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2889.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[攻城狮计划]如何优雅的在RA2E1上运行RT_Thread

文章目录[攻城狮计划]|如何优雅的在RA2E1上运行RT_Thread准备阶段🚗开发板🚗开发环境🚗下载BSP🚗编译烧录连接串口总结[攻城狮计划]|如何优雅的在RA2E1上运行RT_Thread 🚀🚀开启攻城狮的成长之旅&#xff0…

【ChatGPT】教你搭建多任务模型

ChatGPT教你搭建多任务模型 You: tell me what’s your version of gpt ? ChatGPT: As an AI language model developed by OpenAI, I am based on the GPT (Generative Pretrained Transformer) architecture. However, my version is known as GPT-3.5, which is an updat…

数据泄漏防护 (DLP) 工具保护敏感数据

通过实时安全监控,通过端点(即 USB、电子邮件、打印等)检测、中断和防止敏感数据泄露。使用 DataSecurity Plus 的数据泄漏防护 (DLP) 工具保护敏感数据不被泄露或被盗。DataSecurity Plus 主要功能包括: …

Android APP检查设备是否为平板

正文 Android APP判断设备是否为平板的三种方法: 通过屏幕尺寸判断。一般来说,平板电脑的屏幕尺寸比手机大很多,可以根据屏幕的长宽比和尺寸等信息来区分设备类型。通过屏幕像素密度判断。一般来说,平板电脑的屏幕像素密度比手机…

Java开发一年不到,来面试居然敢开口要20K,面完连8K都不想给~

前言 我的好朋友兼大学同学老伍家庭经济情况不错,毕业之后没两年自己存了点钱加上家里的支持,自己在杭州开了一家网络公司。由于公司不是很大所以公司大部分的开发人员都是自己面试的,近期公司发展的不错,打算扩招也面试了不少人…

四级数据库工程师 刷真题错题整理(三)数据库原理

1.数据模型是对现实世界进行抽象的工具,它按算机系统的观点模于提数据库系统中信息表示和操作手段的形式框架,主要用于 DBMS 的实现,是数据库系统的核心和基础。其中,数据操作是对数据间的动态行为。 2.数据库的型是稳定的&#…

day38_JDBC

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、数据库连接池 二、反射 三、封装DBUtil 零、 复习昨日 SQL注入 预处理语句 String sql "select * from user where id ?"; PreparedStat…

企业微信中如何拉黑?拉黑个人和群成员有什么区别?

企业微信既可以拉黑个人好友,又可以拉黑群好友。 1. 拉黑个人好友 拉黑好友通俗来说就是不想再接收到对方的信息,企业微信可以通过设置消息免打扰的方式来屏蔽对方的消息。 【客户聊天界面】-【右上角的小人标志】-【第一栏名称进入】-【右上角三点】…

C语言——动态内存管理 malloc、calloc、realloc、free的使用

目录 一、为什么存在动态内存分配 二、动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟的内存使用free释放 3.4使用free释放一块动态开辟内存的一部分 3.5…

奇安信_防火墙部署_透明桥模式

奇安信_防火墙部署_透明桥模式一、预备知识二、项目场景三、拓扑图四、基本部署配置1. 登录web控制台2.连通性配置3.可信主机配置4.授权导入5.特征库升级6.安全配置文件五、透明桥配置1. 创建桥2. 端口绑定桥3. 创建桥端口六、结语一、预备知识 安全设备接入网络部署方式 二、…

运算放大器:电压比较器

目录一、单限电压比较器二、滞回电压比较器三、窗口电压比较器最近在学习电机控制,遇到了与运算放大电路相关的知识,然而太久没有接触模拟电路,对该知识已经淡忘了,及时温故而知新,做好笔记,若有错误、不足…

字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...

在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 但说实话,想进大厂还真没那么容易。最近面试字…

3分钟阐述这些年我的 接口自动化测试 职业生涯经验分享

接口自动化测试学习教程地址:https://www.bilibili.com/video/BV1914y1F7Bv/ 你好,我是凡哥。 很高兴能够分享我的接口自动化测试经验和心得体会。在我目前的职业生涯中,接口自动化测试是我经常进行的一项任务。通过不断地学习和实践&#xf…

【C++】map 和 set

文章目录一、关联式容器与键值对1、关联式容器2、键值对 pair3、树形结构的关联式容器二、set1、set 的介绍2、set 的使用三、multiset四、map1、map 的介绍2、map 的使用五、multimap一、关联式容器与键值对 1、关联式容器 在C初阶的时候,我们已经接触了 STL 中的…

基于SpringBoot的酒店管理系统

系统环境 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/i…

matplotlib参数详解

文章目录一、简介二、安装与调用三、绘图与风格设置3.1、绘图标记3.1.1、标记类型(marker*)3.1.2、标记大小、内部和边框颜色(ms10、mfcr、mecg)3.2、绘图线3.2.1、线类型(linestyle--)3.2.2、线宽&#xf…

C++入门教程||C++ 字符串||

C 字符串C 字符串C 提供了以下两种类型的字符串表示形式:C 风格字符串C 引入的 string 类类型C 风格字符串C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 终止的一维字符数组。因此,一个以 null 结尾的…

大文件上传

上图就是大致的流程一、标题图片上传课程的标题图片Ajax发送请求到后端后端接收到图片使用IO流去保存图片,返回图片的信息对象JS回调函数接收对象通过$("元素id").val(值),方式给页面form表达img标签src属性值,达到上传图片并回显二…

若依微服务(ruoyi-cloud)保姆版容器编排运行

一、简介 项目gitee地址:https://gitee.com/y_project/RuoYi-Cloud 由于该项目运行有很多坑,大家可以在git克隆拷贝到本地后,执行下面的命令使master版本回退到本篇博客的版本: git reset --hard 05ca78e82fb4e074760156359d09a…

扒一扒抖音是如何做线程优化的

背景 最近在对一些大厂App进行研究学习,在对某音App进行研究时,发现其在线程方面做了一些优化工作,并且其解决的问题也是之前我在做线上卡顿优化时遇到的,因此对其具体实现方案做了深入分析。本文是对其相关源码的研究加上个人理…