<p style="text-align: center;"><img src="/upload/content/20190111/1547144012584843.jpg" alt="程序员开发软件的意义到底在哪?" title="程序员开发软件的意义到底在哪?" width="550px"/></p><p>程序员开发软件的意义到底在哪?有一篇热文《写了 8 年的代码,做过的项目都下线了,程序员的意义在哪里!》,作者 8 年工作和业余时间开发几十个项目,几乎都关闭了。</p><blockquote><p>想当初,很用心的去开发每一个项目;如今,这些项目只能一个个关闭。</p><p>这真的使我很悲观:我花了那么多的时间精力,去做的事情,竟然如此的毫无意义。</p></blockquote><p>我相信这也是所有程序员到一定人生阶段必定会思考的一个哲学问题:程序员开发软件的意义在哪?</p><p>是为了养家糊口,是为了追寻技术,是为了创业,还是为了改变世界?</p><p>在软件咨询业摸爬滚打十余年后,我在整理简历时遇到一个难题,就是工作经验那一块,做过的项目太多了,要写好几页,这与当前硅谷的人力资源强调简历必须简洁的原则严重不符,因为招聘专员在你简历上的目光扫描只有短短 15-30 秒。德国传统的简历标准允许稍微冗长,毕竟不少公司废除纸质简历投递是这几年才执行的。但德国历来有向美国看齐的传统,所以大型公司或新兴科技 IT 公司的人力资源,今后有趋势逐步采用硅谷的标准。</p><p>我的首要业务是把原本三四页的几十个项目简介缩短到两页以内,于是我开始一条条回顾从业至今做过的那些项目。</p><p><strong>那些年的 C 项目</strong></p><p><strong>何为 C 项目?这里 C 指的是 Careers——职业项目。</strong></p><p>斯图加特地铁公司的轨道内部管理移动系统:这也是我工作的第一个项目,前端后端、数据库、后台数据接口全部一个人完成。项目现状卒,但我还是将其留在了简历里,毕竟面试时,德国 HR 喜欢问的常常是你做的第一个项目,哪怕你工作了多年。和其他刚入行的新人一样,我从这个项目中海绵一般地吸收新知识,学了非常多的技术,包括移动端的设计和构架、后端数据接口的交互,以及数据库的设计与应用,这些技术习惯我一直沿用至今。</p><p>德国拜仁州铁路购票系统:从这个项目我学到了如何开发一套完善的合乎标准的 API。这时我已经把一个叫 J2ME Polish 的框架用得炉火纯青,它可以在 Nokia 等手机和 Blackberry 上做出比系统原生界面炫得多的界面。当时国内相当多的团队也在用,我甚至想写本中文的技术书。这个想法后来被智能手机系统 iOS 和 Android 的诞生掐灭了。</p><p>某大型机械企业生产线二维码移动作业系统:2011 是 HTML5 和 Widget 崛起的元年,很多手机生产商都发布了自家的小程序 Widget 框架。那年 HTML5 Hybrid 技术刚刚起步,还没有各类优秀的框架(PhoneGap 刚出生)。Widget 各家标准不一,手机兼容性问题非常严重,开发时非常痛苦。今年 Widget 小程序又被各个流量渠道炒了冷饭,不禁让人联想起时尚的轮回。</p><p>本土工业界内部管理系统:工业软件咨询业从成本出发,多宣传和采用 HTML5 Hybrid 技术,虽然有 Cordova 等框架,但是和底层的大量交互仍是深坑不断,这也是我后来一直对 Hybrid App 保持谨慎的原因。这些项目做下来,完善了自己对客户需求开发流程以及文档和标准的理解,明白项目不仅仅是软件开发那么简单。</p><p>智能家居系统:个人很看好物联网 IoT 这个领域,涵盖车联网、智能家居、云和大数据等方向,于是入职现在的公司。除了能接触到业内较为前沿的技术领域外,也深入了解了大型团队协作化的各类流程。大公司开发流程标准虽然繁琐,但从另一方面看,这是对质量的一种保障。对于团队开发、测试、持续集成和持续开发的流程也有了全新的理解,比如在保证进度的同时保证软件发布的质量等这类永恒的问题。</p><p>……</p><p><strong>C 项目小结</strong></p><p>虽处德国,但我的 C 项目经历中的消费领域项目基本是伴随中美互联网浪潮、移动互联网浪潮,以及云浪潮同步进行的。我相信你们肯定做过下列某个或某些领域:团购、LBS交友、SNS、同城、搭乘、车分享等。我做的八九成此类项目在德国已经挂掉,就如国内 IT 行业一样:大浪退去,谁在裸泳一清二楚。有些项目挂了,说不上方向不对,而是理念在当时太过于超前,受限于硬件或技术。只能说是,正确的项目生在了正确的地点,却生在了错误的时间。</p><p style="text-align: center;"><img src="/upload/content/20190111/1547144451914591.jpeg" title="程序员开发软件的意义到底在哪?" alt="程序员开发软件的意义到底在哪?"/></p><p>而其中的工业界内部软件,多半至今还在运作。理念和流程的惰性,没有让管理者的决策过于盲目地追随互联网浪潮。工业领域数字化技术虽相对陈旧,但强调运行稳定,从某个角度来看,这也算是德国工业界相对务实的一种表现。如果程序员希望自己开发的软件寿命能久一点,那么可以进工业界或者金融界工作,因为这些领域的系统相对更强调稳定。</p><p>这些已经挂掉的项目的意义,在于推动了整个数字化世界的不断发展;对个人开发者来说,也不断积累了技术栈的经验,同时也在不断更新个人技术储备。下面说说程序员修炼必修科目:Side Project。</p><p><strong>程序员的另一面</strong></p><p>Side Project 是指程序员在工作之余做的一些开源、外包或兴趣项目。有些同事很可能是某个开源项目的大牛,也可能自己开发数字货币,有的甚至已经有了自己的公司,本职工作只是副业。</p><p>一个人在一个行业领域工作久了,必然会出现啃老本的状况,比方说用三五年时间积累的经验,不断重复十年、二十年、三十年……进入一个稳定的个人舒适区。在上述 C 项目里,我能移除一部分也是因为某些项目是用之前相同框架改动开发出来的,所谓经验的重复性,泛善可陈,HR 也不会有兴趣。</p><p><strong>鸡蛋放一个篮子里的风险</strong></p><p>IT 是个不同于传统行业的特殊行业,除了某些领域偏底层开发外,知识的迭代非常快,传统行业三十年河东三十年河西,IT 可能缩短到两三年。<span style="color: rgb(255, 0, 0);">程序员除了在自身擅长领域深挖之外,还要注重培养其他领域的广度。广度不代表什么都学,而是你自己清楚哪些可以不学。</span></p><p>我永远记得 2011 年 8 月一个阳光明媚的上午,突然看到一则新闻:Nokia 宣布放弃自家研发多年的 Symbian 系统,拥抱微软 WP 系统。我立刻告诉了我对面的 Andy,他脸色大变,马上去老板办公室把老板喊了过来,俩人脸色凝重地又仔细看了这则新闻,然后去会议室开了很久的会。Andy 是个 Symbian C++ 开发高手,当时负责一个将虚拟人生(Second Life)这款游戏移植到 Symbian 系统里的项目,公司投资开发了一年多。</p><p>这则新闻意味着:老板一年多的投资打了水漂,Andy 从业多年的领域突然被造碗的砸了饭碗。Andy 后来转向了 iOS 开发,我离职几年后偶遇,他已经转行汽车行业客户经理了。</p><p style="text-align: center;"><img src="/upload/content/20190111/1547144465906821.jpg" title="程序员开发软件的意义到底在哪?" alt="程序员开发软件的意义到底在哪?"/></p><p><strong>通过 Side Project 不断学习</strong></p><p>如果工作中长期被分配做性质雷同的任务,自己感觉技术停滞不前,那就说明你要充电了。学习是程序员永远不能丢弃的基本技能,而 Learn by doing,则是掌握新技能不变的定律。Side Project 是最好的途径,既掌握了技术,又可以通过开源或者外包,提高自己在同行中的声望。当然,每个人发展的最优路径不同,坚持下去很可能副业变主业,业界有很多典范。</p><p><strong>S 项目小结</strong></p><p>从轻量级矢量地图服务器 SUAS Map Server,到免费的移动字典和背单词 App Modict 和 Momemo,再到涵盖了全球 400 多家物流公司的全球快递追踪平台 Packetracer……我一路走来经历了一系列大大小小的项目,其中的小项目更是不计其数。其实按严格的商业成功标准,我这些 S 项目根本谈不上成功。但我觉得开发这些项目时非常快乐,可以非常放松地学习很多新的领域,这些新的领域在完善项目的同时,又帮我扩展了新的思域。我亲手塑造了它们,它们也同时见证我的成长。通过这些项目我认识了一些有意思的用户,一些志同道合非常有想法的开发者。别忘了,刚才说的学习模式,除了学以致用外,还有 20% 的知识,是来自于有效社交的。</p><p><strong>软件的意义</strong></p><p>如果你看到这还没有离开,说明你在我冗长的回忆中,找到了一丝共鸣,也许你看见了你自己的影子,或许把你带回到过去的某一刻。那我也同样感谢你,作为软件行业坚守者的一员,不断磨砺前行。</p><p><strong>软件的死亡</strong></p><p>一个软件,从它被写入第一行代码时,就是注定要死的。有的可以活得久一点,有的可能很快夭折。软件在它存活的那段时间内,如果能服务到真正的用户,帮助他们解决了生活、学习和工作上的问题,或者帮用户活得更舒适,过得更舒心,那它就活出了意义,也体现了你,作为开发者的价值。</p><p>电影寻梦环游记中,南美人相信:</p><p><span style="color: rgb(0, 112, 192);">当一个人真正被遗忘的时候便是他真正死亡的时候。</span></p><p>同样,对于软件来说,最遗憾的不是死亡,而是被所有用户遗忘。当它被所有用户遗忘时,就意味着,这个软件在这个世界上彻底消失了。</p><p>如果一位用户能在多年之后,某个云淡风轻的午后,一个不经意的瞬间突然想到了你开发的软件,正在因特网某处的你,会不会感到一丝幸福?</p><p><strong>代码的永恒</strong></p><p>一滴水只有放进大海里才能永远不会干涸。</p><p>一个项目会死,一个软件会死,但它的代码如果开源,并且其中的一部分,甚至只有一小段代码被其他程序员使用到另外的项目中,不管有没有引用 Copyright,这代码可能就实现了某种意义上的数字化的永久存储。</p><p>我相信,开源世界,是永恒的。</p><p><strong>写在最后</strong></p><p>程序员的世界注定要随着摩尔定律不断地更新和迭代,你我作为程序员,必定会经历疲惫、质疑、焦虑。我希望你和我一样,在接近 2018 年末的一个晚上,细细回忆这些年做过的项目。如果在你脑海中,某一个项目的协作场景,某一段重构的代码,某一次解决问题的雀跃,能让你禁不住嘴角微笑,并暂时忘却当天的烦恼,那它,可能就找到了存在的意义。</p>