ARTS 打卡 Week 04

用户头像
teoking
关注
发布于: 2020 年 06 月 16 日
ARTS打卡Week 04

每周完成一个 ARTS:

Algorithm: 每周至少做一个 LeetCode 的算法题

Review: 阅读并点评至少一篇英文技术文章

Tips: 学习至少一个技术技巧

Share: 分享一篇有观点和思考的技术文章



Algorithm

LC 76: Word Search

class Solution {
char[][] board;
int m;
int n;
String word;
public boolean exist(char[][] board, String word) {
if (board == null) {
return false;
}
this.board = board;
this.m = board.length;
this.n = board[0].length;
this.word = word;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (search(i, j,0)) {
return true;
}
}
}
return false;
}
private boolean search(int i, int j, int cur) {
// 是否超出边界
// 当前位置字符是否与目标字符匹配
if (i < 0 || i >= m || j < 0 || j >= n || word.charAt(cur) != board[i][j]) {
return false;
}
// 已经匹配
if (cur == word.length() - 1) {
return true;
}
// 标记当前位置不可走
char c = board[i][j];
board[i][j] = 0;
// 向当前位置相邻四个方向搜索,找到一个即可满足要求
boolean found = search(i - 1, j, cur + 1)
|| search(i + 1, j, cur + 1)
|| search(i, j - 1, cur + 1)
|| search(i, j + 1, cur + 1);
// 恢复当前位置可走
board[i][j] = c;
return found;
}
}

实现注意点:

  1. 搜索问题的套路

  2. 进一步搜索前标记当前位置不可走,之后恢复。这是一个空间非常节省的技巧。



Review

How not to get desperate with MVVM implementation

Apple MVC它的问题是会导致controller太大;由于view状态难以mock,导致controller的tests很难写

iOS中view和view model的binding实现方式:

  1. Use KVO (Key-Value Observing) pattern. -- 简单易用,但会导致delegate膨胀

  2. Use 3rd party libraries for FRP (Functional Reactive Programming) such as RxSwift and ReactiveCocoa. -- 需要对函数式编程熟悉

  3. Craft it yourself. -- 作者举例了一个closure实现



文章内容回顾:

  • Made a binding theme using the closure. --使用closure实现了一套binding

  • Removed all controller logic from the View. --从view剥离逻辑

  • Created a testable ViewModel. --实现可测的ViewModel



对于中等规模项目,MVVM算是个不错的选择。



最后作者比较担心view model干得事情太多。



ps:实际项目中我也在使用MVVM,但感觉不少地方有些蹩脚。在Android中,MVVM + LiveData + Coroutine的组合用起来还是很happy的。



Tips

如何阅读别人的代码?

个人笔记:

  1. 确定阅读代码的目标

  2. 我要评估是否引入某个第三方模块;

  3. 我要给某个模块局部修改一个 Bug(可能是因为使用的第三方模块遇到了一个问题,或者可能是你的上级临时指定了一个模块的 Bug 给你);

  4. 我要以某个开源模块为榜样去学习;

  5. 我要接手并长期维护某个模块。

  6. 阅读代码时,需要有产出 -- 程序的架构设计 (个人评:没文档产出,代码看得快,忘得也快)

  7. 理解架构核心脉络

  8. 首先,把公开的软件实体(模块、类、函数、常量、全局变量等)的规格整理出来

  9. 看 example、unit test 等。这些属于我们研究对象的客户,也就是使用方。它们能够辅助我们理解各个软件实体的语义

  10. 进一步证实或证伪我们的结论。通过重点函数或类理解业务流程,印证我们的猜测

  11. 确保我们正确理解了系统,就需要将结论写下来,形成文档

  12. 理解业务实现机制

  13. 在必要情况下,才研究实现机制(因为这很耗费精力)

  14. 确定目标 (明确知道自己要了解系统哪一块)

  15. 梳理关键业务流程 (程序 = 数据结构 + 算法),理解核心数据结构和算法

  16. 剩下来就是理各个 UserStory 的业务流程(与手头工作相关的)



Share

熟悉与效率

一个月前,我加入一个iOS开发项目。这一个月可以描述为“一周多速成iOS开发,写了两周多业务逻辑”。

同样的功能放在在Android项目中,我可能只需要三分之一的时间来完成。

以前我总认为自己学习能力还可以,可以很快适应新平台、新项目,杂七杂八学了不少,俗话说“技多不压身”嘛。但经过近两年频繁换项目之后,我认识到对一个平台、一个项目的“熟悉”度,是很重要的(对公司),也是很困难的(耗费个人大量精力)。做技术,终归要深入下去,对所从事领域足够熟悉(参考浩哥分享的google技能评级卡片),才能做到高效做事,突破天花板。

目标与结果

最近小孩小学入学择校,因为房本年限和工居年限不足,没有被家门口的一所名校分校择校录取到。小区预估择校录取了16个,除了京籍,房本、工居都在10年往上。为此,我和爱人还是不免有些失落;爱人去学校门口看完录取单,发微信告知于我时感慨:“有一种名落孙山的感觉”。

这个事情给我们的教训是,越是竞争激励的事情,越要尽早准备。

回想北漂这十年,可能从有了孩子开始,才考虑生活方面的规划和安排。生活方面的很多事情,常常处于被动、被迫,缺乏明确的家庭目标和计划。互联网人,还是要花一些心思来积极面对生活,花时间去理解社会行为背后的原理,制定明确的家庭目标,推进达到目标结果。



发布于: 2020 年 06 月 16 日 阅读数: 41
用户头像

teoking

关注

Monkey plays software. 2018.11.28 加入

程序员。目前主要从事Android和iOS开发。

评论

发布
暂无评论
ARTS打卡Week 04