学习中的复杂性——整洁代码的艺术(03)

发表于:2023-6-21 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:克里斯蒂安·迈尔    来源:51Testing软件测试网原创

  1.4  学习中的复杂性
  事实并不存在于真空中,而是相互关联的。考虑如下两个事实。
  沃尔特·迪斯尼(Walt Disney)生于1901年。
  路易斯·阿姆斯特朗(Louis Armstrong)生于1901年。
  如果您向一个程序提供这些事实,它就可以回答“沃尔特·迪斯尼的出生年份是哪一年”以及“谁出生于1901年”这样的问题。为了回答后一个问题,程序必须弄清不同事实之间的相互依赖关系。它可以这样建立信息模型:
(Walt Disney, born, 1901)
(Louis Armstrong, born, 1901)
  为了获得所有1901出生的人的信息,它可以使用查询(*,born,1901)或其他方式将事实联系起来并且分组。
  2012年,谷歌推出了新的搜索功能,在搜索结果页上显示信息框。这些基于事实的信息框是使用一种叫作知识图谱(knowledge graph)的数据结构填充的。知识图谱是由数十亿个相互关联的事实组成的庞大数据库,以类似网络的结构表示信息。这个数据库不存储客观和独立的事实,而是维护不同事实与信息片段之间的相互关系。谷歌搜索引擎使用这种知识图谱,用更高层次的知识来丰富其搜索结果,并自主地形成答案。
  图1-6展示了一个例子。知识图谱上也许有一个关于著名计算机科学家艾伦·图灵(Alan Turing)的节点。在知识图谱中,艾伦·图灵的概念与不同的信息片段相连,如他的出生年份(1912),他的研究领域(计算机科学、哲学、语言学),以及他的博士生导师(阿朗佐·丘奇,Alonzo Church)。这些信息中的每一条都与其他事实相关联(阿朗佐·丘奇的研究领域也是计算机科学),形成了一个相互关联的庞大事实网络。您可以利用这个网络来获取新信息,并编写程序来回答用户查询。关于“field of study of Turing’s doctorial advisor”的查询将演绎出答案“Computer science”。虽然这听起来微不足道或显而易见,但产生这种新事实的能力导致了信息检索和搜索引擎相关性的突破。您可能会同意,通过联想来学习远比记住不相关的事实更有效。
图1-6  知识图谱
  在图谱中呈现的一些三元关系:
("Alan Turing", "has doctoral advisor", "Alonzo Church")
("Alan Turing", "has field of study", "Philosophy")
("Alan Turing", "has field of study", "Linguistics")
  每个研究领域只关注图谱的一小部分。图谱的每一部分都由无数个相互关联的事实组成。只有考虑到相关事实,您才能真正理解一个领域。要彻底了解艾伦·图灵,您必须研究他的信仰、他的哲学以及他的博士生导师的特征。要了解丘奇,您必须调查他与图灵的关系。当然,图谱中有太多相关的依赖关系和事实,不能指望全盘了解。这些相互关系的复杂性给您的学习雄心划定了边界。学习和复杂性是硬币的两面:复杂性处于您已经获得的知识的边界。为了学习更多的知识,您必须首先知道如何控制复杂性。
  有点抽象了,所以让我们举个例子吧。假设您想编写一个交易机器人程序,根据一套复杂的规则买卖资产。在开始项目之前,您可以学习很多有用的知识:编程基础知识、分布式系统、数据库、应用编程接口(API)、网络服务、机器学习,以及数据科学和相关的数学知识。您可以学习实用工具,如Python、NumPy、scikit-learn、ccxt、TensorFlow和Flask。您可以学习交易策略和股票市场的理念。许多人以这样的心态来对待这些问题,所以从来不会感到已经准备好开始这个项目。问题是,您学得越多,就越觉得自己的知识不足。您永远不会在所有这些领域达到足够的掌握程度或感到准备好了。整个工作复杂得让您不知所措,您感到自己就快放弃。复杂性即将带走它的下一个加害对象:您。
  幸运的是,在本书的各个章节中,您会学到对抗复杂性的技能:专注、简化、规模降低、缩减和极简主义。本书将教会您这些技能。
  1.5  过程中的复杂性
  所谓过程,就是以实现确定结果为目标而采取的一系列行动。过程的复杂程度由其行动、参与者或分支的数量来计算。一般来说,行动(和参与者)越多,过程就越复杂(见图1-7)。
图1-7  两个示例过程:个体开发与团队开发
  许多软件公司在不同的业务部门采用不同的流程模型,试图简化流程。下面是一些例子。
  ·软件开发团队可能会采用敏捷开发或scrum方法。
  ·客户关系拓展部门可能会采用客户关系管理系统(CRM)和销售话术。
  ·新产品和商业模式部门可能会采用商业模式画板。
  当组织积累了太多的流程,复杂性就会开始堵塞系统。例如,在优步公司(Uber)进入市场之前,从A地到B地的旅行过程往往涉及许多步骤:寻找出租车公司电话号码、比较价格、准备不同的付款方式、计划不同的交通方式等。对许多人来说,优步简化了从A地到B地的旅行过程,将整个计划过程整合到一个易于使用的移动应用程序中。与传统的出租车行业相比,优步作出的彻底简化使客户的出行更加方便,并减少了做行程计划的时间和成本。
  在过于复杂的组织中,很难作出创新,因为复杂性无法被克服。资源被浪费,因为过程中的行动变得冗余。经理们投入精力建立新流程,开展新行动,试图修复令人痛苦的业务,恶性循环开始破坏业务或组织。
  复杂性是效率的敌人。解决方案是极简主义:为了保持过程高效,必须从根本上剔除不必要的步骤和行动。
  1.6  日常生活中的复杂性,或谓七零八落
  本书的目的是提高您编程工作的效率。进展可能会被您个人的日常习惯所打断。您必须解决每天都存在的分心问题,以及各种事务跟您争抢宝贵时间的问题。计算机科学教授卡尔·纽波特在他的优秀著作《深度工作:如何有效使用每一点脑力》(Deep Work:Rules for Focused Success in a Distracted World)中谈到了这一点。他认为,对需要深度思考的工作——如编程、研究、医学和写作——的需求越来越大,而由于通信设备和娱乐系统的普遍使用,这些工作的时间供应越来越少。经济学理论表明,不断增加的需求遇到不断减少的供给,价格会上升。如果您有能力从事深度工作,您的经济价值就会增加。对能够从事深度工作的程序员来说,现在是前所未有的好时机。
  现在,我要警告您:如果您不粗暴地将其放到最高优先级,几乎不可能从事深度工作。外部世界不断打扰您:同事突然来到您的办公室,智能手机每隔20分钟就要求您注意它,收件箱每天弹出几十次新的电子邮件提醒——每一封都要求您抽出时间处理。
  深度工作的结果是延迟满足,例如,在一套计算机程序上花了几周的时间,发现它能工作,这令人满意。然而,在大多数时候,您所渴望的是即时满足。您的潜意识经常想办法逃避深度工作。看信息、闲聊、刷Netflix等小奖励会轻松产生内啡肽刺激。与快乐、多彩和生动的即时满足世界相比,延迟满足变得越来越没有吸引力。
  您为保持注意力和生产力所做的努力很容易被切得七零八落。是的,您可以关掉智能手机,强制自己不看社交媒体和最喜欢的节目,但您能日复一日地持续这样做吗?同样,答案也在于将极致的极简主义应用于问题根源:卸载社交媒体应用程序,而不是试图管理花在上面的时间。减少您参与的项目和任务的数量,而不是试图通过更多的工作来做更多的事情。深入研究一种编程语言,而不是花费大量的时间在许多语言之间切换。
  1.7  小结
  现在,您应该已经被克服复杂性的需要彻底激励了。为了进一步探索复杂性以及如何克服它的问题,我建议阅读卡尔·纽波特的《深度工作:如何有效使用每一点脑力》一书。
  复杂性损害生产力,降低注意力。如果您不及早控制复杂性,它将迅速消耗您最宝贵的资源:时间。在生命的尽头,您不会根据回复了多少封电子邮件、玩了多少小时的电脑游戏,或者解了多少个数独谜题来判断自己是否度过了有意义的一生。通过学习如何处理复杂性,保持简单,您将能够对抗复杂性,得到强大的竞争优势。
  在第2章中,您将了解到80/20原则的力量:专注于关键少数,忽略琐碎多数。
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号