工作变更的事宜快要告一段落了,从电信行业转向互联网行业。其实我不算一个很有经历的人,但是我依然愿意回头望望走过的路,记录下我的体验、感触,给那些刚入职的兄弟们、遇到困惑的朋友们,说一些小小的事情,给一些小小的建议;同时,更作为一份小小的新年礼物,送给自己。
—————————————————————————————————————-
关于求职
每一次求职都意味着一次挑战,在这一步过程中,至少要
[……]阅读全文
一个纯正程序员的啰嗦
工作变更的事宜快要告一段落了,从电信行业转向互联网行业。其实我不算一个很有经历的人,但是我依然愿意回头望望走过的路,记录下我的体验、感触,给那些刚入职的兄弟们、遇到困惑的朋友们,说一些小小的事情,给一些小小的建议;同时,更作为一份小小的新年礼物,送给自己。
—————————————————————————————————————-
关于求职
每一次求职都意味着一次挑战,在这一步过程中,至少要
[……]阅读全文
题目:一只青蛙一次可以跳 1 级台阶,也可以跳 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
这道题还被 ITEye 放在了博文视点杯有奖答题活动里面。
我提供三种解法。
1、递归求解:
青蛙每跳一次前,有这样三种情况:
于是递归方法求解:
/** * 递归方法 */public static int calc(int n) { [……]阅读全文
最近铁道部购票已经成为了热点话题,毛病多得一塌糊涂,如果让你来设计铁道部购票网站,你会怎么做?
这样的网站属于实时性要求较高、并发性要求非常高、容量要求一般的类型,以下是我简单的想法:
1、部署是基于 CDN 的,对于车票查询的环节来说,这是没有问题的。
2、数据库表设计上面,应当有一张车次表,每行代表一趟车,至少有这样的字段:还剩多少张,已被锁定多少张。
3、每次发生订票操作时,先去查询当前是否有余票,有的话锁定一张等待用户操作,如果半小时内无法完成,锁定票放回。
4、查询部分,集群中放置分布式缓存,存放数据的静态页面,但由
[……]阅读全文
观察者模式,指的是定义一种对象间的一对多的关系,当一个对象的状态发生变化的时候,所有依赖于它的对象都将得到通知并更新自己。
现在要说的分歧在这里:
“推” 的方式是指,Subject 维护一份观察者的列表,每当有更新发生,Subject 会把更新消息主动推送到各个 Observer 去。
“拉” 的方式是指,各个 Observer 维护各自所关心的 Subject 列表,自行决定在合适的时间去 Subject 获取相应的更新数据。
“推” 的好处包括:
1、高效。如果没有更新发生,不会有任何更新消息推送的动作,即每次消息推送都发生在确确实实的更新事件之后,都是有意义的。
2、实时。事件发生后的第一时间
[……]阅读全文
而我,已经过了遍地牢骚的年纪。
可是有一些 IT 人,他们都在平安夜里做什么?
有人在和客户洽谈,有人在现场维护,有人在加班 Coding,还有人,像我一样,在各个技术网站上闲逛,写一些小众的、自我感觉有一点点营养的博客,赢取 IT 业的兄弟姐妹们一点唏嘘,一点赞同。
年岁不算大,但是在 IT 业,工作经历也到了一个可以被称作老员工的时候;故事不算多,但是在 IT 业,生活体验也到了一个可以被扯出来摆事实讲道理说教的阶段。我做出了一个决定,在思索良久之后,我想从电信领域转到互联网领域,寻求下一段职业发展旅程。
好歹不算头疼脑热,好歹也不算神经冲动,最近看到一篇文章,又让我想起了最
[……]阅读全文
有道经典的算法题,两个一模一样的鸡蛋,某层之上扔鸡蛋就会碎。假如运气最差的话,问要测试多少次才能找出这层楼来。
如果只有一个鸡蛋,我就只能一层一层试验。两个的话关键就是找着第一个鸡蛋试验的位置,第二个鸡蛋还是只能一层一层试验。
这道问题其实可以扩展到任意个鸡蛋,但现在还是只看 2 个鸡蛋的情况。
2 个鸡蛋只有 n 层的最优解求出来假使为 k,那么,n+1 层的时候,把第一个鸡蛋在第 k 层释放,只有两种情况(n+1 只是分解成两个<=n 的子问题,这两个都是已经有解了的):
(1)破碎,于是只有之后就只能遍历从地面到第 k-1 层,一层层遍历,不能偷懒,最坏的情况在此要尝试 k 次;
(2)没碎,那问题
[……]阅读全文
我是从 06 年开始真正写博客的,几经易辙,到了 09 年,我也中断过一段时间,好在现在已经坚持下来并且养成习惯了。
写博客可以保持思考的习惯。
这是我写博客的最大动力,除非标注转载的极少数几篇,否则文章都是原创的。我是一个普通教育背景的孩子,小时候很喜欢看书,家中也藏书不少。只是上大学开始,我的阅读量逐渐下降,而且愈发发觉,书读得多不动脑,还不如少读几本,多思考。在逐渐的工作中,也越来越发现思考的重要意义,和在中国这种教育体制下的缺失。后来又发现,思考可以让人少走一些弯路,少受一些苦痛,对程序员来说尤其如此。
写博客可以帮助其他的程序员。
我要给自己印一摞名
[……]阅读全文
酒杯盛酒,酒杯碰撞,这是物理层;
你要根据不同人的外貌特征找到你要敬酒的人所坐的位置,这是 IP 协议(网络层);
你明白,敬酒的实际目的是加深感情,这在应用层,而这酒中的感情,才是报文的数据部分。
你和某位新见面的兄弟互相来回敬酒,这叫 TCP;
你给同一位好兄弟敬酒好多次,死命灌他,他也不回礼,这叫 UDP;
你对全桌的人说,来,咱们同归于尽,这叫广播;
你在对这一桌的人顺序挨个敬酒,这叫令牌环。
你对该兄弟说,初次见面,请多关照,请问阁下尊姓大名,敬酒一杯,这叫 SYN 报文;
这位兄弟说,同是天涯沦落人,
[……]阅读全文
最初接触到面向对象的 CSS 还是因为项目中的 CSS 已经超过八千行,缺乏约束和管理,在近期或者是不远的将来,有迫切的要求需要重构。在前端重构中,除了 JavaScript 重构,不妨再看一看 CSS 面向对象和模块化,这给我的工作提供了非常好的思路。
首先,我要说的是,在这个概念翻飞的年代里,固执地追求某些概念和涵义,并不能带来更优秀的设计和更高的生产力,面向对象是一种思路,或者说是一种方法论,给 CSS 重构带来一些启示,这就足够了,没有必要去纠结 OO CSS 的定义和严谨性。
我们的 CSS 代码遇到了什么问题?
重用性差,看着一个 CSS 的名称,很难说出哪些模块可能引用到了它,这个 CSS 是用作网页的哪些部分
[……]阅读全文
这两个概念是早些时候 Martin Fowler 总结出来的两种常见模型设计类型,没有说谁好谁不好,为不同的模型类别选择合适的场景是设计者的工作。没有工具本身的问题,只有工具使用者的问题。
贫血模型是指领域对象里只有 get 和 set 方法(POJO),所有的业务逻辑都不包含在内而是放在 Business Logic 层。
优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access Object。可见,领域对象几乎只作传输介质之用,不会影响
[……]阅读全文
2、数据库表的大字段剥离,保证单条记录的数据量很小。
3、恰当地使用索引。
4、必要时建立多级索引。
5、分析 Oracle 的执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描。
6、表分区和拆分,无论是业务逻辑上的拆分(如一个月一张报表、分库)还是无业务含义的分区(如根据 ID 取模分区)。
7、RAC,值得注意的是,Oracle 的 RAC 在节点较多时有其不可解决的性能问题。
8、字段冗余,减少跨库查询和大表连接操作。
9、数据通过单个或多个 JOB 生成出来,减少实时查询。
10、从磁盘上做文章,数据存放的在磁
[……]阅读全文
前端也有 MVC,DOM 树就是这个 M,CSS 就是这个 V,至于 C,非 JavaScript 莫属。
很高兴团队中有越来越多的人能够跳出某种语言、某种平台的局限性,站到抽象的层次上思考一些设计上的问题。在我的印象中,似乎前端开发总是容易给人以随意、混乱的感觉,可真的是前端技能不容易掌握吗?
大学里 Java 课程正儿八经学了 3 年,JavaScript 只字未提,只是课余时间凭借着兴趣自学,加起来也就两三个月。
前端代码更加灵活,无论是 HTML、JavaScript 还是 CSS,似乎任何一个初学者都可以轻松入门。可是越是看似简单的东西,就越难以精通地掌握,没有好
[……]阅读全文
JavaScript 虽没有给出继承的关键字,但是我们依然能够拿出一些好办法实现。
1、原型链继承:
var Base = function()
{
this.level = 1;
this.name = "base";
this.toString = function(){
return "base";
};
};
Base.CONSTANT = "constant";
var Sub = function()
{
};
Sub.prototype = new Base();
Sub.p
[……]阅读全文
在学习了面向对象的语言,比如 Java、Python 和 Ruby 之后,看起来每个人都觉得自己在进行面向对象的编码。但是如果你仔细审视一下代码,你就会发现还是无意识地使用了很多过程语句。
静态方法
静态方法是最天然的过程方法,它和面向对象没有一点关系。好吧,我已经听见质疑的尖叫了,那么,我就来给你解释一下为什么。首先我们可以达成一个共识,全局变量和全局状态是魔鬼。如果你觉得前面说的静态方法的话会没什么可争论的,那好,我认为静态方法就应该返回一个常量,因为没有全局状态量(时间和随机数,这些都是全局状态量,所以不能算进去的,对象必须有不同的实例,但是对象图的连线是一致的)。
这就意味着静态方法要做什么
[……]阅读全文
正如动静是相对的概念,有了它们,世界才充满盎然生气;变和不变也是哲学上的对立统一,在代码的世界里也一样;同步异步呢?
首先,来粗略地看看同步和异步各自有些什么好处:
同步的好处:
异步的好处:
[……]阅读全文
以下内容翻译自 CQRS by Martin Fowler,有一些修改:
CQRS(Command Query Responsibility Segregation)指的是命令查询职责分离。这是一种我从 Greg Young 处听到的模式描述。它的核心思想很简单,就是你在更新和读取操作时使用不同的模型,这样的话,会给整个系统的设计带来深远的变革。
人们和信息系统交互的主流行为就是对数据仓库 CRUD 的使用,我们构思一个可以供创建、读取、更新和删除的数据模型。简单来说,我们的接口提供出来的目的就是供存储和获取数据之用的。
现在我们要脱离这样一种模型,看
[……]阅读全文
今天我不谈抱负理想,也不谈具体的技术,我来谈几个看法上的典型错误。下面的这些问题都是我曾经遇到,或者是我的朋友们遇到过的问题,这些都是我个人的理解,希望对大家有帮助。
关于设计模式、设计原则
有人认为,熟悉了设计模式、设计原则,就学会了设计。其实,设计模式和设计原则,只是前人根据设计实践做的总结和提炼,设计,归根到底是要解决问题的,把具体问题的解决办法,经过一定的抽象,变成程序员的语言。
我见过一些人,他们知识渊博、见识广博,甚至理论可以给你阐述得冠冕堂皇,但是到了实际需要解决问题的时候,他们却拿不出巧妙的、优雅的办法,这是典型的象牙塔人。
另一方面,也有一些人看不起学习设计模
[……]阅读全文
我想要怎样的生活?
做一个歌手。充满魅力的舞台。钢琴?吉他?架子鼓?我爱清新的音乐,华丽的演唱。
做一个医生。病人的眼神,这是世界上最单纯直接眼神。关于健康和爱的神圣故事。
做一个咖啡吧老板。我爱咖啡,我爱在浪漫的咖啡吧里品味香醇各异的感觉。嗯,那样的话我大概有机会爱到极致了。咖啡在苦中浓郁,有时候,喝咖啡就是在品味生活。
呵呵,不过,我想我大概会一直坚持下去。
我找不到放弃和变卦的理由,我爱软件,梦想还是没有动摇过。
软件是一件用 0 和 1 两种符号在巧思匠心下凝聚而成的艺术品,没有任何一类事物可以这样神奇地将数字的理性和艺术的感性结
[……]阅读全文
本文翻译自 Oh No! DTO! by Robert C. Martin,这篇文章很短,强调的内容简单得不能再简单,也许大家早就意识到,但是,我依然可以在很多产品的代码里面找到文中所说的 “教条” 的影子,我说不清为什么,在这里有激烈的讨论,你们说呢?
本周我在教授 XP(极限编程,译注)的课程,我们要写给当前的应用写 FitNesse(一种测试工具,译注)的基础测试代码。其中一位程序员使用了 RowFixture(一种测试结果比较的工具,译注),这种工具需要使用 DTO(数据传输对象)并且要求其中的变量都为公有的。这时候这位程序员提出了质疑:“DTO 应该使用私有的变量和一套相应的 get
[……]阅读全文
工作需要面试了一些人,主要还是找合适的开发人员为主,我本人不能算很有经验,但是也有一些自己总结的路子。
要找怎样的人?
简单说,我要找适合工作的人。找适合公司和适合岗位的人,不一定要最优秀的,不一定要最出色的;但是一定要有基础、能学习、肯干,并且有一定的吃苦能力,性格不难于融入团队,短期内不轻易离职的人。
会进行什么对话,问怎样的问题?
七步曲。
1、热场,聊聊地点、家常,看看最基础的沟通能力,也帮助被面试者放松,正常反映自己的情况。
2、询问经历,包括学习经历和工作经历,尤其是实际项目经历,并就项目情况展开询问,可以了解擅长领域和工作经验。
3、简要介绍一下相应职位的工作情况,做什么业务,
[……]阅读全文