本系列共 5 篇,通译自:97-things-every-x-should-know
License:由 CC BY-SA 3.0 获得许可;
欢迎点赞、收藏、评论~ O(∩_∩)O
- 本瓜并未逐字逐句翻译,而是取其精要、理解抽象,结合自身进行撰文表达,与各位看官分享。认知好的编程概念,走向优秀~
- 《程序员优秀之路:认知 97 个好的编程概念(1)》
- 《程序员优秀之路:认知 97 个好的编程概念(2)》
- 《程序员优秀之路:认知 97 个好的编程概念(3)》
- 《程序员优秀之路:认知 97 个好的编程概念(4)》
终于来到第 5 篇啦,善始善终~
测试保障开发严谨
这位作者想说:
- 软件开发与桥梁建设这类实体工程相似,但最大的不同是:软件开发不需要实体材料;
- 对软件的测试尤其重要,软件的构建成本低,可以开发一个完整的生态来进行测试,包括:单元测试、模拟对象、测试工具等等;
- 测试保障了软件开发工程的严谨性,就好比建筑工程在图纸上所做的结构分析保障了工程质量;
认清“状态”
这位作者想说:
- 程序员对于“状态”的认定需要非常清晰;
- 举了一个例子:作者去喝咖啡,想找店员要一点牛奶,店员回答说:“牛奶紧缺”,作者懵 b 了,“牛奶紧缺”是什么意思?要么就是“有”牛奶,要么就是“没有”牛奶,对于作者来说,“牛奶紧缺”意味着“没有”牛奶吗?
- 现实中,我们会对很多状态进行模糊的描述,但是在程序员的世界中,这不被允许。
- 认清“状态”可以让你的代码更简洁、健壮;
不要闭门造车
这位作者想说:
- 对程序员的刻板印象是:编程需要独自深度思考;
- 但作者是结对编程的死忠粉;(结对编程,前文提过)
- 与同事合作解决问题,能提升开发效率;
错误的交织
这位作者想说:
- 举了一个例子:阿波罗 11 号登月舱存在一个着陆器不稳定的错误,但是这个错误被另外一个错误弥补了,以至于登月时它们都没被发现;
- 当多个错误交织,修复错误将是一个非常头痛的事情,你将会不断遇到错误陷阱;
- 如果遇到这类问题,你需要有一个清醒的头脑,并考虑所有可能性;
Ubuntu
- Umuntu ngumuntu ngabantu:他人在,故我在。
不说了,这位作者又是结对编程的死忠粉~
不过,有个哲学问题可以探讨:
笛卡尔说:“我思故我在”,而祖鲁族有句谚语:“他人在,故我在”,意味着:与外界的联系和互动,是形成和保持连贯完整的自我印象的重要外在条件。剥夺这些条件后,人会面临失去自我的危险。
使用 Unix
这位作者想说:
- 他钟爱 Unix 胜过 IDE;
- Unix 可以非常有效的处理庞大的数据集;
- Unix 小而美;
- 在 Windows 上,Cygwin 环境可以提供 Unix;
- 遵循 Unix 规则,地球都是你的~(QAQ, NB)
算法和数据结构
这位作者想说:
- 举了一个例子:一个银行行长嫌购买的一批电脑太慢,最后发现是因为一个程序消耗了所有 CPU,这个程序就是一个循环算法;
- 先让程序能用,不一定是对的;
- 选择不同的算法和数据结构将会有很大不同;
- 推荐一本书 Donald Knuth 的《计算机编程艺术》;
拒绝冗长日志
这位作者想说:
- 大多日志记录根本无用;
- 分布式系统要考虑如何处理外部依赖失败时的日志记录问题;
- 日志是监控的一部分,记录它,就要有处理它的打算;
- 杂乱的日志投入生产将难以控制;
WET 消耗性能
我们前面说了 DRY 原则(不要重复自己),任何重复都可考虑进行抽象;
而 DRY 的对立原则是 WET(每次输入);
看段代码:遍历集合来进行查询
// WET:使用这个类的每个人都可能重新实现相同的查询; public class UsageExample { private ArrayList<Customer> allCustomers = new ArrayList<Customer>(); // ... public ArrayList<Customer> findCustomersThatSpendAtLeast(Money amount) { ArrayList<Customer> customersOfInterest = new ArrayList<Customer>(); for (Customer customer: allCustomers) { if (customer.spendsAtLeast(amount)) customersOfInterest.add(customer); } return customersOfInterest; } } // DRY:从 API 中删除暴露的原始集合,可以轻松避免上述情况; public class CustomerList { private ArrayList<Customer> customers = new ArrayList<Customer>(); private SortedList<Customer> customersSortedBySpendingLevel = new SortedList<Customer>(); // ... public CustomerList findCustomersThatSpendAtLeast(Money amount) { return new CustomerList(customersSortedBySpendingLevel.elementsLargerThan(amount)); } } public class UsageExample { public static void main(String[] args) { CustomerList customers = new CustomerList(); // ... CustomerList customersOfInterest = customers.findCustomersThatSpendAtLeast(someMinimalAmount); // ... } }
遵循 DRY ,让性能更优。
开发和测试合作
这位作者想说:
- 当程序员和测试人员合作,就能更快弄清错误;
- 程序员可以给测试提供建议以更好的覆盖测试;
- 程序员和测试人员配合完成自动化,了解良好的编码实践;
- 放下成见、合作共赢;
终身维护代码
这位作者想说:
- 编码态度第一,编写代码就好像你必须在你的余生会一直维护它一样;
- 这种认知会帮你成为一位专家,因为你会去学习设计模式、编写好的注释、测试代码并不断重构、不断扩展;
- 编的不是代码,是态度!!!
编写小函数
这位作者想说:
- 问题的关键都是一些小函数,它可能只有几行,几个变量,几个操作;
- 小函数通常回归到一些数学函数;
- 用小函数写一些测试用例,是解决问题的关键;
为他人编写测试
这位作者想说:
- 好的测试有完善的测试文档,描述测试场景、原理;
- 为他人编写测试,让其他人也能看懂;
- 测试你的测试,给出测试报告;
- 试着和测试人员换个角色;
关心代码
这位作者想说:
- 写得一手好代码需要努力工作、不断实践、不断关心代码;
- 精通算法不代表能写出好的代码,简洁的代码往往是好的代码;
- 合格程序员和优秀程序员之间的真正区别在于:态度;(这里与前文小点又契合了,看来态度真的还挺重要!!)
- 没有程序员是一座孤岛;
- 阅读本文意味着你关心代码,祝福你; O(∩_∩)O
了解客户
这位作者想说:
- 客户不会把自己的需求讲的非常详细,或者说在与客户的沟通中获得的信息是有限的,所以需要多次的互动;
- 尽早挑战挑战客户的需求的不合理之处;
- 学会用客户的术语与他们沟通,因为身份不同,即使谈论同一个东西,差异也会很大;
- 用图表或其它视觉辅助工具和客户沟通,提高信息的保留率;
✨✨✨✨✨
呜呼哀哉,总算是干完了~
本系列是 97 个不同程序员针对编程给出的建议!
有些是新奇的,比如:技术负债、编程即设计、Ubuntu 哲学思考等;
有些是通过讲故事引人入胜的,比如:认清“状态” 中的买牛奶故事,错误的交织中的登月飞船故事等;
有些是得到重新认知的,比如:开源实现梦想、让项目说话、结对编程等;
有些是要牢记的:态度第一、重视测试、DRY 原则等......
完整看一遍还是有很多感触的,不过目前可能还只是停留在感触,或许之后会再结合实战再谈~
不过别担心,种子已经埋下了!你一定能成长为一个有调性、有尿性的程序员儿 😎
OK,以上便是系列第 5 篇分享(共5篇),关注专栏,系列持续追踪~
我是掘进安东尼,输出暴露输入,技术洞见生活,下次再会~