编程是一件很纯粹的事情。

编程要解决的问题是: 组合一系列指令,能完成指定的单个功能单元。编程的基础功底是:数据结构、算法、操作系统、编程语言。想要明白编程究竟是什么,强烈推荐阅读《编程珠玑》和《程序设计实践》。编程的进阶课程是: 编译器、数据库、计算网络。

编程要考虑的问题是:

  1. 在正常场景下, 预期输入是什么,预期输出是什么;
  2. 在可预见的错误情况下, 输入是什么,预期输出是什么;
  3. 在不可预见的异常情况下,程序是否可以有效应对,输出合理的关键信息。
  4. 在大数据量的情况下,程序跑得多快,占用多少资源?
  5. 程序实现的优势是什么,不足是什么? 是否有其他方案设想? 每种设想有什么障碍?

编程的精要是结构、算法与表达。对于大部分问题,设计适合的组合结构,在组合结构的基础上设计一系列操作和算法来实现指定目标,最后通过具体的编程语言、库来表达和实现。广义的结构包括数据结构和通信协议,数据结构包括容器结构如List,Map,Tree、对象结构、记录型结构如Mysql、 非关系型结构如Redis, ES, Hbase等以及众结构之组合嵌套; 算法是一个分析和设计的过程,是完成指定功能所需要的思路、流程、步骤、数据构造与处理,而表达则是借助编程语言提供的特性及开发库来实现算法,并处理其中的细节。

确定结构与算法后,表达最重要的是细节、耐心与细心。推敲各种正常、异常、大数据量场景下程序的应对策略和反应输出,耐心调试,细心测试。


软件则是编程与工程的混合体。

软件要解决的问题是: 组合、兼容和测试多个功能单元,构建、验证和发布能够与现实活动紧密配合的多项关联操作的有机实体。

软件要考虑的问题是:

  1. 合理优雅地封装与设计;
  2. 快速有效地复用和组合;
  3. 持续稳定地服务和增强;
  4. 应对现实需求的多样化、大数据流量或峰值流量、不稳定的环境波动;
  5. 避免明显和严重的BUG,保护客户的数据和应用安全。

加分项: 写作分享、代码质量、Linux、设计模式与案例。

对于软件开发而言,即使开发迭代过程中有持续重构保驾护航,初期的整体设计是非常重要的。缺乏初期的整体设计,很快功能就会横七竖八地堆砌起来,到一定程度时,兼容起来会异常困难而且容易出BUG。


编程和软件开发的中心议题都是数据及数据结构的处理,侧重点不同。

对于编程来说,数据是纯粹的数值和字符串。适当地建模,将不同性质的数据组织成合理的结构并设计算法高效地处理,这就是编程的视角。编程侧重问题求解,侧重构造,是软件开发的基础构件。

对于软件来说,数据必然要带上业务属性,软件必须考虑业务属性的敏感性并作出特别的处理。比如资金和订单,就是不同业务属性的数据,而资金更加敏感。数据敏感性来源于现实世界的生存压力和文化约束。

软件开发特别要注重整体和宏观设计,考虑模块之间的良性连接、组合和可维护、可扩展性。 软件是无形之建筑的设计与实现。


从更统一的角度来看编程和软件开发,两者都是关于逻辑结构设计与实现的技艺。数据的结构,配置的结构,算法的结构,指令的结构,控制的结构。结构有大有小,本质却是一样的:

更像堆积木,需要理解和熟悉现有设计好的或日新月异的积木,设计新的积木。积木无论大小。好的积木稳固健壮,有更好的槽口设计,能够更容易地与其他积木组合拼接成完整多样的形状。积木就是组件,一切逻辑均被组件化,通过组件构建商业服务。任何逻辑都应尽可能分解为可复用逻辑组件和定制逻辑。

对于要组件化的逻辑,问题是: 它应当且仅应当关注什么?