2015年终小结
2015年是毕业后的第一年,工作经验终于增加了一年.这一年的努力如果要打个分的话,我给自己七分.这一年最大的变化是我能熟练的使用 Nodejs 开发各种项目以及开始学习了 Java.那接下来我就谈谈这一年里我对这两门语言的感受吧.
Nodejs 是我这一年里使用次数最多的语言,我用它完成了若干个的项目.总结下来,用 Nodejs 开发有两个优点,开发快和性能高.我先说说开发快,由于 Nodejs 使用了 Javascript 这门语言作为编程语言, Javascript 的动态特性使得其在编写代码时非常简单.第二个优点是性能高,由于 Javascript 支持回调函数,使得异步IO并行操作,节省了大量的等待时间.但是 Nodejs 开发大型合作项目就有点麻烦了.一, IDE 无法很好地做到代码提示,二, 变量名方法名等重构困难.三, 弱类型很容易埋下了隐藏的漏洞.
我举2个实例来看一下 Nodejs 和 Java 在编程上有什么区别.
1.假设需求:通过一个网页向用户展示某件商品的相关信息.
Nodejs 版 (Express Framework)
var express = require('express');
var app = express();
var Promise = require('bluebird');
var model = require('./models/index');
app.get('/item', function(req, res) {
var itemId = req.query.itemId;
var myUserId = req.session.userId;
Promise.all([
model.user.findById(myUserId),
model.item.findById(itemId),
model.itemDetail.findByItemId(itemId)
]).spread(function(user, item, itemDetail) {
res.render('item', {
me: user,
item: item,
itemDetail: itemDetail
});
}).catch(function(err) {
res.render('error'); // 渲染 error 页面
});
});
Java 版 (Spring Boot Framework)
@Controller
public class ItemController {
@Autowired private UserRepository userRepository;
@Autowired private ItemRepository itemRepository;
@Autowired private ItemDetailRepository itemDetailRepository;
@RequestMapping(method = RequestMethod.GET, path = '/item')
public String itemRender(@RequestParam(value = "itemId", required = true) int itemId,
Model model) {
Session session;
// ...
int userId = session.getUserId();
UserModel userModel = userRepository.findOne(userId);
ItemModel itemModel = itemRepository.findOne(itemId);
ItemDetailModel itemDetailModel = itemDetailRepository.findByItemId(itemId);
model.addAttribute('me', userModel);
model.addAttribute('item', itemModel);
model.addAttribute('itemDetail', itemDetail);
return "shop/item";
}
}
Nodejs 版中第 11 行至 13 行是从数据库获取信息,通过 Promise 的 all 方法包裹后,三个 sql 语句并行执行,假设 3 条 sql 语句耗时分别为 1ms 1.2ms 0.8ms,那么第 14 行的代码将在 1.2ms 后执行.再看 Java 版,第 15 行至 17 行是串行查询,所以第 19 行会在 1 + 1.2 + 0.8 = 3ms 后执行.这也就是一定程度上, Nodejs 的速度要优于 Java.
2.假设需求:实现一个机器人简单逻辑
Nodejs 版
function Bot(id) {
this.id = id;
}
// 说话
Bot.prototype.talk = function(message) {
// ...
}
// 走路
Bot.prototype.walk = function(direction, step) {
// ...
}
Java 版
public class Bot {
private int id;
public Bot(int id) {
this.id = id;
}
public void talk(String message) {
// ...
}
public void walk(Direction direction, int step) {
// ...
}
}
从代码结构来看几乎是差不多的,但是当你运行上百个上千个机器人时,就有点区别了.假设生成了1000个机器人. Nodejs 中每个机器人的不同的属性就是 id,其他方法都是相同的引用,也就是会创建1000 份 Bot 对象和 1 份 Bot 原型链上的方法.而在 Java 中会创建 1000 个 Bot Class.两者的内存占用相差是不小的.这是我的个人理解,可能有错误.
以上两个例子似乎都在夸 Nodejs ,但是在实际使用中, Nodejs 并不是如此好驾驭的,上面我也提到了一些缺点. Nodejs 个人觉得适合小型项目比较好,比如说智能家居上面.对的,今天我花了五百大洋买了个树莓派,希望能把 Nodejs 折腾上去,那么用事件的模式去处理日常生活的各种指令应该是不错的体验(等待快递中 0.0).
展望一下新的一年吧.由于工作上的需要,我可能得把更多的心思花到 Java 上了.为了不落下 Nodejs 的学习,我将尽可能的用 Nodejs 去编写树莓派上的各种应用.同时还要补一下编程的基础知识,编程的设计模式啦之类的.
暂时就写到这吧.