转载地址:https://blog.csdn.net/quanwairen1/article/details/78040412

一、I/O优化

1、增加缓存,减少磁盘的访问次数。

2、优化磁盘的管理系统,设计最优的磁盘方式策略,以及磁盘的寻址策略,这是在底层操作系统层面考虑的。

3、设计合理的磁盘存储数据块,以及访问这些数据库的策略,这是在应用层面考虑的。例如,我们可以给存放的数据设计索引,通过寻址索引来加快和减少磁盘的访问量,还可以采用异步和非阻塞的方式加快磁盘的访问速度。

4、应用合理的RAID策略提升磁盘I/O。

二、Web前端调优

1、减少网络交互的次数(多次请求合并);使用浏览器缓存;延迟加载页面;CDN;反向代理;页面静态化

2、减少网络传输数据量的大小(压缩);尽量减少编码(尽量提前将字符转化为字节,或者减少从字符到字节的转化过程。);减少Cookie传输 ;合理布局页面,用对标签;

3、CSS在最上面,JS在最下面

三、服务降级(自动优雅降级)

拒绝服务和关闭服务

四、幂等性设计

有些服务天然具有幂等性1 ,比如讲用户性别设置为男性,不管设置多少次,结果都一样。但是对转账交易等操作,问题就会比较复杂,需要通过交易编号等信息进行服务调用有效性校验,只有有效的操作才能继续执行。

五、失效转移

若数据服务器集群中任何一台服务器宕机,那么应用程序针对这台服务器的所有读写操作都需要重新路由到其他服务器,保证数据访问不会失败,这个过程叫失效转移。

失效转移包括:失效确认(心跳检测和应用程序访问失败报告)、访问转移、数据恢复。

失效转移保证当一个数据副本不可访问时,可以快速切换访问数据的其他副本,保证系统可用。

六、性能优化

根据网站分层架构,性能优化可分为:web前端性能优化、应用服务器性能优化、存储服务器性能优化。

1、Web前端性能优化

参考上面的【二、Web前端调优】

2、应用服务器性能优化

分布式缓存(Redis等); 异步操作(消息队列);使用集群(负载均衡);代码优化

3、存储性能优化

机械硬盘vs固态硬盘;B+树 vs LSM树;RAID vs HDFS

七、代码优化

  • 多线程(确保线程安全)

  • 资源复用(单例模式,连接池,线程池)

  • 数据结构

  • 垃圾回收

八、负载均衡

  • HTTP重定向负载均衡

当用户发来请求的时候,Web服务器通过修改HTTP响应头中的Location标记来返回一个新的url,然后浏览器再继续请求这个新url,实际上就是页面重定向。通过重定向,来达到“负载均衡”的目标。

优点:比较简单。

缺点:浏览器需要两次请求服务器才能完成一次访问,性能较差。重定向服务自身的处理能力有可能成为瓶颈,整个集群的伸缩性国模有限;使用HTTP302响应码重定向,有可能使搜索引擎判断为SEO作弊,降低搜索排名。

  • DNS域名解析负载均衡

DNS(Domain Name System)负责域名解析的服务,域名url实际上是服务器的别名,实际映射是一个IP地址,解析过程,就是DNS完成域名到IP的映射。而一个域名是可以配置成对应多个IP的。因此,DNS也就可以作为负载均衡服务。

事实上,大型网站总是部分使用DNS域名解析,利用域名解析作为第一级负载均衡手段,即域名解析得到的一组服务器并不是实际提供Web服务的物理服务器,而是同样提供负载均衡服务的内部服务器,这组内部负载均衡服务器再进行负载均衡,将请求分发到真是的Web服务器上。

优点:将负载均衡的工作转交给DNS,省掉了网站管理维护负载均衡服务器的麻烦,同时许多DNS还支持基于地理位置的域名解析,即会将域名解析成举例用户地理最近的一个服务器地址,这样可以加快用户访问速度,改善性能。

缺点:不能自由定义规则,而且变更被映射的IP或者机器故障时很麻烦,还存在DNS生效延迟的问题。而且DNS负载均衡的控制权在域名服务商那里,网站无法对其做更多改善和更强大的管理。

  • 反向代理负载均衡

反向代理服务可以缓存资源以改善网站性能。实际上,在部署位置上,反向代理服务器处于Web服务器前面(这样才可能缓存Web相应,加速访问),这个位置也正好是负载均衡服务器的位置,所以大多数反向代理服务器同时提供负载均衡的功能,管理一组Web服务器,将请求根据负载均衡算法转发到不同的Web服务器上。Web服务器处理完成的响应也需要通过反向代理服务器返回给用户。由于web服务器不直接对外提供访问,因此Web服务器不需要使用外部ip地址,而反向代理服务器则需要配置双网卡和内部外部两套IP地址。

优点:和反向代理服务器功能集成在一起,部署简单。

缺点:反向代理服务器是所有请求和响应的中转站,其性能可能会成为瓶颈。

九、缓存

缓存就是将数据存放在距离计算最近的位置以加快处理速度,缓存是改善软件性能的第一手段.

  • CDN: 及内容分发网络,部署在距离终端用户最近的网络服务商,用户的网络请求总是先到达他的网络服务商哪里,在这里缓存网站的一些静态资源(较少变化的数据),可以就近以最快速度返回给用户,如视频网站和门户网站会将用户访问量大的热点内容缓存在CDN中。

  • 反向代理:反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最先访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能返回给用户。

  • 本地缓存:在应用服务器本地缓存着热点数据,应用程序可以在本机内存中直接访问数据,而无需访问数据库。

  • 分布式缓存:大型网站的数据量非常庞大,即使只缓存一小部分,需要的内存空间也不是单机能承受的,所以除了本地缓存,还需要分布式缓存,将数据缓存在一个专门的分布式缓存集群中,应用程序通过网络通信访问缓存数据。

  • 使用缓存有两个前提条件,一是数据访问热点不均衡,某些数据会被更频繁的访问,这些数据应该放在缓存中;二是数据在某个时间段内有效,不会很快过期,否则缓存的数据就会因已经失效而产生脏读,影响结果的正确性。网站应用中,缓存处理可以加快数据访问速度,还可以减轻后端应用和数据存储的负载压力,这一点对网站数据库架构至关重要,网站数据库几乎都是按照有缓存的前提进行负载能力设计的。

十、负载均衡算法

1.轮询; 2.加强轮询;3.随机 ;4.加权随机 ;5.最少连接 ;6.加权最少连接;7.源地址散列 ;

十一、扩展性和伸缩性的区别

扩展性:它是系统架构设计层面的开闭原则(对扩展开放,对修改关闭),架构设计考虑未来功能扩展,当系统增加新功能时,不需要对现有系统的结构和代码进行修改。

衡量网站架构扩展性好坏的主要标准就是在网站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少改动既有业务功能就可以上线新产品。不同产品之间是否很少耦合,一个产品改动对其他产品无影响,其他产品和功能不需要受牵连进行改动。

伸缩性:衡量架构伸缩性的主要标准就是可以用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否可以提供和原来服务无差别的服务、集群中的可容纳的总的服务器数量是否有限制。

十二、分布式缓存的一致性hash

具体算法过程:先构造一个长度为232的整数环(这个环被称作一致性Hash环)根据节点名称的Hash值(其分布范围为[0,232 - 1])将缓存服务器阶段设置在这个Hash环上。然后根据需要缓存的数据的Key值计算得到Hash值(其分布范围也同样为[0,2^32 - 1]),然后在Hash环上顺时针查找举例这个KEY的hash值最近的缓存服务器节点,完成KEY到服务器的Hash映射查找。

优化策略:将每台物理服务器虚拟为一组虚拟缓存服务器,将虚拟服务器的Hash值放置在Hash环上,key在换上先找到虚拟服务器节点,再得到物理服务器的信息。

一台物理服务器设置多少个虚拟服务器节点合适呢?经验值:150。

十三、网络安全

1、XSS攻击

跨站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意的HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。

防范手段:消毒(XSS攻击者一般都是通过在请求中嵌入恶意脚本大道攻击的目的,这些脚本是一般用户输入中不使用的,如果进行过滤和消毒处理,即对某些html危险字符转移,如“>”转译为“& gt;”);HttpOnly(防止XSS攻击者窃取Cookie).

2、注入攻击:SQL注入和OS注入

SQL防范:预编译语句PreparedStatement; ORM;避免密码明文存放;处理好相应的异常。

3、CSRF(Cross Site Request Forgery,跨站点请求伪造)。听起来与XSS有点相似,事实上两者区别很大,XSS利用的是站内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。

防范:httpOnly;增加token;通过Referer识别。

4、文件上传漏洞

文件上传的目录设置为不可执行;判断文件类型;使用随机数改写文件名和文件路径;单独设置文件服务器的域名

5、DDos攻击

十四、加密技术

1、摘要加密:MD5, SHA

2、对称加密:DES算法,RC算法, AES

3、非对称加密:RSA。非对称加密技术通常用在信息安全传输,数字签名等场合。HTTPS传输中浏览器使用的数字证书实质上是经过权威机构认证的非对称加密的公钥。

十五、 流量控制

1、流量丢弃

2、通过单机内存队列来进行有限的等待,直接丢弃用户请求的处理方式显得简单而粗暴,并且如果是I/O密集型应用(包括网络I/O和磁盘I/O),瓶颈一般不再CPU和内存。因此,适当的等待,既能够替身用户体验,又能够提高资源利用率。

3、通过分布式消息队列来将用户的请求异步化。

参考资料和脚注

1、LVS:三种负载均衡方式比较+另三种负载均衡方式

2、《大型网站技术架构——核心原理与技术分析》李智慧 著。

3、亿级Web系统搭建:单机到分布式集群

4、《大型分布式网站架构设计与实现》陈康贤 著。

  1. 幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的. 声明为幂等的接口会认为外部调用失败是常态, 并且失败之后必然会有重试. 

引言

本书意在解释我们身在何处,我们从何而来,并且提供当下亟需的指导,以应对眼前的利益和危险。

从因果关系到相关关系的思维变更才是大数据的关键,建立在相关关系分析法基础上的预测才是大数据的核心。社会需要放弃它对因果关系的渴求,而仅需关注相关关系。也就是说只需要知道是什么,而不需要知道为什么。

大数据与云计算是一个问题的两面:一个是问题,一个是解决问题的方法。

大数据时代的经济学、政治学、社会学和许多科学门类都会发生巨大甚至是本质上的变化和发展,进而影响人类的价值体系、知识体系和生活方式。哲学史上争论不休的世界可知论和不可知论将会转变为实证科学中的具体问题。可知性是绝对的,无事无物不可知;不可知性是相对的,是尚未知道的意思。

认为相关重于因果,是某些有代表性的大数据分析手段(譬如机器学习)里面内禀的实用主义的魅影,绝非大数据自身的诉求。放弃对因果性的追求,就是放弃了人类凌驾于计算机之上的智力优势,是人类自身的放纵和堕落。如果未来某一天机器和计算完全接管了这个世界,那么这种放弃就是末日之始。

大数据挖掘能力:以一种前所未有的方式,通过对海量数据进行分析,获得有巨大价值的产品和服务,或深刻的洞见,量变导致质变。物理学和生物学都告诉我们,当我们改变规模时,事物的状态有时也会发生改变。

根据过去的大数据,可以预测未来,指导我们未来的行为。

大数据开启了一次重大的时代转型,但真正的革命并不在于分析数据的机器,而在于数据本身和我们如何运用数据。我们可以从不同的维度去提取有价值的东西。大数据挖掘算法不是大数据研究的核心,而是我们从他人想不到的维度去提取有价值的东西。所以大数据应用比大数据挖掘算法更为重要。

当我们拥有海量即时数据时,绝对的精准不再是我们追求的主要目标。当然,我们也不是完全放弃了精确度,只是不再沉迷于此。适当忽略微观层面上的精确度会让我们在宏观层面拥有更好的洞察力。相关关系也许不能准确地告知我们某件事情为何会发生,但是它会提醒我们这件事情正在发生。在许多情况下,这种提醒的帮助已经足够大了。

第一部分:大数据时代的思维变革

大数据与三个重大的思维转变有关,这三个转变是相互联系和相互作用的。

●首先,要分析与某事物相关的所有数据,而不是依靠分析少量的数据样本。

●其次,我们乐于接受数据的纷繁复杂,而不再追求精确性。

●最后,我们的思想发生了转变,不再探求难以捉摸的因果关系,转而关注事物的相关关系。

传统的分析方式即采样分析的精确性随着采样随机性的增加而大幅提高,但与样本数量的增加关系不大。当人们想了解更深层次的细分领域的情况时,随机采样的方法就不可取了。在宏观领域起作用的方法在微观领域失去了作用。所以,我们现在经常会放弃样本分析这条捷径,选择收集全面而完整的数据(不是绝对意义的全部数据,只是说这是相对所有数据)。我们需要足够的数据处理和存储能力,也需要最先进的分析技术,即采用大数据的方法。

执迷于精确性是信息缺乏时代和模拟时代的产物。在那个信息贫乏的时代,任意一个数据点的测量情况都对结果至关重要。当我们掌握了大量新型数据时,精确性就不那么重要了,我们同样可以掌握事情的发展趋势,而且拥有更大数据量所能带来的商业利益远远超过增加一点精确性,所以通常我们不会再花大力气去提升数据的精确性。要想获得大规模数据带来的好处,混乱应该是一种标准途径,而不应该是竭力避免的。赫兰德总结说:“略有瑕疵的答案并不会伤了商家的胃口,因为他们更看重高频率。”

大的数据库的代表技术Hadoop的输出结果没有关系型数据库输出结果那么精确,它不能用于卫星发射、开具银行账户明细这种精确度要求很高的任务。但是对于不要求极端精确的任务,它就比其他系统运行得快很多,比如说把顾客分群,然后分别进行不同的营销活动。

当数据点以数量级方式增长的时候,我们会观察到许多似是而非的相关关系。毕竟我们还处于考察相关关系的初期,所以这一点需要我们高度重视。

一个东西要出故障,不会是瞬间的,而是慢慢地出问题的。通过收集所有的数据,我们可以预先捕捉到事物要出故障的信号,比方说发动机的嗡嗡声、引擎过热都说明它们可能要出故障了。系统把这些异常情况与正常情况进行对比,就会知道什么地方出了毛病。通过尽早地发现异常,系统可以提醒我们在故障之前更换零件或者修复问题。通过找出一个关联物并监控它,我们就能预测未来。

相关关系分析本身意义重大,同时它也为研究因果关系奠定了基础。通过找出可能相关的事物,我们可以在此基础上进行进一步的因果关系分析,如果存在因果关系的话,我们再进一步找出原因。这种便捷的机制通过严格的实验降低了因果分析的成本。我们也可以从相互联系中找到一些重要的变量,这些变量可以用到验证因果关系的实验中去。

第二部分:大数据时代的商业变革

今天,拥有了数据分析的工具(统计学和算法)以及必需的设备(信息处理器和存储器),我们就可以在更多领域、更快、更大规模地进行数据处理了。在大数据时代,惊喜无处不在

数字化带来了数据化,但是数字化无法取代数据化。数字化是把模拟数据变成计算机可读的数据,和数据化有本质上的不同。

“文化组学”是一个计算机专业词汇,指的就是通过文本的定量分析来揭示人类行为和文化发展的趋势。“现实挖掘”这里指的是通过处理大量来自手机的数据,发现和预测人类行为。“自我量化”是一项由一群健身迷、医学疯子以及技术狂人发起的运动,通过测量身体的每一个部位和生活中的每一件事来让生活更美好——或者至少用量化的方式来获得新知。

不同于物质性的东西,数据的价值不会随着它的使用而减少,而是可以不断地被处理。它的真实价值就像漂浮在海洋中的冰山,第一眼只能看到冰山的一角,而绝大部分都隐藏在表面之下。

数据价值的关键是看似无限的再利用,即它的潜在价值。收集信息固然至关重要,但还远远不够。因为大部分的数据价值在于它的利用,而不是占有本身。

数据的潜在价值有最为常见的创新方式:

1:数据的再利用。系统采用了为某个特定目的而生成的数据,并将其重新用于另一个目的,换言之,数据从其基本用途移动到了二级用途。

2:重组数据。随着大数据的出现,数据的总和比部分更有价值。当我们将多个数据集的总和重组在一起时,重组总和本身的价值也比单个总和更大。

3:可扩展数据。在收集数据时强调扩展性方面使数据即用于基本用途,也进行了大量的二次使用。

4:数据的折旧值。潜在价值的概念表明,组织机构应收集尽可能多的使用数据并保存尽可能长的时间。同时也应当与第三方分享数据,前提是要保留所谓的”延展性”权利。这样一来,由数据再利用而产生的任何商业价值,原始数据拥有者都能从中分到一杯羹。数据收集者和拥有无法想像数据再利用的所有可能方式,这一点几乎是不言自明的。

5:数据废气。“数据废气”用来描述人们在网上留下的数字轨迹的艺术词汇出现了,它是用户在线交互的副产品,包括浏览了哪些页面、停留了多久、鼠标光标停留的位置、输入了什么信息等。许多公司因此对系统进行了设计,使自己能够得到数据废气并循环利用,以改善现有的服务或开发新服务。

6:开放数据。政府才是大规模信息的原始采集者,并且还在与私营企业竞争他们所控制的大量数据。政府与私营企业数据持有人之间的主要区别就是政府可以强迫人们为他们提供信息,而不必加以说服或支付报酬。”开放政府数据”成为当前的一大难题。

根据所提供价值的不同来源,分别出现了三种大数据公司。这三种来源是指:数据本身、技能与思维。大数据让处于行业两端的公司受益良多,而中等规模的公司要么向两端转换,要么破产。传统行业最终都会转变为大数据行业,无论是金融服务业、医药行业还是制造业。

大数据思维,是指一种意识,认为公开的数据一旦处理得当就能为千百万人急需解决的问题提供答案。

数学和统计学知识,甚至是有少许编程和网络科学的知识将会成为现代工厂的基础,但不只是专业技能的深度很重要,大数据的广度也变得很重要。要想解决一个生物难题,或许与天体物理学家或者数据视图设计师联系就可以实现。

###第三部分:大数据时代的管理变革

过于依赖数据,而数据远远没有我们所想的那么可靠。只要得到了合理的利用,而不单纯只是为了数据而数据,大数据就会变成强大的武器。

现在大多数人都认为大数据是一个技术问题,应侧重于硬件或软件,而我们认为应当更多地考虑当数据说话时会发生什么。大数据提供的不是最终答案,只是参考答案,为我们提供暂时的帮助,以便等待更好的方法和答案出现。这也提醒我们在使用这个工具的时候,应当怀有谦恭之心,铭记人性之本。

推荐书籍

1.《证析》、《大数据》、《个性化:商业的未来》

前言

hack作为名词有两个意思,既可以指很巧妙或很便捷的解决方法,也可以指比较笨拙、不那么优雅的解决方法。hack还有一个引申义,指对某个程序或设备进行修改,使其完成原来不可用的功能(或者禁止外部使用者接触到的功能)。

黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。

传统意义上的黑客才能被称为hacker,而那些恶意入侵计算机系统的人才应该被称为cracker(入侵者)。

第一章 为什么书呆子不收欢迎

没有什么比一个共同的敌人更能使人们团结起来了

第二章 黑客与画家

黑客是创作者,与画家、建筑师、作家一样,以代码为工具,展示他们的才华,在比特世界里“构建”着“建筑”。

“建筑师”(architect)和“架构师”(architect)是同一个词,所以这里用的是双关语,意思是优秀程序员不仅负责建造,还负责架构。

坚持一丝不苟,就能取得优秀的成果,因为那些看不见的细节累加起来,就变得可见了。优秀的软件也要求对美的狂热追求,如果你查看优秀软件的内部,就会发现那些预料中没有人会看见的部分也是优美的。

软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知,而且设计要从用户的角度考虑。你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。

创造优美的事物的方式往往不是从投做起,而是在现有成果的基础上做一些小小的调整,将已有的观点用比较新的方式组合起来。这类型的工作很难用研究性的论文来表述。

对于黑客来说,采取像画家这样的做法有好处:应该定期地从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。

过早优化是一件很危险的事情,我们不要太早决定一个程序应该怎么做,而是根据用户的反应进行软件优化。

对于编程,这实际上意味着你可以把bug留到以后解决,消灭bug对我来说术语轻松的工作,只有在这个时候,编程才变得直接和机械,接近社会大众想象中的编程的样子。

多人共同开发一个软件的正确合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责,模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。

编程能有多酷取决于我们能够用追职工新媒介做出怎么样的工作。

第三章 不能说的话

如果别人告诉你应该相信什么,你就真的相信了,那么你就会和别人一样犯下同样的错误。

最先从你头脑中跳出来的想法,往往使最困扰你的、很可能为真的想法,你已经注意到它们,但还没有认真思考过。

智力越高的人,越愿意去思考那些惊世骇俗的思想观点,这不仅因为聪明人本身很积极地寻找传统观念的漏洞,还因为传统观念对他们的束缚力很小,很容易摆脱。

发现了“不能说的话”的建议是别说,至少也要挑选合适的场合再说,只打那些值得打的仗。

一个公司是否健康运作,可以用一个指标来衡量,那就是对负面评价的容忍程度,做出伟大产品的公司,自我评价往往以“批评”和“自嘲”为主,而不是以“肯定”和“表扬”为主。

安全问题的关键是不要有漏洞,而不是任何设计上的决策。服务器软件的性质决定了开发者对漏洞会加倍注意。而且,服务器被入侵会使得运营公司遭受巨大损失,所以它们为了在行业中生存下去,可能也会对安全问题备加关注

所谓“流行”(传统观念也是一种流行),本质上就是自己看不见自己的样子。否则就不会有流行了。对于那些被流行抓住的人,流行就不再是流行,而是应该要做的正确事情。只有保持一定的距离才能观察到人们观念的变化,发现流行(也就是人们自以为正确的事情)到底是什么

第四章 良好的坏习惯

遇到难题的时候,把问题重新定义成一个较简单的形式,同时一定你假想你一个对手正在与他比赛谁能更快地解决问题。

第五章 另一条路

如果你的软件效率高,你就嫩而过比同样硬件配置的竞争对手多发展用户,获得更多的利润

第六章 如何创造财富

我们需要的东西就是财富,金钱不等于财富,金钱只是一种交换媒介,让大家更方便获得自己想要的东西,商品和服务都属于财富。大多数生意的目的是为了创造财富,做出人们真正需要的东西。

创造财富,为自己,也为社会,最好的方式绝对不是在公司里工作,即使这个公司再好,也有其效率低下的问题,肯定会受到组织的局限,所以最好的方式就是创业,今天“全民创业”其根本根源也是如此,只不过这些群体中家夹杂着太多浑水摸鱼之辈,一场狂潮才变成了闹剧和寒冬。

要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。

我认为,任何一个通过自身努力而致富的个人,在他们身上应该都能同时发现可测量性和可放大性。我能想到的例子就有CEO、电影明星、基金经理、专业运动员。有一个办法可以发现是否存在可放大性,那就是看失败的可能性。因为收入和风险是对称的,所以如果有巨大的获利可能,就必然存在巨大的失败可能。CEO、电影明星、基金经理、运动员的头顶都悬着一把宝剑,随时可能掉下来。一旦他们搞砸了,他们就完了。如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。但也并非一定要当上CEO或电影明星不可,成为某个攻克难题的小团体的一部分就可以了。

如果你发现了一种做事的新方式或者解决了一个热门的技术难题,它的经济价值就取决于多少人使用这种新方式,技术就是钓鱼的鱼竿,而不是那条鱼。

选择公司要解决什么问题应该以问题的难度作为指引,而且此后的各种决策都应该以此为原则。

第七章 关注贫富分化

每个人创造财富的能力和欲望强烈程度都不一样,所以每个人创造财富的数量很不平等。一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。

不要假设你的系统毫无漏洞,而是要高清楚多大程度上漏洞无法被利用。

每个人的技能不同,导致收入不同,这才是贫富分化的主要原因,正如逻辑学的“奥卡姆剃刀”原则所说,简单的解释就是最好的解释。

第九章 什么是好的设计?

  • 好设计是简单的设计。

当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分

  • 好设计是永不过时的设计。

只要没有错误,每一个数学证明都是永不过时的。所以,数学家哈代才会说:“丑陋的数学在世界上无法生存。”他的意思与飞机设计师凯利·约翰逊的观点是一样的:如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已。 如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。

  • 好设计是解决主要问题的设计。

软件的难题通常可以被改成等价的较易解决的形式。

  • 好设计是启发性的设计。

在软件行业,这条原则意味着,你应该为用户提供一些基本模块,使得他们可以随心所欲自由组合,就像玩乐高积木那样。

  • 好设计通常是有点趣味性的设计。

  • 好设计是艰苦的设计。

如果观察那些做出伟大作品的人,你会发现他们的共同点就是工作得非常艰苦。如果你工作得不艰苦,你可能正在浪费时间。

  • 好设计是看似容易的设计。

在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。有时,我们的训练只是为了让身体养成下意识的反应。优秀钢琴家弹奏名曲可以不经过大脑直接完成,艺术家也是这样,熟练以后,脑海中的艺术形象会自动从手上流淌出来,仿佛有人在一旁为他打节奏一样。

  • 好设计是对称的设计。

对称有两种:重复性对称和递归性对称,递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。

  • 好设计是模仿大自然的设计。

  • 好设计是一种再设计。

  • 好设计是能够复制的设计。

  • 好设计常常是奇特的设计。

你最后发展出来的风格是自然而然形成的。“奇特”这个特点尤其如此,除了完成好作品之后回头看之外,没有其他方法了。

  • 好设计是成批出现的。

推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。

  • 好设计常常是大胆的设计。

今天的实验性错误就是明天的新理论。如果你想做出伟大的新成果,那就不能对常识与真理不相吻合之处视而不见,反而应该特别注意才对。只有对这个领域非常熟悉,你才可能发现哪些地方可以手动改进,因此你必须锻炼自己成为某个领域的专家。

第十章 编程语言的战争

“你用什么语言并不重要,重要的是你对问题是否有正确的理解。代码以外的东西才是关键。”

第十一章 一百年后的编程语言

效率不是问题(由于计算速度的提升),灵活更重要,相比浪费机器时间,浪费程序猿的时间才是真正的无效率。

第十二章 拒绝平庸

使用哪一种技术的时候,你不能考虑别人的做法,只能考虑什么样的技术能最好地完成工作。

第十三章 书呆子的复仇

条件越苛刻的项目,强大的编程语言就越能发挥作用,但是无数的项目根本没有苛刻条件的限制。另外语言的选择意味着开发的速度,即使开发速度只相差两三倍,也足以使你永远处于落后的位置。

使用一种不常见的语言可能出现的问题及解答:

1.可能无法很好的与使用其他语言写的程序协同工作;

答:软件从桌面端到服务器端迁移,使用某一种语言的限制将越来越少

2.可能找不到很多函数库

答:根据开发的条件限制,决定是选择函数库重要还是语言本身的能力重要

3.可能不容易雇到程序员

答:强大的语言会减少所需要开发人员的数量

第十五章 设计与研究

优秀的设计不一定是“新”的,但一定是“好”的;优秀的研究不一定是“好”的,但一定是“新”的。两者会交叉,只有应用“新”的创意和理论,才会诞生超越前人的最佳设计

“用户需要的设计”而不是“用户要求的设计”,设计师并不像厨师一样,不要对用户言听计从,用户不了解所有可能的选择,也经常弄错自己真正想要的东西,设计师需要像医生一样,找出病因,针对“病因”进行治疗。

贴近用户,永远站在用户的角度调整自己的构想,此设计思想被归纳为“弱即是强”的模式,模式中其中一点是如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见,再逐步加工做出成品。