程序员优秀之路:一起来看下这 97 位”砖家“能给出啥编程的好建议?(5)

2022-09-22 12:06:00 浏览数 (1)


theme: awesome-green

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战 本系列共 5 篇,通译自:97-things-every-x-should-know License:由 CC BY-SA 3.0 获得许可; 欢迎点赞、收藏、评论~ O(∩_∩)O

  • 本瓜并未逐字逐句翻译,而是取其精要、理解抽象,结合自身进行撰文表达,与各位看官分享。认知好的编程概念,走向优秀~
  • 《程序员优秀之路:认知 97 个好的编程概念(1)》
  • 《程序员优秀之路:认知 97 个好的编程概念(2)》
  • 《程序员优秀之路:认知 97 个好的编程概念(3)》
  • 《程序员优秀之路:认知 97 个好的编程概念(4)》

终于来到第 5 篇啦,善始善终~

测试保障开发严谨

这位作者想说:

  1. 软件开发与桥梁建设这类实体工程相似,但最大的不同是:软件开发不需要实体材料;
  2. 对软件的测试尤其重要,软件的构建成本低,可以开发一个完整的生态来进行测试,包括:单元测试、模拟对象、测试工具等等;
  3. 测试保障了软件开发工程的严谨性,就好比建筑工程在图纸上所做的结构分析保障了工程质量;认清“状态”

这位作者想说:

  1. 程序员对于“状态”的认定需要非常清晰;
  2. 举了一个例子:作者去喝咖啡,想找店员要一点牛奶,店员回答说:“牛奶紧缺”,作者懵 b 了,“牛奶紧缺”是什么意思?要么就是“有”牛奶,要么就是“没有”牛奶,对于作者来说,“牛奶紧缺”意味着“没有”牛奶吗?
  3. 现实中,我们会对很多状态进行模糊的描述,但是在程序员的世界中,这不被允许。
  4. 认清“状态”可以让你的代码更简洁、健壮;不要闭门造车

这位作者想说:

  1. 对程序员的刻板印象是:编程需要独自深度思考;
  2. 但作者是结对编程的死忠粉;(结对编程,前文提过)
  3. 与同事合作解决问题,能提升开发效率;

错误的交织

这位作者想说:

  1. 举了一个例子:阿波罗 11 号登月舱存在一个着陆器不稳定的错误,但是这个错误被另外一个错误弥补了,以至于登月时它们都没被发现;
  2. 当多个错误交织,修复错误将是一个非常头痛的事情,你将会不断遇到错误陷阱;
  3. 如果遇到这类问题,你需要有一个清醒的头脑,并考虑所有可能性;Ubuntu
  • Umuntu ngumuntu ngabantu:他人在,故我在。

不说了,这位作者又是结对编程的死忠粉~

不过,有个哲学问题可以探讨:

笛卡尔说:“我思故我在”,而祖鲁族有句谚语:“他人在,故我在”,意味着:与外界的联系和互动,是形成和保持连贯完整的自我印象的重要外在条件。剥夺这些条件后,人会面临失去自我的危险。

使用 Unix

这位作者想说:

  1. 他钟爱 Unix 胜过 IDE;
  2. Unix 可以非常有效的处理庞大的数据集;
  3. Unix 小而美;
  4. 在 Windows 上,Cygwin 环境可以提供 Unix;
  5. **遵循 Unix 规则,地球都是你的~**(QAQ, NB)算法和数据结构

这位作者想说:

  1. 举了一个例子:一个银行行长嫌购买的一批电脑太慢,最后发现是因为一个程序消耗了所有 CPU,这个程序就是一个循环算法;
  2. 先让程序能用,不一定是对的;
  3. 选择不同的算法和数据结构将会有很大不同;
  4. 推荐一本书 Donald Knuth 的《计算机编程艺术》;拒绝冗长日志

这位作者想说:

  1. 大多日志记录根本无用;
  2. 分布式系统要考虑如何处理外部依赖失败时的日志记录问题;
  3. 日志是监控的一部分,记录它,就要有处理它的打算;
  4. 杂乱的日志投入生产将难以控制;

WET 消耗性能

我们前面说了 DRY 原则(不要重复自己),任何重复都可考虑进行抽象;

而 DRY 的对立原则是 WET(每次输入);

看段代码:遍历集合来进行查询

代码语言:javascript复制
// 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 ,让性能更优。

开发和测试合作

这位作者想说:

  1. 当程序员和测试人员合作,就能更快弄清错误;
  2. 程序员可以给测试提供建议以更好的覆盖测试;
  3. 程序员和测试人员配合完成自动化,了解良好的编码实践;
  4. 放下成见、合作共赢;

终身维护代码

这位作者想说:

  1. 编码态度第一,编写代码就好像你必须在你的余生会一直维护它一样;
  2. 这种认知会帮你成为一位专家,因为你会去学习设计模式、编写好的注释、测试代码并不断重构、不断扩展;
  3. 编的不是代码,是态度!!!

编写小函数

这位作者想说:

  1. 问题的关键都是一些小函数,它可能只有几行,几个变量,几个操作;
  2. 小函数通常回归到一些数学函数;
  3. 用小函数写一些测试用例,是解决问题的关键;为他人编写测试

这位作者想说:

  1. 好的测试有完善的测试文档,描述测试场景、原理;
  2. 为他人编写测试,让其他人也能看懂;
  3. 测试你的测试,给出测试报告;
  4. 试着和测试人员换个角色;

关心代码

这位作者想说:

  1. 写得一手好代码需要努力工作、不断实践、不断关心代码;
  2. 精通算法不代表能写出好的代码,简洁的代码往往是好的代码;
  3. 合格程序员和优秀程序员之间的真正区别在于:态度;(这里与前文小点又契合了,看来态度真的还挺重要!!)
  4. 没有程序员是一座孤岛;
  5. 阅读本文意味着你关心代码,祝福你; O(∩_∩)O

了解客户

这位作者想说:

  1. 客户不会把自己的需求讲的非常详细,或者说在与客户的沟通中获得的信息是有限的,所以需要多次的互动;
  2. 尽早挑战挑战客户的需求的不合理之处;
  3. 学会用客户的术语与他们沟通,因为身份不同,即使谈论同一个东西,差异也会很大
  4. 用图表或其它视觉辅助工具和客户沟通,提高信息的保留率;

✨✨✨✨✨

呜呼哀哉,总算是干完了~

本系列是 97 个不同程序员针对编程给出的建议!

有些是新奇的,比如:技术负债编程即设计Ubuntu 哲学思考等;

有些是通过讲故事引人入胜的,比如:认清“状态” 中的买牛奶故事,错误的交织中的登月飞船故事等;

有些是得到重新认知的,比如:开源实现梦想让项目说话结对编程等;

有些是要牢记的:态度第一重视测试DRY 原则等......

完整看一遍还是有很多感触的,不过目前可能还只是停留在感触,或许之后会再结合实战再谈~

不过别担心,种子已经埋下了!你一定能成长为一个有调性、有尿性的程序员儿

0 人点赞