March 15, 2010

我诅咒帮网易做 OA 系统的公司

据说公司的 OA 系统是买来的。不知道是谁做的,反正一刹那,我想把这帮人拖出来打一顿。好吧,我不够淡定。

一直以来,这套 OA 系统只支持 IE ,还需要装个 ActiveX 控件才能得到完整的特性。怨声载道啊。这也就忍了。https 的证书没配置好,每次都要求确认一下。我觉得吧,公司还不至于花不了这点钱弄个正式的安全证书。罢了,这也忍忍。

这两天做招聘面试的流程。我的面试记录是写在纸上的。辛辛苦苦的把几份都录入到 OA 系统里。然后电子流程走了一圈。因为到某个环节的流程错误,被退回了。

结果,我输入的面试记录全部被清空了 !现在要重新敲一遍。

阅读全文 "我诅咒帮网易做 OA 系统的公司" »

March 13, 2010

我所偏爱的 C 语言面向对象编程范式

面向对象编程不是银弹。大部分场合,我对面向对象的使用非常谨慎,能不用则不用。相关的讨论就不展开了。

但是,某些场合下,采用面向对象的确是比较好的方案。比如 UI 框架,又比如 3d 渲染引擎中的场景管理。C 语言对面向对象编程并没有原生支持,但没有原生支持并不等于不适合用 C 写面向对象程序。反而,我们对具体实现方式有更多的选择。

大部分用 C 写面向对象程序的程序员受 C++ 影响颇深。企图用宏模拟出一个常见 C++ 编译器已经实现的对象模型。于我愚见,这并不是一个好的方向。C++ 的对象模型,本质上是为了追求实现层的性能,并直接体现出来。就有如在 C++ 中被滥用的 inline ,的确有效,却破坏了分离原则。C++ 的继承是过紧的耦合。

我所理解的面向对象,是让不同的数据元有共同的操作方式,适合成组的处理。根据操作方式的不同,我们会对数据元做不同的分组。一个数据可能出现在这个组里,也可以出现在那个组里。这取决于你从不同的方面提取的共性。这些可供统一操作的共性称之为接口(Interface),接口在 C 语言中,表现为一组函数指针的集合。放在 C++ 中,即为虚表。

我所偏爱的面向对象实现方式(使用 C 语言)是这样的:

阅读全文 "我所偏爱的 C 语言面向对象编程范式" »

March 12, 2010

感谢各位投递简历和参加面试的同学

昨天,我们工作室这次的编辑器一职的程序招聘工作结束了。

比我预期的时间和人选上都超过了预期。谢谢大家的支持。

原来我的计划是找到两个合适的人来做这些事情,但实际上,这次来面试的数十位同学中达到我们心目中要求的人远远超过了这个数字。我想我也是非常细致的做了这一系列面试工作的,每个来我们办公室面试的同学,都做了一个半小时到两个半小时的沟通交流。

直到最后,依旧纠结于在五六个合适人选中该如何选择。虽然我们最终多安排了一个职位,但还是很遗憾不能与各位想来我们这里的朋友在未来一起共事。

阅读全文 "感谢各位投递简历和参加面试的同学" »

February 28, 2010

为什么一定要有密码?

以前写过一篇 可不可以只有密码没有用户名? 。里面提过一个让用户使用 email 做用户名,不设置密码的方案。今天想细化一下。

不设置密码有时候比设置密码,给用户的安全方面的感觉更好。因为,有些服务用户并不在乎帐户数据的私密性,也不在乎被人冒充。(比如在我的 blog 的留言,并不需要注册)要求输入一个密码,对用户反而是件很纠结的事情。用自己常用密码吧,若被服务商恶意记录的话,自己别的位置的帐户变得不太安全。随便选个新密码吧,很可能忘记。输入个简单的统一密码吧,基本行同虚设,跟没有密码区别不大。反而提供了虚假的安全感。这种安全感比没有更差。

而服务提供商在乎的只是用帐户名去标识一个用户,制作用户注册的流程,即费时,又费力,还提高了新用户进入的门槛。

我个人认为这样会好一些。

阅读全文 "为什么一定要有密码?" »

February 24, 2010

在 C++ 中引入 gc 后的对象初始化

这几天白天都在安排面试,其实还是有点累的。晚上就随便写点程序,好久没摸 C++ ,有点生疏。也算是娱乐一下吧。

主要工作其实是在 C 库的基础上做一个 C++ 的中间层。跟在 C 库的基础上做 lua 中间层差不太多。前几天加入了 gc 后,发现了一些有趣的用法。

比如对于构造对象。 C 的 api 中,如果创建一个对象失败,就会返回空指针。但是对于 C++ 就不一样了,new 是不应返回空指针的。书本上的推荐做法是在构造函数里抛异常。但是我又不太想进一步的引入异常机智,怎么办呢?

阅读全文 "在 C++ 中引入 gc 后的对象初始化" »

February 23, 2010

C++ 中的接口继承与实现继承

为这篇 blog 打腹稿的时候,觉得自己很贱,居然玩弄 C++ 起来了。还用了 template 这种很现代、很有品味的东西。写完后一定要检讨。

起因是昨天写的那篇关于 gc 的框架。里面用了虚继承和虚的析构函数。这会导致 ABI 不统一,就是这个原因,COM 就不用这些。

说起 COM ,我脑子里就浮现出各种条条框框。对用 COM 搭建起来的 Windows 这种巨无霸,那可真是高山仰止。套 dingdang 的 popo 签名:虽不能至,心向往之。

好吧,我琢磨了一下如何解决下面的问题,又不把虚继承啦,虚析构函数啦之类的暴露在接口中。

简单说,我有几个接口是一层层继承下来的,唤作 iA iB 。iA 是基类,iB 继承至 iA 。

然后,我写了一个 cA 类,实现了 iA 接口;接下来我希望再写一个 cB 类,实现 iB 接口。但是,iB 接口的基类 iA 部分,希望复用已经写好的 cA 类。我想这并不是一个过分的需求。正如当年手写 COM 组件时,我对手写那些 AddRef Release QueryInterface 深恶痛绝。

用虚继承可以简单的满足这个需求:

阅读全文 "C++ 中的接口继承与实现继承" »

February 22, 2010

在 C++ 中实现一个轻量的标记清除 gc 系统

最近想把 engine 做一个简单 C++ 封装,结合 QT 使用。engine 本身是用纯 C 实现的,大部分应用基于 lua 开发。对对象生命期管理也依赖 lua 的 gc 系统。关于这部分的设计,可以参考我以前写的一篇 为 lua 封装 C 对象的生存期管理问题

当我们把中间层搬到 C++ 中时,遇到的问题之一就是,C++ 没有原生的 gc 支持。我也曾经写过一个 gc 库。但在特定应用下还不够简洁。这几天过年休息,仔细考虑了一下相关的需求,尝试实现了一个更简单的 gc 框架。不到 200 行代码吧,我直接列在这篇 blog 里。

这些尚是一些玩具代码,我花了一天时间来写。有许多考虑不周的地方,以及不完整的功能。但可以阐明一些基本思路。

阅读全文 "在 C++ 中实现一个轻量的标记清除 gc 系统" »

Misc

Recent Comments