0904f77caa99c2a3ce9b3b794784e1ac
做点有意思的事情 - 2018 年小结

从个人博客 Guardia,内附头条面经

又到了写年终总结的时候,2018 年感觉自己做了很多有意思的事情,但是感觉时间仍旧不够用,就连写博客总结的时间都被剥夺了。希望 2019 年能多挤一些时间出来留给学习与总结。因为很多东西的总结是关键的,可能这是适用于自身学习的方法论。 🤣

积累

读书

翻了一下 2018 的豆瓣成绩,技术类 3 本,读物类 19 本(之前懒得记录,12月份一块记了一波豆瓣 😆),读书居然比去年少了 2 本,个人总结原因有二:

  1. 上班通勤大幅度缩短,现在距离公司 800 米,每天早上的缝隙时间就变得很少;
  2. 工作时长相比以前增长,并且有挑战性的事情变多,更多的时间投入到了技术的学习和代码的实现。

这里说几本比较有意思的书:

  1. 《白金数据》:东野的伦理类与科技类小说,虽然不是很精彩,但是将科技侦破与政治相结合,也反映了很多社会问题。
  2. 《长夜难明》:强烈推荐这本书,非常棒的动机推理故事。读完之后的感觉,就像之前看《嫌疑人X的献身》《恶意》一样,直到最后才浮现真想;
  3. 《腾讯传》:不看腾讯的历史,你很难想象 QQ 做下去的艰辛创业史,面临多个强大的竞品如何保住自身的地位,如何实现 IM 软件在商业化上的成功变现。另外:QQ 秀、Qzone、各种钻对于九零后的我们太回忆杀了。另外,十分不建议看《阿里传》《蚂蚁金服》,这两本书实在是不客观。
  4. 《Ruby基础教程》:工作需要去学这么一个语言来做工具链,所以看了看这本入门书。对新手很友好,上手很快,但是有些枯燥。最近开始看 《Ruby元编程》,有一定的基础要求,但是比这本有趣的多。

GitHub 统计

GitHub 全年贡献 420 Contributions,日均 1.14 次,与去年 GitHub 的贡献对比大打折扣。

由于年中更换了工作,适应新工作就没有像之前那么频繁。另外,Sepicat 在 5 月份将全部代码迁移到了 BitBucket,所以所有关于 Sepicat 开发的 GitHub Contribution 就全部停滞了。

个人 APP - Sepicat 的迭代

Sepicat 自今年 4 月份发布已经迭代至 1.2.8,其中经历了 11 个版本。在这 11 个小版本中我做了很多自己认为很帅的需求,下面展示一下我认为最炫酷的几个功能。

  1. GitHub 个人 QRCode 名片;
  2. Sepicat Theme 程序员信仰主题;
  3. Star Box - Star 收藏盒子快速检索;
  4. Trending 广场,用于发现更多有趣的 Repository;

如果你喜欢 GitHub 并且也喜欢 Sepicat 的风格,也可以来 App Store 购买支持下我。

全年心得

爱奇艺的积累

2018 年 5 月份我经历了第一次跳槽,结束了在爱奇艺 1 年多的经历。非常幸运的从 2016 年 8 月份的实习一直到校招 Offer 进入爱奇艺电视果团队,亲眼见证了电视果这个硬件从 10w/年 到 50w/年 的突破。整个团队的小伙伴也十分给力,很有创业精神。爱奇艺电视果 APP 从 3.0 迭代到 5.0 的整个过程,硬件从最简单的 DLNA 协议一直到 4G 版本可插卡功能。在 3 个人支撑日活近 10 万 App 的迭代过程中,我个人也学到了很多东西。

清明节过后,开始找第二份工作。其实刚开始决定找工作的时候有一些跟风,Joy、BS 和大左他们这些我认为在同龄人里钦佩的一些人都已经跳槽,并且其工作内容都已切换成自己认为理想的方向,所以自己也有了跳槽的打算。另外,个人也希望参与一款体量大的 APP 开发,所以想去尝试一下。经过了多方面的对比,发现头条是一个好的去处。

抖音的面试经历

这里我尽可能的还原一下抖音面试的全部过程,当然团队还在扩建,移动端、前端和后端都在招人。如果有兴趣也可以在下面评论或者其他方式联系我。

一面

  • HTTP 和 HTTPS 的区别以及 HTTPS 中的 TLS和 SSL 细节。
  • SSL 中的对称加密和非对称加密。
  • DLNA 的 SSDP 发现流程。
  • ObjC 问题集:NSObject 结构;isa 指针结构;引用计数相关;block 类型、特点及循环引用注意点。
  • 聊了下之前的项目经验;
  • 聊了下 Sepicat 中的一些动画实现;
  • ASDK 渲染大致原理;RunLoop 各个 Mode 差异;
  • SDWebImage 中关于 Download 部分的实现;

Coding 了一道算法题:找出一个数只交换两个数字的位置,求出下一个排列数。例如:

// 交换了 2 和 3 的位置
`123` -> `132`

// 交换了 1 和 5 的位置
`1359727` -> `1359772`

考虑到这种情况可能不出现,例如如果是 321 的话,就不存在这种数。

这题乍一看和 Leetcode31 Next Permutation 很像,但是多了一个只交换两个数字的限定。但是我们可以继续考虑 Next Permutation 的过程 - 从低位向高位查询,找到第一个字典序递减的数 s[i] < s[j](j 在低位,i 在高位),如果不存在则进行当前序列的逆序。如果找到这个递减数对就将其交换,当然在原题目里还会对 j 右边的数做降序排序,由于我们这边只需要将递减对进行交换,因为我们要保证只交换一次

#include <iostream>
#include <vector>

using namespace std;

int next_perm(vector<int> &num) {
    if (num.size() < 2) return 0;
    int n = num.size(), j = n - 2;
    while (j >= 0 && num[j] >= num[j + 1]) j --;
    if (j < 0) {
        // 无下一个数
        return -1;
    }
    int i = j + 1;
    while (i < n && num[i] > num[j]) i ++;
    i -- ;
    swap(num[i], num[j]);
}

// Unit Test 代码
void test(int test_number) {
    int current_num = test_number;
    vector<int> num;
    while (current_num % 10) {
        int digit = current_num % 10;
        current_num /= 10;
        num.push_back(digit);
    }
    reverse(num.begin(), num.end());
    int res = next_perm(num);
    cout << "- Test Number: " << test_number << endl;
    cout << "- Result: ";
    if (res < 0) {
        cout << "No" << endl;
    } else {
        for (auto item: num) { cout << item; }
        cout << endl;
    }
}

int main() {
    //- Test Number: 123
    //- Result: 132
    test(123);
    //- Test Number: 1359727
    //- Result: 1359772
    test(1359727);
    //- Test Number: 3214
    //- Result: 3241
    test(3214);
    //- Test Number: 2434442
    //- Result: 2444432
    test(2434442);
    return 0;
}

二面

top Created with Sketch.