程序员开发软件的意义在哪?
有一篇热文《写了8年的代码,做过的项目都下线了,程序员的意义在哪里!》,作者8年工作和业余时间开发几十个项目,几乎都关闭了。
想当初,很用心的去开发每一个项目;如今,这些项目只能一个个关闭。
这真的使我很悲观: 我花了那么多的时间精力,去做的事情,竟然如此的毫无意义。
我相信这也是所有程序员到一定人生阶段时必定会思考的一个哲学问题:程序员开发软件的意义在哪?
是为了养家糊口,是为了追寻技术,是为了创业,还是为了改变世界?
在软件咨询业摸爬滚打十余年后,我在整理简历时遇到一个难题,就是工作经验那一块,做过的项目太多了,要写好几页,这与当前硅谷的人力资源强调简历必须简洁的原则严重不符,因为招聘专员在你的简历上的目光扫描只有短短的15至30秒。德国传统的简历标准允许稍微冗长,毕竟不少公司废除纸质简历投递是这几年才执行的。但德国有历来向美国看齐的传统,所以大型公司或者新兴科技IT公司的人力资源,今后逐步采用硅谷的标准会是趋势。
我的首要业务,是把原本三四页的几十个项目简介缩短到两页以内。于是我开始一条条回顾,从业至今,做过的那些项目。
1. 那些年,做过的C项目
1-1. 第1个C项目
工作第一个项目,是为斯图加特地铁公司做的一个轨道内部管理移动系统,前端后端,数据库,后台数据接口全部一个人完成。
技术:
- 后端:J2EE Servlet,数据接口Hibernate,通过SOAP和SAP的接口与地铁公司数据交互。
- 移动端:JavaME,开发界面和业务逻辑,数据采录,显示轨道的静态地图图片。那时Google Map刚起步,也没有适合地铁公司数据格式的开源地图服务器,花了很大力气,架设了一个商用地图服务器,搞定了地图这一块。
- 前端:GWT,Google的一个Web Rich Client框架
项目现状:卒
原因:
- JavaME已经死了,Nokia那么庞大的帝国已轰然倒下。
- 臃肿的SOAP接口被RPC或Rest取代。
- Hibernate,半死不活。SSM大行其道。
- 静态无交互地图显示随着Google Map和其它优秀开源地图服务器的普及也淡出历史。
- GWT早已被各类前端框架替代
留在简历:留。
毕竟面试时,德国HR喜欢问的,常常是你做的第一个项目,哪怕你工作了多年。和其它刚入行的新人一样,我从这个项目中,海绵一般地吸收新知识,学了非常多的技术,包括移动端的设计和构架,后端数据接口的交互,以及数据库的设计与应用,这些技术习惯我一直沿用至今。
1-2. 第2个C项目
德国本土一个娱乐信息互动平台的移动端。
技术:后端开发J2EE Servlet, 移动端JavaME
项目现状:卒
原因:平台已倒闭
留在简历:否
1-3. 第3个C项目
给法兰克福政府机构做的Mobile城市景点热点导航。
技术:后端开发J2EE Servlet, 前端JSP+JS做HTML5
项目现状:卒
原因:Google map一出,谁与争锋
留在简历:否
1-4. 第4个C项目
德国拜仁州铁路购票系统。
技术:
- 后端:J2EE Spring,MySQL。德国除了德铁是一半国有外,各个州和城市的铁路系统都是私营企业经营。各个企业都是独立的票务系统,但它们一般都使用德国的两家铁路票务系统平台。这两家系统的标准和接口是完全不同的。我的工作,是开发一套通用的API,通过SOAP和Rest接口与两大系统平台接口兼容对接,实现德铁与拜仁铁路票务系统的数据整合。
- 移动端:JavaME,车次查询,票务系统
项目现状:半卒
原因:
- JavaME已死
- 后端服务API可能还在继续运行,用在后来新的Android或iOS移动端上。
留在简历:是
从这个项目我学到了,如何开发一套完善的合乎标准的API。
这时我已经把一个叫J2ME Polish的框架用的炉火纯青,它可以在Nokia等手机和Blackberry上做出比系统原生界面炫得多的界面。当时国内相当多的团队也在用,我甚至想写本中文的技术书。这个想法后来被智能手机系统iOS和Android的诞生掐灭了。
1-5. 第5、6、7、9个C项目
- 手机多媒体云备份系统,类似dropbox
- 本土移动LBS社交平台(2009),类似陌陌
- 为德国电信开发的移动银行客户端
- 本土团购平台
技术:后端开发J2EE Spring,MySQL, 移动端Android,iOS,JavaME
项目现状:卒
原因:平台已倒闭或项目被下马
留在简历:择其一
1-6. 第8个C项目
2009年,德国第一个移动拼车平台,类似于滴滴(滴滴于2012年起步)。
技术:
- 后端:J2EE Spring,MySQL。搭乘、好友、消息、推送、地图、匹配系统。
- 移动端:Android,iOS
- 前端: GWT
项目现状:另一种形式的生命延续
原因:
- 项目后来被德国某车厂收购,改成目前颇受欢迎的汽车共享系统。
留在简历:是
如之前一样,整个项目的开发构架从前到后都深入参与。并且负责开发了一个核心组件:搭乘路线与搭乘人员的Buffer zone匹配系统。一想到这个核心算法一直服务至今,有点小开心。
1-7. 第10-11个C项目
2011,是HTML5和Widget崛起的元年。很多手机生产商都发布了自家的小程序Widget框架。
- 某大型机械企业生产线二维码移动作业系统
- 某大型物流公司移动办公CRM系统
技术:
- 后端:Node.js,MySQL
- 移动端:HTML5 Hybrid App 或Widget
- 前端: HTML5
项目现状:不明
原因:
- 用在工业或者商业领域内部
- HTML5和Node.js一直很茁壮的成长
留在简历:择其一
那年HTML5 Hybrid技术刚刚起步,还没有各类优秀的框架(PhoneGap刚出生)。Widget各家标准不一,手机兼容性问题非常严重,开发时非常痛苦。今年Widget小程序又被各个流量渠道吵了冷饭,不禁让人联想起时尚的轮回。
1-8. 第12-22个C项目
2012 入职一个大型咨询公司,开发的多为本土工业界内部管理系统。
- 企业考勤系统,招聘系统
- 德铁大型GIS内部作业管理系统
- 某大型能源公司CRM系统
- 德铁AR虚拟增强外业管理系统
- 某航天科技公司卫星数据分析平台
- 若干企业管理系统
技术:
- 后端:J2EE,.NET,PHP,ROR,Oracle,MySQL
- 移动端:iOS, Android原生App或者HTML5 Hybrid App
- 前端: JQuery和各类UI框架
项目现状:大半仍在稳定运作并持续更新
原因:
- 用在工业或者商业领域内部,运行和迭代周期长。
- 业务层面高于技术层面,而且技术栈较宽,多选择茁壮(老旧)且稳定的商用构架。
留在简历:择其一二
工业软件咨询业从成本出发,多宣传和采用HTML5 Hybrid技术,虽然有Cordova等框架,但是和底层的大量交互仍是深坑不断,这也是我后来一直对Hybrid App保持谨慎的原因。
这些项目做下来,完善了自己对客户需求开发流程,以及文档和标准的理解,明白项目不仅仅是软件开发那么简单。
1-9. 第23-27个C项目
2015 德国的工业4.0口号越喊越响,做的项目也逐渐向IoT方向靠拢。公司也逐步采用开源框架。
- 数家大型能源公司智能电网内部管理项目
- 风力发电IoT预测管理系统
- 其它公司内部管理系统
技术:
- 后端:除了上述技术栈,多了SAP HANA,和一些开源框架
- 移动端:同上
- 前端: Extjs和相关UI框架
项目现状:半数仍在稳定运作并持续更新
原因:
- 同上
留在简历:择其一二
1-10. 第28个C项目
个人很看好物联网IoT这个领域,涵盖车联网,智能家居,云和大数据等方向。于是入职现在的公司。
- 智能家居系统
技术:
- 后端:OSGi,云,各类最新开源框架,各类硬件标准
- 前端/移动端:Android,iOS原生开发,各类最新开源框架
- CI/CD: 各类最新开源框架,DevOps
项目现状:长期稳定运作并持续更新
留在简历:是
除了能接触到业内较为前沿的技术领域外,也深入了解了大型团队协作化的各类流程。大公司开发流程标准虽然繁琐,但从另一方面看,这是对质量的一种保障。对于团队开发,测试,持续集成和持续开发的流程也有了全新的理解,比如在保证进度的同时保证软件发布的质量等这类永恒的问题。
1-11. C项目小结
虽处德国,但我的C项目经历中的消费领域项目,基本是伴随中美互联网浪潮,移动互联网浪潮,以及云浪潮同步进行的。我相信你们肯定做过下列某个或某些领域:团购,LBS交友,SNS,同城,搭乘,车分享等等。我做的其中八九成此类项目在德国已经挂掉,就如国内IT行业一样:大浪退去,谁在裸泳一清二楚。有些项目挂了,说不上方向不对,而是理念在当时太过于超前,受限于硬件或技术。只能说是,正确的项目生在了正确的地点,却生在了错误的时间。
而其中工业界内部软件,多半至今还在运作。理念和流程的惰性,没有让管理者决策过于盲目的追随互联网的浪潮。工业领域数字化技术虽相对陈旧,但强调运行稳定,从某个角度来看,这也算是德国工业界相对务实的一种表现吧。如果程序员希望自己开发的软件寿命能久一点,那么可以进工业界或者金融界工作,相对来说,这些领域的系统更强调稳定。
这些已经挂掉的项目的意义,在于推动了整个数字化世界的不断发展;对个人开发者来说,也不断积累了技术栈的经验,同时也不断的更新个人技术储备。
好了,如果能耐着性子读到这,大家一定有个疑问,什么是C项目?
这里C指的是Careers,职业项目。下面说说程序员修炼必修科目:Side Project。
2. 程序员的另一面
Side Project是指程序员在工作之余,做的一些开源,外包或者兴趣项目。有些同事,很可能是某个开源项目的大牛,也可能自己开发数字货币,有的甚至已经有了自己的公司,本质工作只是副业。
一个人在一个行业领域工作久了,必然会出现啃老本的状况,比方说用三五年时间积累的经验,不断重复十年,二十年,三十年,进入一个稳定的个人舒适区。在上述C项目里,我能移除一部分,也是因为某些项目是用之前相同框架改动开发出来的,所谓经验的重复性,泛善可陈,HR也不会有兴趣。
2-1. 鸡蛋放一个篮子里的风险
IT是个不同于传统行业的特殊行业,除了某些领域偏底层开发外,知识的迭代非常快,传统行业三十年河东三十年河西,IT可能缩短到两三年。程序员除了在自身擅长领域深挖之外,还要注重培养其他领域的广度。广度不代表什么都学,而是你自己清楚哪些可以不学。
我永远记得2011年8月的一个阳光明媚的上午,突然看到一则新闻:Nokia宣布放弃自家研发多年的Symbian系统,拥抱微软WP系统。我立刻告诉了我对面的Andy,他脸色大变,马上去老板办公室把老板喊了过来,俩人脸色凝重地又仔细看了这则新闻,然后去会议室开了很久的会。Andy是个Symbian C++开发高手,当时负责一个将虚拟人生(Second Life)这款游戏移植到Symbian系统里的项目,公司投资开发了一年多。这则新闻意味着:老板一年多的投资打了水漂,Andy从业多年的领域突然被造碗的砸了饭碗。Andy后来转向了iOS开发,我离职几年后偶遇,他已经转行汽车行业客户经理了。
2-2. 通过Side Project不断学习
当工作中如果长期被分配做性质雷同的任务,自己感觉技术停滞不前时,那就说明你要充电了。学习是程序员永远不能丢弃的基本技能,而Learn by doing,则是掌握新技能不变的定律。Side Project是最好的途径,即掌握了技术,又可以通过开源或者外包,提高自己在同行中的声望。当然,每个人发展最优路径不同,坚持下去很可能副业变主业,业界有很多典范。
2-3. 第1个S项目
起源于我的硕士毕业论文,一个轻量级矢量地图服务器SUAS Map Server。
技术:
- 后端:PHP,MySQL,Postgre
- 移动端:J2ME
- 前端: Jquery,众多开源框架
项目现状:开源,停止维护
原因:
- 持续维护了五年,期间和大学教授一直保持合作,发表了一系列论文
- 当核心需求越做越深时,已经突破了“轻量”这个概念
- 想兼容太多GIS行业ISO标准和数据格式,任务繁重
- 做大型框架经验累积不够
- Google Map把我想做的功能也做了
留在简历:是
虽然业内一直吐槽PHP,但它不失是一个优秀的语言,尤其是用了类构架后,PHP一样可以OOP,代码质量是可以保证的。项目用户多集中在高校和科研机构,毕竟轻量级不适用于工业和消费级领域。我学习了如何从无到有开发一个完整框架,如何从行业ISO标准落地实际项目。
2-4. 第2个S项目
免费的移动字典和背单词App:Modict和 Momemo。
技术:
- 后端:J2EE,MySQL
- 移动端:J2ME,Android
项目现状:开源,停止维护
原因:
- Android和iOS商店里同质化App太多
- 维护五年,后来的Android版本因系统碎片化也导致维护难度升级
留在简历:是
作为电子设备爱好者,从开始学德语时,就特别反感随身带一本纸质字典。在Android和iOS没有出现之前,所有德国的手机都是预装拉丁文系统。这类系统不支持中文显示,就算装了德汉字典软件,只能显示一个个方框,现在用智能手机的同学很难体会到那种痛苦。
当时不信邪,试了各种技术方法不成功(汉字图片是个很low的方法),直到我发现了GB2312点阵字库。2006年夏,当我把一个显示了汉字的App展示给室友时看时,他一脸的惊奇和兴奋。光有汉字显示不够,我又想办法开发了拼音输入,第一次在德文系统里实现了汉字输入和显示。然后字典软件顺理成章诞生,期间对大数据切分索引算法(字典树)和各类压缩算法做了很深入的研究,在功能机上实现了小内存(200kb+)搜索十几万(20mb+)的数据秒回,几乎榨干了App运行时每一块内存。
在欧洲求学或工作的朋友的支持给了这个项目很大的推动力,在基础功能的基础上,又添加了字典通配符模糊搜素和在线搜索,添加了英汉,法汉,意汉等各种语言字库,添加了背单词等功能,并应用户需求添加了多款软件皮肤。一些用户告诉我,靠Modict背单词过了各类语言考试。
虽然停止更新,十年后的一天,我在论坛上碰到一个陌生人发消息给我,问我是不是手机字典Modict的作者,他说他记得我的ID,因为我最开始时通过论坛发布过App。他说他很感谢我,因为他在学习和工作中,用了这个App很久,直到换了智能手机。在这之前,他从未想过能在他的外文系统手机里能用上可以显示汉字的App,更别提还能输入中文!
我突然觉得,之前很多次为攻克难题挑灯编程的通宵很值,毕竟你的软件在用户的生命中陪伴了他或她某一段时间,并且占据了他们回忆中一点点的位置,对我来说,这就足够了。
2-5. 第3个S项目
2010-2015,涵盖了全球400多加物流公司的全球快递追踪平台,Packetracer。
技术:
- 后端:J2EE Spring,MySQL,PHP
- 移动端:J2ME,Android,iOS,QNX,WP,JQuery Mobile
项目现状:闭源,停止维护。可能重启
原因:
- 维护五年,精力难以为继
- 没认真思考商业前景
- 后端接入接口太多,异常太多,人工维护极其困难
- 技术切面太多,多线作战
留在简历:是
后台系统,核心基于自研的爬虫框架,后来逐步完善了多用户系统,自动日志系统,自动路由切换,Rest API,一整套图像识别系统;以一己之力,开发了几乎涵盖了市面所有手机系统的App:iOS,Android,BlackBerry BB10/SmartPhone,Windows Mobile,Windows Phone 7, 以及HTML5移动端。
- 400多家公司的程序员为了反爬虫,可谓无所不用其极,我每天回家就是看日志,找错误,看是不是对方用了新的反爬虫方法,再找破解。以后会写一篇相关的技术文章。
- 为了不被封IP,租了十几个服务器,开发了个路由系统。
- 为了破解验证码,从头研究文字识别OCR(那时机器学习还未普及),用自研框架配合OCR开源软件实现验证码破解
- 为了给用户省钱(那时包月套餐很贵),自研了一套类似protobuf的字节流序列化和反序列化框架,配合压缩,将API数据流量降到极致。
- 熟悉了DevOps运维
几年下来,各个平台的付费用户已有千人,免费用户不计其数。期间有个国内公司还希望全盘收购整套项目。每天都会收到大量的用户邮件,求助,感谢,报告bug,报告故障,实在应接不暇。其中有些很可爱的国内用户,每次换手机新装App都主动找我买序列号,其中一位长期支持我的理由是:
我用过很多同类App,只有你的软件,在地铁里面信号很弱时,还能照常收到更新。
如果你帮用户真心实意解决了问题,用户也会真心实意支持你,这是推动开发者的原动力之一。其实这个项目停更我也有不舍,等第九个项目完善后,计划用新框架重新构架这个项目,并且认真考虑如何商业化。
2-6. 第4-8个S项目
- 辐射监测App(配合硬件)
- 开源智能眼镜Launcher
- OBDII HUD车载信息读取
- 多媒体广告演示平台
- 智能电视多媒体Launcher
技术:
- 后端:J2EE Spring,MySQL,PHP
- 移动端:J2ME,Android,iOS,QNX,WP,JQuery Mobile
项目现状:部分开源
原因:
- 使用技术多为之前的技术储备
留在简历:否
2-7. 第9个S项目
商业级开发框架
技术:
- 后端:J2EE Spring MVC/Cloud,MySQL,缓存中间件,消息中间件,日志聚合,多用户多权限无状态系统,CI,CD,大数据分析
- 前端/移动端:Angular或Vue, Flutter
项目现状:暂闭源,完善后开源
原因:
- 希望将多年开发积累的经验,遇到的解决过的痛点,集成到一套框架里
- 完善成一套成熟的项目脚手架,能快速应用到任何单体,或者分布式项目中
- 希望能帮助一些创业小型公司,能快速做出功能相对完备的应用。
留在简历:是
这也算是个人转型的项目,代表我今后技术关注的重心,从移动端和前端技术里移出一部分,放到后端微服务构架,云和大数据这块。移动领域的蓝海可能快要退潮,我选择逐浪继续前行。
2-8. S项目小结
除了上述这些,还有不计其数的小项目。其实按严格的商业成功标准,我这些S项目根本谈不上成功。但我觉得开发这些项目时,非常的快乐,可以非常放松地学习很多新的领域,这些新的领域在完善项目的同时,又帮我扩展了新的思域。我亲手塑造了它们,它们也同时见证我的成长。
通过这些项目我认识了一些有意思的用户,一些志同道合非常有想法的开发者。别忘了,刚才说的学习模式,除了学以致用外,还有20%的知识,是来自于有效社交的。
3. 软件的意义
如果你看到这还没有离开,说明你在我冗长的回忆中,找到了一丝共鸣,也许你看见了你自己的影子,或许把你带回到过去的某一刻。那我也同样感谢你,作为软件行业坚守者的一员,不断磨砺前行。
3-1. 软件的死亡
一个软件,从它被写入第一行代码时,就是注定要死的。有的可以活得久一点,有的可能很快夭折。软件在它存活的那段时间内,如果能服务到真正的用户,帮助他们解决了生活、学习和工作上的问题,或者帮用户活得更舒适,过得更舒心,那它就活出了意义,也体现了你,作为开发者的价值。
电影寻梦环游记中,南美人相信:当一个人真正被遗忘的时候便是他真正死亡的时候。
《死亡清单》里曾经表达过类似的观点:
人的一生,要死去三次。
第一次,当你的心跳停止,呼吸消逝,你在生物学上被宣告了死亡;
第二次,当你下葬,人们穿着黑衣出息你的葬礼,他们宣告,你在这个社会上不复存在,你从人际关系网里消逝,你悄然离去;
第三次死亡,是这个世界上最后一个记得你的人,把你忘记,于是,你就真正地死去。整个宇宙都将不再和你有关。
同样,对于软件来说,最遗憾的不是死亡,而是被所有用户遗忘。当它被所有用户遗忘时,就意味着,这个软件在这个世界上彻底消失了。
如果一位用户能在多年之后,某个云淡风轻的午后,一个不经意的瞬间突然想到了你开发的软件,正在因特网某处的你,会不会感到一丝幸福?
3-2. 代码的永恒
一滴水只有放进大海里才能永远不会干涸
一个项目会死,一个软件会死,但它的代码如果开源,并且其中的一部分,甚至只有一小段代码被其他程序员使用到另外的项目中,不管有没有引用Copyright,这代码可能就实现了某种意义上的数字化的永久存储。
我相信,开源世界,是永恒的。
3-3. 最后
程序员的世界注定是要随着摩尔定律不断地更新和迭代,你我作为程序员,必定会经历疲惫,质疑,焦虑。我希望你和我一样,在接近2018年末的一个晚上,细细回忆这些年,做过的项目。如果在你脑海中,某一个项目的协作场景,某一段重构的代码,某一次解决问题的雀跃,能让你禁不住嘴角微笑,并暂时忘却当天的烦恼,那它,可能就找到了存在的意义。
删减版本发布于CSDN公众号: 程序员开发软件的意义到底在哪?