话说,过去两年多以来,世界发生了很大变化,对我们软件工程师来说影响尤甚:首先是疫情让大家禁足在家 - 长则数月、短则数天,都是说不准的哈;其次,元宇宙忽然火了,号称来了,例如据微软的观点和策略,沉浸式的、虚拟化的办公协同将是未来的工作模式;第三,世道不易,很多人据说“被毕业”了...
现在的世道,是变的日益魔幻虚拟化了。可是也不全是坏消息,软件工程师可不就是虚拟世界的搬砖工吗?越虚幻越不怕。时代变了,是不是一定要加入某家大厂搬砖才稳妥,搞个小厂或者独自搬不行?是不是一定要在厂里现场搬,虚拟的砖远程搬不了?
Solo Developers的兴起
软件世界历来有独行侠,近年来更多。2016年,一位乌克兰工程师Ivan Kutskir发布了Photopea.com,一个人挑战Adobe。今天这个产品给他带来每年100万美元收入 - 他没有办公室、没有员工、也没有市场营销。这个产品就是提供一个免费版的Online Photoshop。收入来源?在用户使用过程中放广告,或者用户付订阅费免广告,或者付费进一步使用产品的开放接口。今天Photopea每天活跃用户达到300,000人、每天总用户使用时长45,000小时。
大名鼎鼎的编辑器软件Sublime Text,也是一个独行侠的杰作,由从Google离职的Jon Skinner于2008年独自发布,目前有2百万用户,年收入达到6百万美元。
Minecraft,电子游戏史上最成功的独立开发游戏软件,由瑞士程序员Markus Persson制作(这哥们在8岁即制作出第一款电子游戏),他离开之前的公司去追求自己的兴趣,“独立”让他不受任何掣肘,拥有发挥自己无限创意的空间。虽然Minecraft最终以25亿美元卖给了微软,但是Markus永远在游戏设计大师的名人堂占有一席之地。
今天,软件可以说是既变得复杂,也变得简单。复杂,在于术业有专攻,你要完成一款专业的软件,需要专业的人机交互设计能力,需要支持iOS、Android、PC乃至IoT各种平台环境,需要掌握在服务器端开发高性能服务的技能,需要和各种编程语言打交道 - 例如几乎不可能单靠一种语言写出一个端到端完整的App,还需要懂得点运维 - 起码起个虚拟机、写个运行脚本什么的。简单,在于各种开源库、组件、开发测试工具,层出不穷,帮助开发者更快更好的完成多种工作;此外云计算的普及,让软件开发到产品发布都在指尖之下 - 只要一个浏览器、一个命令行终端,一切皆有可能。而十多年前,你可能需要采购一些服务器等上个十天半月等代理商快递到某IDC机房,然后等机房人员几天配合上架开机,然后等运维去安装系统部署软件,你甚至可能要以光盘、U盘的方式分发你的软件;对于企业的老IT人来说,扛服务器跑机房是熟悉又亲切的情景,任何时候,你的软件上线是非常“隆重”的。
过去进展按天甚至周算的事情,今天按分钟算。依托云服务、借力开源技术、借助技术社区,成为技术独行侠的可能性,从来没有像今天这么高过。
码农“合作社”的乌托邦
不是每个人都有条件、能力去做独行侠,对于大部分工程师来说,可能缺某些技能需要他人协助,也可能缺产品主意和应用场景方面的想法。术业有专攻、隔行如隔山,还是安身立命于做好自己的专业领域,和他人协作完成更大的任务,以达到共同谋生、合作共赢的效果。所以,协作应该还是软件业的主旋律。
开源运动,实际上让全世界的工程师建立了协作大生产,就算你没有贡献开源的代码,你也一定是开源技术的既得利益者 - 当你在键盘上敲下'npm'、'brew'、'cargo'、'apt-get'... 这些命令的时候,你就在享受着其他搬砖工贡献的砖头、铆钉、构件、预制件... 当然,作为使用者你也可能向这些组件的提供者作出了反馈、给予了建议或者为用户数“ 1”从而间接坚定了他们继续贡献的信念... 一个跨地域、跨时区、跨文化、跨语言的全球性虚拟化协作,早就在进行中。每一位软件工程师,正自觉或不自觉的参与到把全球虚拟化的数字社会大建设中。
有一个大胆的想法,如果人类文明没把自己折腾死了,真的能像《Dune》或者《Foundation》这类科幻经典所描述的发展至上万年,届时回顾“什么都已经是浮云”的历史上真正的里程碑式事件之一,会不会是二十世纪末期延续至今的开源运动?
数字化只会不断加剧。现在的线上远程协作工具已经非常繁荣:品质效果有保障的视频会议、共享白板、OKR线上管理、文档协同、源代码管控和CICD、HR SaaS服务、MarTech工具... 未来再加入沉浸式体验,无止境接近“逼真”的虚拟现实人际交流... 利用这些不断升级的数字工具,生产出数字化的工具和产品,从而让更多的人突破时空限制以更低门槛加入,从而再产生更多的数字化工具和产品... 直到...科幻小说才能描述的未来。
生产工具促进生产力,生产力要求生产关系与之相适应。虚拟世界的生产关系是什么样的?DAO - 去中心化自组织,具备“无组织形态的组织力量”,会不会是一种?
“合作社”这种曾经的乌托邦式实验,终将在虚拟世界搬砖工的群体中率先到来?
不确定时代中码农的“反脆弱”
对于码农来讲,也许时代的根本焦虑来源是数字化。 一切都变得很快、很“实时” - 没有人有耐心等你写优雅的代码,refactoring(重构)不再是一个美德;一切都变成数据化 - 数据很多很泛滥,但你只不过是某个人口统计数字里的百分点;一切变化都来的很突然很剧烈 - 数字世界黑天鹅特别多,今天你还在996,明天你可能就毕业了...
这个时代特别值得重温Nassim Taleb的《反脆弱》,学习在“不确定性”的环境中获益。Nassim解释了“反脆弱性”和“健壮性”(Resiliency)的区别:后者只是抵抗住冲击,维持/恢复原状,而前者不仅如此,反而在持续不断的冲击下发展壮大起来;前者厌恶风险,后者拥抱风险。
码农提升自身“反脆弱性”有什么具体的招呢?看以下几招是否一个适应时代的开端。
适应在任何有一根网线的地方都可以工作
工位?封城的时候,家里的书桌就是你的工位;必要时床上也可以是你的工位。实际上自从微信、钉钉出现之后,手提电脑和手机就是你的工位 - 无分时间和地点。工位自己也即将是虚拟的、数字孪生的。
码农需要完全适应这种所谓“digital nomad”(数字游牧)的生活。这里的挑战,不是能否使用数字工具在线上工作的问题。而是,你能否自律的、自我激励的、独立的、负责任的、专业的、可让他人信赖的去完成工作任务并给予协作者、队友、客户及时的响应,并产生让他人明确感知的影响,从而让他人感受不到需要和你真人面对面的必要?当然了,你还必须有远程让雇主、客户感受到你的专业水平的能力,对吧?否则你还没有敲开雇主或者客户的门,就已经被踢出群了。
这是一种软能力。有了它,不怕“毕业” - 此处不留爷,自有留爷处。云原生的企业必然并且只能越来越多,只要网线在,连接谁都可以发光发热。
相比其他行业,软件业是不是幸运一点点?和虚拟世界直接接轨的行业,道路是曲折的但前途相对光明。
做一个全栈的码农
所谓“艺多不压身”,搞软件这东西,技术突变多,如果不保持好奇心、视野和强烈学习意愿,埋头搞一门技术几年,猛一抬头发现时代已经抛弃自己... 没错,在美国的一些银行IT里,还养着懂COBOL的人并且难以替换他们。可是靠懂一项古董化石技术混一辈子的好事,应该是很难再发生了吧。无论你精通什么技术,都有被颠覆被替换的可能。
再者,“我只写JavaScript”、“我只对后端服务开发感兴趣”、“数据库不是我的菜”...这种“挑活”的心态都是有风险的。尤其是当你在线上化的虚拟世界里接活,耍的转几把兵器,哪怕只有把瑞士军刀,也大大增加你靠一根网线找活的生存率。
最后,回到“工程师”这个职业的本源,软件工程师的使命是在深刻理解数据结构与算法原理、软件工程等专业知识的基础上选择最合适的技术通过编程解决一个实际问题。而不是“我只有Java Spring这一个锤子”,只能找“REST服务”这种钉子敲打。在领导和客户心目中,软件工程师就是写代码的,项目经理别跟我扯“移动端”不够人,凭什么“前端”那么多人不过去支援一下?或者后端挪几个人去帮个忙?这跟隔壁大妈跟找你修一下PC一样 - 你不是学电脑的吗?对于客户来说,解决问题的能力是王道,而不是用什么技术去解决。
回归常识
每个时代都有很多新花样,不过“太阳底下无新事”也是一种说法,在眼花缭乱的时代更应该遵循第一性原则,探究事物本源。有人从《反脆弱》这本书归纳出这么些“如何反脆弱的生活”的点,以下英文是原文,用码农的语言来翻译一下这鸡汤:
- Stick to simple rules:坚持简单的规则,不要把事情搞复杂。用码农的话说,就是KISS(Keep It Simple, Stupid!)的技术原则,不过度工程,不把解决方案复杂化,自己日子也好过些
- Build in redundancy and layers (no single point of failure):这个对于工程师来说就太熟悉了,避免系统单点故障。只懂一种技术、只能做一种岗位,也是你的专业技能“单点故障”
- Resist the urge to suppress randomness:世界总是在熵增,工程师总是在解决问题,不要抵触问题
- Make sure that you have your soul in the game:人生如游戏啊,写软件也是编织虚拟世界的游戏,既然来了,就用心打好这个游戏吧
- Experiment and tinker — take lots of small risks:勇于尝试和试错,俗语说的好,“小病不断,大病不来”,也算未雨绸缪了
- Avoid risks that, if lost, would wipe you out completely:谨防大错,我们都知道系统崩溃是怎么回事,一个大bug送你回老家
- Don’t get consumed by data:不要消费太多数据,最后自己被数据消费了
- Keep your options open:开放心态,多个角度看事情;解决一个问题有很多技术选择,不要一条道走到黑
- Respect the old — look for habits and rules that have been around for a long time:这一条尤为重要。新技术眼花缭乱,但很多是新瓶装旧酒,关键搞明白里面不变的。一会儿Java一会儿Golang?可能归纳理解编译器、面向对象设计、泛型、多线程的原理才是根本的。Vue还没有弄透又出来个Svelte?也许JavaScript、MVC/MVVN、DOM、动态语言的原理才是基础的。
不仅过低碳生活,还要写低碳代码
大部分的码农,都有“宅”的属性,并且可能是最不嗜烟酒、不擅社交的群体。码农对物理世界索取不多,对社会产出不少。少欲的、极简主义的甚至断舍离的生活方式,有助于对物理世界物品的占有欲的降低(当然,可能需要通过拥有虚拟世界物品的例如NFT什么的而获得弥补 - 人性的贪婪部分,估计也会被数字化),从而引领年轻一代率先对减低碳排放作出贡献。
怎样做一个低碳码农呢?可以试试以下几点。
低碳出行
这个是必然的,如果你加入一家云原生的数字企业、一个虚拟社区化的码农“合作社”,你甚至不用每天通勤。只要在有互联网的地方,就可以生活。你甚至可以趁年轻的时候,不赶着买房子,试一阵子潇洒的“数字游牧”,在一个你喜欢的城市或者乡下居住,网上工作。也许你可以把节省下来的交通费和时间用于改善一下自己的生活。
早冥读写跑,人生五件套
为了节省能源,你应该尽最大的可能利用太阳能 - 即日光。早睡早起,这样不仅身心健康,还节省电费。早起可以跑步冥想,让一天工作效率得以保障。工作效率高、产出质量好的话,做给领导看的996是没有必要的。还可以把阅读和写技术博客作为自己的常规事务,哪怕一天只有40分钟,强行打断一下自己,避免深陷于bug fix中不想睡觉不想起来吃饭的状态...
选一个绿色低碳的编程语言
为了支持国家在2030年碳达峰、碳中和的战略决策和行动计划,程序员也是可以作出个人贡献的嘛。那就是:选择一个节能的编程语言,开发高效的软件!
哪种语言最省电?还真有人研究了,基于葡萄牙三所大学的一群研究人员的分析报告,大体上来说,执行速度越快的语言总体上越“绿色”(但并非绝对)。虽然报告的结论并不能对所有语言作出明确、绝对的排名,而且在不同的应用场景下,各语言的排名各有优劣变化,但是大体上还是能形成一个判断:C语言是最绿色环保的语言,而Rust、C 、Pascal、Java、Go总是在第一梯队。其中Rust在“Energy”这一项仅略次于C。
考虑到C这么古老,在开发多线程安全、内存安全的应用方面风险较高,选择Rust这个正式被接受为Linux内核开发语言(C语言之外唯一。C 都没享受这信任待遇)的编程语言,如果条件允许的话,基本上是一个不会错的选择。从复杂的服务器端应用到低内存低CPU配置的IoT设备,都可以运行Rust编写出来的代码。
采用一个“不求人”的工具栈
当你的软件需要面向用户(而不仅是在后台跑数据或者提供提供API接口服务)的时候,光是你的项目前端就很有可能不得不面对复杂情况,例如,多终端:少则一套网页,多则iOS、Android、PC软件、甚至智能/车载设备多端;多语言:HTML、JavaScript、Java、Kotlin、Objective-C、Swift;多形态:网页、小程序、App、Desktop软件。开发过程需要依赖很多不同技能的工程师配合,联调测试才是最低效痛苦的过程。
有没有可能让这些技术的集成变的简单低成本,能在自己的开发环境掌握?例如我虽然不是移动端工程师,我有一些想法主意,需要打造一个App玩玩?可以试试这么一个技术栈:
- iOS/Android:生成一个壳应用(也就是通常各平台的“Hello World”示范demo)
- 嵌入FinClip SDK,一个运行小程序形态的轻应用的安全运行沙箱。它能瞬间把你的App变成一个像互联网大平台才拥有的“超级App”,可以运行各种小程序
- 开启你的小程序开发模式:所有的用户交互、应用场景逻辑,从现在起可以按小程序的方式开发,你自己的App将能够运行它们
- 运营你自己的FinClip小程序中心,让你自己或者你的其他队友上架小程序
- 使用一些FinClip SDK扩展,例如WebRTC、地图等等,去扩展你的原生App能力并赋能给小程序
- 还缺基础技术功能?用我们的绿色低碳Rust开发,编译成iOS、Android链接库
- 服务器端?能写小程序的人,写个Node.js MongoDB没问题。把Node.js换成用由Node.js原发明者用Rust开发出来的Deno,就更有趣了...
一根网线、一台手提电脑、一套玩熟的技术、一张桌子、一张好椅子,这就是我的工具栈。捋起袖子,什么都能写 - 起码得有这睥睨天下左右的劲儿,有没有?进可team work,退可solo,技术上的逍遥感最棒了。
等等,技术栈还缺一个神器
在家办公,可能失去了趁等待代码编译或者跑自动化测试之机去公司的咖啡机弄杯咖啡的乐趣 - 不仅是为了喝杯咖啡提神,而是闻闻泡咖啡过程的香气、放个松、缓过神。在此强烈建议,除了电脑、几个屏幕、机械键盘、人体工学椅之外,我们这个职业的,必须配置一台胶囊咖啡机(品牌就不写了,没收广告费,没理由白写),一颗极高品质的胶囊才3.8元人民币,品质是市面某些连锁店的十分之一,可是好喝十倍...
咖啡机小贵,可这是值得的对自己的投资,作为对我们这“工具栈”的一个小补充。说不定在喝着咖啡坐等编译的时候还能仰望一下星空(记得回收胶囊,绿色环保)。
软件改变世界
改变世界的事情很多,有很好的有很不好的。软件编程肯定算其中之一 -- 早在N多年前硅谷的“先知”就预言过“软件吞噬世界”。既然是改变世界的行当,作为程序员还是应该心怀庆幸 - 还好没太入错行,无论是在开源运动的乌托邦里参与编织虚拟世界也好,还是在企业IT里搬砖,只要还能写高品质的代码,一时半会儿...你是安全的。
但软件工程师需要耐心和平静才能写好代码 - 我们都知道在生产环境抓虫救火的时候,气急败坏、心急火燎的quick fix,往往忙中出错(例如不小心删个库什么的)。开发时忙着赶工的quick-and-dirty的方案,不是深思熟虑的,往往为未来埋下隐患。游刃有余的驾驭一个工具栈,可让我们好整以暇地coding,宁静致远地生活...
真正的软件工程师是创造者,自然也应该是理想主义者,不是吗?