理解——为什么学编程
第二学堂的课程,主要针对非编程专业人士学习而设计。因此,作为理解篇的结尾,我们想谈谈,非专业人士,为什么要学习编程?
既然你找到本网站,并且停留下来学习,想必你肯定已经有自己的答案。所以我想谈的是对所有人都类似的答案,即整个社会在编程这一行业上的发展趋势——当然,只是我自己的看法。
编程的两个发展方向
2007年9月6日,世界第一男高音帕瓦罗蒂去世,据报纸上说:
“我们将在50年之内——对于许多人来说,可能就是一辈子……再也无缘听到和他那样浑然天成的,专业的男高音。”
遗憾!但,幸好,没有人阻挡我们可以自己随便哼歌——
心情好时,心情坏时,
独处时,热闹时……都可以尽情歌唱。
我们都理解:唱歌,是一门专业技巧,更是所有人的一种生活。
如果是编程呢?是否也如此?
20年前,当我是初中生时,有一首校园歌曲非常流行,歌词唱到:“我想唱歌却不敢唱,小声哼哼还得东张西望……”还真别说,小学时我想对吹笛子有点兴趣,可是身为老师的母亲却认为那是不务正业,拿话吓唬:“听说会变成大脖子的!”
20年后,老父老母坐在电视机前看《超级女声》、《快乐男声》,大为感概:“从小就得培养啊~~”——来不及啦,他们的儿子已经成为地地道道的“乐盲”——还好,他们的孙女,还在读幼儿园时,我就给她报上“歌唱班”、“舞蹈班”、“钢琴班”……学好学坏我不强求,反正得熏陶熏陶,培养点基础,等到再过20年后的世界,或许就是多给她留了一条可选择的路。
如果是编程呢,是否也如此?
我想先给出结论:
一方面,像唱歌一样,编程在一个方向上越来越“商业化”,另一个方向上将往“生活化”发展。
另一方面,和唱歌一样,但却更为明显的是,“生活化”的编程,并不就是代表“不专业”。相反,“生活化”的编程需求,同样会催生出专业的编程高手。
请看示意图:

(编程的两个发展方向)
让有需求的人直接编程
编程和其它人类工作一样,都是为解决问题,创造价值。下面我们就来设想一个实际问题。
比如小丁是一家公司的行政管理人员,要负责的大大小小的事一堆,重要的如人事招聘,不太重要的如办公室用品的领用情况登记……她的办公桌上左边一叠应聘资料,右边一本破烂的《办公用品领用登录表》,翻开一看,密密麻麻的记着张三、李四、王五于某年某月月领走水笔、笔记本、打印纸几支几本几张……
有一天老板过来问小丁:今年哪个部门面试的人最多?哪个部门招聘成功率最高?A部门招聘后不太满意人,有哪些可以推荐到B、C部门二次面试?另外,哪个部门今年领的办公用品最费用最高?都是哪些具体的办公用品?最后,老板突然强调了一点:“帮我好好查查,这三年里,是哪个大学毕业的新员工,最频繁领用水笔?”
手工统计这些数据,显然太累了。这就是小丁的问题。如果有当初有个程序来登记,可就好办多了。但是,小丁不是编程专业人士,以前还没来过d2school.com,所以她想请人编写这个程序。不过,这可不是一件容易的事:
老板:不同意!为这么丁点事去找软件公司,纯粹是浪费公司的钱嘛!你不知道现在的软件公司都爱狮子大张口?!
软件公司:狮子大张口?像这样的小软件,我们还不想写了,这个问题啊,你们最好花上十万元,量身定制一套“企业电子办公系统”。
程序员:写一个程序统计“最频繁领用水笔”的人?这算什么事啊?不懂。
小丁:算了算了,就算现在有程序员理解了我的需求,可没过几天,变态老板搞不定又要我统计个什么数据,那时上哪儿再去请写程序的人啊。
如果是小丁自己有两下了,会写程序,我想这个问题就可以完美解决了。
在生活中,还有很多这种情况,比如开车:专业的司机当然还需要,但如果你自己也会开车,在很多时候就会体现出好处。编程亦如是。自己有需求,但需要请别人编程,但这个负责编程的人却不了解你所在行业的需求——有时就像你需要乘车去某个地方,你很熟悉到达那个地方的路线及路况,但请来的司机却是个路盲,七走八错,这时你可能就会想:要是我自己会开车就好了。
编程的分化
“商业化编程”
第一、团队化
原因俺说得很土:因为软件公司都要做大,商业想的首先就是要赚大钱,所以要接大单,要解决大问题,当然也就满心眼喜欢“大规模、大兵团”作战了。
团队中,每个人各自的模块。就算是一只麻雀,也要解剖出个心、肝、胃来,你负责做心,我负责做肝,他负责做胃……如果你想到一家现代化的软件企业里学习编程,恐怕很难有机会了解一个软件完整的开发过程和全部模块。
第二、重复化的工作
伴随着团队化的一个发展,如前所述就是精确分工。分工越细,每个程序员就会越发正确地感觉到,自己是个流水线上的蓝领工人。所做的事不仅仅只是完整软件中的一部分,而且事情似乎在不断重复。
在软件工厂相对发达的印度,程序员就是蓝领工人。我国的很多软件企业的老板,也在盼望着这一天。原因呢?也很土:“程序员蓝领化”有好处:第一好管理,第二成本低、第三生产出来的产品质量稳定。
第三、产业链中的一环
有句话说“人在江湖,身不由己”。软件行业有巨头:微软,IBM,Oracle。国内再大的软件企业,在这些巨头面前也就成了江湖的小混混。小混混去一线直接赚客户的钱,巨头们却有很多财路直接从小混混身上赚。我们往往称这些可以赚其它软件企业钱的软件业巨头,为“上游企业”,其后则是“中游”、“下游”企业。中下游要做一套软件,所用的无论开发工具、还是中间件等相关软件,都必须由直接由上游企业提供,就算是用到免费的软件,抬头一看,往往发现仍然罩在某某巨头巨大的背影之下。
在这种情况下,我们首先会游说客户去做一个客户可能实际并不太需要的软件,或者为软件加入客户并不需要的功能,从而赚取更多利润。其次,我们还可能不得不成为巨头们的说客。让客户花巨资购买巨头们的强大的,但客户实际上使用不了其中多少功能的软件。
最可怕的是:最终卖出去的软件,真的能如果客户所愿解决问题吗?
商业化的编程过程,客户往往不懂得什么程序知识,他们以为自己的问题可以通过写个程序就解决。程序开发商要么因为不懂业务逻辑,所以也胡里胡涂觉得可以;要么是明知答案是“不可以”,但为了赚钱,也拼命点头说:“这种问题,就得靠程序来解决!”。
事实上,客户有很多问题,根本上讲就是管理问题、制度问题、人的素质问题。这样的问题,如果不从内部整顿,而是要依赖于外来的一个程序解决,或许会有所改进,但最终仍是治标不治本。就好像一个人感冒了,不去就诊,倒是花重金买了貂皮大衣穿上,可能真想到治病时,倒没钱了。这是商业化编程中残酷的一面。
“商业化”追求的效果,就是“你需要的,我卖给你;你不需要的,我也要卖给你。”推论就是:你经常为了(给老板)赚钱而写一些没有什么实际意义的程序。有钱赚当然是好处,但编程的原始乐趣,会迅速消失;相反你程序写得越漂亮,心里却会越痛苦——“这样优美的程序,也终将成为用户的摆设!”
“生活化编程”发展方向
第一、大众化
第一种是非专业人士,人人都会编程。让编程像外语、开车、或者普通电脑操作一样大众化。这不仅仅是目标,也是实际需求。前面小丁的例子是一个说明。
第二种是专业人士,但参与“自由软件”的编写工作。像著名的Linux操作系统的编写方式。所有开源软件,说起来“团队”更为庞大,但团队之间扭带并不是直接的商业利益。团队的形式也比较松散,大家分散在世界各自,多数人互未谋面。这样的团化,显然更合适于称为“大众化”,并且事实上,参与开源软件的编写的人,也并非全是以编程为生的专业人员,很多高手一样是“群众演员”。
第二、个性工作
商业化的软件业,这些年在“个性”方面太扭曲了。但这只是像我这样还把软件当成一种兴趣的人——这样人在中国还很多——的看法。对于商业人士,散失个性的软件,不但正常,而且应该。说一个词就明白了“同质化”。譬如电视机。A厂家和B厂家生产出来的电视,在外形或功能上,都不会有太多的差异。打开电视机壳,里面的大量的元件说不定都印家相同商标。
软件行业不仅组装的模块相同,而且组装的方法也相似。因为上游企业不仅乐于出售自己的组件产品,而且买一送一,非常负责地培训使用者把组件组装成最终客户要的产品。
当然,我也要认真的指出:所开发软件散失个性,这一问题的原因,并不在于采用什么组件,也不在于用什么方法组装组件。根源性的原因在于:第一、用户的需求接近,第二、就算用户的需求不接近,软件产商也要把他“修整”成接近。
打个比方,软件厂商像是卖水果的,本来客户有爱吃香蕉、爱吃苹果、爱吃弥猴桃的,但是果农(相当于上游厂家)和卖水果的都嫌水果太多麻烦,于是统一劝说客户吃香蕉最好;于是这世上就没有其它水果了。
果农和卖水果的的为什么只希望种一种水果?他们的劝说又为什么能成功?这其中当然需要果农具备一定的垄断能力——如果全世界只有两家人有能力种水果,我相信世上只有香蕉的事会变成事实。
这正是“生活化”编程的需求,也是它的发展方向。人人都会写程序,自然,你愿意吃香蕉,就吃香蕉,愿意吃沙果就吃沙果——“个性化”就来了——这并不是反商业化。如果你自家种的葡萄,怎么种都是酸的,那我还是建议你花钱买吐鲁蕃产的。
生活化的编程恢复程序的本来面目:一种工具。它往往面对的生活中、学习中、工作中的具体问题,实实在在地写程序,或许也可以赚钱。但有这样的前提:问题不大,程序也不大。解决问题的效果如何?应一目了然。譬如你是一位3岁小孩的妈妈,你可以动手写一些适合于你家小宝贝的小游戏,寓教于乐。效果如何呢?小宝贝喜欢玩上了,就是成功;小宝贝动两下鼠标就趴在电脑桌上睡着了,说明你的程序至少用在你家宝贝身上,是失败了(可以考虑改名为“宝贝催眠程序”)。
“生活化”的程序,是为自己而写,为朋友而写,为你想帮忙的人而写。“生活化”编程追求的目标之一就是:“让程序的用户,成为程序的知音。”这是我们编程的需求、编程的动力,也是我们的编程的乐趣。并且,君子爱财,求之有道,如果你能写让用户感觉是知音的程序,那么程序的真实价值,也一定能为你带来经济上的回报。
我的愿望
商业化编程的理想开发方式就是:让少数人去设计编程的工具、制定编程的规范,而让大多数程序员,去使用这些工具,遵循这些规范,规规矩矩地写程序——理想状态就像小学生填空一样——像流水线一样快速而高质量地生产出软件。这不仅仅是软件业,在其它行业也是如此。比如建筑,一流的设计师当然可以建设悉尼歌剧院;但多数设计师不过是在设计民居;比如绘画,从来没有人反对你去当毕加索,但现实一点的职业还是去当个油画师好了——假如我们是这些行业的职业从事者。
如果你就是希望通过学习编程,来成为一位软件行业的职员,会不会被我以上的“不负法律责任”的语论所阻吓了?这大可不必。事实上,所有的职业都有它的可爱和沉重之处。对此有清醒的认识,抱一个平常的心态,当我们真正开发工作了,肯定会有帮助。我倒看过很多新人对“软件行业”过高期待,兴冲冲地去流水线报道了,实际工作后,心理落差太大,终于半途而废。
然后,本课程事实上丝毫没有兴趣都人如何成为一家软件企业的合格员工;我们的目标是培养一个对编程有兴趣的新人,成为真正的软件设计者。现在你或许明白我的观点了:教人编程,有两个目标:其一是教人如何成为一名软件企业的合格工人,其二是教人如何成为真正的软件设计者。我们选的正是其二。
第二次浪潮
曾经,学习计算机(电脑)就是学习打字,特别是五笔字型。后来WPS排版软件支撑起了大街小巷里的电脑服务店生意。再后来,各行各业中电脑无处不在,很多工作IT化了,我们学习电脑就是学习Office办公软件,再加上个别专用软件,比如财务软件、仓库管理软件等等。似乎这就是电脑学习的最高境界了,其余的,统统成了“等而下之”:不是玩游戏就是上网聊天。无论是哪一类学习,都是定位在一个计算机软件的使用者:别人开发了软件,我们使用;而不是计算机软件的创造者:我们开发软件,别人使用。
计算机的应用,在当今社会几乎无所不在。在这种情况下,社会上专业的程序员——为了区分,我们暂且称为“编程工作者”——往往着力于可以“商业化”的软件设计上。因此,无法完全依赖于“编程工作者”来解决我们手头遇上的一些问题。这些问题,往往通过我们写一些程序解决之后,可以为我们创造出惊人的价值。
说起来,“程序员”并不是一种职业,在全球,许许多多的编程好手,都并不以“编程”求生。编程只是一种能力,一种让学习、工作、或者生活变得更美妙的能力。
十数年前,会使用电脑的人在国内还很少,但现在呢?在工作上,不管什么公司或机构都离不开电脑。在生活中,电脑快成了一件家家户户普及的家电。这种情况下,“会用电脑”,不过是“基本生活能力”。对于手机或电磁炉,或许“会用”就是全部;但对于电脑,这可远远不够。几乎只是用了电脑的不到1%的能力,浪费!更为重要的是,从社会的角度上看,这种浪费就更严重了。每个人手头都会有一些小问题,可以通过写段小代码很简单而高效地解决;或者很多人脑海里都会有一些很好的创意,需要通过电脑程序来验证或演示,但这些都因为没办法去找一位专业的程序开发,或者虽然有专业程序员,却在彼此思路的沟通上出了问题,最终无论是问题还是创意都不了了之。久而久之,可能就麻木了,接受了我们只能用电脑“已有的”软件来解决问题的桎梏。
打破这种扼杀创造力的桎梏的时候,正在来临!学习编程,可以是个人的兴趣,但也是社会的一种需求。因此,它不仅能让你生活更美妙,也能让你的工作更顺利。结论是:除非你学习编程的目的是为了去写病毒、木马,想成为“熊猫烧香”第二或者“野猪烧香”第一,否则我们都欢迎您加入这新的一轮计算机学习浪潮。记住:这一次学习,您的最终学习目的,不再是学这个软件如何使,那个软件如何用;而是如何设计、实现一个软件。
|