1.认识计算机
1946年第一台计算机ENIAC(Electronic Numerical Integrator and Computer)发明,她是第一台用于通用目的的电子计算机 。冯·诺依曼(Von Neumann)是一名美籍匈牙利数学家,他提出了存储程序原理(1945),并确定了存储程序计算机(Von Neumann or Stored Program Architecture)的五大组成部分和基本工作方法。计算机把程序本身当作数据来对待,程序指令(instructions)和该指令处理的数据(data)用同样的方式储存,工作时按一定顺序从存储器中取出指令加以执行并自动连续工作。虽然计算机技术发展很快,但存储程序原理至今仍然是计算机内在的基本工作原理,仍然是我们理解计算机系统功能与特征的基础。几乎所有的数字计算机都基于这个基础架构,其特性对当今流行的编程语言产生了很大影响,奠定了现代计算机的基本结构,并开创了程序设计的时代。

计算机的五大组成部分:
运算器:进行计算,包括算术运算和逻辑运算;
控制器:指挥、协调计算机各部件工作。它和运算器、寄存器及内部总线等共同组成了中央处理器,也就是我们常说的CPU;
存储器:这里主要是指主存,也就是我们平时所说的内存,它存储指令和数据;CPU读写数据只能直接和内存打交道,不能直接读写磁盘等辅助存储器里的数据;
输入设备:将数据发送到计算机,允许与计算机进行交互并控制数据。最常用或最主要的输入设备是键盘和鼠标;
输出设备:接收/显示数据的外围设备,通常用于显示、投影或物理复制。显示器和打印机是计算机中使用最常用的两种输出设备。
2.认识计算机程序
程序(program)是一组计算机能识别和执行的指令(instructions)集合,它详细地规定了计算机要执行的步骤,设计和实现这些步骤就要编程。了解计算机和编程已经成为许多行业的必备技能,就连青少年STEAM教育中都把学习编程作为重要内容之一。
软件(software)是计算机用于执行特定作业(jobs)的程序,通常用于提供特定的功能或服务。现代的软件都非常复杂,很难见到仅由简单的指令组成的程序,不仅如此,大多都还需要处理复杂的、大量的数据,某种意义上来说,软件=程序+数据结构 。如果说硬件是计算机骨骼,软件就是计算机的灵魂,没有软件,大多数计算机将毫无用处。
既然计算机只能识别O/1,那我们用高级程序设计语言编写的程序,计算机是怎样识别并执行的了?这就需要在我们写的代码和计算机之间引入一个“翻译”,她负责将“人类可读”的代码转化成“机器可读”的指令。这个“翻译”有两种工作模式,一种方式是把程序代码一次性的翻译完成,再送给计算机执行,我们称之为编译器(compile);另一种方式是“同声传译”,取一条指令、翻译一条指令就即可送给计算机执行,然后又去取下一条指令,继续翻译、继续执行,周而复始,直到执行完整个程序,我们称之为解释器(interpret)。
编译和解释各有优劣,一般来说,编译模式减少了执行过程中“翻译”的中断,执行速度会快些。但因为编译是针对特定平台的,程序的移植性就大大减弱。而解释模式就刚好相反,虽然损失了速度,但她天生就具有可移植性,因为程序的执行主要依赖的是运行于操作系统之上的虚拟机。
Python是一种解释型语言,我们通过开发工具编写好代码后,保存为.py扩展名的源代码文件/文本文件,然后交由Python解释器(interpreter)进行处理执行,为了提高解释模式的执行速度,Python解释器会做一些优化处理,对于重复调用的代码/模块先编译成字节码.pyc,下次再遇到相同代码时,只要你当前运行的程序没有源码改动,就不会进行编译,就可以直接使用字节码而不是重复“翻译”了。
3.计算机程序的表示——程序流程图(flowchart)
程序流程图以独立的图形来表达决策和结果,由赫尔曼·戈德斯汀(Herman Goldstine)和约翰·冯·诺伊曼(John von Neumann)在20世纪40年代开发,用于开发计算机程序 。流程图展现了一个step-by-step的向导式的解决问题的思路,把一个复杂的问题逐步分解成小问题求解,是一种结构化编程的思想。

程序流程图用规定的符号描述,不同的图形表示不同的意义,包括程序的数据的输入/输出、逻辑判断、处理顺序等等。上图就是一个登录系统进行账号密码验证的简单流程示意。
软件是如何生产出来的 ?
下面描述了一个典型的软件交付工作流程。

不同企业使用不同工具,细节会有所不同。在此背景下,一般步骤如下:
【第1步】产品负责人创建需求和用户故事。
【第2步】开发团队确定需求的优先级并组织 sprint。
【第3步】开发人员向版本控制系统提交代码。
【第4步】自动化服务器编译打包代码并运行测试,计算代码覆盖率和检查代码质量。
【第5步】如果编译成功,artifacts 将存储在 arifact factory 中。编译打包的软件包将部署到开发环境中。
【第6步】在多个隔离环境中独立测试产品功能。
【第7步】质量保证团队在 QA 环境中进行各种形式的测试,包括功能测试、集成测试、端到端测试、回归测试、性能测试等。
【第8步】验证完成后,将 artifact 部署到用户验收(user acceptance)环境中进行最终验证。
【第9步】通过测试的候选版本可根据发布计划部署到生产环境中。Big Bang 式的部署一般意味着大改动,也会带来较大的风险。我们可以采用功能标志(Feature Flags)和增量发布(incremental rollout)来控制风险。
【第10步】SRE(Site Reliability Engineering)团队监控生产环境并报告问题。团队根据定义的策略确定问题的优先级并进行修复。
——转自公众号文章【ByteByteGo】www.bytebytego.com