第一章
-
1 面向过程:程序 = 数据结构+算法
面向对象:程序 = 对象+消息
面向模式:程序 = 模式+ 反模式
面向业务:程序 = 重构 + 粘贴复制(业务数据+业务逻辑)
业务=数据+逻辑
系统设计=服务+数据存储
-
面向all:程序 = 数据 + 逻辑
- 2 架构 = 组件 + 组件间的关系
- 3 martin flower:架构是项目组员对软件的共同的理解。什么是系统关键?什么是代码库重要的东西?什么是工作中经常记住的东西?
- 4 martin flower: important stuff = shared understanding + hard to change
- 5 martin flower:我们做好工作通常基于道德上的原因,但是手艺人和经济人之间的战争,经济总会获胜。质量和成本间的折0中。
- 6 martin flower:软件质量 = 内部质量 + 外部质量。 内部质量通常理解为好的模块设计,外部设计是好的用户体验。
- 7 martin flower: 如果我们不在软件内在质量付诸努力,最终我们就是欺骗客户,我们在放慢客户竞争的能力。
- 8 martin flower:好的设计和坏的设计会有一个临界点。前期坏的设计累加功能快,而后期好的设计的市场价值才会显现出来。
- 9 martin flower: 持续集成,持续交付,快速响应变化。新时代软件信条。
- 10 GOF23设计模式口诀: 两个慈母在阿里云上看电视,唱着abcdffp,结果ab型号的电视fps变快了。
行为:CCIIMMOSSTV 结构:ABCDFFP 创建:ABFPS
- 11 抱怨CRUD和IF-ELSE没技术含量是因为掌握的模式太少,这和初级还是高级开发并没有必然联系。
-
12 招式:Java,SSH,Eclipse,JSP,ASP,.Net等框架技术。
内功:数据结构,算法,重构,软件工程,设计模式等。
- 13 重构:在不改变软件可观察行为前提下改善其内部结构。
- 14 重构是在代码写好后改进它的设计。设计-》编码-》设计-》编码......
- 15 什么是技术沉淀?沉淀知识?沉淀经验?沉淀工龄?看xx源码?看底层原理?都不是,沉淀的是方法论和软件观。但是前提是看xx源码,看xx原理。
- 16 算法:空间和时间的平衡艺术。算法代价的数学表述:常数-一次-二次-指数-幂数。 GC算法也是如此。
- 17 Java,JS书籍对比。《Java编程思想》-《JS权威指南》 《Efftive Java》-《JS语言精粹》 《Java核心技术》-《Js高级程序设计》
- 18 业务代码:时间和质量呈现不相关关系。写“坏味道”代码依旧“坏味道”,写“优雅代码”依旧“优雅”。时间短就写不出好代码是多么的愚蠢逻辑!
- 19 技术再深,无非就是源码,但是源码的背后是什么?
- 20 面向对象四大特征:封装,继承,多态,抽象。而继承和封装是矛盾的,所以才有了委派[delegate]。
- 21 做不到共享的CodeReview不是好的CodeReview。
- 22 孙玄:一切抛开业务的架构设计都是耍流氓 。
- 23 架构选择:All in One 还是 One in One[SOA,MicroService, distributed],对于创业初期,All in One更加普遍。
- 24 阅读源码:一次精神洗礼之旅。
- 25 技术和业务影响团队的组织结构。
- 26 设计模式:总是将变化的事物和不变的事物分离开。
- 27 设计模式: 可复用面向对象软件的基础。
- 28 编程的一种方法论:Talk is cheap,Show me the code。
- 29 《人件》更像本管理指南,而不是本管理书。
- 30 康威定律:设计系统的组织,最终会将其沟通结构复制到产品的设计中。
- 31 没有银弹也是银弹。
- 32 写代码如同写诗,灵感来源于大量的积累。
- 33 必须将技术提升和学习作为日常生活之战略。如同吃饭喝水一样平常。
- 34 十个字以内描述GOF模式:
- A抽象工厂:产品族的创建。
- B构建者:复杂对象创建与组装
- F工厂方法:多态工厂
- P原型:对象克隆
- S单例:确保对象唯一性
- 简单工厂:集中工厂 [静态工厂]
- A适配器:不兼容结构协调
- B桥接:处理多维变化
- C组合:树形结构处理
- D装饰:扩展系统功能
- F外观:提供统一入口
- F享元:实现对象复用
- P代理:对象间接访问
- C职责链:请求链式处理
- C命令:请求发送者和接受者解耦
- I解释器:自定义语言
- I迭代器:遍历聚合对象元素
- M中介者:协调多对象交互
- M备忘录:撤销功能的实现
- O观察者:对象联动
- S状态:对象状态转换
- S策略:算法封装与切换
- T模板方法:定义算法框架
- V访问者:操作复杂对象结构
- 35 软件变化是必然的,有变化就要维护,随着时间的推移,维护成本远远大于初期的开发成本,因此,在软件开发中,最重要的是降低维护成本,维护成本正比于系统复杂度,所以降低维护成本,系统设计就要追求简单清晰。
- 36 软件质量取决于:机器质量+想法质量+代码质量+沟通质量
- 37 程序是什么?对于程序员是机器指令,对于用户是用户指令。
- 38 某种程度上技术的瓶颈可能取决于业务的瓶颈。
- 39 软件的目的是帮助他人。
- 40 软件设计方程式:D = Vn+Vf / Ei + Em
D:变化可行性 Vn:当前价值 Vf:未来价值 Ei:开发成本 Em:维护成本 随着时间推移方程转化为:D = Vf / Em 结论:相比于降低开发成本,降低维护成本更重要。
- 41 变化定律:程序存在时间越长,他的某个部分变化可能性越大。
- 42 缺陷定律:程序中新增缺陷可能性与代码修改量成正比
- 43 简洁定律:软件某部分的维护难度,反比于该部分的简洁程度。
- 44 测试定律:你对软件行为了解程序,等于你真正测试他的程度。
- 45 相比降低开发成本,降低维护成本更重要。而维护成本正比于系统复杂性。
- 46 Rod Johnson :市面J2EE作品过分强调各种J2EE规范,而忽视规范所解决现实问题。
- 47 “多瘤程序员”:已经掌握一项技术的实际使用技巧但同时留下了许多疤痕。
- 48 Rod Johnson:设计一次,在任何地方重新实现几个接口。而不是设计一次到处运行。
- 49 Rod Johnson谈优质代码。
- 50 OO设计比任何一项特定的实现技术(比如J2EE,Java)都重要。好的编程习惯和健全的OO设计使得J2EE应用具有坚实基础。劣质的Java代码就是劣质的J2EE代码。
- 51 OO原理加强J2EE开发。
- 52 许多开发花太多时间应付API,却花太少时间坚持好的编程习惯。
- 53 J2EE必读书目:《poeaa》,《expert one-to-one J2EE Design and Development》,《core J2EE patterns》,《expert one-to-one J2EE development without ejb》
- 54 技术提升两条路:1 广 2 深 在某个时间点他们会汇合起来。深会追求广,广会反哺深。
- 55 对知识(包括编程)产生崇敬感:先让其知道学问之大,进而产生渺小感,遂而从渺小感生出崇敬感。培养人才要从此入手。 今夫天,斯昭昭之多,及其无穷也,日月星辰系焉,万物覆焉。今夫地,一撮土之多。及其广厚,载华岳而不重,振河海而不泄,万物载焉。
- 56 异常的定义:我对此感到意外。
- 57 代码量的定义:1 不重复代码。 2 上线的代码。
- 58 好的程序设计语言能够帮助程序员写出好的程序,但是无论哪种语言,都阻止不了程序员用它写出坏程序。
- 59 无限接近自己所在领域的大师境界。
- 60 毕业五年内看完Spring源码和Netty源码。
- 61 重要的不是你学到什么,而是感受到什么。没有感受是白痴,感受比别人强是下道,感觉比自己强是中道,感觉和大师相通是大道。很多人止于超越自我。而兴趣或许可以加速这一切发生。
- 62 一定要有专门时间段学习软件业大师的非技术书。 比如温伯格, Kent Beck,Frederic Brooks(人月神话)
- 63 行业对比:投资框架和编程框架。
- 64 Cache和Pool都是资源管理方式,区别在于有无资源标识符。因为有了标识符,缓存持久化才有了意义。
- 65 类间关系:关联,依赖,泛化(继承),实现。
- 66 源码UML类图口诀:一进二出三关联 四多五少六抽象。
- 67 Java数组的协变的,无通配符的泛型是非协变的,有通配符的泛型是协变的。
- 68 你的水平就是团队的水平,提升团队水平先提升自我。
- 69 每天几条effective java,就是力量。
- 70 POSA:
- 71 POSA2:Patterns for Concurrent and Nerwork Objects
服务访问和配置模式: 包装器外观[Wrapper Facade],组件配置器[Component Configurator],拦截器[Interceptor],扩展接口[Extension Interface]
事件处理模式: 反应器[Reactor],主动器[Proactor],异步完成标记[Asynchronous Completion Token],接受器-连接器[Acceptor-Connector]
同步模式: 定界加锁[Scoped Locking],策略加锁[Strategized Locking],线程安全接口[Thread-Safe Interface],双重加锁优化[Double-Checked Locking Optimization]
并发模式: 主动对象[Active Object],监视器对象[Monitor Object],半同步半异步[Half-Sync/Half-Async],领导者追随者[Leader/Flowers],线程特定存储[Thread-Specific Storage]
- 72 POSA3: Patterns for Resource Management
资源获取: 查找模式[Lookup],延迟获取[Lazy Acquisition],预先获取[Eager Acquisition],部分获取[Partial Acquisition ]
**资源生命周期:**缓存 [Caching],池[Pooling],协调者[Coordinator],资源生命周期管理器[Resource Lifecycle Manage]
资源释放: 租约 [Leasing],驱逐者[Evitor]
- 73 POSA4:A Pattern Language for Distributed Computing 114个模式
从混沌到结构: Domain Model[领域模式] ,Layer[分层], Model-View-Controller[模式-视图-控制器],Presentation-Abstraction-Controller[表现-抽象-控制],Microkernel[微内核],Reflection[反射],Pipes And Filters[管道和过滤器],Shared Respository[共享仓库],Blackboard[黑板报],Domain Object[领域对象]
分布式基础设施: Messaging[消息传递] 【 Message Channel[信道],Message Endpoint[消息端点],Message Translator[消息转换器],Message Router[消息路由] 】 ,Pub-Sub[发布者-订阅者],Broker[经纪人],【Client Proxy[客户端代码],Requestor[请求者],Invoker[调用者],Client Request Handler[客户端请求处理],Server Request Handler[服务端请求处理]】
事件分离和分发: Reactor[反应器],Proactor[前摄器],Acceptor-Connector[接受器-连接器],Asynchronous Completion Token[异步完成令牌]
接口划分: Explicit Interface[显示接口],Extension Interface[扩展接口],Introspective Interface[内省接口],Dynamic Invocation Interface[动态调用接口],Proxy[代理],Bussiness Delegate[业务委派],Facade [外观],Combined Method[组合方法], Iterator [迭代器],Enumeration Method[枚举方法],Batch Method[批处理方法]
组件划分: Encapsulated Implementation[封装实现],Whole-Part[整体-部分],Composite[组合],Master-Slave[主-从],Half-Object plus Protocol[半对象加协议],Replicated Component Group[复制组件组]
应用控制: Page Controller[页面控制器],Front Controller [前端控制器],Application Controller [应用控制器],Command Processor[命令处理程序],Template View[模板视图],Transform View[转换视图], Firewall Proxy[防火墙代理],Authrization[授权]
并发: Half-Sync/Half-Async[半同步-半异步],Leader-Followers[领导者-追随者],Active Object[活动对象],Monitor Object[监控对象]
同步: Grarded Suspension[守护挂起],Future[未来/期货],Thread-Safe Interface[线程安全接口],Double-Checked Locking[双重锁检测],Stategized Locking[策略锁],Scoped Locking[区域锁],Thread-Special Storage[线程专属存储],Copied Value[副本值],Immutable Value[不变模式]
对象间交互: Observer[观察者],Double Dispatch[双分派],Mediator[中介者],Command[命令],Memonto[备忘录],Context Object[上下文对象],Data Transfer Object[数据传输对象],Message[消息]
适配和扩展: Bridge[桥接],Object Adapter[对象适配],Chain of Responsibility[职责链],Interpreter[解释器],Interceptor[拦截器],Visitor[访问者],Decorator[装饰者],Execute-Around Object[环绕执行对象],Template Method[模板方法],Strategy[策略],Null Object[空对象],Wrapper Facade[包装外观],Declarative Component Configuration[声明组件配置]
模态行为: Objects for States[状态对象],Method for States[状态方法],Collections for States[状态集合]
资源管理: Container[容器],Component Configurator[组件配置],Object Manager[对象管理器],Lookup[查找],Virtual Proxy[虚代理],Lifecycle CallBack[生命周期回调],Task Coordinator[任务协调者],Resourse Pool[资源池],Resourse Cache[资源缓存], Lazy Acquisition [延迟获取/懒加载],Eager Acquisition[提前获取],Partial Acqusition[局部获取],Activator[激励器],Evictor[驱逐器],Leasing[租借],Automated Garbage[自动回收],Counting Handles[计数句柄],Abstract Factory[抽象工厂],Builder[构建者],Factory Method[工厂方法],Disposal Method[销毁方法]
数据库访问: Database Access Layer[数据库访问层],Data Mapper[数据映射器],Row Data Gateway[行数据网关],Table Data Gateway[表数据网关],Active Record[活动记录]
- 74 如果不为业务,不为功利,不为职业,什么都不为,你要学的东西是什么?学的技术是什么?别着急给答案,仔细思考。
- 75 Poeaa:
领域逻辑模式: Transaction Script[事务脚本],Domain Model[领域模式],Table Moudle[表模块],Service Layer[服务层]
数据源架构模式: Table Data GateWay[表数据入口],Row Data GateWay[行数据入口],Active Record[活动记录],Data Mapper[数据映射器]
对象-关系行为模式: Unit of Work[工作单元],Identity Map[标识映射],Lazy Load[延迟加载]
对象-关系结构模式: Indentity Field[标识域],Foreign Key Mapping[外键映射],Association Table Mapping[关联表映射],Dependent Mapping[依赖映射],Embedded Value[嵌入值],Serialized LOB[序列化LOB],Single Table Inheritance[单表继承],Class Table Inheritance[类表继承],Concrete Table Inheritance[具体表继承],Inheritance Mappers[继承映射器]
对象-关系元数据映射模式: Metadata Mapping[元数据映射],Query Object[查询对象],Repository[资源],
Web表现层模式: Model-View-Controller[模型-视图-控制器],Page Controller[页面控制器],Front Controller[前端控制器],Template View[模板视图],Transform View[转换视图],Two-Step View[两步视图],Application Controller[应用控制器]
分布模式: Remote Facade[远程外观],Data Transfer Object[数据传输对象]
离线并发模式: Optimistic Offline Lock[乐观离线锁],Pessimistic Offline Lock[悲观离线锁],Coarse Grained Lock[粗粒度锁],Implicit Lock[隐含锁]
会话状态模式: Client Session State[客户端会话状态],Server Session State[服务器会话状态],Database Session State[数据库会话状态]
基本模式: GateWay[入口],Mapper[映射器],Layer Supertype[层超类型],Separated Interface[分离接口],Registry[注册表],Value Object[值对象],Money[货币],Special Case[特殊情况],Plugin[插件],Service Stub[服务桩],Record Set[记录集]
- 76 Core J2EE Patterns:
表现层: Intercepting Filter [拦截过滤器],Context Object [上下文对象],Front Controller[前端控制器],Application Controller[应用控制器],View Helper[视图助手],Composite View[复合视图],Dispatcher View[分配器视图],Service To Worker[服务到工作者]
业务层: Business Delegate[业务代表],Service Locator[服务定位器],Session Facade[会话门面],Application Service[应用服务],Business Objec[业务对象],Composite Entity[复合实体],Transfer Object[传输对象],T O Assembler[传输对象包装器],Value List Handler[值列表处理器]
*集成层: *Data Access Object[数据访问对象],Service Activator[服务激活器],Domain Store[业务领域存储],Web Service Broker[Web Service中转]
- 77 百度能带来短期快感,但是解决不了长期满足感。
- 78 学技术本质是学一个解决方案。解决方案是方法,方法背后是模式,学技术其实就是学模式。
- 79 企业应用架构模式讲的是架构还是模式,还是认为架构是一种模式?
- 80 对于生命来说,每一天都是一样的,并不存在周六周日,做技术也是如此。
- 81 Hibernate是解决方案,数据源架构模式是本质,要分清技术方案和模式区别。
- 82 现象学高手不代表就是数理高手。所以对于开发,技术原理不是必须的。单独寻求原理的百度党,还是现象学的产物。问题:你是怎么掌握技术原理的?区分掌握原理是否有用在于对方停留现象还是数理层面------伪原理开发。
- 83 形容一下你掌握的技术知识?我会xxx,还是思维导图。还是什么?
- 84 以技术理解技术就好比拿着一个榔头看所有东西都是钉子一样。
- 85 “格物致知”同样适用于技术。求的就是个豁然贯通,身性通明。
- 86 思维导图关键看出发点,而非知识点的累积。
- 87 做技术心不要太满,满了就只能看见自己了。
- 88 十个类一天,二十个类三天,三十个类一周。这是正常源码速度。
- 89 源码:代码复杂程度随着类的增加而成呈现指数增长关系。
- 90 源码分析:抽象层/实现层/工具层/模式层/测试层/异常层/入口类。
- 91 面向对象设计原则:SOLID,DRY(Don’t Repeat Yourself),YAGNI(You Ain’t Gonna Need It),GRASP(General Responsibility Assignment Software Patterns),KISS(Keep It Simple & Stupid)。
GRASP:Infomation Expert,Creator,Low coupling,High cohesion,Controller,Polymorphism,Pure Fabrication,Indirection,Protected Variations
比设计模型更重要的是设计原则。
- 92 软件开发方法论:
- 93 有其一套完整的哲学体系的技术大师,或者技术体系的书最具价值。当然他的作品也是他的代码。可否像投资大师分类方法去划分?分门别派。
- 94 人和技术关系思考:成天和老婆在一起,就能领悟男女之道吗?
- 95 业内对技术人员需要掌握的知识并没有达成共识。数据结构,操作系统向来叫好不叫座。同时是重要不紧急的知识。
- 96 面试一定要问:1 你觉得软件开发需要掌握哪些知识?[他觉得的往往是他会的和他的视野], 2 你未来要学习哪些知识?
- 97 当你提出技术有什么意义,目的的时候,是你对自己和技术关系产生了疑问。人与技术最直接关系用技术来解决问题。
- 98 对象池有Config,池对象有Info or State。对象池不需要Factory,本身就具备Factory的特性。但是池对象需要。因为Config不同Info才不同。线程池,连接池,缓存亦如此。
参考设计:
- 99 一般来说先有技术后有规范。比如DI。Java技术规范-JSR,Web技术规范-RFC。有的技术实现遵循了规范,有的不然。
- 100 我的技术学习方法论: 规范 + 实现 + 应用。 JSR51[NIO Since J2SE 1.4] + Grizzly, Netty + 基于Netty的应用。