11/2/2014 0 Comments (11)软件工程(11)软件工程 李革胜,2014-11-02 G同学是A大学软件工程实验室讲师,他的教学工作是给大四计算机电子类本科生讲授“基于Android系统结构层化程序设计”课程。G同学申请到给大学停车场开发停车场付费软件横向项目,为了方便市民停车,可以使用手机App购买停车位。A大学停车场遍布温哥华市中心的各个校区,有上千个车位,一个看上去简单的手机车位管理系统其实蕴含丰富的计算机软件编程技术伦理,一句话,技术伦理与技术本身同样重要。 首先,Android程序设计的骨架--MVC本质上是模型,图形与控制系统。界面用android studio 贝塔版,安卓虚拟机,其中模型是处理数据库的构件,如ColdFusion Components,eclipse ADT,Android studio,SDK Manager。图形是用户看到并与之交互的界面,通常就是由HTML元素组成的界面,或由Adobe Flash和XHTML、XML/XSL等一些标识语言组成的界面。控制器是种servlet,其功能是接受输入指令并调用模型和视图去完成需求。它不象ASP与PHP那样过程化语言创建,而是以模型与图形分离的形式出现,即内容与显示必须分离。ASP等过程化语言,如果发现Bug,程序员往往不得不面对的"牵一发而动全身"的全面修改捉虫过程,而基于MVC程序设计,程序只要修改相应层,就可达到捉虫的目的。图形师更改界面不用程序员,程序员修改控制器不用打搅数据库管理员。MVC Android 的最大优势是多个视图能共享同一个模型,其可维护性高,适用性好,成本低等优点。G同学就是这样每周三的上午在课堂上给他的学生讲授MVC Android程序设计,并注意把它们用于实践。 其次是程序设计的经验问题,比如,Android有缓存进程功能,即使一些activities finish,它的一些静态变量仍然保存当前值,安卓程序会产生一些非常荒唐的结果。UI线程应该只做与用户交互或数据显示任务,耗时的工作应该用独立的线程去完成,而不是放在UI线程中。 其次项目下来后,G同学的首要工作就是招两三个助理程序员。G同学雇人一向是有教无类,不管申请人的历史,人种,肤色,教育家庭及社会环境,只要是合适的,就毫不吝啬用人不疑。公平不偏心无偏见是老板的基本素质,如果老板对雇员没有信心,瞻前顾后,雇员恐怕对老板也没有信心了。G同学用人有个窍门,要用一个人,首先必须深入了解他/她,因人而异不拘泥于固定程序。 每个人都有其特长,性格上有优点也有瑕疵。发挥员工的长处和特点是老板天然的责任,根据员工的基础、背景、特长和性格在工作过程中有针对性地采取措施,让员工的潜力得到最大发挥。人才都必须用在刀刃上,才不辜负上帝造人的最初愿望。如果不了解员工的优点与特长,就很难给其一个合适的工作任务,同事间也会产生人际纠纷矛盾与利益冲突。 由于是校园招聘,职位对所有人开放,没有工作许可的国际学生也可以申请。雇人广告在大学BBS贴出半小时后,工作申请汹涌而来。面对堆积如山的工作申请资料,G同学不得不发明一种“模块化”处理办法,既节约时间减少了工作量,又能很好地答复申请以确保其知情权,并保证自己雇到最合适的雇员。首先是是否具备必要的软件编程知识,其中最重要的是独立自学能力与独立解决问题能力。计算机编译环境与编程软件一年一更新,技术更新速度快于个人学习速度,学得太慢就会被市场淘汰。要能适应多元文化的工作环境,实验室的雇员来自世界各地,必须能与他人良好合作。 G同学收到一封邮件,是中科大留学生K同学的自荐信,打开邮件,照例是恳切的言辞和信心满满的誓言,加上能够充分展示其软件编程综合素质的各种证书,如微软数据库,微软操作系统程序员,互联网程序设计证书等,甚至能从中能够看到其急切盼望来实验室上班的期待眼神。G同学意外感觉其附上的成绩单印章很陌生,曾在科大教务处短期工作过的G同学敏锐发现其成绩单被改动过,遂不动声色,给科大校办打了个电话,自从G同学成绩单事件后,加拿大A大学早就与中国各名牌大学有互通成绩单协议,根据该生学号很快找到其原始成绩单,果然发现其成绩单中的补考成绩被改成A等。对于这样的申请人,软件工程实验室的回复如出一辙:“很感谢您的工作申请,但我们已经有更合适的人选。我们会保留你的申请三个月,如果有合适你的位置,我们会尽快与你联系。最后谢谢你的申请,祝你在今后的工作申请中好运。”后来,G同学觉得仅仅因为其成绩单造假,就拒绝一个有前途的学生不合适,决定给K同学一个面试机会,因为一个人敢拿假成绩单申请工作机会,如果不是有真才实学,就是个傻子。G同学决定多给K一个机会,还因为他仔细研究过K的本科成绩单,K在中科大是物理化学与计算机双学士学位,“数值分析”课程得了98%的高分,“量子力学”90%,“固体物理”95%,在人才济济的中科大能取得这样的成绩肯定是尖子生中的尖子,人才难得。 K同学收到面试电话通知后准时来实验室参考考试,其实是个小小的软件能力考试,约有45分钟的题,主要是微软程序员证书考试试题, 如 若内存按字节编址,用存储容量为 64K×32 比特的存储器芯片构成地址编号 A000000H 至 DFFFFFFH 的内存空间,则至少需要多少 片? 对 于 n 个 元 素 的 关 键 字 序 列 {k1 k,2,..., kn } , 当 且 仅 当 满 足 关 系 ki ≤ k i2 且ki ≤ k i2 +1i2( ≤ i2,n +1 ≤ )n 称其为小根堆,反之则为大根堆。以下序列中,不符合堆的定义,等。K同学花了30分钟完成45分钟的试题就交卷了,其效率让G同学非常满意。G同学亲自批改了K的试卷,发现K同学编程能力与软件知识没有任何问题,在面试时问了K三个问题,1)why did you apply for this job? 2)what can you for us that someone else cannot? 3)can you tell me a little more about your interest conflicts and how did you solve them? K同学对答如流,给人感觉是事先准备好的。因为申请资料有瑕疵,G同学对于是否雇佣K有些犹豫,他自己的个人经验让其决定多给K一个机会。因为软件工程的门槛非常低,只需数学逻辑与相应的编译环境,是纯粹的脑力劳动。软件工程的一个特点就是概念特别多,新词汇层出不穷。G同学自己年轻时申请软件工程师职位就被拒过,因为当时英文面试官问了他一个新概念,他明知很简单,就是事先没有准备一时张口结舌没有答上来而已,结果失去了工作机会。雇人的目的是为了用合适的人完成项目,不能太拘泥细节太看重面子功夫。不管怎么样,G同学考虑再三还是决定给K同学这次工作机会,把K本科成绩单的问题暂时放在一边,谁年轻时不犯错呢? 因为手机APP类程序设计进入门槛低而影响大,但是缺乏规制与道德约束,技术本身没有道德性可言的,只有规矩能赋予其道德性。如果App程序员个人道德低下,很容易偷取用户的个人信息如信用卡号,汽车牌照等,侵犯用户的个人信息权,会造成一些使用该APP的个人隐私信息被暴露。所以,程序设计工作必须考虑程序员的人品问题,G同学雇人非常慎重,从不率性为之。 G同学雇的第二个程序员是自己的学生H同学,H同学是个印度人,G同学猜H应该不是锡克族,因为从来没有见过他戴头巾。G同学对H的印象非常深刻,H同学第一印象让人想起三国时期蜀汉名将张飞,一个燕颔虎鼻,豹头环眼的彪形大汉。身材高大的H同学总是坐在教室最后一排的角落,上课从不迟到,也不早退,回答问题大多时候中规中矩恰到好处。G同学发现H学习非常用功,做功课粗中有细,交作业从不迟到,也从不出错,连语法错误都很少,一句话,H同学是个有心人。H同学感觉敏锐,理解力强,有正义感。G同学在课堂上讲的Android MVC设计模式所提倡的一些原则,像内容和显示互相分离的概念一般的学生刚开始都不太容易理解,因为其常常需要隔离模型、视图和控制器的构件,对于应用程序不能用C语言或ASP等过程化语言进行编程,使用MVC的程序员必须有能力应付构件分离的额外工作和复杂性,一句话,MVC企业版是给高智商程序员使用的。很多学生开始时觉得该课程非常枯燥无聊而且难以理解,而H同学一下子就明白了MVC中的模型层,显示层,控制层会使其软件在健壮性、代码重用和结构方面都上台阶上档次,并第一个完成了课堂作业。当G同学收到H的职位申请,也没有仔细看他的工作许可,马上拍板给他工作,因为G同学注意到H的天赋与能力已经很长时间了,无需过多考虑。加拿大留学生毕业后可以获得一种叫openwork permit的签证,这是一种不限制雇主的全职工作许可证。凡是在加拿大当地完成至少8个月以上课程获得高中以上学历,即可申请这种可长达三年的工作签证。所以,G同学对于国际学生的工作许可没有太多的考量。 J同学是在温哥华本地长大的白人小伙子,本科学工业设计还兼修了犯罪学的课程,他是个美工人才,在大学停车场当了一年保安,他的记录是一天开过53张停车违章罚单,被其老板成为ticket machine“罚单机器”。他给停车场的规划提过一些有益的建议。J同学是停车场董事会(Parking Board)推荐过来的,他还有个特长就是人际沟通能力强,并熟知不少在温哥华Downtown厮混的地痞,生意人与流浪汉,毕竟温哥华Downtown的犯罪率在全加拿大是非常有名的,而停车场是这些人与犯罪嫌疑人时常出没的地方。一句话,J同学对停车场规划方面的建议对程序设计非常重要。 G同学用人有个特点,他喜欢旁证,他曾仔细研究过J的业余生活,发现他的朋友很杂,其大量业余时间都花在和朋友喝酒聊天看电影上, 年轻人喜欢热闹无可厚非,但业余消遣太多,他还会有多少时间花在工作上。看一个员工的业余生活也可以看出该员工的工作热情精力及投入程度,还是有些道理。 第三程序结构设计是项目的开始。由于传统原因,如果是硬币投币买车位,温哥华的停车场从不找补零钱,就象北美的公共汽车司机从不找零钱一样,这样做可以节省雇Cashier的人工费,降低停车场运营成本,工作效率也高很多,最终受益的还是消费者。在软件的第一个用户界面,G同学开始设计用醒目的大字提醒顾客“没有零钱找补”,“Change is not given.”后来他发现亚裔顾客比较多,就把提醒改成,“No change is given.”这更人性化,更符合温哥华当地人讲英文的习惯。 做生意就是这样,先小人后君子,童叟无欺。 软件必须好用,初级程序员很少站在用户的角度考虑问题,总是顺着自己的思路设计程序。太多的“Yes/No“问话框会让用户心烦。70% 以上的功能没有用,所以一个成功的软件不在是否功能多,而在是否实用,小巧与效率。程序设计一些小的地方,如,有个美国顾客的车牌号是“Null”,大多数系统都默认”Null“为空,让该顾客常常免费停车。 停车场董事会要求使用新的系统,即顾客购买车位时用自己的车牌号,license plate number,其好处是给顾客提供更好服务与方便。在温哥华一般有四种停车系统,最普通的就是在马路上投硬币的Meter,Meter上有电子钟显示可以停车的时间;第二种就是中国领事馆附近的停车场那样用的是买车位号码;第三种是有Paystation可以用信用卡或硬币买停车票,并把车票放在汽车dashboard上;第四种就是在停车场出入口有Cashier收费,一般是根据停车时间长短离开时收费,也可以停车后预付停车费。 显然第一种系统不合适,每个车最少四个车位需要一个Meter,管理成本高。而且Downtown小偷特别多,吸毒者缺钱时大多拿个钻头到路边Meter偷硬币。第二种系统也不合适大学停车场,因为学生上课下课需要开车进进出出,买车位票这时就很不方便了。第三种办法好,但停车场不好管理,就象温哥华的天车站,汽车站总有不三不四的人逛来逛去,向下了车的旅客讨要没有失效过期的车票。J同学曾戏成这些人是 entrepreneurs,凡是使用第三种系统的停车场常年饱受 entrepreneur们的骚扰之苦。其实,停车场允许一张车票在有效时间内不同时段两辆车合用,只是不允许两辆车同时使用同一张车票。 问题是entrepreneurs在停车场讨票卖票的行为骚扰其他顾客,我付了停车费为什么要在停车场受到骚扰?而且停车场是停车的地方,不是做交易的地方。如果 entrepreneurs在跳蚤市场, 或Craiglist互联网站转让停车票应该是没有问题的。第四种停车场就象超市里收款员,不付停车费就不能把车开走。其缺点是显而易见的,最后一种系统,虽然有可以避免逃票等优点,但需要雇三个Cashiers,成本高,最重要的是这种模式在崇尚自由的加拿大很容易引起人的反感,得罪顾客可不是好玩的。 使用车牌号的方法把这些缺点都克服了,毕竟让所有的人都满意的生意是难事。对于老年人来讲,经常记不住车牌号,容易输错。一旦车牌号输错,G同学只能建议他们把票放在Dashboard上,让查票保安知道该车已经购买车位。J同学有次查票发现Seahn Young,一个中等身材,30岁左右,衣衫整洁看上去谦虚的亚裔经常在停车场用其信用卡帮其他人买票从中赚钱,遂建议软件设计时,同一信用卡最多只能买三次,这样杜绝了停车场黄牛投机倒把。停车场保安每天要巡逻15个以上停车场,停车场购票系统实际上设计成了个类似赌场的商业场所,Downtown很多人停车逃票,就是为了赌一把图个乐,停车场保安抓住了就认罚,抓不住就赚,愿赌服输。J同学经常抱怨有人用现金贿赂他,停车场票价格一般是12.5刀12小时,有人没有带信用卡,用硬币嫌麻烦,通常摸张10刀贿赂保安,自己也方便。在软件设计中,干脆把价格定成10刀12小时,既不违反市政府的定价标准,又杜绝贿赂。 J同学有天在停车场发现一辆卡迪拉克豪车,刚开始他还以为自己看错了,能开这种豪车的大款会停车不付钱,是车牌号输错?还是第一次在这里停车没有找到Meter?他正犹豫时看到平时睡在停车场楼梯间的乞丐Kevin钻进豪车,打开引擎准备开走。J同学是个警惕性非常高的保安,他认定Kevin是个偷车贼马上把他拦下来,Kevin怕J报警赶紧拿出驾照,汽车保险与车钥匙证明卡迪拉克是自己的。Kevin请J给他一张罚单了事,因为靠乞讨为生,银行不给他信用卡,今天没带零钱想赌一把停车才未付停车费,没想到被J抓个正着。Kevin无奈地告诉J,因为没有工作政府每个月给他$1,079补助,他睡在楼梯间是为了省钱,这个豪车是他多年在Downtown行乞积攒起来的,求J同学可伶可怜他放一马。J同学后来通过车牌号一查果然车主是Kevin,排除了偷车的嫌疑,以车牌号为车位购买系统的优势就显出来了。 在软件设计中还加入人工智能系统,自动给顾客节日折扣,用手机付款后自动给客户发收据,上面有时间地址金额等,方便顾客随时查看自己的车位是否过期是否需要延长等。手机软件设计自动记忆,顾客只需一次性正确输入车牌号,不用担心下次购票时车牌号输错给自己带来不便。一句话,用手机停车真是太方便了。 方便也是双刃剑,J同学很快发现,有大学生不买票,手里握着手机坐在教室临窗面对停车场,看见穿制服保安来查票,不慌不忙打开App,只需一秒钟就买好30分钟的最小停车费,每天最多买1.5小时的票就免费停一天。有天,一个大学生拿着罚单找到J同学要求取消罚款,其理由是J同学查票时该学生碰巧课间休息上厕所去了,没有看到查票保安,搞得J同学苦笑不得。该停车场不得不改变软件付费环境,只提供30分钟与12小时两个选项,每张信用卡一天最多买两次以应乎逃票。 第四管理,G同学用人首先是公平无私,对下是赏罚分明?软件开发,很大程度上是老板的管理问题与员工的态度问题。如果没有赏罚分明的制度,很容易导致部分自制力不强的员工工作上产生懈怠心理。 J同学是个效率狂人,干起工作来,效率是第一位的。虽然老板们都喜欢他,但不受同僚们待见。谁愿意和一个工作狂an ambitious workaholic 共事?刚开始,大家都抱怨和J同学一起工作太累,稍偷懒微怠工点就被J的工作业绩远远抛在后面,象G同学那样玩命工作,时间一长谁又吃得消?G同学有自己的看法,工作效率的提高最终受益者是大多消费者,如何把各种人才组合在一起,并避免同事之间的毫无用处的恶性竞争是管理层的职责,所以他对下面各种针对J的流言蜚语处理非常有智慧,从不人云亦云。 J同学因为工作勤奋引起同僚的嫉妒在北美职场最正常不过。J同学好几次发现客人没有付停车费,刚开出罚单,就发现系统里有客人的付费记录。这种情况,公司一般会认定是J同学的工作失误,J同学自己也是跳进黄河洗不清。后来,G同学偶然发现是数据库管理员因嫉妒为了栽赃J同学,他先把客人的付费记录屏蔽,让J同学的APP收不到信号。等J同学的罚单开出,管理员马上就知道了,随即撤销数据屏幕,把自己数据库的问题洗得干干净净。这让J同学有苦说不出,时间一长,公司不得不停止J同学的抄牌工作。G同学对北美职场同事之间为了饭碗相互倾扎的现象颇为震惊,他非常同情卢刚。 在程序调试过程中,明明客人购买了车位,G同学却经常发现发现机器里没有记录。这时MVC的优势就显露出来,G同学只需查看SQL Sever里是否有记录,不需逐字逐句地检查控制器中的源代码,果然是数据库中没有记录。他猜测是K同学在家里写好的程序源代码,通过FTP传回公司,再编译后装进了的。如果员工用的是盗版MS SQL Server,就会出现这样的情况。盗版数据库经常会出现数据丢失现象,而数据丢失是随机的,来无影去无踪,查源代码根本看不出端倪。对照正版数据库也不容易发现Bugs,数据丢失是以小概率事件发生的,看上去正版软件与盗版软件没有区别。G同学利用检查实验室机房的机会,发现K同学在使用免费的FTP软件,并在K同学的办公桌上偶然发现中文版MS SQL Server,因为盗版软件没有精美的包装,没有正规的条形码,与正版软件很容易区别的。后来,H同学悄悄报告G同学,他与K同学聊天时,K同学无意之中泄露软件是在中关村买的盗版数据库。H同学建议G同学解聘K,因为如果继续聘用,可能损害实验室与G同学个人的信誉。后来,K同学发现H在背后告密,他感觉很委屈也很无奈,G同学是H的程序设计老师又是其顶头上司,H同学对G知无不言言无不尽也是理所当然。K同学这是把中国的人际关系生搬硬套到了加拿大。北美职场素有告密文化,老板付薪水给员工,员工为了公司的利益把别人的秘密告诉老板才是理所当然。G同学最忌讳在工作场所搞宗派主义与山头主义,这样会公私不分,造成经营成本昂贵。 G同学发现软件中有一个Bug,车牌号排序应该是不分字体的,Font,但他就是发现了车牌号排序混乱,这对每天查上千辆汽车的保安非常不方便,后来发现软件是根据相同字母不同字体来排序的,Arial字体排在TimesNew Roman之前,看上去车牌号排序混乱不堪。G同学估计是有人抄袭了盗版源代码。他早就猜到K同学编程进度比一般的程序员快很多的原因就是在家里悄悄加班,用盗版软件和抄袭现成的源代码,一些复杂的控制器普通程序员需要一周时间才能调试成功,如果有现成的开源代码,K同学一小时就可以做完。毕竟抄袭的效率比逐字逐句写Code要高很多。有次,G同学在周四的小组会议上稍微表扬K工作效率高,写Code进度快。年轻人就是沉不住气,K同学会后无意之中给H说漏了嘴,他是抄了现成的开源代码,并建议H同学也这么做,还给H同学许多免费源代码网址等。没想到H同学马上用手机把这个情况告诉了G。G同学只好连夜把K同学写的源代码翻出来检查,并通过实验室计算机上的Cookie顺藤摸瓜找到K同学下载代码的网站,通过对比很快发现大部分K抄袭的Components,证据确凿。一旦发现木马程序或盗版软件,这时企业版MVC的优势就体现出来了,只需关闭或改正不合格的Code就可以了, 不必对整个软件进行大手术,真是磨刀不误砍柴功。与此同时,G同学也注意到K抄的源代码程序有不少是五年以上甚至十年以上的历史,早过了知识产权保护期,就没有立即发作。G同学颇为自豪的是,他在加拿大十五年的职场生涯从来没有乱发过脾气,从没冤枉过好人,甚至从与人争吵过,因为他相信轻易发怒的人就是蠢人。 从道德的角度,用盗版数据库的确不应该。K同学曾告诉G他会IBM DB2,这让G大吃一惊,因为会DB2本身只是一种技能而已,任何具备高中文化程度的人都可以短时间内掌握,关键是正版DB2数十万美金,一般人哪里舍得买?后来,K同学告诉G他的DB2的知识全是从盗版软件学来的。从专业的角度,盗版让软件公司省了不少培训费用,提高了工作效率。这是个见仁见智的问题,如果是用安全成熟又没有知识产权的现成的开源代码,可以提高生产效率,降低软件成本,最终受益者是广大用户,很多友好的软件公司每年生产大量的免费源代码,本着为了软件产业良性循环的良好愿望来扩散免费源代码。这种组合正规安全源代码的工作不能称为抄袭或作弊行为。正因为盗版的流行,MS Access,SQL Server才能打败Oracle,DB2 等专业数据库,在中关村人人都会用Access,SQL,谁会再用庞大复杂的Oracle?随便到大街上雇一个数据库程序员,其程序设计能力不比任何常青藤计算机博士差。因为有这些想法,G同学悄悄把K同学叫到办公室,推心置腹地要求其停止使用盗版软件并严禁抄袭现成的不安全的源代码,谁知道是不是黑客放在网上的木马程式?谁知道会不会引起知识产权纠纷?毕竟软件还处于调试阶段,没有交货,停车场也没用实质性的损失。G同学决定继续让K在实验室工作,但K的工作他必须亲自过问与检查。每周四下午的小组技术讨论会,K同学必须逐字逐句给大家讲清楚他的Code,保证软件设计工程的良性循环。 总结,还是那句话:技术伦理与技术本身同样重要。手机程序设计门槛低,容易上手。一般的程序员都没有知识上的问题,无论是传授知识,是雇人,是管理还是程序设计,既要保证工作效率也要考虑道德伦理。让所有的人都满意是件难事,但是不能因为困难而轻易放弃。 众人以为美的事、要留心去作。(罗马书,12:17) (三小时初稿搁笔)
0 Comments
Leave a Reply. |
李革胜
CategoriesArchives
August 2016
|