Wen Wu's notes

technical record


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

如何寻找一份适合你的职业

发表于 2020-02-29 更新于 2020-04-05 分类于 阅读 阅读次数: 评论数:

一篇有深度的好文How to Pick a Career,大约需要6小时读完。
作者Tim Urban以写长博客著称,讲话很幽默,这里有一个他在TED的关于拖延症的讲座,可以一睹他的真容,挺接地气的一个小伙。

先甩个锅

先声明的是这篇文章只算是一个路标,我们是路人,到底要不要按照路标去走,纯粹是个人的事情。

这个是混沌大学李善友老师用来给自己甩锅的一句话,哈哈。
李老师总是想给别人一些指导,压力巨大,怕给人指错了,后来他就用这个路标和路人的关系给自己甩锅。

做自己人生的CEO,为自己负责

我们生下来后就象是弱弱的小蝌蚪被放在既定好的河流上漂流(见下图),这个河流我们是没办法选的(就是说投胎投到哪儿没办法选),这个时候有父母师长管理我们的成长,做我们的CEO;但是到大学一毕业,我们两眼抹黑,啥也不会(skill-less and knowledge-less and a lot of other things-less),突然间要做我们自己人生的CEO,真的很难。这篇文章介绍了一个寻找真我(your real self),寻找适合自己工作的一个方法论(framework)。

  • 我们中的有些人会发现自己是一只可爱的小狗,它最想做的事儿就是取悦它的主人,不能忍受主人对它的失望,很悲惨的是这个主人往往不是它自己,是那些心理上比你强大的人,如果你不小心,你几十年的的职业生涯只是去取悦他们使他们骄傲。这个他们很可能是你的父母。
  • 作者回顾了一下自己的经历,觉得最让他烦恼的是:其他人掌控你的思想,压制了真实的你的声音。
    “未来我的目标不是不犯错误,而是只犯我自己犯的错误”。


人的一生中真正做有意义事情的时间真的很少,所以请认真选择自己的工作

工作大致上可以比作两类:大厨(Chef)和厨子(cook)

  • 大厨的思维:用各种食材、经历各种尝试,弄出一盘菜。

    大厨要付出非常多的时间和精力,就像是带着眼罩,在一个诡异的森林里寻找出路,要经历非常多的失败、尝试。
    做大厨大多数情况下非常耗时间,所以机会成本也高。

  • 厨子的思维:照着大厨给的配方直接炒菜就好了,比较轻松,不用动太多脑子。适合不把工作当回事儿的人。

人的一生总共750000小时(=750000/24/365=85.6年,可能是美国人的平均寿命),那么这么多万个小时都是怎么度过的呢?

  • 童年+青春期有 175000小时(=175000/24/365=20年)
  • 吃喝玩乐+睡觉 325000小时(37年)
  • 还剩下250000个小时(28.5年)是可以去做有意义的事情,其中20%~60%用在工作上,约50000到150000个小时,就是6年到17年的时间。

    而你的工作时间又会极大的影响你的生活,你的影响力,你对自己的身份认同,所以一定要慎重选择自己的工作,别到老了才后悔(象苏大强那样儿)。

    苏大强有个账本,记录了三个娃每个人从小到大的花销,在妻子去世后,他就靠这个账本跟孩子们要钱过活,过的相当滋润。

那么如何选择一份职业呢?

先看这个文尼图,用Want Box来记录你能想到的你想做的所有职业,用Reality Box来记录那些根据你潜力你应该能从事的职业,那么这两个Box的交集就是你要的职业,你要努力的方向。中间交集的地方每个点代表一份职业,这些个点还带个小箭头,如果你从事的很多份职业的方向是大致一致的,那么你就不得了,越积累越厉害。

先来看下如何填 Want Box

这个章鱼图,从5个纬度来把职业做了大致分类,你可以根据你自己的爱好,把你自己想做的职业分布到这几个维度里。

  • Personal: 自我实现型

    职业是为了自我实现,彰显个性,体现自我。那些很成功,但是不开心的人,往往会认为自己的成功是错误的。
    很多人迫于生计或是其他原因从事的是其他几个类型的职业,过了很多年才发现不是自己所要的。

  • Social: 社会型

    这类职业是比较有社会地位那种:医生,律师,公务员。
    这种职业是我们最基本的,动物性一面的体现,可以追溯到我们祖先的部落生活,在部落里要想生存,就得合群,相互照应,最好能有权力,掌握资源,给自己多分几口肉吃。

  • Moral: 道德型

    比如你一想到很多非洲儿童食不果腹,衣不蔽体,你就吃不下饭,你觉得自己是个好人,应该做点啥。
    这类职业比如很多NGO组织,临终关怀组织等等。

  • Practical: 实在型

    工作就是为了买房买车,为了赡养家人,无他。

  • Lifestyle: 安逸型

    就是希望压力能少点,能有足够的自由时间可以让自己去吃喝玩乐。
    但这又很矛盾,你当下轻松了,可能长远的看并不轻松,只是把问题留到了将来。

可能你想做的工作不是在一个种类里,那也正常,证明你有多面性,而且可能不同年龄段想做的职业也不一样。

下一步就是分析下到底哪些是真实的你想做的事情

你想做某个职业的想法,可能是其他人安插到你大脑里的(可能是父母,或是你看的某本书里的一个英雄)。这个一定要分析得透彻,非常重要,甚至你自己都挖不出来真实的你在想什么,可能被打压的过分,隐藏的太深了。


确定好你要做的职业后,就按照优先级排下序。

作者用一个书架来比喻,在书架上面放了一个碗,这里面装的是最高优先级的,书架里三个格子,从上到下优先级逐级降低,旁边是个垃圾桶。

  • NN Bowl:这块是你认为最重要的,你愿意投入足够的时间、牺牲掉所有其它欲望去做的职业。这个碗很小,你最好只放一个东西在里面。

    世界上很多牛人在某一方面做到最强,都是在内心中的NN bowl非常强烈,当然代价也很大,要牺牲的可能是朋友家人关系,甚至是自己的健康。

再来看下Reality Box

你要根据你了解的世界和你的潜力做一个评估,评估根据你的潜力去实现在某个职业中的成功所需要的难度。

  • 潜力就是如果你有足够的时间,你在该职业内能做到足够好达到职业或行业内的成功吗?
    下图中A代表你目前所处的位置,星表示成功点,他们之间的距离就是实现成功的难度。
  • 要注意的是“星”并不单纯指的是技术修炼到最好,指的是在整个行业内玩的好。
    — 比如你想做个好莱坞影星,并不是说你的演技跟摩根弗里曼一样好就行的,你需要有机会去有权力的人那里去表现获得赏识,你需要谦逊和有足够的耐力一直坚持等等,才能有可能成为一线影星。

    如果你是个学计算机的学生,你的梦想是成为google公司的一个软件工程师,那难度可能不大。

    如果你想弄个新google出来,那难度可能就非常大了

那么如何计算你达到“星”的机会呢,请看下面这个公式
Progress = Pace x Persistence.
机会 = 步长 * 坚持

步长

  • 你做为大厨思维有多少决定了你进步有多快

    工作就像个复杂的游戏,基本上每个人开头都很难,而大厨可以根据下图所示迅速进展。

  • 你的工作精神

    一周工作60小时,一年工作50周的人要比一周工作20小时,一年工作40周的人进展快。
    选择工作生活平衡的人,要比一根筋儿的工作狂(workaholic)进展慢。
    经常中断工作做白日梦或玩手机的人要比能集中精力工作的人进展慢。

  • 你的天赋

    在职业相关的领域有天赋的,进展更快。
    比如你的职业是社会型的,那如果自己在人际关系处理上有天赋,对建立深入的社会关系有心得,那就做起来得心应手。

坚持

工作时马拉松,不是短跑。不只是几年的投入,可能要几十年。

那么接下来就开始填写你的Reality Box吧,总结起来是5个方面:

1) 尽力去了解整个职业的全貌,比如之前的例子,相当好莱坞影星,不仅仅是要演技好,还有其他方面要补,比如要认识哪些大佬,自己平时是不是要穿的拉风点。
2) 职业平台有多大?规则有哪些?
3) 评估你目前所处的位置,你掌握的技能,跟该职业是否有关系?
4) 你要做到在该职业内的成功是什么样儿?
5)评估你的步长。根据你现在的能力,你预计能跑多快。

你想去google当工程师,那你是不是先花4年读个计算机学位?还是你觉得自学要比去学校更快?
6)你愿意投入多少时间在这份职业上,是三年五年,还是10年

经过一番深入分析,你的optional pool里应该有了新的小圆点。

有些自我感觉良好的人可能经过这么一轮分析,觉得自己跌落神坛了,但是没关系,这轮分析至少可以让你对自己的职业选择做个聚焦。

那么接下来,你该在你的optional pool里选一个职业了,这个确实很难决定。
你可能会认为职业是需要40年的坚持的,直到退休,如下图。不过这个只是个传统的想法。

  • 根据调查,现在的年轻人从事一份职业的平均时间是3年,年长一点的人的这个时间平均是10.4年。
  • 如果你一定要这样看的话,你可能会有身份危机,不知道自己现在以及几十年后变成什么样子。
  • 而且你可能不敢去换工作,即使是你的内心真的想这么做。

你应该把你的职业想象成一些列连起来的点

  • 这些个点就象是在做科学实验,一步步逼近你要的东西。

关于坚持,不得不注意下,如果在一个错误的职业上坚持意义也不大,如果过早的退出一份职业也不是好事儿。

  • 下图中最左端穿水泥鞋子的人,不敢换工作,在一个错误的职业得过且过。
  • 最右端鞋子长羽毛的人换职业又太快。

据心理学家研究,人之将死的时候一般都会对自己的惰性有点遗憾“我希望我能早点退出”,“不要作自己不喜欢的工作”

最后你应该是如下图的一个状态,随着你认知的不断升级,你可能会不断发现自己喜欢的职业,并不断优化自己,直到达到自己心目中的成功。

人类群星闪耀时

发表于 2020-02-19 更新于 2020-02-26 分类于 阅读 阅读次数: 评论数:

1815年,拿破仑与威灵顿的军队在滑铁卢恶战几小时,已经到了关键时刻,被拿破仑命令追杀普鲁士部队的格鲁希元帅墨守成规,否决了副手热拉尔力求尽快支援拿破仑的请求,特鲁西决定继续被动等拿破仑的通知,最后导致拿破仑惨败。他不知道这一秒的决定彻底改变了拿破仑的命运,改变了人类历史。

  • 那关键的一秒就这样进行了可怕的报复。在尘世的生活中,这样的一瞬间时很少降临的。当它无意之中降临到一个人身上时,他却不知掉如何利用它。在命运降临的伟大瞬间,市民的一切美德—小心、顺从、勤勉、谨慎、都无济于事,它始终只对天才人物提出要求,并且将他造就成不朽的形象。命运鄙视地把畏首畏尾的人拒之门外。命运—这世上的另一位神灵,只愿意用热烈的双臂把勇敢者高高举起,送上英雄们的天堂。

  • 有时候—这是世界历史上最令人惊奇的时刻—命运之线会在某个瞬间掌握在一个窝囊废手中。英雄们的世界游戏象一阵风暴似的也把那些平庸之辈卷了进来。但是当重任突然降临到它们身上时,它们与其说感到庆幸,毋宁说感到害怕。他们几乎都是哆哆嗦嗦地把跑过来的命运又重新从手中放开。

《你当像鸟飞向你的山》

发表于 2020-02-11 更新于 2020-02-12 分类于 阅读 阅读次数: 评论数:

英文书名是《Educated》,翻译成中文后的书名搞的好复杂,看得出译者在非常努力的想表达这本书的内涵。
塔拉•韦斯特弗出生在美国爱达荷州山区的一个农民家庭,这本书是她的自传,记录了自己从一个乡村小姑娘成长为剑桥博士的心路历程。
作者

书中出场的所有重要角色主要为她的家庭成员,塔拉兄妹共8人:6个哥哥,1个姐姐。对整个家庭影响最大的就是父亲和哥哥肖恩。父亲独断专横,哥哥家暴,习惯性的殴打妹妹们,给小塔拉造成了极大的不安,塔拉在外出求学初期,几乎无法信任别人,过了很长时间才知道接受别人的帮助是正确的,之后她的人生就开挂了。塔拉最终通过教育重塑了自己,远离了家庭。在与家庭割裂的过程中,塔拉的心灵多次受到重创,深患抑郁症。她最终成为剑桥博士,而这个时候她已经完全回不去山区的老家了。
塔拉在自我觉醒的那刻写了这么段话来表明自己家庭的原罪:我已察觉出我们是如何被别人给予我们的传统塑造,而这个传统我们有意无意的忽略了。

Nimble Advertising Start time计算

发表于 2020-01-30 更新于 2020-02-05 分类于 Nimble 阅读次数: 评论数:

参考文献:

  1. Nordic API docs
  2. rtt+nimble揭秘系列——phy
  3. nRF52832 Datasheet

在start advertising的时候,从Host角度看非常的简单,只是通过如下API送几个参数给Controller,然后等着event回来做相应的处理就好了,而Controller则要考虑很多细节来找到比较合适的真正的开始发送Adv data的时间,本文介绍下Nimble计算这个时间的一个流程。

1
2
3
4
5
int
ble_gap_adv_start(uint8_t own_addr_type, const ble_addr_t *direct_addr,
int32_t duration_ms,
const struct ble_gap_adv_params *adv_params,
ble_gap_event_fn *cb, void *cb_arg)

以下图为参考,总结下Nimbble controller处理adv start time的几个步骤:
StartAdvTime

图中横轴为时间,每个小格子为一个tick,30.5us。为了便于理解,假定Controller在收到Host的请求,执行到函数ble_ll_adv_sm_start() 开始计算Adv的start time时,tick刚好为100,后续的各个关键步骤以及相关的时间点如下:

  1. 依照Spec,一般会在Adv开始点加一个随机的AdvDelay(小于10ms)以避免adv event与Scan window 完美错开,导致对方怎么扫都扫不到。图中假定这个AdvDelay是15个tick,也就是adv_pdu_start_time 是115。
  2. 启动Radio开始发送数据,需要考虑Radio的settling time,以及为Radio准备要发送的数据耗费的时间,所以要想在115时把数据真正的发送出去,就要提前开始行动,这个提前开始行动的时间在nimble中定义如下:

    1
    2
    3
    4
    5
    6
    /*
    * This is the offset from the start of the scheduled item until the actual
    * tx/rx should occur, in ticks. We also "round up" to the nearest tick.
    */
    g_ble_ll_sched_offset_ticks =
    (uint8_t) os_cputime_usecs_to_ticks(XCVR_TX_SCHED_DELAY_USECS + 30);
  3. g_ble_ll_sched_offset_ticks,在不同的chip上是不同的,

    • nRF51是 370us ,其中140us为Radio的settling time,230us为给Radio准备数据的时间。
    • nRF52系列是 193us ,其中40us为Radio的settling time,153为给Radio准备数据的时间。
      所以对于nRF51来说,这个offset ticks为 (370+30)/30.5 = 13 tick 。115提前13个tick,start_time就是102。
  4. 接着将这个预期的的start_time通过函数

    1
    ble_ll_sched_adv_new()

    送给scheduler去确定是否能在这个时间点正式开始。假如很幸运,这个adv的sched没有跟已有的sched overlap,那就直接到到第#6步。

  5. 如果第#4步中有发现该sched跟其他的sched有overlap,那这个start time就只能由Scheduler来找个合适的位置了,假定找到的位置是122。
  6. 在122正式开始发送数据,由#2知,真正能开始发送数据的时间时g_ble_ll_sched_offset_ticks后,即13个tick后,也就是135才是Radio真正开始发送PDU的时候。
  7. 而要在135发送数据,就要提前140us(nRF51) 就把Radio开启,以保证在135时Radio能正常工作。这个工作主要是在如下这个函数执行。
    1
    ble_phy_set_start_time(uint32_t cputime, uint8_t rem_usecs)
  • 函数使用RTC0和TIMER0两个定时器来定时完成,TIMER0时由1M clock驱动,精准度为1us。如下这段函数将精准表示Radio开启时间点(绿色旗帜),先用RTC0来定位到蓝色旗帜时间点最近的tick(cputime),之后用TIMER0来定位从这个tick开始再过多少个us到达蓝色旗帜的位置,要启动Radio。

    1
    2
    3
    4
    5
    6
    7
    if (rem_usecs <= 18) {
    cputime -= 5;
    rem_usecs += 12;
    } else {
    cputime -= 4;
    rem_usecs -= 18;
    }
  • 后面这段是设定好RTC0 和TIMER0后再启动RTC0 和 TIMER0。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    next_cc = cputime & 0xffffff;
    cur_cc = NRF_RTC0->CC[0];
    cntr = NRF_RTC0->COUNTER;

    delta = (cur_cc - cntr) & 0xffffff;
    if ((delta <= 3) && (delta != 0)) {
    return -1;
    }
    delta = (next_cc - cntr) & 0xffffff;
    if ((delta & 0x800000) || (delta < 3)) {
    return -1;
    }

    /* Clear and set TIMER0 to fire off at proper time */
    NRF_TIMER0->TASKS_CLEAR = 1;
    NRF_TIMER0->CC[0] = rem_usecs;
    NRF_TIMER0->EVENTS_COMPARE[0] = 0;

    /* Set RTC compare to start TIMER0 */
    NRF_RTC0->EVENTS_COMPARE[0] = 0;
    NRF_RTC0->CC[0] = next_cc;
    NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk;

    /* Enable PPI */
    NRF_PPI->CHENSET = PPI_CHEN_CH31_Msk;
  • 对于Nordic的系列chip,PPI(Programmable peripheral interconnect)得一定了解下,具体可参考Nordic的Datasheet。PPI是一种不通过CPU就可以让Periphral之间相互通信的一套机制,由一个16M的clock来驱动,如下图,可以通过config,将PPI的Channel m的EEP(Event End Point)和另外一个Channel n的TEP(Task End Point)建立联系,这样Channel m就与Channel n建立联系了。

    对于上面一段code segment,RTC0,TIMER0及RADIO之间的关系是通过下面这段内置的config来建立的。 NRF_PPI->CHENSET = PPI_CHEN_CH31_Msk 将Channel 31 enable,所以RTC0在COMPARE_EVENT[0]被trigger的时候就启动TIMER0,而TIMER0的COMPARE_EVENT[0]被trigger的时候,RADIO的TX就Enable了。

nimble Link layer 状态机

发表于 2020-01-28 分类于 Bluetooth 阅读次数: 评论数:

Link Layer总共有7个状态,这7个状态串起了整个Link layer的运作。

1
2
3
4
5
6
7
#define BLE_LL_STATE_STANDBY        (0)
#define BLE_LL_STATE_ADV (1)
#define BLE_LL_STATE_SCANNING (2)
#define BLE_LL_STATE_INITIATING (3)
#define BLE_LL_STATE_CONNECTION (4)
#define BLE_LL_STATE_DTM (5)
#define BLE_LL_STATE_SYNC (6)
stateDiagram
    [*] --> STANDBY : reset
    STANDBY --> ADV
    STANDBY --> SCANNING
    STANDBY --> SYNC
    ADV --> STANDBY
    ADV --> SYNC
    ADV --> CONNECTION
    SCANNING --> STANDBY
    SCANNING --> INITIATING
    SCANNING --> SYNC
    INITIATING --> CONNECTION
    INITIATING --> STANDBY
    CONNECTION --> STANDBY
    CONNECTION --> DTM
    CONNECTION --> SYNC
    DTM --> STANDBY
    SYNC --> STANDBY

VC code 常用快捷键

发表于 2020-01-27 分类于 MAC 阅读次数: 评论数:
  1. 进入函数 fn + F12
  2. 回到前一个光标点 control + -
  3. 查看函数引用 fn + shift + F12, 每多按一次这个组合就跳转一次到引用该函数的地方

nimble advertising

发表于 2020-01-12 更新于 2020-01-19 分类于 Nimble 阅读次数: 评论数:

今天顺利将美人鱼(Mermaid)插件装上,整理一张时序图:

sequenceDiagram
NPL->>HCI:BLE_HCI_OCF_LE_SET_ADV_ENABLE
HCI->>HCI:ble_ll_hci_cmd_proc()
HCI->>ADV: ble_ll_hci_adv_set_enable()
note over ADV: ble_ll_adv_sm_start()
ADV->>Scheduler: ble_ll_sched_adv_new()
Scheduler->>Scheduler: ble_ll_sched_run()
note over Scheduler: ble_ll_sched_execute_item()
Scheduler->>ADV: ble_ll_adv_tx_start_cb()
ADV->>PHY: ble_phy_tx()
PHY->>ADV: ble_ll_adv_tx_done()
ADV->>NPL: adv_txdone_ev
NPL->>ADV: ble_ll_adv_event_done()
note over ADV: ble_ll_adv_done()
note over ADV: ble_ll_adv_reschedule_event()
ADV-->>Scheduler: ble_ll_sched_adv_reschedule()
RADIO->>PHY: RADIO_IRQn
note over PHY: ble_phy_isr()
note over PHY: ble_phy_rx_start_isr()
PHY->>ADV: ble_ll_adv_rx_isr_start()
note over PHY: ble_phy_rx_end_isr()
PHY->>ADV: ble_ll_adv_rx_isr_end()
note over ADV: ble_ll_adv_rx_req()
ADV->>PHY:ble_phy_tx(ble_ll_adv_scan_rsp_legacy_pdu_make)
NPL->>LL: ble_ll_event_rx_pkt()
LL->>LL: ble_ll_rx_pkt_in()
LL->>ADV: ble_ll_adv_rx_pkt_in()
note over ADV: ble_ll_adv_conn_req_rxd()
ADV->>CONN: ble_ll_conn_slave_start()
note over ADV: ble_ll_adv_sm_stop()
note over CONN: ble_ll_conn_created()
CONN->>Scheduler:ble_ll_sched_slave_new()
note over CONN: ble_ll_conn_next_event()

为什么要用FPGA

发表于 2020-01-11 阅读次数: 评论数:

为什么要用FPGA,Link

将本地文件夹push到github

发表于 2020-01-09 分类于 GIT 阅读次数: 评论数:
  1. 进入文件夹,git init 把这个目录变成git可以管理的仓库

    1
    git init
  2. 把文件添加到版本库中,使用命令 git add . 添加到暂存区里面去,不要忘记后面的小数点“.”,意为添加文件夹下的所有文件

    1
    git add .
  3. 用命令 git commit告诉Git,把文件提交到仓库。引号内为提交说明

    1
    git commit -m 'first version'
  4. 关联到远程库

    1
    git remote add origin https://github.com/reponame.git
  5. 把本地库的内容推送到远程,使用 git push命令,实际上是把当前分支master推送到远程。执行此命令后会要求输入用户名、密码,验证通过后即开始上传。

    1
    git push -u origin master

舞曲

发表于 2020-01-06 更新于 2020-03-31 分类于 Dance 阅读次数: 评论数:

几段喜欢的音乐,如有侵权,请随时通知。

  1. 《邦邦舞》

    “哦嘛哩嘛嘞,邦邦”
    简单欢快,不知道是哪个国家舞蹈。

  2. 《奔腾》

    快板、慢板、快板三段,中间慢板最美,柔中带刚,刚中带柔,有一种飘来飘去的感觉。
    一直没搞清楚奔腾的到底是骏马?还是套马的汉子?

  3. 《Merengue》

    也算是一个拉丁舞种。

  4. 《出走》

    改编自腾格尔的歌曲,刘福洋和万玛尖措表演,表达两兄弟来开草原时恋恋不舍的内心。

  5. 《Santa maria》

    探戈。

作为一个节奏控,跑步必须有鼓点,要不就跑不起来。下面几个蒙古神曲,伴我每天跑过5km

  1. 《希格希日》

    先来个慢走,7km/h

  2. 《丝路的随想》

    非常热闹,就是歌曲名有点土气。

  3. 《吆呼儿》

    之前看节目的时候听到过一次,一直不知道名字,终于找到了,刚好搭配11km/h

1…456…10

Wen Wu

I'm a bluetooth Host and Controller developer
95 日志
25 分类
46 标签
© 2025 Wen Wu
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v7.2.0