写点什么

ARTS 打卡 Week2

作者:WaitBright
  • 2023-08-28
    北京
  • 本文字数:2343 字

    阅读完需:约 8 分钟

ARTS 打卡 Week2

Algorithm

Go 版本实现如下

  • 思路:双指针从后往前遍历

  • 具体实现:定义三个指针,i,j,k 指向两个数组元素最后一个和 nums1 整体最后一个。接着并遍历边根据 nums1[i],nums2[j]大小将大的放到 nums1[k]中,同时更新指针。最后将剩余元素补充到 num1 前面即可。


func merge(nums1 []int, m int, nums2 []int, n int)  {    if m == 0 {        for i := 0; i < n; i++ {            nums1[i] = nums2[i]        }        return    }    if n == 0 {        return    }    i, j, k := m-1, n-1, m+n-1    for i >= 0 && j >= 0 {        if nums1[i] > nums2[j] {            nums1[k] = nums1[i]            i--        } else {            nums1[k] = nums2[j]            j--        }        k--    }    // 此时nums1已经排好序了,直接返回即可    if j < 0 {        return    }    // 需要把nums2剩下的元素移到nums1前面    if i < 0 {        for k >= 0 {            nums1[k] = nums2[k]            k--        }    }}
复制代码


Review

  • Books/grok_system_design_interview.pdf at main · WaitBright/Books (github.com)

  • 最近开始学习系统设计,阅读了 Grokking the System Design Interview 第一章,总结如下

  • 三个 SDIs(system design interviews) 困难的原因:1. SDIs 开放问题没有结构化学习 2. 缺乏大型分布式系统开发经验 3. SDIs 无准备

  • SDIs 面试 7 大步骤:

  • Step 1: Requirements clarifications 明确系统设计需求,要不断的向面试官提问来确定需求。

  • Step 2: System interface definition 接口定义,确保设计的系统能满足要求。例如:

postTweet(user_id, tweet_data, tweet_location, user_location, timestamp, …)generateTimeline(user_id, current_time, user_location, …)markTweetFavorite(user_id, tweet_id, timestamp, …)
复制代码
  • Step 3: Back-of-the-envelope estimation 粗略评估系统规模,以便是否要考虑扩展、分区、负载均衡和缓存

  • Step 4: Defining data model 定义数据模型,UML 表结构设计,需要尽早的明白系统要几张表,还要知道用关系型数据库还是非关系型数据库,还有图片和视频怎么存储

Step 5: High-level design 从整体上设计系统,用 5-6 个框图表示各模块之间的联系,从用户层到存储层

  • Step 6: Detailed design 详细设计,找两到三个模块详细讨论,比如这个系统重要模块,为啥这样设计而不是那样,对比设计方案。记住没有标准答案,只有权衡利弊之后的决定

  • Step 7: Identifying and resolving bottlenecks 定义和解决瓶颈/痛点 尽可能多的提出瓶颈,并提出不同的解决方案

• Is there any single point of failure in our system? What are we doing to mitigate it?

• Do we have enough replicas of the data so that if we lose a few servers we can still serve our users?

• Similarly, do we have enough copies of different services running such that a few failures will not cause total system shutdown?

• How are we monitoring the performance of our service? Do we get alerts whenever critical components fail or their performance degrades?

Technique/Tips

继续学习 Go 的相关技巧,这次学习的是 select 和 channel,学习素材如上。

  • select 可以类比 switch 学习,会监听 IO 操作,IO 操作就是对 channel 通道发送或者读取数据。在执行 select 语句的时候,运行时系统会自上而下地判断每个 case 中的发送或接收操作是否可以被立即执行,当前 Goroutine 不会因当前操作而被阻塞。

  • channel 要掌握操作结果表,针对 channel 在不同的状态下三种操作的结果。然后要注意 channel 的三个易错点:1) nil channel 代表 channel 未初始化,向未初始化的 channel 读写数据会造成阻塞;2) 关闭未初始化的 channel 会引起 panic。3) 从一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值而不会引起 panic。

Share

  • 01 | 程序员如何用技术变现(上) (geekbang.org)

  • 02 | 程序员如何用技术变现(下) (geekbang.org)

  • 读了下皓哥关于技术变现的文章,有几句话感触很深:

  • 在工作当中,对于那些没什么技术含量的工作,我基本上就像是在学生时代那样交作业就好了。我想尽一切方法提高交作业的效率,比如,提高代码的重用度,能自动化的就自动化,和需求人员谈需求,简化掉需求,这样我就可以少干一些活了。这样一来,我就可以有更多的时间,去研究公司内外那些更为核心更有技术含量的技术了。

  • Purify 文章事件思考的一些道理。

  • 要去经历大多数人经历不到的,要把学习时间花在那些比较难的地方

  • 要写文章就要写没有人写过的,或是别人写过,但我能写得更好的。

  • 更重要的是,技术和知识完全是可以变现的。

  • 25~35 岁是每个人最宝贵的时光,应该用在刀刃上。一个是技术和技能的领先,二是对技术本质和趋势的敏感度。

  • 并不是社会不尊重程序员,只要你能帮上大忙,就一定会赢得别人的尊重。

  • 如何让自己的技能变现:9 条建议就不一一列举了,建议直接看原文。这篇文章感触最深的是最后总结的一段:“最宝贵的财富并不是钱,而是你的时间,时间比钱更宝贵,因为钱你不用还在那里,而时间你不用就浪费掉了。你把你的时间投资在哪些地方,就意味着你未来会走什么样的路。所以,利用好你的时间,投到一些有意义的地方吧”。确实是这样,自己虽然每天都很忙,但是并没有把时间花在真正提高自己,让自己技术更强的地方。每天都在处理各种业务上鸡毛蒜皮的小事,对前沿知识和技术细节并不了解,只是拿来主义,为此要彻底改变以前的工作习惯,重新规划时间,提高工作效率,把时间花在比较难的地方,利用好自己的青年时光。

发布于: 刚刚阅读数: 3
用户头像

WaitBright

关注

还未添加个人签名 2018-09-27 加入

还未添加个人简介

评论

发布
暂无评论
ARTS 打卡 Week2_ARTS 打卡计划_WaitBright_InfoQ写作社区