从small到safe,形容词的学问

深究'新'与'safe':TDD实践的哲学之旅
本文深入探讨了在《TestDrivenDevelopment》一书中,KentBeck提出的'smallsteps'与后续提及的'safesteps'概念,通过提问引导读者思考这些术语背后的本质与应用,揭示了在TDD实践中如何运用这些概念来提升代码质量与开发效率。

高中的时候,历史老师黄勇是个非常有趣的人。黄老师讲课的时候眉飞色舞,我一个哥们说,上他的课你不可能睡觉。因为太有趣了。也很幸运有这么好的老师。黄老师是特级教师,后面好像去了教育局。也是很遗憾的。

 

历史上经常会有什么新革命,新变法之类的。每次,遇到这种带有“新”字的东西,黄老师都要问,“这个‘新’,‘新’在哪里?”。

当你不断的被重复某句话的时候,你很难不记住这句话。就好像恒源祥的广告,“恒源祥,羊~羊~羊~”,听过以后,就很难从脑袋里拔掉。不信你就试试下面的。

 

“这个‘新’,‘新’在哪里?”

“这个‘新’,‘新’在哪里?”

“这个‘新’,‘新’在哪里?”

“这个‘新’,‘新’在哪里?”

 

记住了?。

 

到后来,不用老师说,我们都会异口同声的说“这个‘新’,‘新’在哪里?”

 

问了这个问题以后,黄老师会教我们如何分析:新在哪里?与旧有什么不同?

也就是那个时候我开始发现,一个小小的形容词都会有这么多的学问。好多时候,对一个东西的认识的层度,似乎很神奇的取决于你对这个东西的形容词的理解层度。

 

几年之前,大学本科的时候。我看过了Kent Beck的《Test Driven Development》。在TDD这本书中,Beck经常提到一个词:small steps。也就是在我们的写TDD,写重构的时候,需要small step。

 

准备好了吗?

什么是small step?

small是什么?

跟big有什么区别?

多small才算是small?

为什么需要small?

 

连珠炮似的发问已经条件反射般的射进了我的脑子

 

一次,参加完成都的openparty,趁了大大的一顿饭,聊起了很多。一段,我当时谈到了我的看法,就是TDD中最难拿捏的问题也许就是small step的问题,多small才足够。大大也说,就算是工作了几年的人也不一定能够把控的好。后面也听到过八叉讲Pair换键盘的速度最好是15分钟以内。这似乎都在说的是small。

 

在我看来,small是一种关乎信心的东西,虽然人是很聪明的,但终究人的智力是有限的。人的大脑能处理的复杂度也是有限的。当我们使用small的时候,我们出现错误的可能就小了。也不会在进行一个big step的时候,跨出了一大步,才开始想起,蛋在哪里?

 

前几天,当我看到了Beck的比较新的一篇博客《Don’t Cross the Beams: Avoiding Interference Between Horizontal and Vertical Refactorings》的时候,http://www.threeriversinstitute.org/blog/?p=594 (如果你看过TDD,不妨看下这篇文章,会对你的TDD看法有些新的认识,我也想稍微整理下我的思路,以后写篇博客,从不同的角度谈谈我的认识,应该也会比较有趣)

文章里,Beck没有再说small steps了,取而代之的是safe steps。

 

再次准备好了?

什么是safe step?

safe是什么?

unsafe是什么?

多safe才算是safe?

为什么需要safe?

 

我不想在结尾给出一个标志性的答案,但是我觉得当你问了上面的问题的时候,你会想,至少是尝试想其中的奥秘。也会发现从small到safe。这个形容词,更加反映了我们关心的问题的本质。

 

生活中,学习中,我们有很多时候会遇到形容词,形容词也是我们生活中不可少掉的一部分,我们会说一个女人长的很性感,另一个男人长的很猥琐。但也许下次,我们可以都多问问,多多想想这个女人是哪里性感了,而这个男人又是哪里猥琐了。

 

当然,我个人的话,是觉得女人臀部最性感,男人coding最猥琐。

### 使用 WordNet 检查形容词用法和适用性 WordNet 是一个大型英语词汇数据库,其中词汇被组织成同义词集合(synsets),并提供了丰富的语义关系。为了确定形容词的适用性和用法,可以通过查询 WordNet 来获取特定形容词的相关信息。 #### 获取形容词的基本信息 首先,加载 WordNet 并查找目标形容词对应的 synset: ```python from nltk.corpus import wordnet as wn adjective = 'happy' synsets = wn.synsets(adjective, pos=wn.ADJ) for synset in synsets: print(f'Synset: {synset}') print(f'Definition: {synset.definition()}') print('Examples:') for example in synset.examples(): print(f' - {example}') ``` 上述代码展示了如何检索给定形容词 `happy` 的所有 synset 及其定义和例子[^1]。 #### 查找近义词与反义词 通过访问 synset 对象中的属性可以获得形容词的同义词和反义词列表: ```python def get_antonyms_and_synonyms(word): synonyms = [] antonyms = [] for syn in wn.synsets(word, pos=wn.ADJ): for lemma in syn.lemmas(): synonyms.append(lemma.name()) if lemma.antonyms(): antonyms.extend([antonym.name() for antonym in lemma.antonyms()]) return set(synonyms), set(antonyms) synonyms, antonyms = get_antonyms_and_synonyms('happy') print("Synonyms:", ", ".join(list(synonyms))) print("Antonyms:", ", ".join(list(antonyms))) ``` 这段脚本会输出形容词 "happy" 的同义词和反义词集合。 #### 验证形容词搭配合理性 当考虑两个名词之间的形容词适配情况时,可以对比它们各自的 synset 关系以及路径相似度得分来评估匹配程度: ```python def check_adjective_applicability(noun1, noun2, adjective): best_similarity_score = 0 # Get all possible synsets for each noun and adjective nouns_1 = wn.synsets(noun1, pos=wn.NOUN) nouns_2 = wn.synsets(noun2, pos=wn.NOUN) adjectives = wn.synsets(adjective, pos=wn.ADJ) for adj_set in adjectives: for n1 in nouns_1: for n2 in nouns_2: similarity_score = max( [n1.path_similarity(adj_set)] + [adj_set.path_similarity(n2)] ) if similarity_score is not None and similarity_score > best_similarity_score: best_similarity_score = similarity_score return best_similarity_score similarity = check_adjective_applicability('dog', 'cat', 'small') print(f"The applicability score between dog/cat with small is {similarity}") ``` 此函数计算了指定形容词应用于一对名词间的最大路径相似度分数,以此作为衡量该形容词在这两者间使用的合理性的指标。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值