我的软件开发生涯 (10年开发经验总结和爆栈人生)
简介
网名灵感之源,智能实验室创始人,从事软件开发超过10年,写过千万下载量软件,热衷开源,写过多个爆栈项目(系统开发技术栈、.Net技术栈、数据库技术栈、前端开发技术栈)。现定居于澳大利亚悉尼,研发经理,从事系统架构开发。
爆栈人生
现在流行说全栈。每种开发都有其相关的技术。您是否觉得难以罗列某种开发所包括对技术(技术栈)呢?
您是否想过:
- 我做的这个职业,究竟包含哪些技术呢?
- 我所掌握的技术这个子集,在整个技术大系这个超集里面占的比例是多少呢?
- 我究竟还没有掌握多少技术呢?
- 面试的时候会考哪些技术呢?
- 那么,开发是否也应该有这样的技术栈概览图呢?
我搜索了很久,没有找到一个符合我要求的“较为全面”地表述各种技术大系的图表。所以我创建了爆栈,覆盖了以下技术栈:
- 系统开发技术栈 https://github.com/unruledboy/DevelopmentStack
-
- 您是架构师/设计师吗?您可以在系统开发技术栈这里找到比较全面的基础、分析、项目/计划、文档、设计/建模、实现、质量、管理、编译、测试、发布、维护、排错和学习等。
- Web前端技术栈 https://github.com/unruledboy/WebFrontEndStack/blob/master/README.zh-cn.md
-
- 您是前端攻城师/设计师吗?您可以在Web前端技术栈这里找到比较全面的浏览器、平台、类库、框架、工具等。
- 数据库技术栈 https://github.com/unruledboy/DatabaseStack/blob/master/README.zh-cn.md
-
- 您是数据库开发人员/管理员吗?您可以在数据库技术栈这里找到比较全面的关于SQL Server和Azure等数据库系统的技术细节。
- .NET技术栈 https://github.com/unruledboy/DotNetStack
-
- 您是.NET码农吗?您可以在.NET技术栈这里找到比较全面的关于.NET技术的框架、平台、IDE、开发包、桌面系统、web开发、SOA、数据访问、生产力、组件、工具等信息。
这些技术栈不仅提供相关技术的描述、网站、GitHub地址等,还提供交互式的HTML预览,方便你全面理解各种技术点的关系。
不管您是否前端攻城师/设计师、数据库开发人员/管理员还是.NET码农,我们都欢迎您加入我们的行列!
爆栈的官网:http://overflowstack.github.io/
软件生涯的开始
上初二,学校开了电脑课。电脑老师叫邓腾飞,
第一次上课,眼睛里看见的是一台台白色的机器,带了个像电视的东东,能显示东西,真神奇。课程上多了,觉得电脑挺好玩的,感觉就像在跟电脑交谈,而且比较听话,从来没有人这么听我的话。不过问题来了,当时安装的是DOS3.x版,满屏幕是英文,很多都不认识。这个时候我就更加希望能把英文掌握好。
到了初三,终于有了属于自己的第一台电脑,386,DX40,4M内存,120M硬盘,当时感觉很好了。以前是一个月才回家一次,有了电脑后就常常回家了,一到家就“抱”着它,经常捣弄到凌晨4-5点。
后来电脑升级了,486,DX80,开Turbo的,4M内存,210M硬盘,光电鼠标,还带个钩可以挂到显示器边上的,很有趣的设计。至今,这台电脑还放在老家,或许,多年后,要么放博物馆,要么给孙子说:你看,你爷爷当年的电脑是这样的。
初三毕业,会考,我的英文拿了满分,英文老师很替我高兴,说这么多年没有人拿这么高分,说要奖励我一本英文语法书,名字忘记了,但我仍然记得封面颜色是红是的,而且到现在还保留着,放在老家。当时就有那么一个念头:我是为了电脑学好英文的。
电脑老师的电脑,记得是Novell的无盘工作站,我们当年为了要拿权限,试图模拟个登录界面,荡老师输入密码时,这样我们就可以盗取了。不过最后没有成功。后来学生们的电脑用上了DOS 3.x。先用的GWBASIC,后来接触了Quick BASIC和Pascal。
上了高中,在电脑课中认识了几个志同道合的人,我们平时会常常交流技术。但大家都想做自己的事情,成立自己的工作室。这跟我以后所认识到的个人英雄主义很类似。我记忆中最大的便是我们几个曾经在一个暑假中进行一个比赛,用自己最熟悉的语言写一个程序,比一下技术水平,看看谁写得更好,可惜最后不了了之(没有评比)。当时大家的作品我仍然保留着,后来一次硬盘坏了,所有以前研究的东西都没有了。
其中一个厉害的家伙是张敏锋,他在DOS下利用QuickBASIC实现了一个类似x-windows的图形化的界面 ,支持中文直接写屏、鼠标、带中文输入法、图片(自己定义的位图格式!)、动画和音乐,实在让我惊叹不已!可惜他现在不再写程序了,实在太遗憾了。
另外一个是“道友”,他更牛,特别擅长用PASCAL和QuickBASIC,他的算法功底很扎实,经常给我们演示他写的算法,并用图形表现出来。后来他上了大学了,用Delphi+DirectX写了一个很著名的《决战坦克》,效果好得不得了。多年前他在珠海金山公司开发WPS。
还有一个,名字忘记了,用汇编写了个图形功能库,在QuickBASIC中调用,实现真彩色,因为QuickBASIC的Screen12模式就支持16色。可惜现在不他的知道下落。
还有一个,阿祥,用PASCAL的牛人,实现了类似张敏锋的图形化界面,多年前他在腾讯公司写QQ。
还有一个,Chicken,这家伙最喜欢钻研技术,从DOS下的QuickBASIC到Windows下的Visual BASIC,再到VC++,再到Java,多年前在21CN做开发,现在在创业。
还有一个,Silly,这家伙好像学了10多种语言,有一些我根本没有听说过的。现在下落不明。
实际上,我们高中毕业那一届出来的,很多出来都做软件开发,可能是那一年开始市场比较热吧。
事实上,我们从正规电脑课程中没有得到多少专业知识,这应了一句老话:师傅领入门,修为在个人。在高中的时候,我们做了不少荒唐事情,其中一件跟学习电脑最难忘的是:我们“入侵”电脑老师的房子。
那应该是在读高二的时候,一个周末,我们几个热衷学习编程的在学校留宿的同学,跟平时一样,到电脑老师的房子用他的机器,因为周末的时候电脑室不开,而且电脑老师也乐意于让我们学习电脑。但那个周末老师不在家,而我们习惯了每个周末都用他的电脑,大家又没有钥匙,碰巧另外一个老师经过,说:"break in啊",当时就震惊。然后大家都说:你看,这老师都让我们闯进去了,那就闯呗。最后,我们爬窗进去了。当晚大家的确研究了不少东西。我们还在老师的房子里面开小灶,弄了一锅粥,吃得挺开心的。大家累了倒头便睡。第二天早上,老师开门看见我们和变样了的房子,“责骂”了我们一顿,他其实也没有什么的,呵呵。不过我们之后都没有在未曾得到老师的同意之前“入侵”他的房子了。
在高中,从求伯君先生的作品WPS了解到他的个人经历,很钦佩他,便把他作为我的偶像和目标,或许这便是个人崇拜吧。至今仍然记得DOS下的WPS打开文档的万能密码是CTRL+QIUBOJUN (求伯君的拼音)。
我把所有课余时间都放到学习电脑和编程中了。很少玩游戏,而且比较少参与课外活动,周末和假期都把所有时间都投入到学习编程中。
高中,学习的确繁重,但我仍然把相当多的学习时间都放到学习编程中。
毕业后知道电脑老师自己开了间电脑公司,但没有了解其近况。
第一次开发人生的感悟
在大学的时候写了篇感悟,现在原文放出来。
我是一个英文专业的大学生,但我真正想做的,却是成为一位IT人。六年多以来,废枕忘食,连那“黑色七月”前的莘莘学子浴血奋战,杀得昏天暗地的疯狂日子里,我仍然是“两耳不问窗外事,一心只顾编程序”。更离谱的是,连在答语文考卷的时候,我不由自主地想起前一阵子的还没有完成的程序来。高考结果出来却有点出乎意料,考上了第一志愿。
这六年多以来,我想成为一位IT人的愿望越来越强烈,这更让我疯狂地学习电脑知识,尽可能地接触与电脑有关的东西,关注有关电脑的信息,对自己不断“充电”。在家里时,我常常在白天构思程序,晚上从别人开始入睡的时候开始上机,大概是11p.m.吧,一直地打到窗外第一屡阳光射进我的工作室为止。原因有2: 1.晚上安静,我的思维为一天中最清晰的,这样能更好地让我发挥; 2.晚上正常的人都睡了 。
考上大学的近一年来,我总在问自己,“到底有没有选择错了?”为什么我会有这个想法呢?我理科不大好,害怕考不上大学,所以在高中分科的时候选择了文科,希望能考上大学后可以选择与电脑相关专业,即使是旁听也好。但是考上大学后,发现这根本是不可能的事情,因为我所在的大学不但没有电脑专业,连相关的专业也没有。当获悉这令我顿感近乎绝望的事实,我消沉了。不能学电脑,又能怎样?
我平时行为不羁,独来独往,不受束缚,穿着更是以舒服为重,因此经常成为老师跟同学“攻击”我的借口。老师曾多次找我做“思想工作”,苦口婆心地向我表明作为freshman应该尽量接触英语,多读英文名著,扩大词汇量......,如此云云。我当然明白老师的出发点是很纯洁的,但是,老师,你可知道,对我来说,英语,是作为我学习电脑的工具,而非电脑作为学习英语的辅助工具。我曾多次对自己说:“一定要在保证英语过关的基础下,才能搞电脑!”但往往不能keep promise,因此我常常感叹:“到底有多少人能信守承诺,又有多少人可以达成愿望?”
我每当遇到不如意的事情的时候,经常以“世事没有完美”来安慰自己,应该说是欺骗才对,因为我深知这仅仅让心里好过点,如此而已。但在这以后,又可以做些什么呢?但一件事让我明白到一句古语——“只要有恒心”的的确确是不假。体育课要考1500米,要是以前,我根本是不会害怕的,但几年来已经荒废了,颇有“廉颇老已,尚能饭否”的感觉。真正站在起跑线上时,我知道,该来的都会来了的......我不大擅长描写心理活动,想必很多网友都有过同样的感觉。结果怎样?跑了个第一。不但重拾了当年的感觉,而且深深明白:成功贵乎坚持。虽然很多网友都明白这点,但是,又有多少人能真正在实际中运用了呢?先辈虽然留下了不少的至理名言,但是,没有多少能真正体会到个中含义,这不能不说是个遗憾。
是否,
有过不知方向的感觉?
问自己,
“为什么?”
生活中,
往往决定方向的,
不是自己,
而是众说纷纭,
不知所措,
其实,
真正的方向,
是自己决定,
不由别人左右。
有感 于1999年
职业软件开发生涯
工作经历
1. 大学四年级(貌似)的时候去深圳蛇口工作了几个月,算是第一份工作吧,做的是医药销售管理系统(GSP)。公司效益不好,同事们纷纷离开,我是倒数第二个走的,最后公司倒闭了。或许这就是谣言很厉害的说我做过的公司都倒闭的来源之一吧。其实我有一个码农同事,他最近做的3家公司都倒闭了。主要用ASP和VB,SQL Server好像是6.5什么的,还是用的MMC的管理器。在这间公司认识了一个程序媛,工作期间交流多了,关系好起来,她成了我的女朋友。后来中学70周年纪念,带她回去,感觉很自豪。大家常说:“做软件开发的,哪里会有女朋友?”,其实,书中自有黄金屋,书中自有颜如玉。做开发的也可以找到女朋友。不过,后来因为一个经典的原因,分了。
2. 毕业后第一份正规的工作是做办公自动化(OA)的,应该是中国第一家公司使用ASP.NET+VB.NET+SQL Server做的。当时还是.NET 1.0 Beta,那里我第一次接触.NET,学了VB.NET (我的背景是DOS下的GWBASIC、QuickBASIC,一路到Windows下的Visual BASIC)。不过,当时很多事情发生,一直影响到现在,其中一样就是,我在那里遇到了我现在的老婆。你看,做软件开发还真能找到老婆的。 部门经理经常删除我的代码,我离职了,还冤枉我破坏服务器,公司克扣了我近两个月工资,然后我就直接回老家和老婆结婚了。后来这个部门经理被查出倒卖产品源代码,被炒了。对了,这个源代码当年在网上流传很广泛,相信很多做.NET的都下载过。在这里掌握了ASP.NET、VB.NET、SQL Server等。
3. 第三份工作是一家给南方航空做新在线售票系统的公司,用的Java,那是我第一次接触Java,做了好像3个月不到,不喜欢,走了,没多久,公司剧变,要倒闭,员工们都在周末回公司抢机器来抵工资。
4. 第四份工作是一家做房地产管理系的公司,在这家公司呆了5年,完善.NET和数据库技术,就是在这个期间写了个人的千万下载量软件。如果不是移民澳洲,可能会提前走。对了,在这里用到了Silverlight,这个技术已经被淘汰。语言主要用的C#,掌握了Oracle和O/RM等技术。
5. 第五份工作是来澳洲后的第一份,做能源管理的,呆了两年,老板是斯里兰卡人,公司大部分员工是印度人,部门经理是伊朗人,其它都是印度码农。在这里接触到海量数据(起码当时来看算吧,单表30亿条,每天更新数百万),数千存储过程,在这里,做了大量数据库优化,性能暴升,我的数据库技术大增,还重写了主系统,掌握了ASP.NET MVC、Bootstrap、Knockoutjs等等一票技术。
6. 第六份工作是做Care的,接触到医学方面的知识,譬如身体检查就有近20个的项目,复杂的算法,几百个问题,过百页的算法。这里呆了2年,菲律宾大妈,你还安好?在这里掌握了Service Bus、angularjs、bower、yeoman等。
7. 第七份工作是做金融/财务贷款/支付的,呆了4个月,老板是犹太人,比较懂得把钱用到极致。经常要我加班,有些时候加班到晚上10点多,一些时候甚至星期天凌晨。
8. 第八份工作是做GIS相关的,目前呆了快一年,这里在微博吐槽了几十回了,不再细说。在这里掌握了团队管理/GIS、增强了WPF/数据挖掘/数据仓库等技术。
好了,说完经历就说职场吧。一句话:职场黑暗。遇到好多不爽的事情和混帐的人,有人的地方就有浆糊,有利益就有买卖,就有手段,博弈。这么多年就只有一个半公司尚算正常能让我好好地搞研发。
跳槽是加薪的最佳办法,跳槽是加薪的最佳办法,跳槽是加薪的最佳办法。重要的事情要说三遍。
如何成为一名程序员
说明:文章中提及的技术大部分已经过时,正确点来说,应用范围已经比较小了。因此我并不是介绍新技术,只是谈谈程序人生。
从事软件开发,可以是科班出身,也可以不是。我知道从事软件开发的,除了计算机专业的(计算机科学/软件工程等),还有科班是学电子、化学、生物、数学、医学等等,不一而足。而我,是学英语的。
做开发,首先是个人的能力。个人能力可以包括很多方面,不过,我觉得最重要的两样是:学习能力、交流能力。
可能有一些程序员会问怎样学习好英文,除了在课堂上认真学习英文外,可以尽量多看些英文节目、连续剧、新闻、广播来练习听力,多看英文技术书籍、文章提升阅读能力,多在英文技术论坛、博客交流提升表达能力。
我偏好高质量的代码。刚毕业的时候,写了一篇20多页的《VB编程标准》,想发表在《电脑报》上,可惜没有给编辑采纳,可能是我的语言表达太差了,但我仍然希望能在原来公司里面推行,可惜能理解的人太少。
这些年来,遇到各种各样的开发人员,各有各的编程风格,水平参差不齐。中国的程序员有个性,他们中的部分人相信能凭一己之力就能把一个系统做好,实际上,单枪匹马的英雄时代已经过去,开发人员应该是实干家,不应该发白日梦。他们为什么会拒绝接受编程规范呢?理由很简单:“我有我的习惯,为什么要花时间重新学习别人的规范?别人的规范不一定就好。”是的,别人的规范的确不是最好的,但在工作实践中总结出来的规范能切合实际需求,能让开发快速进行并完成,最关键的是能满足客户需求。同时,遵循同一规范,无论在开发交流还是工作移交,都能快速领会。
掌握好开发语言是每个程序员必须做的。但怎样才算及格呢?很多人说,掌握越多越语言越好,一些则说掌握一种就够了。我认为都有道理,但我相信在很好地掌握一种语言的基础上,举一反三,触类旁通地学习并能应用其它语言就更好了。实际上,我们不能强求不同的客户需求使用同一种语言,开发必须为客户需求服务。现在.NET大行其道,想想在2003年很多论坛上还有大量的帖子,主题都是围绕是否放弃现有掌握的技术,去学习.NET。这种问题类似于一直以来的争论不休的两种语言之间的优劣,最后还是不了了之的。实际上,任何语言都有其存在的理由,不必去争论什么,关键是自己用得舒服,能满足客户需求就好。我在工作中也要根据不同需求用不同的工具。除了语言本身,还的掌握好IDE(开发环境)/工具,工欲善其事,必先利其器。
要做好开发,除了个人/团队技术过硬之外,还应该多学习同行,前人总有让我们学习的地方。我的做法是:做开发之前,先客户需求分析,再下研究一下市面上领先的同类软件/系统/解决方方案,借鉴他们的优点,注意,是学习优点,不是抄袭。
怎样成为一名雇员
大部分程序员都得找工作糊口(一小部分可能自己给自己打工,做老板),这样就免不了要找工作:首先是写好一份简历,然后是过面试关,然后是协同开发,还有跟同事相处了。
这些年来,我既做过应聘者,也做过面试官。最近我在找新工作,网友调侃:“你不是在去面试的路上,就是在面试中”。
首先,是写份好简历。之于简历,我更强调过硬的个人能力,不过现在仅仅谈谈简历。
一份好的简历很重要,它是你的应聘某份工作的敲门砖。简历内容因人而异,但宗旨是要诚实。实在太多的人写自己精通xx了,有更离谱的, 称自己精通几种甚至十几种语言。我相信世界上最伟大的程序员都不这样说。还有工作和项目经验,很多人写得很玄,一看就知道是捏造的,经典的如北大青鸟的学生的简历,都是套模板的,水分太大,建议大家老老实实地写。不过,仍然可以有点技巧的:那就是专业规范化的文字描述。建议多看看各大技术网站的相关文章。
需要强调的一点,那就是证书。现在社会风气是很强调证书的,各种证书多得我看证书缩写根本认不出来是什么。很不好意思的告诉大家,我连初级程序员都不是,因为我从来没有参加过国内任何认证考试。大家可能觉得很奇怪,为什么我做软件开发这好么久了仍然还不考一个证书;可能大家更加关心的是:我没有证书怎样成功应聘职位。我不大注重证书。我觉得证书只是能力某种程度上的体现,并不是能完全代表你的所有能力。或许也就是这样,很多程序员考了一大堆的证书。
写好了简历,就是投简历了。除了直接投,还可以“骚扰”猎头。除此之外,还可以找熟悉的人做内推。当然,如果你名气大,直接就被雇主骚扰了。我当年没经验,把自己当万能膏药,同时投了同一个公司应聘多个职位,我以为招聘公司会把我当全才,但实际上他们会认为你什么都不行,纯粹为了混个工作做做。所以,应该有针对性地投心目中感觉最对口、最有可能的那个。
关于职位广告,部分或真或假或夸张,如果分辨,那是门学问。
关于猎头,猎头大多不懂技术,而且部分真的很烂,说得不好听,这些烂中介就是买卖人口的,譬如一些从来不答复你,一些说:"行啊,我晚点回复你,然后就没下文了"。
未完待续
接下来还有第二部分,包括:
- 扩展能力
- 开源人生
- 开发质量与性能追求
- 理想与将来