CodingTour
ARTS #164

Algorithm

本周选择的算法题是:partition-list

规则

Given the head of a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

Example 1:

img

Input: head = [1,4,3,2,5,2], x = 3
Output: [1,2,2,4,3,5]

Example 2:

Input: head = [2,1], x = 2
Output: [1,2]

Constraints:

  • The number of nodes in the list is in the range [0, 200].
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

Solution

impl Solution {
    pub fn partition(mut head: Option<Box<ListNode>>, x: i32) -> Option<Box<ListNode>> {
        let (mut left_head, mut right_head) = (ListNode::new(0), ListNode::new(0));
        let (mut left, mut right) = (&mut left_head, &mut right_head);

        while let Some(mut node) = head {
            head = node.next.take();
            if node.val < x {
                left.next = Some(node);
                left = left.next.as_mut().unwrap();
            } else {
                right.next = Some(node);
                right = right.next.as_mut().unwrap();
            }
        }

        left.next = right_head.next;
        left_head.next
    }
}

Review

The Real Reason Apple Doesn’t Want To Add A USB-C Port To The iPhone

Should Apple go portless or add a USB-C port to the iPhone?

很有趣的问题,背后有创新、控制、环保维度的考量,但最重要的还是利益问题:

That’s give or take $43.5B on Lightning cable sales alone.

离 2024 年还不到两年,欧盟强制统一使用 USB-C 接口(包括 iPhone)的日子越来越近,我很好奇苹果会如何决策。

Tip

The Guardian 这家网站很有意思,它非常诚实:

以往看到的应用,关于 Cookie 这块儿最多只呈现一个非常 tiny 的提示窗口,而 The Guardian 非常诚实的告诉用户 “我们或用或卖你所有的个人数据给我们的合作伙伴”,它的合作伙伴可不少:

足足有 242 家公司,这么诚实真的好么… 从交互角度看这是一个很失败的 case,我想用户无论如何也不会感觉 happy 吧。

Share

关于技术氛围的形成

建立技术氛围要在有交流协作的前提下才有可能,一个团队如果大家都是各做各的,那显然日常也没什么交流的必要,自然很难有好的讨论环境和技术氛围的生长土壤。

尽可能创造交流的机会,比如:

  • 抛出一个话题让大家探讨
  • 找出一个 bug 并分析背后的原因
  • 组织一场分享会
  • 组织团建活动或技术活动(如每年的 1024 活动)
  • 深入开展 Code Review 机制
  • 试水新技术、新框架

安卓前两周在团队内发起的代码规范评审就是一次很好的交流活动~

萧伯纳说:“你有一个苹果,我有一个苹果,彼此交换一下,我们仍然是各有一个苹果;但你有一种思想,我有一种思想,彼此交换,我们就都有了两种思想,甚至更多。”

有了交流的机会后再尝试一起做些技术导向的事情,分为偏保守或者偏激进的。偏保守的,会多选择已经经过多年使用,成熟稳定的技术,这样不确定性因素少,掉坑机率小;偏激进的,会多选择新出现的技术,因为新技术往往功能和性能上都更佳,可以更好更快的满足需求。两种倾向虽各有优劣,但如果要打造一个有浓厚技术氛围的团队,那么最好是能将天平向激进一端倾斜一些,过于保守追求稳妥的技术团队是很难形成学习型氛围的。

有哪些事情可以做:

  • 比如建立更简单易用的开发环境,做成一个一键的 CLI 工具,不要再让开发者对着文档到处下载安装了
  • 比如上线发布,能够做成一个发布系统的,就不要再写发布文档交给各个协作方一步一步操作了
  • 推行技术平台化建设、推行 DevOps、推行自动化构建、测试和部署流程等
  • 现在 SaaS 兴起,有非常多的云服务和第三方软件可用,可以采购一些好用的工具,或自研定制化的工具,在创造和使用工具上,工程师的热情是高涨的,围绕工具的讨论也会促进技术氛围的提升(我们公司本周在技术群里有关于 Jira 的讨论)

这几样事情虽然不直接产出产品,但可以显著提高团队的开发效率和技术水平。

如果团队中的大部分人,热爱技术、喜欢折腾、乐于分享,在这样的环境下,一方面能激发团队不断的推陈出新,另一方面也能使团队成员有持续的自我成长。人不是螺丝钉,以春蝉到死丝方尽的理念用人,那结果就很明显 — 每天都很累,感受身体被掏空,没有精力去学习新技术、去分享技术,长此以往认为没有成长就离开了。显然这种方式无异于杀鸡取卵,团队应该是一群充满活力的人,要被确定价值,要给予机会、时间进行试错,探索新的领域,让他们感受到未来可期。