CodingTour
ARTS #209 | OFF WORK

一个位于海边的亲子露营地,环境和氛围很好~

Algorithm

本周选择的算法题是:Largest Submatrix With Rearrangements

impl Solution {
    pub fn largest_submatrix(matrix: Vec<Vec<i32>>) -> i32 {
        let mut matrix = matrix;
        let (m, n) = (matrix.len(), matrix[0].len());
        let mut res = 0;
        for i in 1..m {
            for j in 0..n {
                if matrix[i][j] == 1 {
                    matrix[i][j] += matrix[i - 1][j];
                }
            }
        }
        for i in 0..m {
            matrix[i].sort_unstable();
            for j in (0..n).rev() {
                res = res.max(matrix[i][j] * (n - j) as i32);
            }
        }
        res
    }
}

Review

Difference Between Tesla’s Solar Roof and Traditional Solar Panels

这篇文章科普了特斯拉太阳能屋顶与传统太阳能电池板的区别。简而言之,如果预算和灵活性是你的主要考虑因素,那么传统面板是更好的选择;如果重视美观以及与家居设计的融合,并愿意投资更多,那么特斯拉太阳能屋顶会是更好的选择。特斯拉的方案还有一个额外的优势是能与自家的 Powerwall 电池集成,增强储能能力,而且特斯拉在创新和质量方面的品牌声誉也是一个驱动因素,它有可能增加房产价值,并且它的使用寿命更长,减少了频繁更换的需要。

这是预算和美观之间的权衡,每种选择都迎合不同的喜好。

Tip

HTTP 状态码 307 和 301 都用于重定向,但它们之间有一些关键的区别:

  1. 307 Temporary Redirect (临时重定向):
    • 当服务器返回 307 状态码时,它表示请求的资源已被临时移动到了新的位置。客户端应该继续使用原始的请求方法(GET、POST 等)和请求体来请求新的 URL
    • 307 状态码保留了原始请求中的请求方法,这意味着如果原始请求是 POST,那么客户端应该在重定向时继续使用 POST 方法
  2. 301 Moved Permanently (永久重定向):
    • 与 307 不同,301 表示请求的资源已经永久移动到新的位置。搜索引擎等客户端程序应该更新他们的链接,将原始 URL 更新为新的 URL
    • 客户端在遇到 301 重定向时通常会使用 GET 方法,即使原始请求是 POST。这就是为什么在使用 301 时,可能会导致从 POST 请求到 GET 请求的转变

在选择使用 307 还是 301 时,你需要考虑到你的业务需求。如果你希望客户端在重定向时保留原始的请求方法,你可能会选择使用 307;如果你确信资源已永久移动,并且希望客户端将来的请求都使用新的 URL,那么 301 可能更合适。

Share

从两个维度去权衡

在软件开发领域,我们常常需要在不同的维度上进行权衡,三个实际的例子:

  • 用户故事的撰写,写成什么样才算好
  • 微服务粒度,多大合适
  • 变量名的选择,长 or 短哪个更好

用户故事的撰写: 用户故事是软件开发中的关键元素,它能够有效地传递用户需求,再从需求到动作再到产生的业务价值。在权衡中,我们需要考虑故事的详细程度,有些团队倾向于编写非常详细和具体的用户故事,以确保开发者能充分理解需求。然而,有时候过分详细可能导致对目标的感知变弱,同时在变更时维护成本会更高,因此要找到一个平衡,故事要足够小,但不能小到没有业务价值,也要提供足够的信息,让团队有一定的灵活性。

例子:

  • 不好的用户故事: “用户点击按钮,然后系统弹出一个对话框,用户在对话框中输入文本,最后点击确定按钮。”
  • 好的用户故事: “作为一个编辑者,我希望能够快速添加新文章,以便我能够更有效地管理内容。”

拿下图来说:

天水之间的最好,既有业务的价值,又有实现的指导。

微服务的粒度: 在微服务架构中,微服务的粒度是一个关键问题。微服务过大,会超出一个业务能力的边界,而微服务过小可能又无法表达一个业务能力,同时微服务增多会加重部署和维护的复杂度。

在权衡微服务的粒度时,从业务能力的封装角度来看,我们需要确保每个微服务都能够独立地承担某个业务功能,并且在整个系统中形成清晰的业务边界。这样的设计有助于提高代码的可维护性和团队的开发效率。

变量名的选择: 在编写代码时,选择合适的变量名至关重要。在变量名的长度上进行权衡时,我们需要考虑代码的可读性和维护性。较长的变量名可能更具描述性,但有时候可能会导致代码行过长,阅读效率低;较短的变量名则可能缺乏清晰的描述。

例子:

  • 短变量名: int x = 10;
  • 长变量名: int numberOfStudents = 10;
  • 更长的变量名:int numberOfStudentsInClass = 10;

变量名要具有描述性,不能短到语义不清,但不应过于冗长。

总而言之,没有单一维度评价好还是不好,也得不到一个越怎么样就怎么样的答案,要至少从两个维度去权衡业务价值和工程效率或代码质量,取得平衡,是确保项目成功的关键。