有点意思的话题: 程序员认知相关

2022-05-07 09:50:44 +08:00
 luffy

近日在 JS 项目开发中有个 array 条件判断,有人这么写:

if (list) {
 // do something
}

我的 code review comment 这么建议:

if (list.length > 0) {
  // do something
}

这时有另一个同事在上面留言说,按他的认知,应该是下面这么写,也就是上面第一种才对。

if (list) {
 // do something
}

这当然只是个非常非常小的问题,甚至都可以忽略不计。

但我联想到一个更有普适性的问题:当这么写代码能跑起来,另一种方式写代码也能跑。那凭什么要用另一种了?

认知 这个词可能很适合用来理解或者解释这类问题。比如这里的 认知: 变量比较 implicitexplicit 的问题。

还有一些其它的例子:

比如,自己在若干年前写代码,当时觉得自己很牛气很完美,而现在再去看,会觉得当时的代码好糟糕。

或者,当别人用 A 用法实现时,你提出用 B 用法更好,别人还得觉得自己的更好。

或者,相反的,当你觉得用 A 方式比较好时,另一个水平更高的说用 B 更好时,你还是坚持已见,觉得别人不懂你。

所有类似的问题,或许都能归结为:认知深度 的差异。这里的认知领域包括:项目工程化,模块化,团队协作,一致性,计算机编译器原理,数学,linux 内核,各种设计模式,不同编程语言各自的特色等。

这里是由一个现实案例联想到的认知问题。那么朋友们,你们有遇到过类似的场景嘛?有的话,不妨举例看看,让我们都来提高下认知吧。当然也包括,在面试或者招聘,会有人关心这类认知问题嘛?

6384 次点击
所在节点    程序员
67 条回复
meeop
2022-05-07 11:26:39 +08:00
我说一个毛主席的做法吧:
1 这个问题不在于对错,而在于拉齐认知,具体来说就是定一个规范,说明这种情况大家应该怎么写
meeop
2022-05-07 11:26:53 +08:00
2 拉齐认知的方法,是开民_主生活会,具体来说就是通过全员讨论方式讨论这个问题的解决方法并投票达成一致,形成决定
meeop
2022-05-07 11:27:06 +08:00
3 显然上述方法挺麻烦,以及个人经验大部分人没这么强民_主意识,会觉得小题大做,搞不搞看成本和意愿
meeop
2022-05-07 11:27:51 +08:00
民_主是敏感词,发了 3 次才发出来
krixaar
2022-05-07 11:31:40 +08:00
@pianjiao #36 360 安全浏览器 12 的 Chrome 内核是 78 ,内网某个网页版系统升级了,然后挂掉一批电脑,我拿着 U 盘跑过去给装 13 。为什么不用别的浏览器?因为这个内网系统是个大 SPA ,把以前只能用 IE 的老系统(带 ActiveX 控件的)也给包进去了,只有两个内核随便切的浏览器才能用。
当时控制台 js 一片报错,原因就是新版某个 js 里面有个.?……
simonh8
2022-05-07 11:42:40 +08:00
想不通 js 这么🌶️的语言怎么能流行起来
nicebird
2022-05-07 11:55:46 +08:00
对都对。但是从清晰的角度看,length 版本更好,非 length 的写法需要脑补一小段才能理解,提升了认知成本。代码其实阅读的时间是最多的,降低阅读认知成本的事情要多做。
RuiQ
2022-05-07 12:37:39 +08:00
除非对方比你高很多 level ,能让你直白的感受到他是大牛。
否则在大家都差不多的情况下,程序员之间也颇有文人相轻的意味。
CosimoZi
2022-05-07 12:55:24 +08:00
在幺半群里作为零元的元素本来就该映射到 false 上. js 设计问题. python 就做得很好.
DrakeXiang
2022-05-07 12:58:53 +08:00
对于 `if (list.length)` 还是 `if (list.length > 0)` 我主要还是看可读性,虽然我好像两种都用过,而且印象中偏向第一种,但我觉得第二种的可读性更好,只是感觉现在写成第一种基本也能看懂了。

其他还有一些比较骚的类型转换,比如 `!!name`, `+new Date()`, `~~floatNum` 这种,在刚学的时候用过,后面看了一些文章说到可读性,现在几乎不用了,而是用 `Boolean(name)`, `Number(strNum)`, `Math.floor(floatNum)` 这种显式的转换
charlie21
2022-05-07 13:42:14 +08:00
从成品揣测需求是一种浪费生命的方式
pianjiao
2022-05-07 13:57:17 +08:00
@krixaar 如果要兼容老的浏览器,我觉得 list && list.length > 0 这种比较好,其实 单 list 也是可以的 反而 list.length 在 list 是个 undefined 或者 null 的时候无法兼容 直接报错
wjccccccccc
2022-05-07 14:15:10 +08:00
@meeop 看到你这绷不住了,不能说的"民""主"
Agdhfdjh
2022-05-07 14:22:11 +08:00
if (!!list?.length) ...
有 webpack 可以用可选链语法,js 这种灵活的语言,没有绝对的规范,就是灵活和严谨中取一个度,很多写法都是为了代码可读性考虑的,比如有些公司强制使用 Number(var) 取代 +var
dongtingyue
2022-05-07 14:31:09 +08:00
看了补充,我选择( xx.length) 而不会写( xx.length>0),首先 length 肯定是>=0 没必要在写>0 。代码评审不应该关注这种点吧,是有多闲,然道 if(bool) 还要写 if(bool==true)?
unclemcz
2022-05-07 14:44:12 +08:00
@simonh8 #46 你们这些专业程序员理解不了我们这种半吊子,不考虑类型瞎写的 js 代码不会报错还能正常运行,多么的快乐。我们业余选手反正只写一些代码段简化日常重复工作,不需要工程化思维,js 这种弱类型功能又强大的语言,简直不要太友好🙂。
tao1991123
2022-05-07 15:04:34 +08:00
其实应该是 if(Array.isArray(list) && list.length) { }
jujusama
2022-05-07 15:33:43 +08:00
非 js coder ,看到示例时满脑子都是按语境转换和数据类型向下转换导致的警告
Tokin
2022-05-07 17:13:49 +08:00
一般是 if(list && list.length) 或者 if( ( list || [] ).length )
kingjpa
2022-05-07 17:41:30 +08:00
小程序里 空数组也是 true

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX