《敏捷软件开发(珍藏版)》

从解决问题的角度讲设计模式非常好,特别是两个解决统一问题的设计模式一起讲。

有一个小错误:P67 setUp()写成了steUp()

敏捷宣言
我们一直在实践中揭示更好的软件开发方法,身体力行的同时也帮助他人。
由此,我们建立了如下价值观:
个体和互动 优先于 流程和工具
工作的软件 优先于 详尽的文档
客户合作 优先于 合同谈判
响应变化 优先于 遵循计划
也就是说,尽管右项有其价值,我们更重视左项的价值。

面向对象设计的原则
SRP 单一职责原则 就一个类而言,应该有且仅有一个引起它变化的原因。
OCP 开放-封闭原则 软件实体(类、模块和函数等)应可以扩展,但不可修改。
LSP 里氏替换原则 子类型必须能替换掉它们的基本类型。
ISP 接口隔离原则 不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。
DIP 依赖倒置原则 抽象不应该依赖于细节。细节应该依赖于抽象。
REP 重用发布等价原则 重用的粒度就是发布的粒度。
CCP 共同重用原则 一个包中的所有类应该是共同重用的。如果重用包中的一个类,那么就要重用包中的所有类。相互之间没有紧密联系的类不应该在同一个包中。
CRP 共同封闭原则 一个包中所有的类对同一类性质的变化应该是共同封闭的。一个变化若对一个包有影响,就会影响到包中所有的类,但不会影响到其他的包造成任何影响。
ADP 无依赖原则 在包的依赖关系中不允许存在环。细节不应该有其他依赖关系。
SDP 稳定依赖原则 朝着稳定的方向进行依赖。
SAP 稳定抽象原则 一个包的抽象程度应该和其他的保持一致。

很多团队迷失在追求文档而非软件上。这通常是个巨大的错误。有条简单的规则称为“文档的马丁第一原则”,意在防止此类错误发生:
除非文档紧急且重要,否则不要写。

“大千世界,唯一稀缺的是人类的注意力。”——凯文·凯利(KK)

每个软件模块都有三项职责。第一项职责是运行所完成的功能。这是该模块得以存在的原因。第二项职责是它要应对变化。几乎所有的模块在它们的生命周期中都要变化,开发者有责任保证这种改变应该尽可能简单。一个难以改变的模块是拙劣的,即便能够工作,也需要对它进行修正。第三项职责是要和读的人沟通。对该模块不熟悉的开发人员应该能够轻松地阅读并理解它。一个不能沟通的模块也是拙劣的,同样需要对它进行修正。

在 SRP 的语境中,我们把职责定义为“变化的原因”(a reason for change)。如果你有超过一个的动机去改变一个类,那么这个类就具有多种职责。有时,我们很难注意到这一点。我们习惯于以组(group)的形式去考虑职责。

许多开发人员可能会对“合理假设”的行为这一概念惴惴不安。怎样才能知道客户真正的要求呢?有一种技术可以让这些合理的假设明确下来,从而支持LSP。这种技术就是基于契约的设计(Design By Contract, DBC)。梅耶(Bertrand Meyer)对此做过阐述[Meyer1978, p.331]。
使用 DBC,类的作者明确表达出对于这个类的契约。客户端的代码可以通过契约获悉可以依赖的行为方式。契约是通过为每一个方法声明前置条件(precondition)和后置条件(postcondition)来制定的。要让一个方法得以执行,前置条件必须为真。执行完毕后,这个方法要保证后置条件为真。
按照梅耶(Meyer)的阐述,派生类的前置条件和后置条件的规则如下:
在重新声明派生类中的方法(routine,例程)时,只能使用相等或者更弱的前置条件来替换原始的前置条件,只能使用相等或者更强的后置条件来替换原始的后置条件。[Meyer97,p.573]
换句话说,当通过基类的接口使用对象时,用户只知道基类的前置条件和后置条件。
因此,派生类对象不能期望这些用户遵从比基类更强的前置条件。也就是说,他们必须接受基类可以接受的一切。同时,派生类必须和基类的所有后置条件一致。也就是说,它们的行为方式和输出不能违反基类已经确立的任何限制。基类的用户不能被派生类的输出干扰。

包的设计原则
粒度:包的内聚性原则
重用发布等价原则(REP)
可以复用的粒度就是可以发布的粒度。
共同重用原则(CRP)
在包中的类可以一起被复用。如果你复用包中的某一个类,那么就要复用包中的
所有类。
共同封闭原则(CCP)
一个包中的类对于同一类型的变化应该是共同封闭的。对于一个包的更改会影响
到该包中的所有类,而不会影响到其他包。
稳定性:包耦合性的原则
无环依赖原则(ADP)
包之间的依赖关系图中不应该存在环形。
稳定依赖原则(SDP)
向着稳定的方向依赖。
稳定抽象原则(SAP)
包的抽象程度应该和其稳定程度一致。

《元宇宙改变一切》

元宇宙商业之父马修·鲍尔的著作,有关元宇宙的历史,还有八大元宇宙元素。

元宇宙还比较像游戏,不管是技术、引擎、网络,还是内容、互动。

“新IT”智能技术(Inteligent Technology),是“旧IT”信息技术(Information Technology)和“老IT”工业技术(Industrial Technology)的升级和升华。“老”“旧”“新”三种IT技术将融汇起来,开发我们面临的波普尔的“三个世界”;物理世界,以老IT工业技术为主;心理世界,以旧IT信息技术为主;人工世界,以新IT智能技术为主。

技术转型之所以难以预测,就在于它不是由任何一项发明、创新或个人推动的,而是许多变化共同作用的结果。

我在写作和讨论有关元宇宙的内容时,对元字宙的定义是:大规模、可互操作的网络,能够实时渲染3D 虚拟世界,借助大量连续性数据,如身份、历史、权利、对象、通信和支付等,可以让无限数量的用户体验实时同步和持续有效的在场感。

在“应用内购买”方面,苹果创建了三大类交易模式。第一类是针对实物产品的交易,例如用户从亚马逊购买多芬香皂或加载星巴克礼品卡。在这类交易中,苹果不收取任何佣金,甚至允许这些应用程序直接使用第三方支付渠道(比如 PayPal 或 Visa)来完成交易。第二类是针对所谓的阅读器应用程序的交易,其中包括捆绑非交易内容的服务(比如随心享用的奈飞、《纽约时报》、Spotify 订阅),或者允许用户访问他们之前购买的内容,例如一部之前从亚马逊网站上购买,但现在想在亚马逊的 Prime Video iOS 应用上播放的电影。第三类是针对交互式应用程序的交易,用户可以对其内容产生影响(比如在游戏中或云驱动器中产生影响)或对数字内容进行单独交易(例如在 Prime Video 应用程序上租赁或购买一部电影),这些应用程序只提供应用内计费选项。

根据“去中心化”资产具有“中心化”依赖性这一事实,我们可以得出两个主要结论。
第一个结论是,NFT 是无用的,伴随它的是欺诈、猜测和误解。
第二个结论是区块链对于元字宙的重要性。

《ChatGPT:人类新纪元》

像读小说一样轻松的彩色科普读物

搜狗输入法之父——马占凯的第一本书

人类历史上一共发生了四次科技革命:
• 第一次科技革命,即机械革命,以蒸汽机为核心驱动要素;
• 第二次科技革命,即电力革命,以电力的应用为核心驱动要素;
• 第三次科技革命,即信息革命,以计算机和互联网的普及为核心驱动要素;
• 第四次科技革命,即智能革命,以通用人工智能为核心驱动要素。

《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》

现阶段,用ChatGPT得到的输出(不管是代码还是文档)比人全面但是非常的粗糙,无法实用。我觉得还是信息没有给到ChatGPT,是一种信息的鸿沟。所以只能说ChatGPT辅助开发,而无法像书名说的那样驱动开发。

表 1-1 技术发展对软件开发的影响
图 1-6 SDLC流程图
图 1-8 水母开发模式
图 1-9 水母开发模式的细节

GPT是 Generative Pre-trained Transformer 的缩写,其准确的中文含义是“生成式预训练转换器”。
口生成式(Generative):模型具备生成文本的能力。
口预训练(Pre-trained):模型在大规模的语料库上进行了预先的训练。
口转换器 (Transformer):模型采用了一种称为转换器的神经网络。

为了获得高质量且合适的答案,在向 ChatGPT 提出问题之前,我们首先需要确保所提出的问题满足以下几个要求。
口明确的目标:清晰地阐述问题的目标,以便 ChatGPT能够准确地理解并提供相应的信息或建议。
口具体的范围:设定一个具体的范围,这有助于避免过于宽泛或模糊的回答,从而使答案更具针对性和实用性。
口规定的输出:问题应该明确期望的答案格式和类型,例如,是否簧要列举步骤、提供案例或者给出解决方案等。
在 ChatGPT给出建议性的答案之后,为了得到更满意的结果,还需要继续进行以下步骤。
(1)足够的判断:在收到 ChatGPT的回答后,仔细审阅并判断其是否符合预期,是否准确无误地解答了问题,以及是否包含了所有相关信息。
(2) 有效的反馈:如果发现答案存在问题或需要补充,提供具体且明确的反馈,指出需要改进或补充的部分,这将有助于 ChatGPT 进一步优化答案。
(3)反复的选代:通过多次与 CharCirT 互动,不断完善问题和答案,以便最终获得高质
量且合适的解答。

软件开发生命周期(Software Development Life Cycle, SDLC) 是一种软件开发过程管理和控制方法,其历史可以追溯到20世纪60年代。

要结构化地描述间题,必须遵循以下七个步骤。
(1)确定问题的核心(核心):首先明确问题的关键点,包括你想要解决的具体问题和期望达到的目标。
(2)分解问题(详细):将问题拆分成更小、更易于管理的部分。这有助于更清楚地了解问题的各个方面,以及它们之间的关系。
(3)提供背景信息(背景):给出与问题相关的背景信息和上下文,这有助于ChatGPT 更好地理解问题的实际环境和需求。
(4)设定优先级(优先级):确定问题中各部分的优先级,以便 ChatGPT 能够根据你的需求和关注点提供针对性的回答。
(5)提出具体问题(具体):在描述问题的过程中,尽量使用明确、具体的语言。
避免使用模糊或多义词汇,以减少歧义和误解的可能性。
(6)陈述假设或限制条件(限制):如果问题涉及特定的假设或限制条件,请明确地表达出来。这将有助于 ChatGPT 提供更贴近实际需求的解决方案。
(7)指定期望的输出格式(输出):明确表述你希望得到的答案形式,例如列表、段落、图表等。这可以帮助 ChatGPT更好地满足你的期望。

HATEOAS (Hypermedia As The Engine Of Application State) 是 RESTful 架构中
的一个重要概念,它强调在Web 应用程序中使用超媒体驱动应用状态的方法。简单来说,HATEOAS 是一种通过超链接关联资源状态的方式,这些链接指向相关资源或操作。客户端可以通过这些链接发现和执行相关操作,而不必预先了解整个系统的结构和设计。这样的设计让客户端能够更加灵活地与服务器进行交互。简单地说就是,在API 响应中包含相关资源的链接,以便客户端可以轻松地导航到其他资源。这种设计使API更具可扩展性和可维护性。

《重返世界尽头的咖啡馆》

《世界尽头的咖啡馆》的续作

你为什么来这里?
你在自己的游乐场中玩耍吗?
你有MPO(Multiple Personality Order)——多重人格顺序吗?

有时候,哭泣是你的心在告诉你,它意识到了某件事情。

比起接受帮助,人们更容易选择帮助别人。这种人有一个特点,他们不愿多谈自己的事情。

当你遇到不知道怎么做的事时,你只需要找到一个能做的人就行了。

参透自己人生的意义是个太庞大的工程,所以应该先从小处着手,比如说这个人生五事。当你完成其中三件,你就可以更加了解自己。等你更加了解了自己,也就更容易明白自己的人生意义。

世界上有近五分之一的人活不到退休年龄。

你生命中的每一刻都是你和这个导航系统共同创造的:你向它展示你想要的人生,宇宙GPS为你创造相应的机会。

凡是过去都有存在的必要。
如果没有过去,此刻也不会发生。
你不必喜欢自己的全部过去,也不必释怀。你只需要知道,过去的作用是把你带到现在⋯⋯这就够了。

重点不是时刻为享受人生做好准备,而是去真真切切地享受人生。

每个行家里手在发轫之始,都对他们精通之事一无所知。

所有愤怒的根源都是恐惧。

做一个观察者,而不是沉浸其中,不要当局内人。

I a sage
I代表直觉(intuition)。
a代表永远会有另一道(another)浪等着你。
s代表小(small)浪练起,打牢基础,稳中求进步。
a代表问(ask)。
g代表行动(go)。
e代表每个(every)厉害的冲浪人都经历过不只怎么站上冲浪板的时期。

你无法选择在哪儿出生,但是可以选择在哪儿停留。你无法选择自己的身份,但可以选择和什么样的人来往。

真正的硬通货不是金钱,而是时间。

如果说某样东西有意义,那是因为你自己认为它有意义,不是因为别人告诉你它有意义。

《算法图解》

很易懂很基础

作者个人网站:https://www.adit.io

大O表示法让你能够比较操作数,它指出了算法运行时间的增速。

有两种访问方式:随机访问和顺序访问。顺序访问意味着从第一个元素开始逐个地读取元素。链表只能顺序访问:要读取链表的第十个元素,得先读取前九个元素,并沿链接找到第十个元素。随机访问意味着可直接跳到第十个元素。

每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。