Yanxi.me 热爱互联网和技术,喜欢探索的终身学习者

从2000年接触互联网开始,一直在做互联网相关的技术开发工作。在这里把目前工作中(凤凰金融)主要用到的技术收集到一起。链接地址大多都是指向国外的英文网站,有一些还需要翻墙才能看到。这些都不应该是问题,因为阅读英文技术文章和懂得翻墙应该是从事互联网技术开发人员的两项必备技能。在这里把目前工作中主要用到的技术收集到一起:

语言:

  • Html, css
  • Javascript
  • markdown
  • Objective-C

Web前端:

Web服务端:

App开发:

数据存储:

运维工具:

standard JS 代码规范和提交代码时检查

   

公司的 Javascript 项目最开始有一个代码规范,也用 jsHint 写了检查脚本。但是随着团队人员的逐渐增加和项目的时间紧迫,有一段时间没有特别强调要去做代码规范的检查。导致后来每次运行 jsHint 脚本都是错误无数,于是更没有人做相关的检查了。由于缺乏代码规范,不同的人有不同的偏好,代码可读性逐渐降低。也出现过几次由于不小心带来的线上 bug,这些完全是可以通过代码检查避免的。于是我决定是时候对代码规范和检查做强制性的要求了。

之前的 JS 代码规范比较简单,也没有涉及到 jsx 部分的规范。不同的人对于 JS 的写法有不同的习惯和看法,其实本没有对错之分。但作为一个开发团队,应该采用相同的规范,不同的人写的代码应该看起来是出自同一个人之手。这样能显著提高代码的可读性,有利于团队合作,避免出现不必要的错误。而且规范一旦制定,一定要有可行的办法强制执行,不然规则再完美再有效,也没有实际的意义。关于代码规范,非常认同下面的几句话:

“对风格的挑刺毫无意义可言。它们必须是指导原则,且你必须遵循。”

–Rebecca Murphey

“成为一个优秀的成功项目管理者的一个条件是,明白按自己的偏好风格写代码是非常不好的做法。如果成千上万的人都在使用你的代码,那么请尽可能通俗易懂地写出你的代码,而非在规范之下自作聪明地使用自己偏好的风格。”

–Idan Gazit

Objective-C 学习笔记

   

趁过年在家有点时间,从除夕到今天终于把 Code School 里的 Try Objective-C 课程学习了一遍。虽然之前看过 OC 语法,但一直觉得比较反人类,这次再学习一遍,收获还是不小.前三个级别对我来说比较容易,后面两个级别还是有些难度的。在这里把其中的主要内容做一下笔记,以备下次可以快速复习。

Level 1: NSLog, NSString, NSNumber, NSArray, NSDictionary

NSString *name = @"yanxi";
NSNumber *age = @33;
NSLog(name);
NSLog(@"%@ is %@ years old", firstName, age);

NSArray *apps = @[@"AngryFowl", @"Lettertouch", @"Tweetrobot"];
NSLog(@"%@", apps[1]);

apps[3] = @"Instacanvas";     // 出错了,NSArray is an immutable object.

// 可以重新赋值
apps = @[@"AngryFowl", @"Lettertouch", @"Tweetrobot", @"Instacanvas"];

NSDictionary *appRatings = @{@"AngryFowl": @3, @"Lettertouch": @5};
NSLog(@"%@", appRatings[@"AngryFowl"]);

ES6 中 import/export 和 require/exports 对比

   

Javascript 最早用于浏览器,处理的逻辑比较简单,没有语言层面的模块化处理方法。 随着 JS 应用的逐渐复杂,人们提出多重模块化规范,其中最著名的当属 CommonJS 和 AMD 了。随着 nodejs 的推出和流行,CommonJS 已经被大家所熟知。最早实践前端模块化的框架 requirejs 使用的则是 AMD 规范。相对 AMD 规范来说,commonjs 在定义和使用上都要简单不少。所以后来推出的 browserify 就是用 commonjs 规范来组织前端 JS 代码。而这两年流行的 webpack 则兼容了以上两个规范。先来回顾一下这两个规范:

AMD (Asynchromous Module Definition)

// 定义模块
define('sum', function() {
    return function(a, b) {a + b}
});

// 使用模块
define(['sum'], function(sum) {});

Redux + immutable.js 学习实践

   

用 react + redux 有一段时间了。之前都是自己写的 reducer,因为每次修改 state 时需要返回新的引用,所以需要特别注意,用起来总觉得不够方便。这两天学习了一下 Immutable.js , 准备把它引入到项目中和 redux 配合使用。先来设计 action 数据存取方法,最主要的几个方法如下:

// 根据 keyPath 设置 value,可以更新任意深位置的数据
// value 是简单值类型或者 Immutable 类型,也可以是函数 (oldValue) => newValue
dispatch(action.set(...keyPath, value)) 

// 删除 keyPath 对应的 value
dispatch(action.delete(...keyPath))

// 根据 keyPath 获取 value
state.getIn(keyPath)

成长在凤金 (北邮校招分享)

   

前晚(周五)作为校友参加凤凰金融在北邮的校招宣讲会,做了一个小分享,主要讲在公司一年半以来的成长,下面是分享的内容。


各位学弟学妹们,大家好。时隔多年回到母校,走进期待已久的教三,感觉很亲切。为什么说期待已久呢,因为从我大一入学的时候开始,这里就是一片空地,那时旧的教三已经拆除了,一直期盼到快毕业新教三才盖起来,所以我很羡慕你们。

先简单介绍一下我自己,我叫阎曦,是我们学校 2000 级电信工程学院的学生,电院应该是现在信通学院的前身。目前我在凤凰金融技术部移动端负责移动 Web 组工作。从毕业到现在转眼 12 年多了,基本都在互联网行业做开发,大概经历了三个阶段。第一个阶段是在亚马逊中国,8年时间经历了个多个团队和项目组。在这里学习到了很多先进的技术和理念,也感受到了他们在中国的不足。第二阶段的3年时间,折腾的事情比较多。开始是自学股票期货知识,做了一段时间期货程序化交易,开始还挣不少,后来因为风险没控制好亏得更多;然后是和朋友尝试做大数据方面的创业,产品上线了两版,由于没有找到投资放弃了;后来又加入了一家微电商创业公司。第三阶段就是今天大家看到的凤凰金融。

微信小程序技术调研

   

这两天抽空看了下微信小程序的官方文档,做笔记如下:

  • 只有先有小程序邀请码,才能试用和体验
  • 开发工具:微信自己的开发工具
  • 并非运行在 Web View 中,体验接近本地应用
  • 全局配置
    • app.js 程序脚本入口
    • app.json 全局配置文件,配置小程序里面的页面
    • app.wxss 全局样式表文件
  • 页面
    • xxx.js 页面的入口文件 (逻辑层)
    • xxx.json 页面配置文件
    • xxx.wxml 页面结构 (View) 支持:数据绑定、条件、列表、模板、事件、引用
    • xxx.wxss 样式表文件 (View)

新办公室第一天, 新的起点, 新的征程

   

从今天开始告别酒仙桥星科大厦, 到位于来广营朝来科技园的新办公楼上班了. 自从去年5月初加入凤凰金融, 就一直在星科大厦办公, 目睹了公司总交易额从10亿到20亿, 50亿, 100亿, 140亿的增长, 并在去年12月份拿到了A轮8000万美元的融资.

公司从我来的时候总共100来人, 发展到现在三四百人的规模, 星科大厦的工位早就不能满足日益扩大的人员增长. 搬家前基本都是1个工位做两个人, 就连公用走廊都堆满了我们的桌椅, 笔试面试都是在走廊进行, 前后门口的小小空隙是我们的办公室. 从最艰苦的环境走来, 盼望新的办公楼已经小半年了, 今天终于看到了, 虽不算豪华, 但还是有些兴奋的, 还是上图了.

有了好的环境, 更需要好的人才. Html5 + node.js 方面继续招聘, 求贤若渴, 欢迎联系, 共创辉煌!

外景,楼上5层 + 地下1层 凤凰金融新办公室

最重要的几条原则

   

最近在看李笑来推荐的必读书籍原则,里面对我冲击最大的几条规则是:

  1. 不要害怕真相,真想在恐怖,也要勇于面对,并基于真相做决策
  2. 要更看中于二三级效应。眼前的一级效应即使痛苦,但对长远二三级效应有帮助的选择,就是好的选择!
  3. 要特别重视反馈:要基于事实来给别人真实的、清楚的反馈,也要对自己做反馈,更要鼓励其他人给自己做反馈。并对反馈结果进行讨论。
  4. 要特别重视问责:如果有错误出现,要实行问责,不是为了追究某人的责任,而是为了避免下次再犯同样的错误
  5. 要极度的透明,对所有人都开诚布公

谈谈一心二用

   

从小就被教育做事情要一心一意,不能三心二意。真的一定是这样吗?举几个简单的例子就会发现其实并非如此。比如我们可以在跑步的时候听歌,不会因为在跑步所以听不到歌曲了,也不会因为听歌而忘记跑步。比如我们可以在吃饭的时候看电视或者聊天,不会因为在夹菜所以看不懂电视,或者不会说话。但是如果在跑步的时候听教授讲授高等数学,或者在吃饭的时候面对数百人演讲恐怕就很难完成了。问题出在哪里呢?因为听歌和听高等数学的难度不同,导致所需要耗费的脑力不同。闲聊和发表演讲的难度不同,所需要耗费的脑力也不同。

我们知道电脑可以同时做多件事情,比如可以一边播放着音乐,一边还可以用浏览器上网。让我们来看看计算机是如何做到一心二用的。熟悉计算机编程的人都知道电脑计算全靠 CPU,就算是单核的 CPU 也能同时完成多个任务。编程世界里把这个叫做多线程,比如有两个任务 A 和 B,完成单个任务不需要也没必要占用 cpu 的全部时间,所以可以同时做 A 和 B 两件事情。其实单核 cpu 在同一个时刻确实只能做一件事情,那是如何实现两件事情并行的呢?那是因为大部分的事情都会有阻塞,对于计算机来说,比如读取磁盘、网络、数据库的数据。cpu 在做事情 A 等待的时候可以做另一件事情 B,在 B 等待的时候又可以回来做事情 A,这样来回切换就可以实现同时做两件事情了。并且做完 A B 两件事情的总时间和单独做 A 和 B 的时候差不多。此时:总时间 = 完成A的时间和完成 B 的时间较长的那个。

漫谈图书城

   

时间过得好快,从2006年12月开始做图书城到现在已经过去了9年了。先看看图书城从 2007 年到 2015 年的流量走势图:

图书城历史流量

下面是最近1个月的流量走势图: