软件行业的历史, 从Alonzo Church的lamba演算开始, 也不满百年. 而从上世纪80年代微机出现之后, 才真正开始向大众普及. 距今几十年时间, 尽管发展速度较快, 但毕竟仍处于起步阶段. 在硬件实现了网络化, 标准化和模块化之后, 软件也开始了向云化, 服务化, 声明式的方向演进.
想要知道软件行业未来会朝着什么方向发展, 我们可以考虑一下, 如果没有软件, 我们的生活会是什么样的. 我的答案是生活还会继续, 但是会有一些不便. 在没有计算机, 没有软件的年代, 人们也照样生活. 那么计算机软件提供了什么价值呢, 就是让人的生活在某些方面更加方便, 尤其是计算机可以很好的承担自动和重复性的工作. 在过去, 如果人们需要一些工作能够自动完成, 就需要专门设计一些器械, 给定初始条件, 就可以自动执行. 比如, 沙漏在一段时间内通过沙子自动落下计时, 使用动物来拉磨也可以归到这种类型. 给定了器械的运行方式和初始条件, 就在一段时间内避免了人力的干预, 自动执行一些任务. 这是人通过自己的劳动实现对自己的一种解放. 而计算机软件所做的工作, 实际上也正是这样, 只是以现代的形式进行, 人通过编写相应的软件, 规定计算机的运行方式, 并以一定的操作触发初始条件, 使计算机按照人所设计的方式运行, 代替了人工的重复劳动.
所以, 软件行业未来的发展方向, 也是人越来越方便, 手动操作的越来越少, 而机器由于有了更多的软件而越来越智能, 能够做更多人所想要做的事.
其中, 除了更多行业的深入应用, 软件开发本身的进步和自动化是一个重要的基础. 现在的软件行业开发效率还是相当低下的, 很多时候我们面对的都是通用和简单的需求, 却无法以标准和通用的方式迅速实现功能. 除了技术的局限以外, 缺乏标准通用的规范是一个重要的问题. 基本的业务需求其实是相对稳定的, 但是我们只有底层的各种技术, 虽然提供了较大的灵活性, 但是降低了开发的效率和可控性, 使得开发变得充满了风险和不确定性. 流行的约定优于配置的思想正是致力于简化这一问题, 很多时候我们并不需要复杂高深的技术, 而只是对于常用业务场景的规范化约定. 这种约定越多, 软件开发将会越加可控和高效, 也才有真正的自由.
另一种提高开发效率的方式是类似复制粘贴的原型化开发模式. 世间万物总是兼具相似性和差异性, 与其从头开始建造一个新事物, 不如直接从相似事物开始, 通过模仿, 复制, 修改, 从而勾勒出逐渐接近需求的新事物. 模仿和创造的方式, 简单深刻和有效. 也是面向对象思想的精髓之一, 所以js使用了方便的原型继承, 让这一思想能够直接的显露作用. 在现实生活中的其他领域, 模仿也是学习最重要和有效的方式之一. 比如, 长期流传的师徒相授的技术传承模式, 或者, 中国的航母建造也是从参考和模仿开始.
从我自己的经历来看, 很多软件项目的需求都较小且不复杂, 可以说, 都是属于用excel和ppt就可以基本实现的功能. 但是选择用web和数据库的方式实现之后, 复杂性却极大上升, 企业不得不在自己组建开发团队和外包之间作出选择. 而这中间又有很多是来自一堆零散的技术相互衔接的问题, 比如, java之前流行的SSH开发模式, 甚至连配置这些框架的组合都成为了一种高级技能和耗费大量时间的工作, 而这其实和实现业务功能毫无关系. 再比如前后端分离和渲染这些问题, 也不是业务本身的要求, 却在开发中成为了很大的问题. 提供一种贴近业务的, 高层和整体化的技术, 语言或框架, 让开发人员专注于业务, 而技术本身负责整合技术, 是一种实实在在的需求.
clojure在这方面做出了自己的尝试和努力. 作为一种lisp方言, clojure的代码简洁明快, 接近问题描述本身. 而其构建的技术栈从客户端到数据库(Datomic), 在各个层面提供了相似的语法和思路, 让开发人员可以专心在业务本身而不是各种环境和技术实现的差异. clojure的问题在于其和主流语言不同的语法和思路, 有着较为陡峭的学习曲线.
除了clojure, js和kotlin也都值得关注. 他们也都提供了全栈开发能力, 理论上说是可以以统一的思维开发前后端. js比kotlin更进一步的地方在于有JSON格式的数据库mongodb和couchdb. 而kotlin没有符合自身思维的持久化数据库产品.
所以说, 编程的核心问题是数据. 由于现在主流的数据库是关系数据库, 而关系数据库的标准查询语言sql又不足以支撑前后端的整体开发, 所以才产生了各种中间技术去对接关系数据库. sql本身是非常优秀和先进的, 如果能够进行一些扩充和改造, 作为一种通用的业务和数据描述语言其实是非常理想的.
不管是学习哪种技术的程序员都建议阅读'七周七语言', 书中介绍了主要的函数式语言, 还有Io和prolog这样很有思想的语言. 关注和了解这些不同的语言, 能让我们从更多的角度审视我们每天所做的开发工作, 想一想自己究竟在做些什么, 是不是可以做的更好.
行业与公司
关于软件公司, 主要分为两种, 一种是自己组建开发团队, 负责自己公司的产品和业务的公司. 其余都是属于各种形式的外包公司. 从规模上来分, 有大公司和小公司. 大公司人多, 岗位分工较细, 小公司则流行一人做多种工作. 其实在现在的技术条件下, 这些岗位和公司结构都是无奈的选择. 而且多数公司也会有对于工作经验的要求, 以学历, 专业, 工作年限等方式设置门槛, 愿意接收基础性实习岗位的相对较少, 需要相应的机遇. 大家可以根据自己的情况选择公司和岗位.
需要提醒的是, 尽管开发属于技术工作, 还是尽可能关注一下公司所经营的业务, 行业和未来成长性. 一方面是更好的从事工作的需要, 另一方面, 由于软件属于高新科技行业, 很多投资人也是在没有明确认识的前提下投资, 最终公司无法生存和盈利, 工作的稳定性也无法保证.
目前为止, 软件开发还是一种辛苦的工作. 很多公司不愿意接收年纪偏大的程序员, 实际上主要是在压榨年轻人的时间和精力. 在这种环境下, 很多程序员也是抱着干几年, 攒点钱回老家的想法, 并没有把软件当成一种可以长期从事的工作. 这是这个行业的现状.
当然, 如果准备长期在这个行业发展, 还是要学习一些深入的知识. 我们所讨论的, 只是从零基础到快速入门的一些要点. 无论学习什么技术, 都要始终把握为用户服务的思想. 如果我们做业务和产品的开发, 就要考虑让最终用户使用方便, 如果做技术框架方面的开发, 要考虑让程序员使用起来简单. 最怕的是没有清楚的方向, 甚至是以炫耀新技术为导向. 技术无论新旧, 都是为满足需求服务, 没有完美的技术, 都需要根据使用场景选择最方便可用的.
最后, 一定要注意保护身体, 从技术和工作流程两方面去提高开发效率, 而不是耗时间. 让自己时刻保持更新的状态, 进步是很好的休息. 长时间的重复工作则会使人厌倦, 况且将来可能被机器人淘汰. 多学习, 多思考和总结. 既要敢想敢干, 也要稳扎稳打. 写出好的软件是一种很有成就感的工作, 既可以为社会进步做贡献, 也可以为自己赢得收入和更好的物质精神生活. 有愿望的话就一起努力吧!