壹拾肆

有些安排是多余的 这片空旷对我有益

  项目最后的交接工作,我被派到了中移动总部进行封闭开发,暂时作为 iOS 方面的项目管理和推进,就之前来说,这个礼拜我负责的内容多了一些,除了我本身的代码维护以外,对外要处理项目的交接工作,对内要分配测试人员测试出的 bug,和一些缺失内容,优化内容的推进。一个礼拜下来,有一些收获。
  之前看知乎上一个问题,是有什么是当上管理层才会想的事?虽然我还没有到那个地步,但是管理项目给我的一些体验让我觉得似乎可以把握到一些管理层的想法,比如很多时候我们觉得领导只看结果不问过程有点不可理喻,但是从另一方面来看这其实只是因为需要对接的内容太多,不问过程只看结果,可以最大程度的排除其他因素的干扰。另一个是就是个人的主观动能性,这阵子做项目管理的时候,我总是会因为分配下去的任务而收到关于很多任务的疑问,比如新增一项需求的时候,开发人员会询问关于这个功能在不同场景下需要表现成怎样,在一些无法实现的地方又应该怎样规避。在管理角度看,这些当然是合理的,但提问的时机太零碎了,容易被分散注意力,另一个是有些场景虽然没有给出标准,但其实可以横向参考其他类似的功能来实现需求,这时候提问并不是必要的,所缺乏的只是一点主动去思考,或者说是虽然想到了第一步,即会产生这个问题,但可能是某种局限导致开发人员没有往下一步怎么解决这个问题,我之前也存在过类似问题。切成开发人员角度,规避这些问题,一个是整理问题,统一解决,另一个是解决问题的方法,虽然可以思考怎么解决,但是如果解决方法最终没有通过产品的审核,那之前针对问题的解决也都白费劲,所以最好的应对方法是,发现问题,可以附上一条或两条解决方案,一并提交。我想这些经验对于以后我做个人开发或者管理都会有帮助。
  这个礼拜接触到的新技术是使用 OC/Swift 自动生成文档的轮子:

  OC 自动生成代码文档:appledoc
  swift 自动生成代码文档:jazzy

阅读全文 »

  本周买了画板,画纸和一大堆铅笔,打算就着 B 站的素描入门视频学习画画,练习了一两天线条,小臂和胳膊的肌肉持续酸痛,一个现在已经不联系的朋友之前回答我如何不费劲的练肌肉,说学画画。之前以为他是开玩笑,现在看果然如此。
  周一花了半天结束交接了上个项目,本周主要工作是封装兄弟公司的语音 SDK 到原来我们集成了腾讯,百度,讯飞,阿里语音的 SDK 中,新的语音 SDK 从逻辑可以看到封装者的思路,基本上是想把我们需要做的都做了,只暴露出实现功能需要调用的接口,虽然使用时清晰直观,但对于我需要二次分装不算友好,比如各个阶段的状态返回,开始录音结束录音,开始识别语音,和语音回馈,我只好作比较粗糙的处理,比如在调用开始录音方法时,主动调开始录音状态的回调,因为监听不到停止,但在他返回的一个枚举方法里有开始识别的状态,我就在这里放了停止录音的回调。
  虽然这个方法可以让我二次封装正常进行,但是在实际体验上,仍可以预估到可能发生的问题,比如本地音乐在播放的时候,启用录音,语音助手在播报时,播放本地音乐等等,一些场景交错下的体验问题。这让我反过来想封装一个框架,我们真正应该思考的是什么?简单便捷,还是复杂详细但面面俱到,参考官方暴露出来的框架和回想过往开发,我想这个问题应该是没有标准答案的,不同的产品有不同的需求,因为哪怕官方的框架,我也遇到过需要用 oc 运行时态的特点来替换系统方法来实现需求的问题。所以没有十全十美的框架,好的框架需要的是与时俱进,不断迭代和维护。另一方面也可以从这点上看出开源的优势。
  另外还有关于这方面的内容就是发现了一个这个仓库:iOS开发:我的初级到中级的晋级之路。里面介绍底层的相关知识很详细,还有完整的工程源码,我打算每天看一篇有关底层的文章。在掘金上看了一篇关于大佬面试的文章,里面针对三年经验的一些技术问题,有些我知其然而不知其所以然,算下看我做 iOS 开发也接近三年,但前期没太注意技术累积——虽然也有一部分是中间分心去弄安卓开发,导致现在每次提升一个方向的知识,总要从底层一步一步看上来,很麻烦,而且也因为这点导致在工作岗位上的处境也有些尴尬。
  以上。

  前段时间去看了王小帅的电影《地久天长》,还不错,但低于期待值。本以为剧情片既然有剪成三小时时长的底气,也应该用有可能输于但不输很多同样时长像《牯岭街少年杀人事件》、《美国往事》等电影的精彩,但很显然电影只具备和他们同样的长度,并没有同样的深度。

阅读全文 »

  本周工作方面的基本告一段落,但是随之而来的也是比较棘手的一个项目,需要用到蓝牙 ota 技术,由于对接公司人手的缺失,对方只提供了安卓的 SDK,iOS 这方面需要我们对照着安卓的代码转译成 OC,幸运的是之前也有学习安卓,大体的逻辑都能看的明白,但涉及到一行一行的翻译过来,就比较吃力。所以这个礼拜所做的努力简单来说,就是用水磨功夫反复看细节处的代码,等待灵机一动的时刻。好吧,我得承认这个方法,耗时费力又没有效率,但用 Stack Overflow 里提问者经常回应的一句话说:it’s worked!
  不过在反复解读的过程中也稍微掌握了一些提高效率的方法,整理如下:
  第一、遇到不懂的代码,直接谷歌。善用搜索这虽然是老生常谈的事,但是对我来说有必要强调一下,因为学习过安卓的缘故,所以让我有些思维盲区,平时解决问题的时候都会直接用搜索引擎,但这次在解读安卓源码的前期阶段我都一直没想到用搜索引擎来解读代码。所以强调善用搜索,另一方面也是提醒自己不要因为接触不擅长的事的压力而导致总是钻入某个牛角尖。
  第二、不能举一反三,就举三推一。这个方法是我通过从某个牛角尖刚钻出时的经验教训总结出来的。但我得到 ota 升级前发送第一次握手校验命令返回的消息时,我试图弄明白这些这个消息代表了什么含义,而且这个消息,和之后每次 ota 包分段发送后的返回消息有什么区别,打印之后发现第一次的长度和之后的长度都不一致,这让我很迷惑。又有兄弟公司的安卓工程师帮忙解读的文档里提到另一个透传通道,前缀说明里写很重要,影响到 ota 是否成功,然后我就思考这个通道和返回的验证消息是否有联系,在源码中搜索发现也确实用到了这个通道——这个后来发现到虽然这个通道进行了赋值和调用一次,除此之外再没有用到。但当时这些信息有点把我搞糊涂了,所以就在重复打印和对比安卓和iOS ota 的返回消息,以及希望在源码中解读出透传通道究竟起了什么作用。因为长时间没取得较好的进展,就颇有些自暴自弃的想把其他简单但不是很重要的命令先转成 oc,然后发现他 ota 线程中循环判断里的条件参数,和回调读取的值是有一定联系的,只是像 oc 把数据处理写成了一个单例形式,又用一层东西封装了一下,导致写入和读取不太像一个来源,造成了视觉盲点,但点进去就比较一目了然,虽然还有底层的东西需要用谷歌解读,但是关于处理返回验证消息就可以按着这个方法来校验了。以上就是我整个问题的思考过程,其实很多时候真正的问题也不是知识量的积累不够,而是主观上受情绪影响,思考的不太全面,所以以后这方面的问题需要多多注意。
  说点轻松的,本周《妇联4》上映,没赶首映,周日放假时去看的,看的过程中几度红眼,因为剧情本身,也因为剧情以外 22 部漫威电影所累积下的情感积淀。也是我第一次在电影院等到片尾所有字幕放完,影院的清洁人员拿着扫把畚斗进来打扫。片尾曲放在最后出现的是钢铁侠,首尾呼应,而且,又是一个情绪的爆发点。我想我平抒直叙的方式实难写出我心里所感受的十分之一,所以就此打住。
  英语这个礼拜开始复习,每天五十个,目标不是很大,早上坐车的时候就可以轻松完成。抽了一天看了下书,《信息资源管理》,最进新开课因为有事还没来得及去上。另外还有一些琐碎的思绪因为发散琐碎没来得及去记,就像云一样飘走了。
  以上。

  立个 flag,每周写一篇周记,内容包括但不限于工作和学习上的总结反思。之所以会有这个想法,一方面是对自己的拖延症和惰性有客观的认知,另一方面是希望通过每个礼拜的总结反思,可以发现一些不足的地方,希望可以通过阶段性的反思推动自己往前走,提高执行力。
  本周工作上的项目基本接近收尾,但是越到这个时候,开发过程中没有发现的问题,也都暴露了出来。我负责的音视频功能,原先作为一个用户来看,除了视频流和音频流的传输,在交互上,感觉简单的不能再简单,但是实际开发上,也发现有不少需要注意的点,比如当正在通话中,其他用户请求通话的场景;当应用处于后台,接到来电的场景等,花费时间较多的就是应用处于后台时,接到来电的 BUG,具体表现为接收到第一次电话以后,第二次就无法接收到,多次测试以后基本可以定位原因,大概是后台保活,由于项目中集成了环信的 SDK,所以当应用处于后台时也能保持活动,附带的让音视频 SDK 也不会被挂起,而是继续响应来电。至于第二次无法接收到,则是 SDK 封装的内部逻辑导致。这个问题让我对 iOS 应用退到后台机制又有了一点新的认识。
  此外,除了问题本身,在关于问题的沟通推进上,比如在对方有些明显懈怠的情况下,如何推进问题解决以达到预期效果,也有了一些心得体会,归纳起来也其实就是老生常谈的那几句话,首要的就是保持主观动能性,需要自己先去找的问题根源,再让对方跟进解决,其次是最大程度的排除其他发生问题可能性,以避免问题归因的模糊而导致问题被踢来踢去,拉长处理问题周期。
  还有一些另外因为需求修改而进行的工作因为简单和重复,概不累述。
  上周周末两天时间,去参加了四场考试,专升本的第一次试手考,除了主观放弃的经济管理学,其他感觉还行,英语相对简单,历史稍有疏忽,有几道简答题和论述题不会,就干脆的空白放在那里,没有按照考试约定俗成的规矩——乱写都要写满,前天把百词斩 App 上背四级单词的计划完成了。接下来,学校等着开新课,单词开始下一轮的复习计划,生辞旧往,刚好这个礼拜给自己一个借口可以修生养息。也刚好最近视力下降的厉害,可以不用每天那么过度用眼了。
  最近有些闲钱,又开始关注投资理财的事,发现周围许多朋友有的每年买巨额理财型的保险,有的在看理财类的书,有的没的都在为人生做长线规划。可能忧患意识是我们这代年轻人的共性,养生,理财,终身学习,最终目的也只是为了能和这个糟糕的世界刚久一点。言归正传,之前大学的时候就有投过基金,不过没挣多少,堪堪跑赢余额宝,去年了解到定投这种投资形式,试了一下,但恰好碰上去年整体经济不理想,下半年定投的基金估值指数下降,那会也犯了个新手都会犯的错误——怂,投了五六期就停了,钱就放在那里,今年稍微回升了一些就全部卖掉,没成想之后大盘会一路攀升,算算要是我之前没抛大概也能赚个四五百,有点可惜。不过也没有很可惜,毕竟现阶段对自己定位明确,学习投资为主,投资挣钱为辅。今年新学到的理财知识给我的启发是,首先明确两点,一、投资的类型,二、投资的方式。第一个问题在我心里没有争议的仍旧是基金,股票对我来说风险太大,理财型保险的回报周期太长,对我这种年轻气盛的小伙子来说也太过磨人。第二个问题经过去年的尝试,可以确定定投的方式优于一次性大量买入,又结合新学到的知识,把定期定额变成定期不定额投入,根据涨跌动态调整投资金额。其他还有需要细化的问题就是,开始定投的时间点,和买哪个基金。当然这两个我都没能得到很好地答案,毕竟这也都属于投资里的终极问题了,所以今年的额外学习目标是希望对整个市场能有更清楚的把握和认识。
  以上。

  最近感觉到开发的技术提升缓慢,意识到自己可能进入了一个不上不下的瓶颈期。虽然在公司内部也一直有技术学习小组,但切实落于自身的总好像隔靴挠痒,不能很精确发现自己的不足,和如何针对这种不足去改正。为了下一阶段的继续提升,我觉得有必要总结一下自己学习到的内容,和规划一下未来的技术提升方向。
  
  工作上主要使用的 Swift 和 OC,已经基本掌握的很熟练了,各种布局、控件和数据处理的基本使用都没问题,也可以根据这些知识基础按自己的想法实现一些捷径式的小操作。
  但是还有一些不足,比如最近很多人用的 auto layout,用着就很别扭,还不太熟练,音频,视频传输和编码的处理,没有深入了解过,还有代码的整洁度,和代码的结构,大局观比较差。OC 一阵子没用,也有些生涩的感觉,OC 和 Swift 的混编,在数据传输上的方法上还可以进一步学习一下。
  Android 方便,因为很久没使用了,水平可能还是停在给上一家开发应用,可以读懂代码,可以按产品效果图实现一个 App,但是完成度可能不太让人满意,Android 新兴的语言 Kotlin 也都一直还没接触过。
  Python 的学习很早就停下了,过了那么久,模糊的只记得一些函数表达式写法,和类型属性这些流于表面的概念性的东西。不具备独立开发的能力。
  
  以上就是我现阶段学习和使用过的语言总结,在开发的过程中,我越来越发现一个扎实基础的重要性,一言以蔽之,对底层的理解程度基本可以决定你现在所处的高度。因为之前技术的突破都是为了需求赶鸭子上架现学现卖,在过程中就容易错过很多细节,虽然在后续的开发里,自己也会不断回推梳理,但很难得到一个系统性的结论,反而是在找工作背面试题,不断过一些概念理论的时候,和自己过往开发印证,觉得收获很多。
  所以,下一阶段的第一个目标我想是重新对我所学的语言,那些基础知识复习一遍,梳理巩固一下。
  还有一个就是对 OC/Swift 多线程的理解和掌握,虽然现在对 OC 的运行时态和多线程理解和使用都没有问题,但我注意到,很多大项目,对线程管理都有一定规范性的东西穿插在整个项目里,这一点是我所不足的。有同样问题的是网络请求方面,TCP、UDP、HTTP之前也都掌握的不是很好,需要重新梳理。
  格外的目标是想把这两本书:《Effective Objective-C 2.0 编写高质量 iOS 与 OS X 代码的 52 个有效方法》、《Objective-C高级编程:iOS与OS X多线程和内存管理》,在最近的学习告一段落之后看完。
  
  除了实际的目标和计划以外,我觉得我最近对技术的态度也处在一个低谷期,可能是因为从新手期出来很久,以前敲一段代码看到效果的成就反馈对我影响很小了,也可能是技术处于一个停滞的阶段,所以对敲代码缺少以前的积极性了。所以我希望可以通过学习新的东西来重新回到之前对编程热情洋溢的阶段。
  最近看《爱,死亡和机器人》,有一集《齐马的作品》,我很喜欢,开篇就讲一个大师的艺术探索,从人物肖像,到绘画出正中心带纯蓝色几何图形的浩瀚宇宙,结尾是他探索终极,发现自己的由来是一台清洁机器人,就回归自我,变成清洁机器人。所以他终极的答案是找一件简单的事做。其实举一反三来看,编程这件事,和他的艺术探索也是一回事,高屋建瓴太遥远,那就从简单的事情开始做。

  行百里者半九十,新年过来就一头扎进工作,晕头转向直到现在,让我这才走了十里路的人看着剩下的九十里,都有了些望洋兴叹的惆怅。所以趁现在有空,休息一下,回顾一下。
  
  过年照旧仍去上山烧香拜了佛,不同的是,今年没抽到上上签,而是中上签。不过也说不清是好是坏,表哥去年抽到中下签,我和表弟抽的是上上签和上中签,但去年反倒是他订婚成了家先。因为这个今年过年在外游荡的人就剩我和表弟两了。眼看过去吃了饭就撒手啥也不管变成一个抢着洗碗做家务事的人,我和表弟某个晚上吃了夜宵在大街上忽然感慨,以后就剩我们两相依为命啦。
  
  凡事都说物是人非太不客观,就好像我表哥变了一些,而我们上山烧香拜佛,山也并非一成不变。上山变得更容易了,可以坐改装成游览车的金杯到山脚,再从山脚坐缆车到山顶。我们选择在坐缆车前走一小段路,路不是去年的那条,而是换成一条有些曲折,两边拨地而起了不少新建仿古建筑的坎坷小路,前两天下过雨,路上有些积水。一个拐角之后,迎面看到一个牌子,小吃街。穿过小街随便抬头看了各个店铺贴在门上墙上的菜单,个个都是 5A 级景区的价格,到了街尾,表弟拿着手机对着一个菜单拍了个照,说下次要和别人炫耀下我们这消费也是相当高的。
  售票大厅里的陌生人们 
  我们买了票就坐缆车上山了,点香抽签解签,一如故往。庙里的变化是,今年对香客们的香做了限制,每人都只能拿三支香拜,所以不会再出现点香的时候把香点着整把香丢掉的事,庙里也不会总是烟雾缭绕的熏人眼睛。
  
  整座庙的前半部分由两栋相连的屋子组成,中间有一个小阶梯,下去是条小巷,巷里紧紧贴着一个小卖铺,外面卖着零食小吃,里面卖的都是宗教用品,开过光的手串护身符,问了一下价格,略显粗糙的开光手串一百五,粗糙的开光手串一百,还没确定要不要图个吉利买一串就已经先生怯意,表弟说外面也就卖个二三十,我说要不然怎么说宗教是门大生意。Jesus is a big business。我在心里补充,来了个饶舌。回去的时候因为有点晚,路程又远,就和姨姨他们去了她婆婆家吃饭,吃饭的时候姨夫说让我喝点酒,整个新年的所有饭局我对喝酒都抱着一种可喝可不喝的态度,但总是看长辈各种推辞,觉得即社会又好笑。就学着印象里的神情,一半严肃一半玩笑的向姨夫摆手,摆手:“不喝不喝,待会还要开车。”姨夫冷不丁的懵了一会,随后恍然大笑,你哪开了车啊。
  
  上香的事告一段落,新年另一件事就是和以前朋友见面,往年没约上的朋友,今年照旧因为各种琐事没有约上,见上的朋友也都是往年见过面的,也算是一期一会。小插曲是,和朋友见面的时候,看见了一个很久没联系的女性朋友,当初没联系,起因是她,结果是我赌气,到现在三四年没说过几句话,也一直没见过面。许久不见,样子似乎变了一些,成熟盖过稚气,穿过人群和她对视了一眼,我看到她眼里似乎有些久别重逢的惊喜,我不知道我当时的表情是怎样的,似乎是客气又克制的点头、抿嘴示意,然后没有寒暄,就扭头走了。现在回头看,好像在她面前,我又表现得有点小家子气,一如往昔。
  
  后来和朋友们看完电影出来,又看到了她。我想既然老天爷都想让我和她冰释前嫌,那我也就不坚持了。但她又好像是报复似的,只是和我朋友寒暄了几句,等我走近,朝我点了点头就走了。
  
  再后来回去,想了想,用“看你有没有换号码”的蹩脚理由给她打了个电话,聊了很久,总算是奠定了中美关系走向正常化的基础。
  
  除了这些以外,有印象的还有,叔叔表哥说要给我介绍女朋友,一个拿着对方姐姐的照片说让我先看看,另一个在 KTV 的时候直接让我和他旁边的女孩视频了,放着我在这头,不管不顾的和那人对起话来,看看我这侄子帅吧。感觉有点胖。胖啊,不会,他就这个脸型。除了觉得颇有喜感,也被我两个亲人过于耿直的方式给唬得无可奈何。叔叔今年倒是没有给我上中国传统美德普及课了,不过去外公家时,今年瘦了两大圈的姐夫在晚饭后和我们这些年轻人上心灵鸡汤课,一脸朝气逢勃的和我们说自己老了,让我们努力,说年轻人不要怕失败,年轻人最不应该害怕的就是失败。我在心里想,年轻人不怕失败固然是可以轻易做到的,不过是一头热血,不管不顾找个方向往前使劲罢了。但失败的后果,却往往需要年轻人的家人一起承担,这样的后果,一个年轻人最多可以承受几次呢?
  
  忽然想不到说什么结尾了,觉得这段比较应景。

  那一天我二十一岁,在我一生的黄金时代。我有好多奢望。我想爱,想吃,还想在一瞬间变成天上半明半暗的云。后来我才知道,生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消失,最后变得像挨了锤的牛一样。可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了我。

阅读全文 »

  问朋友今年用什么字总结,他说,一。意思大概是一年都在原地踏步,年头年尾的状态没什么区别。我没有回他。

阅读全文 »