暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅聊关于程序开发第一性原理的一点思考

IT乌托邦 2021-01-31
813

事情要从今年的工作说起.从公司离职后,考虑做外包团队,做产品,从婚恋,程序员兼职平台.朋友推荐有几个需求帮着做了一些前期的需求梳理.发现自己在技术的路上有些生疏.终其原因是自己把关注点放在了项目的前期,第一步是想夯实下自己的理论基础.有一个比较好的方法来梳理自己的知识体系.于是把在某平台看的李智慧老师的课程又复习了一遍.并跟着思路总结了以下四个问题:


1. 程序是如何运行和崩溃的?

2. 如果你的架构师,你如何设计落地一个项目?

3. 系统发展中,有哪些具体的方法保障系统跟跟上业务的发展?

4. 如何在团队中沟通斌提升技术团队的开发效率?

 

这四个问题还是比较大的.很考验作为技术人的知识储备的宽度和深度,课程中言简意赅地抓住核心的知识脉络.给了我很多很好的思路.我邀请了两个技术圈的好友,一起围绕这个主题聊了两个多小时.收获很多,做些笔记,以备后忘.

 

第一性原理是我再李善友老师那边第一次听到的,同时推介了欧几里得的<几何原本>中所蕴含的道理.一个学科是可以通过最核心的几条公理和公设来推演出整个学科的发展脉络,我也在尝试着寻找什么是作为程序员,在计算机领域里的第一性原理.


我们或多或少知道: 程序=数据结构+算法. 这个是不是第一性原理呢? 还有我们说的高内聚低耦合, 还有精益敏捷的思想DevOps.根据2/8原则,到底哪些是我们要掌握的核心理论,我想每个人也都有自己的想法.

 

我原理的脉络是从数据开始的,这个可能也符合计算机的发展历史,最早的计算机是用来进行数值计算的.围绕计算能力的延伸,从第一代计算机的诞生的1946年到现在的74年时间里.计算机发展通过解决一个一个的当前的问题去迭代.基于计算能力的快速发展,慢慢提出了对缓存的要求,基于数据量持久化需求,发展出了磁盘.而后通过冯诺依曼大牛做了对计算机的封装,把各个发展出来的硬件和软件组合起来.形成了我们现代个人计算机的雏形.

 

个人以为计算机的本质是电信号的0和1.计算机发展的本质是在商业和数字业务的驱动下进行的技术(软件和硬件)的升级和整合.常规的方式是遇到问题后,通过中间层的概念来把要解决的问题抽象化.而其中要解决的问题是中间层后带来的另外一个新的技术问题,循环上升周,周而复始.

 


回到我们说的4个问题上.从现在程序员的世界里,要解决的知识储备也是有规律可循的. 首先是要对整体程序的运行生命周期有个了解.需要哪些领域知识的支撑.


 

首先从数据结构说起.涉及到了我们在开发中考虑不同的数据的组合方式(容器),不同的容器是通过什么样的逻辑来对数据进行存储和读写的.围绕数据在内存空间的使用情况,我们不妨从数组和链表的区别开始.在内存有限的资源里,我们如何更好的存储数据,不同的存储方式会带来哪些优势和劣势?比如创建数组分配是需要初始化类型和数组的长度,直接分配好一个连续的空间来进行存储.好处是我们能很快的通过下标进行查询.但是当内存空间经过垃圾回收后,其中空闲的空间就七零八落.内存的使用率上就会减低.所以衍生出了链表的方式.通过添加了一个索引的方式,让数据节点保存下一个节点的位置来把数据组织起来.到这里.数据在内存中的原理已经固定.后续的队列,栈,二叉树,红黑树,图的遍历和查询,都是在这个基础上做的推导和延伸.进而要解决的问题是如何把数据存储的时间和占用的空间进行分析.以便于能利用好有限的资源做出更多的存储和更快的读写能力.

 

在有了各种物理硬件后,对物理硬件到管理和用户的管理,操作系统作为早期的应用直接打通了我们面向机器操作的友好化.可以对不同的硬件提供接口,对文件进行存储管理,对网络协议进行封装.单台的计算机能做的事情越来越多.

 

同时有了数据结构和对不同结构衍生出来的算法,可以通过计算机帮助我们解决数学的计算问题,慢慢也能帮助我们解决一些办公的问题.随之发现还可以帮忙解决生活中的问题.通过编程语言从0和1到汇编,从汇编到C/C++,在到Java,php,python,go等等几百种语言的发展史上来看,编程语言经历了面向机器,面向过程,面向对象的递进和发展.这其中很多计算机的前辈和公司也付出了几代人的努力.为我们现在的计算机生态奠定了基石.


在面向对象开启了一个大门之后,Java的生态开始以一个小的项目开启了自己的生涯.在当时不同的操作系统之下,Java的开发者前辈通过一个中间层的概念,通过Java虚拟机的中间层,隔离了对不同操作系统的直接操作.由大牛们针对不同的操作系统来进行封装,省去了大家对底层的直接操作和依赖.提供了基于Class文件的格式来发展Java的语言体系,同时通过设计把内存的管理进行了分区和管理.大大的促进了开发者的效率.同时提供了JDK的各种开发工具包来辅助开发者们更好通过代码来构建一个一个大大小小的世界.

 

同时数据库的也是随着数据的积累在发展.这个作为一个单独的领域,慢慢从关系型数据库,到nosql数据库.再到图数据库.对数据的组织方式也在不断进步.


在数据的存储,计算和数据的传输交换中,程序从基于或解释或编译的方式.在不同应用服务器上进行着数据的的操作.同时程序在运行中,除物理方面的因素之外,很多就是考虑当前业务或者逻辑导致了资源的不足.比如网络带宽,计算,不同存储对IO读写能力的差异等等.


以上分别从数据结构,操作系统以及涉及到的文件管理,网络编程.各种编程语言和Java的虚拟机方面来阐述了自己对程序运行起来的认识和依赖.欢迎大家一起拍砖交流.文中不涉及具体的技术细节,旨在通过一些基本的思考来梳理脉络.词不达意的地方,欢迎指正.

 

今儿我们先围绕第一个话题展开.关于第二个话题我们另起在聊.


相关学习笔记和脑图已经梳理完毕.

如需深入了解.可关注后回复"第一性原理".添加笔者微信获取.


文章转载自IT乌托邦,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论