转 商业软件编程很无聊?

这周读到三篇博客帖子。把它们串在一块儿读,对我们的职业发展非常有教育意义。
一篇是Thoughtworks前员工Ravi Mohan写的,《但是马老大,商业编程就是无聊》。Martin Fowler在一篇帖子里说,编写企业软件不光是捣腾数据。并不是只有解决算法问题,操纵硬件,和应用大量数学才有意思。关心顾客(马丁所谓的客户亲和力),全力让自己的软件为客户带来商业利益也是挑战所在,趣味所存。Ravi在帖子里不以为然,认为不管Martin Fowler怎么辩白,商业编程无趣是不争的事实。不信可以看看人心所向。从来只见有天赋的程序员屁颠屁颠地去开发编译器,操作系统,TCP/IP stack, 大规模并行系统,高性能服务器,游戏引擎等系统级软件。哪怕优秀的商业软件程序员也无限渴望去开发系统软件。相反,从来没见那个能靠系统开发软件挣钱的牛程无限向往开发商业软件。这好比柏林墙没倒前,只见东德人拼死冲到西德去,没见有什么西德人拼死要到东德去的(愤青们就不用和我争论东德怎么好了哈。Ravi自己的例子而已。东德好不好关我P事)。Ravi还说,哪怕Thoughtworks内部员工也无限向往系统编程。每次Thoughtworks讨论把生意扩展到嵌入式编程和非其它非企业计算领域时,Thoughtworks的员工们都士气高涨。然后Ravi引了老愤青Paul Graham的话,号称集中精力攻克困难但定义清晰的问题完全是出于自我保护的需要,因为成天解决琐碎问题不能让人学到任何东西,只能让人变蠢。做系统编程给人的满足感比做琐碎的商业编程大多了。Ravi进一步谈到Martin Fowler其实也承认商业软件开发遇到的问题太过随意,很多都是为了满足客户莫名其妙的要求,不会带给程序员成长的机会。他尤其赞同Martin说的“商业编程的真正挑战在于找到软件中能给客户的生意带来切实利益的东西。要做到这点,我们需要扎实的行业知识和技术功底。”。可惜的是,大多数商业软件程序员处于尴尬的境地:论行业知识不如行业专家。论编程技术不如真正的hacker(黑客这个词已经等同于cracker了,所以我还是用原文)。当然,这种尴尬情况在其它编程领域也存在,但症状没有那么严重。搞笑的是,Ravi说其实Martin算是商业程序员里比较幸运的,总有机会和牛人们合作,找出他的代码到底有什么商业价值,而这和普通的“编码人”有本质区别。这也是为什么外包的工作如此无趣的原因:商业方面的分析已经定了。编码的框架已经定了。承接外包项目的程序员发挥余地实在有限,更不用说趣味二字了。作者的要点是,要想让自己的工作变得有趣有意义,要么就下大力气变成业务专家。要么就变成可以玩儿转系统的编程高手。其实系统编程高手也是业务专家。只不过他们的业务领域恰好和技术领域重合。
第二篇帖子是Reg Braithwaite的一篇帖子,《商业编程没有那么难?》。这篇帖子同时引了Reganwald另外一篇短文,《怎么让编程变得困难》。Reg在两篇文章里都谈到了同样的一个观点:商业编程从表面上看来都是广泛而肤浅的。程序员有大量问题要解决,但没有什么问题特别深刻。哪怕你用最新的技术都不足以让普通的商业编程变得更有意义。用Reg的话来说就是用Ruby On Rails编程好比聆听Jaco Pastorius,什么人都能干。只有在复制Jaco的盛宴时才能真正获取学习经验。还是以RoR为例。用RoR远远不够(其实不用也无所谓)。仔细研究RoR的代码,学习怎么设计自己的DSL才是正道。在《商业编程没有那么难?》里面,Reg举了三个例子。一个是从信用卡的使用情况实时判断被使用的信用卡是否被盗。一个是实时卡车调度问题,能针对路矿和递送要求优化卡车路线和发车时间表。还有一个是销售辅助系统,能学习潜在客户的特质,帮助销售决定是否跟进。嗯,两个模式识别和学习问题,一个调度和网络流优化问题。都是非常有挑战性的问题。都可以让一个普通的商业项目变得趣味十足(当然也能让我们的压力陡增)。当然,如果你对每月一张固定的工资单感到满意,知道自己的工作马上就要外包给西贡的大学生也能安然入睡,就不用自找麻烦了。作者的要点就是:挑战不是别人给的,而是在勃勃雄心驱使下,你自己找的。也许以后做每个项目时,我们应该给自己找点有挑战性的问题,激发自己的潜力。不然做的项目再多,也不过浪费人生。
第三篇帖子是XML发明人Tim Bray的一篇短文。在Tim的努力下,JRuby的两个主程加入了Sun。新闻公布后Tim收到几乎所有JVM语言作者的询问,问为啥子Sun独选了JRuby那俩哥们,能不能给其它JVM语言也提供支持。于是Tim谈了JRuby受到重视的原因。首先,没人要求,没人给钱的情况下,这俩老大投入大量精力,运用各种技术把半死的JRuby项目盘活了。其次,JRuby背后有活跃的社区(大半因为Rails的风潮)。第三,他们善于交流,到处做报告,做让人印象深刻的演示,展示项目进展。第四,他们不断发放高质量的代码。每个版本都较上个版本有长足进步。也就是说,他们证明了自己的能力,展示了自己的领导才能,更重要的是他们不断交出优秀的作品。职业培训里常说要想事业顺利,要做到两点,搞出事(make things happen),和搞定事(make things done)。JRuby是个很好的例子。
帖子的教育意义很明显,俺就不用在罗嗦了吧?


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1236675

转载于:https://www.cnblogs.com/JYun/archive/2006/11/28/574724.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外中断02 - 零基础入门学习汇编语言70

第十五章:外中断02 让编程改变世界 Change the world by program 小甲鱼和大家谈谈心 一个帖子引发小甲鱼的反省! 猫姐曾经说过,步子别迈太大,容易扯着蛋! 结果还真蛋疼了…… 因此,小甲鱼要学会淡定…

蛇形填数

描述 在n*n方阵里填入1,2,…,n*n,要求填成蛇形。例如n4时方陈为&#xff1a; 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 输入 直接输入方陈的维数&#xff0c;即n的值。(n<100) 输出 输出结果是蛇形方陈。 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 代码如下 …

c#数组获取元素的索引_获取元素集合 从C#中的指定索引

c#数组获取元素的索引Given a Collection<T> of integer types, and an index, we have to access the element from the given index. 给定一个整数类型的Collection <T>和一个索引&#xff0c;我们必须从给定索引访问元素。 To access an element of the Collec…

linux清理缓存cache,Linux清理cache缓存

当cache缓存占用太大&#xff0c;服务起不来&#xff0c;需要查看清理缓存查看缓存&#xff1a;free -m输入运行下面一行&#xff1a;echo 3 > /proc/sys/vm/drop_caches# 释放缓存区内存的方法1)清理pagecache(页面缓存)# echo 1 > /proc/sys/vm/drop_caches 或者 # sys…

c和汇编混合编程----shellcode----弹出计算器

先用c和汇编混合编程成功弹出计算器&#xff08;在VC里运行&#xff09; #include "stdio.h" #include "windows.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll"kernel32.dll";libHandleLoa…

[导入]转:世界小姐形容他们国家male organ

世界小姐眼中的最后一问&#xff1a;形容一下他们国家male organMiss Universes last Question 环球小姐最后一题 Question: Ms America, how do you describe a male organ in your country? 问&#xff1a;美国小姐&#xff0c;请形容贵国男性的性器官。Ms America: Well, I…

scala字符串替换_如何在Scala中替换字符串中的正则表达式模式?

scala字符串替换Scala | 替换字符串中的正则表达式模式 (Scala | Replacing a regular expression pattern in a string) Replacing a part of the string that matches our given regular expression can be done using multiple methods. 可以使用多种方法替换匹配给定正则表…

有趣的数

描述 把分数按下面的办法排成一个数表。 ① ② ⑥ ⑦ 1/1 1/2 1/3 1/4… ③ ⑤ ⑧ 2/1 2/2 2/3… ④ ⑨ 3/1 3/2 … ⑩ 4/1… … 我们以z字型方法给上表的每项编号。特定方法&#xff1a;第一项是1/1&#xff0c;然后是1/2、2/1、3/1、2/2、1/3、1/4、2/3……。编程输入项号N&…

linux系统的层次结构,关于Linux操作系统层次结构分析

本文转自http://www.jb51.net/LINUXjishu/214104.html首先来看一张图(这是Linux操作系统的大致层次结构)&#xff1a;最内层是硬件&#xff0c;最外层是用户常用的应用&#xff0c;比如说firefox浏览器&#xff0c;evolution查看邮件&#xff0c;一个计算流体模型等等。硬件是物…

Windows Vista版本比较

Windows Vista上市在即&#xff0c;对许多朋友来说目前急待解决的问题便是&#xff0c;在升级或购买时应该选择Windows Vista的哪个版本&#xff0c;哪个版本更契合自己的应用需求&#xff0c;究竟应该选择Windows Vista Home呢还是Windows Vista Ultimate?等等。 之前在Windo…

shellcode---c和汇编混合编程---弹出cmd

首先用C/C语言实现弹出cmd #include "stdio.h" #include "windows.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll"kernel32.dll";libHandleLoadLibrary(dll);WinExec("cmd.exe",S…

ajax 复制到“剪贴板”

有时候可能会做一些“复制”按钮的功能&#xff0c;当用户点击“复制”按钮时&#xff0c;就会将要复制的内容复制出来&#xff0c;以下代码即实现“复制”按钮的功能。该功能需要用到AJAX的PageMethods来调用页面后台代码来实现。 调用PageMethods&#xff0c;需要引用 <sc…

找到最大回文子串_使用O(1)空间复杂度找到最大的回文子串

找到最大回文子串Problem statement: 问题陈述&#xff1a; Given a string, you have to find the largest palindromic substring using O(1) space complexity. 给定一个字符串&#xff0c;您必须使用O(1)空间复杂度找到最大的回文子字符串。 Input:T Test caseT no of in…

日期计算

描述 如题&#xff0c;输入一个日期&#xff0c;格式如&#xff1a;2010 10 24 &#xff0c;判断这一天是这一年中的第几天。 输入 第一行输入一个数N&#xff08;0< N<100&#xff09;,表示有N组测试数据。后面的N行输入多组输入数据&#xff0c;每行的输入数据都是一个…

c语言程序设计编程解读,【答题】C语言程序设计问题与解释实验

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#define N 13main(){int y,m,D,q,t0,i,day0,a0,Day,n,k,O[N]{0,31,29,31,30,31,30,31,31,30,31,30,31},p[N]{0,31,28,31,30,31,30,31,31,30,31,30,31};//y是年&#xff0c;m是月&#xff0c;D是日&#xff0c;q计算周几&am…

blog的转变

从技术为主的blog&#xff0c;变为记录生活琐事的blog&#xff0c;OMG&#xff01;天气晴朗&#xff0c;不过心情并不怎么轻松&#xff0c;论文下周必须要写完&#xff0c;同时留校结果也就该出来了。曾经一度以为&#xff0c;一个人最快乐自由。不过不得不承认&#xff0c;或许…

没有值的json字符串_Java中具有原始数据类型值的字符串连接

没有值的json字符串Given a string and some of the primitive data type values, we have to concatenate them with the string in Java. 给定一个字符串和一些原始数据类型值&#xff0c;我们必须将它们与Java中的字符串连接起来。 In the example below, we have declared…

a letter and a number(一封信和一个数字)

描述 we define f(A) 1, f(a) -1, f(B) 2, f(b) -2, … f(Z) 26, f(z) -26; Give you a letter x and a number y , you should output the result of yf(x). 我们定义f ( A ) 1&#xff0c;f ( A ) - 1&#xff0c;f ( B ) 2&#xff0c;f ( B ) - 2&#xff0c;…

c语言初始化字符数组为空,怎么把已经初始化的字符数组设置为空?

怎么把已经初始化的字符数组设置为空&#xff1f;两种方法&#xff0c;如下所示。方法一&#xff1a;代码演示#include #include int main(void){char a[]{x,y,z}; //定义字符数组&#xff0c;并初始化int i0;for(i0;i<3;i)printf("%c\t",a[i]); //输出初始化的数…

C和汇编混合编程---栈平衡

最近在搞C和汇编混合编程&#xff0c;对栈平衡有点小理解&#xff0c;记录一下 当我们调用一个API或者子程序时时&#xff0c;API和子程序可以理解为函数&#xff0c;我们不必在返回的时候平衡栈里面的函数参数&#xff0c;但C语言库函数要我们自己平衡栈数据&#xff0c; 比如…