程序员的代码行数越少越好?
有些人可能会认为,应用程序中的代码行越少,就越容易阅读。这句话只有部分正确,我认为代码可读性的度量标准包括:
代码应具备一致性
代码应具备自我描述性
代码应具备良好的文档
代码应使用稳定的现代功能
代码不应过于复杂
代码的性能不能有问题(不要故意编写速度过慢的代码)
如果减少代码行数会影响到上面任何一条,那么就有问题。实际上,基本上减少代码行数都会影响到上面的标准,因此总会出问题。不过,如果你能够设法满足上述条件,那么代码行数就是完美的,根本用不着统计数量。
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小时用在如下工作上:
研发与工作有关以及无关的主题
与同事讨论工作
帮助其他努力工作的同事
计划未来的工作
代码审核
开会
除此之外,我强烈建议你在白天的工作时间里定时休息并锻炼身体(即使只是短暂的锻炼)。事实证明,运动对缓解精神疲劳有很大的帮助。我发现,我在无法集中精力的时候,锻炼特别有帮助。
相关文章:
程序员的代码行数越少越好?
有些人可能会认为,应用程序中的代码行越少,就越容易阅读。这句话只有部分正确,我认为代码可读性的度量标准包括:代码应具备一致性代码应具备自我描述性代码应具备良好的文档代码应使用稳定的现代功能代码不应过于复杂代码的性能不…...
【每日一题Day156】LC1032字符流 | 字典树
字符流【LC1032】 设计一个算法:接收一个字符流,并检查这些字符的后缀是否是字符串数组 words 中的一个字符串。 例如,words ["abc", "xyz"] 且字符流中逐个依次加入 4 个字符 a、x、y 和 z ,你所设计的算法…...
V2G模式下含分布式能源网优化运行研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 📋📋📋本文目录如下:🎁🎁🎁 目录 💥1 概述 📚2 运行结果 &am…...
手写一个简单的RPC框架
学习RPC框架,由繁化简,了解其本质原理 文章目录项目简介什么是RPC?项目模块项目代码common模块client模块server模块framework模块测试项目简介 什么是RPC? RPC(Remote Procedure Call)即远程过程调用&am…...
【剑指offer】旋转数组的最小数字
👑专栏内容:剑指offer⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录一、题目描述1、题目2、示例示例1示例2二、题目分析1、暴力法2、二分法三、代码汇总1、暴力法2、二分法一、题目描述 1、题…...
【Dorker】Portainer轻量级可视化工具
文章目录Portainer简介登录Portainer第一次登录需创建admin,访问地址:xxx.xxx.xxx.xxx:9000选择local选项卡后本地docker详细信息展示安装nginx私有镜像仓库管理Portainer简介 Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板…...
基于 vue.js 进行组件封装的方案
摘要:本文将介绍如何基于 vue.js 进行组件封装的方案。我们将从分析组件封装的优势开始,然后依次介绍 vue.js 的基本概念,以及如何创建、封装和使用自定义组件。最后,我们将通过一个实际的示例,演示如何实现一个基于 v…...
【Unityc#专题篇】之c#基础篇
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...
Python(白银时代)——模块、包、异常
异常 概念 程序运行时,如果Python 解释器遇到了错误,会停止程序运行,并且提示错误信息,这就是异常 程序停止执行并提示错误信息的动作,称为 抛出异常 异常捕获 try: 里面的代码,不确定是否能够正常执行. …...
小程序和Vue写法的区别
小程序和Vue写法的区别主要有以下几点: 语法不同:小程序使用的是WXML、WXSS和JS,而Vue使用的是HTML、CSS和JSX。 数据绑定方式不同:小程序使用的是双向数据绑定,而Vue使用的是单向数据流。 1)在小程序中需…...
如何实现分布式锁
一、锁的作用 锁是为了解决多线程情况下,对于共享资源的访问安全问题。 但是当系统是分布式的时候,本地锁已经没法锁住所需要的资源,因为本地获取了锁,其他系统无法得知本地锁的情况。 分布式锁,是独立于系统的第一方…...
使用VS2019连接Microsoft SQL Server Compact 4.0数据库
简介 SQL Server Compact Edition是微软推出的一个适用于嵌入到移动应用的精简数据库产品,Windows Mobile开发人员能够使用SQL Server CE开发出将数据管理能力延展到Window Mobile移动设备上的应用程序。虽然SQL Server CE占用的磁盘空间只有3到5兆左右,…...
Vue2 和 Vue3 的对比
Vue2 vs Vue3 Vue 是一款流行的 JavaScript 框架,用于构建交互式 Web 界面。Vue2 和 Vue3 是 Vue.js 的两个版本。Vue3 是 Vue.js 的最新版本,于 2020 年 9 月正式发布。Vue3 有许多改进和新功能,下面我们将对 Vue2 和 Vue3 进行比较。 性能…...
[数据结构]二叉树的链式存储结构
目录 二叉树的链式存储结构:: 1.创建一颗二叉树 2.二叉搜索树简介 3.前序、中序以及后序遍历 4.层序遍历 5.求一棵树的节点个数代码实现 6.求一棵树的高度代码实现 7.求叶子节点个数代码实现 8.求第K层节点个数代码实现 9.二叉树查找值为x的节点 二叉树…...
黑马程序员 Redis 踩坑及解决
文章目录实战篇p30 短信登录-隐藏用户敏感信息p50 优惠券秒杀-添加优惠券p69 秒杀优化-异步秒杀思路p81 达人探店-点赞排行榜p87 好友关注-实现滚动分页查询问题 1问题 2p90 附近商铺-实现附近商户功能实战篇 p30 短信登录-隐藏用户敏感信息 问题描述:登录后会跳转…...
Matlab实现粒子群算法
粒子群算法(Particle Swarm Optimization,PSO)是一种群体智能算法,通过模拟自然界中鸟群、鱼群等生物群体的行为,来解决优化问题。 在PSO算法中,每个个体被称为粒子,每个粒子的位置表示解空间中…...
tailwindcss 写原生html
需要注意:html文件中引入的是output.css input.css写那三行预留的就可以了打包的时候只要打包html output.css img文件夹句ok,其他都不用原理是运行时生产output.css文件,直接【注意!注意!注意!class"…...
Java开发一年不到,来面试居然敢开口要20K,面完连8K都不想给~
前言 我的好朋友兼大学同学老伍家庭经济情况不错,毕业之后没两年自己存了点钱加上家里的支持,自己在杭州开了一家网络公司。由于公司不是很大所以公司大部分的开发人员都是自己面试的,近期公司发展的不错,打算扩招也面试了不少人…...
LeetCode题解 20(17,79) 电话号码的字母组合,单词搜索<回溯>
文章目录电话号码的字母组合(17)代码解答单词搜索(79)代码解答电话号码的字母组合(17) 思路: 根据题意我们必须根据数字获取对应的字符数组,因此我们先定义1个字符数组表示这个电话表 private String[] letters {"","","abc","…...
路径之谜 蓝桥杯 89
题目描述小明冒充 X 星球的骑士,进入了一个奇怪的城堡。城堡里边什么都没有,只有方形石头铺成的地面。假设城堡地面是 nn 个方格。如下图所示。按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着走,也不…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
