数据库事务

学数据库的时候就会经常提到事务这个词,事务的ACID,事务的rollback,为什么需要事务。但以前写的项目中,很少重视这个问题(好像因为我很少写后台的缘故)。最近写高并发的东西需要事务体现的特别明显。 最简单的例子:

public void updateName(Long id, String name){
    User user = userDao.findById(id);
    user.setName(name);
    userDao.save(user);
}

public void updateGender(Long id, boolean male){
    User user = userDao.findById(id);
    user.setGender(male);
    userDao.save(user);
}

如果直接在方法中这么写,会出现并发问题。由于多个线程最终还是串行的(CPU是串行的),所以,这段代码的执行顺序可能如下:

thread1: User user = userDao.findById(id);  //   name: "Alis", gender: false
thread2: User user = userDao.findById(id);  //   name: "Alis", gender: false

thread1: user.setName("Bob"); // name: "Bob", gender: false
thread2: user.setGender(true); // name: "Alis", gender: true

thread1: userDao.save(user);   // name: "Bob", gender: false
thread2: userDao.save(user);   // name: "Alis", gender: true

//expected result in database: name: "Bob", gender: true;
//final result in database: name: "Alis", gender: true

可以看出,我们实际上想最终得到一个男Bob,结果得到了一个女Alis。当然,由于并发执行,并不能保证执行顺序,也有可能是一个女Bob,男Bob,完全凭运气。因为两个线程不曾互相通气,说哪个属性已经被改变了。

这个场景似乎在Web上很不容易想象出来,但仔细一想又会存在。例如,小明正在修改自己的个人信息,同时,由于连续使用3天,系统给小明的信息中更新了一下积分,如果积分和个人信息都放在profile表里,就很有可能发生并发,导致数据覆盖。虽然可能性很小,但一旦发生,结果往往是不可挽回的。

解决的办法很简单,事务。

JDBC就提供了事务

conn = DriverManager.getConnection();
conn.setAutoCommit(false);

//do queries...

conn.commit();

使用Hibernate,也提供了相应的接口

Transaction tx = session.beginTransaction();

// do queries...

tx.commit()

使用Spring的话,也提供了@Transactional注解,在需要事务的方法上加上注解就好了

@Transactional
public void updateName(){ 
     //...
}

想来Spring还着实做了不少简化开发的工作啊。

状态模式、面向对象与函数式

最近好友墙裂向我推荐Clojure,就仔细看了一下这门Lisp方言。《黑客与画家》中经常提到的一个概念就是Lisp等语言的比其他的编程语言在表达能力上更加强大。我对Clojure仅仅看了两天,不过Javascript倒是用了两年了,Js的设计中借鉴了很多函数式语言的特性,又同时借鉴了一下Java的语法,Java->Javascript->Lisp倒是形成了一个不错的学习曲线。

设计模式是OO编程中必不可少的一部分,但同时,很多人又批评这完全是由于OO语言自身的缺陷导致的。最著名的莫过于Peter Norvig在1996年的一份讲稿: Design Patterns in Dynamic Programming。这里指出23种模式中,有16种模式在Lisp是语言本来就有的特性或者实现起来更加简单的(16 of the 23 patterns in Design Patterns were “invisible or simpler” in Lisp)。先来看一个简单的模式,状态模式。

状态模式

我相信使用Java或者C++的童鞋对状态模式一定不陌生,简单易懂,经常用到。

状态模式

如上图。Context类有多个状态,有一个currentState属性,当调用Context.handle时,委托给currentState.handle()。通过实现State接口,可以定义多种状态,通过切换具体的object,可以实现状态切换。

是否需要这么多State类

状态模式的精髓在于,通过不同的State类来代表不同的状态。等等,真的是类嘛?实际上是State各个实现类实例化之后的对象。什么是一个对象?对象的概念在很多语言中都有,无论在哪,都可以看成是一个数据集合,同时具有多种方法,即对象是有行为的属性集合。在状态模式中,我们实际使用中,仅仅使用了一个object,并没有多次使用这个类(作为object的模板),即没有出现也不需要出现具有不同属性的object。那为什么不直接定义object呢?至少第一眼看上去,可以节省额外的Class开销。

这里我们回顾一下,面向对象编程三大特性:

  1. 封装
  2. 继承
  3. 多态

如果我们直接定义一个个object(或者function),放弃强类型,这三个特性会怎么样?

封装

这个不会有太大的改变,因为不同的object/function仅仅暴露方法就行了,甚至自己就是那个方法,内部运作仍然可以封装。

继承

如果使用object,将不需要一个State接口。接口的意义一方面是多态,即让currentState引用可以指向多个实现类的对象,但对于弱类型语言,这个问题不存在;另一方面是,在编码(其实是编译)阶段防止程序员犯错,State实现类必须实现handle接口,但如果直接定义的是handle function,这个问题也无关紧要。特别是,如果没有完善的测试用例,程序员仍然会犯错,有了完善的测试用例,这点防范措施实在没啥意义。

多态

仍然是多态的,通过切换object/function。

JavaScript实现

大概实现一下。

var context = {
        handle:null,
        init: function(){
            handle = initStateHandle;
        },
        switchState: function(){
            handle = otherStateHandle;
        }
    };

    var initStateHandle = function(){
        //do init state stuff
    }
    var otherStateHandle = function(){
        //do other stuff
    }
    
    //init
    context.init();
    context.handle();
    
    //change state
    context.switchState();
    context.handle();

很久之前我也实现过一个State Pattern in JavaScript,实现思路是类似的。这段代码也可以用Lisp实现,由于刚接触Lisp,就不献丑了。

可以看出,用Js实现的代码短,直接而自然,一看就明白,不需要很多类文件,也不需要费尽心思用继承、委托等等OO技术,仅仅关注好业务逻辑就可以了。

依赖注入

在状态模式中,我们的质疑点是,State的实现类的定义仅仅为了一个对象。Java确实有这么一个框架,帮你实例化一次某个类,然后在全局,任意的注入这个对象,就是Spring。如果把Class定义看做对象定义(仅仅多写几个单词),确实可以应对这个质疑点。但是看看额外的开销吧,要启动一个完整的Spring框架。

当然,依赖注入是一个十分先进的思想,即当我想要任何对象的时候,不需要自己去找,像神一样,说:“要有光”,就把光的对象给你了。十分火的前端框架Angularjs就使用了依赖注入的思想,在函数的参数列表里声明好需要的对象,框架就给你注入了,你完全不用管这个对象是哪来的。

回到Java

喷Java的程序员多了去了,写Ruby、Python、Lisp的程序员,鄙视Java由来已久。但即使这样,为什么Java还这么有市场呢?所有人都会反感Java的Hello world,因为Java一定需要定义一个类,产生了很多额外的代码。纯面向对象的特性,最直接的就是,理解所有的代码的思路是一样的,所有人写出来的代码,也都是一样的。所有的类,都定义在某个package中,有自己的namespace,要解决特定的问题,嗯,一定是找某一个类,并通过某种方式实例化对象。某种意义上,这反而让思维简单了,只需要通过一种单一的方式来理解代码。剩下的,就是用这种单一的方式,该如何处理各种复杂的问题,就出现了设计模式。

所以,Java程序员可以很容易的培训出来,一切都是严谨的,规范的,不可突破的,换句话说,没什么黑客精神的。黑客强调的个性、简单、自由,在这里都没有,带来的好处是,生产力的大大提高,Java程序员遍地都是,从手工艺者,变成了工人。

参考:

  1. Design Patterns in Dynamic Programming
  2. Head First Design Patterns

中华琳娜

《爱情买卖》是一首很接地气的歌,被称为“神曲”。大约是觉得太烂俗了,所以一般听惯了流行歌的人都比较不屑这首歌。这种音乐种类间的互相不买账也一直存在,学院派根本就觉得流行是个渣渣,高端得来美声、民歌。唱摇滚的说我就是要颠覆你们,一切现存的都是颠覆对象。

把学院派的民歌歌手龚琳娜放到一群唱通俗流行歌的选手中间PK,按照传统逻辑,嗯。

龚琳娜唱歌的思路很明显,就是用音乐表现一切可以表现的东西。《金箍棒》很多人说欣赏不了,其实这就是《金箍棒》表达的内容。孙悟空是个什么角色?大闹天宫,我行我素,本来就不是“正道”,你说用什么唱法去表现孙悟空?首先中国传统元素少不了,听起来得是个中国歌。孙悟空武艺高强,不把各路神仙放在眼里,所以歌曲一开始的“俺老孙”,唱的那叫一个飞扬跋扈,得意洋洋~这不是孙悟空是谁?后面的“呔哩个呔,呔哩个呔”,这不是孙猴子蹦来跳去,挥着金箍棒打来打去,大闹天空嘛!闹完了,孙悟空自封“齐天大圣”,气势磅礴,又有点孙悟空的嬉皮笑脸。

《金箍棒》一共就那么几个词,但一个捣蛋的孙悟空的形象已经完全在人脑子里形成了,完全不需要大段的歌词,听着听着,大伙就乐了。

相反,流行歌是严重依赖歌词的。你可以说流行音乐的旋律好听,但是不听歌词,你能知道流行歌在唱什么嘛?大部分流行歌做不到。

回到《爱情买卖》。这周全能星战,龚琳娜用来PK孙楠的歌曲,让所有人目瞪口呆。同一段旋律(主题),用民谣、流行节奏、爵士、吆喝、说唱、美声、花腔、戏曲、音乐剧、乡村摇滚,各种不同的唱法来表现,每种一小段。让人应接不暇。听完先是对龚琳娜佩服至极,学院派就是学院派,什么唱法都来一个,同时又感觉每种都没听爽,怎么一下就过去了呢。老锣解释,这是要表现现代社会,变化太快,就是要表现人们接受不过来的那种感觉。

你看,老锣编曲想表现的就是接受不了,很显然,他的目的达到了!但你让我说夸这首歌好听,这确实不如流行歌好听。

初中音乐老师在讲经典和流行的时候,说了一句话:“流行音乐就是要好听的。”这句话我当时十分不理解,这不是废话嘛?现在就觉得很好理解,流行乐除了好听,就没了。这种好听是用那些有限的几个大众能理解的和弦构成的好听,所谓“大众能够欣赏的音乐”,当然就是简单,熟悉,好听。所以流行乐要想创新是十分难的,因为创作的空间有限,你把歌剧里面大起大落的旋律放流行歌里,就没法传唱了,大部分人唱不了呀,那还怎么流行!?所以流行歌的创新确实是非常难的,发展也是很缓慢,大家都限制在“条条框框”里面,畏首畏尾,又不能烂俗,又不能难唱。

龚琳娜的歌,首首都难唱。只能听,不能唱。谁唱谁知道。全能星战里面翻唱了几首流行歌,也绝对把非常有特色、突破性的龚琳娜元素加入到里面了。第一首《明月几时有》,看把评委们吓的。网上评论非常好,为什么?龚琳娜一张嘴,苏轼的形象马上浮现出来,这才是音乐的表现力!龚琳娜一张嘴开始“啊”,很多人都听哭了。《小河淌水》也是,没有歌词的地方,反倒显得干净,表现力极强,这才是艺术,这才是音乐。

孙楠在这场比赛里说,艺术是有标准的。流行歌如果按照她的方式发展下去,就没法发展了。我觉得孙楠这两句说的都很对,但口气不对。首先艺术确实有标准,从艺术的标准看,龚琳娜的歌首首都是艺术。艺术本来就是要表现生活的,龚的《爱情买卖》,就是要表达这世界变化再快,商业化再发达,爱情还是不能买卖。这就是艺术。其次,流行歌确实不能按照龚琳娜的方式来发展。龚琳娜的歌大家都唱不了,怎么传唱、怎么流行,KTV怎么生存?这些话,其实在我看来恰恰是对龚琳娜极高的赞赏。

全能星战,本来就没有说是“流行歌”的舞台。龚琳娜也没有说要引领“流行歌”的发展。流行歌手听到龚琳娜,马上吓坏了,这样的歌以后变成流行歌,那我们还怎么混?当然变不成流行歌,龚琳娜和老锣本来的目标就是发扬中国传统音乐,至于音乐的具体表现形式,到现在为止好像还真没考虑过流行。这点孙大哥大可放心,真流行不起来,人家追求的艺术跟你的艺术就不是一种东西。

龚琳娜的“怪”,恰恰在于,龚琳娜唱的音乐,就从来不受拘束。根本就不是流行,不是一切所有已知的风格、形式、体裁。所以,大家只好称为“神曲”。因为没有办法形容。

依我看,不如龚琳娜的这种风格,就叫中华琳娜。洒脱不羁,自由浪漫,探索音乐中的无限可能。

龚琳娜 《爱情买卖》 http://www.bilibili.tv/video/av872088/
(B站上黄色的字幕把龚琳娜的音乐剧的故事性讲的很明白,欢迎欣赏)

苍南支教——音乐课

这次去支教的四个人当中,就我会识谱,会弹琴的一个没有,所以音乐课就全部交给我了,于是我除了4年级都教了一遍。小学的音乐说简单也简单,说难也难。说简单是因为让小朋友们听唱学起来很快,说难是要让他们安静的听你讲讲五线谱是怎么回事,简直太难了,根本听不懂,也不想听。课本上确实是用心选过的歌曲,中外的歌、曲、戏、剧都有,希望让小朋友们对音乐有一个完整的认识,免得以后只能欣赏流行歌。我小学的时候大概是没有意识到这一点,所以说给小朋友们,他们也不会明白。

课本里一般一节课会包含一些欣赏的曲目,一些是让小朋友们学唱的歌。欣赏的一般比学唱的复杂一些,但课本选的范唱也会对原曲进行节选、简化。三年级节选了圣桑《动物狂欢节》里面的《公鸡和母鸡》,确实很好听,我让小朋友们去听乐曲中的鸡叫声,咯咯哒!咯咯哒!有几个同学听出来了,但还是不买乐曲的帐,为什么不唱出来呢?我也回答不了,一句要学会欣赏啊!就糊弄过去了。6年级课本上有《图兰朵》,配合茉莉花教的。于是我就把图兰朵猜谜的故事跟他们讲了一遍,他们对猜谜特别感兴趣,就是猜完了,就把图兰朵忘了。当我说讲完国内各个版本的茉莉花,跟他们说,《图兰朵》可以算是外国版本的茉莉花时,小伙伴们都惊呆了。合着我前面铺垫了半天的图兰朵公主的故事都白说了。不说了,直接上张艺谋版本的《图兰朵》,大家听出这一段的庄严大气的茉莉花的旋律没有?小伙伴们说,舞台上的人好像僵尸啊,好恐怖啊。

低年级教的基本是儿歌,例如《小红帽》,二年级小朋友们都特别喜欢这首歌,我也很喜欢,多好听呀。高年级会有《茉莉花》这种绕来绕去的歌。孩子们的听谱能力还是可以的,先上一遍网上下好的范唱,然后我再一句句的示范唱一遍,他们跟唱一遍,基本就记住了。

中国人的乐感真是没的说。但是乐感好,就会让小朋友们自己改谱子啊囧。教5年级《雏鹰之歌》,中间一段几个音都是do,大概是do do do do 的样子,楞是被唱成了do do re do,我纠正了好几遍。孩子们才不管谱子呢,虽然他们都很想唱对,但估计对他们来说那里感觉就不是do啊,于是嘴里出来的还是不对,于是我就放弃了。嗯,不要在意细节。孩子们对节奏的把握也很好。虽然我在说了半天谱子上的浮点是怎么回事,他们还是一脸不明觉厉的看着我。但是我范唱一遍之后,大家就都按照正确的节奏来唱了,甚至大家一起唱的时候,我都忘了浮点,孩子们唱的还都是对的。孩子们的音域也挺不错,毕竟是童声,《茉莉花》最后一句饶来绕去的高音,6年级的小朋友完全hold住啊,虽然大家唱的乱七八糟的,但确实每个音都唱出来了。

找到课本上的伴奏、范唱是一件很不容易的事。理论上应该教师用书会自带光盘,但我其实上课都是提前去教室里随手拿一本学生用书。所以,得去网上下。好容易找到一个有对应歌曲的网站,还收费,幸好不贵,十块钱基本随便下了。另外,课本确实想与时俱进,于是弄了一些电视剧、电影的主题曲进去,结构都是孩子妈妈们、奶奶们小时候看的电影了,跟看着《爸爸去哪儿》长大的孩子们完全脱节啊。孩子们根本没看过这些电影,所以也没法与剧情、歌曲产生共鸣。不过要做到课本的与时俱进,确实也是一件难事。一年级时听一首什么歌来着,我一搜是一部5几年还是6几年的电影,歌是好听,可孩子们问,这是什么电影呀?我只好说,是一部老片,看起来不错。

说到与时俱进,我们一开始以为小朋友们都喜欢听流行歌,不喜欢课本上的歌。一教才发现,他们哪懂什么教流行歌曲呀,还是喜欢课本上的歌。我也喜欢,课本上的歌其实都挺好听的,而且适合小孩唱。估计只有初中二年级才会对课本上的歌嗤之以鼻,被流行歌蒙住双眼,当年我就是这样的,当时问来教务处玩的四年级小朋友,你们喜欢听什么歌呀?《外婆的澎湖湾》!于是我就惊呆了!这不是他们爸妈小时候的歌么?后来才发现是课本上教过的。你看,好听的歌不管到什么时候,都好听。

计时器原型设计

最近有同学产品面试,要去做一个计时器,后来被说设计的太简单。想了一下,计时器本来就很简单,魅族自带的极度简单到只有一个按钮,能复杂到哪去呢…

顺手做了一个原型,刚好给ruby做移动开发的作业。

image

我们为什么换社交网路

突然意识到,这是换圈子的过程。

在成长的过程中,朋友圈子在不断的更换。但社交网络中,曾经的朋友仍然会一直是朋友,即使很久不再联络。但人们总是需要跟更亲密的当下的朋友有更多的交流,切换社交网络能够一定程度上满足这一点。

换圈子是一段时期就会发生的一件事。因此,微信之后,仍然会有机会留给后来的社交网络。

同时,我们仍然放不下老朋友,因此在各个社交网络间疲于奔命。

而又有那么一些朋友,无论换到哪个社交网络,彼此还是能看到对方的新鲜事。

Mac,Linux,Windows手感对比

本科时候专业课基本用windows和visual studio做的,当时vs的臃肿和必须使用盗版让我对微软毫无好感,然后拥抱了开源世界,用了两年ubuntu linux,直到今年买了Mac。突发奇想做下对比。

常用软件兼容性

Mac:Chrome, Office, QQ, 迅雷,搜狗输入法
Linux: Chrome, 永中Office,Web QQ,浏览器自带下载,fcitx
Windows: 常用软件其实就是指Windows上能用的软件

所以,到今天日常工作上,三个系统基本都能正常使用。体验上Windows最好,Mac次之。

命令行工具

Mac: 自带unix shell,用包管理器homebrew可以安装缺少的linux上常用的工具,也可以装其他shell
Linux: 喜欢命令行的程序员的天堂。用起来十分舒服。
Windows: 用Cygwin可以勉强找到shell的感觉,美中不足是有的时候某些脚本依赖某个shell命令,万一在cygwin中没装,跑步起来还找不着原因

在命令行工具上,三个平台也都做到了可用。体验上linux最好,Mac次之。

软件安装和升级

Windows: 在网上下安装包,然后双击安装。常用软件一般自动升级。不常用软件需要重新安装来升级。
Linux: 用命令行的包管理器搞定一切。一行命令就可以安装chrome,感觉棒极了!升级所有软件只需要一行命令。大部分软件还可以下载源码编译安装,此时升级需要下载新版本源码重新安装。
Mac:图形界面软件,基本下载程序/安装程序安装。命令行软件,通过包管理器,比较弱。还支持从Apple Store安装,但国内大环境下基本没用过。

Linux的一行命令安装/升级已经把体验做到了极致。Mac各种安装方式杂糅。Windows最苦力,啥都要自己下。当然第三方360软件管家什么的可以弥补,但是这些流氓吵来吵去,一不小心qq、搜狗就不能用了。

图形界面

Windows:从win7到win8有个飞跃,以至于让升级系统最快的中国人(因为不要钱)都不升级了。用户最熟悉的,没有办法订制的,看起来凑活的图形界面。但依赖于其的众多图形界面软件(小白请直接理解为常用软件)使其功能最强大。
Linux: 高度可定制化,想怎么改就怎么改的图形界面。但稳定性较差,一不小心碰到G点就坏了。图形界面系统分裂出太多版本,以至于极难制作图形界面软件,以至于整体体验较差。但可以自定义的炫酷拽。
Mac:精致、漂亮的图形界面。用户不能订制,也不想订制,默认的足够好了。基于Mac的图形界面软件的常用软件也渐渐增多。很多开发者工具的图形界面版本都只有Mac的。

Mac作为图形界面的鼻祖,堪称典范。Windows靠兼容的软件功能最强。Linux满足屌丝程序员当神的欲望。

系统稳定性

Windows:蓝屏的,好喝的。不过现在蓝屏情况已经大大减少,但仍然存在。
Linux: 十分稳定,不会挂掉。但是图形界面经常挂。
Mac: 系统挂掉是什么,好吃吗?

三个平台都挺稳定了。

系统安装

Windows: 网络上有出奇多的教程、安装方法,小白用户级别,驱动兼容性最好。
Linux: 发行版的安装都做的十分容易,适合在已有windows的机器上做双系统。驱动不全,有可能装上用不了或者出问题。
Mac:你花上两天时间,看了无数教程,终于在PC上装上了Mac,发现居然跑起来了!接着10秒钟之后CPU因为风扇不转过热挂掉了。

作为程序员

曾经我很排斥windows,觉得开源世界才是程序员的归属。回过头来发现,其实只要在系统上弄好工具链,啥系统都一样。渐渐也没有了偏见。三个系统各有各的长处,各有各的不足,总有用的不爽的地方,总有用的顺手的一天。

通过历史预测未来

根据历史预测未来似乎就是彻底不靠谱的事,我之前也是这么认为,直到最近膝盖中了一箭。好吧,其实是看到《失控》最后几章让我对这个问题重新思考了一下。

股票涨跌

金融机构、投资个人都希望对股票的涨跌做出预测,什么K线图分析,眼花缭乱的理论,都是从历史数据来对未来做出判断,但效果好像都不是那么的好。于是,就有价值投资理论云云,要从股票的实际价值出发,历史数据就是不靠谱的,要看实际价值。

物理定律

无论是牛顿力学还是相对论,都在干一件事:预测未来。物理最早就是在研究天体的运动,第谷、托勒密以及我想不起来名字的种种都在通过记录、观察行星运行的数据,从其中总结出经典的力学定律。至少现在的建筑、机械都离不开力学,汽车、飞机简直把物理学发挥到极致了。

后来爱因斯坦提出了相对论,物理定律做出了修正,预测的更精确了。这是成功的根据历史预测未来啊有木有。

踢球的贝克汉姆

虽然物理学让我们造出了汽车、飞机,但是,日常生活中很多事,其实并不需要物理公式的介入。例如贝克汉姆也许会在赛后没事计算一下自己踢球的弧线公式,但在场上开任意球的时候,他的脑袋里一定不是在算公式。

人类通过不断的trial-error,大脑会对碰到的模式进行总结、固化,形成肌肉记忆。这与更高级抽象的物理公式是完全不同的approach。踢球的大脑通过多次重复形成的记忆,以及对当时场上的情况作出了预判,判断出该使用怎样的力量、角度、击球点,来指导黄金右脚踢出漂亮的弧线。这里并不需要高层的抽象建模。

人类天生就会预测未来!不然我们怎么生活的啊!

马饲料和石油

曾经有人担心马饲料不够,因为按照当时马匹的增长速度,以及饲料的种植程度来看,很快马饲料就会不够用。然后,人们发明了汽车,马儿再也不用担心饿死了,但估计要担心直接被处理掉= =b。现在很多人担心石油会枯竭,有各种各样的预测数据。但会不会也是马饲料呢?长期预测,总是不那么靠谱的原因是,突然、巨大的变化总会存在,虽然一定时间内,是渐变的。

如果仅仅根据数据,预测下个月饲料价格,我倒觉得是十分靠谱的。

短期预测和长期预测

《失控》中对历史预测未来的结论,是长期预测不靠谱,而短期预测恰恰相反,是很靠谱的。我完全可以说下一秒我的电脑还是好的,但是10年后我就不敢说了。因此华尔街会雇佣预测公司,短期预测股票的涨跌。

不过想了这么多,还是不敢去投资股票。

从需求到网站:(六)大杀器之CMS

这篇文章欠了好久= =b。前面我们讨论了如何从0到1建立一个网站。这里要讨论的是,从1到1建立一个网站。从1到1,对的,网站已经给你做好了!这才是大杀器!

内容管理系统(CMS)

Content Management System,就是字面意思,管理内容的网站系统。那举个栗子呢?例如新浪网就是一个CMS。新浪编辑们把文章(内容)通过管理员界面添加之后,广大用户就可以看到了,好了,就这么多,就是CMS。是不是很简单,so easy。仔细一想,诶,那所有的网站不都是CMS吗?博客肯定是,博主在管理员界面写好文章,然后大家看。电商也差不多,京东的编辑在管理员界面把商品添加进去,大家在网站上看、购买。

说白了,Web2.0的网站都是CMS,都是管理内容嘛,只是具体内容上有不同嘛。新浪管理新闻,微博管理微博,论坛是管理帖子,博客管理博客,电商管理商品。哇靠,互联网也就这么点东西!内容换个词就是信息,这些其实都是信息系统(Information System),这下知道为啥从前都是叫搞IT(Information Technology)了吧。

突然发现互联网搞来搞去也就是CMS,so sad。

不懂代码的建站

我要做网站,别扯CMS这些没用的!

好了,既然大家都是CMS,Web 2.0都几十年了,这些概念都是陈芝麻烂谷子了,也就是说,前任这些网站的代码都写过了呀,我为毛还要再写一遍呢?为了提升我的逼格嘛?没错,就是不需要写了。

订阅我博客肯定知道我的一篇著名博文《搭建个人博客的通用步骤》。咳咳,说著名是因为你看本博客右边→ →的点击量排名。如果你成功按照这个教程建立了自己的博客,请问你在这过程中写了一行代码吗?你需要懂php吗?你需要懂数据库吗?No, so nice.

WordPress就是一个非常完善的开源免费的CMS系统。前面我们提到过框架的概念,就是把一些轮子给你造好了,减轻程序员的工作量,程序员只用写少量代码就可以完成很多事。而CMS建站系统则把这事干绝了,直接让程序员下班了。只要根据教程,不懂代码的人可以很快建立一个网站,程序员你就失业去吧。

后台与后台与后台

在提到CMS的同时,就不得不提一个令我十分恶心的概念,那就是后台。后台直译英文应该是back end。我们在前文提到的后台就是这个意思,就是网站的服务器端,区别于浏览器端(前台front end)。程序员的世界里,大部分时候,后台都是指服务器端,一般是指后台程序,运行在服务器上的代码。

但是CMS的后台,在中文的神奇语义里,又变成管理员界面(Dashboard/Admin Page)的含义。当你搭建一个wordpress网站的时候,编写博客的界面就是所谓的“后台”。经常有人问我,这个网站要改个xxx能不能改,我说要改后台代码,然后他说后台好像没地方改代码呀?呵呵。然后就没有然后了。

(此段可忽略)不过在程序员的世界里,后端(back end)的概念也会随着语境而变化。当服务器端部署的十分复杂,前面有反向代理服务器,后面有网页服务器、业务逻辑服务器、数据服务器等等的时候,前端(front end)又会变成反向代理服务器,有时又是网页服务器,相应的,业务逻辑、数据处理就会变成后端。

国内著名开源CMS

好了,说了半天,你说不用写代码就建站,但也只说了一个博客网站呀,我要建论坛,搞电商,做团购,咋搞?这些还真都有!

论坛-Discuz!http://www.discuz.net/

老牌论坛建站系统,你只要平时经常逛论坛,基本都是用Discuz做的。后来被腾讯收购了。对是收购,不是腾讯自己做一个山寨的。

电商-ECShop http://www.ecshop.com/

似乎成了创业必备,要么淘宝天猫,要么就自己捣鼓一个这个了。

团购-最土 http://www.zuitu.com/

说实话这是google出来的。当年团购红遍天下的时候,遍地都是开源团购系统,才可能出现全国各地都有大大小小的团购网站。csdn有个集锦:五个免费开源团购建站平台

个性化和建站服务

看起来这些现成的造好的汽车是不是觉得世界一片光明美好!但回头想想这样用别人的CMS直接搭的网站还是不靠谱,我要改个背景颜色,换个LOGO,这咋搞?大的CMS都会有自己的皮肤系统,wordpress这一点就很好,有成千上万的皮肤供你选择嘿~慢慢挑吧。

不行不行,那些皮肤我都看不上眼,我的网站如此之高大上,怎么可以跟别人一样?这时,程序员总算又有饭吃啦!就是改网站界面!可是程序员的审美……唔,所以还是一个设计师搭配一个程序员比较好。于是,一个外包团队就成型啦!一个大专设计师+一个蓝翔CSS程序员,从政府到企业,建站这种事,so easy。

外包团队一般来说仅仅帮你把网站做出来,不负责网站的部署。当然也可以负责部署,这种其实就是换个说法,可以称为建站服务了。去域名注册网站、主机提供商网站上看,都会提供建站服务,一条龙,只要你有钱,做网站不是梦~

程序员的价值

既然开源CMS已经如此牛逼了,为毛互联网公司还要程序员呢?程序员的价值存在于下面几点(个人观点):

大流量

免费的代码虽好,但是任何网站一旦做大,都不可避免存在负载问题。京东之前一做活动就崩溃,后来找来个架构师,重新用Java做了一套,最近才没有出什么问题。如何让网站不轻易宕机?如何保证升级网站的时候用户还可以访问?特殊问题,只能通过程序员的努力来解决。

新业务

卖东西嘛,平时松松返券,打打折,搞个买一送一是很经常的事。可是开源电商系统没有办法为你的特殊活动专门做一些页面、功能。这时候就是程序员的活了。

应对变化

其实上面两条,说白了就是应对变化,需求在变,业务在变,技术在变,时代在变,只有活的程序员才能真正应对这些变化,死的系统做的再好,也会渐渐跟不上时代。所以想认真做互联网创业的人,一开始可以不养技术团队,通过外包等等来搞定,想要真正做大,技术团队是必不可少的。业务牛逼之后,技术也不能掣肘。

从需求到网站——上线啦!

订阅我博客的人应该都看过前面的几篇教程了吧~~~

历时两个多月,中间断断续续开发,统计了一下,自己写的代码大约是1500行。当然包括库以及最终部署所需的代码就不止了~

最终,当当当!

requirement-card.com 上线啦!直接可用哦~

具体用法就不在这里说啦,支持图片、富文本、多人协作,等待你去发现哦~

实在不知道怎么用也可以在网站右下角点帮助啦。

各位晚安~