先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注go)
正文
ACM与IEEE Computer Society联合修定的SWEBOK[14](Software Engineering Body of Knowledge)提到,软件工程领域中的核心知识包括:
- 软件需求(Software requirements)
- 软件设计(Software design)
- 软件建构(Software construction)
- 软件测试(Software test)
- 软件维护与更新(Software maintenance)
- 软件构型管理(Software Configuration Management, SCM)
- 软件工程管理(Software Engineering Management)
- 软件开发过程(Software Development Process)
- 软件工程工具与方法(Software Engineering Tools and methods)
- 软件质量(Software Quality)
软件工程与计算机科学
参见:软件工程主题列表
软件的开发到底是一门科学还是一门工程,这是一个被争论了很久的问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以被互相混淆。很多人认为软件工程基于计算机科学和信息科学就如传统意义上的工程学之于物理和化学一样。在美国,大约40%的软件工程师具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。
软件工程 | 计算机科学 | |
---|---|---|
目标 | 在时间、资源、人员这3个主要限制条件下构建满足用户需求的软件系统。 | 探索正确的计算和建模方法,从而改进计算方法本身。 |
产品 | 软件(比如办公包和编译器)。 | 算法(比如希尔排序法)和抽象的问题(比如哲学家进餐问题)。 |
进度与时间表 | 软件项目都有特定的进度与时间表 | 研究项目一般不具有设置的进度与时间表 |
关注点 | 软件工程关注如何为用户实现价值。 | 软件理论关注的是软件本身运行的原理,比如时间复杂度,空间复杂度,和算法的正确性。 |
变化程度 | 随着技术和用户需求的不断变化,软件开发人员必须时刻调整自己的开发以适应当前的需求。同时软件工程本身也处于不断的发展中。 | 对于某一种特定问题的正确解决方法将永远不会改变。 |
需要的其他知识 | 相关领域的知识。 | 数学。 |
著名的探索者和教育家 | 巴里·勃姆,戴维·帕纳斯,佛瑞德·布鲁克斯。 | 艾兹赫尔·戴克斯特拉,高德纳,罗伯特·塔扬,彼得·斯莱特,艾伦·图灵,姚期智。 |
著名的实践者 | 约翰·巴科斯,丹·布里克林,蒂姆·伯纳斯-李,林纳斯·托瓦兹,理查德·马修·斯托曼。 | 无。 |
例如彼得·麦克布尔(Peter McBreen)认为,软件工程意味着更高程度的严谨性与经过验证的流程,并不适合现阶段各类型的软件开发。麦克布尔在著作《Software Craftsmanship: The New Imperative》提出了所谓“craftsmanship”的说法,认为现阶段软件开发成功的关键因素,是开发者的技能,而不是“manufacturing”软件的流程。
软件工程的现况
Capers Jones曾对美国软件组织的绩效做过评估,所得到结论是:软件工程的专业分工不足,是造成质量低落、时程延误、预算超支的最关键因素。[16]
2003年,The Standish Group年度报告指出,在他们调查的13522个项目中,有66%的软件项目失败、82%超出时程、48%推出时缺乏必需的功能,总计约550亿美元浪费在不良的项目、预算或软件估算上。[17]
没有银弹与人月神话
在1986年,IBM大型机之父佛瑞德·布鲁克斯发表了他的著名论文《没有银弹》,在这篇著名的论文中他断言:“在10年内无法找到解决软件危机的灵丹妙药”。从软件危机被提出以来。人们一直在查找解决它的方法。于是一系列的方法被提出并且加以应用。比如结构化程序设计,面向对象的开发,CMM,UML等等。佛瑞德·布鲁克斯著名作品还有《人月神话》。
布鲁克斯在《人月神话:软件项目管理之道(The Mythical Man-Month)》提到,将没有**灵丹妙药(silver bullet)**可以一蹴而就,开发软件的困难是内生的,只能渐进式的改善。整体环境没有改变以前,唯一可能的解,是依靠人的素质,培养优秀的工程师。[18]
软件工程与计算机程序设计
软件工程存在于各种应用中,存在于软件开发的各个方面。而程序设计通常包含了程序设计和编码的反复迭代的过程,它是软件开发的一个阶段。
软件工程力图对软件项目的各个方面作出指导,从软件的可行性分析直到软件完成以后的维护工作。软件工程认为软件开发与各种市场活动密切相关。比如软件的销售,用户培训,与之相关的软件和硬件安装等。软件工程的方法学认为一个独立的程序员不应当脱离团队而进行开发,同时程序的编写不能够脱离软件的需求,设计,以及客户的利益。
软件工程的发展是计算机程序设计工业化的体现。
软件开发过程
主条目:软件开发过程
软件开发过程是随着开发技术的演化而随之改进的。从早期的瀑布式(Waterfall)的开发模型到后来出现的螺旋式的迭代(Spiral)开发,以致最近开始兴起的敏捷软件开发(Agile),他们展示出了在不同的时代软件产业对于开发过程的不同的认识,以及对于不同类型项目的理解方法。
注意区分软件开发过程和软件过程改进之间的重要区别。诸如像ISO 15504, ISO 9000, CMM, CMMI这样的名词阐述的是一些软件过程改进框架,他们提供了一系列的标准和策略来指导软件组织如何提升软件开发过程的质量、软件组织的能力,而不是给出具体的开发过程的定义。
方法学
软件工程的方法有很多方面的意义。包括项目管理,分析,设计,程序的编写,测试和质量控制。
软件设计方法可以区别为重量级的方法和轻量级的方法。重量级的方法中产生大量的正式文档。
著名的重量级开发方法包括ISO 9000,CMM,和统一软件开发过程(RUP)。
轻量级的开发过程没有对大量正式文档的要求。著名的轻量级开发方法包括极限编程(XP)和敏捷过程(Agile Processes)。
根据《新方法学》这篇文章的说法,重量级方法呈现的是一种“防御型”的姿态。在应用“重量级方法”的软件组织中,由于软件项目经理不参与或者很少参与程序设计,无法从细节上把握项目进度,因而会对项目产生“恐惧感”,不得不要求程序员不断撰写很多“软件开发文档”。而轻量级方法则呈现“进攻型”的姿态,这一点从XP方法特别强调的四个准则—“沟通、简单、反馈和勇气”上有所体现。目前有一些人认为,“重量级方法”适合于大型的软件团队(数十人以上)使用,而“轻量级方法”适合小型的软件团队(几人、十几人)使用。当然,关于重量级方法和轻量级方法的优劣存在很多争论,而各种方法也在不断进化中。
一些方法论者认为人们在开发中应当严格遵循并且实施这些方法。但是一些人并不具有实施这些方法的条件。实际上,采用何种方法开发软件取决于很多因素,同时受到环境的制约。
软件工程的发展方向
“敏捷开发”(Agile Development)被认为是软件工程的一个重要的发展。它强调软件开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。
敏捷开发被认为是一种“轻量级”的方法。在轻量级方法中最负盛名的应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应的是“重量级方法”的存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法的例子比如CMM/PSP/TSP。
面向方面的程序设计(Aspect Oriented Programming,简称AOP)被认为是近年来软件工程的另外一个重要发展。这里的方面指的是完成一个功能的对象和函数的集合。在这一方面相关的内容有泛型编程(Generic Programming)和模板。
软件工程的最大难题
转载于:https://www.ruanyifeng.com/blog/2021/05/scaling-problem.html
一、引言
大学有一门课程《软件工程》,研究如何组织和管理软件项目。
说实话,这门课不适合本科生,因为学生可能体会不到,课程到底要解决什么问题。只有亲身参与过大项目的开发,经历过大团队,才能感受为什么软件工程很重要,又很难做对。
软件开发有一个难题,叫做"扩展"(scaling),即怎样服务更多的用户。 你有10000个并发用户,跟你有10个并发用户,这是完全不同的概念,哪怕功能完全相同,背后的实现是完全不一样的。并发用户数上升一个数量级,软件就必须重构,大量问题随之产生。
大项目的技术难度高,管理难度更高,而且大团队的生产率往往很低,行动缓慢。 《软件工程》就是研究,如何扩展软件和团队,适应大项目的需要。
国外有很多专著,研究这个问题。前些日子,我读到一篇文章,推荐了两本书。第一本叫做《加速:构建和扩展高性能技术组织》,第二本叫做《规模:生物,城市和公司的普遍法则》。
我看了这两本书的介绍,觉得很有启发,下面就做一些摘录。
二、大项目的困境
一个典型的大型软件项目,开发过程通常是下面这样。
最开始的时候,它是一个小项目,开发人员就是两三个人,甚至可能只有一个人。产品比较简单,功能很有限。
第一版发布后,拿给客户使用,反响不错。客户要求的新功能,能够很快开发出来,Bug 修补也很快,因为早期客户往往可以与开发人员直接沟通,快速反馈。
公司于是决定投入更多人员,开发这个项目。团队慢慢变大了,软件开始变得复杂,开发速度逐渐变慢了,2.0 版花费的时间比预期要长一点。Bug 的修复难度开始增加。总之,新功能的开发日程变久了。
公司的自然反应是进一步扩充团队。但是更多的新成员其实会降低其他人的生产率,一个普遍现象是团队规模越大,每个人的平均生产率越低。
几年以后,代码逐渐老化,复杂性不断增加,项目开始停滞不前。某些极端的情况下,软件的维护成本变得非常高昂,并且几乎不可能进行更改。
最终,这个项目成为技术债务,等待被新项目替换。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2utsTlK-1660326005941)(https://cdn.beekka.com/blogimg/asset/202105/bg2021050819.jpg)]
三、为什么大项目的开发效率低?
大项目就像一头大象,让人望而生畏。可是一旦需要奔跑,大象就会步履蹒跚,被猎犬远远甩在后头。它快不起来的原因有两个。
(1)代码复杂度
随着代码量的增长,单个开发者想要理解整个代码库,变得越来越困难。如果团队超过五个人,每个人负责一个功能,那么单个人几乎不可能追踪系统的所有工作进度。
当你中途加入团队,整个项目是一个紧密耦合的大型系统,你又不理解系统的每一个工作细节。这时,你就不太敢修改以前的代码,因为不知道随之而来的全部影响。
你不真正理解系统,也就不会感到自己是代码的主人。你会很犹豫要不要重构,过时的代码开始累积,技术债务就这样出现了。长此以往,开发变得越来越不愉快和令人无法满意,最终导致人才流失。后面接手的新人,更难于重构那些遗留下来的代码。
(2)团队原因
随着团队成员的增加,交流成本开始指数式上升。如果整个团队有 n 个程序员,为了了解其他人的工作,你需要跟 n - 1 个人逐一交流(口头或者书面),那么整个团队的交流路径总数就是 n * (n - 1) / 2。这意味着,交流成本的增长速度是人员增长速度的平方,团队人数越多,协同的难度就越大。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yGPhOiI-1660326005942)(https://cdn.beekka.com/blogimg/asset/202105/bg2021050822.jpg)]
大团队保持扁平化管理,也会越来越困难,必须拆分成较小的群体。这时,对等的交流会被自上而下的交流所取代。团队成员会感觉,自己从平等的利益相关者,转变为普通的工作人员,工作动机受到了影响,责任感和主人翁意识都会淡漠。
管理层为了解决问题,会尝试组建新团队和新的管理架构。但是,不管怎么做,大型组织都很难保持所有成员的积极参与。
四、解决方法:代码解耦
大项目的开发效率不高,把这个问题归咎于程序员的技术水平低和管理不善,都是没用的。 根本原因是软件规模的增长,必然使得代码和团队变得笨重。 除非很早就认识到问题的根据,采取缓解对策,否则前面描述的情况,迟早都会出现。
解决这个问题,要从代码和团队两方面着手。
代码层面的解决方法是,将软件解耦,拆分成组件或者模块,防止各个部分紧密地耦合在一起。每个组件和模块,都可以独立开发,通过公开的接口被其它部分调用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1IbVWHX-1660326005943)(https://cdn.beekka.com/blogimg/asset/202105/bg2021050824.jpg)]
这样的话,就大大减轻了开发者的负担,只需要负责自己的代码即可,不需要关心其他部分的实现。每个部分都可以单独重构,不担心影响到其他部分。
五、解决方法:团队解耦
除了代码解耦,团队层面也需要解耦,要把人员分开。
这可以参考互联网的架构。互联网是迄今为止最成功的大型软件解耦实例,它之所以能够扩展,是因为它由一个个独立的节点组成。为了防止节点之间互相依赖,各个节点都遵循以下规则。
- 遵守公开的通信协议。
- 不需要了解其它节点的内部实现,就可以与之通信。
- 节点之间不直接共享状态,只通过通信交换数据。
- 每个节点单独开发和部署。
大团队也应该遵循类似的原则,进行解耦。
- 每个子团队都可以独立运作,不依赖外部人员。
- 子团队内部的运作,不需要被外部知道。
- 子团队之间的协调,应该按照公开的协议和规则,最好能够自动完成,避免私下协商。
六、团队解耦的注意点
团队解耦有一些注意点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9z5rNAl-1660326005943)(https://cdn.beekka.com/blogimg/asset/202105/bg2021050825.jpg)]
(1)子团队的人数不宜过多,每个子团队最好不要超过5个人。
(2)子团队应该是一个小型的全功能软件开发组织。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
g)]
(1)子团队的人数不宜过多,每个子团队最好不要超过5个人。
(2)子团队应该是一个小型的全功能软件开发组织。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-UJCQMzj9-1713605633063)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!