软件工具的设计艺术

getDefaultProps

在确定软件方案之前,除了要先确定问题之外,还要确定人们到底想不想解决它。

解决某些问题,通常以损失另外的东西为代价,人们是否愿意买单。

此外,为了增加合作的可能性,双方会特意隐瞒需求的细节和实现难度,使之容易达成合作关系。


代码不一定要实现产品的所有功能,产品也不一定满足用户的所有的需要。

我们既可以通过设计,满足用户的所有潜在功能,也可以通过限制用户的场景,减少设计复杂度。


getInitialState

编程的艺术在于引入间接性,是否可以把直接的实现,看做是先实现一个工具,再由这个工具来实现原来的目的。

而且,在实现一个工具的过程中,仍然可以再引入间接性。

而艺术本身在于我们引入的间接性在什么程度上是适度的。


当用户只需要工具中的部分功能,但又不得不整个工具一起拿过来用时,我们就说这个工具比较重,绑架了用户的选择。

工具的作用,不该是教用户怎么做,而是辅助用户来完成工作,简化已有工作,给用户提供方便。

不要帮用户做所有事情,但也不要所有事情都要用户来做。


有的工具是给其它的软件系统用的,而有的工具是给人用的。

我们的工具在什么场景中被使用,是需要事先考虑清楚的,这决定了我们到底提供一个什么样的工具。


优秀的开发者,会区分工具提供的功能和自己需要的功能。

如果工具不好用,但是功能完备,那么用的人就会想办法对它包装,让所有其它场景都使用这层包装。


componentWillMount

在考虑该不该的时候,先问目的,该不该做某件事情,还要看解决它是为了达成什么目的。

不考虑目的,讨论任何方法的好坏,都是空想。


对软件附加上任何诸如可维护性,可扩展性,可伸缩性,都是需要成本的,我们需要考虑的是这些成本是否值得投入。

没有绝对的错误,只有不够好的选择。


只要描述现在的系统没有什么功能,造成了什么不适,就能马上看到需求。

而如果别人直接指出他们需要什么,这很可能只是一种方案。


render

过度设计指的是,软件在被重写之前,我们所担心的事情一次都没有发生。

然而,合理的抽象是必需的,所以关键问题不在于是否进行抽象,而是在于如何进行恰如其分的抽象。


不要预测未来,而是想办法让代码具有良好的特征,这些特征让现在的代码更适应变更。

工程师的职责,就是想办法让软件健康成长,是人响应了变更,而不是工具本身。


componentDidMount

能让别人在不看源码的情况下会用,才叫封装。


在使用的时候找不到文档,但是在学会之后又不想写下文档。

知识就是这样,缺乏之时如饥似渴,掌握之后就觉得可有可无了。

掌握知识的人,从来都觉得没有分享的必要,而需要这些知识的人们,却觉得走投无路。


componentWillUnmount

软件说白了,无非就是考虑生活中什么可以自动化,以及如何自动化。

编程说白了,无非就是考虑用哪些符号,以及如何用这些符号来解决问题。