作为一名还在靠技术吃饭的程序员,最关心的当然还是每年技术的成长。17 年写的文章并不多,我数了下大概在十篇左右。大概是有三方面的原因:
- 杂事较多:毕业,各种论文、旅游、游戏占用了相当多的时间。
- 开通了自己的 小专栏 和 知识星球,有些比较短的心得总结就没有分享出来。
- 很欣喜的看到自己文章更有深度、更有质量了。学了很多,写的比较少,不再把一些不成熟、不成体系、没有创新的文章发出来。
17 年学习的 iOS 相对比较少了。一方面很多基础知识已经掌握了,对于新的框架只要简单知道个原理就行了,不用再扣细节。主要是对自动化测试和 iOS 工程化有了简单的了解。
最大的收获莫过于整理出来了自己的脚本库:macbootstrap,主要用于配置新电脑的开发环境。会自定义系统的一些配置,安装 Homebrew 以及常用的包并同步配置,整理并汇总了以前常用的 Zsh 脚本(还在持续开发中),添加了 Git 的 alias 与用法,配置好了 Vim 的插件。
这个库不仅仅是脚本的整理,也像是一份教程和备忘录,在忘记的时候可以速查。有新的功能时,我都会在我的微博话题 发布,欢迎关注。
翻墙和代理是每个程序员必备的技能,我也花了相当长的时间,算是整理出了一份最佳实践吧:全自动科学上网方案分享。
这里最核心的概念就是可配置,比如它可以做到:
- 电脑访问不同的网页时采用不同的策略,比如 google.com 会翻墙而 baidu.com 则是直连。这样可以加快速度并节省 ss 流量。
- 电脑上不同 app 可以采用不同的策略,比如 微信 直连 而 Telegram 则是翻墙,好处同上。
- 手机也可以根据不同的网页采用不同的策略,除了 可以配置为翻墙和直连外,还可以在请求特点地址(比如公司的内网)时自动代理到电脑的 Charles 上,做到翻墙、直连、调试三不误。
- 上述配置可以汇总为一个策略,在不同场景(比如 公司 WiFi、家庭 WiFi、4G)下自动选择不同策略,因为回到家以后就没有必要再连 Charles 代理了。
其实毕设就写了基于 Appium 的自动化测试系统,在公司也把一个小项目给落地了,对整个自动化测试的原理和实践有了更深的理解。但由于人力的问题没能把项目做大做完美,留了一个很小的遗憾。现有的、基于图像比较的自动化测试系统基本可以处理绝大多数情况,但由于操作精度的问题,并不适合极度复杂的场景。另外由于视频画面是动态变化的,也不太适合此类测试。
总的来说,自动化测试的方向有三个:提高工具稳定性、提高操作精度、降低 Case 维护成本。自动化测试是属于锦上添花的那种工具,希望在新的团队里有机会能够落实并推广吧。
文章整理在这里:Appium 从入门到原理,欢迎交流。
今年对网络层的研究比较多,因为我们做广告的,主要还是侧重于和后端的数据传输,至于客户端的绘制,一般倒不会太难。
由于去年准备春招的时候已经把 TCP/IP 看的差不多了,今年基于 TCP/IP 拓展了不少知识。
比如 试图取代 TCP 的 QUIC 协议到底是什么 这篇文章看起来是写 QUIC 协议,但其实新协议的出现一定是要解决现有问题的。所以如果不对 TCP 协议有比较深刻的理解,是无法读懂这篇文章的。
此外还把 HTTPS 的相关问题整理出了一篇文章:九个问题从入门到熟悉HTTPS。
在工作过程中,经常会与 HTTP 规范打交道,由于通过互联网只能传输由 0、1 组成的二进制数据,所以难免要和各种编码方式打交道,比如 JSON、URLEncode 和 Base64 等,对于他们的输入内容、输出内容、使用场景和鉴别方式应该有最基本的了解,于是写了一篇总结:小谈 HTTP 中的编码。
除了上述理论整理外,在追查性能问题时还使用了 WireShark 这一复杂但是功能强大的工具。想当初还是在计算机网络科上用它来具体分析各层协议的细节,再次使用它时又对 IP/DNS/TCP/HTTP 等协议有了更深入的理解。通过分析具体的流量和表现,与那些曾经只是停留于纸上的概念能够吻合时,收获是非常巨大的。因此也写了一篇 利用 WireShark 深入调试网络请求 作为总结。
年初的时候把 Cocoapods 的工作原理简单的整理了一下,对 Xcode 工程配置有了更深一些的理解。后来又承担了团队内部 CI 的优化工作,中间不可避免的用 Ruby 写了一些脚本,主要借助 Xcodeproj 这个库,对项目做一些编译时的改造。总结了一篇 细聊 Cocoapods 与 Xcode 工程配置。
年初的时候学习了一些 JS,主要是对 JS 中的模块化有了一些原理上的认识,总结了一篇博客:JavaScript 模块化简析。个人对这种学习方式是相当满意的,因为不仅仅是阅读别人的博客,而是自己从零开始去感受 JS 的语法,找到问题的所在(JS 原生没有 import/include 这类机制),并且对 CMD/AMD 这类规范的实现原理有了一些了解。对于我来说,这些规范的名字和特性并不重要(反正也不写),但了解它们解决了什么问题、如何解决的,则非常有意义。
因为对 Promise、Async/Await 比较感兴趣,后来也自行学习过一些。深入思考了导致回调地狱的原因,查阅了 Promise 的实现源码,并思考了 Async 的实现原理,总结了一篇博客:异步与回调的设计哲学。虽然自己尝试写 Demo 失败了,但至少知道是基于协程来做的,后来在学 Python 的时候也印证了这一点。想尝试在 OC 里面造一个轮子,但碍于时间的限制,也一直没有动工。唯一的遗憾是没有想清楚在 Promise 和 Async 中,处理异常的思路,先在写代码还在瞎猜。
后来利用业余时间,用 Vue 把公司一个小的配置管理平台重写了,UI 更加美观会吸引更多的用户。这个过程其实没啥说道的,无非就是选择脚手架、选择 IDE、选择 UI 框架、开始撸码。后来因为时间问题,只产出了第一版,一个勉强能用的模型,就被拉去做业务需求了。不过一整套流程下来,对前端开发还是有了初步的认识,其实做一个中后台的页面还是比较简单的。
期间遇到了各种问题,也基本上通过查资料和 XJB 乱改,自行解决了。不过对于 Vue/React 里面的组件以及 Redux 库有了基本的了解和使用经验,但纯理论的理解还不够深入,希望新的一年里把这一层面的内容再补一补。自己还使用过 Webpack 的插件来完成一些特定的需求,然而现在又出了 Parcel,连 Webpack 都升级了。。。真的是三个月不看前端,技术就被淘汰了。
除了前端和 JS 领域的学习,对一些更加基础的知识也略有研究。比如了解了一点设计模式(我眼中的工厂模式),了解了一些基本术语(指针和引用的区别),基本上搞定了 Python 的编码问题(字符串编码入门科普)。
在准备毕设期间,我写了一篇非常长的文章,比较全面的介绍了语言的编译原理:大前端开发者需要了解的基础编译原理和语言知识,在查阅资料和写作的过程中收获非常大。
趁着七月份刚入职的功夫,还深入系统的学习了 Python,读完了一本非常棒的数:《流畅的 Python》,把书中很多例子都自己写了一遍,印象比较深刻,后来也整理出了一篇 55K 字的文章:Python 入门指北。
因为涉及到公司业务,也没啥能详细说的说的,总的来说就是继续踩了很多广告方面的坑。做了一些样式和性能方面的优化。
年初的时候做过一些安卓方面的开发,收获颇丰,有技术方面的积累也有业务上的思考。原本计划年底学习一下贴吧的安卓代码,没想到后来去做了手百,年底又做了好看,年后干脆都离职了。。。真是计划赶不上变化啊。
平时也会督促自己多听一听别的团队的分享,对不少广告术语有了更多的认识,但暂时也感觉不到什么作用。
比较有意思的一个技术项目是做 UI 的动态化展示,接触到了 FlexBox 布局模型。因为写过一些 demo,所以对里面的字段勉强说得上熟悉吧,然后自己又删掉了一些客户端不常用的字段,加上了一些和业务相关的字段,最终的效果是像乐高积木一样,通过端上定义元控件样式 + 服务端下发组合方案,实现了布局的动态化,算是一个轻量级的 RN 吧(没有业务逻辑)。
还做过一个 Feed 预加载的优化项目,因为落地页都是广告主页面,所以相当比例的网页是动态改变的,并不适合预加载。于是又设计了一套极为复杂的监控系统,用来识别哪些网页可以预加载,哪些不可以。。。
年底的时候开始做好看视频,被视频的开发和打点统计折磨得痛不欲生,后来和竞品团队交流了一下,发现大家都非常痛苦。
由于工作需要,也写过一段时间 SQL 语句,各种 join 了解过一点吧,但再深入的知识就接触不到了。个人的计划是先用两三年的时间把大前端融会贯通,再向后端发展。
回望我在 2016 年总结 中给自己提出的几个小目标,其实完成的不算很理想。
- 业务:曾计划 17 年深入的了解一下广告业务。回过头来看,知道的肯定是更多了,但是距离预期还有些差距。不过广告业务确实是极为复杂,也不是一两年能完全搞明白的。这一块给自己打 60 分,及格吧。
- 阅读:16 年的计划是阅读 《七周七并发模型》和 《改善 Python 程序的 91 个建议》,前面一本书读了好几遍,无奈并不能读懂,只能放弃。后者没有读,但是读了更好的 《流畅的 Python》。因为只写了一段时间安卓,所以 Java 的学习笔记少,《Java 编程思想》 几乎没读几页,《深入理解 Java 虚拟机》倒是基本上读完了。因为回学校准备毕设期间时间相当充沛,不仅读完了 《Unix 编程艺术》 和 《编译系统透视》这两本非常大部头的数,还读了一半《领域特定语言》,可惜没有机会实践。总的来说因为时间充沛,所以对自己的读书成果还是相当满意的,给自己打 120 分吧。做得好就是应该表扬!
- 技术:继续维护了用 Python 开发的网络中间人平台,并且深入的学习了 Python。虽然没有机会再写 Java,但积累了一些前端的开发经验,所以基本上算是完成了任务吧,可以给自己打 95 分。
17 年的行动基本上完成了 16 年的计划,有超额完成的,也有不足的。安卓没有机会去写了,但收获了前端开发技能。总的来说对自己是基本满意的。
新的一年,我又给自己订了几个小目标:
- 业务:对 iOS 平台的一到两个点进行深入研究,比如组件化与热修复。不仅要懂原理,更要把事情落地,做出成绩来。
- 阅读:今年打算读一些偏向原理类的书,而不再是具体的技术。比如《重构,改善既有代码的设计》和《代码简洁之道》(英文名叫 Clean Code,注意不是 Coder)。
- 技术:接触到更多的前端和后端开发。前端开发方面,不仅仅满足于页面的实现,要对 Webpack、单向数据流、UI 组件、JS 语法有更深入的理解。如果有机会做一些后端方面的开发的话,先了解语法和框架就可以了。