- 主题:AI 写代码确实太爽了
所以我已经强调了很多遍了,rust是ai时代最重要的语言,没有之一
比如我现在是基本不写测试代码的。
曾经我也是测试先行,用一堆测试去框住结果。
但ai时代很不一样,ai迭代的太快了,整一堆测试反而是在给自己束手束脚。
反之我现在是4w行以内完全没有测试,
4w行之后会增加少量测试,并且以e2e的集成测试为主。
至于覆盖率什么的...我的字典里完全没有覆盖率,有测试已经是我最大的让步了。
【 在 adamhj 的大作中提到: 】
: 但是我发现AI经常把测试搞的太复杂,覆盖太全面,然后写、调测试用例的时间比写代码的时间要多N倍
:
--
修改:lvsoft FROM 101.229.188.*
FROM 101.229.188.*
....
你对ai的理解,还停留在2年前....
【 在 hgoldfish 的大作中提到: 】
: 还能写需求啊?你这么一说我得试一下。
:
--
FROM 101.229.188.*
这可不是强类型就够的...
得有一些精神洁癖级别的执念才行,rust是一种,其他的就太脱离大众了,
总不能都去写ada吧....
【 在 hotfix 的大作中提到: 】
: lv 老师,go也是强类型语言,就不行吗
--
FROM 101.229.188.*
因为gemini就是可以做到这一点
【 在 hoo 的大作中提到: 】
: 只有少量e2e测试怎么有信心release?
--
FROM 101.229.188.*
简单的说就是系统跑起来你要大致看看跑起来如何吧?
我做的就是构造一个e2e测试把我最感兴趣的功能点跑下。
gemini上限非常高,但下限也非常低,你可以认为gemini是一个脱离一线很久的架构师,让它去干活还有点眼高手低,所以要用好是需要和它好好磨合的。
基本上,我是完全不看gemini写的除测试之外的代码的。用claude我像是一线manager,要时刻盯着一个干劲十足的实习生防止它犯错。用gemini我的角色就是二线manager,我跟他只进行大量架构级别的文档沟通,和交付前的使用测试,完全不看他做事的细节。
【 在 hoo 的大作中提到: 】
: 从人的意识到输入,再到gemini的理解、实现,每个环节都可能有偏差和错误,光靠对gemini的信任不行吧
: “少量”有多少,不覆盖全部功能点?
--
修改:lvsoft FROM 101.229.188.*
FROM 101.229.188.*
人本来就是基于经验做事的,当经验强到一定程度那就是信仰。
另一方面,要做多大程度的测试也取决于出错的后果有多严重。我是认为基于rust的系统,它基础上就比其他语言+50%测试。
所以虽然我没测,但对于其他语言来说已经相当于做了50%覆盖率的测试了。
【 在 hoo 的大作中提到: 】
: 这些完全同意,我也是gemini用户。
: 不过可能我有实证和循证的思想钢印,不充分测试的程序就release不就成信仰了吗?
--
FROM 101.229.188.*
beep已经回答的很好了。
我之前在circuit版说过一个例子,比如mcu里面寄存器的某一个bit,表示对应的某个功能是否开启。1是开启0是关闭。
rust里面对这个bit位的读和写要用不同的枚举。
读就是xxx.enabled
写就是xxx.enable
如果你用错了编译就过不去。
rust就是严格到这种程度,基本上不会给你犯错的空间。
【 在 gfkid 的大作中提到: 】
: @lvsoft 还是请lvsoft解惑吧
: 不过我感觉你这个问题不是换个rust就能轻易解决的
: 不过如果改进prompt 有可能能让AI发现自己的逻辑问题 这样它自己就会修改
--
修改:lvsoft FROM 101.229.188.*
FROM 101.229.188.*
是的,这个东西只是用类型系统去约束业务逻辑,现代语言都可以做到。
但选择一门语言更重要的是选择了一种风格。比如我前面说的这个例子,
如果不是写这个库的人有这个洁癖,rust下当然也是可以和c一样用&&和|=的方式来读和写bit位的。
所以我才强调rust的重要性,就像pythonic就意味着飘逸,随机应变糙快猛,rustic就得严格严谨有洁癖。
而且rust真的特别适合干这个,比如我之前用他做一个运控系统,里面涉及位移单位,我设定一堆公制,英制单位,甚至还有丝这种10um的国内特有的单位。这里我直接用中文写,比如move_to(10.丝())。我甚至把相对坐标值和绝对坐标值也用单位做了约束。相对值+绝对值还是绝对值,绝对值减绝对值就是相对值,... ...
这种有量纲的感觉真的写起来非常的爽,架构定好随便搞,一有错误编译器马上就抓住了,根本错不了
【 在 beep 的大作中提到: 】
: 我最初接触到的这方面的例子就是你写的相关内容,哈哈
: 其实和rust关系不大,只要是个提供ADT类型系统的语言,nominal typing的,都可以做到这一点。甚至typescript这种structural typing的,没有sum type的,也能模拟出来凑合用。
: 关键还是人要有概念,要主动充分使用类型来描述出尽可能多的逻辑要求。否则
: ...................
--
修改:lvsoft FROM 101.229.188.*
FROM 101.229.188.*
这个例子其实也没啥,这玩意本质上来说跟语法糖一样也没啥本质区别。
rust的很多东西都这样,粗看也没啥,奇技淫巧罢了,不是什么非常本质的东西。
但你用的越多越能感受到这里有一种奇妙的平衡感。
学院派追求的完美,是理论上极致的抽象和自洽,
工程师追求的完美,是庞大约束条件限制下恰到好处的平衡。
很多喜欢研究语言的人都不太瞧得上rust,rust虽然吸收了一些学院派语言的内核,但本质依然是一门讲究平衡的工程师语言。
我刚开始学rust的时候也非常不喜欢rust,觉得很多设计很奇葩,也是用了一段时间之后才领悟的
【 在 beep 的大作中提到: 】
: 仔细想想其实 move_to(10.丝()) 也不是非要rust这样有trait的语言才行
: 完全可以
: struct Length(i32);
: ...................
--
FROM 101.229.188.*