最近一是因为疫情,被困在公司一个月,有了更多的时间来看书思考、写写代码,二来过年去老丈人家闲来无事,把自己吃灰好一阵子的iMac背上,在别人打牌聊天的时候把自己关在屋子里敲一敲代码,做一些小需求,顺便也有些学习收获。
此外,最近又看了《重构-改善代码的既有设计》,《刷新》,《金字塔原理》,查资料学了一遍nodejs,JavaScript,微信小程序(不屑于说,总觉得它没有灵魂),OpenCV(刚刚入门看),怎样写Markdown,感触颇深,被现在自由软件世界高效运转的模式给震撼到了。自由软件世界俨然成为了一座规模超大的摩天大楼,但是如果一个开发人员需要登天,也就只差一步。
作为一个十年码龄的非科班程序员,我对软件的理解也是在逐步加深。
两点感触吧,随便写写,但落脚点确是在一个天大的话题:怎样提升软件能力?
1. 全栈是程序员的基本素养
拿我自己来说,嵌入式单片机C语言出身,上大学的时候做了自认为三件有意义的事:学习,实验,打拳。所谓的实验其实就是电子设计,电路+机械+代码,花时间最多的也是在代码上面。
那时候的认知里软件就是代码,在老师教之前自学的C语言,拿一块开发板跑跑Demo小程序,再做一做自己感兴趣的项目,觉得最high的事便是程序按照自己的预期来运行,并给出结果,实现功能。做过智能家居,信号测量,用单片机搭建UDP的服务器,事情做的不少,但是接触到的业务知识仍然没有脱离C语言的if else。
工作之后看到牛人们如何做模块设计,如何去从顶层来规划软件,这个时候才对设计有了一些认知,方才懂得原来软件是一个复杂的工程,代码跟软件是完全不同的两种东西,代码要成为软件还有很长的路要走,核心的一点是基于各方不同因素所考虑的设计工作。
由于工作的前几年从事的是嵌入式软件的上层业务,所以除去业务流程的设计,DT等工作,主要的工作内容也是围绕着C需要的if else,虽然偶尔会看到好代码里面所体现出来的诸如观察者,工厂等设计模式,但知识域上也确实不需要太多的拓展。
后来因为开发某块新的单板,操作系统也从xx切换到了linux,这段时间开始接触到了linux的makefile,gdb,gcc,shell,so,信号量等概念和技能,有了这些能力加持以后,在我们的领域内可以很轻松的搞定一些疑难杂症,后来连最棘手的死机问题都不在话下,有一段时间我居然成了远近闻名的死机专家。也是从那个时候开始,技多不压身的扩展领域学习,让我真正建立了工作后的技术自信。
技术情节让我不断地接触新的能力版图,因为做业务测试工具的需要,学习了C++,MFC,C#,对于一个长期使用面向过程语言进行业务开发的人来说,面向对象语言丰富的封装模板和高级接口简直好用地不要不要了。那个时候python还不是很普及,我后来接触到python后才发现原来python又是一个好用到爆的编程语言,这不是在于语言本身有多么先进和高效,而是这种语言的开发生态和极其丰富的扩展库让你好用到哭,几乎我们能想到的需求,都已经有人给你做的七七八八了。至少说,如果我们再做业务之外的编程时候,python的信手拈来绝对会让你无法拒绝。
因为公司内近几年有软件认证的要求,为了应试,基本上大家把软件科班大学四年的主要课程都学习了一遍,虽然考试只仅仅是一瞬间,但是这些软件工程,算法,设计等等一套完整的软件方法让包括我自己在内的广大开发人员至少在意识上进步了不少,我们又认识到只有拥有软件全系统的能力模型,才能真正地理解并且做好软件。
如果说嵌入式是一个相对封闭的软件生态,那么web领域绝对是一个万花筒。有一种百花齐放的感觉,但是每一种技术栈或者能力又必须去掌握。正好我所负责的业务里既有嵌入式又有web,我需要对web有一些了解。疫情期间自己有一些idea要去实现,所以逼着自己去学习并且尝试去使用这些武器。
需求比较简单,华为手机运动健康app里的体重记录不好用,无法给出远期和近期相对直观的体重曲线,就想自己做一个web程序,可以随时录入自己的体重数据,并且以曲线的形式体现出来,自己根据曲线趋势调整能量摄入和运动量。
考虑到手机端,平板端,电脑端等跨平台的需求,而正好我有一台ECS,除了做博客网站也没啥用,就确定了web方向,这就要我自己动手来实现后台和前端。
先说说前端,大学的时候自学过html、css、asp,而当下前端最好用地动态编程语言莫过于JavaScript,在菜鸟教程里看了一天之后,很快就喜欢上了:接近C语言的书写习惯,随意的语法规则,面向对象的字符串处理,极其丰富的开发库。比如,这个应用的核心部分画曲线,chart.js囊括了各种常用的曲线形态,十分好用,上手简单。另外,因为后来一些业务逻辑的思考,当某一个问题困扰我的时候,去找一找总会发现有好多现成的方案放在那里。比如我要实现一个小需求,post数据请求后,部分页面的数据更新,页面整体不用刷新,这个时候Ajax出现能完美解决这个问题;需要更加简洁代码的时候Jquery就摆在了我的面前。
后端学习中跟JavaScript一样语法的nodejs,神通广大的express,无限扩展的npm,都让我在过程中不断的学习,并且利用之达成我的目的。轻松的利用几行代码便能实现最终的业务功能。
所以无论是在软件开发流程里的设计、开发、测试等环节,还是在各种语言和生态里的全栈技能,只有真正掌握了,才能做出真正的好软件,在软件行业里如鱼得水。
2. 软件要有好的发展关键在迭代与传承-核心思想是自由软件
关于软件全栈,废话有点多,第二点自由软件相对就要更加直白一些了。
linux的创始人是我认知里的自由软件鼻祖,西方的IT社会,在此基础上不断发展。
各大软件社区是自由软件得以发展的巨大动力来源。
这里面有两点我觉得是自由软件蓬勃发展的基石:分享和复用。
软件的分享在于开发者源源不断地对社区的贡献和对自己开发作品通过书写markdown等方式进行总结和传承,让繁杂的代码赋予思想高度,能让读者真正找到精神内涵。
另一个复用,充分体现了模块化的编程思想在软件大厦的应用,每个人的贡献好比一块砖头,别人不需要重复造砖头恰恰体现了这块砖头的价值。最近我也意识到,当前我们本质上是一家硬件公司,但是软件一直没有效率最大化或者做出惊艳世界的软件作品,一个很重要的原因在于我们的软件没有复用可言。客观原因是软件太过依赖于硬件,跨产品线的复用难度十分巨大,但是再看看我们内围,统一产品线的不同产品不也是各干各的么?似乎没有真正能被各个产品复用的价值全家模块。
世界的软件和我们中国的软件完全是两个平行宇宙,要成为软件大国还有很长的路要走。
大年初三,酒后夜不能寐,有所感,几句狂言。