写点什么

ARTS 打卡 第一周,ARTS 我来啦!

作者:海风极客
  • 2023-08-27
    北京
  • 本文字数:2897 字

    阅读完需:约 10 分钟

ARTS 打卡 第一周,ARTS我来啦!

作为一名热爱分享的 Programmer,ARTS 这样的活动当然是少不了我,Algorithm,一道算法题;Review,读一篇英文文章;Technique/Tips,分享一个小技术;Share,分享一个观点。我觉得这就是工作之外我最喜欢做的事情的合集,但是困难也是有的,比如算法题很考验思维,英文文章需要英语水平等等,但是想要成为一名优秀的工程师,就需要学会在困境中成长!下面分享我第一周的打卡内容吧。

Algorithm

选自力扣网站上的题目:最大公共前缀


编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
示例 1:输入:strs = ["flower","flow","flight"]输出:"fl"
示例 2:输入:strs = ["dog","racecar","car"]输出:""
复制代码


code:


func longestCommonPrefix(strs []string) string {  minSize := math.MaxInt  sLen := len(strs)  byteArr := make([][]byte, sLen)  for i, s := range strs {    byteArr[i] = []byte(s)    if minSize > len(byteArr[i]) {      minSize = len(byteArr[i])    }  }
bytes := make([]byte, 0) for j := 0; j < minSize; j++ { k := 0 for i := 0; i < len(byteArr); i++ { if byteArr[0][j] == byteArr[i][j] { k += 1 } } if k == len(byteArr) { bytes = append(bytes, byteArr[0][j]) } else { return string(bytes) } } return string(bytes)}
复制代码


over~

Review

之前研究 gRPC 框架源码的时候阅读过的文章,下面来回顾一下吧:



以下是该文章内容的一部分节选:


The idea of remote procedure calls (hereinafter called RPC) is quite simple. It isbased on the observation that procedure calls are a well-known and wellunderstood mechanism for transfer of control and data within a program running on a single computer. Therefore, it is proposed that this same mechanism be extended to provide for transfer of control and data across a communication network. When a remote procedure is invoked, the calling environment issuspended, the parameters are passed across the network to the environment where the procedure is to execute (which we will refer to as the callee), and the desired procedure is executed there. When the procedure finishes and produces its results, the results are passed backed to the calling environment, where execution resumes as if returning from a simple single-machine call. While the calling environment is suspended, other processes on that machine may (possibly) still execute (depending on the details of the parallelism of that environment andthe RPC implementation).

远程过程调用(简称 RPC)的思想非常简单。它是基于观察过程调用,是一个众所周知且很好理解的机制,在一个运行在单台计算机上的程序中传递控制和数据。因此,我们建议将同样的机制加以扩展,以提供跨通信网络的控制和数据传输。当调用远程过程时,调用环境将被挂起,参数将通过网络传递到过程将要执行的环境(我们将其称为被调用者),所需的过程将在那里执行。当过程完成并产生结果时,结果被回传给调用环境,在那里执行就像从简单的单机调用返回一样。当调用环境挂起时,该计算机上的其他进程可能(可能)仍然执行(取决于该环境的并行性和 RPC 实现的细节)。

There are many attractive aspects to this idea. One is clean and simple semantics: these should make it easier to build distributed computations, and to get them right. Another is efficiency: procedure calls seem simple enough for the communication to be quite rapid. A third is generality: in singie-machine computations, procedures are often the most important mechanism for communication between parts of the algorithm.

这个想法有许多吸引人的方面。一个是简洁的语义:用来构建分布式计算更加容易,并不容易出错。另一个是效率:程序相互调用足够简单,通信速度相当快。第三是通用性:在单机计算中,过程通常是算法各部分之间最重要的通信机制。

Technique/Tips

本次分享的小技巧:优雅的关闭 Go 程序


在实际的开发中你可能会遇到这样的问题,程序异常终止但自己却浑然不知,程序关闭前消息队列还有部分未消费等等,所以程序不能异常终止,我们可以选择更加优雅的方式进行程序的关闭,话不多说直接上代码:


func main() {  defer func() {    fmt.Println("defer func ...")  }()
fmt.Println("main func ...")
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT)
sig := <-ch
fmt.Printf("get signal %+v ...\n", sig)}
复制代码


大家可以先猜猜看这个 main 函数的执行顺序,没错,只会输出 main func ...

但是在按 Ctrl+C 或关闭程序时就会输出如下:


因此大家就可以将程序退出前想要执行的函数放在 defer 函数中或者放在<-ch 后,已达到在程序终止前执行一些必要的程序。

Share

作为一名开发者,相信大家对开源软件都会有所了解,比如 Linux 操作系统,Web 服务器 Tomcat、Apache,开源框架 Spring、Mybatis、Gin 等等,无论是在工作还是学习中肯定多多少少都会有所使用,所以我们可能无时无刻都在和开源打交道。


但是在这些开源软件的使用或开发过程中,一旦遇到问题,大家都是如何解决的呢?


其实对一些相对主流的开源软件,遇到的大多数问题都可以使用搜索引擎和官方文档解决,那如果遇到比较罕见的问题以上措施都无法解决怎么办?或者说你是第一个遇到问题的人怎么办?


如果真的如此,那么我先恭喜你,在这个问题上,你没有走在很多人的后面。那么到底该如何解决呢?我认为最好的方式就是看源码!这种方式不仅可以帮助我们解决问题,还能够让我们在解决问题过程中学习和丰富自己,接下来就给大家分享一下我是如何高效阅读源码的:


(1)了解项目结构


在阅读源码前,我们需要先了解整个项目的结构,包括目录结构、文件类型等。大多数项目都会提供文档或说明,通过查看这些文档,我们可以快速了解项目的组织结构和主要功能。



PS:以上的项目结构不一定所有的开源项目都会有,不同组织或作者的不同风格可能会存在差异。


(2)从所熟悉的功能开始


在源码中先查找到功能的实现,在找到相关代码后,我们可以按照以下步骤进行阅读:


  • 阅读函数或对象的声明,了解参数、返回值等信息。

  • 观察函数或对象的大致实现方式,了解其功能特点。

  • 深入阅读函数或对象的具体实现,了解其内部工作原理和细节。

  • 结合具体的使用场景,理解函数或对象的适用范围和限制。


(3)使用调试器进行 debug


在阅读源码时,我们可以使用调试器来帮助我们理解代码的执行过程。调试器可以帮助我们设置断点、单步执行代码、查看变量值等,使我们能够更加深入地了解代码的内部工作原理。

小结

本次的分享就到这里喽,总体来说每天花一些时间来分别研究这几件事情,然后一周的周末来一个总结,这样的方式也是相当不错的。

发布于: 2023-08-27阅读数: 25
用户头像

海风极客

关注

做兴趣使然的Hero 2021-01-14 加入

Just do it.

评论

发布
暂无评论
ARTS 打卡 第一周,ARTS我来啦!_ARTS 打卡计划_海风极客_InfoQ写作社区