创建折衷书架的程序员指南

这张照片是由德国Poo-Carmano拍摄的

每个开发人员都应该有一个书架。 他的内阁中可能有许多文本集,但是并不是每个集合都为程序员提供了各种工具。 使用一套折衷的武器,开发人员可以从多个角度攻击问题。 通过多种多样的书架可以实现这种混合方式。 下面列出的作品提供了一个壁橱。

总览

本部分的书概述了开发人员标准工具箱中的技术。

代码完成

史蒂夫·麦康奈尔(Steve McConnell)的“代码完成” ( Code Complete)是程序员基本工具箱的概述。 该工作台包括计划,设计,编码和质量检查。 McConnell为这些主题以及其他主题提供了大纲。 他的素描为许多主题提供了最佳实践。 Code Complete中的建议和提要构成了开发人员的标准工具箱。

软件工程的事实和谬误

罗伯特·格拉斯(Robert Glass)的“ 软件工程的事实和谬论”是一些通用工作台案例的集合。 每个见解都提供了描述,任何争议的特征以及要参考的来源。 这些元素介绍了许多软件工程主题。 这些区域对于基本工具箱至关重要。 Glass的事实扩展了标准工具集。 他的书《软件工程的事实与谬论》对任何开发人员都是必读的。

哪个更有前途:数据科学还是软件工程? –数据驱动的投资者
大约一个月前,当我坐在咖啡馆里并为客户开发网站时,我发现了这个女人…… www.datadriveninvestor.com

神话人月

弗雷德里克·布鲁克斯(Frederick Brooks)的“神话人月”为基线工具包增加了基础见解。 这种智慧采取的是格言而不是数字。 布鲁克斯的数据可能不正确,尽管他的直觉是正确的。 Brooks的本能使他断言,为他人编写的软件比为开发人员编写的程序需要更多的精力。 他的直觉与大多数程序员的经验相符。 一位软件工程师可能会对Brooks引用的幅度差异表示怀疑,但是他仍然承认差距并不小。 关于这种差异的观点以及其他一些观点,是《神话人月》对基本开发工具带的深刻见解。

了解决策,思想和思想

该领域的主题扩展了基本工作台,其方法提供了对人类顶空的洞察力。

知识与决策

托马斯·索威尔(Thomas Sowell)的《 知识与决策》以人类知识和决策的草图扩展了标准技巧。 专长是分布的。 决策所需的专有技术是分散的。 做出每个选择的能力不是一个人甚至几个人掌握的。 有效的决策制定需要许多人,这一点使Sowell贯穿许多章节。 他的著作《 知识与决策》提供了人类直觉和判断力的基本描述。

理性乐观主义者

马特·里德利(Matt Ridley)的《理性乐观主义者 》通过人际知识交流的画面增强了基本工具包。 专门知识的交易使每个参与人员都拥有过多的技能。 实际上,结合知识后,可以设计出新的能力。 如果人类没有交换各自的见解,那么某些专门知识可能就不会为发明人所用。 了解这些交易是开发人员的有用工具。 程序员可以通过阅读Rational Optimist将这种技术添加到他们的工具箱中。

计算机程序设计心理学

Gerald Weinberg的“计算机编程心理学”以程序员顶空空间,他们的环境和他们的任务的图像扩展了标准工作台。 例如,软件工程师可能会受到工作挑战而不是金钱的激励。 任务本身包含一些意想不到的困难元素,例如规范。 编程和程序员的方面可能违反直觉。 但是,工程环境的某些部分(例如管理层次结构)在传统上更具挑战性。 软件开发领域有自己的肖像。 该图片是在工具带中有用的图片。 要将该草图添加到工作台中,请阅读《计算机编程心理学》 。

一般问题解决

这些内容通过一般性地攻击问题或广泛地攻击发展问题的方式来支持现有的武器库。

通用系统思维导论

杰拉德·温伯格(Gerald Weinberg)的“通用系统思维导论”通过难题的通用方法扩大了现有工具包。 这些方法源于一般系统原理。 该学说在众多学科中寻找潜在的相似之处。 这些跨专业的相似之处提供了许多有用的攻击。 例如,抽象和分解对诸如物理等学科固有的复杂性提供了攻击。 计算机编程的主题当然可以从通用系统哲学的技术中受益。 要将这些方法添加到军火库中,请阅读通用系统思想简介 。

实用程序员

安德鲁·亨特(Andrew Hunt)和戴夫·托马斯(Dave Thomas)的“实用编程器 ” 通过汇总解决常见问题的实用方法来增强工具箱的功能。 例如,解决方案与其目标之间的距离问题可以通过跟踪器项目符号解决。 如果解决方案,项目符号甚至目标都是问题,那么团队可以使用一个原型或一组原型来回答该查询。 这些机制只是The Pragmatic Programmer提供的几种。

有用的非软件学科

该地区的教科书通过非软件学科的方法增强了现有的工具范围。

一堂经济学

亨利·哈兹利特(Henry Hazlitt)的“ 一堂课的经济学”以经济学的基本概念增强了开发人员的工作环境。 令人沮丧的科学是一个充满方程,图表和图表的研究领域。 这些元素在哈兹利特的书中并不突出。 他更喜欢通过概念而不是数字来解释经济学。 主要思想是“可见和不可见”。观察到的是一阶成本和/或收益。 未观察到的是更高阶的支出和/或收益。 检测到的结果是直接结果,而未检测到的结果是第二,第三和第四级结果。 这些事件及其感知将在本书的各个章节中进行讨论。 哈兹利特的《 一课经济学》将经济学的概念添加到了程序员的武器库中。

如何直接思考心理学

基思·斯塔诺维奇(Keith Stanovich)的《 如何直接思考心理学 》以各种科学技术扩展了开发人员的工具包。 斯塔诺维奇的书中没有提到科学。 然而,他的书实际上是科学工具的入门。 作者将它们应用于心理学,但是他可以很容易地将它们应用于任何其他领域。 软件开发可以很容易地使用诸如随机抽样,盲法,实验控制等方法的入门手册。要详细了解这些方法,请阅读《 如何直接思考心理学》 。

无能

约翰·艾伦·保罗(John Allen Paulos)的Innumeracy为程序员提供了基本的统计工具。 开发人员可以进行基本数学运算。 然而,Paulos的书试图提供的不仅仅是数字技能。 无知力试图使读者具有数学推理的能力,这是人类心理学可能会感到困难的能力。 Paulos解释说,人类的直觉明显阻碍了思考数字的能力。 无能证明了一个人的直觉和统计数据如何揭示不同的答案。 保罗·罗斯(Paulos)试图驾车回家是结果上的差异。 他想为他的读者提供防止自己直觉错误的工具。 程序员的直觉并不比非程序员的直觉好。 软件工程师与其他任何人一样,需要Innumeracy提供的技能。

开发过程

本节中的书籍将与软件开发过程相关的当前工具箱技术添加到其中。

增量承诺螺旋模型

Barry Boehm,Jo Ann Lane,Supannika Koolmanojwong和Richard Turner的“增量承诺螺旋模型”为开发人员提供了程序方法。 这些方法包括一个过程和几个原则。 该系统适用性不如原理。 这些规则可用于扩充现有策略,而该方案则需要从头开始实施一项艰巨的任务。 与实施过程相比,用某些想法扩展程序员的过程更容易。 要使用这些原理更新系统,请阅读增量承诺螺旋 模型 。

平衡敏捷与纪律

Barry Boehm和Richard Turner的Balancing Agility and Discipline的平衡性为开发人员提供了避免各种以过程为中心的陷阱的能力。 例如,敏捷程序有时陷入无法牢记产品概述的陷阱。 通过保留软件的更新摘要可以避免这种风险。 向敏捷过程中添加草图是一种避免此类方案常见危险的功能。 平衡敏捷和纪律为程序员提供了避免基于过程的困难的工具。

产品设计

这些领域扩大了当前的工作平台,并提供了有助于软件设计的机制。

大型C ++软件设计

约翰·拉科斯(John Lakos)的大型C ++软件设计采用了构建大型软件的方法,以支持现有的工具箱。 大产品需要不同于小商品的技术。 大型系统需要特别注意测试和组织。 这些领域的短缺所产生的成本在实质性软件中是可观的,而在微不足道的程序中却可忽略不计。 相当大的产品需要一些技术来避免由于验证和设计缺陷而导致的支出。 这些支出被Lakos的书中提供的方法所绕开。 一种推荐的方法是具有非循环依赖关系图的体系结构,其元素根据级别系统进行标记。 分层方案和非循环图允许进行独立且有序的测试,从而降低了验证和确认的成本。 大型C ++软件设计提供了这些降低成本的技术以及与大型软件相关的其他问题。

不要让我想

史蒂夫·克鲁格(Steve Krug)的《 不要让我思考》 ( Do n’t Make Me Think)以设计不那么痛苦的用户体验的技能扩展了当前的工具范围。 一个人使用软件可能会感到困难。 一个普遍的障碍是确定实现目标的方法。 这些机制不需要太多思考,但是经常需要。 思考会使用户感到痛苦。 减少不必要的反射可减轻这种不适感。 克鲁格的《 不要让我思考》提供了减少不悦的工具。 这些方法可以扩大任何程序员的工作平台。

代码设计

本部分的内容通过一些有助于代码安排的方法来增强现有的武器库。

敏捷软件开发,原理,模式和实践

罗伯特·马丁(Robert Martin)的敏捷软件开发,原理,模式和实践通过面向对象设计的能力扩大了当前的军械库。 这些技能用首字母缩写词SOLID描述。 该短语是面向对象设计的几个原理的标题。 这些原则试图使基于对象的软件更加灵活和可维护。 可延展和可持续的产品是一个共同的目标。 为此, 敏捷软件开发,原理,模式和实践应增强许多软件开发人员的工具包。

设计模式:可重用的面向对象软件的元素

埃里希·伽玛(Erich Gamma),理查德·赫尔姆(Richard Helm),拉尔夫·约翰逊(Ralph Johnson)和约翰·弗利斯赛德(John Vlissides)的设计模式通过攻击常见的与代码相关的敌人,扩大了现有的武器库。 例如,一些与建筑相关的对手可以通过各种建造者和工厂模式来击败。 其他设备可以用来击败结构和行为上的敌人。 通过可重复使用的图案,可以杀死许多与代码相邻的拮抗剂。 要找到其中的一些安排,请阅读《 设计模式》 。

安全

此类别中的tome支持当前使用各种方法应对安全问题的工具集。

威胁建模

Adam Shostack的Threat Modeling通过一种接近软件安全性的系统来支持当前阵列。 这种方案称为威胁建模。 它致力于构建威胁模型。 该蓝图用于枚举与安全相关的危险。 每种风险都可以缓解,接受或转移。 测试了缓解,接受或转移的每种方法。 威胁建模为安全性提供了系统的方法。 要了解有关该方法的更多信息,请阅读Shostack的Threat Modeling 。

24软件安全的致命罪

迈克尔·霍华德(Michael Howard),大卫·勒布朗(David LeBlanc)和约翰·维加(John Viega)撰写的《软件安全的24条致命罪》 ,通过解决常见安全问题的技术扩展了程序员的工作台。 该书解决了一些典型的问题,例如缓冲区溢出,跨站点脚本编写和SQL注入。 这些复杂性非常普遍,以至于任何开发人员都需要一种处理它们的方法。 其中24条致命的软件安全罪过提供了这些路径。

编码

这些文本通过专门针对编码的方法扩大了当前的技术集合。

干净的代码

罗伯特·马丁(Robert Martin)的“ 清洁代码” ( Clean Code)提供了一套用于编写卫生方法和类的实践。 Martin的程序有助于清除代码中的一些污垢和污垢。 Filth有一种爬入软件的方式。 有些方法变得太长。 有些班级会产生太多纠缠。 这些代码随着时间的流逝而积累。 要清洗或防止堆积,请遵循“ 清洁代码”中的例程。

包起来

要正确处理软件开发的复杂问题,需要进行许多攻击。 软件工程需要庞大的折衷武器库。 建造军械库需要时间。 阅读此处列出的每个部分中每本书所需的时间和分钟数很大。 学习每个书本需要花费数月和数年的时间。 时间是增量的。 每天预留几个小时和几分钟来学习此处描述的大部分领域。 这些类别并不是要在一年中掌握的,更不用说一个月,一天或一个小时了。