# 刷 LeetCode 练习命名
过去几个月,《程式英文》把焦点放在“分享知识”;例如,变量名称样板、单字
使用情景、等等。对学习者来可说是“输入”的动作。
这次试个不同的方向,做了个实验,把焦点换到“演练技巧”,希望能帮助学习者
改善输入与输出的平衡。
* Google 文件 https://bit.ly/2GIyLtk
* GitHub 讨论区 https://bit.ly/321ResR
# 先说结论
* 实验内容:用 C# 刷 20 题“解题率最高、 Easy 等级”的 LeetCode
* 题目列表: https://github.com/EngTW/English-for-Programmers/issues/69
* 所有 20 题 LeetCode 英文题目(含提示)总共约 2841 字。
* 其中 2434 字 (86%) 包含在“高中英文 7000 字”内。
* 可还原成约 394 个单字原型;例如, am, are, is 的单字原型为 be 。
* 其中 285 个单字原型 (72%) 包含在“高中英文 7000 字”内。
* 所有 20 题 LeetCode 解答内“自订变量”用了约 119 英文字。
* 其中 105 字 (88%) 包含在“高中英文 7000 字”内。
* 可还原成约 44 个单字原型。
* 其中 36 个单字原型 (81%) 包含在“高中英文 7000 字”内。
以下是一些观察与心得。
# 堆叠( stack )字
在英文语法中,可以把多个字“堆叠( stack )”起来来表达意思,例如,程式
设计师熟知的 API: Application Programming Interface 。
这样的语法也可以应用在命名变量上,但要小心拿捏资讯量与复杂度的平衡;例如:
* 在有 1 个字的时候,例如, Name, 只有 1 种读法,没有问题。
* 在有 2 个字的时候,例如, ManagerName, 仍只有 1 种读法,没有问题。
* 在有 3 个字的时候,例如, StoreManagerName, 就有 2 种可能的读法要去辨别:
* StoreManager Name
* Store ManagerName
* 在有 4 个字的时候,例如, DollarStoreManagerName, 就有 (4-1)! = 6 种可
能的读法要去辨别。
* 在有 5 个字的时候,例如, CentralDollarStoreManagerName, 就有
(5-1)! = 24 种可能的读法要去辨别。
每多一个字的确会加入新的资讯,但也会提高阅读的困难度(复杂度超过工作记忆
区的容量,使得资讯变成了噪声)。
我个人经验是“用 3 个字以下的变量名称”,如果要用到超过 3 个字,或许可以
想想否是能用其它方法(程式码架构、型别、注解、规格书、等等)来提供读者理
解程式码所需的上下文脉络。
# 是什么( what )、为什么( why )
以下这个案例很有趣:
* https://github.com/EngTW/English-for-Programmers/issues/89
* https://leetcode.com/problems/sum-of-all-odd-length-subarrays/
程式码本身是在实作从题目要求推导出来的解答算式。
在这个案例中,我发现要描述“这个变量‘是什么’”并不难,难的是让读者了解
“为什么要有这个变量”。
最后我选择用注解的方式提示推导解答算式的方向,读者需要先了解解答算式,程
式码才会比较好懂。
相对之下,其它案例的变量的名称与实际使用情形多半可以说明该变量“是什么”
及“为什么”。
# 英文语法资料
## 位数
案例: https://github.com/EngTW/English-for-Programmers/issues/79
* 个位: ones place 或 units place
* 个位数: ones digit 或 units digit
* 十位: tens place
* 十位数: tens digit
* 十分位: tenths place
* 十分位数: tenths digit
参考资料
* https://en.wikipedia.org/wiki/Numerical_digit#Computation_of_place_values
## 上限、下限、包含、不含
案例: https://github.com/EngTW/English-for-Programmers/issues/88
* 上限: upper bound 或 majorant
* 下限: lower bound 或 minorant
* 包含: inclusive
* 不含: exclusive
* 参考资料
* https://en.wikipedia.org/wiki/Upper_and_lower_bounds
* https://www.lexico.com/en/definition/inclusive
* https://www.lexico.com/en/definition/exclusive
# 结语
* 因为是第一次进行这样的实验,所以选了 LeetCode 是 Easy 级解题率最高的
20 题。
* 从简单题目开始,容易掌控问题复杂度,适合新手学习者入门。
* 对进阶学习者来说, LeetCode 的程式架构变化少,学习效果可能有限。
* 题目定义明确,有共通的讨论基础。
* 就现今软件业求职面试文化来看,学习者投入“刷 LeetCode ”的成本容易回收。
* LeetCode 题目是以英文写成,也是练习英文的机会。
* 解答的首项要求是正确,再来是可读性,最后是效能(时间、空间)、程式码语
法的精练度。
读者如果有兴趣的话,可以 code review 一下这里列出来的 20 题 LeetCode 解
答,尤其是其“命名可读性”;或著,对 LeetCode 题目或解答中的任何英文用字
、语文解读有疑问的,也欢迎提出来讨论。
* https://github.com/EngTW/English-for-Programmers/issues/69
在此感谢所有参与讨论的网友 :)